diff --git a/.cache/.gitkeep b/.cache/.gitkeep
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000000..da9ab523a8
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,9 @@
+# Configure Dependabot scanning.
+version: 2
+
+updates:
+  # Check for updates to GitHub Actions.
+  - package-ecosystem: "github-actions"
+    directory: "/"
+    schedule:
+      interval: "daily"
diff --git a/.github/workflows/coding-standards.yml b/.github/workflows/coding-standards.yml
index 41faf379ee..770e3512dd 100644
--- a/.github/workflows/coding-standards.yml
+++ b/.github/workflows/coding-standards.yml
@@ -5,7 +5,6 @@ on:
   # PHPCS checking was introduced in WordPress 5.1.
   push:
     branches:
-      - master
       - trunk
       - '3.[89]'
       - '[4-9].[0-9]'
@@ -14,7 +13,6 @@ on:
       - '[4-9].[0-9]*'
   pull_request:
     branches:
-      - master
       - trunk
       - '3.[89]'
       - '[4-9].[0-9]'
@@ -50,6 +48,7 @@ jobs:
   # - Checks out the repository.
   # - Sets up PHP.
   # - Logs debug information.
+  # - Configures caching for PHPCS scans.
   # - Installs Composer dependencies (use cache if possible).
   # - Make Composer packages available globally.
   # - Logs PHP_CodeSniffer debug information.
@@ -59,14 +58,15 @@ jobs:
   phpcs:
     name: PHP coding standards
     runs-on: ubuntu-latest
+    timeout-minutes: 20
     if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }}
 
     steps:
       - name: Checkout repository
-        uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4
+        uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2.4.0
 
       - name: Set up PHP
-        uses: shivammathur/setup-php@afefcaf556d98dc7896cca380e181decb609ca44 # v2.10.0
+        uses: shivammathur/setup-php@ac7d3d7f84d81a029c20ab72d60264bdb7535831 # v2.15.0
         with:
           php-version: '7.4'
           coverage: none
@@ -77,8 +77,20 @@ jobs:
           php --version
           composer --version
 
+      # This date is used to ensure that the PHPCS cache is cleared at least once every week.
+      # http://man7.org/linux/man-pages/man1/date.1.html
+      - name: "Get last Monday's date"
+        id: get-date
+        run: echo "::set-output name=date::$(/bin/date -u --date='last Mon' "+%F")"
+
+      - name: Cache PHPCS scan cache
+        uses: actions/cache@c64c572235d810460d0d6876e9c705ad5002b353 # v2.1.6
+        with:
+          path: .cache/phpcs.json
+          key: ${{ runner.os }}-date-${{ steps.get-date.outputs.date }}-phpcs-cache-${{ hashFiles('**/composer.json', 'phpcs.xml.dist') }}
+
       - name: Install Composer dependencies
-        uses: ramsey/composer-install@92a7904348d4ad30236f3611e33b7f0c6f9edd70 # v1.1.0
+        uses: ramsey/composer-install@a7320a0581dcd0432930c48a0e7ced67e6ec17e8 # v1.3.0
         with:
           composer-options: "--no-progress --no-ansi --no-interaction"
 
@@ -112,13 +124,14 @@ jobs:
   jshint:
     name: JavaScript coding standards
     runs-on: ubuntu-latest
+    timeout-minutes: 20
     if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }}
     env:
       PUPPETEER_SKIP_CHROMIUM_DOWNLOAD: ${{ true }}
 
     steps:
       - name: Checkout repository
-        uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4
+        uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2.4.0
 
       - name: Log debug information
         run: |
@@ -128,7 +141,7 @@ jobs:
           svn --version
 
       - name: Install NodeJS
-        uses: actions/setup-node@38d90ce44d5275ad62cc48384b3d8a58c500bb5f # v2.2.2
+        uses: actions/setup-node@270253e841af726300e85d718a5f606959b2903c # v2.4.1
         with:
           node-version: 14
           cache: npm
@@ -149,7 +162,7 @@ jobs:
 
   slack-notifications:
     name: Slack Notifications
-    uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@master
+    uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk
     needs: [ phpcs, jshint ]
     if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event_name != 'pull_request' && always() }}
     with:
diff --git a/.github/workflows/end-to-end-tests.yml b/.github/workflows/end-to-end-tests.yml
index 6bcaa9a3ff..075e94c34e 100644
--- a/.github/workflows/end-to-end-tests.yml
+++ b/.github/workflows/end-to-end-tests.yml
@@ -4,7 +4,6 @@ on:
   # The end to end test suite was introduced in WordPress 5.3.
   push:
     branches:
-      - master
       - trunk
       - '5.[3-9]'
       - '[6-9].[0-9]'
@@ -13,7 +12,6 @@ on:
       - '[6-9].[0-9]*'
   pull_request:
     branches:
-      - master
       - trunk
       - '5.[3-9]'
       - '[6-9].[0-9]'
@@ -49,6 +47,7 @@ jobs:
   e2e-tests:
     name: E2E Tests
     runs-on: ubuntu-latest
+    timeout-minutes: 20
     if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }}
 
     steps:
@@ -58,7 +57,7 @@ jobs:
           echo "PHP_FPM_GID=$(id -g)" >> $GITHUB_ENV
 
       - name: Checkout repository
-        uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4
+        uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2.4.0
 
       - name: Log debug information
         run: |
@@ -72,7 +71,7 @@ jobs:
           locale -a
 
       - name: Install NodeJS
-        uses: actions/setup-node@38d90ce44d5275ad62cc48384b3d8a58c500bb5f # v2.2.2
+        uses: actions/setup-node@270253e841af726300e85d718a5f606959b2903c # v2.4.1
         with:
           node-version: 14
           cache: npm
@@ -119,7 +118,7 @@ jobs:
 
   slack-notifications:
     name: Slack Notifications
-    uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@master
+    uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk
     needs: [ e2e-tests ]
     if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event_name != 'pull_request' && always() }}
     with:
diff --git a/.github/workflows/javascript-tests.yml b/.github/workflows/javascript-tests.yml
index 4c0c6e17e1..df0e5724f8 100644
--- a/.github/workflows/javascript-tests.yml
+++ b/.github/workflows/javascript-tests.yml
@@ -4,7 +4,6 @@ on:
   # JavaScript testing was introduced in WordPress 3.8.
   push:
     branches:
-      - master
       - trunk
       - '3.[89]'
       - '[4-9].[0-9]'
@@ -13,7 +12,6 @@ on:
       - '[4-9].[0-9]*'
   pull_request:
     branches:
-      - master
       - trunk
       - '3.[89]'
       - '[4-9].[0-9]'
@@ -53,11 +51,12 @@ jobs:
   test-js:
     name: QUnit Tests
     runs-on: ubuntu-latest
+    timeout-minutes: 20
     if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }}
 
     steps:
       - name: Checkout repository
-        uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4
+        uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2.4.0
 
       - name: Log debug information
         run: |
@@ -67,7 +66,7 @@ jobs:
           svn --version
 
       - name: Install NodeJS
-        uses: actions/setup-node@38d90ce44d5275ad62cc48384b3d8a58c500bb5f # v2.2.2
+        uses: actions/setup-node@270253e841af726300e85d718a5f606959b2903c # v2.4.1
         with:
           node-version: 14
           cache: npm
@@ -88,7 +87,7 @@ jobs:
 
   slack-notifications:
     name: Slack Notifications
-    uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@master
+    uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk
     needs: [ test-js ]
     if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event_name != 'pull_request' && always() }}
     with:
diff --git a/.github/workflows/php-compatibility.yml b/.github/workflows/php-compatibility.yml
index de89b79a3d..daf58a458c 100644
--- a/.github/workflows/php-compatibility.yml
+++ b/.github/workflows/php-compatibility.yml
@@ -4,7 +4,6 @@ on:
   # PHP compatibility testing was introduced in WordPress 5.5.
   push:
     branches:
-      - master
       - trunk
       - '5.[5-9]'
       - '[6-9].[0-9]'
@@ -13,7 +12,6 @@ on:
       - '[6-9].[0-9]*'
   pull_request:
     branches:
-      - master
       - trunk
       - '5.[5-9]'
       - '[6-9].[0-9]'
@@ -22,7 +20,7 @@ on:
       - '**.php'
       # These files configure Composer. Changes could affect the outcome.
       - 'composer.*'
-      # This file configures PHP Compatibility scanning. Changes could affect the outcome.
+      # This file configures PHP compatibility scanning. Changes could affect the outcome.
       - 'phpcompat.xml.dist'
       # Changes to workflow files should always verify all workflows are successful.
       - '.github/workflows/*.yml'
@@ -44,7 +42,8 @@ jobs:
   # Performs the following steps:
   # - Checks out the repository.
   # - Sets up PHP.
-  # - Logs debug information about the runner container.
+  # - Logs debug information.
+  # - Configures caching for PHP compatibility scans.
   # - Installs Composer dependencies (use cache if possible).
   # - Make Composer packages available globally.
   # - Logs PHP_CodeSniffer debug information.
@@ -53,14 +52,15 @@ jobs:
   php-compatibility:
     name: Check PHP compatibility
     runs-on: ubuntu-latest
+    timeout-minutes: 20
     if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }}
 
     steps:
       - name: Checkout repository
-        uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4
+        uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2.4.0
 
       - name: Set up PHP
-        uses: shivammathur/setup-php@afefcaf556d98dc7896cca380e181decb609ca44 # v2.10.0
+        uses: shivammathur/setup-php@ac7d3d7f84d81a029c20ab72d60264bdb7535831 # v2.15.0
         with:
           php-version: '7.4'
           coverage: none
@@ -71,8 +71,20 @@ jobs:
           php --version
           composer --version
 
+      # This date is used to ensure that the PHP compatibility cache is cleared at least once every week.
+      # http://man7.org/linux/man-pages/man1/date.1.html
+      - name: "Get last Monday's date"
+        id: get-date
+        run: echo "::set-output name=date::$(/bin/date -u --date='last Mon' "+%F")"
+
+      - name: Cache PHP compatibility scan cache
+        uses: actions/cache@c64c572235d810460d0d6876e9c705ad5002b353 # v2.1.6
+        with:
+          path: .cache/phpcompat.json
+          key: ${{ runner.os }}-date-${{ steps.get-date.outputs.date }}-phpcompat-cache-${{ hashFiles('**/composer.json', 'phpcompat.xml.dist') }}
+
       - name: Install Composer dependencies
-        uses: ramsey/composer-install@92a7904348d4ad30236f3611e33b7f0c6f9edd70 # v1.1.0
+        uses: ramsey/composer-install@a7320a0581dcd0432930c48a0e7ced67e6ec17e8 # v1.3.0
         with:
           composer-options: "--no-progress --no-ansi --no-interaction"
 
@@ -90,7 +102,7 @@ jobs:
 
   slack-notifications:
     name: Slack Notifications
-    uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@master
+    uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk
     needs: [ php-compatibility ]
     if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event_name != 'pull_request' && always() }}
     with:
diff --git a/.github/workflows/phpunit-tests.yml b/.github/workflows/phpunit-tests.yml
index b6ce31b99b..b5b414874a 100644
--- a/.github/workflows/phpunit-tests.yml
+++ b/.github/workflows/phpunit-tests.yml
@@ -3,7 +3,6 @@ name: PHPUnit Tests
 on:
   push:
     branches:
-      - master
       - trunk
       - '3.[7-9]'
       - '[4-9].[0-9]'
@@ -12,7 +11,6 @@ on:
       - '[4-9].[0-9]*'
   pull_request:
     branches:
-      - master
       - trunk
       - '3.[7-9]'
       - '[4-9].[0-9]'
@@ -62,6 +60,7 @@ jobs:
   test-php:
     name: ${{ matrix.php }}${{ matrix.multisite && ' multisite' || '' }}${{ matrix.split_slow && ' slow tests' || '' }}${{ matrix.memcached && ' with memcached' || '' }} on ${{ matrix.os }}
     runs-on: ${{ matrix.os }}
+    timeout-minutes: 20
     if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }}
     strategy:
       fail-fast: false
@@ -111,10 +110,10 @@ jobs:
           echo "PHP_FPM_GID=$(id -g)" >> $GITHUB_ENV
 
       - name: Checkout repository
-        uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4
+        uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2.4.0
 
       - name: Install NodeJS
-        uses: actions/setup-node@38d90ce44d5275ad62cc48384b3d8a58c500bb5f # v2.2.2
+        uses: actions/setup-node@270253e841af726300e85d718a5f606959b2903c # v2.4.1
         with:
           node-version: 14
           cache: npm
@@ -133,7 +132,7 @@ jobs:
         run: echo "::set-output name=dir::$(composer config cache-files-dir)"
 
       - name: Cache Composer dependencies
-        uses: actions/cache@26968a09c0ea4f3e233fdddbafd1166051a095f6 # v2.1.4
+        uses: actions/cache@c64c572235d810460d0d6876e9c705ad5002b353 # v2.1.6
         env:
           cache-name: cache-composer-dependencies
         with:
@@ -231,21 +230,21 @@ jobs:
         run: git diff --exit-code
 
       - name: Checkout the WordPress Test Reporter
-        if: ${{ github.repository == 'WordPress/wordpress-develop' && github.ref == 'refs/heads/master' && matrix.report }}
-        uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4
+        if: ${{ github.repository == 'WordPress/wordpress-develop' && github.ref == 'refs/heads/trunk' && matrix.report }}
+        uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2.4.0
         with:
           repository: 'WordPress/phpunit-test-runner'
           path: 'test-runner'
 
       - name: Submit test results to the WordPress.org host test results
-        if: ${{ github.repository == 'WordPress/wordpress-develop' && github.ref == 'refs/heads/master' && matrix.report }}
+        if: ${{ github.repository == 'WordPress/wordpress-develop' && github.ref == 'refs/heads/trunk' && matrix.report }}
         env:
           WPT_REPORT_API_KEY: "${{ secrets.WPT_REPORT_API_KEY }}"
         run: docker-compose run --rm -e WPT_REPORT_API_KEY -e WPT_PREPARE_DIR=/var/www -e WPT_TEST_DIR=/var/www php php test-runner/report.php
 
   slack-notifications:
     name: Slack Notifications
-    uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@master
+    uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk
     needs: [ test-php ]
     if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event_name != 'pull_request' && always() }}
     with:
diff --git a/.github/workflows/slack-notifications.yml b/.github/workflows/slack-notifications.yml
index ceb06c5fd4..7a58813648 100644
--- a/.github/workflows/slack-notifications.yml
+++ b/.github/workflows/slack-notifications.yml
@@ -61,6 +61,7 @@ jobs:
   prepare:
     name: Prepare notifications
     runs-on: ubuntu-latest
+    timeout-minutes: 5
     if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event.workflow_run.event != 'pull_request' }}
     outputs:
       previous_conclusion: ${{ steps.previous-conclusion.outputs.previous_conclusion }}
@@ -129,12 +130,13 @@ jobs:
   failure:
     name: Failure notifications
     runs-on: ubuntu-latest
+    timeout-minutes: 5
     needs: [ prepare ]
     if: ${{ github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'failure' || inputs.calling_status == 'failure' || failure() }}
 
     steps:
       - name: Post failure notifications to Slack
-        uses: slackapi/slack-github-action@d5d276d7ae0f38f29322b80da9baf985cc80f8b1 # v1.15.0
+        uses: slackapi/slack-github-action@410ae57cff5c6b682b106440be0e6c7eb8c98c9d # v1.16.0
         with:
           payload: ${{ needs.prepare.outputs.payload }}
         env:
@@ -144,12 +146,13 @@ jobs:
   fixed:
     name: Fixed notifications
     runs-on: ubuntu-latest
+    timeout-minutes: 5
     needs: [ prepare ]
     if: ${{ needs.prepare.outputs.previous_conclusion == 'failure' && ( github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success' || inputs.calling_status == 'success' ) && success() }}
 
     steps:
       - name: Post failure notifications to Slack
-        uses: slackapi/slack-github-action@d5d276d7ae0f38f29322b80da9baf985cc80f8b1 # v1.15.0
+        uses: slackapi/slack-github-action@410ae57cff5c6b682b106440be0e6c7eb8c98c9d # v1.16.0
         with:
           payload: ${{ needs.prepare.outputs.payload }}
         env:
@@ -159,12 +162,13 @@ jobs:
   success:
     name: Success notifications
     runs-on: ubuntu-latest
+    timeout-minutes: 5
     needs: [ prepare ]
     if: ${{ github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'success' || inputs.calling_status == 'success' && success() }}
 
     steps:
       - name: Post success notifications to Slack
-        uses: slackapi/slack-github-action@d5d276d7ae0f38f29322b80da9baf985cc80f8b1 # v1.15.0
+        uses: slackapi/slack-github-action@410ae57cff5c6b682b106440be0e6c7eb8c98c9d # v1.16.0
         with:
           payload: ${{ needs.prepare.outputs.payload }}
         env:
@@ -174,12 +178,13 @@ jobs:
   cancelled:
     name: Cancelled notifications
     runs-on: ubuntu-latest
+    timeout-minutes: 5
     needs: [ prepare ]
     if: ${{ github.event_name == 'workflow_run' && github.event.workflow_run.conclusion == 'cancelled' || inputs.calling_status == 'cancelled' || cancelled() }}
 
     steps:
       - name: Post cancelled notifications to Slack
-        uses: slackapi/slack-github-action@d5d276d7ae0f38f29322b80da9baf985cc80f8b1 # v1.15.0
+        uses: slackapi/slack-github-action@410ae57cff5c6b682b106440be0e6c7eb8c98c9d # v1.16.0
         with:
           payload: ${{ needs.prepare.outputs.payload }}
         env:
diff --git a/.github/workflows/test-coverage.yml b/.github/workflows/test-coverage.yml
index b11ae0348e..caece3306d 100644
--- a/.github/workflows/test-coverage.yml
+++ b/.github/workflows/test-coverage.yml
@@ -4,7 +4,6 @@ on:
   # Verify
   push:
     branches:
-      - master
       - trunk
     paths:
       - '.github/workflows/test-coverage.yml'
@@ -48,6 +47,7 @@ jobs:
   test-coverage-report:
     name: ${{ matrix.multisite && 'Multisite' || 'Single site' }} report
     runs-on: ubuntu-latest
+    timeout-minutes: 120
     if: ${{ github.repository == 'WordPress/wordpress-develop' }}
     strategy:
       fail-fast: false
@@ -61,7 +61,7 @@ jobs:
           echo "PHP_FPM_GID=$(id -g)" >> $GITHUB_ENV
 
       - name: Checkout repository
-        uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4
+        uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2.4.0
 
       - name: Log debug information
         run: |
@@ -77,7 +77,7 @@ jobs:
           locale -a
 
       - name: Install NodeJS
-        uses: actions/setup-node@38d90ce44d5275ad62cc48384b3d8a58c500bb5f # v2.2.2
+        uses: actions/setup-node@270253e841af726300e85d718a5f606959b2903c # v2.4.1
         with:
           node-version: 14
           cache: npm
@@ -96,7 +96,7 @@ jobs:
         run: echo "::set-output name=dir::$(composer config cache-files-dir)"
 
       - name: Cache Composer dependencies
-        uses: actions/cache@26968a09c0ea4f3e233fdddbafd1166051a095f6 # v2.1.4
+        uses: actions/cache@c64c572235d810460d0d6876e9c705ad5002b353 # v2.1.6
         env:
           cache-name: cache-composer-dependencies
         with:
@@ -150,7 +150,7 @@ jobs:
 
       - name: Upload single site report to Codecov
         if: ${{ ! matrix.multisite }}
-        uses: codecov/codecov-action@e156083f13aff6830c92fc5faa23505779fbf649 # v1.2.1
+        uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b # v2.1.0
         with:
           file: wp-code-coverage-single-clover-${{ github.sha }}.xml
           flags: single,php
@@ -164,14 +164,14 @@ jobs:
 
       - name: Upload multisite report to Codecov
         if: ${{ matrix.multisite }}
-        uses: codecov/codecov-action@e156083f13aff6830c92fc5faa23505779fbf649 # v1.2.1
+        uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b # v2.1.0
         with:
           file: wp-code-coverage-multisite-clover-${{ github.sha }}.xml
           flags: multisite,php
 
   slack-notifications:
     name: Slack Notifications
-    uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@master
+    uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk
     needs: [ test-coverage-report ]
     if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event_name != 'pull_request' && always() }}
     with:
diff --git a/.github/workflows/test-npm.yml b/.github/workflows/test-npm.yml
index 0b49e9ab7c..05239b4184 100644
--- a/.github/workflows/test-npm.yml
+++ b/.github/workflows/test-npm.yml
@@ -3,13 +3,11 @@ name: Test NPM
 on:
   push:
     branches:
-      - master
       - trunk
       - '3.[7-9]'
       - '[4-9].[0-9]'
   pull_request:
     branches:
-      - master
       - trunk
       - '3.[7-9]'
       - '[4-9].[0-9]'
@@ -52,6 +50,7 @@ jobs:
   test-npm:
     name: Test NPM on ${{ matrix.os }}
     runs-on: ${{ matrix.os }}
+    timeout-minutes: 20
     if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }}
     strategy:
       fail-fast: false
@@ -60,7 +59,7 @@ jobs:
 
     steps:
       - name: Checkout repository
-        uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4
+        uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2.4.0
 
       - name: Log debug information
         run: |
@@ -71,7 +70,7 @@ jobs:
           svn --version
 
       - name: Install NodeJS
-        uses: actions/setup-node@38d90ce44d5275ad62cc48384b3d8a58c500bb5f # v2.2.2
+        uses: actions/setup-node@270253e841af726300e85d718a5f606959b2903c # v2.4.1
         with:
           node-version: 14
           cache: npm
@@ -115,10 +114,11 @@ jobs:
   test-npm-macos:
     name: Test NPM on MacOS
     runs-on: macos-latest
+    timeout-minutes: 20
     if: ${{ github.repository == 'WordPress/wordpress-develop' }}
     steps:
       - name: Checkout repository
-        uses: actions/checkout@5a4ac9002d0be2fb38bd78e4b4dbde5606d7042f # v2.3.4
+        uses: actions/checkout@ec3a7ce113134d7a93b817d10a8272cb61118579 # v2.4.0
 
       - name: Log debug information
         run: |
@@ -129,7 +129,7 @@ jobs:
           svn --version
 
       - name: Install NodeJS
-        uses: actions/setup-node@38d90ce44d5275ad62cc48384b3d8a58c500bb5f # v2.2.2
+        uses: actions/setup-node@270253e841af726300e85d718a5f606959b2903c # v2.4.1
         with:
           node-version: 14
           cache: npm
@@ -157,7 +157,7 @@ jobs:
 
   slack-notifications:
     name: Slack Notifications
-    uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@master
+    uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk
     needs: [ test-npm, test-npm-macos ]
     if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event_name != 'pull_request' && always() }}
     with:
diff --git a/.github/workflows/test-old-branches.yml b/.github/workflows/test-old-branches.yml
index 1d0bc59a7e..147175197c 100644
--- a/.github/workflows/test-old-branches.yml
+++ b/.github/workflows/test-old-branches.yml
@@ -4,7 +4,6 @@ on:
   # Verify the workflow is successful when this file is updated.
   push:
     branches:
-      - master
       - trunk
     paths:
       - '.github/workflows/test-old-branches.yml'
@@ -17,6 +16,7 @@ jobs:
   dispatch-workflows-for-old-branches:
     name: ${{ matrix.workflow }} for ${{ matrix.branch }}
     runs-on: ubuntu-latest
+    timeout-minutes: 20
     if: ${{ github.repository == 'WordPress/wordpress-develop' }}
     strategy:
       fail-fast: false
@@ -28,12 +28,14 @@ jobs:
             'test-npm.yml'
         ]
         branch: [
-            '5.8', '5.7', '5.6', '5.5', '5.4', '5.3', '5.2', '5.1', '5.0',
+            '5.9', '5.8', '5.7', '5.6', '5.5', '5.4', '5.3', '5.2', '5.1', '5.0',
             '4.9', '4.8', '4.7', '4.6', '4.5', '4.4', '4.3', '4.2', '4.1', '4.0',
             '3.9', '3.8', '3.7'
         ]
         include:
           # PHP Compatibility testing was introduced in 5.5.
+          - branch: '5.9'
+            workflow: 'php-compatibility.yml'
           - branch: '5.8'
             workflow: 'php-compatibility.yml'
           - branch: '5.7'
@@ -43,9 +45,11 @@ jobs:
           - branch: '5.5'
             workflow: 'php-compatibility.yml'
 
-          # End to End testing was introduced in 5.3 but later removed as there were no meaningful assertions.
-          # Only the officially supported major branch runs E2E tests so that more assertions can be added, and the
-          # workflow does not continue to run needlessly on old branches.
+          # End-to-end testing was introduced in 5.3 but was later removed as there were no meaningful assertions.
+          # Starting in 5.8 with #52905, some additional tests with real assertions were introduced.
+          # Branches 5.8 and newer should be tested to confirm no regressions are introduced.
+          - branch: '5.9'
+            workflow: 'end-to-end-tests.yml'
           - branch: '5.8'
             workflow: 'end-to-end-tests.yml'
         exclude:
@@ -58,12 +62,12 @@ jobs:
     # Run all branches monthly, but only the currently supported one twice per month.
     steps:
       - name: Dispatch workflow run
-        uses: actions/github-script@47f7cf65b5ced0830a325f705cad64f2f58dddf7 # v3.1.0
-        if: ${{ github.event_name == 'push' || github.event.schedule == '0 0 15 * *' || matrix.branch == '5.7' }}
+        uses: actions/github-script@441359b1a30438de65712c2fbca0abe4816fa667 # v5.0.0
+        if: ${{ github.event_name == 'push' || github.event.schedule == '0 0 15 * *' || matrix.branch == '5.9' }}
         with:
           github-token: ${{ secrets.GHA_OLD_BRANCH_DISPATCH }}
           script: |
-            github.actions.createWorkflowDispatch({
+            github.rest.actions.createWorkflowDispatch({
               owner: context.repo.owner,
               repo: context.repo.repo,
               workflow_id: '${{ matrix.workflow }}',
@@ -72,7 +76,7 @@ jobs:
 
   slack-notifications:
     name: Slack Notifications
-    uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@master
+    uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk
     needs: [ dispatch-workflows-for-old-branches ]
     if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event_name != 'pull_request' && always() }}
     with:
diff --git a/.github/workflows/welcome-new-contributors.yml b/.github/workflows/welcome-new-contributors.yml
index f475a432a0..44ddf0b02d 100644
--- a/.github/workflows/welcome-new-contributors.yml
+++ b/.github/workflows/welcome-new-contributors.yml
@@ -8,6 +8,7 @@ jobs:
   # Comments on a pull request when the author is a new contributor.
   post-welcome-message:
     runs-on: ubuntu-latest
+    timeout-minutes: 5
     if: ${{ github.repository == 'WordPress/wordpress-develop' }}
 
     steps:
diff --git a/.gitignore b/.gitignore
index fbae7cad27..4fe178c594 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,6 +10,7 @@ wp-tests-config.php
 /phpunit.xml
 /.phpcs.xml
 /phpcs.xml
+.cache/*
 /tests/phpunit/data/plugins/wordpress-importer
 /tests/phpunit/data/.trac-ticket-cache*
 /tests/qunit/compiled.html
@@ -53,6 +54,7 @@ wp-tests-config.php
 !/src/wp-content/themes/twentynineteen
 !/src/wp-content/themes/twentytwenty
 !/src/wp-content/themes/twentytwentyone
+!/src/wp-content/themes/twentytwentytwo
 /src/wp-content/upgrade
 /src/wp-content/uploads
 /src/wp-content/advanced-cache.php
@@ -92,4 +94,4 @@ wp-tests-config.php
 /docker-compose.override.yml
 
 # Visual regression test diffs
-tests/visual-regression/specs/__image_snapshots__
\ No newline at end of file
+tests/visual-regression/specs/__image_snapshots__
diff --git a/.nvmrc b/.nvmrc
index b009dfb9d9..8351c19397 100644
--- a/.nvmrc
+++ b/.nvmrc
@@ -1 +1 @@
-lts/*
+14
diff --git a/Gruntfile.js b/Gruntfile.js
index 369079dc1d..f2b93adc4c 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -192,6 +192,7 @@ module.exports = function(grunt) {
 						[ WORKING_DIR + 'wp-includes/js/jquery/jquery.js' ]: [ './node_modules/jquery/dist/jquery.js' ],
 						[ WORKING_DIR + 'wp-includes/js/jquery/jquery.min.js' ]: [ './node_modules/jquery/dist/jquery.min.js' ],
 						[ WORKING_DIR + 'wp-includes/js/jquery/jquery.form.js' ]: [ './node_modules/jquery-form/src/jquery.form.js' ],
+						[ WORKING_DIR + 'wp-includes/js/jquery/jquery.color.min.js' ]: [ './node_modules/jquery-color/dist/jquery.color.min.js' ],
 						[ WORKING_DIR + 'wp-includes/js/masonry.min.js' ]: [ './node_modules/masonry-layout/dist/masonry.pkgd.min.js' ],
 						[ WORKING_DIR + 'wp-includes/js/twemoji.js' ]: [ './node_modules/twemoji/dist/twemoji.js' ],
 						[ WORKING_DIR + 'wp-includes/js/underscore.js' ]: [ './node_modules/underscore/underscore.js' ],
@@ -1020,16 +1021,6 @@ module.exports = function(grunt) {
 				dest: SOURCE_DIR
 			}
 		},
-		includes: {
-			emoji: {
-				src: BUILD_DIR + 'wp-includes/formatting.php',
-				dest: '.'
-			},
-			embed: {
-				src: BUILD_DIR + 'wp-includes/embed.php',
-				dest: '.'
-			}
-		},
 		replace: {
 			'emoji-regex': {
 				options: {
@@ -1103,26 +1094,6 @@ module.exports = function(grunt) {
 					}
 				]
 			},
-			'emoji-banner-text': {
-				options: {
-					patterns: [
-						{
-							match: new RegExp( '\\s*' + BANNER_TEXT.replace( /[\/\*\!]/g, '\\$&' ) ),
-							replacement: ''
-						}
-					]
-				},
-				files: [
-					{
-						expand: true,
-						flatten: true,
-						src: [
-							BUILD_DIR + 'wp-includes/formatting.php'
-						],
-						dest: BUILD_DIR + 'wp-includes/'
-					}
-				]
-			},
 			'source-maps': {
 				options: {
 					patterns: [
@@ -1549,6 +1520,9 @@ module.exports = function(grunt) {
 	 * @ticket 46218
 	 */
 	grunt.registerTask( 'verify:source-maps', function() {
+		const ignoredFiles = [
+			'build/wp-includes/js/dist/components.js'
+		];
 		const files = buildFiles.reduce( ( acc, path ) => {
 			// Skip excluded paths and any path that isn't a file.
 			if ( '!' === path[0] || '**' !== path.substr( -2 ) ) {
@@ -1563,18 +1537,20 @@ module.exports = function(grunt) {
 			'No JavaScript files found in the build directory.'
 		);
 
-		files.forEach( function( file ) {
-			const contents = fs.readFileSync( file, {
-				encoding: 'utf8',
-			} );
-			// `data:` URLs are allowed:
-			const match = contents.match( /sourceMappingURL=((?!data:).)/ );
+		files
+			.filter(file => ! ignoredFiles.includes( file) )
+			.forEach( function( file ) {
+				const contents = fs.readFileSync( file, {
+					encoding: 'utf8',
+				} );
+				// `data:` URLs are allowed:
+				const match = contents.match( /sourceMappingURL=((?!data:).)/ );
 
-			assert(
-				match === null,
-				`The ${ file } file must not contain a sourceMappingURL.`
-			);
-		} );
+				assert(
+					match === null,
+					`The ${ file } file must not contain a sourceMappingURL.`
+				);
+			} );
 	} );
 
 	grunt.registerTask( 'build', function() {
@@ -1588,9 +1564,6 @@ module.exports = function(grunt) {
 				'build:files',
 				'build:js',
 				'build:css',
-				'includes:emoji',
-				'includes:embed',
-				'replace:emoji-banner-text',
 				'replace:source-maps',
 				'verify:build'
 			] );
diff --git a/SECURITY.md b/SECURITY.md
index fe8b683d6a..6d4258c52e 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -9,6 +9,7 @@ currently being supported with security updates.
 
 | Version | Supported          |
 | ------- | ------------------ |
+| 5.9.x   | :white_check_mark: |
 | 5.8.x   | :white_check_mark: |
 | 5.7.x   | :white_check_mark: |
 | 5.6.x   | :white_check_mark: |
diff --git a/composer.json b/composer.json
index 7910a75687..36ae2b7e4d 100644
--- a/composer.json
+++ b/composer.json
@@ -16,9 +16,14 @@
 		"dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
 		"squizlabs/php_codesniffer": "3.6.0",
 		"wp-coding-standards/wpcs": "~2.3.0",
-		"phpcompatibility/phpcompatibility-wp": "~2.1.2",
+		"phpcompatibility/phpcompatibility-wp": "~2.1.3",
 		"yoast/phpunit-polyfills": "^1.0.1"
 	},
+	"config": {
+		"allow-plugins": {
+			"dealerdirect/phpcodesniffer-composer-installer": true
+		}
+	},
 	"scripts": {
 		"compat": "@php ./vendor/squizlabs/php_codesniffer/bin/phpcs --standard=phpcompat.xml.dist --report=summary,source",
 		"format": "@php ./vendor/squizlabs/php_codesniffer/bin/phpcbf --report=summary,source",
diff --git a/package-lock.json b/package-lock.json
index 68a5b59988..b910e787f7 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,38 +1,38 @@
 {
 	"name": "WordPress",
-	"version": "5.9.0",
+	"version": "6.0.0",
 	"lockfileVersion": 1,
 	"requires": true,
 	"dependencies": {
 		"@babel/code-frame": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.14.5.tgz",
-			"integrity": "sha512-9pzDqyc6OLDaqe+zbACgFkb6fKMNG6CObKpnYXChRsvYGyEdc7CA2BaqeOM+vOtCS5ndmJicPJhKAwYRI6UfFw==",
+			"version": "7.16.0",
+			"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz",
+			"integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==",
 			"requires": {
-				"@babel/highlight": "^7.14.5"
+				"@babel/highlight": "^7.16.0"
 			}
 		},
 		"@babel/compat-data": {
-			"version": "7.15.0",
-			"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.15.0.tgz",
-			"integrity": "sha512-0NqAC1IJE0S0+lL1SWFMxMkz1pKCNCjI4tr2Zx4LJSXxCLAdr6KyArnY+sno5m3yH9g737ygOyPABDsnXkpxiA==",
+			"version": "7.16.4",
+			"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.4.tgz",
+			"integrity": "sha512-1o/jo7D+kC9ZjHX5v+EHrdjl3PhxMrLSOTGsOdHJ+KL8HCaEK6ehrVL2RS6oHDZp+L7xLirLrPmQtEng769J/Q==",
 			"dev": true
 		},
 		"@babel/core": {
-			"version": "7.15.0",
-			"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.15.0.tgz",
-			"integrity": "sha512-tXtmTminrze5HEUPn/a0JtOzzfp0nk+UEXQ/tqIJo3WDGypl/2OFQEMll/zSFU8f/lfmfLXvTaORHF3cfXIQMw==",
-			"dev": true,
-			"requires": {
-				"@babel/code-frame": "^7.14.5",
-				"@babel/generator": "^7.15.0",
-				"@babel/helper-compilation-targets": "^7.15.0",
-				"@babel/helper-module-transforms": "^7.15.0",
-				"@babel/helpers": "^7.14.8",
-				"@babel/parser": "^7.15.0",
-				"@babel/template": "^7.14.5",
-				"@babel/traverse": "^7.15.0",
-				"@babel/types": "^7.15.0",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.5.tgz",
+			"integrity": "sha512-wUcenlLzuWMZ9Zt8S0KmFwGlH6QKRh3vsm/dhDA3CHkiTA45YuG1XkHRcNRl73EFPXDp/d5kVOU0/y7x2w6OaQ==",
+			"dev": true,
+			"requires": {
+				"@babel/code-frame": "^7.16.0",
+				"@babel/generator": "^7.16.5",
+				"@babel/helper-compilation-targets": "^7.16.3",
+				"@babel/helper-module-transforms": "^7.16.5",
+				"@babel/helpers": "^7.16.5",
+				"@babel/parser": "^7.16.5",
+				"@babel/template": "^7.16.0",
+				"@babel/traverse": "^7.16.5",
+				"@babel/types": "^7.16.0",
 				"convert-source-map": "^1.7.0",
 				"debug": "^4.1.0",
 				"gensync": "^1.0.0-beta.2",
@@ -42,9 +42,9 @@
 			},
 			"dependencies": {
 				"@babel/parser": {
-					"version": "7.15.3",
-					"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz",
-					"integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==",
+					"version": "7.16.6",
+					"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz",
+					"integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==",
 					"dev": true
 				},
 				"json5": {
@@ -64,48 +64,108 @@
 				}
 			}
 		},
+		"@babel/eslint-parser": {
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.16.5.tgz",
+			"integrity": "sha512-mUqYa46lgWqHKQ33Q6LNCGp/wPR3eqOYTUixHFsfrSQqRxH0+WOzca75iEjFr5RDGH1dDz622LaHhLOzOuQRUA==",
+			"dev": true,
+			"requires": {
+				"eslint-scope": "^5.1.1",
+				"eslint-visitor-keys": "^2.1.0",
+				"semver": "^6.3.0"
+			},
+			"dependencies": {
+				"eslint-scope": {
+					"version": "5.1.1",
+					"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+					"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+					"dev": true,
+					"requires": {
+						"esrecurse": "^4.3.0",
+						"estraverse": "^4.1.1"
+					}
+				},
+				"semver": {
+					"version": "6.3.0",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+					"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+					"dev": true
+				}
+			}
+		},
 		"@babel/generator": {
-			"version": "7.15.0",
-			"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.15.0.tgz",
-			"integrity": "sha512-eKl4XdMrbpYvuB505KTta4AV9g+wWzmVBW69tX0H2NwKVKd2YJbKgyK6M8j/rgLbmHOYJn6rUklV677nOyJrEQ==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.5.tgz",
+			"integrity": "sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA==",
 			"dev": true,
 			"requires": {
-				"@babel/types": "^7.15.0",
+				"@babel/types": "^7.16.0",
 				"jsesc": "^2.5.1",
 				"source-map": "^0.5.0"
 			}
 		},
 		"@babel/helper-annotate-as-pure": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.14.5.tgz",
-			"integrity": "sha512-EivH9EgBIb+G8ij1B2jAwSH36WnGvkQSEC6CkX/6v6ZFlw5fVOHvsgGF4uiEHO2GzMvunZb6tDLQEQSdrdocrA==",
+			"version": "7.16.0",
+			"resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz",
+			"integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==",
 			"dev": true,
 			"requires": {
-				"@babel/types": "^7.14.5"
+				"@babel/types": "^7.16.0"
 			}
 		},
 		"@babel/helper-builder-binary-assignment-operator-visitor": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz",
-			"integrity": "sha512-YTA/Twn0vBXDVGJuAX6PwW7x5zQei1luDDo2Pl6q1qZ7hVNl0RZrhHCQG/ArGpR29Vl7ETiB8eJyrvpuRp300w==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.5.tgz",
+			"integrity": "sha512-3JEA9G5dmmnIWdzaT9d0NmFRgYnWUThLsDaL7982H0XqqWr56lRrsmwheXFMjR+TMl7QMBb6mzy9kvgr1lRLUA==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-explode-assignable-expression": "^7.14.5",
-				"@babel/types": "^7.14.5"
+				"@babel/helper-explode-assignable-expression": "^7.16.0",
+				"@babel/types": "^7.16.0"
 			}
 		},
 		"@babel/helper-compilation-targets": {
-			"version": "7.15.0",
-			"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.15.0.tgz",
-			"integrity": "sha512-h+/9t0ncd4jfZ8wsdAsoIxSa61qhBYlycXiHWqJaQBCXAhDCMbPRSMTGnZIkkmt1u4ag+UQmuqcILwqKzZ4N2A==",
+			"version": "7.16.3",
+			"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.3.tgz",
+			"integrity": "sha512-vKsoSQAyBmxS35JUOOt+07cLc6Nk/2ljLIHwmq2/NM6hdioUaqEXq/S+nXvbvXbZkNDlWOymPanJGOc4CBjSJA==",
 			"dev": true,
 			"requires": {
-				"@babel/compat-data": "^7.15.0",
+				"@babel/compat-data": "^7.16.0",
 				"@babel/helper-validator-option": "^7.14.5",
-				"browserslist": "^4.16.6",
+				"browserslist": "^4.17.5",
 				"semver": "^6.3.0"
 			},
 			"dependencies": {
+				"browserslist": {
+					"version": "4.19.1",
+					"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
+					"integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
+					"dev": true,
+					"requires": {
+						"caniuse-lite": "^1.0.30001286",
+						"electron-to-chromium": "^1.4.17",
+						"escalade": "^3.1.1",
+						"node-releases": "^2.0.1",
+						"picocolors": "^1.0.0"
+					}
+				},
+				"caniuse-lite": {
+					"version": "1.0.30001291",
+					"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001291.tgz",
+					"integrity": "sha512-roMV5V0HNGgJ88s42eE70sstqGW/gwFndosYrikHthw98N5tLnOTxFqMLQjZVRxTWFlJ4rn+MsgXrR7MDPY4jA==",
+					"dev": true
+				},
+				"electron-to-chromium": {
+					"version": "1.4.25",
+					"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.25.tgz",
+					"integrity": "sha512-bTwub9Y/76EiNmfaiJih+hAy6xn7Ns95S4KvI2NuKNOz8TEEKKQUu44xuy0PYMudjM9zdjKRS1bitsUvHTfuUg==",
+					"dev": true
+				},
+				"node-releases": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
+					"integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
+					"dev": true
+				},
 				"semver": {
 					"version": "6.3.0",
 					"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -115,33 +175,34 @@
 			}
 		},
 		"@babel/helper-create-class-features-plugin": {
-			"version": "7.15.0",
-			"resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.0.tgz",
-			"integrity": "sha512-MdmDXgvTIi4heDVX/e9EFfeGpugqm9fobBVg/iioE8kueXrOHdRDe36FAY7SnE9xXLVeYCoJR/gdrBEIHRC83Q==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.5.tgz",
+			"integrity": "sha512-NEohnYA7mkB8L5JhU7BLwcBdU3j83IziR9aseMueWGeAjblbul3zzb8UvJ3a1zuBiqCMObzCJHFqKIQE6hTVmg==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-annotate-as-pure": "^7.14.5",
-				"@babel/helper-function-name": "^7.14.5",
-				"@babel/helper-member-expression-to-functions": "^7.15.0",
-				"@babel/helper-optimise-call-expression": "^7.14.5",
-				"@babel/helper-replace-supers": "^7.15.0",
-				"@babel/helper-split-export-declaration": "^7.14.5"
+				"@babel/helper-annotate-as-pure": "^7.16.0",
+				"@babel/helper-environment-visitor": "^7.16.5",
+				"@babel/helper-function-name": "^7.16.0",
+				"@babel/helper-member-expression-to-functions": "^7.16.5",
+				"@babel/helper-optimise-call-expression": "^7.16.0",
+				"@babel/helper-replace-supers": "^7.16.5",
+				"@babel/helper-split-export-declaration": "^7.16.0"
 			}
 		},
 		"@babel/helper-create-regexp-features-plugin": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz",
-			"integrity": "sha512-TLawwqpOErY2HhWbGJ2nZT5wSkR192QpN+nBg1THfBfftrlvOh+WbhrxXCH4q4xJ9Gl16BGPR/48JA+Ryiho/A==",
+			"version": "7.16.0",
+			"resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.0.tgz",
+			"integrity": "sha512-3DyG0zAFAZKcOp7aVr33ddwkxJ0Z0Jr5V99y3I690eYLpukJsJvAbzTy1ewoCqsML8SbIrjH14Jc/nSQ4TvNPA==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-annotate-as-pure": "^7.14.5",
+				"@babel/helper-annotate-as-pure": "^7.16.0",
 				"regexpu-core": "^4.7.1"
 			}
 		},
 		"@babel/helper-define-polyfill-provider": {
-			"version": "0.2.3",
-			"resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.3.tgz",
-			"integrity": "sha512-RH3QDAfRMzj7+0Nqu5oqgO5q9mFtQEVvCRsi8qCEfzLR9p2BHfn5FzhSB2oj1fF7I2+DcTORkYaQ6aTR9Cofew==",
+			"version": "0.3.0",
+			"resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz",
+			"integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==",
 			"dev": true,
 			"requires": {
 				"@babel/helper-compilation-targets": "^7.13.0",
@@ -162,146 +223,155 @@
 				}
 			}
 		},
+		"@babel/helper-environment-visitor": {
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.5.tgz",
+			"integrity": "sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg==",
+			"dev": true,
+			"requires": {
+				"@babel/types": "^7.16.0"
+			}
+		},
 		"@babel/helper-explode-assignable-expression": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz",
-			"integrity": "sha512-Htb24gnGJdIGT4vnRKMdoXiOIlqOLmdiUYpAQ0mYfgVT/GDm8GOYhgi4GL+hMKrkiPRohO4ts34ELFsGAPQLDQ==",
+			"version": "7.16.0",
+			"resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.0.tgz",
+			"integrity": "sha512-Hk2SLxC9ZbcOhLpg/yMznzJ11W++lg5GMbxt1ev6TXUiJB0N42KPC+7w8a+eWGuqDnUYuwStJoZHM7RgmIOaGQ==",
 			"dev": true,
 			"requires": {
-				"@babel/types": "^7.14.5"
+				"@babel/types": "^7.16.0"
 			}
 		},
 		"@babel/helper-function-name": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.14.5.tgz",
-			"integrity": "sha512-Gjna0AsXWfFvrAuX+VKcN/aNNWonizBj39yGwUzVDVTlMYJMK2Wp6xdpy72mfArFq5uK+NOuexfzZlzI1z9+AQ==",
+			"version": "7.16.0",
+			"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz",
+			"integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-get-function-arity": "^7.14.5",
-				"@babel/template": "^7.14.5",
-				"@babel/types": "^7.14.5"
+				"@babel/helper-get-function-arity": "^7.16.0",
+				"@babel/template": "^7.16.0",
+				"@babel/types": "^7.16.0"
 			}
 		},
 		"@babel/helper-get-function-arity": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.14.5.tgz",
-			"integrity": "sha512-I1Db4Shst5lewOM4V+ZKJzQ0JGGaZ6VY1jYvMghRjqs6DWgxLCIyFt30GlnKkfUeFLpJt2vzbMVEXVSXlIFYUg==",
+			"version": "7.16.0",
+			"resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz",
+			"integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==",
 			"dev": true,
 			"requires": {
-				"@babel/types": "^7.14.5"
+				"@babel/types": "^7.16.0"
 			}
 		},
 		"@babel/helper-hoist-variables": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.14.5.tgz",
-			"integrity": "sha512-R1PXiz31Uc0Vxy4OEOm07x0oSjKAdPPCh3tPivn/Eo8cvz6gveAeuyUUPB21Hoiif0uoPQSSdhIPS3352nvdyQ==",
+			"version": "7.16.0",
+			"resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz",
+			"integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==",
 			"dev": true,
 			"requires": {
-				"@babel/types": "^7.14.5"
+				"@babel/types": "^7.16.0"
 			}
 		},
 		"@babel/helper-member-expression-to-functions": {
-			"version": "7.15.0",
-			"resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.15.0.tgz",
-			"integrity": "sha512-Jq8H8U2kYiafuj2xMTPQwkTBnEEdGKpT35lJEQsRRjnG0LW3neucsaMWLgKcwu3OHKNeYugfw+Z20BXBSEs2Lg==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz",
+			"integrity": "sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw==",
 			"dev": true,
 			"requires": {
-				"@babel/types": "^7.15.0"
+				"@babel/types": "^7.16.0"
 			}
 		},
 		"@babel/helper-module-imports": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.14.5.tgz",
-			"integrity": "sha512-SwrNHu5QWS84XlHwGYPDtCxcA0hrSlL2yhWYLgeOc0w7ccOl2qv4s/nARI0aYZW+bSwAL5CukeXA47B/1NKcnQ==",
+			"version": "7.16.0",
+			"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz",
+			"integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==",
 			"requires": {
-				"@babel/types": "^7.14.5"
+				"@babel/types": "^7.16.0"
 			}
 		},
 		"@babel/helper-module-transforms": {
-			"version": "7.15.0",
-			"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.15.0.tgz",
-			"integrity": "sha512-RkGiW5Rer7fpXv9m1B3iHIFDZdItnO2/BLfWVW/9q7+KqQSDY5kUfQEbzdXM1MVhJGcugKV7kRrNVzNxmk7NBg==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.5.tgz",
+			"integrity": "sha512-CkvMxgV4ZyyioElFwcuWnDCcNIeyqTkCm9BxXZi73RR1ozqlpboqsbGUNvRTflgZtFbbJ1v5Emvm+lkjMYY/LQ==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-module-imports": "^7.14.5",
-				"@babel/helper-replace-supers": "^7.15.0",
-				"@babel/helper-simple-access": "^7.14.8",
-				"@babel/helper-split-export-declaration": "^7.14.5",
-				"@babel/helper-validator-identifier": "^7.14.9",
-				"@babel/template": "^7.14.5",
-				"@babel/traverse": "^7.15.0",
-				"@babel/types": "^7.15.0"
+				"@babel/helper-environment-visitor": "^7.16.5",
+				"@babel/helper-module-imports": "^7.16.0",
+				"@babel/helper-simple-access": "^7.16.0",
+				"@babel/helper-split-export-declaration": "^7.16.0",
+				"@babel/helper-validator-identifier": "^7.15.7",
+				"@babel/template": "^7.16.0",
+				"@babel/traverse": "^7.16.5",
+				"@babel/types": "^7.16.0"
 			}
 		},
 		"@babel/helper-optimise-call-expression": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.14.5.tgz",
-			"integrity": "sha512-IqiLIrODUOdnPU9/F8ib1Fx2ohlgDhxnIDU7OEVi+kAbEZcyiF7BLU8W6PfvPi9LzztjS7kcbzbmL7oG8kD6VA==",
+			"version": "7.16.0",
+			"resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz",
+			"integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==",
 			"dev": true,
 			"requires": {
-				"@babel/types": "^7.14.5"
+				"@babel/types": "^7.16.0"
 			}
 		},
 		"@babel/helper-plugin-utils": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz",
-			"integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==",
-			"dev": true
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz",
+			"integrity": "sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ=="
 		},
 		"@babel/helper-remap-async-to-generator": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.14.5.tgz",
-			"integrity": "sha512-rLQKdQU+HYlxBwQIj8dk4/0ENOUEhA/Z0l4hN8BexpvmSMN9oA9EagjnhnDpNsRdWCfjwa4mn/HyBXO9yhQP6A==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.5.tgz",
+			"integrity": "sha512-X+aAJldyxrOmN9v3FKp+Hu1NO69VWgYgDGq6YDykwRPzxs5f2N+X988CBXS7EQahDU+Vpet5QYMqLk+nsp+Qxw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-annotate-as-pure": "^7.14.5",
-				"@babel/helper-wrap-function": "^7.14.5",
-				"@babel/types": "^7.14.5"
+				"@babel/helper-annotate-as-pure": "^7.16.0",
+				"@babel/helper-wrap-function": "^7.16.5",
+				"@babel/types": "^7.16.0"
 			}
 		},
 		"@babel/helper-replace-supers": {
-			"version": "7.15.0",
-			"resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.15.0.tgz",
-			"integrity": "sha512-6O+eWrhx+HEra/uJnifCwhwMd6Bp5+ZfZeJwbqUTuqkhIT6YcRhiZCOOFChRypOIe0cV46kFrRBlm+t5vHCEaA==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz",
+			"integrity": "sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-member-expression-to-functions": "^7.15.0",
-				"@babel/helper-optimise-call-expression": "^7.14.5",
-				"@babel/traverse": "^7.15.0",
-				"@babel/types": "^7.15.0"
+				"@babel/helper-environment-visitor": "^7.16.5",
+				"@babel/helper-member-expression-to-functions": "^7.16.5",
+				"@babel/helper-optimise-call-expression": "^7.16.0",
+				"@babel/traverse": "^7.16.5",
+				"@babel/types": "^7.16.0"
 			}
 		},
 		"@babel/helper-simple-access": {
-			"version": "7.14.8",
-			"resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.14.8.tgz",
-			"integrity": "sha512-TrFN4RHh9gnWEU+s7JloIho2T76GPwRHhdzOWLqTrMnlas8T9O7ec+oEDNsRXndOmru9ymH9DFrEOxpzPoSbdg==",
+			"version": "7.16.0",
+			"resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz",
+			"integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==",
 			"dev": true,
 			"requires": {
-				"@babel/types": "^7.14.8"
+				"@babel/types": "^7.16.0"
 			}
 		},
 		"@babel/helper-skip-transparent-expression-wrappers": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.14.5.tgz",
-			"integrity": "sha512-dmqZB7mrb94PZSAOYtr+ZN5qt5owZIAgqtoTuqiFbHFtxgEcmQlRJVI+bO++fciBunXtB6MK7HrzrfcAzIz2NQ==",
+			"version": "7.16.0",
+			"resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz",
+			"integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==",
 			"dev": true,
 			"requires": {
-				"@babel/types": "^7.14.5"
+				"@babel/types": "^7.16.0"
 			}
 		},
 		"@babel/helper-split-export-declaration": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.14.5.tgz",
-			"integrity": "sha512-hprxVPu6e5Kdp2puZUmvOGjaLv9TCe58E/Fl6hRq4YiVQxIcNvuq6uTM2r1mT/oPskuS9CgR+I94sqAYv0NGKA==",
+			"version": "7.16.0",
+			"resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz",
+			"integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==",
 			"dev": true,
 			"requires": {
-				"@babel/types": "^7.14.5"
+				"@babel/types": "^7.16.0"
 			}
 		},
 		"@babel/helper-validator-identifier": {
-			"version": "7.14.9",
-			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
-			"integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g=="
+			"version": "7.15.7",
+			"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
+			"integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w=="
 		},
 		"@babel/helper-validator-option": {
 			"version": "7.14.5",
@@ -310,34 +380,34 @@
 			"dev": true
 		},
 		"@babel/helper-wrap-function": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.14.5.tgz",
-			"integrity": "sha512-YEdjTCq+LNuNS1WfxsDCNpgXkJaIyqco6DAelTUjT4f2KIWC1nBcaCaSdHTBqQVLnTBexBcVcFhLSU1KnYuePQ==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.5.tgz",
+			"integrity": "sha512-2J2pmLBqUqVdJw78U0KPNdeE2qeuIyKoG4mKV7wAq3mc4jJG282UgjZw4ZYDnqiWQuS3Y3IYdF/AQ6CpyBV3VA==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-function-name": "^7.14.5",
-				"@babel/template": "^7.14.5",
-				"@babel/traverse": "^7.14.5",
-				"@babel/types": "^7.14.5"
+				"@babel/helper-function-name": "^7.16.0",
+				"@babel/template": "^7.16.0",
+				"@babel/traverse": "^7.16.5",
+				"@babel/types": "^7.16.0"
 			}
 		},
 		"@babel/helpers": {
-			"version": "7.15.3",
-			"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.15.3.tgz",
-			"integrity": "sha512-HwJiz52XaS96lX+28Tnbu31VeFSQJGOeKHJeaEPQlTl7PnlhFElWPj8tUXtqFIzeN86XxXoBr+WFAyK2PPVz6g==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.5.tgz",
+			"integrity": "sha512-TLgi6Lh71vvMZGEkFuIxzaPsyeYCHQ5jJOOX1f0xXn0uciFuE8cEk0wyBquMcCxBXZ5BJhE2aUB7pnWTD150Tw==",
 			"dev": true,
 			"requires": {
-				"@babel/template": "^7.14.5",
-				"@babel/traverse": "^7.15.0",
-				"@babel/types": "^7.15.0"
+				"@babel/template": "^7.16.0",
+				"@babel/traverse": "^7.16.5",
+				"@babel/types": "^7.16.0"
 			}
 		},
 		"@babel/highlight": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz",
-			"integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==",
+			"version": "7.16.0",
+			"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz",
+			"integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==",
 			"requires": {
-				"@babel/helper-validator-identifier": "^7.14.5",
+				"@babel/helper-validator-identifier": "^7.15.7",
 				"chalk": "^2.0.0",
 				"js-tokens": "^4.0.0"
 			},
@@ -360,173 +430,182 @@
 			"integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==",
 			"dev": true
 		},
+		"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+			"version": "7.16.2",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.2.tgz",
+			"integrity": "sha512-h37CvpLSf8gb2lIJ2CgC3t+EjFbi0t8qS7LCS1xcJIlEXE4czlofwaW7W1HA8zpgOCzI9C1nmoqNR1zWkk0pQg==",
+			"dev": true,
+			"requires": {
+				"@babel/helper-plugin-utils": "^7.14.5"
+			}
+		},
 		"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.14.5.tgz",
-			"integrity": "sha512-ZoJS2XCKPBfTmL122iP6NM9dOg+d4lc9fFk3zxc8iDjvt8Pk4+TlsHSKhIPf6X+L5ORCdBzqMZDjL/WHj7WknQ==",
+			"version": "7.16.0",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.0.tgz",
+			"integrity": "sha512-4tcFwwicpWTrpl9qjf7UsoosaArgImF85AxqCRZlgc3IQDvkUHjJpruXAL58Wmj+T6fypWTC/BakfEkwIL/pwA==",
 			"dev": true,
 			"requires": {
 				"@babel/helper-plugin-utils": "^7.14.5",
-				"@babel/helper-skip-transparent-expression-wrappers": "^7.14.5",
-				"@babel/plugin-proposal-optional-chaining": "^7.14.5"
+				"@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
+				"@babel/plugin-proposal-optional-chaining": "^7.16.0"
 			}
 		},
 		"@babel/plugin-proposal-async-generator-functions": {
-			"version": "7.14.9",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.14.9.tgz",
-			"integrity": "sha512-d1lnh+ZnKrFKwtTYdw320+sQWCTwgkB9fmUhNXRADA4akR6wLjaruSGnIEUjpt9HCOwTr4ynFTKu19b7rFRpmw==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.5.tgz",
+			"integrity": "sha512-C/FX+3HNLV6sz7AqbTQqEo1L9/kfrKjxcVtgyBCmvIgOjvuBVUWooDoi7trsLxOzCEo5FccjRvKHkfDsJFZlfA==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5",
-				"@babel/helper-remap-async-to-generator": "^7.14.5",
+				"@babel/helper-plugin-utils": "^7.16.5",
+				"@babel/helper-remap-async-to-generator": "^7.16.5",
 				"@babel/plugin-syntax-async-generators": "^7.8.4"
 			}
 		},
 		"@babel/plugin-proposal-class-properties": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz",
-			"integrity": "sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.5.tgz",
+			"integrity": "sha512-pJD3HjgRv83s5dv1sTnDbZOaTjghKEz8KUn1Kbh2eAIRhGuyQ1XSeI4xVXU3UlIEVA3DAyIdxqT1eRn7Wcn55A==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-create-class-features-plugin": "^7.14.5",
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-create-class-features-plugin": "^7.16.5",
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-proposal-class-static-block": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.14.5.tgz",
-			"integrity": "sha512-KBAH5ksEnYHCegqseI5N9skTdxgJdmDoAOc0uXa+4QMYKeZD0w5IARh4FMlTNtaHhbB8v+KzMdTgxMMzsIy6Yg==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.5.tgz",
+			"integrity": "sha512-EEFzuLZcm/rNJ8Q5krK+FRKdVkd6FjfzT9tuSZql9sQn64K0hHA2KLJ0DqVot9/iV6+SsuadC5yI39zWnm+nmQ==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-create-class-features-plugin": "^7.14.5",
-				"@babel/helper-plugin-utils": "^7.14.5",
+				"@babel/helper-create-class-features-plugin": "^7.16.5",
+				"@babel/helper-plugin-utils": "^7.16.5",
 				"@babel/plugin-syntax-class-static-block": "^7.14.5"
 			}
 		},
 		"@babel/plugin-proposal-dynamic-import": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.14.5.tgz",
-			"integrity": "sha512-ExjiNYc3HDN5PXJx+bwC50GIx/KKanX2HiggnIUAYedbARdImiCU4RhhHfdf0Kd7JNXGpsBBBCOm+bBVy3Gb0g==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.5.tgz",
+			"integrity": "sha512-P05/SJZTTvHz79LNYTF8ff5xXge0kk5sIIWAypcWgX4BTRUgyHc8wRxJ/Hk+mU0KXldgOOslKaeqnhthcDJCJQ==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5",
+				"@babel/helper-plugin-utils": "^7.16.5",
 				"@babel/plugin-syntax-dynamic-import": "^7.8.3"
 			}
 		},
 		"@babel/plugin-proposal-export-namespace-from": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.14.5.tgz",
-			"integrity": "sha512-g5POA32bXPMmSBu5Dx/iZGLGnKmKPc5AiY7qfZgurzrCYgIztDlHFbznSNCoQuv57YQLnQfaDi7dxCtLDIdXdA==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.5.tgz",
+			"integrity": "sha512-i+sltzEShH1vsVydvNaTRsgvq2vZsfyrd7K7vPLUU/KgS0D5yZMe6uipM0+izminnkKrEfdUnz7CxMRb6oHZWw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5",
+				"@babel/helper-plugin-utils": "^7.16.5",
 				"@babel/plugin-syntax-export-namespace-from": "^7.8.3"
 			}
 		},
 		"@babel/plugin-proposal-json-strings": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.14.5.tgz",
-			"integrity": "sha512-NSq2fczJYKVRIsUJyNxrVUMhB27zb7N7pOFGQOhBKJrChbGcgEAqyZrmZswkPk18VMurEeJAaICbfm57vUeTbQ==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.5.tgz",
+			"integrity": "sha512-QQJueTFa0y9E4qHANqIvMsuxM/qcLQmKttBACtPCQzGUEizsXDACGonlPiSwynHfOa3vNw0FPMVvQzbuXwh4SQ==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5",
+				"@babel/helper-plugin-utils": "^7.16.5",
 				"@babel/plugin-syntax-json-strings": "^7.8.3"
 			}
 		},
 		"@babel/plugin-proposal-logical-assignment-operators": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.14.5.tgz",
-			"integrity": "sha512-YGn2AvZAo9TwyhlLvCCWxD90Xq8xJ4aSgaX3G5D/8DW94L8aaT+dS5cSP+Z06+rCJERGSr9GxMBZ601xoc2taw==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.5.tgz",
+			"integrity": "sha512-xqibl7ISO2vjuQM+MzR3rkd0zfNWltk7n9QhaD8ghMmMceVguYrNDt7MikRyj4J4v3QehpnrU8RYLnC7z/gZLA==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5",
+				"@babel/helper-plugin-utils": "^7.16.5",
 				"@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
 			}
 		},
 		"@babel/plugin-proposal-nullish-coalescing-operator": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz",
-			"integrity": "sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.5.tgz",
+			"integrity": "sha512-YwMsTp/oOviSBhrjwi0vzCUycseCYwoXnLiXIL3YNjHSMBHicGTz7GjVU/IGgz4DtOEXBdCNG72pvCX22ehfqg==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5",
+				"@babel/helper-plugin-utils": "^7.16.5",
 				"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
 			}
 		},
 		"@babel/plugin-proposal-numeric-separator": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.14.5.tgz",
-			"integrity": "sha512-yiclALKe0vyZRZE0pS6RXgjUOt87GWv6FYa5zqj15PvhOGFO69R5DusPlgK/1K5dVnCtegTiWu9UaBSrLLJJBg==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.5.tgz",
+			"integrity": "sha512-DvB9l/TcsCRvsIV9v4jxR/jVP45cslTVC0PMVHvaJhhNuhn2Y1SOhCSFlPK777qLB5wb8rVDaNoqMTyOqtY5Iw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5",
+				"@babel/helper-plugin-utils": "^7.16.5",
 				"@babel/plugin-syntax-numeric-separator": "^7.10.4"
 			}
 		},
 		"@babel/plugin-proposal-object-rest-spread": {
-			"version": "7.14.7",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.14.7.tgz",
-			"integrity": "sha512-082hsZz+sVabfmDWo1Oct1u1AgbKbUAyVgmX4otIc7bdsRgHBXwTwb3DpDmD4Eyyx6DNiuz5UAATT655k+kL5g==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.5.tgz",
+			"integrity": "sha512-UEd6KpChoyPhCoE840KRHOlGhEZFutdPDMGj+0I56yuTTOaT51GzmnEl/0uT41fB/vD2nT+Pci2KjezyE3HmUw==",
 			"dev": true,
 			"requires": {
-				"@babel/compat-data": "^7.14.7",
-				"@babel/helper-compilation-targets": "^7.14.5",
-				"@babel/helper-plugin-utils": "^7.14.5",
+				"@babel/compat-data": "^7.16.4",
+				"@babel/helper-compilation-targets": "^7.16.3",
+				"@babel/helper-plugin-utils": "^7.16.5",
 				"@babel/plugin-syntax-object-rest-spread": "^7.8.3",
-				"@babel/plugin-transform-parameters": "^7.14.5"
+				"@babel/plugin-transform-parameters": "^7.16.5"
 			}
 		},
 		"@babel/plugin-proposal-optional-catch-binding": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.14.5.tgz",
-			"integrity": "sha512-3Oyiixm0ur7bzO5ybNcZFlmVsygSIQgdOa7cTfOYCMY+wEPAYhZAJxi3mixKFCTCKUhQXuCTtQ1MzrpL3WT8ZQ==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.5.tgz",
+			"integrity": "sha512-ihCMxY1Iljmx4bWy/PIMJGXN4NS4oUj1MKynwO07kiKms23pNvIn1DMB92DNB2R0EA882sw0VXIelYGdtF7xEQ==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5",
+				"@babel/helper-plugin-utils": "^7.16.5",
 				"@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
 			}
 		},
 		"@babel/plugin-proposal-optional-chaining": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz",
-			"integrity": "sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.5.tgz",
+			"integrity": "sha512-kzdHgnaXRonttiTfKYnSVafbWngPPr2qKw9BWYBESl91W54e+9R5pP70LtWxV56g0f05f/SQrwHYkfvbwcdQ/A==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5",
-				"@babel/helper-skip-transparent-expression-wrappers": "^7.14.5",
+				"@babel/helper-plugin-utils": "^7.16.5",
+				"@babel/helper-skip-transparent-expression-wrappers": "^7.16.0",
 				"@babel/plugin-syntax-optional-chaining": "^7.8.3"
 			}
 		},
 		"@babel/plugin-proposal-private-methods": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.14.5.tgz",
-			"integrity": "sha512-838DkdUA1u+QTCplatfq4B7+1lnDa/+QMI89x5WZHBcnNv+47N8QEj2k9I2MUU9xIv8XJ4XvPCviM/Dj7Uwt9g==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.5.tgz",
+			"integrity": "sha512-+yFMO4BGT3sgzXo+lrq7orX5mAZt57DwUK6seqII6AcJnJOIhBJ8pzKH47/ql/d426uQ7YhN8DpUFirQzqYSUA==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-create-class-features-plugin": "^7.14.5",
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-create-class-features-plugin": "^7.16.5",
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-proposal-private-property-in-object": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.5.tgz",
-			"integrity": "sha512-62EyfyA3WA0mZiF2e2IV9mc9Ghwxcg8YTu8BS4Wss4Y3PY725OmS9M0qLORbJwLqFtGh+jiE4wAmocK2CTUK2Q==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.5.tgz",
+			"integrity": "sha512-+YGh5Wbw0NH3y/E5YMu6ci5qTDmAEVNoZ3I54aB6nVEOZ5BQ7QJlwKq5pYVucQilMByGn/bvX0af+uNaPRCabA==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-annotate-as-pure": "^7.14.5",
-				"@babel/helper-create-class-features-plugin": "^7.14.5",
-				"@babel/helper-plugin-utils": "^7.14.5",
+				"@babel/helper-annotate-as-pure": "^7.16.0",
+				"@babel/helper-create-class-features-plugin": "^7.16.5",
+				"@babel/helper-plugin-utils": "^7.16.5",
 				"@babel/plugin-syntax-private-property-in-object": "^7.14.5"
 			}
 		},
 		"@babel/plugin-proposal-unicode-property-regex": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.14.5.tgz",
-			"integrity": "sha512-6axIeOU5LnY471KenAB9vI8I5j7NQ2d652hIYwVyRfgaZT5UpiqFKCuVXCDMSrU+3VFafnu2c5m3lrWIlr6A5Q==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.5.tgz",
+			"integrity": "sha512-s5sKtlKQyFSatt781HQwv1hoM5BQ9qRH30r+dK56OLDsHmV74mzwJNX7R1yMuE7VZKG5O6q/gmOGSAO6ikTudg==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-create-regexp-features-plugin": "^7.14.5",
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-create-regexp-features-plugin": "^7.16.0",
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-syntax-async-generators": {
@@ -602,12 +681,11 @@
 			}
 		},
 		"@babel/plugin-syntax-jsx": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.14.5.tgz",
-			"integrity": "sha512-ohuFIsOMXJnbOMRfX7/w7LocdR6R7whhuRD4ax8IipLcLPlZGJKkBxgHp++U4N/vKyU16/YDQr2f5seajD3jIw==",
-			"dev": true,
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.5.tgz",
+			"integrity": "sha512-42OGssv9NPk4QHKVgIHlzeLgPOW5rGgfV5jzG90AhcXXIv6hu/eqj63w4VgvRxdvZY3AlYeDgPiSJ3BqAd1Y6Q==",
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-syntax-logical-assignment-operators": {
@@ -683,322 +761,436 @@
 			}
 		},
 		"@babel/plugin-syntax-typescript": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz",
-			"integrity": "sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.5.tgz",
+			"integrity": "sha512-/d4//lZ1Vqb4mZ5xTep3dDK888j7BGM/iKqBmndBaoYAFPlPKrGU608VVBz5JeyAb6YQDjRu1UKqj86UhwWVgw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-arrow-functions": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.14.5.tgz",
-			"integrity": "sha512-KOnO0l4+tD5IfOdi4x8C1XmEIRWUjNRV8wc6K2vz/3e8yAOoZZvsRXRRIF/yo/MAOFb4QjtAw9xSxMXbSMRy8A==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.5.tgz",
+			"integrity": "sha512-8bTHiiZyMOyfZFULjsCnYOWG059FVMes0iljEHSfARhNgFfpsqE92OrCffv3veSw9rwMkYcFe9bj0ZoXU2IGtQ==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-async-to-generator": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.14.5.tgz",
-			"integrity": "sha512-szkbzQ0mNk0rpu76fzDdqSyPu0MuvpXgC+6rz5rpMb5OIRxdmHfQxrktL8CYolL2d8luMCZTR0DpIMIdL27IjA==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.5.tgz",
+			"integrity": "sha512-TMXgfioJnkXU+XRoj7P2ED7rUm5jbnDWwlCuFVTpQboMfbSya5WrmubNBAMlk7KXvywpo8rd8WuYZkis1o2H8w==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-module-imports": "^7.14.5",
-				"@babel/helper-plugin-utils": "^7.14.5",
-				"@babel/helper-remap-async-to-generator": "^7.14.5"
+				"@babel/helper-module-imports": "^7.16.0",
+				"@babel/helper-plugin-utils": "^7.16.5",
+				"@babel/helper-remap-async-to-generator": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-block-scoped-functions": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.14.5.tgz",
-			"integrity": "sha512-dtqWqdWZ5NqBX3KzsVCWfQI3A53Ft5pWFCT2eCVUftWZgjc5DpDponbIF1+c+7cSGk2wN0YK7HGL/ezfRbpKBQ==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.5.tgz",
+			"integrity": "sha512-BxmIyKLjUGksJ99+hJyL/HIxLIGnLKtw772zYDER7UuycDZ+Xvzs98ZQw6NGgM2ss4/hlFAaGiZmMNKvValEjw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-block-scoping": {
-			"version": "7.15.3",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.15.3.tgz",
-			"integrity": "sha512-nBAzfZwZb4DkaGtOes1Up1nOAp9TDRRFw4XBzBBSG9QK7KVFmYzgj9o9sbPv7TX5ofL4Auq4wZnxCoPnI/lz2Q==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.5.tgz",
+			"integrity": "sha512-JxjSPNZSiOtmxjX7PBRBeRJTUKTyJ607YUYeT0QJCNdsedOe+/rXITjP08eG8xUpsLfPirgzdCFN+h0w6RI+pQ==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-classes": {
-			"version": "7.14.9",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.14.9.tgz",
-			"integrity": "sha512-NfZpTcxU3foGWbl4wxmZ35mTsYJy8oQocbeIMoDAGGFarAmSQlL+LWMkDx/tj6pNotpbX3rltIA4dprgAPOq5A==",
-			"dev": true,
-			"requires": {
-				"@babel/helper-annotate-as-pure": "^7.14.5",
-				"@babel/helper-function-name": "^7.14.5",
-				"@babel/helper-optimise-call-expression": "^7.14.5",
-				"@babel/helper-plugin-utils": "^7.14.5",
-				"@babel/helper-replace-supers": "^7.14.5",
-				"@babel/helper-split-export-declaration": "^7.14.5",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.5.tgz",
+			"integrity": "sha512-DzJ1vYf/7TaCYy57J3SJ9rV+JEuvmlnvvyvYKFbk5u46oQbBvuB9/0w+YsVsxkOv8zVWKpDmUoj4T5ILHoXevA==",
+			"dev": true,
+			"requires": {
+				"@babel/helper-annotate-as-pure": "^7.16.0",
+				"@babel/helper-environment-visitor": "^7.16.5",
+				"@babel/helper-function-name": "^7.16.0",
+				"@babel/helper-optimise-call-expression": "^7.16.0",
+				"@babel/helper-plugin-utils": "^7.16.5",
+				"@babel/helper-replace-supers": "^7.16.5",
+				"@babel/helper-split-export-declaration": "^7.16.0",
 				"globals": "^11.1.0"
 			}
 		},
 		"@babel/plugin-transform-computed-properties": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.14.5.tgz",
-			"integrity": "sha512-pWM+E4283UxaVzLb8UBXv4EIxMovU4zxT1OPnpHJcmnvyY9QbPPTKZfEj31EUvG3/EQRbYAGaYEUZ4yWOBC2xg==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.5.tgz",
+			"integrity": "sha512-n1+O7xtU5lSLraRzX88CNcpl7vtGdPakKzww74bVwpAIRgz9JVLJJpOLb0uYqcOaXVM0TL6X0RVeIJGD2CnCkg==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-destructuring": {
-			"version": "7.14.7",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.14.7.tgz",
-			"integrity": "sha512-0mDE99nK+kVh3xlc5vKwB6wnP9ecuSj+zQCa/n0voENtP/zymdT4HH6QEb65wjjcbqr1Jb/7z9Qp7TF5FtwYGw==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.5.tgz",
+			"integrity": "sha512-GuRVAsjq+c9YPK6NeTkRLWyQskDC099XkBSVO+6QzbnOnH2d/4mBVXYStaPrZD3dFRfg00I6BFJ9Atsjfs8mlg==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-dotall-regex": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.14.5.tgz",
-			"integrity": "sha512-loGlnBdj02MDsFaHhAIJzh7euK89lBrGIdM9EAtHFo6xKygCUGuuWe07o1oZVk287amtW1n0808sQM99aZt3gw==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.5.tgz",
+			"integrity": "sha512-iQiEMt8Q4/5aRGHpGVK2Zc7a6mx7qEAO7qehgSug3SDImnuMzgmm/wtJALXaz25zUj1PmnNHtShjFgk4PDx4nw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-create-regexp-features-plugin": "^7.14.5",
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-create-regexp-features-plugin": "^7.16.0",
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-duplicate-keys": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.14.5.tgz",
-			"integrity": "sha512-iJjbI53huKbPDAsJ8EmVmvCKeeq21bAze4fu9GBQtSLqfvzj2oRuHVx4ZkDwEhg1htQ+5OBZh/Ab0XDf5iBZ7A==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.5.tgz",
+			"integrity": "sha512-81tijpDg2a6I1Yhj4aWY1l3O1J4Cg/Pd7LfvuaH2VVInAkXtzibz9+zSPdUM1WvuUi128ksstAP0hM5w48vQgg==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-exponentiation-operator": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.14.5.tgz",
-			"integrity": "sha512-jFazJhMBc9D27o9jDnIE5ZErI0R0m7PbKXVq77FFvqFbzvTMuv8jaAwLZ5PviOLSFttqKIW0/wxNSDbjLk0tYA==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.5.tgz",
+			"integrity": "sha512-12rba2HwemQPa7BLIKCzm1pT2/RuQHtSFHdNl41cFiC6oi4tcrp7gjB07pxQvFpcADojQywSjblQth6gJyE6CA==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-builder-binary-assignment-operator-visitor": "^7.14.5",
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.5",
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-for-of": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.14.5.tgz",
-			"integrity": "sha512-CfmqxSUZzBl0rSjpoQSFoR9UEj3HzbGuGNL21/iFTmjb5gFggJp3ph0xR1YBhexmLoKRHzgxuFvty2xdSt6gTA==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.5.tgz",
+			"integrity": "sha512-+DpCAJFPAvViR17PIMi9x2AE34dll5wNlXO43wagAX2YcRGgEVHCNFC4azG85b4YyyFarvkc/iD5NPrz4Oneqw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-function-name": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.14.5.tgz",
-			"integrity": "sha512-vbO6kv0fIzZ1GpmGQuvbwwm+O4Cbm2NrPzwlup9+/3fdkuzo1YqOZcXw26+YUJB84Ja7j9yURWposEHLYwxUfQ==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.5.tgz",
+			"integrity": "sha512-Fuec/KPSpVLbGo6z1RPw4EE1X+z9gZk1uQmnYy7v4xr4TO9p41v1AoUuXEtyqAI7H+xNJYSICzRqZBhDEkd3kQ==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-function-name": "^7.14.5",
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-function-name": "^7.16.0",
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-literals": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.14.5.tgz",
-			"integrity": "sha512-ql33+epql2F49bi8aHXxvLURHkxJbSmMKl9J5yHqg4PLtdE6Uc48CH1GS6TQvZ86eoB/ApZXwm7jlA+B3kra7A==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.5.tgz",
+			"integrity": "sha512-B1j9C/IfvshnPcklsc93AVLTrNVa69iSqztylZH6qnmiAsDDOmmjEYqOm3Ts2lGSgTSywnBNiqC949VdD0/gfw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-member-expression-literals": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.14.5.tgz",
-			"integrity": "sha512-WkNXxH1VXVTKarWFqmso83xl+2V3Eo28YY5utIkbsmXoItO8Q3aZxN4BTS2k0hz9dGUloHK26mJMyQEYfkn/+Q==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.5.tgz",
+			"integrity": "sha512-d57i3vPHWgIde/9Y8W/xSFUndhvhZN5Wu2TjRrN1MVz5KzdUihKnfDVlfP1U7mS5DNj/WHHhaE4/tTi4hIyHwQ==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-modules-amd": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz",
-			"integrity": "sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.5.tgz",
+			"integrity": "sha512-oHI15S/hdJuSCfnwIz+4lm6wu/wBn7oJ8+QrkzPPwSFGXk8kgdI/AIKcbR/XnD1nQVMg/i6eNaXpszbGuwYDRQ==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-module-transforms": "^7.14.5",
-				"@babel/helper-plugin-utils": "^7.14.5",
+				"@babel/helper-module-transforms": "^7.16.5",
+				"@babel/helper-plugin-utils": "^7.16.5",
 				"babel-plugin-dynamic-import-node": "^2.3.3"
 			}
 		},
 		"@babel/plugin-transform-modules-commonjs": {
-			"version": "7.15.0",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.15.0.tgz",
-			"integrity": "sha512-3H/R9s8cXcOGE8kgMlmjYYC9nqr5ELiPkJn4q0mypBrjhYQoc+5/Maq69vV4xRPWnkzZuwJPf5rArxpB/35Cig==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.5.tgz",
+			"integrity": "sha512-ABhUkxvoQyqhCWyb8xXtfwqNMJD7tx+irIRnUh6lmyFud7Jln1WzONXKlax1fg/ey178EXbs4bSGNd6PngO+SQ==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-module-transforms": "^7.15.0",
-				"@babel/helper-plugin-utils": "^7.14.5",
-				"@babel/helper-simple-access": "^7.14.8",
+				"@babel/helper-module-transforms": "^7.16.5",
+				"@babel/helper-plugin-utils": "^7.16.5",
+				"@babel/helper-simple-access": "^7.16.0",
 				"babel-plugin-dynamic-import-node": "^2.3.3"
 			}
 		},
 		"@babel/plugin-transform-modules-systemjs": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.14.5.tgz",
-			"integrity": "sha512-mNMQdvBEE5DcMQaL5LbzXFMANrQjd2W7FPzg34Y4yEz7dBgdaC+9B84dSO+/1Wba98zoDbInctCDo4JGxz1VYA==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.5.tgz",
+			"integrity": "sha512-53gmLdScNN28XpjEVIm7LbWnD/b/TpbwKbLk6KV4KqC9WyU6rq1jnNmVG6UgAdQZVVGZVoik3DqHNxk4/EvrjA==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-hoist-variables": "^7.14.5",
-				"@babel/helper-module-transforms": "^7.14.5",
-				"@babel/helper-plugin-utils": "^7.14.5",
-				"@babel/helper-validator-identifier": "^7.14.5",
+				"@babel/helper-hoist-variables": "^7.16.0",
+				"@babel/helper-module-transforms": "^7.16.5",
+				"@babel/helper-plugin-utils": "^7.16.5",
+				"@babel/helper-validator-identifier": "^7.15.7",
 				"babel-plugin-dynamic-import-node": "^2.3.3"
 			}
 		},
 		"@babel/plugin-transform-modules-umd": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.5.tgz",
-			"integrity": "sha512-RfPGoagSngC06LsGUYyM9QWSXZ8MysEjDJTAea1lqRjNECE3y0qIJF/qbvJxc4oA4s99HumIMdXOrd+TdKaAAA==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.5.tgz",
+			"integrity": "sha512-qTFnpxHMoenNHkS3VoWRdwrcJ3FhX567GvDA3hRZKF0Dj8Fmg0UzySZp3AP2mShl/bzcywb/UWAMQIjA1bhXvw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-module-transforms": "^7.14.5",
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-module-transforms": "^7.16.5",
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-named-capturing-groups-regex": {
-			"version": "7.14.9",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.14.9.tgz",
-			"integrity": "sha512-l666wCVYO75mlAtGFfyFwnWmIXQm3kSH0C3IRnJqWcZbWkoihyAdDhFm2ZWaxWTqvBvhVFfJjMRQ0ez4oN1yYA==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.5.tgz",
+			"integrity": "sha512-/wqGDgvFUeKELW6ex6QB7dLVRkd5ehjw34tpXu1nhKC0sFfmaLabIswnpf8JgDyV2NeDmZiwoOb0rAmxciNfjA==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-create-regexp-features-plugin": "^7.14.5"
+				"@babel/helper-create-regexp-features-plugin": "^7.16.0"
 			}
 		},
 		"@babel/plugin-transform-new-target": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.14.5.tgz",
-			"integrity": "sha512-Nx054zovz6IIRWEB49RDRuXGI4Gy0GMgqG0cII9L3MxqgXz/+rgII+RU58qpo4g7tNEx1jG7rRVH4ihZoP4esQ==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.5.tgz",
+			"integrity": "sha512-ZaIrnXF08ZC8jnKR4/5g7YakGVL6go6V9ql6Jl3ecO8PQaQqFE74CuM384kezju7Z9nGCCA20BqZaR1tJ/WvHg==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-object-super": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.14.5.tgz",
-			"integrity": "sha512-MKfOBWzK0pZIrav9z/hkRqIk/2bTv9qvxHzPQc12RcVkMOzpIKnFCNYJip00ssKWYkd8Sf5g0Wr7pqJ+cmtuFg==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.5.tgz",
+			"integrity": "sha512-tded+yZEXuxt9Jdtkc1RraW1zMF/GalVxaVVxh41IYwirdRgyAxxxCKZ9XB7LxZqmsjfjALxupNE1MIz9KH+Zg==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5",
-				"@babel/helper-replace-supers": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5",
+				"@babel/helper-replace-supers": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-parameters": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.14.5.tgz",
-			"integrity": "sha512-Tl7LWdr6HUxTmzQtzuU14SqbgrSKmaR77M0OKyq4njZLQTPfOvzblNKyNkGwOfEFCEx7KeYHQHDI0P3F02IVkA==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.5.tgz",
+			"integrity": "sha512-B3O6AL5oPop1jAVg8CV+haeUte9oFuY85zu0jwnRNZZi3tVAbJriu5tag/oaO2kGaQM/7q7aGPBlTI5/sr9enA==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-property-literals": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.14.5.tgz",
-			"integrity": "sha512-r1uilDthkgXW8Z1vJz2dKYLV1tuw2xsbrp3MrZmD99Wh9vsfKoob+JTgri5VUb/JqyKRXotlOtwgu4stIYCmnw==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.5.tgz",
+			"integrity": "sha512-+IRcVW71VdF9pEH/2R/Apab4a19LVvdVsr/gEeotH00vSDVlKD+XgfSIw+cgGWsjDB/ziqGv/pGoQZBIiQVXHg==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-react-constant-elements": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.14.5.tgz",
-			"integrity": "sha512-NBqLEx1GxllIOXJInJAQbrnwwYJsV3WaMHIcOwD8rhYS0AabTWn7kHdHgPgu5RmHLU0q4DMxhAMu8ue/KampgQ==",
+			"version": "7.16.7",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.16.7.tgz",
+			"integrity": "sha512-lF+cfsyTgwWkcw715J88JhMYJ5GpysYNLhLP1PkvkhTRN7B3e74R/1KsDxFxhRpSn0UUD3IWM4GvdBR2PEbbQQ==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.7"
+			},
+			"dependencies": {
+				"@babel/helper-plugin-utils": {
+					"version": "7.16.7",
+					"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
+					"integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
+					"dev": true
+				}
 			}
 		},
 		"@babel/plugin-transform-react-display-name": {
-			"version": "7.15.1",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.15.1.tgz",
-			"integrity": "sha512-yQZ/i/pUCJAHI/LbtZr413S3VT26qNrEm0M5RRxQJA947/YNYwbZbBaXGDrq6CG5QsZycI1VIP6d7pQaBfP+8Q==",
+			"version": "7.16.7",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz",
+			"integrity": "sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.7"
+			},
+			"dependencies": {
+				"@babel/helper-plugin-utils": {
+					"version": "7.16.7",
+					"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
+					"integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
+					"dev": true
+				}
 			}
 		},
 		"@babel/plugin-transform-react-jsx": {
-			"version": "7.14.9",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.14.9.tgz",
-			"integrity": "sha512-30PeETvS+AeD1f58i1OVyoDlVYQhap/K20ZrMjLmmzmC2AYR/G43D4sdJAaDAqCD3MYpSWbmrz3kES158QSLjw==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.5.tgz",
+			"integrity": "sha512-+arLIz1d7kmwX0fKxTxbnoeG85ONSnLpvdODa4P3pc1sS7CV1hfmtYWufkW/oYsPnkDrEeQFxhUWcFnrXW7jQQ==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-annotate-as-pure": "^7.14.5",
-				"@babel/helper-module-imports": "^7.14.5",
-				"@babel/helper-plugin-utils": "^7.14.5",
-				"@babel/plugin-syntax-jsx": "^7.14.5",
-				"@babel/types": "^7.14.9"
+				"@babel/helper-annotate-as-pure": "^7.16.0",
+				"@babel/helper-module-imports": "^7.16.0",
+				"@babel/helper-plugin-utils": "^7.16.5",
+				"@babel/plugin-syntax-jsx": "^7.16.5",
+				"@babel/types": "^7.16.0"
 			}
 		},
 		"@babel/plugin-transform-react-jsx-development": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.14.5.tgz",
-			"integrity": "sha512-rdwG/9jC6QybWxVe2UVOa7q6cnTpw8JRRHOxntG/h6g/guAOe6AhtQHJuJh5FwmnXIT1bdm5vC2/5huV8ZOorQ==",
+			"version": "7.16.7",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz",
+			"integrity": "sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A==",
 			"dev": true,
 			"requires": {
-				"@babel/plugin-transform-react-jsx": "^7.14.5"
+				"@babel/plugin-transform-react-jsx": "^7.16.7"
+			},
+			"dependencies": {
+				"@babel/helper-annotate-as-pure": {
+					"version": "7.16.7",
+					"resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
+					"integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
+					"dev": true,
+					"requires": {
+						"@babel/types": "^7.16.7"
+					}
+				},
+				"@babel/helper-module-imports": {
+					"version": "7.16.7",
+					"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
+					"integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
+					"dev": true,
+					"requires": {
+						"@babel/types": "^7.16.7"
+					}
+				},
+				"@babel/helper-plugin-utils": {
+					"version": "7.16.7",
+					"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
+					"integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
+					"dev": true
+				},
+				"@babel/helper-validator-identifier": {
+					"version": "7.16.7",
+					"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
+					"integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
+					"dev": true
+				},
+				"@babel/plugin-syntax-jsx": {
+					"version": "7.16.7",
+					"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz",
+					"integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==",
+					"dev": true,
+					"requires": {
+						"@babel/helper-plugin-utils": "^7.16.7"
+					}
+				},
+				"@babel/plugin-transform-react-jsx": {
+					"version": "7.16.7",
+					"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz",
+					"integrity": "sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==",
+					"dev": true,
+					"requires": {
+						"@babel/helper-annotate-as-pure": "^7.16.7",
+						"@babel/helper-module-imports": "^7.16.7",
+						"@babel/helper-plugin-utils": "^7.16.7",
+						"@babel/plugin-syntax-jsx": "^7.16.7",
+						"@babel/types": "^7.16.7"
+					}
+				},
+				"@babel/types": {
+					"version": "7.16.8",
+					"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz",
+					"integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==",
+					"dev": true,
+					"requires": {
+						"@babel/helper-validator-identifier": "^7.16.7",
+						"to-fast-properties": "^2.0.0"
+					}
+				}
 			}
 		},
 		"@babel/plugin-transform-react-pure-annotations": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.14.5.tgz",
-			"integrity": "sha512-3X4HpBJimNxW4rhUy/SONPyNQHp5YRr0HhJdT2OH1BRp0of7u3Dkirc7x9FRJMKMqTBI079VZ1hzv7Ouuz///g==",
+			"version": "7.16.7",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz",
+			"integrity": "sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-annotate-as-pure": "^7.14.5",
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-annotate-as-pure": "^7.16.7",
+				"@babel/helper-plugin-utils": "^7.16.7"
+			},
+			"dependencies": {
+				"@babel/helper-annotate-as-pure": {
+					"version": "7.16.7",
+					"resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
+					"integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
+					"dev": true,
+					"requires": {
+						"@babel/types": "^7.16.7"
+					}
+				},
+				"@babel/helper-plugin-utils": {
+					"version": "7.16.7",
+					"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
+					"integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
+					"dev": true
+				},
+				"@babel/helper-validator-identifier": {
+					"version": "7.16.7",
+					"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
+					"integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
+					"dev": true
+				},
+				"@babel/types": {
+					"version": "7.16.8",
+					"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz",
+					"integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==",
+					"dev": true,
+					"requires": {
+						"@babel/helper-validator-identifier": "^7.16.7",
+						"to-fast-properties": "^2.0.0"
+					}
+				}
 			}
 		},
 		"@babel/plugin-transform-regenerator": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.14.5.tgz",
-			"integrity": "sha512-NVIY1W3ITDP5xQl50NgTKlZ0GrotKtLna08/uGY6ErQt6VEQZXla86x/CTddm5gZdcr+5GSsvMeTmWA5Ii6pkg==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.5.tgz",
+			"integrity": "sha512-2z+it2eVWU8TtQQRauvGUqZwLy4+7rTfo6wO4npr+fvvN1SW30ZF3O/ZRCNmTuu4F5MIP8OJhXAhRV5QMJOuYg==",
 			"dev": true,
 			"requires": {
 				"regenerator-transform": "^0.14.2"
 			}
 		},
 		"@babel/plugin-transform-reserved-words": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.14.5.tgz",
-			"integrity": "sha512-cv4F2rv1nD4qdexOGsRQXJrOcyb5CrgjUH9PKrrtyhSDBNWGxd0UIitjyJiWagS+EbUGjG++22mGH1Pub8D6Vg==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.5.tgz",
+			"integrity": "sha512-aIB16u8lNcf7drkhXJRoggOxSTUAuihTSTfAcpynowGJOZiGf+Yvi7RuTwFzVYSYPmWyARsPqUGoZWWWxLiknw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-runtime": {
-			"version": "7.15.0",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.15.0.tgz",
-			"integrity": "sha512-sfHYkLGjhzWTq6xsuQ01oEsUYjkHRux9fW1iUA68dC7Qd8BS1Unq4aZ8itmQp95zUzIcyR2EbNMTzAicFj+guw==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.5.tgz",
+			"integrity": "sha512-gxpfS8XQWDbQ8oP5NcmpXxtEgCJkbO+W9VhZlOhr0xPyVaRjAQPOv7ZDj9fg0d5s9+NiVvMCE6gbkEkcsxwGRw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-module-imports": "^7.14.5",
-				"@babel/helper-plugin-utils": "^7.14.5",
-				"babel-plugin-polyfill-corejs2": "^0.2.2",
-				"babel-plugin-polyfill-corejs3": "^0.2.2",
-				"babel-plugin-polyfill-regenerator": "^0.2.2",
+				"@babel/helper-module-imports": "^7.16.0",
+				"@babel/helper-plugin-utils": "^7.16.5",
+				"babel-plugin-polyfill-corejs2": "^0.3.0",
+				"babel-plugin-polyfill-corejs3": "^0.4.0",
+				"babel-plugin-polyfill-regenerator": "^0.3.0",
 				"semver": "^6.3.0"
 			},
 			"dependencies": {
@@ -1011,107 +1203,108 @@
 			}
 		},
 		"@babel/plugin-transform-shorthand-properties": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.14.5.tgz",
-			"integrity": "sha512-xLucks6T1VmGsTB+GWK5Pl9Jl5+nRXD1uoFdA5TSO6xtiNjtXTjKkmPdFXVLGlK5A2/or/wQMKfmQ2Y0XJfn5g==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.5.tgz",
+			"integrity": "sha512-ZbuWVcY+MAXJuuW7qDoCwoxDUNClfZxoo7/4swVbOW1s/qYLOMHlm9YRWMsxMFuLs44eXsv4op1vAaBaBaDMVg==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-spread": {
-			"version": "7.14.6",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.14.6.tgz",
-			"integrity": "sha512-Zr0x0YroFJku7n7+/HH3A2eIrGMjbmAIbJSVv0IZ+t3U2WUQUA64S/oeied2e+MaGSjmt4alzBCsK9E8gh+fag==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.5.tgz",
+			"integrity": "sha512-5d6l/cnG7Lw4tGHEoga4xSkYp1euP7LAtrah1h1PgJ3JY7yNsjybsxQAnVK4JbtReZ/8z6ASVmd3QhYYKLaKZw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5",
-				"@babel/helper-skip-transparent-expression-wrappers": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5",
+				"@babel/helper-skip-transparent-expression-wrappers": "^7.16.0"
 			}
 		},
 		"@babel/plugin-transform-sticky-regex": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.14.5.tgz",
-			"integrity": "sha512-Z7F7GyvEMzIIbwnziAZmnSNpdijdr4dWt+FJNBnBLz5mwDFkqIXU9wmBcWWad3QeJF5hMTkRe4dAq2sUZiG+8A==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.5.tgz",
+			"integrity": "sha512-usYsuO1ID2LXxzuUxifgWtJemP7wL2uZtyrTVM4PKqsmJycdS4U4mGovL5xXkfUheds10Dd2PjoQLXw6zCsCbg==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-template-literals": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.14.5.tgz",
-			"integrity": "sha512-22btZeURqiepOfuy/VkFr+zStqlujWaarpMErvay7goJS6BWwdd6BY9zQyDLDa4x2S3VugxFb162IZ4m/S/+Gg==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.5.tgz",
+			"integrity": "sha512-gnyKy9RyFhkovex4BjKWL3BVYzUDG6zC0gba7VMLbQoDuqMfJ1SDXs8k/XK41Mmt1Hyp4qNAvGFb9hKzdCqBRQ==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-typeof-symbol": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.14.5.tgz",
-			"integrity": "sha512-lXzLD30ffCWseTbMQzrvDWqljvZlHkXU+CnseMhkMNqU1sASnCsz3tSzAaH3vCUXb9PHeUb90ZT1BdFTm1xxJw==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.5.tgz",
+			"integrity": "sha512-ldxCkW180qbrvyCVDzAUZqB0TAeF8W/vGJoRcaf75awm6By+PxfJKvuqVAnq8N9wz5Xa6mSpM19OfVKKVmGHSQ==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-typescript": {
-			"version": "7.15.0",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.0.tgz",
-			"integrity": "sha512-WIIEazmngMEEHDaPTx0IZY48SaAmjVWe3TRSX7cmJXn0bEv9midFzAjxiruOWYIVf5iQ10vFx7ASDpgEO08L5w==",
+			"version": "7.16.1",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.1.tgz",
+			"integrity": "sha512-NO4XoryBng06jjw/qWEU2LhcLJr1tWkhpMam/H4eas/CDKMX/b2/Ylb6EI256Y7+FVPCawwSM1rrJNOpDiz+Lg==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-create-class-features-plugin": "^7.15.0",
+				"@babel/helper-create-class-features-plugin": "^7.16.0",
 				"@babel/helper-plugin-utils": "^7.14.5",
-				"@babel/plugin-syntax-typescript": "^7.14.5"
+				"@babel/plugin-syntax-typescript": "^7.16.0"
 			}
 		},
 		"@babel/plugin-transform-unicode-escapes": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz",
-			"integrity": "sha512-crTo4jATEOjxj7bt9lbYXcBAM3LZaUrbP2uUdxb6WIorLmjNKSpHfIybgY4B8SRpbf8tEVIWH3Vtm7ayCrKocA==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.5.tgz",
+			"integrity": "sha512-shiCBHTIIChGLdyojsKQjoAyB8MBwat25lKM7MJjbe1hE0bgIppD+LX9afr41lLHOhqceqeWl4FkLp+Bgn9o1Q==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/plugin-transform-unicode-regex": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.14.5.tgz",
-			"integrity": "sha512-UygduJpC5kHeCiRw/xDVzC+wj8VaYSoKl5JNVmbP7MadpNinAm3SvZCxZ42H37KZBKztz46YC73i9yV34d0Tzw==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.5.tgz",
+			"integrity": "sha512-GTJ4IW012tiPEMMubd7sD07iU9O/LOo8Q/oU4xNhcaq0Xn8+6TcUQaHtC8YxySo1T+ErQ8RaWogIEeFhKGNPzw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-create-regexp-features-plugin": "^7.14.5",
-				"@babel/helper-plugin-utils": "^7.14.5"
+				"@babel/helper-create-regexp-features-plugin": "^7.16.0",
+				"@babel/helper-plugin-utils": "^7.16.5"
 			}
 		},
 		"@babel/preset-env": {
-			"version": "7.15.0",
-			"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.15.0.tgz",
-			"integrity": "sha512-FhEpCNFCcWW3iZLg0L2NPE9UerdtsCR6ZcsGHUX6Om6kbCQeL5QZDqFDmeNHC6/fy6UH3jEge7K4qG5uC9In0Q==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.5.tgz",
+			"integrity": "sha512-MiJJW5pwsktG61NDxpZ4oJ1CKxM1ncam9bzRtx9g40/WkLRkxFP6mhpkYV0/DxcciqoiHicx291+eUQrXb/SfQ==",
 			"dev": true,
 			"requires": {
-				"@babel/compat-data": "^7.15.0",
-				"@babel/helper-compilation-targets": "^7.15.0",
-				"@babel/helper-plugin-utils": "^7.14.5",
+				"@babel/compat-data": "^7.16.4",
+				"@babel/helper-compilation-targets": "^7.16.3",
+				"@babel/helper-plugin-utils": "^7.16.5",
 				"@babel/helper-validator-option": "^7.14.5",
-				"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.14.5",
-				"@babel/plugin-proposal-async-generator-functions": "^7.14.9",
-				"@babel/plugin-proposal-class-properties": "^7.14.5",
-				"@babel/plugin-proposal-class-static-block": "^7.14.5",
-				"@babel/plugin-proposal-dynamic-import": "^7.14.5",
-				"@babel/plugin-proposal-export-namespace-from": "^7.14.5",
-				"@babel/plugin-proposal-json-strings": "^7.14.5",
-				"@babel/plugin-proposal-logical-assignment-operators": "^7.14.5",
-				"@babel/plugin-proposal-nullish-coalescing-operator": "^7.14.5",
-				"@babel/plugin-proposal-numeric-separator": "^7.14.5",
-				"@babel/plugin-proposal-object-rest-spread": "^7.14.7",
-				"@babel/plugin-proposal-optional-catch-binding": "^7.14.5",
-				"@babel/plugin-proposal-optional-chaining": "^7.14.5",
-				"@babel/plugin-proposal-private-methods": "^7.14.5",
-				"@babel/plugin-proposal-private-property-in-object": "^7.14.5",
-				"@babel/plugin-proposal-unicode-property-regex": "^7.14.5",
+				"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2",
+				"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0",
+				"@babel/plugin-proposal-async-generator-functions": "^7.16.5",
+				"@babel/plugin-proposal-class-properties": "^7.16.5",
+				"@babel/plugin-proposal-class-static-block": "^7.16.5",
+				"@babel/plugin-proposal-dynamic-import": "^7.16.5",
+				"@babel/plugin-proposal-export-namespace-from": "^7.16.5",
+				"@babel/plugin-proposal-json-strings": "^7.16.5",
+				"@babel/plugin-proposal-logical-assignment-operators": "^7.16.5",
+				"@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.5",
+				"@babel/plugin-proposal-numeric-separator": "^7.16.5",
+				"@babel/plugin-proposal-object-rest-spread": "^7.16.5",
+				"@babel/plugin-proposal-optional-catch-binding": "^7.16.5",
+				"@babel/plugin-proposal-optional-chaining": "^7.16.5",
+				"@babel/plugin-proposal-private-methods": "^7.16.5",
+				"@babel/plugin-proposal-private-property-in-object": "^7.16.5",
+				"@babel/plugin-proposal-unicode-property-regex": "^7.16.5",
 				"@babel/plugin-syntax-async-generators": "^7.8.4",
 				"@babel/plugin-syntax-class-properties": "^7.12.13",
 				"@babel/plugin-syntax-class-static-block": "^7.14.5",
@@ -1126,44 +1319,44 @@
 				"@babel/plugin-syntax-optional-chaining": "^7.8.3",
 				"@babel/plugin-syntax-private-property-in-object": "^7.14.5",
 				"@babel/plugin-syntax-top-level-await": "^7.14.5",
-				"@babel/plugin-transform-arrow-functions": "^7.14.5",
-				"@babel/plugin-transform-async-to-generator": "^7.14.5",
-				"@babel/plugin-transform-block-scoped-functions": "^7.14.5",
-				"@babel/plugin-transform-block-scoping": "^7.14.5",
-				"@babel/plugin-transform-classes": "^7.14.9",
-				"@babel/plugin-transform-computed-properties": "^7.14.5",
-				"@babel/plugin-transform-destructuring": "^7.14.7",
-				"@babel/plugin-transform-dotall-regex": "^7.14.5",
-				"@babel/plugin-transform-duplicate-keys": "^7.14.5",
-				"@babel/plugin-transform-exponentiation-operator": "^7.14.5",
-				"@babel/plugin-transform-for-of": "^7.14.5",
-				"@babel/plugin-transform-function-name": "^7.14.5",
-				"@babel/plugin-transform-literals": "^7.14.5",
-				"@babel/plugin-transform-member-expression-literals": "^7.14.5",
-				"@babel/plugin-transform-modules-amd": "^7.14.5",
-				"@babel/plugin-transform-modules-commonjs": "^7.15.0",
-				"@babel/plugin-transform-modules-systemjs": "^7.14.5",
-				"@babel/plugin-transform-modules-umd": "^7.14.5",
-				"@babel/plugin-transform-named-capturing-groups-regex": "^7.14.9",
-				"@babel/plugin-transform-new-target": "^7.14.5",
-				"@babel/plugin-transform-object-super": "^7.14.5",
-				"@babel/plugin-transform-parameters": "^7.14.5",
-				"@babel/plugin-transform-property-literals": "^7.14.5",
-				"@babel/plugin-transform-regenerator": "^7.14.5",
-				"@babel/plugin-transform-reserved-words": "^7.14.5",
-				"@babel/plugin-transform-shorthand-properties": "^7.14.5",
-				"@babel/plugin-transform-spread": "^7.14.6",
-				"@babel/plugin-transform-sticky-regex": "^7.14.5",
-				"@babel/plugin-transform-template-literals": "^7.14.5",
-				"@babel/plugin-transform-typeof-symbol": "^7.14.5",
-				"@babel/plugin-transform-unicode-escapes": "^7.14.5",
-				"@babel/plugin-transform-unicode-regex": "^7.14.5",
-				"@babel/preset-modules": "^0.1.4",
-				"@babel/types": "^7.15.0",
-				"babel-plugin-polyfill-corejs2": "^0.2.2",
-				"babel-plugin-polyfill-corejs3": "^0.2.2",
-				"babel-plugin-polyfill-regenerator": "^0.2.2",
-				"core-js-compat": "^3.16.0",
+				"@babel/plugin-transform-arrow-functions": "^7.16.5",
+				"@babel/plugin-transform-async-to-generator": "^7.16.5",
+				"@babel/plugin-transform-block-scoped-functions": "^7.16.5",
+				"@babel/plugin-transform-block-scoping": "^7.16.5",
+				"@babel/plugin-transform-classes": "^7.16.5",
+				"@babel/plugin-transform-computed-properties": "^7.16.5",
+				"@babel/plugin-transform-destructuring": "^7.16.5",
+				"@babel/plugin-transform-dotall-regex": "^7.16.5",
+				"@babel/plugin-transform-duplicate-keys": "^7.16.5",
+				"@babel/plugin-transform-exponentiation-operator": "^7.16.5",
+				"@babel/plugin-transform-for-of": "^7.16.5",
+				"@babel/plugin-transform-function-name": "^7.16.5",
+				"@babel/plugin-transform-literals": "^7.16.5",
+				"@babel/plugin-transform-member-expression-literals": "^7.16.5",
+				"@babel/plugin-transform-modules-amd": "^7.16.5",
+				"@babel/plugin-transform-modules-commonjs": "^7.16.5",
+				"@babel/plugin-transform-modules-systemjs": "^7.16.5",
+				"@babel/plugin-transform-modules-umd": "^7.16.5",
+				"@babel/plugin-transform-named-capturing-groups-regex": "^7.16.5",
+				"@babel/plugin-transform-new-target": "^7.16.5",
+				"@babel/plugin-transform-object-super": "^7.16.5",
+				"@babel/plugin-transform-parameters": "^7.16.5",
+				"@babel/plugin-transform-property-literals": "^7.16.5",
+				"@babel/plugin-transform-regenerator": "^7.16.5",
+				"@babel/plugin-transform-reserved-words": "^7.16.5",
+				"@babel/plugin-transform-shorthand-properties": "^7.16.5",
+				"@babel/plugin-transform-spread": "^7.16.5",
+				"@babel/plugin-transform-sticky-regex": "^7.16.5",
+				"@babel/plugin-transform-template-literals": "^7.16.5",
+				"@babel/plugin-transform-typeof-symbol": "^7.16.5",
+				"@babel/plugin-transform-unicode-escapes": "^7.16.5",
+				"@babel/plugin-transform-unicode-regex": "^7.16.5",
+				"@babel/preset-modules": "^0.1.5",
+				"@babel/types": "^7.16.0",
+				"babel-plugin-polyfill-corejs2": "^0.3.0",
+				"babel-plugin-polyfill-corejs3": "^0.4.0",
+				"babel-plugin-polyfill-regenerator": "^0.3.0",
+				"core-js-compat": "^3.19.1",
 				"semver": "^6.3.0"
 			},
 			"dependencies": {
@@ -1176,9 +1369,9 @@
 			}
 		},
 		"@babel/preset-modules": {
-			"version": "0.1.4",
-			"resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz",
-			"integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==",
+			"version": "0.1.5",
+			"resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz",
+			"integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==",
 			"dev": true,
 			"requires": {
 				"@babel/helper-plugin-utils": "^7.0.0",
@@ -1189,98 +1382,169 @@
 			}
 		},
 		"@babel/preset-react": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.14.5.tgz",
-			"integrity": "sha512-XFxBkjyObLvBaAvkx1Ie95Iaq4S/GUEIrejyrntQ/VCMKUYvKLoyKxOBzJ2kjA3b6rC9/KL6KXfDC2GqvLiNqQ==",
+			"version": "7.16.7",
+			"resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.16.7.tgz",
+			"integrity": "sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5",
-				"@babel/helper-validator-option": "^7.14.5",
-				"@babel/plugin-transform-react-display-name": "^7.14.5",
-				"@babel/plugin-transform-react-jsx": "^7.14.5",
-				"@babel/plugin-transform-react-jsx-development": "^7.14.5",
-				"@babel/plugin-transform-react-pure-annotations": "^7.14.5"
+				"@babel/helper-plugin-utils": "^7.16.7",
+				"@babel/helper-validator-option": "^7.16.7",
+				"@babel/plugin-transform-react-display-name": "^7.16.7",
+				"@babel/plugin-transform-react-jsx": "^7.16.7",
+				"@babel/plugin-transform-react-jsx-development": "^7.16.7",
+				"@babel/plugin-transform-react-pure-annotations": "^7.16.7"
+			},
+			"dependencies": {
+				"@babel/helper-annotate-as-pure": {
+					"version": "7.16.7",
+					"resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz",
+					"integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==",
+					"dev": true,
+					"requires": {
+						"@babel/types": "^7.16.7"
+					}
+				},
+				"@babel/helper-module-imports": {
+					"version": "7.16.7",
+					"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz",
+					"integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==",
+					"dev": true,
+					"requires": {
+						"@babel/types": "^7.16.7"
+					}
+				},
+				"@babel/helper-plugin-utils": {
+					"version": "7.16.7",
+					"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz",
+					"integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==",
+					"dev": true
+				},
+				"@babel/helper-validator-identifier": {
+					"version": "7.16.7",
+					"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz",
+					"integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==",
+					"dev": true
+				},
+				"@babel/helper-validator-option": {
+					"version": "7.16.7",
+					"resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz",
+					"integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==",
+					"dev": true
+				},
+				"@babel/plugin-syntax-jsx": {
+					"version": "7.16.7",
+					"resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz",
+					"integrity": "sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q==",
+					"dev": true,
+					"requires": {
+						"@babel/helper-plugin-utils": "^7.16.7"
+					}
+				},
+				"@babel/plugin-transform-react-jsx": {
+					"version": "7.16.7",
+					"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz",
+					"integrity": "sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag==",
+					"dev": true,
+					"requires": {
+						"@babel/helper-annotate-as-pure": "^7.16.7",
+						"@babel/helper-module-imports": "^7.16.7",
+						"@babel/helper-plugin-utils": "^7.16.7",
+						"@babel/plugin-syntax-jsx": "^7.16.7",
+						"@babel/types": "^7.16.7"
+					}
+				},
+				"@babel/types": {
+					"version": "7.16.8",
+					"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz",
+					"integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==",
+					"dev": true,
+					"requires": {
+						"@babel/helper-validator-identifier": "^7.16.7",
+						"to-fast-properties": "^2.0.0"
+					}
+				}
 			}
 		},
 		"@babel/preset-typescript": {
-			"version": "7.15.0",
-			"resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz",
-			"integrity": "sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.16.5.tgz",
+			"integrity": "sha512-lmAWRoJ9iOSvs3DqOndQpj8XqXkzaiQs50VG/zESiI9D3eoZhGriU675xNCr0UwvsuXrhMAGvyk1w+EVWF3u8Q==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-plugin-utils": "^7.14.5",
+				"@babel/helper-plugin-utils": "^7.16.5",
 				"@babel/helper-validator-option": "^7.14.5",
-				"@babel/plugin-transform-typescript": "^7.15.0"
+				"@babel/plugin-transform-typescript": "^7.16.1"
 			}
 		},
 		"@babel/runtime": {
-			"version": "7.14.6",
-			"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.6.tgz",
-			"integrity": "sha512-/PCB2uJ7oM44tz8YhC4Z/6PeOKXp4K588f+5M3clr1M4zbqztlo0XEfJ2LEzj/FgwfgGcIdl8n7YYjTCI0BYwg==",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.5.tgz",
+			"integrity": "sha512-TXWihFIS3Pyv5hzR7j6ihmeLkZfrXGxAr5UfSl8CHf+6q/wpiYDkUau0czckpYG8QmnCIuPpdLtuA9VmuGGyMA==",
 			"requires": {
 				"regenerator-runtime": "^0.13.4"
 			}
 		},
 		"@babel/runtime-corejs3": {
-			"version": "7.15.3",
-			"resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.15.3.tgz",
-			"integrity": "sha512-30A3lP+sRL6ml8uhoJSs+8jwpKzbw8CqBvDc1laeptxPm5FahumJxirigcbD2qTs71Sonvj1cyZB0OKGAmxQ+A==",
+			"version": "7.16.8",
+			"resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.8.tgz",
+			"integrity": "sha512-3fKhuICS1lMz0plI5ktOE/yEtBRMVxplzRkdn6mJQ197XiY0JnrzYV0+Mxozq3JZ8SBV9Ecurmw1XsGbwOf+Sg==",
 			"dev": true,
 			"requires": {
-				"core-js-pure": "^3.16.0",
+				"core-js-pure": "^3.20.2",
 				"regenerator-runtime": "^0.13.4"
 			}
 		},
 		"@babel/template": {
-			"version": "7.14.5",
-			"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.14.5.tgz",
-			"integrity": "sha512-6Z3Po85sfxRGachLULUhOmvAaOo7xCvqGQtxINai2mEGPFm6pQ4z5QInFnUrRpfoSV60BnjyF5F3c+15fxFV1g==",
+			"version": "7.16.0",
+			"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz",
+			"integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==",
 			"dev": true,
 			"requires": {
-				"@babel/code-frame": "^7.14.5",
-				"@babel/parser": "^7.14.5",
-				"@babel/types": "^7.14.5"
+				"@babel/code-frame": "^7.16.0",
+				"@babel/parser": "^7.16.0",
+				"@babel/types": "^7.16.0"
 			},
 			"dependencies": {
 				"@babel/parser": {
-					"version": "7.15.3",
-					"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz",
-					"integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==",
+					"version": "7.16.6",
+					"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz",
+					"integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==",
 					"dev": true
 				}
 			}
 		},
 		"@babel/traverse": {
-			"version": "7.15.0",
-			"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.15.0.tgz",
-			"integrity": "sha512-392d8BN0C9eVxVWd8H6x9WfipgVH5IaIoLp23334Sc1vbKKWINnvwRpb4us0xtPaCumlwbTtIYNA0Dv/32sVFw==",
-			"dev": true,
-			"requires": {
-				"@babel/code-frame": "^7.14.5",
-				"@babel/generator": "^7.15.0",
-				"@babel/helper-function-name": "^7.14.5",
-				"@babel/helper-hoist-variables": "^7.14.5",
-				"@babel/helper-split-export-declaration": "^7.14.5",
-				"@babel/parser": "^7.15.0",
-				"@babel/types": "^7.15.0",
+			"version": "7.16.5",
+			"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.5.tgz",
+			"integrity": "sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ==",
+			"dev": true,
+			"requires": {
+				"@babel/code-frame": "^7.16.0",
+				"@babel/generator": "^7.16.5",
+				"@babel/helper-environment-visitor": "^7.16.5",
+				"@babel/helper-function-name": "^7.16.0",
+				"@babel/helper-hoist-variables": "^7.16.0",
+				"@babel/helper-split-export-declaration": "^7.16.0",
+				"@babel/parser": "^7.16.5",
+				"@babel/types": "^7.16.0",
 				"debug": "^4.1.0",
 				"globals": "^11.1.0"
 			},
 			"dependencies": {
 				"@babel/parser": {
-					"version": "7.15.3",
-					"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz",
-					"integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==",
+					"version": "7.16.6",
+					"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.6.tgz",
+					"integrity": "sha512-Gr86ujcNuPDnNOY8mi383Hvi8IYrJVJYuf3XcuBM/Dgd+bINn/7tHqsj+tKkoreMbmGsFLsltI/JJd8fOFWGDQ==",
 					"dev": true
 				}
 			}
 		},
 		"@babel/types": {
-			"version": "7.15.0",
-			"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz",
-			"integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==",
+			"version": "7.16.0",
+			"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz",
+			"integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==",
 			"requires": {
-				"@babel/helper-validator-identifier": "^7.14.9",
+				"@babel/helper-validator-identifier": "^7.15.7",
 				"to-fast-properties": "^2.0.0"
 			}
 		},
@@ -1309,38 +1573,60 @@
 				"minimist": "^1.2.0"
 			}
 		},
-		"@emotion/cache": {
-			"version": "10.0.29",
-			"resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-10.0.29.tgz",
-			"integrity": "sha512-fU2VtSVlHiF27empSbxi1O2JFdNWZO+2NFHfwO0pxgTep6Xa3uGb+3pVKfLww2l/IBGLNEZl5Xf/++A4wAYDYQ==",
-			"requires": {
-				"@emotion/sheet": "0.9.4",
-				"@emotion/stylis": "0.8.5",
-				"@emotion/utils": "0.11.3",
-				"@emotion/weak-memoize": "0.2.5"
-			}
+		"@discoveryjs/json-ext": {
+			"version": "0.5.6",
+			"resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz",
+			"integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==",
+			"dev": true
 		},
-		"@emotion/core": {
-			"version": "10.1.1",
-			"resolved": "https://registry.npmjs.org/@emotion/core/-/core-10.1.1.tgz",
-			"integrity": "sha512-ZMLG6qpXR8x031NXD8HJqugy/AZSkAuMxxqB46pmAR7ze47MhNJ56cdoX243QPZdGctrdfo+s08yZTiwaUcRKA==",
+		"@emotion/babel-plugin": {
+			"version": "11.7.2",
+			"resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.7.2.tgz",
+			"integrity": "sha512-6mGSCWi9UzXut/ZAN6lGFu33wGR3SJisNl3c0tvlmb8XChH1b2SUvxvnOh7hvLpqyRdHHU9AiazV3Cwbk5SXKQ==",
 			"requires": {
-				"@babel/runtime": "^7.5.5",
-				"@emotion/cache": "^10.0.27",
-				"@emotion/css": "^10.0.27",
-				"@emotion/serialize": "^0.11.15",
-				"@emotion/sheet": "0.9.4",
-				"@emotion/utils": "0.11.3"
+				"@babel/helper-module-imports": "^7.12.13",
+				"@babel/plugin-syntax-jsx": "^7.12.13",
+				"@babel/runtime": "^7.13.10",
+				"@emotion/hash": "^0.8.0",
+				"@emotion/memoize": "^0.7.5",
+				"@emotion/serialize": "^1.0.2",
+				"babel-plugin-macros": "^2.6.1",
+				"convert-source-map": "^1.5.0",
+				"escape-string-regexp": "^4.0.0",
+				"find-root": "^1.1.0",
+				"source-map": "^0.5.7",
+				"stylis": "4.0.13"
+			},
+			"dependencies": {
+				"escape-string-regexp": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+					"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
+				}
+			}
+		},
+		"@emotion/cache": {
+			"version": "11.7.1",
+			"resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.7.1.tgz",
+			"integrity": "sha512-r65Zy4Iljb8oyjtLeCuBH8Qjiy107dOYC6SJq7g7GV5UCQWMObY4SJDPGFjiiVpPrOJ2hmJOoBiYTC7hwx9E2A==",
+			"requires": {
+				"@emotion/memoize": "^0.7.4",
+				"@emotion/sheet": "^1.1.0",
+				"@emotion/utils": "^1.0.0",
+				"@emotion/weak-memoize": "^0.2.5",
+				"stylis": "4.0.13"
 			}
 		},
 		"@emotion/css": {
-			"version": "10.0.27",
-			"resolved": "https://registry.npmjs.org/@emotion/css/-/css-10.0.27.tgz",
-			"integrity": "sha512-6wZjsvYeBhyZQYNrGoR5yPMYbMBNEnanDrqmsqS1mzDm1cOTu12shvl2j4QHNS36UaTE0USIJawCH9C8oW34Zw==",
+			"version": "11.7.1",
+			"resolved": "https://registry.npmjs.org/@emotion/css/-/css-11.7.1.tgz",
+			"integrity": "sha512-RUUgPlMZunlc7SE5A6Hg+VWRzb2cU6O9xlV78KCFgcnl25s7Qz/20oQg71iKudpLqk7xj0vhbJlwcJJMT0BOZg==",
 			"requires": {
-				"@emotion/serialize": "^0.11.15",
-				"@emotion/utils": "0.11.3",
-				"babel-plugin-emotion": "^10.0.27"
+				"@emotion/babel-plugin": "^11.7.1",
+				"@emotion/cache": "^11.7.1",
+				"@emotion/serialize": "^1.0.0",
+				"@emotion/sheet": "^1.0.3",
+				"@emotion/utils": "^1.0.0"
 			}
 		},
 		"@emotion/hash": {
@@ -1349,76 +1635,70 @@
 			"integrity": "sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow=="
 		},
 		"@emotion/is-prop-valid": {
-			"version": "0.8.8",
-			"resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
-			"integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==",
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.1.1.tgz",
+			"integrity": "sha512-bW1Tos67CZkOURLc0OalnfxtSXQJMrAMV0jZTVGJUPSOd4qgjF3+tTD5CwJM13PHA8cltGW1WGbbvV9NpvUZPw==",
 			"requires": {
-				"@emotion/memoize": "0.7.4"
+				"@emotion/memoize": "^0.7.4"
 			}
 		},
 		"@emotion/memoize": {
-			"version": "0.7.4",
-			"resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
-			"integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw=="
+			"version": "0.7.5",
+			"resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.5.tgz",
+			"integrity": "sha512-igX9a37DR2ZPGYtV6suZ6whr8pTFtyHL3K/oLUotxpSVO2ASaprmAe2Dkq7tBo7CRY7MMDrAa9nuQP9/YG8FxQ=="
+		},
+		"@emotion/react": {
+			"version": "11.7.1",
+			"resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.7.1.tgz",
+			"integrity": "sha512-DV2Xe3yhkF1yT4uAUoJcYL1AmrnO5SVsdfvu+fBuS7IbByDeTVx9+wFmvx9Idzv7/78+9Mgx2Hcmr7Fex3tIyw==",
+			"requires": {
+				"@babel/runtime": "^7.13.10",
+				"@emotion/cache": "^11.7.1",
+				"@emotion/serialize": "^1.0.2",
+				"@emotion/sheet": "^1.1.0",
+				"@emotion/utils": "^1.0.0",
+				"@emotion/weak-memoize": "^0.2.5",
+				"hoist-non-react-statics": "^3.3.1"
+			}
 		},
 		"@emotion/serialize": {
-			"version": "0.11.16",
-			"resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-0.11.16.tgz",
-			"integrity": "sha512-G3J4o8by0VRrO+PFeSc3js2myYNOXVJ3Ya+RGVxnshRYgsvErfAOglKAiy1Eo1vhzxqtUvjCyS5gtewzkmvSSg==",
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.0.2.tgz",
+			"integrity": "sha512-95MgNJ9+/ajxU7QIAruiOAdYNjxZX7G2mhgrtDWswA21VviYIRP1R5QilZ/bDY42xiKsaktP4egJb3QdYQZi1A==",
 			"requires": {
-				"@emotion/hash": "0.8.0",
-				"@emotion/memoize": "0.7.4",
-				"@emotion/unitless": "0.7.5",
-				"@emotion/utils": "0.11.3",
-				"csstype": "^2.5.7"
-			},
-			"dependencies": {
-				"csstype": {
-					"version": "2.6.17",
-					"resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.17.tgz",
-					"integrity": "sha512-u1wmTI1jJGzCJzWndZo8mk4wnPTZd1eOIYTYvuEyOQGfmDl3TrabCCfKnOC86FZwW/9djqTl933UF/cS425i9A=="
-				}
+				"@emotion/hash": "^0.8.0",
+				"@emotion/memoize": "^0.7.4",
+				"@emotion/unitless": "^0.7.5",
+				"@emotion/utils": "^1.0.0",
+				"csstype": "^3.0.2"
 			}
 		},
 		"@emotion/sheet": {
-			"version": "0.9.4",
-			"resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-0.9.4.tgz",
-			"integrity": "sha512-zM9PFmgVSqBw4zL101Q0HrBVTGmpAxFZH/pYx/cjJT5advXguvcgjHFTCaIO3enL/xr89vK2bh0Mfyj9aa0ANA=="
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.1.0.tgz",
+			"integrity": "sha512-u0AX4aSo25sMAygCuQTzS+HsImZFuS8llY8O7b9MDRzbJM0kVJlAz6KNDqcG7pOuQZJmj/8X/rAW+66kMnMW+g=="
 		},
 		"@emotion/styled": {
-			"version": "10.0.27",
-			"resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-10.0.27.tgz",
-			"integrity": "sha512-iK/8Sh7+NLJzyp9a5+vIQIXTYxfT4yB/OJbjzQanB2RZpvmzBQOHZWhpAMZWYEKRNNbsD6WfBw5sVWkb6WzS/Q==",
+			"version": "11.6.0",
+			"resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.6.0.tgz",
+			"integrity": "sha512-mxVtVyIOTmCAkFbwIp+nCjTXJNgcz4VWkOYQro87jE2QBTydnkiYusMrRGFtzuruiGK4dDaNORk4gH049iiQuw==",
 			"requires": {
-				"@emotion/styled-base": "^10.0.27",
-				"babel-plugin-emotion": "^10.0.27"
-			}
-		},
-		"@emotion/styled-base": {
-			"version": "10.0.31",
-			"resolved": "https://registry.npmjs.org/@emotion/styled-base/-/styled-base-10.0.31.tgz",
-			"integrity": "sha512-wTOE1NcXmqMWlyrtwdkqg87Mu6Rj1MaukEoEmEkHirO5IoHDJ8LgCQL4MjJODgxWxXibGR3opGp1p7YvkNEdXQ==",
-			"requires": {
-				"@babel/runtime": "^7.5.5",
-				"@emotion/is-prop-valid": "0.8.8",
-				"@emotion/serialize": "^0.11.15",
-				"@emotion/utils": "0.11.3"
+				"@babel/runtime": "^7.13.10",
+				"@emotion/babel-plugin": "^11.3.0",
+				"@emotion/is-prop-valid": "^1.1.1",
+				"@emotion/serialize": "^1.0.2",
+				"@emotion/utils": "^1.0.0"
 			}
 		},
-		"@emotion/stylis": {
-			"version": "0.8.5",
-			"resolved": "https://registry.npmjs.org/@emotion/stylis/-/stylis-0.8.5.tgz",
-			"integrity": "sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ=="
-		},
 		"@emotion/unitless": {
 			"version": "0.7.5",
 			"resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz",
 			"integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg=="
 		},
 		"@emotion/utils": {
-			"version": "0.11.3",
-			"resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-0.11.3.tgz",
-			"integrity": "sha512-0o4l6pZC+hI88+bzuaX/6BgOvQVhbt2PfmxauVaYOGgbsAw14wdKyvMCZXnsnsHys94iadcF+RG/wZyx6+ZZBw=="
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.0.0.tgz",
+			"integrity": "sha512-mQC2b3XLDs6QCW+pDQDiyO/EdGZYOygE8s5N5rrzjSI4M3IejPE/JPndCBwRT9z982aqQNi6beWs1UeayrQxxA=="
 		},
 		"@emotion/weak-memoize": {
 			"version": "0.2.5",
@@ -1426,14 +1706,22 @@
 			"integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA=="
 		},
 		"@es-joy/jsdoccomment": {
-			"version": "0.6.0",
-			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.6.0.tgz",
-			"integrity": "sha512-zT1EtysKMITJ7vE4RvOJqitxk/Str6It8hq+fykxkwLuTyzgak+TnVuVSIyovT/qrEz3i46ypCSXgNtIDYwNOg==",
+			"version": "0.10.8",
+			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.10.8.tgz",
+			"integrity": "sha512-3P1JiGL4xaR9PoTKUHa2N/LKwa2/eUdRqGwijMWWgBqbFEqJUVpmaOi2TcjcemrsRMgFLBzQCK4ToPhrSVDiFQ==",
 			"dev": true,
 			"requires": {
-				"comment-parser": "^1.1.5",
+				"comment-parser": "1.2.4",
 				"esquery": "^1.4.0",
-				"jsdoctypeparser": "^9.0.0"
+				"jsdoc-type-pratt-parser": "1.1.1"
+			},
+			"dependencies": {
+				"jsdoc-type-pratt-parser": {
+					"version": "1.1.1",
+					"resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.1.1.tgz",
+					"integrity": "sha512-uelRmpghNwPBuZScwgBG/OzodaFk5RbO5xaivBdsAY70icWfShwZ7PCMO0x1zSkOa8T1FzHThmrdoyg/0AwV5g==",
+					"dev": true
+				}
 			}
 		},
 		"@eslint/eslintrc": {
@@ -1454,9 +1742,9 @@
 			},
 			"dependencies": {
 				"globals": {
-					"version": "13.11.0",
-					"resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz",
-					"integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==",
+					"version": "13.12.0",
+					"resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
+					"integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
 					"dev": true,
 					"requires": {
 						"type-fest": "^0.20.2"
@@ -1667,49 +1955,19 @@
 				}
 			}
 		},
-		"@gar/promisify": {
-			"version": "1.1.2",
-			"resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz",
-			"integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==",
-			"dev": true
-		},
-		"@hapi/address": {
-			"version": "2.1.4",
-			"resolved": "https://registry.npmjs.org/@hapi/address/-/address-2.1.4.tgz",
-			"integrity": "sha512-QD1PhQk+s31P1ixsX0H0Suoupp3VMXzIVMSwobR3F3MSUO2YCV0B7xqLcUw/Bh8yuvd3LhpyqLQWTNcRmp6IdQ==",
-			"dev": true
-		},
-		"@hapi/bourne": {
-			"version": "1.3.2",
-			"resolved": "https://registry.npmjs.org/@hapi/bourne/-/bourne-1.3.2.tgz",
-			"integrity": "sha512-1dVNHT76Uu5N3eJNTYcvxee+jzX4Z9lfciqRRHCU27ihbUcYi+iSc2iml5Ke1LXe1SyJCLA0+14Jh4tXJgOppA==",
-			"dev": true
-		},
 		"@hapi/hoek": {
-			"version": "8.5.1",
-			"resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-8.5.1.tgz",
-			"integrity": "sha512-yN7kbciD87WzLGc5539Tn0sApjyiGHAJgKvG9W8C7O+6c7qmoQMfVs0W4bX17eqz6C78QJqqFrtgdK5EWf6Qow==",
+			"version": "9.2.1",
+			"resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.2.1.tgz",
+			"integrity": "sha512-gfta+H8aziZsm8pZa0vj04KO6biEiisppNgA1kbJvFrrWu9Vm7eaUEy76DIxsuTaWvti5fkJVhllWc6ZTE+Mdw==",
 			"dev": true
 		},
-		"@hapi/joi": {
-			"version": "15.1.1",
-			"resolved": "https://registry.npmjs.org/@hapi/joi/-/joi-15.1.1.tgz",
-			"integrity": "sha512-entf8ZMOK8sc+8YfeOlM8pCfg3b5+WZIKBfUaaJT8UsjAAPjartzxIYm3TIbjvA4u+u++KbcXD38k682nVHDAQ==",
-			"dev": true,
-			"requires": {
-				"@hapi/address": "2.x.x",
-				"@hapi/bourne": "1.x.x",
-				"@hapi/hoek": "8.x.x",
-				"@hapi/topo": "3.x.x"
-			}
-		},
 		"@hapi/topo": {
-			"version": "3.1.6",
-			"resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-3.1.6.tgz",
-			"integrity": "sha512-tAag0jEcjwH+P2quUfipd7liWCNX2F8NvYjQp2wtInsZxnMlypdw0FtAOLxtvvkO+GSRRbmNi8m/5y42PQJYCQ==",
+			"version": "5.1.0",
+			"resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
+			"integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
 			"dev": true,
 			"requires": {
-				"@hapi/hoek": "^8.3.0"
+				"@hapi/hoek": "^9.0.0"
 			}
 		},
 		"@humanwhocodes/config-array": {
@@ -1724,9 +1982,9 @@
 			}
 		},
 		"@humanwhocodes/object-schema": {
-			"version": "1.2.0",
-			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.0.tgz",
-			"integrity": "sha512-wdppn25U8z/2yiaT6YGquE6X8sSv7hNMWSXYSSU1jGv/yd6XqjXgTDJ8KP4NgjTXfJ3GbRjeeb8RTV7a/VpM+w==",
+			"version": "1.2.1",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+			"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
 			"dev": true
 		},
 		"@istanbuljs/load-nyc-config": {
@@ -1841,9 +2099,9 @@
 			},
 			"dependencies": {
 				"ansi-regex": {
-					"version": "5.0.0",
-					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-					"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+					"version": "5.0.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+					"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 					"dev": true
 				},
 				"braces": {
@@ -1881,9 +2139,9 @@
 					}
 				},
 				"picomatch": {
-					"version": "2.3.0",
-					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
-					"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+					"version": "2.3.1",
+					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+					"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
 					"dev": true
 				},
 				"rimraf": {
@@ -1896,12 +2154,12 @@
 					}
 				},
 				"strip-ansi": {
-					"version": "6.0.0",
-					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-					"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+					"version": "6.0.1",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+					"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 					"dev": true,
 					"requires": {
-						"ansi-regex": "^5.0.0"
+						"ansi-regex": "^5.0.1"
 					}
 				},
 				"to-regex-range": {
@@ -1985,6 +2243,24 @@
 				"v8-to-istanbul": "^7.0.0"
 			},
 			"dependencies": {
+				"istanbul-lib-instrument": {
+					"version": "4.0.3",
+					"resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
+					"integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+					"dev": true,
+					"requires": {
+						"@babel/core": "^7.7.5",
+						"@istanbuljs/schema": "^0.1.2",
+						"istanbul-lib-coverage": "^3.0.0",
+						"semver": "^6.3.0"
+					}
+				},
+				"semver": {
+					"version": "6.3.0",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+					"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+					"dev": true
+				},
 				"source-map": {
 					"version": "0.6.1",
 					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
@@ -2095,9 +2371,9 @@
 					}
 				},
 				"picomatch": {
-					"version": "2.3.0",
-					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
-					"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+					"version": "2.3.1",
+					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+					"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
 					"dev": true
 				},
 				"source-map": {
@@ -2171,80 +2447,74 @@
 				"fastq": "^1.6.0"
 			}
 		},
-		"@npmcli/fs": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.0.0.tgz",
-			"integrity": "sha512-8ltnOpRR/oJbOp8vaGUnipOi3bqkcW+sLHFlyXIr08OGHmVJLB1Hn7QtGXbYcpVtH1gAYZTlmDXtE4YV0+AMMQ==",
-			"dev": true,
+		"@polka/url": {
+			"version": "1.0.0-next.21",
+			"resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz",
+			"integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==",
+			"dev": true
+		},
+		"@popperjs/core": {
+			"version": "2.11.2",
+			"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz",
+			"integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA=="
+		},
+		"@react-spring/animated": {
+			"version": "9.4.2",
+			"resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.4.2.tgz",
+			"integrity": "sha512-Dzum5Ho8e+LIAegAqRyoQFakD2IVH3ZQ2nsFXJorAFq3Xjv6IVPz/+TNxb/wSvnsMludfoF+ZIf319FSFmgD5w==",
 			"requires": {
-				"@gar/promisify": "^1.0.1",
-				"semver": "^7.3.5"
-			},
-			"dependencies": {
-				"semver": {
-					"version": "7.3.5",
-					"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
-					"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
-					"dev": true,
-					"requires": {
-						"lru-cache": "^6.0.0"
-					}
-				}
+				"@react-spring/shared": "~9.4.0",
+				"@react-spring/types": "~9.4.0"
 			}
 		},
-		"@npmcli/move-file": {
-			"version": "1.1.2",
-			"resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
-			"integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
-			"dev": true,
+		"@react-spring/core": {
+			"version": "9.4.2",
+			"resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.4.2.tgz",
+			"integrity": "sha512-Ej/ULwdx8rQtMAWEpLgwbKcQEx6vPfjyG3cxLP05zAInpCoWkYpl+sXOp9tn3r99mTNQPTTt7BgQsSnmQA8+rQ==",
 			"requires": {
-				"mkdirp": "^1.0.4",
-				"rimraf": "^3.0.2"
-			},
-			"dependencies": {
-				"mkdirp": {
-					"version": "1.0.4",
-					"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-					"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-					"dev": true
-				},
-				"rimraf": {
-					"version": "3.0.2",
-					"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-					"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-					"dev": true,
-					"requires": {
-						"glob": "^7.1.3"
-					}
-				}
+				"@react-spring/animated": "~9.4.0",
+				"@react-spring/rafz": "~9.4.0",
+				"@react-spring/shared": "~9.4.0",
+				"@react-spring/types": "~9.4.0"
 			}
 		},
-		"@polka/url": {
-			"version": "1.0.0-next.20",
-			"resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.20.tgz",
-			"integrity": "sha512-88p7+M0QGxKpmnkfXjS4V26AnoC/eiqZutE8GLdaI5X12NY75bXSdTY9NkmYb2Xyk1O+MmkuO6Frmsj84V6I8Q==",
-			"dev": true
+		"@react-spring/rafz": {
+			"version": "9.4.2",
+			"resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.4.2.tgz",
+			"integrity": "sha512-rSm+G8E/XEEpnCGtT/xYN6o8VvEXlU8wN/hyKp4Q44XAZzGSMHLIFP7pY94/MmWsxCxjkw1AxUWhiFYxWrnI5Q=="
 		},
-		"@popperjs/core": {
-			"version": "2.9.3",
-			"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.9.3.tgz",
-			"integrity": "sha512-xDu17cEfh7Kid/d95kB6tZsLOmSWKCZKtprnhVepjsSaCij+lM3mItSJDuuHDMbCWTh8Ejmebwb+KONcCJ0eXQ=="
+		"@react-spring/shared": {
+			"version": "9.4.2",
+			"resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.4.2.tgz",
+			"integrity": "sha512-mZtbQLpMm6Vy5+O1MSlY9KuAcMO8rdUQvtdnC7Or7y7xiZlnzj8oAILyO6Y2rD2ZC1PmgVS0gMev/8T+MykW+Q==",
+			"requires": {
+				"@react-spring/rafz": "~9.4.0",
+				"@react-spring/types": "~9.4.0"
+			}
+		},
+		"@react-spring/types": {
+			"version": "9.4.2",
+			"resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.4.2.tgz",
+			"integrity": "sha512-GGiIscTM+CEUNV52anj3g5FqAZKL2+eRKtvBOAlC99qGBbvJ3qTLImrUR/I3lXY7PRuLgzI6kh34quA1oUxWYQ=="
+		},
+		"@react-spring/web": {
+			"version": "9.4.2",
+			"resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.4.2.tgz",
+			"integrity": "sha512-sWfA9NkVuvVOpjSlMkD2zcF6X3i8NSHTeH/uHCGKsN3mYqgkhvAF+E8GASO/H4KKGNhbRvgCZiwJXOtOGyUg6A==",
+			"requires": {
+				"@react-spring/animated": "~9.4.0",
+				"@react-spring/core": "~9.4.0",
+				"@react-spring/shared": "~9.4.0",
+				"@react-spring/types": "~9.4.0"
+			}
 		},
 		"@sideway/address": {
-			"version": "4.1.1",
-			"resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.1.tgz",
-			"integrity": "sha512-+I5aaQr3m0OAmMr7RQ3fR9zx55sejEYR2BFJaxL+zT3VM2611X0SHvPWIbAUBZVTn/YzYKbV8gJ2oT/QELknfQ==",
+			"version": "4.1.2",
+			"resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.2.tgz",
+			"integrity": "sha512-idTz8ibqWFrPU8kMirL0CoPH/A29XOzzAzpyN3zQ4kAWnzmNfFmRaoMNN6VI8ske5M73HZyhIaW4OuSFIdM4oA==",
 			"dev": true,
 			"requires": {
 				"@hapi/hoek": "^9.0.0"
-			},
-			"dependencies": {
-				"@hapi/hoek": {
-					"version": "9.1.1",
-					"resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.1.tgz",
-					"integrity": "sha512-CAEbWH7OIur6jEOzaai83jq3FmKmv4PmX1JYfs9IrYcGEVI/lyL1EXJGCj7eFVJ0bg5QR8LMxBlEtA+xKiLpFw==",
-					"dev": true
-				}
 			}
 		},
 		"@sideway/formula": {
@@ -2396,9 +2666,9 @@
 			},
 			"dependencies": {
 				"camelcase": {
-					"version": "6.2.0",
-					"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
-					"integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
+					"version": "6.3.0",
+					"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+					"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
 					"dev": true
 				},
 				"cosmiconfig": {
@@ -2495,9 +2765,9 @@
 					}
 				},
 				"loader-utils": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-					"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
+					"version": "2.0.2",
+					"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
+					"integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
 					"dev": true,
 					"requires": {
 						"big.js": "^5.2.2",
@@ -2540,10 +2810,16 @@
 			"integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==",
 			"dev": true
 		},
+		"@trysound/sax": {
+			"version": "0.2.0",
+			"resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
+			"integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+			"dev": true
+		},
 		"@types/babel__core": {
-			"version": "7.1.15",
-			"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.15.tgz",
-			"integrity": "sha512-bxlMKPDbY8x5h6HBwVzEOk2C8fb6SLfYQ5Jw3uBYuYF1lfWk/kbLd81la82vrIkBb0l+JdmrZaDikPrNxpS/Ew==",
+			"version": "7.1.18",
+			"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.18.tgz",
+			"integrity": "sha512-S7unDjm/C7z2A2R9NzfKCK1I+BAALDtxEmsJBwlB3EzNfb929ykjL++1CK9LO++EIp2fQrC8O+BwjKvz6UeDyQ==",
 			"dev": true,
 			"requires": {
 				"@babel/parser": "^7.1.0",
@@ -2554,9 +2830,9 @@
 			}
 		},
 		"@types/babel__generator": {
-			"version": "7.6.3",
-			"resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.3.tgz",
-			"integrity": "sha512-/GWCmzJWqV7diQW54smJZzWbSFf4QYtF71WCKhcx6Ru/tFyQIY2eiiITcCAeuPbNSvT9YCGkVMqqvSk2Z0mXiA==",
+			"version": "7.6.4",
+			"resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz",
+			"integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==",
 			"dev": true,
 			"requires": {
 				"@babel/types": "^7.0.0"
@@ -2605,6 +2881,32 @@
 			"resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.10.tgz",
 			"integrity": "sha512-C7srjHiVG3Ey1nR6d511dtDkCEjxuN9W1HWAEjGq8kpcwmNM6JJkpC0xvabM7BXTG2wDq8Eu33iH9aQKa7IvLQ=="
 		},
+		"@types/eslint": {
+			"version": "8.2.2",
+			"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.2.tgz",
+			"integrity": "sha512-nQxgB8/Sg+QKhnV8e0WzPpxjIGT3tuJDDzybkDi8ItE/IgTlHo07U0shaIjzhcvQxlq9SDRE42lsJ23uvEgJ2A==",
+			"dev": true,
+			"requires": {
+				"@types/estree": "*",
+				"@types/json-schema": "*"
+			}
+		},
+		"@types/eslint-scope": {
+			"version": "3.7.3",
+			"resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz",
+			"integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==",
+			"dev": true,
+			"requires": {
+				"@types/eslint": "*",
+				"@types/estree": "*"
+			}
+		},
+		"@types/estree": {
+			"version": "0.0.50",
+			"resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.50.tgz",
+			"integrity": "sha512-C6N5s2ZFtuZRj54k2/zyRhNDjJwwcViAM3Nbm8zjBpbqAdZ00mr0CFxvSKeO8Y/e03WVFLpQMdHYVfUd6SB+Hw==",
+			"dev": true
+		},
 		"@types/glob": {
 			"version": "7.1.3",
 			"resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz",
@@ -2625,9 +2927,9 @@
 			}
 		},
 		"@types/istanbul-lib-coverage": {
-			"version": "2.0.3",
-			"resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz",
-			"integrity": "sha512-sz7iLqvVUg1gIedBOvlkxPlc8/uVzyS5OwGz1cKjXzkl3FpL3al0crU8YGU1WoHkxn0Wxbw5tyi6hvzJKNzFsw==",
+			"version": "2.0.4",
+			"resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
+			"integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==",
 			"dev": true
 		},
 		"@types/istanbul-lib-report": {
@@ -2660,6 +2962,11 @@
 			"integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
 			"dev": true
 		},
+		"@types/lodash": {
+			"version": "4.14.178",
+			"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.178.tgz",
+			"integrity": "sha512-0d5Wd09ItQWH1qFbEyQ7oTQ3GZrMfth5JkbN3EvTKLXcHLRDSXeLnlvlOn0wvxVIwK5o2M8JzP/OWz7T3NRsbw=="
+		},
 		"@types/mdast": {
 			"version": "3.0.10",
 			"resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-3.0.10.tgz",
@@ -2681,6 +2988,11 @@
 			"integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
 			"dev": true
 		},
+		"@types/mousetrap": {
+			"version": "1.6.8",
+			"resolved": "https://registry.npmjs.org/@types/mousetrap/-/mousetrap-1.6.8.tgz",
+			"integrity": "sha512-zTqjvgCUT5EoXqbqmd8iJMb4NJqyV/V7pK7AIKq7qcaAsJIpGlTVJS1HQM6YkdHCdnkNSbhcQI7MXYxFfE3iCA=="
+		},
 		"@types/node": {
 			"version": "14.14.20",
 			"resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.20.tgz",
@@ -2698,9 +3010,9 @@
 			"integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA=="
 		},
 		"@types/prettier": {
-			"version": "2.3.2",
-			"resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.3.2.tgz",
-			"integrity": "sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==",
+			"version": "2.4.3",
+			"resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.4.3.tgz",
+			"integrity": "sha512-QzSuZMBuG5u8HqYz01qtMdg/Jfctlnvj1z/lYnIDXs/golxw0fxtRAHd9KrzjR7Yxz1qVeI00o0kiO3PmVdJ9w==",
 			"dev": true
 		},
 		"@types/prop-types": {
@@ -2715,9 +3027,9 @@
 			"dev": true
 		},
 		"@types/react": {
-			"version": "16.14.14",
-			"resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.14.tgz",
-			"integrity": "sha512-uwIWDYW8LznHzEMJl7ag9St1RsK0gw/xaFZ5+uI1ZM1HndwUgmPH3/wQkSb87GkOVg7shUxnpNW8DcN0AzvG5Q==",
+			"version": "16.14.21",
+			"resolved": "https://registry.npmjs.org/@types/react/-/react-16.14.21.tgz",
+			"integrity": "sha512-rY4DzPKK/4aohyWiDRHS2fotN5rhBSK6/rz1X37KzNna9HJyqtaGAbq9fVttrEPWF5ywpfIP1ITL8Xi2QZn6Eg==",
 			"requires": {
 				"@types/prop-types": "*",
 				"@types/scheduler": "*",
@@ -2779,9 +3091,9 @@
 			"dev": true
 		},
 		"@types/webpack": {
-			"version": "4.41.30",
-			"resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.30.tgz",
-			"integrity": "sha512-GUHyY+pfuQ6haAfzu4S14F+R5iGRwN6b2FRNJY7U0NilmFAqbsOfK6j1HwuLBAqwRIT+pVdNDJGJ6e8rpp0KHA==",
+			"version": "4.41.32",
+			"resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.32.tgz",
+			"integrity": "sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==",
 			"dev": true,
 			"requires": {
 				"@types/node": "*",
@@ -2845,24 +3157,25 @@
 			}
 		},
 		"@typescript-eslint/eslint-plugin": {
-			"version": "4.30.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.30.0.tgz",
-			"integrity": "sha512-NgAnqk55RQ/SD+tZFD9aPwNSeHmDHHe5rtUyhIq0ZeCWZEvo4DK9rYz7v9HDuQZFvn320Ot+AikaCKMFKLlD0g==",
+			"version": "4.33.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz",
+			"integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/experimental-utils": "4.30.0",
-				"@typescript-eslint/scope-manager": "4.30.0",
+				"@typescript-eslint/experimental-utils": "4.33.0",
+				"@typescript-eslint/scope-manager": "4.33.0",
 				"debug": "^4.3.1",
 				"functional-red-black-tree": "^1.0.1",
+				"ignore": "^5.1.8",
 				"regexpp": "^3.1.0",
 				"semver": "^7.3.5",
 				"tsutils": "^3.21.0"
 			},
 			"dependencies": {
 				"debug": {
-					"version": "4.3.2",
-					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-					"integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+					"version": "4.3.3",
+					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+					"integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
 					"dev": true,
 					"requires": {
 						"ms": "2.1.2"
@@ -2886,15 +3199,15 @@
 			}
 		},
 		"@typescript-eslint/experimental-utils": {
-			"version": "4.30.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.30.0.tgz",
-			"integrity": "sha512-K8RNIX9GnBsv5v4TjtwkKtqMSzYpjqAQg/oSphtxf3xxdt6T0owqnpojztjjTcatSteH3hLj3t/kklKx87NPqw==",
+			"version": "4.33.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz",
+			"integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==",
 			"dev": true,
 			"requires": {
 				"@types/json-schema": "^7.0.7",
-				"@typescript-eslint/scope-manager": "4.30.0",
-				"@typescript-eslint/types": "4.30.0",
-				"@typescript-eslint/typescript-estree": "4.30.0",
+				"@typescript-eslint/scope-manager": "4.33.0",
+				"@typescript-eslint/types": "4.33.0",
+				"@typescript-eslint/typescript-estree": "4.33.0",
 				"eslint-scope": "^5.1.1",
 				"eslint-utils": "^3.0.0"
 			},
@@ -2918,21 +3231,21 @@
 			}
 		},
 		"@typescript-eslint/parser": {
-			"version": "4.30.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.30.0.tgz",
-			"integrity": "sha512-HJ0XuluSZSxeboLU7Q2VQ6eLlCwXPBOGnA7CqgBnz2Db3JRQYyBDJgQnop6TZ+rsbSx5gEdWhw4rE4mDa1FnZg==",
+			"version": "4.33.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz",
+			"integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/scope-manager": "4.30.0",
-				"@typescript-eslint/types": "4.30.0",
-				"@typescript-eslint/typescript-estree": "4.30.0",
+				"@typescript-eslint/scope-manager": "4.33.0",
+				"@typescript-eslint/types": "4.33.0",
+				"@typescript-eslint/typescript-estree": "4.33.0",
 				"debug": "^4.3.1"
 			},
 			"dependencies": {
 				"debug": {
-					"version": "4.3.2",
-					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-					"integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+					"version": "4.3.3",
+					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+					"integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
 					"dev": true,
 					"requires": {
 						"ms": "2.1.2"
@@ -2947,29 +3260,29 @@
 			}
 		},
 		"@typescript-eslint/scope-manager": {
-			"version": "4.30.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.30.0.tgz",
-			"integrity": "sha512-VJ/jAXovxNh7rIXCQbYhkyV2Y3Ac/0cVHP/FruTJSAUUm4Oacmn/nkN5zfWmWFEanN4ggP0vJSHOeajtHq3f8A==",
+			"version": "4.33.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz",
+			"integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/types": "4.30.0",
-				"@typescript-eslint/visitor-keys": "4.30.0"
+				"@typescript-eslint/types": "4.33.0",
+				"@typescript-eslint/visitor-keys": "4.33.0"
 			}
 		},
 		"@typescript-eslint/types": {
-			"version": "4.30.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.30.0.tgz",
-			"integrity": "sha512-YKldqbNU9K4WpTNwBqtAerQKLLW/X2A/j4yw92e3ZJYLx+BpKLeheyzoPfzIXHfM8BXfoleTdiYwpsvVPvHrDw==",
+			"version": "4.33.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz",
+			"integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==",
 			"dev": true
 		},
 		"@typescript-eslint/typescript-estree": {
-			"version": "4.30.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.30.0.tgz",
-			"integrity": "sha512-6WN7UFYvykr/U0Qgy4kz48iGPWILvYL34xXJxvDQeiRE018B7POspNRVtAZscWntEPZpFCx4hcz/XBT+erenfg==",
+			"version": "4.33.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz",
+			"integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/types": "4.30.0",
-				"@typescript-eslint/visitor-keys": "4.30.0",
+				"@typescript-eslint/types": "4.33.0",
+				"@typescript-eslint/visitor-keys": "4.33.0",
 				"debug": "^4.3.1",
 				"globby": "^11.0.3",
 				"is-glob": "^4.0.1",
@@ -2984,25 +3297,25 @@
 					"dev": true
 				},
 				"debug": {
-					"version": "4.3.2",
-					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-					"integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+					"version": "4.3.3",
+					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+					"integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
 					"dev": true,
 					"requires": {
 						"ms": "2.1.2"
 					}
 				},
 				"globby": {
-					"version": "11.0.4",
-					"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
-					"integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
+					"version": "11.1.0",
+					"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+					"integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
 					"dev": true,
 					"requires": {
 						"array-union": "^2.1.0",
 						"dir-glob": "^3.0.1",
-						"fast-glob": "^3.1.1",
-						"ignore": "^5.1.4",
-						"merge2": "^1.3.0",
+						"fast-glob": "^3.2.9",
+						"ignore": "^5.2.0",
+						"merge2": "^1.4.1",
 						"slash": "^3.0.0"
 					}
 				},
@@ -3024,12 +3337,12 @@
 			}
 		},
 		"@typescript-eslint/visitor-keys": {
-			"version": "4.30.0",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.30.0.tgz",
-			"integrity": "sha512-pNaaxDt/Ol/+JZwzP7MqWc8PJQTUhZwoee/PVlQ+iYoYhagccvoHnC9e4l+C/krQYYkENxznhVSDwClIbZVxRw==",
+			"version": "4.33.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz",
+			"integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/types": "4.30.0",
+				"@typescript-eslint/types": "4.33.0",
 				"eslint-visitor-keys": "^2.0.0"
 			}
 		},
@@ -3086,6 +3399,31 @@
 				"@webassemblyjs/ast": "1.9.0"
 			}
 		},
+		"@webassemblyjs/helper-numbers": {
+			"version": "1.11.1",
+			"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
+			"integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
+			"dev": true,
+			"requires": {
+				"@webassemblyjs/floating-point-hex-parser": "1.11.1",
+				"@webassemblyjs/helper-api-error": "1.11.1",
+				"@xtuc/long": "4.2.2"
+			},
+			"dependencies": {
+				"@webassemblyjs/floating-point-hex-parser": {
+					"version": "1.11.1",
+					"resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
+					"integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==",
+					"dev": true
+				},
+				"@webassemblyjs/helper-api-error": {
+					"version": "1.11.1",
+					"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
+					"integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==",
+					"dev": true
+				}
+			}
+		},
 		"@webassemblyjs/helper-wasm-bytecode": {
 			"version": "1.9.0",
 			"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz",
@@ -3213,19 +3551,38 @@
 			"resolved": "https://registry.npmjs.org/@webcomponents/template/-/template-1.4.4.tgz",
 			"integrity": "sha512-QqCmmywIKJTilkl6UIPLxEBBuqhDaOBpvQyKOnUEwl9lJuVHBrVlhMIhhnp9VSZJ6xEUnp+PiX8DST1k0q/v4Q=="
 		},
+		"@webpack-cli/configtest": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.0.tgz",
+			"integrity": "sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==",
+			"dev": true
+		},
+		"@webpack-cli/info": {
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.0.tgz",
+			"integrity": "sha512-F6b+Man0rwE4n0409FyAJHStYA5OIZERxmnUfLVwv0mc0V1wLad3V7jqRlMkgKBeAq07jUvglacNaa6g9lOpuw==",
+			"dev": true,
+			"requires": {
+				"envinfo": "^7.7.3"
+			}
+		},
+		"@webpack-cli/serve": {
+			"version": "1.6.0",
+			"resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.0.tgz",
+			"integrity": "sha512-ZkVeqEmRpBV2GHvjjUZqEai2PpUbuq8Bqd//vEYsp63J8WyexI8ppCqVS3Zs0QADf6aWuPdU+0XsPI647PVlQA==",
+			"dev": true
+		},
 		"@wojtekmaj/enzyme-adapter-react-17": {
-			"version": "0.6.3",
-			"resolved": "https://registry.npmjs.org/@wojtekmaj/enzyme-adapter-react-17/-/enzyme-adapter-react-17-0.6.3.tgz",
-			"integrity": "sha512-Kp1ZJxtHkKEnUksaWrcMABNTOgL4wOt8VI6k2xOek2aH9PtZcWRXJNUEgnKrdJrqg5UqIjRslbVF9uUqwQJtFg==",
+			"version": "0.6.6",
+			"resolved": "https://registry.npmjs.org/@wojtekmaj/enzyme-adapter-react-17/-/enzyme-adapter-react-17-0.6.6.tgz",
+			"integrity": "sha512-gSfhg8CiL0Vwc2UgUblGVZIy7M0KyXaZsd8+QwzV8TSVRLkGyzdLtYEcs9wRWyQTsdmOd+oRGqbVgUX7AVJxug==",
 			"dev": true,
 			"requires": {
-				"@wojtekmaj/enzyme-adapter-utils": "^0.1.1",
+				"@wojtekmaj/enzyme-adapter-utils": "^0.1.2",
 				"enzyme-shallow-equal": "^1.0.0",
 				"has": "^1.0.0",
-				"object.assign": "^4.1.0",
-				"object.values": "^1.1.0",
 				"prop-types": "^15.7.0",
-				"react-is": "^17.0.2",
+				"react-is": "^17.0.0",
 				"react-test-renderer": "^17.0.0"
 			},
 			"dependencies": {
@@ -3238,59 +3595,58 @@
 			}
 		},
 		"@wojtekmaj/enzyme-adapter-utils": {
-			"version": "0.1.1",
-			"resolved": "https://registry.npmjs.org/@wojtekmaj/enzyme-adapter-utils/-/enzyme-adapter-utils-0.1.1.tgz",
-			"integrity": "sha512-bNPWtN/d8huKOkC6j1E3EkSamnRrHHT7YuR6f9JppAQqtoAm3v4/vERe4J14jQKmHLCyEBHXrlgb7H6l817hVg==",
+			"version": "0.1.2",
+			"resolved": "https://registry.npmjs.org/@wojtekmaj/enzyme-adapter-utils/-/enzyme-adapter-utils-0.1.2.tgz",
+			"integrity": "sha512-MM/DqDqvxNVlWLqSVQiUbRN9MuDLJfefmPbJ8ZKdmdf5ID8G+i42XhFpoQh5bAZUCdwzRae3+WSZl2lXcFOrhw==",
 			"dev": true,
 			"requires": {
 				"function.prototype.name": "^1.1.0",
 				"has": "^1.0.0",
-				"object.assign": "^4.1.0",
 				"object.fromentries": "^2.0.0",
 				"prop-types": "^15.7.0"
 			}
 		},
 		"@wordpress/a11y": {
-			"version": "3.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-3.1.2.tgz",
-			"integrity": "sha512-VUrJN4UcDdYLYVOjArMbSsHNrIPmoAfrSsJi09xpRFBJXUq67sLLPh5+yy01uptbV1aOqcIbRagyj0Zaq8I70g==",
+			"version": "3.2.4",
+			"resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-3.2.4.tgz",
+			"integrity": "sha512-RhDZciRy6XUx/hegJdJTgAtC/6i7DjfpUYJdy6McwvWXs56tMmCo+wBYQvC3G//+2VYdYYkwDZ8Z6eVUBSJ17w==",
 			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/dom-ready": "^3.1.2",
-				"@wordpress/i18n": "^4.1.2"
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/dom-ready": "^3.2.3",
+				"@wordpress/i18n": "^4.2.4"
 			}
 		},
 		"@wordpress/annotations": {
-			"version": "2.1.6",
-			"resolved": "https://registry.npmjs.org/@wordpress/annotations/-/annotations-2.1.6.tgz",
-			"integrity": "sha512-z79UvFGm8GiwJZWEIgE9mzIEzoGVRPo31qwjnotFq3uHjAhKsRZk3ppmaLRNZUbJfobNOvDEyD8VT8V033Gp2A==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/data": "^5.1.6",
-				"@wordpress/hooks": "^3.1.1",
-				"@wordpress/i18n": "^4.1.2",
-				"@wordpress/rich-text": "^4.1.6",
+			"version": "2.2.9",
+			"resolved": "https://registry.npmjs.org/@wordpress/annotations/-/annotations-2.2.9.tgz",
+			"integrity": "sha512-xudNtq+QotOwyYbOAEt1XWLp40CcKJvBzE2acstf/DZqxIi/PXB++4QVxgpQuYWkr6bWIFm4EfNvsUFBQr9DWQ==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/data": "^6.1.5",
+				"@wordpress/hooks": "^3.2.2",
+				"@wordpress/i18n": "^4.2.4",
+				"@wordpress/rich-text": "^5.0.8",
 				"lodash": "^4.17.21",
 				"rememo": "^3.0.0",
 				"uuid": "^8.3.0"
 			}
 		},
 		"@wordpress/api-fetch": {
-			"version": "5.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-5.1.2.tgz",
-			"integrity": "sha512-qdYENoku3IHfq9tHQismlOnCXerps3Vf9oHjoicUT7ukUBLawEfJWM8LeMJmuFoMRh4mc5ceuhUmTnmEfbcwIQ==",
+			"version": "5.2.6",
+			"resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-5.2.6.tgz",
+			"integrity": "sha512-AG8KdCHwtYJWR38AAU7nEI+UbumUSqSBthQj3rShLUVyFbYGkQdpwXJJG6vFj7FjIp41zljiyj3K1Fh3cqdaAw==",
 			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/i18n": "^4.1.2",
-				"@wordpress/url": "^3.1.2"
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/i18n": "^4.2.4",
+				"@wordpress/url": "^3.3.1"
 			}
 		},
 		"@wordpress/autop": {
-			"version": "3.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/autop/-/autop-3.1.2.tgz",
-			"integrity": "sha512-EbQ/lJwK20GjMXa0pszW8RVdIWghrQcjM1GE/IjPhSWuReD8h0R+3LpB+noZpuy4ccqiz3/Enksq9LBlnFUMvg==",
+			"version": "3.2.3",
+			"resolved": "https://registry.npmjs.org/@wordpress/autop/-/autop-3.2.3.tgz",
+			"integrity": "sha512-o66vC+aZPmJGMie+Emqa5gtfQYKbLXqGCESTfingXyMxXEpCa4qOEOi1D6vwX61sf3+k2qJ4bvKwJ5nZXjDaSQ==",
 			"requires": {
-				"@babel/runtime": "^7.13.10"
+				"@babel/runtime": "^7.16.0"
 			}
 		},
 		"@wordpress/babel-plugin-import-jsx-pragma": {
@@ -3300,98 +3656,133 @@
 			"dev": true
 		},
 		"@wordpress/babel-preset-default": {
-			"version": "6.2.1",
-			"resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-6.2.1.tgz",
-			"integrity": "sha512-io2HbPtmLdfu3WdZg6X6T1oRVCrOTVrTouqSeUxyAZ954fNh8xyB7Q8rfHfxUZHPgGypnbzZOKBiCpUlnBRs7A==",
+			"version": "6.4.1",
+			"resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-6.4.1.tgz",
+			"integrity": "sha512-T0+dPOn0Hus/FSP043H3C2awjGNWLJcSahm7LhLqT5uUtgdg6QD9yf4jSr7G5mpLO/DXgz2ZnaYMUj+d1/gk9w==",
 			"dev": true,
 			"requires": {
-				"@babel/core": "^7.13.10",
-				"@babel/plugin-transform-react-jsx": "^7.12.7",
-				"@babel/plugin-transform-runtime": "^7.13.10",
-				"@babel/preset-env": "^7.13.10",
-				"@babel/preset-typescript": "^7.13.0",
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/babel-plugin-import-jsx-pragma": "^3.0.5",
-				"@wordpress/browserslist-config": "^4.0.1",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/warning": "^2.1.2",
-				"browserslist": "^4.16.6",
-				"core-js": "^3.12.1"
+				"@babel/core": "^7.16.0",
+				"@babel/plugin-transform-react-jsx": "^7.16.0",
+				"@babel/plugin-transform-runtime": "^7.16.0",
+				"@babel/preset-env": "^7.16.0",
+				"@babel/preset-typescript": "^7.16.0",
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/babel-plugin-import-jsx-pragma": "^3.1.0",
+				"@wordpress/browserslist-config": "^4.1.0",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/warning": "^2.2.2",
+				"browserslist": "^4.17.6",
+				"core-js": "^3.19.1"
+			},
+			"dependencies": {
+				"browserslist": {
+					"version": "4.19.1",
+					"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
+					"integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
+					"dev": true,
+					"requires": {
+						"caniuse-lite": "^1.0.30001286",
+						"electron-to-chromium": "^1.4.17",
+						"escalade": "^3.1.1",
+						"node-releases": "^2.0.1",
+						"picocolors": "^1.0.0"
+					}
+				},
+				"caniuse-lite": {
+					"version": "1.0.30001291",
+					"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001291.tgz",
+					"integrity": "sha512-roMV5V0HNGgJ88s42eE70sstqGW/gwFndosYrikHthw98N5tLnOTxFqMLQjZVRxTWFlJ4rn+MsgXrR7MDPY4jA==",
+					"dev": true
+				},
+				"electron-to-chromium": {
+					"version": "1.4.25",
+					"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.25.tgz",
+					"integrity": "sha512-bTwub9Y/76EiNmfaiJih+hAy6xn7Ns95S4KvI2NuKNOz8TEEKKQUu44xuy0PYMudjM9zdjKRS1bitsUvHTfuUg==",
+					"dev": true
+				},
+				"node-releases": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
+					"integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
+					"dev": true
+				}
 			}
 		},
 		"@wordpress/base-styles": {
-			"version": "3.6.0",
-			"resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-3.6.0.tgz",
-			"integrity": "sha512-6/vXAmc9FSX7Y17UjKgUJoVU++Pv1U1G8uMx7iClRUaLetc7/jj2DD9PTyX/cdJjHr32e3yXuLVT9wfEbo6SEg==",
+			"version": "4.0.4",
+			"resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-4.0.4.tgz",
+			"integrity": "sha512-qXiIhWLdTHWxBWawcqigJUUMeb2jkn9ElUEUC/Cn3DK2i62jiUWXOLp6tFIaf5eQMNXsYqtp5r7n2F/OllngQA==",
 			"dev": true
 		},
 		"@wordpress/blob": {
-			"version": "3.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/blob/-/blob-3.1.2.tgz",
-			"integrity": "sha512-xtuw2+fPok3Ep+fKJlNuatMzag19FUzLziDPa5XLtfncVo+WKg/Tnz+gj138EwYtrjVKnxGlGolps1zqFzH4Bg==",
+			"version": "3.2.2",
+			"resolved": "https://registry.npmjs.org/@wordpress/blob/-/blob-3.2.2.tgz",
+			"integrity": "sha512-uzOlmwcTtxZFBoQc6nDYdkTvPnd6QMK5GEmmrHt6Q1OYOZ6V2vOdC6w0IdynbQYpuNnaWwhyfcsTRh/+97UoRg==",
 			"requires": {
-				"@babel/runtime": "^7.13.10"
+				"@babel/runtime": "^7.16.0"
 			}
 		},
 		"@wordpress/block-directory": {
-			"version": "2.1.21",
-			"resolved": "https://registry.npmjs.org/@wordpress/block-directory/-/block-directory-2.1.21.tgz",
-			"integrity": "sha512-CCfQDyY7LpWkPxvmA7Dv9KAeSK1WiYIAZKt8FZNXJhnzZHuADsUcZy/7otopcMGHqCYycHcg+ygkpfzNyve5lA==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/a11y": "^3.1.2",
-				"@wordpress/api-fetch": "^5.1.2",
-				"@wordpress/block-editor": "^6.1.14",
-				"@wordpress/blocks": "^9.1.8",
-				"@wordpress/components": "^14.1.11",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/core-data": "^3.1.12",
-				"@wordpress/data": "^5.1.6",
-				"@wordpress/data-controls": "^2.1.6",
-				"@wordpress/edit-post": "^4.1.21",
-				"@wordpress/editor": "^10.1.17",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/hooks": "^3.1.1",
-				"@wordpress/html-entities": "^3.1.2",
-				"@wordpress/i18n": "^4.1.2",
-				"@wordpress/icons": "^4.0.3",
-				"@wordpress/notices": "^3.1.6",
-				"@wordpress/plugins": "^3.1.6",
-				"@wordpress/url": "^3.1.2",
+			"version": "3.0.26",
+			"resolved": "https://registry.npmjs.org/@wordpress/block-directory/-/block-directory-3.0.26.tgz",
+			"integrity": "sha512-+ufI3G3S3At+T6J0O3OsI37EyuYmt6NHELTnM8DmRWn+vDVWHpUFyUeHZwuPnqJCOq6orANsQctvGS45jq4BpA==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/a11y": "^3.2.4",
+				"@wordpress/api-fetch": "^5.2.6",
+				"@wordpress/block-editor": "^8.0.16",
+				"@wordpress/blocks": "^11.1.5",
+				"@wordpress/components": "^19.2.2",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/core-data": "^4.0.9",
+				"@wordpress/data": "^6.1.5",
+				"@wordpress/edit-post": "^5.0.26",
+				"@wordpress/editor": "^12.0.20",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/hooks": "^3.2.2",
+				"@wordpress/html-entities": "^3.2.3",
+				"@wordpress/i18n": "^4.2.4",
+				"@wordpress/icons": "^6.1.1",
+				"@wordpress/notices": "^3.2.8",
+				"@wordpress/plugins": "^4.0.7",
+				"@wordpress/url": "^3.3.1",
 				"lodash": "^4.17.21"
 			}
 		},
 		"@wordpress/block-editor": {
-			"version": "6.1.14",
-			"resolved": "https://registry.npmjs.org/@wordpress/block-editor/-/block-editor-6.1.14.tgz",
-			"integrity": "sha512-4qiAPqrBSOIO6fanm+jG2nTaNuPc1vfqq+KLHnWWfEZtAA06tuKeW/C8XbHT5NdCBzdSL9sytVw+94gOJVeTww==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/a11y": "^3.1.2",
-				"@wordpress/blob": "^3.1.2",
-				"@wordpress/block-serialization-default-parser": "^4.1.2",
-				"@wordpress/blocks": "^9.1.8",
-				"@wordpress/components": "^14.1.11",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/data": "^5.1.6",
-				"@wordpress/data-controls": "^2.1.6",
-				"@wordpress/deprecated": "^3.1.2",
-				"@wordpress/dom": "^3.1.5",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/hooks": "^3.1.1",
-				"@wordpress/html-entities": "^3.1.2",
-				"@wordpress/i18n": "^4.1.2",
-				"@wordpress/icons": "^4.0.3",
-				"@wordpress/is-shallow-equal": "^4.1.1",
-				"@wordpress/keyboard-shortcuts": "^2.1.7",
-				"@wordpress/keycodes": "^3.1.2",
-				"@wordpress/notices": "^3.1.6",
-				"@wordpress/rich-text": "^4.1.6",
-				"@wordpress/shortcode": "^3.1.2",
-				"@wordpress/token-list": "^2.1.1",
-				"@wordpress/url": "^3.1.2",
-				"@wordpress/wordcount": "^3.1.2",
-				"classnames": "^2.2.5",
+			"version": "8.0.16",
+			"resolved": "https://registry.npmjs.org/@wordpress/block-editor/-/block-editor-8.0.16.tgz",
+			"integrity": "sha512-vXmP8OANw+ZBbcI05qFBeuPON7tc4z1bAhg4txcJVM6ACAckjDabSamg53dprOycvpNA7B+bJVCvYBgEWkV1xQ==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@react-spring/web": "^9.2.4",
+				"@wordpress/a11y": "^3.2.4",
+				"@wordpress/api-fetch": "^5.2.6",
+				"@wordpress/blob": "^3.2.2",
+				"@wordpress/block-serialization-default-parser": "^4.2.3",
+				"@wordpress/blocks": "^11.1.5",
+				"@wordpress/components": "^19.2.2",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/data": "^6.1.5",
+				"@wordpress/deprecated": "^3.2.3",
+				"@wordpress/dom": "^3.2.7",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/hooks": "^3.2.2",
+				"@wordpress/html-entities": "^3.2.3",
+				"@wordpress/i18n": "^4.2.4",
+				"@wordpress/icons": "^6.1.1",
+				"@wordpress/is-shallow-equal": "^4.2.1",
+				"@wordpress/keyboard-shortcuts": "^3.0.7",
+				"@wordpress/keycodes": "^3.2.4",
+				"@wordpress/notices": "^3.2.8",
+				"@wordpress/rich-text": "^5.0.8",
+				"@wordpress/shortcode": "^3.2.3",
+				"@wordpress/token-list": "^2.2.2",
+				"@wordpress/url": "^3.3.1",
+				"@wordpress/warning": "^2.2.2",
+				"@wordpress/wordcount": "^3.2.3",
+				"classnames": "^2.3.1",
+				"colord": "^2.7.0",
 				"css-mediaquery": "^0.1.2",
 				"diff": "^4.0.2",
 				"dom-scroll-into-view": "^1.2.1",
@@ -3399,90 +3790,88 @@
 				"lodash": "^4.17.21",
 				"memize": "^1.1.0",
 				"react-autosize-textarea": "^7.1.0",
-				"react-spring": "^8.0.19",
+				"react-easy-crop": "^3.0.0",
 				"redux-multi": "^0.1.12",
 				"rememo": "^3.0.0",
-				"tinycolor2": "^1.4.2",
 				"traverse": "^0.6.6"
 			}
 		},
 		"@wordpress/block-library": {
-			"version": "3.2.19",
-			"resolved": "https://registry.npmjs.org/@wordpress/block-library/-/block-library-3.2.19.tgz",
-			"integrity": "sha512-F/Dbg9YYmoQQ9LdtanA1Nn6Bi6z7a5mC9gUankzbl6657Aqw7EcBwvbKfuG3n1TOjbbJZpA2wCCYTge6XNXLWA==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/a11y": "^3.1.2",
-				"@wordpress/api-fetch": "^5.1.2",
-				"@wordpress/autop": "^3.1.2",
-				"@wordpress/blob": "^3.1.2",
-				"@wordpress/block-editor": "^6.1.14",
-				"@wordpress/blocks": "^9.1.8",
-				"@wordpress/components": "^14.1.11",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/core-data": "^3.1.12",
-				"@wordpress/data": "^5.1.6",
-				"@wordpress/date": "^4.1.2",
-				"@wordpress/deprecated": "^3.1.2",
-				"@wordpress/dom": "^3.1.5",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/escape-html": "^2.1.2",
-				"@wordpress/hooks": "^3.1.1",
-				"@wordpress/i18n": "^4.1.2",
-				"@wordpress/icons": "^4.0.3",
-				"@wordpress/is-shallow-equal": "^4.1.1",
-				"@wordpress/keycodes": "^3.1.2",
-				"@wordpress/notices": "^3.1.6",
-				"@wordpress/primitives": "^2.1.2",
-				"@wordpress/reusable-blocks": "^2.1.17",
-				"@wordpress/rich-text": "^4.1.6",
-				"@wordpress/server-side-render": "^2.1.12",
-				"@wordpress/url": "^3.1.2",
-				"@wordpress/viewport": "^3.1.6",
-				"classnames": "^2.2.5",
+			"version": "6.0.25",
+			"resolved": "https://registry.npmjs.org/@wordpress/block-library/-/block-library-6.0.25.tgz",
+			"integrity": "sha512-aHabUm+Oylx3dOnwQmJ45PKBZoC1P45phuYAoof05FK/NwPSnJNgYTBiRUB2H335zKfJJzChIKRUakruY/24XA==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/a11y": "^3.2.4",
+				"@wordpress/api-fetch": "^5.2.6",
+				"@wordpress/autop": "^3.2.3",
+				"@wordpress/blob": "^3.2.2",
+				"@wordpress/block-editor": "^8.0.16",
+				"@wordpress/blocks": "^11.1.5",
+				"@wordpress/components": "^19.2.2",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/core-data": "^4.0.9",
+				"@wordpress/data": "^6.1.5",
+				"@wordpress/date": "^4.2.3",
+				"@wordpress/deprecated": "^3.2.3",
+				"@wordpress/dom": "^3.2.7",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/escape-html": "^2.2.3",
+				"@wordpress/hooks": "^3.2.2",
+				"@wordpress/html-entities": "^3.2.3",
+				"@wordpress/i18n": "^4.2.4",
+				"@wordpress/icons": "^6.1.1",
+				"@wordpress/is-shallow-equal": "^4.2.1",
+				"@wordpress/keycodes": "^3.2.4",
+				"@wordpress/notices": "^3.2.8",
+				"@wordpress/primitives": "^3.0.4",
+				"@wordpress/reusable-blocks": "^3.0.22",
+				"@wordpress/rich-text": "^5.0.8",
+				"@wordpress/server-side-render": "^3.0.19",
+				"@wordpress/url": "^3.3.1",
+				"@wordpress/viewport": "^4.0.7",
+				"classnames": "^2.3.1",
+				"colord": "^2.7.0",
 				"fast-average-color": "4.3.0",
 				"lodash": "^4.17.21",
 				"memize": "^1.1.0",
-				"micromodal": "^0.4.6",
-				"moment": "^2.22.1",
-				"react-easy-crop": "^3.0.0",
-				"tinycolor2": "^1.4.2"
+				"micromodal": "^0.4.10",
+				"moment": "^2.22.1"
 			}
 		},
 		"@wordpress/block-serialization-default-parser": {
-			"version": "4.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-4.1.2.tgz",
-			"integrity": "sha512-jJoXfn6hYYReEl211alNoTFA5Hdgu9LMTkTQJF2g8cGJS5UpDw1lcpJP0hmpfhwzTmUUemy5RXM7noOa2c/RUw==",
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-4.2.3.tgz",
+			"integrity": "sha512-VAgRRijd/gZ0ET7lXXEG4/efK5zaBH4RqFV2VJsnuNDQe8CmtmHoCxQC2cUHHhnm9KpubffvVtK+R0mscSmH2Q==",
 			"requires": {
-				"@babel/runtime": "^7.13.10"
+				"@babel/runtime": "^7.16.0"
 			}
 		},
 		"@wordpress/blocks": {
-			"version": "9.1.8",
-			"resolved": "https://registry.npmjs.org/@wordpress/blocks/-/blocks-9.1.8.tgz",
-			"integrity": "sha512-RYemYN+q5/M0k5mESBkQbsB101p9hWSOTSlGLzEPBj7yXJp/OnyQVdc2hAr6CQgX16CxOyRRXx1CYQdiOtXGYg==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/autop": "^3.1.2",
-				"@wordpress/blob": "^3.1.2",
-				"@wordpress/block-serialization-default-parser": "^4.1.2",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/data": "^5.1.6",
-				"@wordpress/deprecated": "^3.1.2",
-				"@wordpress/dom": "^3.1.5",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/hooks": "^3.1.1",
-				"@wordpress/html-entities": "^3.1.2",
-				"@wordpress/i18n": "^4.1.2",
-				"@wordpress/icons": "^4.0.3",
-				"@wordpress/is-shallow-equal": "^4.1.1",
-				"@wordpress/shortcode": "^3.1.2",
+			"version": "11.1.5",
+			"resolved": "https://registry.npmjs.org/@wordpress/blocks/-/blocks-11.1.5.tgz",
+			"integrity": "sha512-r4xNTQPpUqJ7vqsJqH4D5+GeRQVOLF+9dkeNxkKQnJSFZ5y6POd28d0gMsOcTdGtAzXN6sak104DaKry2SWQNA==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/autop": "^3.2.3",
+				"@wordpress/blob": "^3.2.2",
+				"@wordpress/block-serialization-default-parser": "^4.2.3",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/data": "^6.1.5",
+				"@wordpress/deprecated": "^3.2.3",
+				"@wordpress/dom": "^3.2.7",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/hooks": "^3.2.2",
+				"@wordpress/html-entities": "^3.2.3",
+				"@wordpress/i18n": "^4.2.4",
+				"@wordpress/is-shallow-equal": "^4.2.1",
+				"@wordpress/shortcode": "^3.2.3",
+				"colord": "^2.7.0",
 				"hpq": "^1.3.0",
 				"lodash": "^4.17.21",
 				"rememo": "^3.0.0",
 				"showdown": "^1.9.1",
 				"simple-html-tokenizer": "^0.5.7",
-				"tinycolor2": "^1.4.2",
 				"uuid": "^8.3.0"
 			}
 		},
@@ -3493,84 +3882,86 @@
 			"dev": true
 		},
 		"@wordpress/components": {
-			"version": "14.1.11",
-			"resolved": "https://registry.npmjs.org/@wordpress/components/-/components-14.1.11.tgz",
-			"integrity": "sha512-umsDXCtH0eqOaAVXq/N3f5QO4u9ovo2F+RMg7c566Q+StOgCVw0jRnKuyKQtBb1CEv4IIYIDWp/pL3cId8Vz2w==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@emotion/cache": "^10.0.27",
-				"@emotion/core": "^10.1.1",
-				"@emotion/css": "^10.0.22",
-				"@emotion/styled": "^10.0.23",
-				"@wordpress/a11y": "^3.1.2",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/date": "^4.1.2",
-				"@wordpress/deprecated": "^3.1.2",
-				"@wordpress/dom": "^3.1.5",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/hooks": "^3.1.1",
-				"@wordpress/i18n": "^4.1.2",
-				"@wordpress/icons": "^4.0.3",
-				"@wordpress/is-shallow-equal": "^4.1.1",
-				"@wordpress/keycodes": "^3.1.2",
-				"@wordpress/primitives": "^2.1.2",
-				"@wordpress/rich-text": "^4.1.6",
-				"@wordpress/warning": "^2.1.2",
-				"classnames": "^2.2.5",
+			"version": "19.2.2",
+			"resolved": "https://registry.npmjs.org/@wordpress/components/-/components-19.2.2.tgz",
+			"integrity": "sha512-/bRyC7rteZ+Etieu0SBMpuibYP3lrgzJnCUcHX+L8b5e8AesXL8Ky0Ssz0LQrwZBmWEJuZnkAnP8++16SpVPiw==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@emotion/cache": "^11.4.0",
+				"@emotion/css": "^11.1.3",
+				"@emotion/react": "^11.4.1",
+				"@emotion/styled": "^11.3.0",
+				"@emotion/utils": "1.0.0",
+				"@wordpress/a11y": "^3.2.4",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/date": "^4.2.3",
+				"@wordpress/deprecated": "^3.2.3",
+				"@wordpress/dom": "^3.2.7",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/hooks": "^3.2.2",
+				"@wordpress/i18n": "^4.2.4",
+				"@wordpress/icons": "^6.1.1",
+				"@wordpress/is-shallow-equal": "^4.2.1",
+				"@wordpress/keycodes": "^3.2.4",
+				"@wordpress/primitives": "^3.0.4",
+				"@wordpress/rich-text": "^5.0.8",
+				"@wordpress/warning": "^2.2.2",
+				"classnames": "^2.3.1",
+				"colord": "^2.7.0",
 				"dom-scroll-into-view": "^1.2.1",
 				"downshift": "^6.0.15",
-				"emotion": "^10.0.23",
+				"framer-motion": "^4.1.17",
 				"gradient-parser": "^0.1.5",
 				"highlight-words-core": "^1.2.2",
 				"lodash": "^4.17.21",
 				"memize": "^1.1.0",
 				"moment": "^2.22.1",
 				"re-resizable": "^6.4.0",
+				"react-colorful": "^5.3.1",
 				"react-dates": "^17.1.1",
 				"react-resize-aware": "^3.1.0",
-				"react-spring": "^8.0.20",
 				"react-use-gesture": "^9.0.0",
-				"reakit": "^1.3.5",
+				"reakit": "^1.3.8",
 				"rememo": "^3.0.0",
-				"tinycolor2": "^1.4.2",
 				"uuid": "^8.3.0"
 			}
 		},
 		"@wordpress/compose": {
-			"version": "4.1.6",
-			"resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-4.1.6.tgz",
-			"integrity": "sha512-rzSHBvMMwkR70+qOmSGnZpOEa2fnseGbylR3DEN3IAlscxdAn08Ejyz+bZSQ8GgQ6Uq2OkwvYjHjPUD2llpQ/g==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/deprecated": "^3.1.2",
-				"@wordpress/dom": "^3.1.5",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/is-shallow-equal": "^4.1.1",
-				"@wordpress/keycodes": "^3.1.2",
-				"@wordpress/priority-queue": "^2.1.2",
-				"clipboard": "^2.0.1",
+			"version": "5.0.7",
+			"resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-5.0.7.tgz",
+			"integrity": "sha512-5PJmxW85tlw4lteiXKKycloZ3tNzcKSCYpnZa07XHKHYvq5aoKRrHwh+t3oSnLjjavczVd6Lcd7EQPpD18MSbw==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@types/lodash": "^4.14.172",
+				"@types/mousetrap": "^1.6.8",
+				"@wordpress/deprecated": "^3.2.3",
+				"@wordpress/dom": "^3.2.7",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/is-shallow-equal": "^4.2.1",
+				"@wordpress/keycodes": "^3.2.4",
+				"@wordpress/priority-queue": "^2.2.3",
+				"clipboard": "^2.0.8",
 				"lodash": "^4.17.21",
-				"memize": "^1.1.0",
 				"mousetrap": "^1.6.5",
 				"react-resize-aware": "^3.1.0",
 				"use-memo-one": "^1.1.1"
 			}
 		},
 		"@wordpress/core-data": {
-			"version": "3.1.12",
-			"resolved": "https://registry.npmjs.org/@wordpress/core-data/-/core-data-3.1.12.tgz",
-			"integrity": "sha512-GUvuWc5SQi0eBKi6gaWDz3Xg8eQyAM4YmYPpWNhWP8oNeAwsLL/RM2kXv6O4ssnGGlS/W3zJtLFTy7yDo0c74Q==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/api-fetch": "^5.1.2",
-				"@wordpress/blocks": "^9.1.8",
-				"@wordpress/data": "^5.1.6",
-				"@wordpress/data-controls": "^2.1.6",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/html-entities": "^3.1.2",
-				"@wordpress/i18n": "^4.1.2",
-				"@wordpress/is-shallow-equal": "^4.1.1",
-				"@wordpress/url": "^3.1.2",
+			"version": "4.0.9",
+			"resolved": "https://registry.npmjs.org/@wordpress/core-data/-/core-data-4.0.9.tgz",
+			"integrity": "sha512-BCHqGWLre2GBClI901ar9+S5T0EmNQ56wdYqPE6aZJlTV3/QWgFoL241NqGvjAJ6ipC9+clpwwndX7JFG3juKw==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/api-fetch": "^5.2.6",
+				"@wordpress/blocks": "^11.1.5",
+				"@wordpress/data": "^6.1.5",
+				"@wordpress/deprecated": "^3.2.3",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/html-entities": "^3.2.3",
+				"@wordpress/i18n": "^4.2.4",
+				"@wordpress/is-shallow-equal": "^4.2.1",
+				"@wordpress/url": "^3.3.1",
 				"equivalent-key-map": "^0.2.2",
 				"lodash": "^4.17.21",
 				"rememo": "^3.0.0",
@@ -3578,88 +3969,88 @@
 			}
 		},
 		"@wordpress/custom-templated-path-webpack-plugin": {
-			"version": "2.0.5",
-			"resolved": "https://registry.npmjs.org/@wordpress/custom-templated-path-webpack-plugin/-/custom-templated-path-webpack-plugin-2.0.5.tgz",
-			"integrity": "sha512-8tEcTEkr4tB55UFo0oalmpj54jf3sfTNJEqqnu0VpfB3Zk2lh3nRYmo+/vL1ks5uP47k3+iXYiPEFy9rJ4lGLw==",
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/@wordpress/custom-templated-path-webpack-plugin/-/custom-templated-path-webpack-plugin-2.1.0.tgz",
+			"integrity": "sha512-ObO5PVU3NAl+LHc6g1gMdvg0bNNaIjU9jxy7WBkenQVCaO/rIbmFhTUUXZFhZ0k3UNsWsY7ufpFob3IiBtXbrw==",
 			"dev": true,
 			"requires": {
 				"escape-string-regexp": "^1.0.5"
 			}
 		},
 		"@wordpress/customize-widgets": {
-			"version": "1.0.20",
-			"resolved": "https://registry.npmjs.org/@wordpress/customize-widgets/-/customize-widgets-1.0.20.tgz",
-			"integrity": "sha512-2zHmZ3IcnkXMD+n1FPRjZTvfTkxt1onxe4oqfQjpobdYjPTSMl3HKaYuHB1lBaVN7qw4sOk/3WgB9cH1kqWpqg==",
-			"requires": {
-				"@babel/runtime": "^7.11.2",
-				"@wordpress/a11y": "^3.1.2",
-				"@wordpress/block-editor": "^6.1.14",
-				"@wordpress/block-library": "^3.2.19",
-				"@wordpress/blocks": "^9.1.8",
-				"@wordpress/components": "^14.1.11",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/core-data": "^3.1.12",
-				"@wordpress/data": "^5.1.6",
-				"@wordpress/dom": "^3.1.5",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/hooks": "^3.1.1",
-				"@wordpress/i18n": "^4.1.2",
-				"@wordpress/icons": "^4.0.3",
-				"@wordpress/is-shallow-equal": "^4.1.1",
-				"@wordpress/keyboard-shortcuts": "^2.1.7",
-				"@wordpress/keycodes": "^3.1.2",
-				"@wordpress/media-utils": "^2.1.2",
-				"@wordpress/widgets": "^1.1.19",
-				"classnames": "^2.2.6",
+			"version": "2.0.26",
+			"resolved": "https://registry.npmjs.org/@wordpress/customize-widgets/-/customize-widgets-2.0.26.tgz",
+			"integrity": "sha512-8BKJ3rasSD+H0utiieSoW6YsirPVdzSgyn3Q23d+iHioCNWkbaiaPiSDONFqHxhC3Lb2tc4cJ4WiGb/ucP7sGA==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/a11y": "^3.2.4",
+				"@wordpress/block-editor": "^8.0.16",
+				"@wordpress/block-library": "^6.0.25",
+				"@wordpress/blocks": "^11.1.5",
+				"@wordpress/components": "^19.2.2",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/core-data": "^4.0.9",
+				"@wordpress/data": "^6.1.5",
+				"@wordpress/dom": "^3.2.7",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/hooks": "^3.2.2",
+				"@wordpress/i18n": "^4.2.4",
+				"@wordpress/icons": "^6.1.1",
+				"@wordpress/interface": "^4.1.17",
+				"@wordpress/is-shallow-equal": "^4.2.1",
+				"@wordpress/keyboard-shortcuts": "^3.0.7",
+				"@wordpress/keycodes": "^3.2.4",
+				"@wordpress/media-utils": "^3.0.5",
+				"@wordpress/widgets": "^2.0.22",
+				"classnames": "^2.3.1",
 				"lodash": "^4.17.21"
 			}
 		},
 		"@wordpress/data": {
-			"version": "5.1.6",
-			"resolved": "https://registry.npmjs.org/@wordpress/data/-/data-5.1.6.tgz",
-			"integrity": "sha512-KKcAcYh6XuRXkQvIQOv1/ci5Tj1kXEE2gwNzujN4SytJZmQTNP2EEE8u9bBnhEPoS7bORzlqeNQuMW0Rz74qgg==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/deprecated": "^3.1.2",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/is-shallow-equal": "^4.1.1",
-				"@wordpress/priority-queue": "^2.1.2",
-				"@wordpress/redux-routine": "^4.1.2",
+			"version": "6.1.5",
+			"resolved": "https://registry.npmjs.org/@wordpress/data/-/data-6.1.5.tgz",
+			"integrity": "sha512-v31NAUpDUqlCma2FYqP45cUrCz5EfMH4m6X50c4lbuAV2ScVsWCRxb5X8mgHjZjDhKcp97fbknviCAD/pFEOng==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/deprecated": "^3.2.3",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/is-shallow-equal": "^4.2.1",
+				"@wordpress/priority-queue": "^2.2.3",
+				"@wordpress/redux-routine": "^4.2.2",
 				"equivalent-key-map": "^0.2.2",
 				"is-promise": "^4.0.0",
 				"lodash": "^4.17.21",
 				"memize": "^1.1.0",
-				"redux": "^4.1.0",
 				"turbo-combine-reducers": "^1.0.2",
 				"use-memo-one": "^1.1.1"
 			}
 		},
 		"@wordpress/data-controls": {
-			"version": "2.1.6",
-			"resolved": "https://registry.npmjs.org/@wordpress/data-controls/-/data-controls-2.1.6.tgz",
-			"integrity": "sha512-AON1ZQLGhVQsJQIeW+4D1aB31TBJbDIQUMwnimiMkJ2n0M9V1Q0hvW4P7URC1k2aouNstnF2/TJ4xFPPRINf4Q==",
+			"version": "2.2.8",
+			"resolved": "https://registry.npmjs.org/@wordpress/data-controls/-/data-controls-2.2.8.tgz",
+			"integrity": "sha512-hoaYLeZEmgUBJvHsv5SeGUKx433HfQfJ5sPu/8PiouUK/vr+8rMGM02ydTye6saWAMOHxvOxa08rzIWvWnZg/w==",
 			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/api-fetch": "^5.1.2",
-				"@wordpress/data": "^5.1.6",
-				"@wordpress/deprecated": "^3.1.2"
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/api-fetch": "^5.2.6",
+				"@wordpress/data": "^6.1.5",
+				"@wordpress/deprecated": "^3.2.3"
 			}
 		},
 		"@wordpress/date": {
-			"version": "4.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/date/-/date-4.1.2.tgz",
-			"integrity": "sha512-t1cM1eLCQkLJeypcnFQIBJW0+aS8ZUvZLNSxlMH0jVybF9+bjVIbKY+aRkGwP4OMxxrdQkvF2qFj349bn3nz3Q==",
+			"version": "4.2.3",
+			"resolved": "https://registry.npmjs.org/@wordpress/date/-/date-4.2.3.tgz",
+			"integrity": "sha512-5hZDhFwTtKcbJGZdqvIzoLsW/QgBjUjf4ohgDqRlMBX8Zi6/n11O8LDRPOpmJLVSnIx1fgNSGkzXOzzQmbWuqQ==",
 			"requires": {
-				"@babel/runtime": "^7.13.10",
+				"@babel/runtime": "^7.16.0",
 				"moment": "^2.22.1",
 				"moment-timezone": "^0.5.31"
 			}
 		},
 		"@wordpress/dependency-extraction-webpack-plugin": {
-			"version": "3.1.4",
-			"resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-3.1.4.tgz",
-			"integrity": "sha512-SoFdhgt75symEJz57QwzDrcZzuSZ9Fxxr1adplSHHYfvRXBm/vDM0x6jeb2pHtVWH0Ltax4Z/yelRgv982nNYA==",
+			"version": "3.2.1",
+			"resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-3.2.1.tgz",
+			"integrity": "sha512-Ltd+1CJb7PMh6iN2Mse+3yN/oMORug5qXSj/3xmuZERzZO2SO6xNEJGml8yK9ev747cbHktEpitK4H+8VO3Ekg==",
 			"dev": true,
 			"requires": {
 				"json2php": "^0.0.4",
@@ -3673,9 +4064,9 @@
 					"dev": true
 				},
 				"webpack-sources": {
-					"version": "2.3.0",
-					"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.0.tgz",
-					"integrity": "sha512-WyOdtwSvOML1kbgtXbTDnEW0jkJ7hZr/bDByIwszhWd/4XX1A3XMkrbFMsuH4+/MfLlZCUzlAdg4r7jaGKEIgQ==",
+					"version": "2.3.1",
+					"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz",
+					"integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==",
 					"dev": true,
 					"requires": {
 						"source-list-map": "^2.0.1",
@@ -3685,103 +4076,46 @@
 			}
 		},
 		"@wordpress/deprecated": {
-			"version": "3.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-3.1.2.tgz",
-			"integrity": "sha512-kURIhVWssN6lv4YZNMqeFU8ZHk1Dh3SNbHHDs/Ah4Qcql9uHJisF89lLIQBCs063wgkeXfFxdvM/BXD4kfK6fw==",
+			"version": "3.2.3",
+			"resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-3.2.3.tgz",
+			"integrity": "sha512-YoJos/hW216PIlxbtNyb24kPR3TUFTSsfeVT23SxudW4jhmwM12vkl3KY1RDbhD/qi89OE4k+8xsBo5cM3lCSw==",
 			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/hooks": "^3.1.1"
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/hooks": "^3.2.2"
 			}
 		},
 		"@wordpress/dom": {
-			"version": "3.1.5",
-			"resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-3.1.5.tgz",
-			"integrity": "sha512-EDX1BXtIEHw3LjAunASJO9lnbU2KU1gi4UBrjaa+Cem4u6npmfYHh6XkXO2ryA21yjx7rCWPbD0id6E7qlJ4Tw==",
+			"version": "3.2.7",
+			"resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-3.2.7.tgz",
+			"integrity": "sha512-/e7sFaiwKHWmgqUFsClYw9YI6Wq/eZ1iBsxtGgqX5zrU8KyFJaziNeHDE8tTZLkiURS1vlBQm0mY6bX7Bo4CEA==",
 			"requires": {
-				"@babel/runtime": "^7.13.10",
+				"@babel/runtime": "^7.16.0",
 				"lodash": "^4.17.21"
 			}
 		},
 		"@wordpress/dom-ready": {
-			"version": "3.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-3.1.2.tgz",
-			"integrity": "sha512-g2zmgC/+6JYgWYzUMByRmjRAXs75q57wnNdYUTXmRFrtLs2+PNa1bUuYWZop15rTZbxuvP6ScVnPxZ5tyQLRUw==",
+			"version": "3.2.3",
+			"resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-3.2.3.tgz",
+			"integrity": "sha512-AvHrfYFflycWRX8CIU7UGty05aXrKvILwrNT2YRXmOmgh+POud98QQU54hitwL2cyVkWUt8dvCNRK4nnjBqqJQ==",
 			"requires": {
-				"@babel/runtime": "^7.13.10"
+				"@babel/runtime": "^7.16.0"
 			}
 		},
 		"@wordpress/e2e-test-utils": {
-			"version": "5.4.3",
-			"resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils/-/e2e-test-utils-5.4.3.tgz",
-			"integrity": "sha512-DDLIO/QZipMLpqfiYB570nVtxOGlC9ByZkyd/+dqjwViBc7ST9pWMQzQPahlGjkArU2EMB96fvPumPnjrReZOA==",
+			"version": "5.4.10",
+			"resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils/-/e2e-test-utils-5.4.10.tgz",
+			"integrity": "sha512-JRp1f7uQ9INpN3t0x4X07P3uBMwaitou9lvYWpDwVsHRcDn21NyFpVYbsX/T63ADIpvcqIhql58RnkVJRUWYxg==",
 			"dev": true,
 			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/api-fetch": "^5.2.2",
-				"@wordpress/keycodes": "^3.2.2",
-				"@wordpress/url": "^3.2.2",
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/api-fetch": "^5.2.6",
+				"@wordpress/keycodes": "^3.2.4",
+				"@wordpress/url": "^3.3.1",
 				"form-data": "^4.0.0",
 				"lodash": "^4.17.21",
 				"node-fetch": "^2.6.0"
 			},
 			"dependencies": {
-				"@wordpress/api-fetch": {
-					"version": "5.2.2",
-					"resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-5.2.2.tgz",
-					"integrity": "sha512-WwJHOe6qiI4Oa1BSSo+Fpietdtm/0UgaN5A9k/TlEkARqIE+Fh56sfbC3JbjJDfQxz9TsAxMm+WWO5aNapantQ==",
-					"dev": true,
-					"requires": {
-						"@babel/runtime": "^7.13.10",
-						"@wordpress/i18n": "^4.2.2",
-						"@wordpress/url": "^3.2.2"
-					}
-				},
-				"@wordpress/hooks": {
-					"version": "3.2.0",
-					"resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-3.2.0.tgz",
-					"integrity": "sha512-nVR6V9kPxl8+aYQzQJdoDt+aKBKHHD0zplcYZbu2MHxjmHMvppAeL9mjzVhQZj/3n10NR2Ftk94mHQzHWfhCCg==",
-					"dev": true,
-					"requires": {
-						"@babel/runtime": "^7.13.10"
-					}
-				},
-				"@wordpress/i18n": {
-					"version": "4.2.2",
-					"resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-4.2.2.tgz",
-					"integrity": "sha512-6PrfTDpeW5dfWyuqUx4Z5ApKFbh45CAbCs/G3PuZLlKJlXs/8p2Oq6Zxs0gLZk1QfHkw0t5qMx61lDlxWQhuPw==",
-					"dev": true,
-					"requires": {
-						"@babel/runtime": "^7.13.10",
-						"@wordpress/hooks": "^3.2.0",
-						"gettext-parser": "^1.3.1",
-						"lodash": "^4.17.21",
-						"memize": "^1.1.0",
-						"sprintf-js": "^1.1.1",
-						"tannin": "^1.2.0"
-					}
-				},
-				"@wordpress/keycodes": {
-					"version": "3.2.2",
-					"resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-3.2.2.tgz",
-					"integrity": "sha512-z4B4vby+iGciJ9gvUBIozsseDkdQXDNuWm5szMnG5g1Nn7UGDWmfCNc9IHNs3alXySmAFev6d0T/o/zgm9BBvQ==",
-					"dev": true,
-					"requires": {
-						"@babel/runtime": "^7.13.10",
-						"@wordpress/i18n": "^4.2.2",
-						"lodash": "^4.17.21"
-					}
-				},
-				"@wordpress/url": {
-					"version": "3.2.2",
-					"resolved": "https://registry.npmjs.org/@wordpress/url/-/url-3.2.2.tgz",
-					"integrity": "sha512-TYWE7V9F8nj0ZkCJy1eFD0crdDTS7iB3cVNW2yIDOn1RTWJJtzINXQFMASokVsjuh+NetAIOu8ru2mIfoRMG8Q==",
-					"dev": true,
-					"requires": {
-						"@babel/runtime": "^7.13.10",
-						"lodash": "^4.17.21",
-						"react-native-url-polyfill": "^1.1.2"
-					}
-				},
 				"form-data": {
 					"version": "4.0.0",
 					"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
@@ -3796,38 +4130,37 @@
 			}
 		},
 		"@wordpress/edit-post": {
-			"version": "4.1.21",
-			"resolved": "https://registry.npmjs.org/@wordpress/edit-post/-/edit-post-4.1.21.tgz",
-			"integrity": "sha512-tthVG2vA/cEkM5Ksb+AWlfYdRQRh3TE45C0NPMTjRTQaETJjZGZp1VCVl6f+EBMIiW90mzgOfP6t0bvDHBtcFg==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/a11y": "^3.1.2",
-				"@wordpress/api-fetch": "^5.1.2",
-				"@wordpress/block-editor": "^6.1.14",
-				"@wordpress/block-library": "^3.2.19",
-				"@wordpress/blocks": "^9.1.8",
-				"@wordpress/components": "^14.1.11",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/core-data": "^3.1.12",
-				"@wordpress/data": "^5.1.6",
-				"@wordpress/data-controls": "^2.1.6",
-				"@wordpress/editor": "^10.1.17",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/hooks": "^3.1.1",
-				"@wordpress/i18n": "^4.1.2",
-				"@wordpress/icons": "^4.0.3",
-				"@wordpress/interface": "^3.1.12",
-				"@wordpress/keyboard-shortcuts": "^2.1.7",
-				"@wordpress/keycodes": "^3.1.2",
-				"@wordpress/media-utils": "^2.1.2",
-				"@wordpress/notices": "^3.1.6",
-				"@wordpress/plugins": "^3.1.6",
-				"@wordpress/primitives": "^2.1.2",
-				"@wordpress/url": "^3.1.2",
-				"@wordpress/viewport": "^3.1.6",
-				"@wordpress/warning": "^2.1.2",
-				"classnames": "^2.2.5",
-				"framer-motion": "^4.1.3",
+			"version": "5.0.26",
+			"resolved": "https://registry.npmjs.org/@wordpress/edit-post/-/edit-post-5.0.26.tgz",
+			"integrity": "sha512-KCws7pLvjxaOnPjMtEgmxEt3+bZt2qu1GdtP3LaPpQVBuvYVZUtHf3KLZcwlBJscBony/4XZBdvmGSvlUX050Q==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/a11y": "^3.2.4",
+				"@wordpress/api-fetch": "^5.2.6",
+				"@wordpress/block-editor": "^8.0.16",
+				"@wordpress/block-library": "^6.0.25",
+				"@wordpress/blocks": "^11.1.5",
+				"@wordpress/components": "^19.2.2",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/core-data": "^4.0.9",
+				"@wordpress/data": "^6.1.5",
+				"@wordpress/data-controls": "^2.2.8",
+				"@wordpress/editor": "^12.0.20",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/hooks": "^3.2.2",
+				"@wordpress/i18n": "^4.2.4",
+				"@wordpress/icons": "^6.1.1",
+				"@wordpress/interface": "^4.1.17",
+				"@wordpress/keyboard-shortcuts": "^3.0.7",
+				"@wordpress/keycodes": "^3.2.4",
+				"@wordpress/media-utils": "^3.0.5",
+				"@wordpress/notices": "^3.2.8",
+				"@wordpress/plugins": "^4.0.7",
+				"@wordpress/primitives": "^3.0.4",
+				"@wordpress/url": "^3.3.1",
+				"@wordpress/viewport": "^4.0.7",
+				"@wordpress/warning": "^2.2.2",
+				"classnames": "^2.3.1",
 				"lodash": "^4.17.21",
 				"memize": "^1.1.0",
 				"rememo": "^3.0.0",
@@ -3841,77 +4174,118 @@
 				}
 			}
 		},
+		"@wordpress/edit-site": {
+			"version": "3.0.26",
+			"resolved": "https://registry.npmjs.org/@wordpress/edit-site/-/edit-site-3.0.26.tgz",
+			"integrity": "sha512-KqpImFUS3cBT9gOcJENCm1j7vPpmQ+0k/zybZk+sYIWIR6hCcWo1HuKIJCfYTcBuQZG45r8ggtDeebrthjaT8Q==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/a11y": "^3.2.4",
+				"@wordpress/api-fetch": "^5.2.6",
+				"@wordpress/block-editor": "^8.0.16",
+				"@wordpress/block-library": "^6.0.25",
+				"@wordpress/blocks": "^11.1.5",
+				"@wordpress/components": "^19.2.2",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/core-data": "^4.0.9",
+				"@wordpress/data": "^6.1.5",
+				"@wordpress/data-controls": "^2.2.8",
+				"@wordpress/editor": "^12.0.20",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/hooks": "^3.2.2",
+				"@wordpress/html-entities": "^3.2.3",
+				"@wordpress/i18n": "^4.2.4",
+				"@wordpress/icons": "^6.1.1",
+				"@wordpress/interface": "^4.1.17",
+				"@wordpress/keyboard-shortcuts": "^3.0.7",
+				"@wordpress/keycodes": "^3.2.4",
+				"@wordpress/media-utils": "^3.0.5",
+				"@wordpress/notices": "^3.2.8",
+				"@wordpress/plugins": "^4.0.7",
+				"@wordpress/primitives": "^3.0.4",
+				"@wordpress/reusable-blocks": "^3.0.22",
+				"@wordpress/url": "^3.3.1",
+				"@wordpress/viewport": "^4.0.7",
+				"classnames": "^2.3.1",
+				"downloadjs": "^1.4.7",
+				"file-saver": "^2.0.2",
+				"history": "^5.1.0",
+				"jszip": "^3.2.2",
+				"lodash": "^4.17.21",
+				"rememo": "^3.0.0"
+			}
+		},
 		"@wordpress/edit-widgets": {
-			"version": "2.1.21",
-			"resolved": "https://registry.npmjs.org/@wordpress/edit-widgets/-/edit-widgets-2.1.21.tgz",
-			"integrity": "sha512-dkINHh3yPJnCtqXfcKX0+Wf85ztGJLEnt35pUdcif6fkxDvBciYX6maezo+m+r6TgI0J9wUO2t9+G6kX6bda0Q==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/a11y": "^3.1.2",
-				"@wordpress/api-fetch": "^5.1.2",
-				"@wordpress/block-editor": "^6.1.14",
-				"@wordpress/block-library": "^3.2.19",
-				"@wordpress/blocks": "^9.1.8",
-				"@wordpress/components": "^14.1.11",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/core-data": "^3.1.12",
-				"@wordpress/data": "^5.1.6",
-				"@wordpress/data-controls": "^2.1.6",
-				"@wordpress/dom": "^3.1.5",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/hooks": "^3.1.1",
-				"@wordpress/i18n": "^4.1.2",
-				"@wordpress/icons": "^4.0.3",
-				"@wordpress/interface": "^3.1.12",
-				"@wordpress/keyboard-shortcuts": "^2.1.7",
-				"@wordpress/keycodes": "^3.1.2",
-				"@wordpress/media-utils": "^2.1.2",
-				"@wordpress/notices": "^3.1.6",
-				"@wordpress/plugins": "^3.1.6",
-				"@wordpress/reusable-blocks": "^2.1.17",
-				"@wordpress/server-side-render": "^2.1.12",
-				"@wordpress/url": "^3.1.2",
-				"@wordpress/widgets": "^1.1.19",
-				"classnames": "^2.2.5",
+			"version": "3.1.21",
+			"resolved": "https://registry.npmjs.org/@wordpress/edit-widgets/-/edit-widgets-3.1.21.tgz",
+			"integrity": "sha512-5jQ6XMmMgKP8dbp0ts29OHOFg0b2f+2hwvSij2lWH1dPogQ29oDfDdFkUu+3+8n2hJU7K2ShGq/xhMhT0+fTkw==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/a11y": "^3.2.4",
+				"@wordpress/api-fetch": "^5.2.6",
+				"@wordpress/block-editor": "^8.0.16",
+				"@wordpress/block-library": "^6.0.25",
+				"@wordpress/blocks": "^11.1.5",
+				"@wordpress/components": "^19.2.2",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/core-data": "^4.0.9",
+				"@wordpress/data": "^6.1.5",
+				"@wordpress/dom": "^3.2.7",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/hooks": "^3.2.2",
+				"@wordpress/i18n": "^4.2.4",
+				"@wordpress/icons": "^6.1.1",
+				"@wordpress/interface": "^4.1.17",
+				"@wordpress/keyboard-shortcuts": "^3.0.7",
+				"@wordpress/keycodes": "^3.2.4",
+				"@wordpress/media-utils": "^3.0.5",
+				"@wordpress/notices": "^3.2.8",
+				"@wordpress/plugins": "^4.0.7",
+				"@wordpress/reusable-blocks": "^3.0.22",
+				"@wordpress/server-side-render": "^3.0.19",
+				"@wordpress/url": "^3.3.1",
+				"@wordpress/widgets": "^2.0.22",
+				"classnames": "^2.3.1",
 				"lodash": "^4.17.21",
 				"rememo": "^3.0.0",
 				"uuid": "^8.3.0"
 			}
 		},
 		"@wordpress/editor": {
-			"version": "10.1.17",
-			"resolved": "https://registry.npmjs.org/@wordpress/editor/-/editor-10.1.17.tgz",
-			"integrity": "sha512-ALvuojonwMEjWN1tbQR+mZF3ggR/fdkvOKe4esxRL3U10eTfcsSw6qA2QzB8zHrjb1cZd/90gZWixAdE398f+w==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/api-fetch": "^5.1.2",
-				"@wordpress/autop": "^3.1.2",
-				"@wordpress/blob": "^3.1.2",
-				"@wordpress/block-editor": "^6.1.14",
-				"@wordpress/blocks": "^9.1.8",
-				"@wordpress/components": "^14.1.11",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/core-data": "^3.1.12",
-				"@wordpress/data": "^5.1.6",
-				"@wordpress/data-controls": "^2.1.6",
-				"@wordpress/date": "^4.1.2",
-				"@wordpress/deprecated": "^3.1.2",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/hooks": "^3.1.1",
-				"@wordpress/html-entities": "^3.1.2",
-				"@wordpress/i18n": "^4.1.2",
-				"@wordpress/icons": "^4.0.3",
-				"@wordpress/is-shallow-equal": "^4.1.1",
-				"@wordpress/keyboard-shortcuts": "^2.1.7",
-				"@wordpress/keycodes": "^3.1.2",
-				"@wordpress/media-utils": "^2.1.2",
-				"@wordpress/notices": "^3.1.6",
-				"@wordpress/reusable-blocks": "^2.1.17",
-				"@wordpress/rich-text": "^4.1.6",
-				"@wordpress/server-side-render": "^2.1.12",
-				"@wordpress/url": "^3.1.2",
-				"@wordpress/wordcount": "^3.1.2",
-				"classnames": "^2.2.5",
+			"version": "12.0.20",
+			"resolved": "https://registry.npmjs.org/@wordpress/editor/-/editor-12.0.20.tgz",
+			"integrity": "sha512-+b1WiBKv2ZTcPcJTbxsvLYjAe8pG2aZvFoW4rt7jqXvyV4sf1cgJeVSeGEuydNuGPIuMGo1jLWsQiU+otEjGLA==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/a11y": "^3.2.4",
+				"@wordpress/api-fetch": "^5.2.6",
+				"@wordpress/autop": "^3.2.3",
+				"@wordpress/blob": "^3.2.2",
+				"@wordpress/block-editor": "^8.0.16",
+				"@wordpress/blocks": "^11.1.5",
+				"@wordpress/components": "^19.2.2",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/core-data": "^4.0.9",
+				"@wordpress/data": "^6.1.5",
+				"@wordpress/data-controls": "^2.2.8",
+				"@wordpress/date": "^4.2.3",
+				"@wordpress/deprecated": "^3.2.3",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/hooks": "^3.2.2",
+				"@wordpress/html-entities": "^3.2.3",
+				"@wordpress/i18n": "^4.2.4",
+				"@wordpress/icons": "^6.1.1",
+				"@wordpress/is-shallow-equal": "^4.2.1",
+				"@wordpress/keyboard-shortcuts": "^3.0.7",
+				"@wordpress/keycodes": "^3.2.4",
+				"@wordpress/media-utils": "^3.0.5",
+				"@wordpress/notices": "^3.2.8",
+				"@wordpress/reusable-blocks": "^3.0.22",
+				"@wordpress/rich-text": "^5.0.8",
+				"@wordpress/server-side-render": "^3.0.19",
+				"@wordpress/url": "^3.3.1",
+				"@wordpress/wordcount": "^3.2.3",
+				"classnames": "^2.3.1",
 				"lodash": "^4.17.21",
 				"memize": "^1.1.0",
 				"react-autosize-textarea": "^7.1.0",
@@ -3919,42 +4293,42 @@
 			}
 		},
 		"@wordpress/element": {
-			"version": "3.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/element/-/element-3.1.2.tgz",
-			"integrity": "sha512-6ZDhwXkkohcocZSXp+IE4Xn774+PNHJTNsEOLJRAeDo/clIvly5HoczX03z1GLgvEB3VYik8qHaqrouNIcjZvA==",
+			"version": "4.0.4",
+			"resolved": "https://registry.npmjs.org/@wordpress/element/-/element-4.0.4.tgz",
+			"integrity": "sha512-GbYVSZrHitOmupQCjb7cSlewVigXHorpZUBpvWnkU3rhyh1tF/N9qve3fgg7Q3s2szjtTP+eEutB+4mmkwHQOA==",
 			"requires": {
-				"@babel/runtime": "^7.13.10",
+				"@babel/runtime": "^7.16.0",
 				"@types/react": "^16.9.0",
 				"@types/react-dom": "^16.9.0",
-				"@wordpress/escape-html": "^2.1.2",
+				"@wordpress/escape-html": "^2.2.3",
 				"lodash": "^4.17.21",
-				"react": "^16.13.1",
-				"react-dom": "^16.13.1"
+				"react": "^17.0.1",
+				"react-dom": "^17.0.1"
 			}
 		},
 		"@wordpress/escape-html": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-2.1.2.tgz",
-			"integrity": "sha512-nEKvwzjMkuyV5MBnD5Um/McydurQ65mLjV1NG8bVlljZlP6/263qdZ5otH2uwr6cf2Lz1meupmi9sV3ef4TalQ==",
+			"version": "2.2.3",
+			"resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-2.2.3.tgz",
+			"integrity": "sha512-nYIwT8WzHfAzjjwHLiwDQWrzn4/gUNr5zud465XQszM2cAItN2wnC26/ovSpPomDGkvjcG0YltgnSqc1T62olA==",
 			"requires": {
-				"@babel/runtime": "^7.13.10"
+				"@babel/runtime": "^7.16.0"
 			}
 		},
 		"@wordpress/eslint-plugin": {
-			"version": "9.1.1",
-			"resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-9.1.1.tgz",
-			"integrity": "sha512-GduOwoTTHh132RHTfLU82ujOmzuLpkA9izq+gzKtzhoDGzcpORXIht7tnbB8fzima4PYIiePz2LmuMCSuP18RA==",
+			"version": "9.3.0",
+			"resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-9.3.0.tgz",
+			"integrity": "sha512-9F7B60gHAjiTIi9vBw5ZoH0MZW3UnmbuKols4kWpJVdgsvG4X1Wj6XXTLmQKrzh/Em7mD1CCIbCSyWknEzIOLw==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/eslint-plugin": "^4.15.0",
-				"@typescript-eslint/parser": "^4.15.0",
-				"@wordpress/prettier-config": "^1.1.0",
-				"babel-eslint": "^10.1.0",
+				"@babel/eslint-parser": "^7.16.0",
+				"@typescript-eslint/eslint-plugin": "^4.31.0",
+				"@typescript-eslint/parser": "^4.31.0",
+				"@wordpress/prettier-config": "^1.1.1",
 				"cosmiconfig": "^7.0.0",
 				"eslint-config-prettier": "^7.1.0",
-				"eslint-plugin-import": "^2.23.4",
+				"eslint-plugin-import": "^2.25.2",
 				"eslint-plugin-jest": "^24.1.3",
-				"eslint-plugin-jsdoc": "^34.1.0",
+				"eslint-plugin-jsdoc": "^36.0.8",
 				"eslint-plugin-jsx-a11y": "^6.4.1",
 				"eslint-plugin-prettier": "^3.3.0",
 				"eslint-plugin-react": "^7.22.0",
@@ -3995,50 +4369,50 @@
 			}
 		},
 		"@wordpress/format-library": {
-			"version": "2.1.14",
-			"resolved": "https://registry.npmjs.org/@wordpress/format-library/-/format-library-2.1.14.tgz",
-			"integrity": "sha512-INmmTyJX0FDBkG8PTJqvIBi+yTfYHpdpkWqP/JswG7kslrG++elm4jyrA2EsV1anZyxDfsSrP3aSCy+arYkTgA==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/a11y": "^3.1.2",
-				"@wordpress/block-editor": "^6.1.14",
-				"@wordpress/components": "^14.1.11",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/data": "^5.1.6",
-				"@wordpress/dom": "^3.1.5",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/html-entities": "^3.1.2",
-				"@wordpress/i18n": "^4.1.2",
-				"@wordpress/icons": "^4.0.3",
-				"@wordpress/keycodes": "^3.1.2",
-				"@wordpress/rich-text": "^4.1.6",
-				"@wordpress/url": "^3.1.2",
+			"version": "3.0.22",
+			"resolved": "https://registry.npmjs.org/@wordpress/format-library/-/format-library-3.0.22.tgz",
+			"integrity": "sha512-lVVPW7w78Ip/6wOf+yXOmLnusnZ7pXioqKRoxeJCVnwq/xKb9O5vmiB2Izc7lZjPYxyKnC2LK+qEaZEctJwN/A==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/a11y": "^3.2.4",
+				"@wordpress/block-editor": "^8.0.16",
+				"@wordpress/components": "^19.2.2",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/data": "^6.1.5",
+				"@wordpress/dom": "^3.2.7",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/html-entities": "^3.2.3",
+				"@wordpress/i18n": "^4.2.4",
+				"@wordpress/icons": "^6.1.1",
+				"@wordpress/keycodes": "^3.2.4",
+				"@wordpress/rich-text": "^5.0.8",
+				"@wordpress/url": "^3.3.1",
 				"lodash": "^4.17.21"
 			}
 		},
 		"@wordpress/hooks": {
-			"version": "3.1.1",
-			"resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-3.1.1.tgz",
-			"integrity": "sha512-9f6H9WBwu6x/MM4ZCVLGGBuMiBcyaLapmAku5IwcWaeB2PtPduwjmk2NfGx35TuhBQD554DUg8WtTjIS019UAg==",
+			"version": "3.2.2",
+			"resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-3.2.2.tgz",
+			"integrity": "sha512-MlFWyu2ttJhmzDFBVWPRwZwIMqQdHFZTjFWFWm50NlzUzIJ3gEtNA95mHNtav1Fone24N+I2YkaYMNb6PEPTyA==",
 			"requires": {
-				"@babel/runtime": "^7.13.10"
+				"@babel/runtime": "^7.16.0"
 			}
 		},
 		"@wordpress/html-entities": {
-			"version": "3.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-3.1.2.tgz",
-			"integrity": "sha512-pPbEBxUTZm9YA/ynq50UEGmefaqFIW4g07KrxDQfa+xm0jb3kFZOtxFqdX7gXNofNCn/f5v4jlpFGmmYYpJMaw==",
+			"version": "3.2.3",
+			"resolved": "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-3.2.3.tgz",
+			"integrity": "sha512-406VUz8CuKgKGrW/wjRB877soSqGhGDwK4sSuNoIC1FvpfniZ0ijpqfsdhJOOynWdz+RYN1wAsfogBpzuREJOg==",
 			"requires": {
-				"@babel/runtime": "^7.13.10"
+				"@babel/runtime": "^7.16.0"
 			}
 		},
 		"@wordpress/i18n": {
-			"version": "4.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-4.1.2.tgz",
-			"integrity": "sha512-Bp0BnGoN2XQyhFjACh74f3fDIQx/AnBIyZsDIhSlNYedFjuJ9b4M246/YTmCDlRHyCqLyG/OuS0hEZKksKAoRQ==",
+			"version": "4.2.4",
+			"resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-4.2.4.tgz",
+			"integrity": "sha512-36PnV7wTaLKCb+JZoapR3AtfrLTluhO5bIR6cUTG+QBBJ+g3gjRAdNFihnV8kz66FANu8PqDMI0T1jow/mrbYw==",
 			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/hooks": "^3.1.1",
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/hooks": "^3.2.2",
 				"gettext-parser": "^1.3.1",
 				"lodash": "^4.17.21",
 				"memize": "^1.1.0",
@@ -4047,94 +4421,95 @@
 			}
 		},
 		"@wordpress/icons": {
-			"version": "4.0.3",
-			"resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-4.0.3.tgz",
-			"integrity": "sha512-I68iAysutXkYP6JrvnPlha/DKtNhtI1u88PuroZC/RgG+R0WwmxphB/bPoj92BCYDjgrMI8P625Ivttuh1spFA==",
+			"version": "6.1.1",
+			"resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-6.1.1.tgz",
+			"integrity": "sha512-UaFAOF8hqlEhjTm5kba0JwSDDeEgPSJToDJNADoz8jkxt22kEG5ACi9IaS0BRIy1X7kR6QaCE394v9+GkToE+g==",
 			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/primitives": "^2.1.2"
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/primitives": "^3.0.4"
 			}
 		},
 		"@wordpress/interface": {
-			"version": "3.1.12",
-			"resolved": "https://registry.npmjs.org/@wordpress/interface/-/interface-3.1.12.tgz",
-			"integrity": "sha512-t7ksL3IIlWB47+r8UJ9CyAZZVlEVbA7lN9aqA5Ly6+QPIPwtvATDDM1agiUjGPwGLAsFSoZyda9MDjfVNDvXmw==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/components": "^14.1.11",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/data": "^5.1.6",
-				"@wordpress/deprecated": "^3.1.2",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/i18n": "^4.1.2",
-				"@wordpress/icons": "^4.0.3",
-				"@wordpress/plugins": "^3.1.6",
-				"@wordpress/viewport": "^3.1.6",
-				"classnames": "^2.2.5",
+			"version": "4.1.17",
+			"resolved": "https://registry.npmjs.org/@wordpress/interface/-/interface-4.1.17.tgz",
+			"integrity": "sha512-n+oE/DBTxAHHuWd78bZgFn8FXpmCyfgM+ndJzPnfgdM1KENdEE9qrcVaeqzDpf/zdpYK92OsX35x202nbbMZYQ==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/a11y": "^3.2.4",
+				"@wordpress/components": "^19.2.2",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/data": "^6.1.5",
+				"@wordpress/deprecated": "^3.2.3",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/i18n": "^4.2.4",
+				"@wordpress/icons": "^6.1.1",
+				"@wordpress/plugins": "^4.0.7",
+				"@wordpress/viewport": "^4.0.7",
+				"classnames": "^2.3.1",
 				"lodash": "^4.17.21"
 			}
 		},
 		"@wordpress/is-shallow-equal": {
-			"version": "4.1.1",
-			"resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-4.1.1.tgz",
-			"integrity": "sha512-Bc782s4Kte98RKLtuDXOaUBpyJWUgN4XZJevEoFasKQTpABZUDF+Y2C0/dhnlJeYF5TDEd8TQgFfpF5csxEUNw==",
+			"version": "4.2.1",
+			"resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-4.2.1.tgz",
+			"integrity": "sha512-XczqD3S6euQcSlLY+RFmmQIOwI/X/R/Q1uXS7vPVOnhz6MH63nrmGOtq4vTTzWv+qyRMPSkq0nmuX31U7DNdRA==",
 			"requires": {
-				"@babel/runtime": "^7.13.10"
+				"@babel/runtime": "^7.16.0"
 			}
 		},
 		"@wordpress/jest-console": {
-			"version": "4.1.0",
-			"resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-4.1.0.tgz",
-			"integrity": "sha512-MAbEfYUH+odlYYtPNKoKnWzSZKZjSc2r2kvFJ7FR920ZdteEgSAPIOvjyv4r4UbJy3ZuKemnXHuVtcTAKca5Tw==",
+			"version": "4.1.1",
+			"resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-4.1.1.tgz",
+			"integrity": "sha512-f/DwduxU6k53tULurpCox4TKzp877+IWTHRUxE91+FOXS+2OsnhUPKfMiMEex4nu81a54EArwekPVKxaq4swbA==",
 			"dev": true,
 			"requires": {
-				"@babel/runtime": "^7.13.10",
+				"@babel/runtime": "^7.16.0",
 				"jest-matcher-utils": "^26.6.2",
 				"lodash": "^4.17.21"
 			}
 		},
 		"@wordpress/jest-preset-default": {
-			"version": "7.1.0",
-			"resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-7.1.0.tgz",
-			"integrity": "sha512-N6OwVfvNodRTgIkmBor6YOGx3FbLdvPp9ZTGHJ1uw1u+HUuPwVWN9nhcGTnuP8Ht2RWyN5VpN2Peo5+dz5gp0w==",
+			"version": "7.1.3",
+			"resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-7.1.3.tgz",
+			"integrity": "sha512-rz9V/YRr3TjLdZJQu7DAZHo848PpZ4N5ThtP4Lujy1O/UtcvtKF0r34SZTNDlFQO/G1USZQX/WL6HRhgl57iHA==",
 			"dev": true,
 			"requires": {
 				"@wojtekmaj/enzyme-adapter-react-17": "^0.6.1",
-				"@wordpress/jest-console": "^4.1.0",
+				"@wordpress/jest-console": "^4.1.1",
 				"babel-jest": "^26.6.3",
 				"enzyme": "^3.11.0",
 				"enzyme-to-json": "^3.4.4"
 			}
 		},
 		"@wordpress/keyboard-shortcuts": {
-			"version": "2.1.7",
-			"resolved": "https://registry.npmjs.org/@wordpress/keyboard-shortcuts/-/keyboard-shortcuts-2.1.7.tgz",
-			"integrity": "sha512-V04mCe0Uwxhe2qIkfJ4h5//KsngZA25G/3kI0Ab6vL2N8OrQZQojZ4fnCK3x/P7mvdjXKQn78+vjnp3KiMvRqg==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/data": "^5.1.6",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/keycodes": "^3.1.2",
+			"version": "3.0.7",
+			"resolved": "https://registry.npmjs.org/@wordpress/keyboard-shortcuts/-/keyboard-shortcuts-3.0.7.tgz",
+			"integrity": "sha512-qBlM4Wa1ntzX7MQM7oifOKnHgH+sWGdynmut4rCuCUqfGqqB6hwBE3nkg3sMMWYKTxA8AtE8wcxPr9bQffnx1w==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/data": "^6.1.5",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/keycodes": "^3.2.4",
 				"lodash": "^4.17.21",
 				"rememo": "^3.0.0"
 			}
 		},
 		"@wordpress/keycodes": {
-			"version": "3.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-3.1.2.tgz",
-			"integrity": "sha512-8N0JiHquULMezdWEAu/MjaW5cQ4EN8z61HkA4/sIIB8JPd2TvNEkE1SeEotzpPICcBitEoQzclQ3uOUPld0WAg==",
+			"version": "3.2.4",
+			"resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-3.2.4.tgz",
+			"integrity": "sha512-o6/WFO8Amoyk3r3JtCJ1ctt0bLfvCqyfV7SdA39QDtAe8ufIkDNRwyQOjzaVMbHznNCuBL1FhClPzGy+RH0o9w==",
 			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/i18n": "^4.1.2",
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/i18n": "^4.2.4",
 				"lodash": "^4.17.21"
 			}
 		},
 		"@wordpress/library-export-default-webpack-plugin": {
-			"version": "2.0.5",
-			"resolved": "https://registry.npmjs.org/@wordpress/library-export-default-webpack-plugin/-/library-export-default-webpack-plugin-2.0.5.tgz",
-			"integrity": "sha512-qqyna9btIqoQ3XhdvG3+0rEibgpt2EKCwwyZ7o6IN1TeyiR9ymgHSVwE2yOK9wKcAVyBayFCpN1Sy4MEzpwhog==",
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/@wordpress/library-export-default-webpack-plugin/-/library-export-default-webpack-plugin-2.2.0.tgz",
+			"integrity": "sha512-FW3lmSlqmQv5u2A4vT9BqYwFmBaUuseH1X0bpajTY1sGNzguoh4hmw5Jvjq208+zut7F3rX5tEAJFcaI3fMycA==",
 			"dev": true,
 			"requires": {
 				"lodash": "^4.17.21",
@@ -4148,9 +4523,9 @@
 					"dev": true
 				},
 				"webpack-sources": {
-					"version": "2.3.0",
-					"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.0.tgz",
-					"integrity": "sha512-WyOdtwSvOML1kbgtXbTDnEW0jkJ7hZr/bDByIwszhWd/4XX1A3XMkrbFMsuH4+/MfLlZCUzlAdg4r7jaGKEIgQ==",
+					"version": "2.3.1",
+					"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz",
+					"integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==",
 					"dev": true,
 					"requires": {
 						"source-list-map": "^2.0.1",
@@ -4160,40 +4535,40 @@
 			}
 		},
 		"@wordpress/list-reusable-blocks": {
-			"version": "2.1.11",
-			"resolved": "https://registry.npmjs.org/@wordpress/list-reusable-blocks/-/list-reusable-blocks-2.1.11.tgz",
-			"integrity": "sha512-/y9YbYKL0E0jGs0QJHzdAK3OHrpWec9/dt2oy/RkB6+r+SjHUMBbCyxtL67SPhqZAliXDO10tJSih0OFK0gULw==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/api-fetch": "^5.1.2",
-				"@wordpress/components": "^14.1.11",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/i18n": "^4.1.2",
+			"version": "3.0.19",
+			"resolved": "https://registry.npmjs.org/@wordpress/list-reusable-blocks/-/list-reusable-blocks-3.0.19.tgz",
+			"integrity": "sha512-MUg+nZqlh9MVS38rPqEk3QWO/qsKOrecAGQgvn3uKBy1lcFE9NkUmcON227IAjRI/UQ3dzxFIiJMaMyraJ0r1w==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/api-fetch": "^5.2.6",
+				"@wordpress/components": "^19.2.2",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/i18n": "^4.2.4",
 				"lodash": "^4.17.21"
 			}
 		},
 		"@wordpress/media-utils": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/media-utils/-/media-utils-2.1.2.tgz",
-			"integrity": "sha512-LhZ52JdLz4Lwr1H1YB90pAHTlAowv9R2HwQXjjmKmkSfGwCOhd6xigSRnDVKEjJxT4sUsVVCJdnb4Og/SVk0Nw==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/api-fetch": "^5.1.2",
-				"@wordpress/blob": "^3.1.2",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/i18n": "^4.1.2",
+			"version": "3.0.5",
+			"resolved": "https://registry.npmjs.org/@wordpress/media-utils/-/media-utils-3.0.5.tgz",
+			"integrity": "sha512-BshnzzBECsH8JuxU/qgJkRCBoPNPQ/z9PeWzTFMY3hPYtbd23hMtZpPqc9EGkjU+Ovs1AF8qEjNr9wPOCDq3nA==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/api-fetch": "^5.2.6",
+				"@wordpress/blob": "^3.2.2",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/i18n": "^4.2.4",
 				"lodash": "^4.17.21"
 			}
 		},
 		"@wordpress/notices": {
-			"version": "3.1.6",
-			"resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-3.1.6.tgz",
-			"integrity": "sha512-I+xDHCY7n5I/mBeZvlker7BoMtRFgaHBe/XySGJv2V2D3ZxgpAGXeVv13v+ohSvhaEjFhll+RgszpZOW/8SMLA==",
+			"version": "3.2.8",
+			"resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-3.2.8.tgz",
+			"integrity": "sha512-SC7O+L81Xf50ntHSfUGpvnb1FutSV4RZxZQyEDdiRe4Ril1dnm4ddU49AXunPHsQ68VYNUBxs8P30EplXtZp5g==",
 			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/a11y": "^3.1.2",
-				"@wordpress/data": "^5.1.6",
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/a11y": "^3.2.4",
+				"@wordpress/data": "^6.1.5",
 				"lodash": "^4.17.21"
 			}
 		},
@@ -4204,762 +4579,1134 @@
 			"dev": true
 		},
 		"@wordpress/nux": {
-			"version": "4.1.11",
-			"resolved": "https://registry.npmjs.org/@wordpress/nux/-/nux-4.1.11.tgz",
-			"integrity": "sha512-GRuQW4guMp12NjdUQPpQHJ+YoLt9lzigWO5za5sPXtWzgpYjzzTGIvBrC8hU5s5dXAlvHzZ0yk6swCEBXGqVDw==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/components": "^14.1.11",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/data": "^5.1.6",
-				"@wordpress/deprecated": "^3.1.2",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/i18n": "^4.1.2",
-				"@wordpress/icons": "^4.0.3",
+			"version": "5.0.19",
+			"resolved": "https://registry.npmjs.org/@wordpress/nux/-/nux-5.0.19.tgz",
+			"integrity": "sha512-V4FuGan6rTtDc8TXybhfCpfHd839ADWUy0rZWMikQBsFhMLDeUqmbtHouI+nPqPpWYwSNVPzHYSBcveO9vUE8g==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/components": "^19.2.2",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/data": "^6.1.5",
+				"@wordpress/deprecated": "^3.2.3",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/i18n": "^4.2.4",
+				"@wordpress/icons": "^6.1.1",
 				"lodash": "^4.17.21",
 				"rememo": "^3.0.0"
 			}
 		},
 		"@wordpress/plugins": {
-			"version": "3.1.6",
-			"resolved": "https://registry.npmjs.org/@wordpress/plugins/-/plugins-3.1.6.tgz",
-			"integrity": "sha512-I2ZE6M/IzkLDDy0YOWLqMebutuubeYCk5Y3QkSRVmQYiuTP0o6q2vO8iJjfL87L8wxB3BgkZwNxusFB1not+lw==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/hooks": "^3.1.1",
-				"@wordpress/icons": "^4.0.3",
+			"version": "4.0.7",
+			"resolved": "https://registry.npmjs.org/@wordpress/plugins/-/plugins-4.0.7.tgz",
+			"integrity": "sha512-dSvSOTkGuoJ7kfst/eLJpHNHf12If+UYsB5WuGXy5sk3z5H9EIOe6XC5272ZVrS/5DUGloCxZP7k7m2vG5iXuQ==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/hooks": "^3.2.2",
+				"@wordpress/icons": "^6.1.1",
 				"lodash": "^4.17.21",
 				"memize": "^1.1.0"
 			}
 		},
 		"@wordpress/postcss-plugins-preset": {
-			"version": "3.2.0",
-			"resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-3.2.0.tgz",
-			"integrity": "sha512-vYzlqr92pq9cIdN6eO5/h1hyDjEIUUvRlm3Tgd822dPPr6EpkM8uJ82quObE1pPt4JfmXYhTj+gMgOUzRNLHJg==",
+			"version": "3.2.5",
+			"resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-3.2.5.tgz",
+			"integrity": "sha512-R+UKnjSJivvVEZ8rhGrXxsj/BlVeNO2FRXq3IxEOPv5ZRfAS0g8k8EO3xsCIV1RfnozvAApkKEYRClDYXIt+vA==",
 			"dev": true,
 			"requires": {
-				"@wordpress/base-styles": "^3.6.0",
+				"@wordpress/base-styles": "^4.0.4",
 				"autoprefixer": "^10.2.5"
 			},
 			"dependencies": {
 				"autoprefixer": {
-					"version": "10.3.3",
-					"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.3.3.tgz",
-					"integrity": "sha512-yRzjxfnggrP/+qVHlUuZz5FZzEbkT+Yt0/Df6ScEMnbbZBLzYB2W0KLxoQCW+THm1SpOsM1ZPcTHAwuvmibIsQ==",
+					"version": "10.4.2",
+					"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.2.tgz",
+					"integrity": "sha512-9fOPpHKuDW1w/0EKfRmVnxTDt8166MAnLI3mgZ1JCnhNtYWxcJ6Ud5CO/AVOZi/AvFa8DY9RTy3h3+tFBlrrdQ==",
 					"dev": true,
 					"requires": {
-						"browserslist": "^4.16.8",
-						"caniuse-lite": "^1.0.30001252",
-						"colorette": "^1.3.0",
-						"fraction.js": "^4.1.1",
+						"browserslist": "^4.19.1",
+						"caniuse-lite": "^1.0.30001297",
+						"fraction.js": "^4.1.2",
 						"normalize-range": "^0.1.2",
-						"postcss-value-parser": "^4.1.0"
+						"picocolors": "^1.0.0",
+						"postcss-value-parser": "^4.2.0"
 					}
 				},
 				"browserslist": {
-					"version": "4.16.8",
-					"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.8.tgz",
-					"integrity": "sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==",
+					"version": "4.19.1",
+					"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
+					"integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
 					"dev": true,
 					"requires": {
-						"caniuse-lite": "^1.0.30001251",
-						"colorette": "^1.3.0",
-						"electron-to-chromium": "^1.3.811",
+						"caniuse-lite": "^1.0.30001286",
+						"electron-to-chromium": "^1.4.17",
 						"escalade": "^3.1.1",
-						"node-releases": "^1.1.75"
+						"node-releases": "^2.0.1",
+						"picocolors": "^1.0.0"
 					}
 				},
 				"caniuse-lite": {
-					"version": "1.0.30001252",
-					"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001252.tgz",
-					"integrity": "sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw==",
-					"dev": true
-				},
-				"colorette": {
-					"version": "1.3.0",
-					"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz",
-					"integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==",
+					"version": "1.0.30001300",
+					"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001300.tgz",
+					"integrity": "sha512-cVjiJHWGcNlJi8TZVKNMnvMid3Z3TTdDHmLDzlOdIiZq138Exvo0G+G0wTdVYolxKb4AYwC+38pxodiInVtJSA==",
 					"dev": true
 				},
 				"electron-to-chromium": {
-					"version": "1.3.826",
-					"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.826.tgz",
-					"integrity": "sha512-bpLc4QU4B8PYmdO4MSu2ZBTMD8lAaEXRS43C09lB31BvYwuk9UxgBRXbY5OJBw7VuMGcg2MZG5FyTaP9u4PQnw==",
+					"version": "1.4.47",
+					"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.47.tgz",
+					"integrity": "sha512-ZHc8i3/cgeCRK/vC7W2htAG6JqUmOUgDNn/f9yY9J8UjfLjwzwOVEt4MWmgJAdvmxyrsR5KIFA/6+kUHGY0eUA==",
 					"dev": true
 				},
 				"node-releases": {
-					"version": "1.1.75",
-					"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz",
-					"integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==",
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
+					"integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
 					"dev": true
 				},
 				"postcss-value-parser": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
-					"integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
+					"version": "4.2.0",
+					"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+					"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
 					"dev": true
 				}
 			}
 		},
 		"@wordpress/prettier-config": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-1.1.0.tgz",
-			"integrity": "sha512-cMYc/dtuiRo9VAb+m8S2Mvv/jELvoJAtcPsq6HT6XMppXC9slZ5z0q1A4PNf3ewMvvHtodjwkl2oHbO+vaAYzg==",
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-1.1.1.tgz",
+			"integrity": "sha512-qjpBK5KB2ieCLv+1fGNKRW4urf5tFN1eUn3Qy+JINxNwAx6Jj9uhfXA4AldCSnD+WkzsN2UgBvgAj5/SWwzRZQ==",
 			"dev": true
 		},
 		"@wordpress/primitives": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-2.1.2.tgz",
-			"integrity": "sha512-Eof+TK+zoKIr6w4lMlwxq+HvP+nKXBoidukjP3YhNUPOdB7H27+X6/V/IJd/Zza2xKN2ExkJybssBAGqi5NS6g==",
+			"version": "3.0.4",
+			"resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-3.0.4.tgz",
+			"integrity": "sha512-yu3BEpr09vpPM0QOYGm5Kmwo/tfo7u7Ez4hN5+AL2dT53VNr3QOmDo0Ym7sewI7+GgU18H4VkAi1QOydrc4vDw==",
 			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/element": "^3.1.2",
-				"classnames": "^2.2.5"
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/element": "^4.0.4",
+				"classnames": "^2.3.1"
 			}
 		},
 		"@wordpress/priority-queue": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-2.1.2.tgz",
-			"integrity": "sha512-qXZzmfTRH6ssSZpCbJEHnj/w9W8bjpYm8V1tLKUqBXEYkHbII4O2FIL21LGI5aFhPPWsHG7tlYz3Z4lA/MHALQ==",
+			"version": "2.2.3",
+			"resolved": "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-2.2.3.tgz",
+			"integrity": "sha512-VI1VhkpgNs5b2LkpmlOIfJz7mVHOxMvh+MtG+NsuKc+0t6iOftfq8xxZ+8PbVLspZ8gd7p0rS+oXmSSqr9nc9g==",
 			"requires": {
-				"@babel/runtime": "^7.13.10"
+				"@babel/runtime": "^7.16.0"
 			}
 		},
 		"@wordpress/redux-routine": {
-			"version": "4.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/redux-routine/-/redux-routine-4.1.2.tgz",
-			"integrity": "sha512-1wOH4zdp58VNeMCoTNRHc1wHTGL3ZWqx8kCCqeA3NhULnRBx2RkI/v6nemKCho5QRbMdIWWUYXffFsLbDOUOSg==",
+			"version": "4.2.2",
+			"resolved": "https://registry.npmjs.org/@wordpress/redux-routine/-/redux-routine-4.2.2.tgz",
+			"integrity": "sha512-zfL8qsSvwI2lAvgPSVfOFCWDg0f0zusba0+uEIVZjPVstmjJtxO902mRZfWsg5+ooFSYq0T7rieet4nasYJX7g==",
 			"requires": {
-				"@babel/runtime": "^7.13.10",
+				"@babel/runtime": "^7.16.0",
 				"is-promise": "^4.0.0",
 				"lodash": "^4.17.21",
+				"redux": "^4.1.0",
 				"rungen": "^0.3.2"
 			}
 		},
 		"@wordpress/reusable-blocks": {
-			"version": "2.1.17",
-			"resolved": "https://registry.npmjs.org/@wordpress/reusable-blocks/-/reusable-blocks-2.1.17.tgz",
-			"integrity": "sha512-54tZPQppe4kmDeivxsUk5ZZhTlSY8jum+5OEcYs0jJVctEXhRVh7rU3p2hqSWWriNghqVz4i3cuJ57tqt/tIsw==",
-			"requires": {
-				"@wordpress/block-editor": "^6.1.14",
-				"@wordpress/blocks": "^9.1.8",
-				"@wordpress/components": "^14.1.11",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/core-data": "^3.1.12",
-				"@wordpress/data": "^5.1.6",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/i18n": "^4.1.2",
-				"@wordpress/icons": "^4.0.3",
-				"@wordpress/notices": "^3.1.6",
-				"@wordpress/url": "^3.1.2",
+			"version": "3.0.22",
+			"resolved": "https://registry.npmjs.org/@wordpress/reusable-blocks/-/reusable-blocks-3.0.22.tgz",
+			"integrity": "sha512-LFCElCO/y0u2XK6J/iZsTcnHdR77E37YCphecSVXHZ71v+PhRotTAvjMD9+4vQ7fLvsfLG4Zd94KI2TGz4IoOg==",
+			"requires": {
+				"@wordpress/block-editor": "^8.0.16",
+				"@wordpress/blocks": "^11.1.5",
+				"@wordpress/components": "^19.2.2",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/core-data": "^4.0.9",
+				"@wordpress/data": "^6.1.5",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/i18n": "^4.2.4",
+				"@wordpress/icons": "^6.1.1",
+				"@wordpress/notices": "^3.2.8",
+				"@wordpress/url": "^3.3.1",
 				"lodash": "^4.17.21"
 			}
 		},
 		"@wordpress/rich-text": {
-			"version": "4.1.6",
-			"resolved": "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-4.1.6.tgz",
-			"integrity": "sha512-wF60RXrGIQ0xgAvMSNwh1dP8lM4RRMWbRS5ZKOf1ld2s7oTsezEodBwCIHhFkHeraM/ORbeFoBPFsLbGf3oXwQ==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/data": "^5.1.6",
-				"@wordpress/dom": "^3.1.5",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/escape-html": "^2.1.2",
-				"@wordpress/is-shallow-equal": "^4.1.1",
-				"@wordpress/keycodes": "^3.1.2",
-				"classnames": "^2.2.5",
+			"version": "5.0.8",
+			"resolved": "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-5.0.8.tgz",
+			"integrity": "sha512-RjIbgP/C0OL2H+66TD2xt5KSi6N9lrj4bnYSdfhAoRZTjWvrtsyryaIRPbz4QZQvd/uMxsR651R1dFoL3+vZuA==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/a11y": "^3.2.4",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/data": "^6.1.5",
+				"@wordpress/dom": "^3.2.7",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/escape-html": "^2.2.3",
+				"@wordpress/i18n": "^4.2.4",
+				"@wordpress/is-shallow-equal": "^4.2.1",
+				"@wordpress/keycodes": "^3.2.4",
+				"classnames": "^2.3.1",
 				"lodash": "^4.17.21",
 				"memize": "^1.1.0",
 				"rememo": "^3.0.0"
 			}
 		},
 		"@wordpress/scripts": {
-			"version": "16.1.5",
-			"resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-16.1.5.tgz",
-			"integrity": "sha512-EF63cT5UGbWEMEJBBhxvcoNAuJIooKlqAAaMq5wN1urzsJRpQOTHTV658onoKFfgAxWB78CD7svuwIqNPGQdIw==",
-			"dev": true,
-			"requires": {
-				"@svgr/webpack": "^5.2.0",
-				"@wordpress/babel-preset-default": "^6.2.1",
-				"@wordpress/dependency-extraction-webpack-plugin": "^3.1.4",
-				"@wordpress/eslint-plugin": "^9.0.6",
-				"@wordpress/jest-preset-default": "^7.0.5",
-				"@wordpress/npm-package-json-lint-config": "^4.0.5",
-				"@wordpress/postcss-plugins-preset": "^3.1.4",
-				"@wordpress/prettier-config": "^1.0.5",
-				"@wordpress/stylelint-config": "^19.0.5",
+			"version": "19.2.4",
+			"resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-19.2.4.tgz",
+			"integrity": "sha512-klkfjBOPfr/RT/3Tvmx+gLbZ+dxq5L0dJQHCHxEURMRW/A8SfJJPtmC29L9sE1KhO3zUMWxrkn2L6HhSzbvQbA==",
+			"dev": true,
+			"requires": {
+				"@svgr/webpack": "^5.5.0",
+				"@wordpress/babel-preset-default": "^6.4.1",
+				"@wordpress/browserslist-config": "^4.1.0",
+				"@wordpress/dependency-extraction-webpack-plugin": "^3.2.1",
+				"@wordpress/eslint-plugin": "^9.3.0",
+				"@wordpress/jest-preset-default": "^7.1.3",
+				"@wordpress/npm-package-json-lint-config": "^4.1.0",
+				"@wordpress/postcss-plugins-preset": "^3.2.5",
+				"@wordpress/prettier-config": "^1.1.1",
+				"@wordpress/stylelint-config": "^19.1.0",
 				"babel-jest": "^26.6.3",
-				"babel-loader": "^8.2.2",
+				"babel-loader": "^8.2.3",
+				"browserslist": "^4.17.6",
 				"chalk": "^4.0.0",
 				"check-node-version": "^4.1.0",
 				"clean-webpack-plugin": "^3.0.0",
 				"cross-spawn": "^5.1.0",
-				"css-loader": "^5.1.3",
+				"css-loader": "^6.2.0",
+				"cssnano": "^5.0.7",
 				"cwd": "^0.10.0",
 				"dir-glob": "^3.0.1",
 				"eslint": "^7.17.0",
-				"eslint-plugin-markdown": "^1.0.2",
+				"eslint-plugin-markdown": "^2.2.0",
 				"expect-puppeteer": "^4.4.0",
-				"file-loader": "^6.2.0",
 				"filenamify": "^4.2.0",
-				"ignore-emit-webpack-plugin": "^2.0.6",
 				"jest": "^26.6.3",
 				"jest-circus": "^26.6.3",
-				"jest-dev-server": "^4.4.0",
+				"jest-dev-server": "^5.0.3",
 				"jest-environment-node": "^26.6.2",
-				"markdownlint": "^0.18.0",
-				"markdownlint-cli": "^0.21.0",
+				"markdownlint": "^0.23.1",
+				"markdownlint-cli": "^0.27.1",
 				"merge-deep": "^3.0.3",
-				"mini-css-extract-plugin": "^1.3.9",
+				"mini-css-extract-plugin": "^2.5.0",
 				"minimist": "^1.2.0",
 				"npm-package-json-lint": "^5.0.0",
 				"postcss": "^8.2.15",
-				"postcss-loader": "^4.2.0",
+				"postcss-loader": "^6.1.1",
 				"prettier": "npm:wp-prettier@2.2.1-beta-1",
-				"puppeteer-core": "^9.0.0",
+				"puppeteer-core": "^10.1.0",
 				"read-pkg-up": "^1.0.1",
 				"resolve-bin": "^0.4.0",
-				"sass": "^1.26.11",
-				"sass-loader": "^10.1.1",
-				"source-map-loader": "^0.2.4",
+				"sass": "^1.35.2",
+				"sass-loader": "^12.1.0",
+				"source-map-loader": "^3.0.0",
 				"stylelint": "^13.8.0",
-				"terser-webpack-plugin": "^3.0.3",
-				"thread-loader": "^3.0.1",
+				"terser-webpack-plugin": "^5.1.4",
 				"url-loader": "^4.1.1",
-				"webpack": "^4.46.0",
-				"webpack-bundle-analyzer": "^4.2.0",
-				"webpack-cli": "^3.3.11",
-				"webpack-livereload-plugin": "^2.3.0",
-				"webpack-sources": "^2.2.0"
+				"webpack": "^5.47.1",
+				"webpack-bundle-analyzer": "^4.4.2",
+				"webpack-cli": "^4.7.2",
+				"webpack-livereload-plugin": "^3.0.1"
 			},
 			"dependencies": {
-				"cacache": {
-					"version": "15.3.0",
-					"resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz",
-					"integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==",
-					"dev": true,
-					"requires": {
-						"@npmcli/fs": "^1.0.0",
-						"@npmcli/move-file": "^1.0.1",
-						"chownr": "^2.0.0",
-						"fs-minipass": "^2.0.0",
-						"glob": "^7.1.4",
-						"infer-owner": "^1.0.4",
-						"lru-cache": "^6.0.0",
-						"minipass": "^3.1.1",
-						"minipass-collect": "^1.0.2",
-						"minipass-flush": "^1.0.5",
-						"minipass-pipeline": "^1.2.2",
-						"mkdirp": "^1.0.3",
-						"p-map": "^4.0.0",
-						"promise-inflight": "^1.0.1",
-						"rimraf": "^3.0.2",
-						"ssri": "^8.0.1",
-						"tar": "^6.0.2",
-						"unique-filename": "^1.1.1"
-					}
-				},
-				"chownr": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
-					"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
-					"dev": true
-				},
-				"colorette": {
-					"version": "1.3.0",
-					"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz",
-					"integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==",
+				"@types/json-schema": {
+					"version": "7.0.9",
+					"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
+					"integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
 					"dev": true
 				},
-				"enhanced-resolve": {
-					"version": "4.5.0",
-					"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.5.0.tgz",
-					"integrity": "sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==",
+				"@webassemblyjs/ast": {
+					"version": "1.11.1",
+					"resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
+					"integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
 					"dev": true,
 					"requires": {
-						"graceful-fs": "^4.1.2",
-						"memory-fs": "^0.5.0",
-						"tapable": "^1.0.0"
-					},
-					"dependencies": {
-						"memory-fs": {
-							"version": "0.5.0",
-							"resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz",
-							"integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==",
-							"dev": true,
-							"requires": {
-								"errno": "^0.1.3",
-								"readable-stream": "^2.0.1"
-							}
-						}
+						"@webassemblyjs/helper-numbers": "1.11.1",
+						"@webassemblyjs/helper-wasm-bytecode": "1.11.1"
 					}
 				},
-				"filenamify": {
-					"version": "4.3.0",
-					"resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz",
-					"integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==",
-					"dev": true,
-					"requires": {
-						"filename-reserved-regex": "^2.0.0",
-						"strip-outer": "^1.0.1",
-						"trim-repeated": "^1.0.0"
-					}
+				"@webassemblyjs/helper-api-error": {
+					"version": "1.11.1",
+					"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
+					"integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==",
+					"dev": true
 				},
-				"find-cache-dir": {
-					"version": "3.3.2",
-					"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
-					"integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
-					"dev": true,
-					"requires": {
-						"commondir": "^1.0.1",
-						"make-dir": "^3.0.2",
-						"pkg-dir": "^4.1.0"
-					}
+				"@webassemblyjs/helper-buffer": {
+					"version": "1.11.1",
+					"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
+					"integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==",
+					"dev": true
 				},
-				"find-up": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
-					"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+				"@webassemblyjs/helper-wasm-bytecode": {
+					"version": "1.11.1",
+					"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
+					"integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==",
+					"dev": true
+				},
+				"@webassemblyjs/helper-wasm-section": {
+					"version": "1.11.1",
+					"resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
+					"integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
 					"dev": true,
 					"requires": {
-						"locate-path": "^5.0.0",
-						"path-exists": "^4.0.0"
+						"@webassemblyjs/ast": "1.11.1",
+						"@webassemblyjs/helper-buffer": "1.11.1",
+						"@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+						"@webassemblyjs/wasm-gen": "1.11.1"
 					}
 				},
-				"locate-path": {
-					"version": "5.0.0",
-					"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
-					"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+				"@webassemblyjs/ieee754": {
+					"version": "1.11.1",
+					"resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
+					"integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
 					"dev": true,
 					"requires": {
-						"p-locate": "^4.1.0"
+						"@xtuc/ieee754": "^1.2.0"
 					}
 				},
-				"make-dir": {
-					"version": "3.1.0",
-					"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
-					"integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+				"@webassemblyjs/leb128": {
+					"version": "1.11.1",
+					"resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
+					"integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
 					"dev": true,
 					"requires": {
-						"semver": "^6.0.0"
+						"@xtuc/long": "4.2.2"
 					}
 				},
-				"mkdirp": {
-					"version": "1.0.4",
-					"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-					"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+				"@webassemblyjs/utf8": {
+					"version": "1.11.1",
+					"resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
+					"integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==",
 					"dev": true
 				},
-				"p-limit": {
-					"version": "3.1.0",
-					"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
-					"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+				"@webassemblyjs/wasm-edit": {
+					"version": "1.11.1",
+					"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
+					"integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
 					"dev": true,
 					"requires": {
-						"yocto-queue": "^0.1.0"
+						"@webassemblyjs/ast": "1.11.1",
+						"@webassemblyjs/helper-buffer": "1.11.1",
+						"@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+						"@webassemblyjs/helper-wasm-section": "1.11.1",
+						"@webassemblyjs/wasm-gen": "1.11.1",
+						"@webassemblyjs/wasm-opt": "1.11.1",
+						"@webassemblyjs/wasm-parser": "1.11.1",
+						"@webassemblyjs/wast-printer": "1.11.1"
 					}
 				},
-				"p-locate": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
-					"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+				"@webassemblyjs/wasm-gen": {
+					"version": "1.11.1",
+					"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
+					"integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
 					"dev": true,
 					"requires": {
-						"p-limit": "^2.2.0"
-					},
-					"dependencies": {
-						"p-limit": {
-							"version": "2.3.0",
-							"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-							"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-							"dev": true,
-							"requires": {
-								"p-try": "^2.0.0"
-							}
-						}
+						"@webassemblyjs/ast": "1.11.1",
+						"@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+						"@webassemblyjs/ieee754": "1.11.1",
+						"@webassemblyjs/leb128": "1.11.1",
+						"@webassemblyjs/utf8": "1.11.1"
 					}
 				},
-				"p-map": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
-					"integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
+				"@webassemblyjs/wasm-opt": {
+					"version": "1.11.1",
+					"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
+					"integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
 					"dev": true,
 					"requires": {
-						"aggregate-error": "^3.0.0"
+						"@webassemblyjs/ast": "1.11.1",
+						"@webassemblyjs/helper-buffer": "1.11.1",
+						"@webassemblyjs/wasm-gen": "1.11.1",
+						"@webassemblyjs/wasm-parser": "1.11.1"
 					}
 				},
-				"path-exists": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-					"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-					"dev": true
-				},
-				"pkg-dir": {
-					"version": "4.2.0",
-					"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
-					"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+				"@webassemblyjs/wasm-parser": {
+					"version": "1.11.1",
+					"resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
+					"integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
 					"dev": true,
 					"requires": {
-						"find-up": "^4.0.0"
+						"@webassemblyjs/ast": "1.11.1",
+						"@webassemblyjs/helper-api-error": "1.11.1",
+						"@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+						"@webassemblyjs/ieee754": "1.11.1",
+						"@webassemblyjs/leb128": "1.11.1",
+						"@webassemblyjs/utf8": "1.11.1"
 					}
 				},
-				"postcss": {
-					"version": "8.3.6",
-					"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz",
-					"integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==",
+				"@webassemblyjs/wast-printer": {
+					"version": "1.11.1",
+					"resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
+					"integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
 					"dev": true,
 					"requires": {
-						"colorette": "^1.2.2",
-						"nanoid": "^3.1.23",
-						"source-map-js": "^0.6.2"
+						"@webassemblyjs/ast": "1.11.1",
+						"@xtuc/long": "4.2.2"
 					}
 				},
-				"prettier": {
-					"version": "npm:wp-prettier@2.2.1-beta-1",
-					"resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-2.2.1-beta-1.tgz",
-					"integrity": "sha512-+JHkqs9LC/JPp51yy1hzs3lQ7qeuWCwOcSzpQNeeY/G7oSpnF61vxt7hRh87zNRTr6ob2ndy0W8rVzhgrcA+Gw==",
+				"acorn": {
+					"version": "8.7.0",
+					"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
+					"integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
 					"dev": true
 				},
-				"rimraf": {
-					"version": "3.0.2",
-					"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-					"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-					"dev": true,
-					"requires": {
-						"glob": "^7.1.3"
-					}
-				},
-				"schema-utils": {
-					"version": "2.7.1",
-					"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
-					"integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+				"browserslist": {
+					"version": "4.19.1",
+					"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
+					"integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
 					"dev": true,
 					"requires": {
-						"@types/json-schema": "^7.0.5",
-						"ajv": "^6.12.4",
-						"ajv-keywords": "^3.5.2"
+						"caniuse-lite": "^1.0.30001286",
+						"electron-to-chromium": "^1.4.17",
+						"escalade": "^3.1.1",
+						"node-releases": "^2.0.1",
+						"picocolors": "^1.0.0"
 					}
 				},
-				"semver": {
-					"version": "6.3.0",
-					"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
-					"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+				"caniuse-lite": {
+					"version": "1.0.30001300",
+					"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001300.tgz",
+					"integrity": "sha512-cVjiJHWGcNlJi8TZVKNMnvMid3Z3TTdDHmLDzlOdIiZq138Exvo0G+G0wTdVYolxKb4AYwC+38pxodiInVtJSA==",
 					"dev": true
 				},
-				"source-map": {
-					"version": "0.6.1",
-					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-					"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+				"commander": {
+					"version": "7.2.0",
+					"resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+					"integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
 					"dev": true
 				},
-				"source-map-loader": {
-					"version": "0.2.4",
-					"resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz",
-					"integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==",
+				"css-declaration-sorter": {
+					"version": "6.1.4",
+					"resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.1.4.tgz",
+					"integrity": "sha512-lpfkqS0fctcmZotJGhnxkIyJWvBXgpyi2wsFd4J8VB7wzyrT6Ch/3Q+FMNJpjK4gu1+GN5khOnpU2ZVKrLbhCw==",
 					"dev": true,
 					"requires": {
-						"async": "^2.5.0",
-						"loader-utils": "^1.1.0"
+						"timsort": "^0.3.0"
 					}
 				},
-				"ssri": {
-					"version": "8.0.1",
-					"resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
-					"integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
+				"css-select": {
+					"version": "4.2.1",
+					"resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz",
+					"integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==",
 					"dev": true,
 					"requires": {
-						"minipass": "^3.1.1"
+						"boolbase": "^1.0.0",
+						"css-what": "^5.1.0",
+						"domhandler": "^4.3.0",
+						"domutils": "^2.8.0",
+						"nth-check": "^2.0.1"
 					}
 				},
-				"terser-webpack-plugin": {
-					"version": "3.1.0",
-					"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.1.0.tgz",
-					"integrity": "sha512-cjdZte66fYkZ65rQ2oJfrdCAkkhJA7YLYk5eGOcGCSGlq0ieZupRdjedSQXYknMPo2IveQL+tPdrxUkERENCFA==",
-					"dev": true,
+				"css-tree": {
+					"version": "1.1.3",
+					"resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz",
+					"integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==",
+					"dev": true,
 					"requires": {
-						"cacache": "^15.0.5",
-						"find-cache-dir": "^3.3.1",
-						"jest-worker": "^26.2.1",
-						"p-limit": "^3.0.2",
-						"schema-utils": "^2.6.6",
-						"serialize-javascript": "^4.0.0",
-						"source-map": "^0.6.1",
-						"terser": "^4.8.0",
-						"webpack-sources": "^1.4.3"
+						"mdn-data": "2.0.14",
+						"source-map": "^0.6.1"
+					}
+				},
+				"css-what": {
+					"version": "5.1.0",
+					"resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz",
+					"integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==",
+					"dev": true
+				},
+				"cssnano": {
+					"version": "5.0.15",
+					"resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.0.15.tgz",
+					"integrity": "sha512-ppZsS7oPpi2sfiyV5+i+NbB/3GtQ+ab2Vs1azrZaXWujUSN4o+WdTxlCZIMcT9yLW3VO/5yX3vpyDaQ1nIn8CQ==",
+					"dev": true,
+					"requires": {
+						"cssnano-preset-default": "^5.1.10",
+						"lilconfig": "^2.0.3",
+						"yaml": "^1.10.2"
+					}
+				},
+				"cssnano-preset-default": {
+					"version": "5.1.10",
+					"resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.1.10.tgz",
+					"integrity": "sha512-BcpSzUVygHMOnp9uG5rfPzTOCb0GAHQkqtUQx8j1oMNF9A1Q8hziOOhiM4bdICpmrBIU85BE64RD5XGYsVQZNA==",
+					"dev": true,
+					"requires": {
+						"css-declaration-sorter": "^6.0.3",
+						"cssnano-utils": "^3.0.0",
+						"postcss-calc": "^8.2.0",
+						"postcss-colormin": "^5.2.3",
+						"postcss-convert-values": "^5.0.2",
+						"postcss-discard-comments": "^5.0.1",
+						"postcss-discard-duplicates": "^5.0.1",
+						"postcss-discard-empty": "^5.0.1",
+						"postcss-discard-overridden": "^5.0.2",
+						"postcss-merge-longhand": "^5.0.4",
+						"postcss-merge-rules": "^5.0.4",
+						"postcss-minify-font-values": "^5.0.2",
+						"postcss-minify-gradients": "^5.0.4",
+						"postcss-minify-params": "^5.0.3",
+						"postcss-minify-selectors": "^5.1.1",
+						"postcss-normalize-charset": "^5.0.1",
+						"postcss-normalize-display-values": "^5.0.2",
+						"postcss-normalize-positions": "^5.0.2",
+						"postcss-normalize-repeat-style": "^5.0.2",
+						"postcss-normalize-string": "^5.0.2",
+						"postcss-normalize-timing-functions": "^5.0.2",
+						"postcss-normalize-unicode": "^5.0.2",
+						"postcss-normalize-url": "^5.0.4",
+						"postcss-normalize-whitespace": "^5.0.2",
+						"postcss-ordered-values": "^5.0.3",
+						"postcss-reduce-initial": "^5.0.2",
+						"postcss-reduce-transforms": "^5.0.2",
+						"postcss-svgo": "^5.0.3",
+						"postcss-unique-selectors": "^5.0.2"
+					}
+				},
+				"dom-serializer": {
+					"version": "1.3.2",
+					"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
+					"integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
+					"dev": true,
+					"requires": {
+						"domelementtype": "^2.0.1",
+						"domhandler": "^4.2.0",
+						"entities": "^2.0.0"
+					}
+				},
+				"domelementtype": {
+					"version": "2.2.0",
+					"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
+					"integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
+					"dev": true
+				},
+				"domutils": {
+					"version": "2.8.0",
+					"resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz",
+					"integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==",
+					"dev": true,
+					"requires": {
+						"dom-serializer": "^1.0.1",
+						"domelementtype": "^2.2.0",
+						"domhandler": "^4.2.0"
+					}
+				},
+				"electron-to-chromium": {
+					"version": "1.4.47",
+					"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.47.tgz",
+					"integrity": "sha512-ZHc8i3/cgeCRK/vC7W2htAG6JqUmOUgDNn/f9yY9J8UjfLjwzwOVEt4MWmgJAdvmxyrsR5KIFA/6+kUHGY0eUA==",
+					"dev": true
+				},
+				"enhanced-resolve": {
+					"version": "5.8.3",
+					"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz",
+					"integrity": "sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA==",
+					"dev": true,
+					"requires": {
+						"graceful-fs": "^4.2.4",
+						"tapable": "^2.2.0"
+					}
+				},
+				"eslint-scope": {
+					"version": "5.1.1",
+					"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+					"integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+					"dev": true,
+					"requires": {
+						"esrecurse": "^4.3.0",
+						"estraverse": "^4.1.1"
+					}
+				},
+				"filenamify": {
+					"version": "4.3.0",
+					"resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz",
+					"integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==",
+					"dev": true,
+					"requires": {
+						"filename-reserved-regex": "^2.0.0",
+						"strip-outer": "^1.0.1",
+						"trim-repeated": "^1.0.0"
+					}
+				},
+				"glob-to-regexp": {
+					"version": "0.4.1",
+					"resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+					"integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+					"dev": true
+				},
+				"graceful-fs": {
+					"version": "4.2.9",
+					"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz",
+					"integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==",
+					"dev": true
+				},
+				"has-flag": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+					"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+					"dev": true
+				},
+				"iconv-lite": {
+					"version": "0.6.3",
+					"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+					"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+					"dev": true,
+					"requires": {
+						"safer-buffer": ">= 2.1.2 < 3.0.0"
+					}
+				},
+				"jest-worker": {
+					"version": "27.4.6",
+					"resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz",
+					"integrity": "sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==",
+					"dev": true,
+					"requires": {
+						"@types/node": "*",
+						"merge-stream": "^2.0.0",
+						"supports-color": "^8.0.0"
+					}
+				},
+				"loader-runner": {
+					"version": "4.2.0",
+					"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
+					"integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==",
+					"dev": true
+				},
+				"mdn-data": {
+					"version": "2.0.14",
+					"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz",
+					"integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==",
+					"dev": true
+				},
+				"node-releases": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
+					"integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
+					"dev": true
+				},
+				"nth-check": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz",
+					"integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==",
+					"dev": true,
+					"requires": {
+						"boolbase": "^1.0.0"
+					}
+				},
+				"postcss": {
+					"version": "8.4.5",
+					"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
+					"integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
+					"dev": true,
+					"requires": {
+						"nanoid": "^3.1.30",
+						"picocolors": "^1.0.0",
+						"source-map-js": "^1.0.1"
+					}
+				},
+				"postcss-calc": {
+					"version": "8.2.2",
+					"resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.2.tgz",
+					"integrity": "sha512-B5R0UeB4zLJvxNt1FVCaDZULdzsKLPc6FhjFJ+xwFiq7VG4i9cuaJLxVjNtExNK8ocm3n2o4unXXLiVX1SCqxA==",
+					"dev": true,
+					"requires": {
+						"postcss-selector-parser": "^6.0.2",
+						"postcss-value-parser": "^4.0.2"
+					}
+				},
+				"postcss-colormin": {
+					"version": "5.2.3",
+					"resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.2.3.tgz",
+					"integrity": "sha512-dra4xoAjub2wha6RUXAgadHEn2lGxbj8drhFcIGLOMn914Eu7DkPUurugDXgstwttCYkJtZ/+PkWRWdp3UHRIA==",
+					"dev": true,
+					"requires": {
+						"browserslist": "^4.16.6",
+						"caniuse-api": "^3.0.0",
+						"colord": "^2.9.1",
+						"postcss-value-parser": "^4.2.0"
+					}
+				},
+				"postcss-convert-values": {
+					"version": "5.0.2",
+					"resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.0.2.tgz",
+					"integrity": "sha512-KQ04E2yadmfa1LqXm7UIDwW1ftxU/QWZmz6NKnHnUvJ3LEYbbcX6i329f/ig+WnEByHegulocXrECaZGLpL8Zg==",
+					"dev": true,
+					"requires": {
+						"postcss-value-parser": "^4.1.0"
+					}
+				},
+				"postcss-discard-comments": {
+					"version": "5.0.1",
+					"resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.0.1.tgz",
+					"integrity": "sha512-lgZBPTDvWrbAYY1v5GYEv8fEO/WhKOu/hmZqmCYfrpD6eyDWWzAOsl2rF29lpvziKO02Gc5GJQtlpkTmakwOWg==",
+					"dev": true
+				},
+				"postcss-discard-duplicates": {
+					"version": "5.0.1",
+					"resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz",
+					"integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==",
+					"dev": true
+				},
+				"postcss-discard-empty": {
+					"version": "5.0.1",
+					"resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.0.1.tgz",
+					"integrity": "sha512-vfU8CxAQ6YpMxV2SvMcMIyF2LX1ZzWpy0lqHDsOdaKKLQVQGVP1pzhrI9JlsO65s66uQTfkQBKBD/A5gp9STFw==",
+					"dev": true
+				},
+				"postcss-discard-overridden": {
+					"version": "5.0.2",
+					"resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.0.2.tgz",
+					"integrity": "sha512-+56BLP6NSSUuWUXjRgAQuho1p5xs/hU5Sw7+xt9S3JSg+7R6+WMGnJW7Hre/6tTuZ2xiXMB42ObkiZJ2hy/Pew==",
+					"dev": true
+				},
+				"postcss-merge-longhand": {
+					"version": "5.0.4",
+					"resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.0.4.tgz",
+					"integrity": "sha512-2lZrOVD+d81aoYkZDpWu6+3dTAAGkCKbV5DoRhnIR7KOULVrI/R7bcMjhrH9KTRy6iiHKqmtG+n/MMj1WmqHFw==",
+					"dev": true,
+					"requires": {
+						"postcss-value-parser": "^4.1.0",
+						"stylehacks": "^5.0.1"
+					}
+				},
+				"postcss-merge-rules": {
+					"version": "5.0.4",
+					"resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.4.tgz",
+					"integrity": "sha512-yOj7bW3NxlQxaERBB0lEY1sH5y+RzevjbdH4DBJurjKERNpknRByFNdNe+V72i5pIZL12woM9uGdS5xbSB+kDQ==",
+					"dev": true,
+					"requires": {
+						"browserslist": "^4.16.6",
+						"caniuse-api": "^3.0.0",
+						"cssnano-utils": "^3.0.0",
+						"postcss-selector-parser": "^6.0.5"
 					},
 					"dependencies": {
-						"webpack-sources": {
-							"version": "1.4.3",
-							"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
-							"integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
+						"postcss-selector-parser": {
+							"version": "6.0.8",
+							"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz",
+							"integrity": "sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ==",
 							"dev": true,
 							"requires": {
-								"source-list-map": "^2.0.0",
-								"source-map": "~0.6.1"
+								"cssesc": "^3.0.0",
+								"util-deprecate": "^1.0.2"
 							}
 						}
 					}
 				},
-				"webpack": {
-					"version": "4.46.0",
-					"resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz",
-					"integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==",
-					"dev": true,
-					"requires": {
-						"@webassemblyjs/ast": "1.9.0",
-						"@webassemblyjs/helper-module-context": "1.9.0",
-						"@webassemblyjs/wasm-edit": "1.9.0",
-						"@webassemblyjs/wasm-parser": "1.9.0",
-						"acorn": "^6.4.1",
-						"ajv": "^6.10.2",
-						"ajv-keywords": "^3.4.1",
-						"chrome-trace-event": "^1.0.2",
-						"enhanced-resolve": "^4.5.0",
-						"eslint-scope": "^4.0.3",
-						"json-parse-better-errors": "^1.0.2",
-						"loader-runner": "^2.4.0",
-						"loader-utils": "^1.2.3",
-						"memory-fs": "^0.4.1",
-						"micromatch": "^3.1.10",
-						"mkdirp": "^0.5.3",
-						"neo-async": "^2.6.1",
-						"node-libs-browser": "^2.2.1",
-						"schema-utils": "^1.0.0",
-						"tapable": "^1.1.3",
-						"terser-webpack-plugin": "^1.4.3",
-						"watchpack": "^1.7.4",
-						"webpack-sources": "^1.4.1"
+				"postcss-minify-font-values": {
+					"version": "5.0.2",
+					"resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.0.2.tgz",
+					"integrity": "sha512-R6MJZryq28Cw0AmnyhXrM7naqJZZLoa1paBltIzh2wM7yb4D45TLur+eubTQ4jCmZU9SGeZdWsc5KcSoqTMeTg==",
+					"dev": true,
+					"requires": {
+						"postcss-value-parser": "^4.2.0"
+					}
+				},
+				"postcss-minify-gradients": {
+					"version": "5.0.4",
+					"resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.0.4.tgz",
+					"integrity": "sha512-RVwZA7NC4R4J76u8X0Q0j+J7ItKUWAeBUJ8oEEZWmtv3Xoh19uNJaJwzNpsydQjk6PkuhRrK+YwwMf+c+68EYg==",
+					"dev": true,
+					"requires": {
+						"colord": "^2.9.1",
+						"cssnano-utils": "^3.0.0",
+						"postcss-value-parser": "^4.2.0"
+					}
+				},
+				"postcss-minify-params": {
+					"version": "5.0.3",
+					"resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.0.3.tgz",
+					"integrity": "sha512-NY92FUikE+wralaiVexFd5gwb7oJTIDhgTNeIw89i1Ymsgt4RWiPXfz3bg7hDy4NL6gepcThJwOYNtZO/eNi7Q==",
+					"dev": true,
+					"requires": {
+						"alphanum-sort": "^1.0.2",
+						"browserslist": "^4.16.6",
+						"cssnano-utils": "^3.0.0",
+						"postcss-value-parser": "^4.2.0"
+					}
+				},
+				"postcss-minify-selectors": {
+					"version": "5.1.1",
+					"resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.1.1.tgz",
+					"integrity": "sha512-TOzqOPXt91O2luJInaVPiivh90a2SIK5Nf1Ea7yEIM/5w+XA5BGrZGUSW8aEx9pJ/oNj7ZJBhjvigSiBV+bC1Q==",
+					"dev": true,
+					"requires": {
+						"alphanum-sort": "^1.0.2",
+						"postcss-selector-parser": "^6.0.5"
 					},
 					"dependencies": {
-						"cacache": {
-							"version": "12.0.4",
-							"resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz",
-							"integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==",
-							"dev": true,
-							"requires": {
-								"bluebird": "^3.5.5",
-								"chownr": "^1.1.1",
-								"figgy-pudding": "^3.5.1",
-								"glob": "^7.1.4",
-								"graceful-fs": "^4.1.15",
-								"infer-owner": "^1.0.3",
-								"lru-cache": "^5.1.1",
-								"mississippi": "^3.0.0",
-								"mkdirp": "^0.5.1",
-								"move-concurrently": "^1.0.1",
-								"promise-inflight": "^1.0.1",
-								"rimraf": "^2.6.3",
-								"ssri": "^6.0.1",
-								"unique-filename": "^1.1.1",
-								"y18n": "^4.0.0"
-							}
-						},
-						"chownr": {
-							"version": "1.1.4",
-							"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
-							"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
-							"dev": true
-						},
-						"find-cache-dir": {
-							"version": "2.1.0",
-							"resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
-							"integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
-							"dev": true,
-							"requires": {
-								"commondir": "^1.0.1",
-								"make-dir": "^2.0.0",
-								"pkg-dir": "^3.0.0"
-							}
-						},
-						"find-up": {
-							"version": "3.0.0",
-							"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-							"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
-							"dev": true,
-							"requires": {
-								"locate-path": "^3.0.0"
-							}
-						},
-						"locate-path": {
-							"version": "3.0.0",
-							"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-							"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
-							"dev": true,
-							"requires": {
-								"p-locate": "^3.0.0",
-								"path-exists": "^3.0.0"
-							}
-						},
-						"lru-cache": {
-							"version": "5.1.1",
-							"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
-							"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
-							"dev": true,
-							"requires": {
-								"yallist": "^3.0.2"
-							}
-						},
-						"make-dir": {
-							"version": "2.1.0",
-							"resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
-							"integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
-							"dev": true,
-							"requires": {
-								"pify": "^4.0.1",
-								"semver": "^5.6.0"
-							}
-						},
-						"mkdirp": {
-							"version": "0.5.5",
-							"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
-							"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
-							"dev": true,
-							"requires": {
-								"minimist": "^1.2.5"
-							}
-						},
-						"p-limit": {
-							"version": "2.3.0",
-							"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-							"integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+						"postcss-selector-parser": {
+							"version": "6.0.8",
+							"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz",
+							"integrity": "sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ==",
 							"dev": true,
 							"requires": {
-								"p-try": "^2.0.0"
+								"cssesc": "^3.0.0",
+								"util-deprecate": "^1.0.2"
 							}
-						},
-						"p-locate": {
-							"version": "3.0.0",
-							"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-							"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+						}
+					}
+				},
+				"postcss-normalize-charset": {
+					"version": "5.0.1",
+					"resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.0.1.tgz",
+					"integrity": "sha512-6J40l6LNYnBdPSk+BHZ8SF+HAkS4q2twe5jnocgd+xWpz/mx/5Sa32m3W1AA8uE8XaXN+eg8trIlfu8V9x61eg==",
+					"dev": true
+				},
+				"postcss-normalize-display-values": {
+					"version": "5.0.2",
+					"resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.0.2.tgz",
+					"integrity": "sha512-RxXoJPUR0shSjkMMzgEZDjGPrgXUVYyWA/YwQRicb48H15OClPuaDR7tYokLAlGZ2tCSENEN5WxjgxSD5m4cUw==",
+					"dev": true,
+					"requires": {
+						"postcss-value-parser": "^4.2.0"
+					}
+				},
+				"postcss-normalize-positions": {
+					"version": "5.0.2",
+					"resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.0.2.tgz",
+					"integrity": "sha512-tqghWFVDp2btqFg1gYob1etPNxXLNh3uVeWgZE2AQGh6b2F8AK2Gj36v5Vhyh+APwIzNjmt6jwZ9pTBP+/OM8g==",
+					"dev": true,
+					"requires": {
+						"postcss-value-parser": "^4.2.0"
+					}
+				},
+				"postcss-normalize-repeat-style": {
+					"version": "5.0.2",
+					"resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.0.2.tgz",
+					"integrity": "sha512-/rIZn8X9bBzC7KvY4iKUhXUGW3MmbXwfPF23jC9wT9xTi7kAvgj8sEgwxjixBmoL6MVa4WOgxNz2hAR6wTK8tw==",
+					"dev": true,
+					"requires": {
+						"postcss-value-parser": "^4.2.0"
+					}
+				},
+				"postcss-normalize-string": {
+					"version": "5.0.2",
+					"resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.0.2.tgz",
+					"integrity": "sha512-zaI1yzwL+a/FkIzUWMQoH25YwCYxi917J4pYm1nRXtdgiCdnlTkx5eRzqWEC64HtRa06WCJ9TIutpb6GmW4gFw==",
+					"dev": true,
+					"requires": {
+						"postcss-value-parser": "^4.2.0"
+					}
+				},
+				"postcss-normalize-timing-functions": {
+					"version": "5.0.2",
+					"resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.0.2.tgz",
+					"integrity": "sha512-Ao0PP6MoYsRU1LxeVUW740ioknvdIUmfr6uAA3xWlQJ9s69/Tupy8qwhuKG3xWfl+KvLMAP9p2WXF9cwuk/7Bg==",
+					"dev": true,
+					"requires": {
+						"postcss-value-parser": "^4.2.0"
+					}
+				},
+				"postcss-normalize-unicode": {
+					"version": "5.0.2",
+					"resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.0.2.tgz",
+					"integrity": "sha512-3y/V+vjZ19HNcTizeqwrbZSUsE69ZMRHfiiyLAJb7C7hJtYmM4Gsbajy7gKagu97E8q5rlS9k8FhojA8cpGhWw==",
+					"dev": true,
+					"requires": {
+						"browserslist": "^4.16.6",
+						"postcss-value-parser": "^4.2.0"
+					}
+				},
+				"postcss-normalize-url": {
+					"version": "5.0.4",
+					"resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.0.4.tgz",
+					"integrity": "sha512-cNj3RzK2pgQQyNp7dzq0dqpUpQ/wYtdDZM3DepPmFjCmYIfceuD9VIAcOdvrNetjIU65g1B4uwdP/Krf6AFdXg==",
+					"dev": true,
+					"requires": {
+						"normalize-url": "^6.0.1",
+						"postcss-value-parser": "^4.2.0"
+					}
+				},
+				"postcss-normalize-whitespace": {
+					"version": "5.0.2",
+					"resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.0.2.tgz",
+					"integrity": "sha512-CXBx+9fVlzSgbk0IXA/dcZn9lXixnQRndnsPC5ht3HxlQ1bVh77KQDL1GffJx1LTzzfae8ftMulsjYmO2yegxA==",
+					"dev": true,
+					"requires": {
+						"postcss-value-parser": "^4.2.0"
+					}
+				},
+				"postcss-ordered-values": {
+					"version": "5.0.3",
+					"resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.0.3.tgz",
+					"integrity": "sha512-T9pDS+P9bWeFvqivXd5ACzQmrCmHjv3ZP+djn8E1UZY7iK79pFSm7i3WbKw2VSmFmdbMm8sQ12OPcNpzBo3Z2w==",
+					"dev": true,
+					"requires": {
+						"cssnano-utils": "^3.0.0",
+						"postcss-value-parser": "^4.2.0"
+					}
+				},
+				"postcss-reduce-initial": {
+					"version": "5.0.2",
+					"resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.0.2.tgz",
+					"integrity": "sha512-v/kbAAQ+S1V5v9TJvbGkV98V2ERPdU6XvMcKMjqAlYiJ2NtsHGlKYLPjWWcXlaTKNxooId7BGxeraK8qXvzKtw==",
+					"dev": true,
+					"requires": {
+						"browserslist": "^4.16.6",
+						"caniuse-api": "^3.0.0"
+					}
+				},
+				"postcss-reduce-transforms": {
+					"version": "5.0.2",
+					"resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.0.2.tgz",
+					"integrity": "sha512-25HeDeFsgiPSUx69jJXZn8I06tMxLQJJNF5h7i9gsUg8iP4KOOJ8EX8fj3seeoLt3SLU2YDD6UPnDYVGUO7DEA==",
+					"dev": true,
+					"requires": {
+						"postcss-value-parser": "^4.2.0"
+					}
+				},
+				"postcss-svgo": {
+					"version": "5.0.3",
+					"resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.0.3.tgz",
+					"integrity": "sha512-41XZUA1wNDAZrQ3XgWREL/M2zSw8LJPvb5ZWivljBsUQAGoEKMYm6okHsTjJxKYI4M75RQEH4KYlEM52VwdXVA==",
+					"dev": true,
+					"requires": {
+						"postcss-value-parser": "^4.1.0",
+						"svgo": "^2.7.0"
+					}
+				},
+				"postcss-unique-selectors": {
+					"version": "5.0.2",
+					"resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.0.2.tgz",
+					"integrity": "sha512-w3zBVlrtZm7loQWRPVC0yjUwwpty7OM6DnEHkxcSQXO1bMS3RJ+JUS5LFMSDZHJcvGsRwhZinCWVqn8Kej4EDA==",
+					"dev": true,
+					"requires": {
+						"alphanum-sort": "^1.0.2",
+						"postcss-selector-parser": "^6.0.5"
+					},
+					"dependencies": {
+						"postcss-selector-parser": {
+							"version": "6.0.8",
+							"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz",
+							"integrity": "sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ==",
 							"dev": true,
 							"requires": {
-								"p-limit": "^2.0.0"
+								"cssesc": "^3.0.0",
+								"util-deprecate": "^1.0.2"
 							}
-						},
-						"path-exists": {
-							"version": "3.0.0",
-							"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-							"integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
+						}
+					}
+				},
+				"postcss-value-parser": {
+					"version": "4.2.0",
+					"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+					"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+					"dev": true
+				},
+				"prettier": {
+					"version": "npm:wp-prettier@2.2.1-beta-1",
+					"resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-2.2.1-beta-1.tgz",
+					"integrity": "sha512-+JHkqs9LC/JPp51yy1hzs3lQ7qeuWCwOcSzpQNeeY/G7oSpnF61vxt7hRh87zNRTr6ob2ndy0W8rVzhgrcA+Gw==",
+					"dev": true
+				},
+				"schema-utils": {
+					"version": "3.1.1",
+					"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
+					"integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+					"dev": true,
+					"requires": {
+						"@types/json-schema": "^7.0.8",
+						"ajv": "^6.12.5",
+						"ajv-keywords": "^3.5.2"
+					}
+				},
+				"serialize-javascript": {
+					"version": "6.0.0",
+					"resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz",
+					"integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==",
+					"dev": true,
+					"requires": {
+						"randombytes": "^2.1.0"
+					}
+				},
+				"source-map": {
+					"version": "0.6.1",
+					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+					"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+					"dev": true
+				},
+				"source-map-loader": {
+					"version": "3.0.1",
+					"resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz",
+					"integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==",
+					"dev": true,
+					"requires": {
+						"abab": "^2.0.5",
+						"iconv-lite": "^0.6.3",
+						"source-map-js": "^1.0.1"
+					}
+				},
+				"source-map-support": {
+					"version": "0.5.21",
+					"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+					"integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+					"dev": true,
+					"requires": {
+						"buffer-from": "^1.0.0",
+						"source-map": "^0.6.0"
+					}
+				},
+				"stylehacks": {
+					"version": "5.0.1",
+					"resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.0.1.tgz",
+					"integrity": "sha512-Es0rVnHIqbWzveU1b24kbw92HsebBepxfcqe5iix7t9j0PQqhs0IxXVXv0pY2Bxa08CgMkzD6OWql7kbGOuEdA==",
+					"dev": true,
+					"requires": {
+						"browserslist": "^4.16.0",
+						"postcss-selector-parser": "^6.0.4"
+					}
+				},
+				"supports-color": {
+					"version": "8.1.1",
+					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+					"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+					"dev": true,
+					"requires": {
+						"has-flag": "^4.0.0"
+					}
+				},
+				"svgo": {
+					"version": "2.8.0",
+					"resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz",
+					"integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==",
+					"dev": true,
+					"requires": {
+						"@trysound/sax": "0.2.0",
+						"commander": "^7.2.0",
+						"css-select": "^4.1.3",
+						"css-tree": "^1.1.3",
+						"csso": "^4.2.0",
+						"picocolors": "^1.0.0",
+						"stable": "^0.1.8"
+					}
+				},
+				"tapable": {
+					"version": "2.2.1",
+					"resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+					"integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+					"dev": true
+				},
+				"terser": {
+					"version": "5.10.0",
+					"resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz",
+					"integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==",
+					"dev": true,
+					"requires": {
+						"commander": "^2.20.0",
+						"source-map": "~0.7.2",
+						"source-map-support": "~0.5.20"
+					},
+					"dependencies": {
+						"commander": {
+							"version": "2.20.3",
+							"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+							"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
 							"dev": true
 						},
-						"pkg-dir": {
-							"version": "3.0.0",
-							"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
-							"integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
-							"dev": true,
-							"requires": {
-								"find-up": "^3.0.0"
-							}
-						},
-						"rimraf": {
-							"version": "2.7.1",
-							"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
-							"integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
-							"dev": true,
-							"requires": {
-								"glob": "^7.1.3"
-							}
-						},
-						"schema-utils": {
-							"version": "1.0.0",
-							"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
-							"integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
-							"dev": true,
-							"requires": {
-								"ajv": "^6.1.0",
-								"ajv-errors": "^1.0.0",
-								"ajv-keywords": "^3.1.0"
-							}
-						},
-						"semver": {
-							"version": "5.7.1",
-							"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-							"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+						"source-map": {
+							"version": "0.7.3",
+							"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
+							"integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
 							"dev": true
-						},
-						"ssri": {
-							"version": "6.0.2",
-							"resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz",
-							"integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==",
-							"dev": true,
-							"requires": {
-								"figgy-pudding": "^3.5.1"
-							}
-						},
-						"terser-webpack-plugin": {
-							"version": "1.4.5",
-							"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz",
-							"integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==",
-							"dev": true,
-							"requires": {
-								"cacache": "^12.0.2",
-								"find-cache-dir": "^2.1.0",
-								"is-wsl": "^1.1.0",
-								"schema-utils": "^1.0.0",
-								"serialize-javascript": "^4.0.0",
-								"source-map": "^0.6.1",
-								"terser": "^4.1.2",
-								"webpack-sources": "^1.4.0",
-								"worker-farm": "^1.7.0"
-							}
-						},
-						"webpack-sources": {
-							"version": "1.4.3",
-							"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
-							"integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
-							"dev": true,
-							"requires": {
-								"source-list-map": "^2.0.0",
-								"source-map": "~0.6.1"
-							}
 						}
 					}
 				},
-				"webpack-sources": {
+				"terser-webpack-plugin": {
+					"version": "5.3.0",
+					"resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz",
+					"integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==",
+					"dev": true,
+					"requires": {
+						"jest-worker": "^27.4.1",
+						"schema-utils": "^3.1.1",
+						"serialize-javascript": "^6.0.0",
+						"source-map": "^0.6.1",
+						"terser": "^5.7.2"
+					}
+				},
+				"watchpack": {
 					"version": "2.3.1",
-					"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz",
-					"integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==",
+					"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz",
+					"integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==",
 					"dev": true,
 					"requires": {
-						"source-list-map": "^2.0.1",
-						"source-map": "^0.6.1"
+						"glob-to-regexp": "^0.4.1",
+						"graceful-fs": "^4.1.2"
 					}
 				},
-				"yallist": {
-					"version": "3.1.1",
-					"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
-					"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+				"webpack": {
+					"version": "5.66.0",
+					"resolved": "https://registry.npmjs.org/webpack/-/webpack-5.66.0.tgz",
+					"integrity": "sha512-NJNtGT7IKpGzdW7Iwpn/09OXz9inIkeIQ/ibY6B+MdV1x6+uReqz/5z1L89ezWnpPDWpXF0TY5PCYKQdWVn8Vg==",
+					"dev": true,
+					"requires": {
+						"@types/eslint-scope": "^3.7.0",
+						"@types/estree": "^0.0.50",
+						"@webassemblyjs/ast": "1.11.1",
+						"@webassemblyjs/wasm-edit": "1.11.1",
+						"@webassemblyjs/wasm-parser": "1.11.1",
+						"acorn": "^8.4.1",
+						"acorn-import-assertions": "^1.7.6",
+						"browserslist": "^4.14.5",
+						"chrome-trace-event": "^1.0.2",
+						"enhanced-resolve": "^5.8.3",
+						"es-module-lexer": "^0.9.0",
+						"eslint-scope": "5.1.1",
+						"events": "^3.2.0",
+						"glob-to-regexp": "^0.4.1",
+						"graceful-fs": "^4.2.9",
+						"json-parse-better-errors": "^1.0.2",
+						"loader-runner": "^4.2.0",
+						"mime-types": "^2.1.27",
+						"neo-async": "^2.6.2",
+						"schema-utils": "^3.1.0",
+						"tapable": "^2.1.1",
+						"terser-webpack-plugin": "^5.1.3",
+						"watchpack": "^2.3.1",
+						"webpack-sources": "^3.2.2"
+					}
+				},
+				"webpack-livereload-plugin": {
+					"version": "3.0.2",
+					"resolved": "https://registry.npmjs.org/webpack-livereload-plugin/-/webpack-livereload-plugin-3.0.2.tgz",
+					"integrity": "sha512-5JeZ2dgsvSNG+clrkD/u2sEiPcNk4qwCVZZmW8KpqKcNlkGv7IJjdVrq13+etAmMZYaCF1EGXdHkVFuLgP4zfw==",
+					"dev": true,
+					"requires": {
+						"anymatch": "^3.1.1",
+						"portfinder": "^1.0.17",
+						"schema-utils": ">1.0.0",
+						"tiny-lr": "^1.1.1"
+					}
+				},
+				"webpack-sources": {
+					"version": "3.2.3",
+					"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+					"integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
 					"dev": true
 				}
 			}
 		},
 		"@wordpress/server-side-render": {
-			"version": "2.1.12",
-			"resolved": "https://registry.npmjs.org/@wordpress/server-side-render/-/server-side-render-2.1.12.tgz",
-			"integrity": "sha512-NrxFv/u6xzs97Pgyb0BbhB2f7pAII2trD8nyDY+/JfjNcTguulthRh9kmmPWp/vo6kgyEO1xyo6yHUnHLnh/vQ==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/api-fetch": "^5.1.2",
-				"@wordpress/blocks": "^9.1.8",
-				"@wordpress/components": "^14.1.11",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/data": "^5.1.6",
-				"@wordpress/deprecated": "^3.1.2",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/i18n": "^4.1.2",
-				"@wordpress/url": "^3.1.2",
+			"version": "3.0.19",
+			"resolved": "https://registry.npmjs.org/@wordpress/server-side-render/-/server-side-render-3.0.19.tgz",
+			"integrity": "sha512-9k3WOkIOFraWpfzK5Lh63jt74xhcw/FtlT8n0Yy0amUeM6PhBxkG7V2F2w8KeXUCh5yU4z2aG3QxwEV+0b99Ww==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/api-fetch": "^5.2.6",
+				"@wordpress/blocks": "^11.1.5",
+				"@wordpress/components": "^19.2.2",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/data": "^6.1.5",
+				"@wordpress/deprecated": "^3.2.3",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/i18n": "^4.2.4",
+				"@wordpress/url": "^3.3.1",
 				"lodash": "^4.17.21"
 			}
 		},
 		"@wordpress/shortcode": {
-			"version": "3.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/shortcode/-/shortcode-3.1.2.tgz",
-			"integrity": "sha512-pZQf4nu4iQdyQIz3OnphvPcKTL9jlEIR1a58icis+PDnqbr0gv4PGwS3Hbamlm4p7+bkxm5Pskfj3n3ykqwGLQ==",
+			"version": "3.2.3",
+			"resolved": "https://registry.npmjs.org/@wordpress/shortcode/-/shortcode-3.2.3.tgz",
+			"integrity": "sha512-zXIg2AbwJhJNCp55roC+wuyZQnMC/GLdgh95pAa5a7Hd+ThXf0hbBg+DP9lo1x+cxAZAEGZ/Bns/+SCUr1boTA==",
 			"requires": {
-				"@babel/runtime": "^7.13.10",
+				"@babel/runtime": "^7.16.0",
 				"lodash": "^4.17.21",
 				"memize": "^1.1.0"
 			}
@@ -4976,68 +5723,67 @@
 			}
 		},
 		"@wordpress/token-list": {
-			"version": "2.1.1",
-			"resolved": "https://registry.npmjs.org/@wordpress/token-list/-/token-list-2.1.1.tgz",
-			"integrity": "sha512-haBjgsroaRjNBZ/wHd6nZamYL3Yfrt0s13Py+aR1ZKtYv+/Rmwu9VB45iB6Xb/G+v3xexopEM8uA8Zks5PNxbQ==",
+			"version": "2.2.2",
+			"resolved": "https://registry.npmjs.org/@wordpress/token-list/-/token-list-2.2.2.tgz",
+			"integrity": "sha512-JElgvK1NsQVfSnR51qWDV7cEB/2U7saV+MKDxdmP7mhcwg538AVyKTkOdmzYrx/9fqOEf0bkWOt3WX9xLD35kQ==",
 			"requires": {
-				"@babel/runtime": "^7.13.10",
+				"@babel/runtime": "^7.16.0",
 				"lodash": "^4.17.21"
 			}
 		},
 		"@wordpress/url": {
-			"version": "3.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/url/-/url-3.1.2.tgz",
-			"integrity": "sha512-hT214NQG2p+FiL4jdKPJItHMEeA70uqvhKlnPOa7qqf9u+6QMnhVplxFxWSIu5cB7glmx5JQG4EMR2Ohz3jgTg==",
+			"version": "3.3.1",
+			"resolved": "https://registry.npmjs.org/@wordpress/url/-/url-3.3.1.tgz",
+			"integrity": "sha512-lEuvkNjPoVuzYy0zn6n9gfMdNlHJW36EsPI2yDzMICjIAV5lRv1/uOg2Ls3lbDaRR2vm1FAiMpB2RAMzfR8Nfg==",
 			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"lodash": "^4.17.21",
-				"react-native-url-polyfill": "^1.1.2"
+				"@babel/runtime": "^7.16.0",
+				"lodash": "^4.17.21"
 			}
 		},
 		"@wordpress/viewport": {
-			"version": "3.1.6",
-			"resolved": "https://registry.npmjs.org/@wordpress/viewport/-/viewport-3.1.6.tgz",
-			"integrity": "sha512-SwIL26Nd691mO8R21GUrODjVqJx1Y1DVNHbX9VusJxvf7citc94dZnXXHiQ8zc7vlg5ryMBF49/EFn8rZ8Zn8w==",
+			"version": "4.0.7",
+			"resolved": "https://registry.npmjs.org/@wordpress/viewport/-/viewport-4.0.7.tgz",
+			"integrity": "sha512-huxUrFW6JNhj/hUfvftZeht3B6HF0jk10oyHW3dPcFW57ceecJTDB9BdS7a99B1LBP8AWjdN8x/3SqrMwE4yfg==",
 			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/data": "^5.1.6",
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/data": "^6.1.5",
 				"lodash": "^4.17.21"
 			}
 		},
 		"@wordpress/warning": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-2.1.2.tgz",
-			"integrity": "sha512-MqMo5AYffG/Gi3h1uRFJGBxp4TGmxw+7A4W81oe7VC9linJYhbNyeyvaMlL02m06KG2szWwl4fn0bdhyre433w=="
+			"version": "2.2.2",
+			"resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-2.2.2.tgz",
+			"integrity": "sha512-iG1Hq56RK3N6AJqAD1sRLWRIJatfYn+NrPyrfqRNZNYXHM8Vj/s7ABNMbIU0Y99vXkBE83rvCdbMkugNoI2jXA=="
 		},
 		"@wordpress/widgets": {
-			"version": "1.1.19",
-			"resolved": "https://registry.npmjs.org/@wordpress/widgets/-/widgets-1.1.19.tgz",
-			"integrity": "sha512-6ojIQVbeeS3fhXs+nNdmKIc6BtYnPoPq6qXLcTFGV9yXPJs8zX5RRdI3ziEFeV/IILCoIk4fmbw87ncIQwahQA==",
-			"requires": {
-				"@babel/runtime": "^7.13.10",
-				"@wordpress/api-fetch": "^5.1.2",
-				"@wordpress/block-editor": "^6.1.14",
-				"@wordpress/blocks": "^9.1.8",
-				"@wordpress/components": "^14.1.11",
-				"@wordpress/compose": "^4.1.6",
-				"@wordpress/core-data": "^3.1.12",
-				"@wordpress/data": "^5.1.6",
-				"@wordpress/element": "^3.1.2",
-				"@wordpress/i18n": "^4.1.2",
-				"@wordpress/icons": "^4.0.3",
-				"@wordpress/notices": "^3.1.6",
-				"@wordpress/url": "^3.1.2",
-				"classnames": "^2.2.5",
+			"version": "2.0.22",
+			"resolved": "https://registry.npmjs.org/@wordpress/widgets/-/widgets-2.0.22.tgz",
+			"integrity": "sha512-6aMNxq3tbzcC5vqxCZSvTeo64mlN2ri4BX1kZNHkE+tSMhnzWwDQKSRFDZbH9k5U+KAIXrUA+HzbcjHrDiWpEg==",
+			"requires": {
+				"@babel/runtime": "^7.16.0",
+				"@wordpress/api-fetch": "^5.2.6",
+				"@wordpress/block-editor": "^8.0.16",
+				"@wordpress/blocks": "^11.1.5",
+				"@wordpress/components": "^19.2.2",
+				"@wordpress/compose": "^5.0.7",
+				"@wordpress/core-data": "^4.0.9",
+				"@wordpress/data": "^6.1.5",
+				"@wordpress/element": "^4.0.4",
+				"@wordpress/i18n": "^4.2.4",
+				"@wordpress/icons": "^6.1.1",
+				"@wordpress/notices": "^3.2.8",
+				"@wordpress/url": "^3.3.1",
+				"classnames": "^2.3.1",
 				"lodash": "^4.17.21"
 			}
 		},
 		"@wordpress/wordcount": {
-			"version": "3.1.2",
-			"resolved": "https://registry.npmjs.org/@wordpress/wordcount/-/wordcount-3.1.2.tgz",
-			"integrity": "sha512-jFumH3IJzbEtGupxfre7asRMF6zHmNPeOlNgJw7luaeE1YFwgXkCtflDFf2Y6fC09xJmwuDPwxLnoII8RLhNtQ==",
+			"version": "3.2.3",
+			"resolved": "https://registry.npmjs.org/@wordpress/wordcount/-/wordcount-3.2.3.tgz",
+			"integrity": "sha512-iguvGA4zU1tB0avpzIzVdVrIeH0CbeiOlhbYgtkQ5J2UqdRs6lo7pZFlp/3HAvmtBo8r2iGlbc+QZgKzR6gdJw==",
 			"requires": {
-				"@babel/runtime": "^7.13.10",
+				"@babel/runtime": "^7.16.0",
 				"lodash": "^4.17.21"
 			}
 		},
@@ -5111,6 +5857,12 @@
 				}
 			}
 		},
+		"acorn-import-assertions": {
+			"version": "1.8.0",
+			"resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz",
+			"integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==",
+			"dev": true
+		},
 		"acorn-jsx": {
 			"version": "5.3.2",
 			"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
@@ -5129,24 +5881,6 @@
 			"integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==",
 			"dev": true
 		},
-		"aggregate-error": {
-			"version": "3.1.0",
-			"resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
-			"integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
-			"dev": true,
-			"requires": {
-				"clean-stack": "^2.0.0",
-				"indent-string": "^4.0.0"
-			},
-			"dependencies": {
-				"indent-string": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
-					"integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
-					"dev": true
-				}
-			}
-		},
 		"airbnb-prop-types": {
 			"version": "2.16.0",
 			"resolved": "https://registry.npmjs.org/airbnb-prop-types/-/airbnb-prop-types-2.16.0.tgz",
@@ -5181,6 +5915,35 @@
 			"integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
 			"dev": true
 		},
+		"ajv-formats": {
+			"version": "2.1.1",
+			"resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+			"integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+			"dev": true,
+			"requires": {
+				"ajv": "^8.0.0"
+			},
+			"dependencies": {
+				"ajv": {
+					"version": "8.9.0",
+					"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz",
+					"integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==",
+					"dev": true,
+					"requires": {
+						"fast-deep-equal": "^3.1.1",
+						"json-schema-traverse": "^1.0.0",
+						"require-from-string": "^2.0.2",
+						"uri-js": "^4.2.2"
+					}
+				},
+				"json-schema-traverse": {
+					"version": "1.0.0",
+					"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+					"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+					"dev": true
+				}
+			}
+		},
 		"ajv-keywords": {
 			"version": "3.5.2",
 			"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
@@ -5351,16 +6114,16 @@
 			"dev": true
 		},
 		"array-includes": {
-			"version": "3.1.3",
-			"resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz",
-			"integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==",
+			"version": "3.1.4",
+			"resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz",
+			"integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==",
 			"dev": true,
 			"requires": {
 				"call-bind": "^1.0.2",
 				"define-properties": "^1.1.3",
-				"es-abstract": "^1.18.0-next.2",
+				"es-abstract": "^1.19.1",
 				"get-intrinsic": "^1.1.1",
-				"is-string": "^1.0.5"
+				"is-string": "^1.0.7"
 			},
 			"dependencies": {
 				"call-bind": {
@@ -5374,22 +6137,25 @@
 					}
 				},
 				"es-abstract": {
-					"version": "1.18.5",
-					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz",
-					"integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==",
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
 					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
 						"es-to-primitive": "^1.2.1",
 						"function-bind": "^1.1.1",
 						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
 						"has": "^1.0.3",
 						"has-symbols": "^1.0.2",
 						"internal-slot": "^1.0.3",
-						"is-callable": "^1.2.3",
+						"is-callable": "^1.2.4",
 						"is-negative-zero": "^2.0.1",
-						"is-regex": "^1.1.3",
-						"is-string": "^1.0.6",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
 						"object-inspect": "^1.11.0",
 						"object-keys": "^1.1.1",
 						"object.assign": "^4.1.2",
@@ -5406,16 +6172,157 @@
 						}
 					}
 				},
-				"get-intrinsic": {
-					"version": "1.1.1",
-					"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
-					"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
-					"dev": true,
-					"requires": {
-						"function-bind": "^1.1.1",
-						"has": "^1.0.3",
-						"has-symbols": "^1.0.1"
-					}
+				"get-intrinsic": {
+					"version": "1.1.1",
+					"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+					"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+					"dev": true,
+					"requires": {
+						"function-bind": "^1.1.1",
+						"has": "^1.0.3",
+						"has-symbols": "^1.0.1"
+					}
+				},
+				"is-callable": {
+					"version": "1.2.4",
+					"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
+					"integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
+					"dev": true
+				},
+				"is-regex": {
+					"version": "1.1.4",
+					"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+					"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+					"dev": true,
+					"requires": {
+						"call-bind": "^1.0.2",
+						"has-tostringtag": "^1.0.0"
+					}
+				},
+				"object-inspect": {
+					"version": "1.12.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
+					"integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
+					"dev": true
+				},
+				"string.prototype.trimend": {
+					"version": "1.0.4",
+					"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
+					"integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
+					"dev": true,
+					"requires": {
+						"call-bind": "^1.0.2",
+						"define-properties": "^1.1.3"
+					}
+				},
+				"string.prototype.trimstart": {
+					"version": "1.0.4",
+					"resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
+					"integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
+					"dev": true,
+					"requires": {
+						"call-bind": "^1.0.2",
+						"define-properties": "^1.1.3"
+					}
+				}
+			}
+		},
+		"array-slice": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
+			"integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
+			"dev": true
+		},
+		"array-union": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+			"integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+			"dev": true,
+			"requires": {
+				"array-uniq": "^1.0.1"
+			}
+		},
+		"array-uniq": {
+			"version": "1.0.3",
+			"resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+			"integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
+			"dev": true
+		},
+		"array-unique": {
+			"version": "0.3.2",
+			"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+			"integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
+			"dev": true
+		},
+		"array.prototype.filter": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.1.tgz",
+			"integrity": "sha512-Dk3Ty7N42Odk7PjU/Ci3zT4pLj20YvuVnneG/58ICM6bt4Ij5kZaJTVQ9TSaWaIECX2sFyz4KItkVZqHNnciqw==",
+			"dev": true,
+			"requires": {
+				"call-bind": "^1.0.2",
+				"define-properties": "^1.1.3",
+				"es-abstract": "^1.19.0",
+				"es-array-method-boxes-properly": "^1.0.0",
+				"is-string": "^1.0.7"
+			},
+			"dependencies": {
+				"call-bind": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+					"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+					"dev": true,
+					"requires": {
+						"function-bind": "^1.1.1",
+						"get-intrinsic": "^1.0.2"
+					}
+				},
+				"es-abstract": {
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
+					"dev": true,
+					"requires": {
+						"call-bind": "^1.0.2",
+						"es-to-primitive": "^1.2.1",
+						"function-bind": "^1.1.1",
+						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
+						"has": "^1.0.3",
+						"has-symbols": "^1.0.2",
+						"internal-slot": "^1.0.3",
+						"is-callable": "^1.2.4",
+						"is-negative-zero": "^2.0.1",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
+						"object-inspect": "^1.11.0",
+						"object-keys": "^1.1.1",
+						"object.assign": "^4.1.2",
+						"string.prototype.trimend": "^1.0.4",
+						"string.prototype.trimstart": "^1.0.4",
+						"unbox-primitive": "^1.0.1"
+					},
+					"dependencies": {
+						"get-intrinsic": {
+							"version": "1.1.1",
+							"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+							"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+							"dev": true,
+							"requires": {
+								"function-bind": "^1.1.1",
+								"has": "^1.0.3",
+								"has-symbols": "^1.0.1"
+							}
+						}
+					}
+				},
+				"has-symbols": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+					"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+					"dev": true
 				},
 				"is-callable": {
 					"version": "1.2.4",
@@ -5434,9 +6341,9 @@
 					}
 				},
 				"object-inspect": {
-					"version": "1.11.0",
-					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
-					"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
+					"version": "1.12.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
+					"integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
 					"dev": true
 				},
 				"string.prototype.trimend": {
@@ -5461,73 +6368,44 @@
 				}
 			}
 		},
-		"array-slice": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz",
-			"integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==",
-			"dev": true
-		},
-		"array-union": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
-			"integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
-			"dev": true,
-			"requires": {
-				"array-uniq": "^1.0.1"
-			}
-		},
-		"array-uniq": {
-			"version": "1.0.3",
-			"resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
-			"integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=",
-			"dev": true
-		},
-		"array-unique": {
-			"version": "0.3.2",
-			"resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
-			"integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
-			"dev": true
-		},
-		"array.prototype.filter": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.0.tgz",
-			"integrity": "sha512-TfO1gz+tLm+Bswq0FBOXPqAchtCr2Rn48T8dLJoRFl8NoEosjZmzptmuo1X8aZBzZcqsR1W8U761tjACJtngTQ==",
-			"dev": true,
+		"array.prototype.find": {
+			"version": "2.1.2",
+			"resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.2.tgz",
+			"integrity": "sha512-00S1O4ewO95OmmJW7EesWfQlrCrLEL8kZ40w3+GkLX2yTt0m2ggcePPa2uHPJ9KUmJvwRq+lCV9bD8Yim23x/Q==",
 			"requires": {
 				"call-bind": "^1.0.2",
 				"define-properties": "^1.1.3",
-				"es-abstract": "^1.18.0",
-				"es-array-method-boxes-properly": "^1.0.0",
-				"is-string": "^1.0.5"
+				"es-abstract": "^1.19.0"
 			},
 			"dependencies": {
 				"call-bind": {
 					"version": "1.0.2",
 					"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
 					"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
-					"dev": true,
 					"requires": {
 						"function-bind": "^1.1.1",
 						"get-intrinsic": "^1.0.2"
 					}
 				},
 				"es-abstract": {
-					"version": "1.18.5",
-					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz",
-					"integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==",
-					"dev": true,
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
 					"requires": {
 						"call-bind": "^1.0.2",
 						"es-to-primitive": "^1.2.1",
 						"function-bind": "^1.1.1",
 						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
 						"has": "^1.0.3",
 						"has-symbols": "^1.0.2",
 						"internal-slot": "^1.0.3",
-						"is-callable": "^1.2.3",
+						"is-callable": "^1.2.4",
 						"is-negative-zero": "^2.0.1",
-						"is-regex": "^1.1.3",
-						"is-string": "^1.0.6",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
 						"object-inspect": "^1.11.0",
 						"object-keys": "^1.1.1",
 						"object.assign": "^4.1.2",
@@ -5540,7 +6418,6 @@
 							"version": "1.1.1",
 							"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
 							"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
-							"dev": true,
 							"requires": {
 								"function-bind": "^1.1.1",
 								"has": "^1.0.3",
@@ -5552,36 +6429,31 @@
 				"has-symbols": {
 					"version": "1.0.2",
 					"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
-					"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
-					"dev": true
+					"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
 				},
 				"is-callable": {
 					"version": "1.2.4",
 					"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
-					"integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
-					"dev": true
+					"integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w=="
 				},
 				"is-regex": {
 					"version": "1.1.4",
 					"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
 					"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
-					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
 						"has-tostringtag": "^1.0.0"
 					}
 				},
 				"object-inspect": {
-					"version": "1.11.0",
-					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
-					"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
-					"dev": true
+					"version": "1.12.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
+					"integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g=="
 				},
 				"string.prototype.trimend": {
 					"version": "1.0.4",
 					"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
 					"integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
-					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
 						"define-properties": "^1.1.3"
@@ -5591,7 +6463,6 @@
 					"version": "1.0.4",
 					"resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
 					"integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
-					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
 						"define-properties": "^1.1.3"
@@ -5599,41 +6470,44 @@
 				}
 			}
 		},
-		"array.prototype.find": {
-			"version": "2.1.1",
-			"resolved": "https://registry.npmjs.org/array.prototype.find/-/array.prototype.find-2.1.1.tgz",
-			"integrity": "sha512-mi+MYNJYLTx2eNYy+Yh6raoQacCsNeeMUaspFPh9Y141lFSsWxxB8V9mM2ye+eqiRs917J6/pJ4M9ZPzenWckA==",
-			"requires": {
-				"define-properties": "^1.1.3",
-				"es-abstract": "^1.17.4"
-			}
-		},
 		"array.prototype.flat": {
-			"version": "1.2.4",
-			"resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz",
-			"integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==",
+			"version": "1.2.5",
+			"resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz",
+			"integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==",
 			"requires": {
-				"call-bind": "^1.0.0",
+				"call-bind": "^1.0.2",
 				"define-properties": "^1.1.3",
-				"es-abstract": "^1.18.0-next.1"
+				"es-abstract": "^1.19.0"
 			},
 			"dependencies": {
+				"call-bind": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+					"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+					"requires": {
+						"function-bind": "^1.1.1",
+						"get-intrinsic": "^1.0.2"
+					}
+				},
 				"es-abstract": {
-					"version": "1.18.5",
-					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz",
-					"integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==",
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
 					"requires": {
 						"call-bind": "^1.0.2",
 						"es-to-primitive": "^1.2.1",
 						"function-bind": "^1.1.1",
 						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
 						"has": "^1.0.3",
 						"has-symbols": "^1.0.2",
 						"internal-slot": "^1.0.3",
-						"is-callable": "^1.2.3",
+						"is-callable": "^1.2.4",
 						"is-negative-zero": "^2.0.1",
-						"is-regex": "^1.1.3",
-						"is-string": "^1.0.6",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
 						"object-inspect": "^1.11.0",
 						"object-keys": "^1.1.1",
 						"object.assign": "^4.1.2",
@@ -5642,27 +6516,18 @@
 						"unbox-primitive": "^1.0.1"
 					},
 					"dependencies": {
-						"call-bind": {
-							"version": "1.0.2",
-							"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
-							"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+						"get-intrinsic": {
+							"version": "1.1.1",
+							"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+							"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
 							"requires": {
 								"function-bind": "^1.1.1",
-								"get-intrinsic": "^1.0.2"
+								"has": "^1.0.3",
+								"has-symbols": "^1.0.1"
 							}
 						}
 					}
 				},
-				"get-intrinsic": {
-					"version": "1.1.1",
-					"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
-					"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
-					"requires": {
-						"function-bind": "^1.1.1",
-						"has": "^1.0.3",
-						"has-symbols": "^1.0.1"
-					}
-				},
 				"has-symbols": {
 					"version": "1.0.2",
 					"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
@@ -5680,23 +6545,12 @@
 					"requires": {
 						"call-bind": "^1.0.2",
 						"has-tostringtag": "^1.0.0"
-					},
-					"dependencies": {
-						"call-bind": {
-							"version": "1.0.2",
-							"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
-							"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
-							"requires": {
-								"function-bind": "^1.1.1",
-								"get-intrinsic": "^1.0.2"
-							}
-						}
 					}
 				},
 				"object-inspect": {
-					"version": "1.11.0",
-					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
-					"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg=="
+					"version": "1.12.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
+					"integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g=="
 				},
 				"string.prototype.trimend": {
 					"version": "1.0.4",
@@ -5705,17 +6559,6 @@
 					"requires": {
 						"call-bind": "^1.0.2",
 						"define-properties": "^1.1.3"
-					},
-					"dependencies": {
-						"call-bind": {
-							"version": "1.0.2",
-							"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
-							"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
-							"requires": {
-								"function-bind": "^1.1.1",
-								"get-intrinsic": "^1.0.2"
-							}
-						}
 					}
 				},
 				"string.prototype.trimstart": {
@@ -5725,50 +6568,41 @@
 					"requires": {
 						"call-bind": "^1.0.2",
 						"define-properties": "^1.1.3"
-					},
-					"dependencies": {
-						"call-bind": {
-							"version": "1.0.2",
-							"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
-							"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
-							"requires": {
-								"function-bind": "^1.1.1",
-								"get-intrinsic": "^1.0.2"
-							}
-						}
 					}
 				}
 			}
 		},
 		"array.prototype.flatmap": {
-			"version": "1.2.4",
-			"resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz",
-			"integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==",
+			"version": "1.2.5",
+			"resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz",
+			"integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==",
 			"dev": true,
 			"requires": {
 				"call-bind": "^1.0.0",
 				"define-properties": "^1.1.3",
-				"es-abstract": "^1.18.0-next.1",
-				"function-bind": "^1.1.1"
+				"es-abstract": "^1.19.0"
 			},
 			"dependencies": {
 				"es-abstract": {
-					"version": "1.18.5",
-					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz",
-					"integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==",
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
 					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
 						"es-to-primitive": "^1.2.1",
 						"function-bind": "^1.1.1",
 						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
 						"has": "^1.0.3",
 						"has-symbols": "^1.0.2",
 						"internal-slot": "^1.0.3",
-						"is-callable": "^1.2.3",
+						"is-callable": "^1.2.4",
 						"is-negative-zero": "^2.0.1",
-						"is-regex": "^1.1.3",
-						"is-string": "^1.0.6",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
 						"object-inspect": "^1.11.0",
 						"object-keys": "^1.1.1",
 						"object.assign": "^4.1.2",
@@ -5835,9 +6669,9 @@
 					}
 				},
 				"object-inspect": {
-					"version": "1.11.0",
-					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
-					"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
+					"version": "1.12.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
+					"integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
 					"dev": true
 				},
 				"string.prototype.trimend": {
@@ -6005,20 +6839,26 @@
 			"integrity": "sha1-S3KPrwoZVVGU1PvQVYL4M/3NE3s="
 		},
 		"autoprefixer": {
-			"version": "9.8.6",
-			"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz",
-			"integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==",
+			"version": "9.8.8",
+			"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz",
+			"integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==",
 			"dev": true,
 			"requires": {
 				"browserslist": "^4.12.0",
 				"caniuse-lite": "^1.0.30001109",
-				"colorette": "^1.2.1",
 				"normalize-range": "^0.1.2",
 				"num2fraction": "^1.2.2",
+				"picocolors": "^0.2.1",
 				"postcss": "^7.0.32",
 				"postcss-value-parser": "^4.1.0"
 			},
 			"dependencies": {
+				"picocolors": {
+					"version": "0.2.1",
+					"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+					"integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+					"dev": true
+				},
 				"postcss-value-parser": {
 					"version": "4.1.0",
 					"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
@@ -6045,18 +6885,26 @@
 			"dev": true
 		},
 		"axe-core": {
-			"version": "4.3.3",
-			"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.3.tgz",
-			"integrity": "sha512-/lqqLAmuIPi79WYfRpy2i8z+x+vxU3zX2uAm0gs1q52qTuKwolOj1P8XbufpXcsydrpKx2yGn2wzAnxCMV86QA==",
+			"version": "4.3.5",
+			"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz",
+			"integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==",
 			"dev": true
 		},
 		"axios": {
-			"version": "0.21.1",
-			"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
-			"integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
+			"version": "0.21.4",
+			"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
+			"integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
 			"dev": true,
 			"requires": {
-				"follow-redirects": "^1.10.0"
+				"follow-redirects": "^1.14.0"
+			},
+			"dependencies": {
+				"follow-redirects": {
+					"version": "1.14.5",
+					"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.5.tgz",
+					"integrity": "sha512-wtphSXy7d4/OR+MvIFbCVBDzZ5520qV8XfPklSN5QtxuMUJZ+b0Wnst1e1lCDocfzuCkHqj8k0FpZqO+UIaKNA==",
+					"dev": true
+				}
 			}
 		},
 		"axobject-query": {
@@ -6065,28 +6913,6 @@
 			"integrity": "sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==",
 			"dev": true
 		},
-		"babel-eslint": {
-			"version": "10.1.0",
-			"resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.1.0.tgz",
-			"integrity": "sha512-ifWaTHQ0ce+448CYop8AdrQiBsGrnC+bMgfyKFdi6EsPLTAWG+QfyDeM6OH+FmWnKvEq5NnBMLvlBUPKQZoDSg==",
-			"dev": true,
-			"requires": {
-				"@babel/code-frame": "^7.0.0",
-				"@babel/parser": "^7.7.0",
-				"@babel/traverse": "^7.7.0",
-				"@babel/types": "^7.7.0",
-				"eslint-visitor-keys": "^1.0.0",
-				"resolve": "^1.12.0"
-			},
-			"dependencies": {
-				"eslint-visitor-keys": {
-					"version": "1.3.0",
-					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-					"integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-					"dev": true
-				}
-			}
-		},
 		"babel-jest": {
 			"version": "26.6.3",
 			"resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-26.6.3.tgz",
@@ -6104,9 +6930,9 @@
 			}
 		},
 		"babel-loader": {
-			"version": "8.2.2",
-			"resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz",
-			"integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==",
+			"version": "8.2.3",
+			"resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz",
+			"integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==",
 			"dev": true,
 			"requires": {
 				"find-cache-dir": "^3.3.1",
@@ -6206,33 +7032,16 @@
 				"object.assign": "^4.1.0"
 			}
 		},
-		"babel-plugin-emotion": {
-			"version": "10.2.2",
-			"resolved": "https://registry.npmjs.org/babel-plugin-emotion/-/babel-plugin-emotion-10.2.2.tgz",
-			"integrity": "sha512-SMSkGoqTbTyUTDeuVuPIWifPdUGkTk1Kf9BWRiXIOIcuyMfsdp2EjeiiFvOzX8NOBvEh/ypKYvUh2rkgAJMCLA==",
-			"requires": {
-				"@babel/helper-module-imports": "^7.0.0",
-				"@emotion/hash": "0.8.0",
-				"@emotion/memoize": "0.7.4",
-				"@emotion/serialize": "^0.11.16",
-				"babel-plugin-macros": "^2.0.0",
-				"babel-plugin-syntax-jsx": "^6.18.0",
-				"convert-source-map": "^1.5.0",
-				"escape-string-regexp": "^1.0.5",
-				"find-root": "^1.1.0",
-				"source-map": "^0.5.7"
-			}
-		},
 		"babel-plugin-istanbul": {
-			"version": "6.0.0",
-			"resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz",
-			"integrity": "sha512-AF55rZXpe7trmEylbaE1Gv54wn6rwU03aptvRoVIGP8YykoSxqdVLV1TfwflBCE/QtHmqtP8SWlTENqbK8GCSQ==",
+			"version": "6.1.1",
+			"resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
+			"integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
 			"dev": true,
 			"requires": {
 				"@babel/helper-plugin-utils": "^7.0.0",
 				"@istanbuljs/load-nyc-config": "^1.0.0",
 				"@istanbuljs/schema": "^0.1.2",
-				"istanbul-lib-instrument": "^4.0.0",
+				"istanbul-lib-instrument": "^5.0.4",
 				"test-exclude": "^6.0.0"
 			}
 		},
@@ -6259,13 +7068,13 @@
 			}
 		},
 		"babel-plugin-polyfill-corejs2": {
-			"version": "0.2.2",
-			"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.2.tgz",
-			"integrity": "sha512-kISrENsJ0z5dNPq5eRvcctITNHYXWOA4DUZRFYCz3jYCcvTb/A546LIddmoGNMVYg2U38OyFeNosQwI9ENTqIQ==",
+			"version": "0.3.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz",
+			"integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==",
 			"dev": true,
 			"requires": {
 				"@babel/compat-data": "^7.13.11",
-				"@babel/helper-define-polyfill-provider": "^0.2.2",
+				"@babel/helper-define-polyfill-provider": "^0.3.0",
 				"semver": "^6.1.1"
 			},
 			"dependencies": {
@@ -6278,29 +7087,24 @@
 			}
 		},
 		"babel-plugin-polyfill-corejs3": {
-			"version": "0.2.4",
-			"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.4.tgz",
-			"integrity": "sha512-z3HnJE5TY/j4EFEa/qpQMSbcUJZ5JQi+3UFjXzn6pQCmIKc5Ug5j98SuYyH+m4xQnvKlMDIW4plLfgyVnd0IcQ==",
+			"version": "0.4.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz",
+			"integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-define-polyfill-provider": "^0.2.2",
-				"core-js-compat": "^3.14.0"
+				"@babel/helper-define-polyfill-provider": "^0.3.0",
+				"core-js-compat": "^3.18.0"
 			}
 		},
 		"babel-plugin-polyfill-regenerator": {
-			"version": "0.2.2",
-			"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.2.tgz",
-			"integrity": "sha512-Goy5ghsc21HgPDFtzRkSirpZVW35meGoTmTOb2bxqdl60ghub4xOidgNTHaZfQ2FaxQsKmwvXtOAkcIS4SMBWg==",
+			"version": "0.3.0",
+			"resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz",
+			"integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==",
 			"dev": true,
 			"requires": {
-				"@babel/helper-define-polyfill-provider": "^0.2.2"
+				"@babel/helper-define-polyfill-provider": "^0.3.0"
 			}
 		},
-		"babel-plugin-syntax-jsx": {
-			"version": "6.18.0",
-			"resolved": "https://registry.npmjs.org/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz",
-			"integrity": "sha1-CvMqmm4Tyno/1QaeYtew9Y0NiUY="
-		},
 		"babel-preset-current-node-syntax": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz",
@@ -6419,7 +7223,8 @@
 		"base64-js": {
 			"version": "1.5.1",
 			"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
-			"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
+			"integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+			"dev": true
 		},
 		"base64id": {
 			"version": "2.0.0",
@@ -7060,6 +7865,7 @@
 			"version": "5.7.1",
 			"resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
 			"integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+			"dev": true,
 			"requires": {
 				"base64-js": "^1.3.1",
 				"ieee754": "^1.1.13"
@@ -7391,9 +8197,9 @@
 			}
 		},
 		"chalk": {
-			"version": "4.1.1",
-			"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
-			"integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+			"version": "4.1.2",
+			"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+			"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
 			"dev": true,
 			"requires": {
 				"ansi-styles": "^4.1.0",
@@ -7573,12 +8379,6 @@
 					"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
 					"integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
 					"dev": true
-				},
-				"tslib": {
-					"version": "2.3.1",
-					"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
-					"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==",
-					"dev": true
 				}
 			}
 		},
@@ -7596,22 +8396,22 @@
 			},
 			"dependencies": {
 				"css-select": {
-					"version": "4.1.3",
-					"resolved": "https://registry.npmjs.org/css-select/-/css-select-4.1.3.tgz",
-					"integrity": "sha512-gT3wBNd9Nj49rAbmtFHj1cljIAOLYSX1nZ8CB7TBO3INYckygm5B7LISU/szY//YmdiSLbJvDLOx9VnMVpMBxA==",
+					"version": "4.2.1",
+					"resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz",
+					"integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==",
 					"dev": true,
 					"requires": {
 						"boolbase": "^1.0.0",
-						"css-what": "^5.0.0",
-						"domhandler": "^4.2.0",
-						"domutils": "^2.6.0",
-						"nth-check": "^2.0.0"
+						"css-what": "^5.1.0",
+						"domhandler": "^4.3.0",
+						"domutils": "^2.8.0",
+						"nth-check": "^2.0.1"
 					}
 				},
 				"css-what": {
-					"version": "5.0.1",
-					"resolved": "https://registry.npmjs.org/css-what/-/css-what-5.0.1.tgz",
-					"integrity": "sha512-FYDTSHb/7KXsWICVsxdmiExPjCfRC4qRFBdVwv7Ax9hMnvMmEjP9RfxTEZ3qPZGmADDn2vAKSo9UcN1jKVYscg==",
+					"version": "5.1.0",
+					"resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz",
+					"integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==",
 					"dev": true
 				},
 				"dom-serializer": {
@@ -7643,9 +8443,9 @@
 					}
 				},
 				"nth-check": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz",
-					"integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==",
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz",
+					"integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==",
 					"dev": true,
 					"requires": {
 						"boolbase": "^1.0.0"
@@ -7794,12 +8594,6 @@
 				}
 			}
 		},
-		"clean-stack": {
-			"version": "2.2.0",
-			"resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
-			"integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
-			"dev": true
-		},
 		"clean-webpack-plugin": {
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz",
@@ -7923,12 +8717,6 @@
 			"integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==",
 			"dev": true
 		},
-		"collapse-white-space": {
-			"version": "1.0.6",
-			"resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz",
-			"integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==",
-			"dev": true
-		},
 		"collect-v8-coverage": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz",
@@ -7978,10 +8766,15 @@
 				"simple-swizzle": "^0.2.2"
 			}
 		},
+		"colord": {
+			"version": "2.9.2",
+			"resolved": "https://registry.npmjs.org/colord/-/colord-2.9.2.tgz",
+			"integrity": "sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ=="
+		},
 		"colorette": {
-			"version": "1.2.1",
-			"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz",
-			"integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==",
+			"version": "2.0.16",
+			"resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz",
+			"integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==",
 			"dev": true
 		},
 		"colors": {
@@ -8006,9 +8799,9 @@
 			"dev": true
 		},
 		"comment-parser": {
-			"version": "1.1.5",
-			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.1.5.tgz",
-			"integrity": "sha512-RePCE4leIhBlmrqiYTvaqEeGYg7qpSl4etaIabKtdOQVi+mSTIBBklGUwIr79GXYnl3LpMwmDw4KeR2stNc6FA==",
+			"version": "1.2.4",
+			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.2.4.tgz",
+			"integrity": "sha512-pm0b+qv+CkWNriSTMsfnjChF9kH0kxz55y44Wo5le9qLxMj5xDQAaEd9ZN1ovSuk9CsrncWaFwgpOMg7ClJwkw==",
 			"dev": true
 		},
 		"commondir": {
@@ -8338,56 +9131,50 @@
 			}
 		},
 		"core-js": {
-			"version": "3.17.0",
-			"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.17.0.tgz",
-			"integrity": "sha512-zXT4rclS9jM6tikbAUKAGLonuRKOJ2ZvBnZCEOJAbzuTLw4kKcuA5plNt8juzdU6O/py/EgAehzvLh0VXEdBbQ==",
+			"version": "3.20.0",
+			"resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.0.tgz",
+			"integrity": "sha512-KjbKU7UEfg4YPpskMtMXPhUKn7m/1OdTHTVjy09ScR2LVaoUXe8Jh0UdvN2EKUR6iKTJph52SJP95mAB0MnVLQ==",
 			"dev": true
 		},
 		"core-js-compat": {
-			"version": "3.17.0",
-			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.17.0.tgz",
-			"integrity": "sha512-haEcBrfU3hu83JXWpcLHzeg8Ypf05LGK4GIjzLiYgFJYXuxrkdN2MrDBeHt/t5/ZFmIzLcdsT2x8Xw654wXsuw==",
+			"version": "3.20.0",
+			"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.0.tgz",
+			"integrity": "sha512-relrah5h+sslXssTTOkvqcC/6RURifB0W5yhYBdBkaPYa5/2KBMiog3XiD+s3TwEHWxInWVv4Jx2/Lw0vng+IQ==",
 			"dev": true,
 			"requires": {
-				"browserslist": "^4.16.8",
+				"browserslist": "^4.19.1",
 				"semver": "7.0.0"
 			},
 			"dependencies": {
 				"browserslist": {
-					"version": "4.16.8",
-					"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.8.tgz",
-					"integrity": "sha512-sc2m9ohR/49sWEbPj14ZSSZqp+kbi16aLao42Hmn3Z8FpjuMaq2xCA2l4zl9ITfyzvnvyE0hcg62YkIGKxgaNQ==",
+					"version": "4.19.1",
+					"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz",
+					"integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==",
 					"dev": true,
 					"requires": {
-						"caniuse-lite": "^1.0.30001251",
-						"colorette": "^1.3.0",
-						"electron-to-chromium": "^1.3.811",
+						"caniuse-lite": "^1.0.30001286",
+						"electron-to-chromium": "^1.4.17",
 						"escalade": "^3.1.1",
-						"node-releases": "^1.1.75"
+						"node-releases": "^2.0.1",
+						"picocolors": "^1.0.0"
 					}
 				},
 				"caniuse-lite": {
-					"version": "1.0.30001252",
-					"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001252.tgz",
-					"integrity": "sha512-I56jhWDGMtdILQORdusxBOH+Nl/KgQSdDmpJezYddnAkVOmnoU8zwjTV9xAjMIYxr0iPreEAVylCGcmHCjfaOw==",
-					"dev": true
-				},
-				"colorette": {
-					"version": "1.3.0",
-					"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz",
-					"integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==",
+					"version": "1.0.30001291",
+					"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001291.tgz",
+					"integrity": "sha512-roMV5V0HNGgJ88s42eE70sstqGW/gwFndosYrikHthw98N5tLnOTxFqMLQjZVRxTWFlJ4rn+MsgXrR7MDPY4jA==",
 					"dev": true
 				},
 				"electron-to-chromium": {
-					"version": "1.3.826",
-					"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.826.tgz",
-					"integrity": "sha512-bpLc4QU4B8PYmdO4MSu2ZBTMD8lAaEXRS43C09lB31BvYwuk9UxgBRXbY5OJBw7VuMGcg2MZG5FyTaP9u4PQnw==",
+					"version": "1.4.25",
+					"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.25.tgz",
+					"integrity": "sha512-bTwub9Y/76EiNmfaiJih+hAy6xn7Ns95S4KvI2NuKNOz8TEEKKQUu44xuy0PYMudjM9zdjKRS1bitsUvHTfuUg==",
 					"dev": true
 				},
 				"node-releases": {
-					"version": "1.1.75",
-					"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.75.tgz",
-					"integrity": "sha512-Qe5OUajvqrqDSy6wrWFmMwfJ0jVgwiw4T3KqmbTcZ62qW0gQkheXYhcFM1+lOVcGUoRxcEcfyvFMAnDgaF1VWw==",
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
+					"integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
 					"dev": true
 				},
 				"semver": {
@@ -8399,9 +9186,9 @@
 			}
 		},
 		"core-js-pure": {
-			"version": "3.17.0",
-			"resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.17.0.tgz",
-			"integrity": "sha512-O5RvMRWW+I0hfR227mrIwU+gPLVaa4kPEq+9b8FcjuFed4QckOvYc94c2KSI/X5dlvcsj/V1Sp5F5cecYpNQOQ==",
+			"version": "3.20.3",
+			"resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.20.3.tgz",
+			"integrity": "sha512-Q2H6tQ5MtPtcC7f3HxJ48i4Q7T9ybPKgvWyuH7JXIoNa2pm0KuBnycsET/qw1SLLZYfbsbrZQNMeIOClb+6WIA==",
 			"dev": true
 		},
 		"core-js-url-browser": {
@@ -8453,17 +9240,6 @@
 				}
 			}
 		},
-		"create-emotion": {
-			"version": "10.0.27",
-			"resolved": "https://registry.npmjs.org/create-emotion/-/create-emotion-10.0.27.tgz",
-			"integrity": "sha512-fIK73w82HPPn/RsAij7+Zt8eCE8SptcJ3WoRMfxMtjteYxud8GDTKKld7MYwAX2TVhrw29uR1N/bVGxeStHILg==",
-			"requires": {
-				"@emotion/cache": "^10.0.27",
-				"@emotion/serialize": "^0.11.15",
-				"@emotion/sheet": "0.9.4",
-				"@emotion/utils": "0.11.3"
-			}
-		},
 		"create-hash": {
 			"version": "1.2.0",
 			"resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
@@ -8574,82 +9350,37 @@
 			}
 		},
 		"css-loader": {
-			"version": "5.2.7",
-			"resolved": "https://registry.npmjs.org/css-loader/-/css-loader-5.2.7.tgz",
-			"integrity": "sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==",
+			"version": "6.5.1",
+			"resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz",
+			"integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==",
 			"dev": true,
 			"requires": {
 				"icss-utils": "^5.1.0",
-				"loader-utils": "^2.0.0",
 				"postcss": "^8.2.15",
 				"postcss-modules-extract-imports": "^3.0.0",
 				"postcss-modules-local-by-default": "^4.0.0",
 				"postcss-modules-scope": "^3.0.0",
 				"postcss-modules-values": "^4.0.0",
 				"postcss-value-parser": "^4.1.0",
-				"schema-utils": "^3.0.0",
 				"semver": "^7.3.5"
 			},
 			"dependencies": {
-				"@types/json-schema": {
-					"version": "7.0.9",
-					"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
-					"integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
-					"dev": true
-				},
-				"colorette": {
-					"version": "1.3.0",
-					"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.3.0.tgz",
-					"integrity": "sha512-ecORCqbSFP7Wm8Y6lyqMJjexBQqXSF7SSeaTyGGphogUjBlFP9m9o08wy86HL2uB7fMTxtOUzLMk7ogKcxMg1w==",
-					"dev": true
-				},
-				"json5": {
-					"version": "2.2.0",
-					"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
-					"integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
-					"dev": true,
-					"requires": {
-						"minimist": "^1.2.5"
-					}
-				},
-				"loader-utils": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-					"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-					"dev": true,
-					"requires": {
-						"big.js": "^5.2.2",
-						"emojis-list": "^3.0.0",
-						"json5": "^2.1.2"
-					}
-				},
 				"postcss": {
-					"version": "8.3.6",
-					"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.6.tgz",
-					"integrity": "sha512-wG1cc/JhRgdqB6WHEuyLTedf3KIRuD0hG6ldkFEZNCjRxiC+3i6kkWUUbiJQayP28iwG35cEmAbe98585BYV0A==",
+					"version": "8.4.5",
+					"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz",
+					"integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==",
 					"dev": true,
 					"requires": {
-						"colorette": "^1.2.2",
-						"nanoid": "^3.1.23",
-						"source-map-js": "^0.6.2"
+						"nanoid": "^3.1.30",
+						"picocolors": "^1.0.0",
+						"source-map-js": "^1.0.1"
 					}
 				},
-				"postcss-value-parser": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
-					"integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
-					"dev": true
-				},
-				"schema-utils": {
-					"version": "3.1.1",
-					"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
-					"integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
-					"dev": true,
-					"requires": {
-						"@types/json-schema": "^7.0.8",
-						"ajv": "^6.12.5",
-						"ajv-keywords": "^3.5.2"
-					}
+				"postcss-value-parser": {
+					"version": "4.2.0",
+					"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+					"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
+					"dev": true
 				},
 				"semver": {
 					"version": "7.3.5",
@@ -8832,6 +9563,12 @@
 			"integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==",
 			"dev": true
 		},
+		"cssnano-utils": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.0.0.tgz",
+			"integrity": "sha512-Pzs7/BZ6OgT+tXXuF12DKR8SmSbzUeVYCtMBbS8lI0uAm3mrYmkyqCXXPsQESI6kmLfEVBppbdVY/el3hg3nAA==",
+			"dev": true
+		},
 		"csso": {
 			"version": "4.2.0",
 			"resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz",
@@ -8889,9 +9626,9 @@
 			}
 		},
 		"csstype": {
-			"version": "3.0.8",
-			"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz",
-			"integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw=="
+			"version": "3.0.10",
+			"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.10.tgz",
+			"integrity": "sha512-2u44ZG2OcNUO9HDp/Jl8C07x6pU/eTR3ncV91SiK3dhG9TWvRVsCoJw14Ckx5DgWkzGA3waZWO3d7pgqpUI/XA=="
 		},
 		"current-script-polyfill": {
 			"version": "1.0.0",
@@ -8930,9 +9667,9 @@
 			"dev": true
 		},
 		"damerau-levenshtein": {
-			"version": "1.0.7",
-			"resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz",
-			"integrity": "sha512-VvdQIPGdWP0SqFXghj79Wf/5LArmreyMsGLa6FG6iC4t3j7j5s71TrwWmT/4akbDQIqjfACkLZmjXhA7g2oUZw==",
+			"version": "1.0.8",
+			"resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+			"integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
 			"dev": true
 		},
 		"dashdash": {
@@ -8953,6 +9690,34 @@
 				"abab": "^2.0.3",
 				"whatwg-mimetype": "^2.3.0",
 				"whatwg-url": "^8.0.0"
+			},
+			"dependencies": {
+				"tr46": {
+					"version": "2.1.0",
+					"resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
+					"integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
+					"dev": true,
+					"requires": {
+						"punycode": "^2.1.1"
+					}
+				},
+				"webidl-conversions": {
+					"version": "6.1.0",
+					"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
+					"integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
+					"dev": true
+				},
+				"whatwg-url": {
+					"version": "8.7.0",
+					"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
+					"integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
+					"dev": true,
+					"requires": {
+						"lodash": "^4.7.0",
+						"tr46": "^2.1.0",
+						"webidl-conversions": "^6.1.0"
+					}
+				}
 			}
 		},
 		"date-format": {
@@ -9215,9 +9980,9 @@
 			}
 		},
 		"deep-extend": {
-			"version": "0.5.1",
-			"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.5.1.tgz",
-			"integrity": "sha512-N8vBdOa+DF7zkRrDCsaOXoCs/E2fJfx9B9MrKnnSiHNh4ws7eSys6YQE4KvT1cecKmOASYQBhbKjeuDD9lT81w==",
+			"version": "0.6.0",
+			"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+			"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
 			"dev": true
 		},
 		"deep-for-each": {
@@ -9375,9 +10140,9 @@
 			"dev": true
 		},
 		"devtools-protocol": {
-			"version": "0.0.869402",
-			"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.869402.tgz",
-			"integrity": "sha512-VvlVYY+VDJe639yHs5PHISzdWTLL3Aw8rO4cvUtwvoxFd6FHbE4OpHHcde52M6096uYYazAmd4l0o5VuFRO2WA==",
+			"version": "0.0.901419",
+			"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.901419.tgz",
+			"integrity": "sha512-4INMPwNm9XRpBukhNbF7OB6fNTTCaI8pzy/fXg0xQzAy5h3zL1P8xT3QazgKqBrb/hAYwIBizqDBZ7GtJE74QQ==",
 			"dev": true
 		},
 		"di": {
@@ -9530,12 +10295,20 @@
 			"dev": true,
 			"requires": {
 				"webidl-conversions": "^5.0.0"
+			},
+			"dependencies": {
+				"webidl-conversions": {
+					"version": "5.0.0",
+					"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
+					"integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==",
+					"dev": true
+				}
 			}
 		},
 		"domhandler": {
-			"version": "4.2.2",
-			"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.2.2.tgz",
-			"integrity": "sha512-PzE9aBMsdZO8TK4BnuJwH0QT41wgMbRzuZrHUcpYncEjmQazq8QEaBWgLG7ZyC/DAZKEgglpIA6j4Qn/HmxS3w==",
+			"version": "4.3.0",
+			"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz",
+			"integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==",
 			"dev": true,
 			"requires": {
 				"domelementtype": "^2.2.0"
@@ -9633,6 +10406,11 @@
 				}
 			}
 		},
+		"downloadjs": {
+			"version": "1.4.7",
+			"resolved": "https://registry.npmjs.org/downloadjs/-/downloadjs-1.4.7.tgz",
+			"integrity": "sha1-9p+W+UDg0FU9rCkROYZaPNAQHjw="
+		},
 		"downshift": {
 			"version": "6.1.7",
 			"resolved": "https://registry.npmjs.org/downshift/-/downshift-6.1.7.tgz",
@@ -9645,23 +10423,10 @@
 				"tslib": "^2.3.0"
 			},
 			"dependencies": {
-				"@babel/runtime": {
-					"version": "7.15.3",
-					"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz",
-					"integrity": "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==",
-					"requires": {
-						"regenerator-runtime": "^0.13.4"
-					}
-				},
 				"react-is": {
 					"version": "17.0.2",
 					"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
 					"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
-				},
-				"tslib": {
-					"version": "2.3.1",
-					"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
-					"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
 				}
 			}
 		},
@@ -9756,15 +10521,6 @@
 			"integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
 			"dev": true
 		},
-		"emotion": {
-			"version": "10.0.27",
-			"resolved": "https://registry.npmjs.org/emotion/-/emotion-10.0.27.tgz",
-			"integrity": "sha512-2xdDzdWWzue8R8lu4G76uWX5WhyQuzATon9LmNeCy/2BHVC6dsEpfhN1a0qhELgtDVdjyEA6J8Y/VlI5ZnaH0g==",
-			"requires": {
-				"babel-plugin-emotion": "^10.0.27",
-				"create-emotion": "^10.0.27"
-			}
-		},
 		"encodeurl": {
 			"version": "1.0.2",
 			"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
@@ -9872,6 +10628,12 @@
 			"integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
 			"dev": true
 		},
+		"envinfo": {
+			"version": "7.8.1",
+			"resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz",
+			"integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==",
+			"dev": true
+		},
 		"enzyme": {
 			"version": "3.11.0",
 			"resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.11.0.tgz",
@@ -9958,6 +10720,7 @@
 			"version": "1.17.7",
 			"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
 			"integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+			"dev": true,
 			"requires": {
 				"es-to-primitive": "^1.2.1",
 				"function-bind": "^1.1.1",
@@ -9978,6 +10741,12 @@
 			"integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==",
 			"dev": true
 		},
+		"es-module-lexer": {
+			"version": "0.9.3",
+			"resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
+			"integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==",
+			"dev": true
+		},
 		"es-to-primitive": {
 			"version": "1.2.1",
 			"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
@@ -10017,9 +10786,9 @@
 			},
 			"dependencies": {
 				"estraverse": {
-					"version": "5.2.0",
-					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-					"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+					"version": "5.3.0",
+					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+					"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
 					"dev": true
 				},
 				"levn": {
@@ -10128,9 +10897,9 @@
 					}
 				},
 				"ansi-regex": {
-					"version": "5.0.0",
-					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-					"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+					"version": "5.0.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+					"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 					"dev": true
 				},
 				"cross-spawn": {
@@ -10187,9 +10956,9 @@
 					}
 				},
 				"globals": {
-					"version": "13.11.0",
-					"resolved": "https://registry.npmjs.org/globals/-/globals-13.11.0.tgz",
-					"integrity": "sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g==",
+					"version": "13.12.0",
+					"resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
+					"integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
 					"dev": true,
 					"requires": {
 						"type-fest": "^0.20.2"
@@ -10223,12 +10992,12 @@
 					"dev": true
 				},
 				"strip-ansi": {
-					"version": "6.0.0",
-					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-					"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+					"version": "6.0.1",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+					"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 					"dev": true,
 					"requires": {
-						"ansi-regex": "^5.0.0"
+						"ansi-regex": "^5.0.1"
 					}
 				},
 				"type-fest": {
@@ -10264,26 +11033,36 @@
 						"ms": "^2.1.1"
 					}
 				},
+				"is-core-module": {
+					"version": "2.8.1",
+					"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
+					"integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
+					"dev": true,
+					"requires": {
+						"has": "^1.0.3"
+					}
+				},
 				"resolve": {
-					"version": "1.20.0",
-					"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
-					"integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+					"version": "1.21.0",
+					"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz",
+					"integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==",
 					"dev": true,
 					"requires": {
-						"is-core-module": "^2.2.0",
-						"path-parse": "^1.0.6"
+						"is-core-module": "^2.8.0",
+						"path-parse": "^1.0.7",
+						"supports-preserve-symlinks-flag": "^1.0.0"
 					}
 				}
 			}
 		},
 		"eslint-module-utils": {
-			"version": "2.6.2",
-			"resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.2.tgz",
-			"integrity": "sha512-QG8pcgThYOuqxupd06oYTZoNOGaUdTY1PqK+oS6ElF6vs4pBdk/aYxFVQQXzcrAqp9m7cl7lb2ubazX+g16k2Q==",
+			"version": "2.7.2",
+			"resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.2.tgz",
+			"integrity": "sha512-zquepFnWCY2ISMFwD/DqzaM++H+7PDzOpUvotJWm/y1BAFt5R4oeULgdrTejKqLkz7MA/tgstsUMNYc7wNdTrg==",
 			"dev": true,
 			"requires": {
 				"debug": "^3.2.7",
-				"pkg-dir": "^2.0.0"
+				"find-up": "^2.1.0"
 			},
 			"dependencies": {
 				"debug": {
@@ -10337,39 +11116,28 @@
 					"resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
 					"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
 					"dev": true
-				},
-				"pkg-dir": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
-					"integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
-					"dev": true,
-					"requires": {
-						"find-up": "^2.1.0"
-					}
 				}
 			}
 		},
 		"eslint-plugin-import": {
-			"version": "2.24.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.24.2.tgz",
-			"integrity": "sha512-hNVtyhiEtZmpsabL4neEj+6M5DCLgpYyG9nzJY8lZQeQXEn5UPW1DpUdsMHMXsq98dbNm7nt1w9ZMSVpfJdi8Q==",
+			"version": "2.25.4",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.4.tgz",
+			"integrity": "sha512-/KJBASVFxpu0xg1kIBn9AUa8hQVnszpwgE7Ld0lKAlx7Ie87yzEzCgSkekt+le/YVhiaosO4Y14GDAOc41nfxA==",
 			"dev": true,
 			"requires": {
-				"array-includes": "^3.1.3",
-				"array.prototype.flat": "^1.2.4",
+				"array-includes": "^3.1.4",
+				"array.prototype.flat": "^1.2.5",
 				"debug": "^2.6.9",
 				"doctrine": "^2.1.0",
 				"eslint-import-resolver-node": "^0.3.6",
-				"eslint-module-utils": "^2.6.2",
-				"find-up": "^2.0.0",
+				"eslint-module-utils": "^2.7.2",
 				"has": "^1.0.3",
-				"is-core-module": "^2.6.0",
+				"is-core-module": "^2.8.0",
+				"is-glob": "^4.0.3",
 				"minimatch": "^3.0.4",
-				"object.values": "^1.1.4",
-				"pkg-up": "^2.0.0",
-				"read-pkg-up": "^3.0.0",
+				"object.values": "^1.1.5",
 				"resolve": "^1.20.0",
-				"tsconfig-paths": "^3.11.0"
+				"tsconfig-paths": "^3.12.0"
 			},
 			"dependencies": {
 				"call-bind": {
@@ -10392,22 +11160,25 @@
 					}
 				},
 				"es-abstract": {
-					"version": "1.18.5",
-					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz",
-					"integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==",
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
 					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
 						"es-to-primitive": "^1.2.1",
 						"function-bind": "^1.1.1",
 						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
 						"has": "^1.0.3",
 						"has-symbols": "^1.0.2",
 						"internal-slot": "^1.0.3",
-						"is-callable": "^1.2.3",
+						"is-callable": "^1.2.4",
 						"is-negative-zero": "^2.0.1",
-						"is-regex": "^1.1.3",
-						"is-string": "^1.0.6",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
 						"object-inspect": "^1.11.0",
 						"object-keys": "^1.1.1",
 						"object.assign": "^4.1.2",
@@ -10429,15 +11200,6 @@
 						}
 					}
 				},
-				"find-up": {
-					"version": "2.1.0",
-					"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-					"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-					"dev": true,
-					"requires": {
-						"locate-path": "^2.0.0"
-					}
-				},
 				"has-symbols": {
 					"version": "1.0.2",
 					"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
@@ -10451,14 +11213,23 @@
 					"dev": true
 				},
 				"is-core-module": {
-					"version": "2.6.0",
-					"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz",
-					"integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==",
+					"version": "2.8.1",
+					"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
+					"integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
 					"dev": true,
 					"requires": {
 						"has": "^1.0.3"
 					}
 				},
+				"is-glob": {
+					"version": "4.0.3",
+					"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+					"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+					"dev": true,
+					"requires": {
+						"is-extglob": "^2.1.1"
+					}
+				},
 				"is-regex": {
 					"version": "1.1.4",
 					"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
@@ -10469,16 +11240,6 @@
 						"has-tostringtag": "^1.0.0"
 					}
 				},
-				"locate-path": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-					"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
-					"dev": true,
-					"requires": {
-						"p-locate": "^2.0.0",
-						"path-exists": "^3.0.0"
-					}
-				},
 				"ms": {
 					"version": "2.0.0",
 					"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
@@ -10486,64 +11247,31 @@
 					"dev": true
 				},
 				"object-inspect": {
-					"version": "1.11.0",
-					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
-					"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
+					"version": "1.12.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
+					"integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
 					"dev": true
 				},
 				"object.values": {
-					"version": "1.1.4",
-					"resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz",
-					"integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==",
+					"version": "1.1.5",
+					"resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
+					"integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
 					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
 						"define-properties": "^1.1.3",
-						"es-abstract": "^1.18.2"
-					}
-				},
-				"p-limit": {
-					"version": "1.3.0",
-					"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-					"integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-					"dev": true,
-					"requires": {
-						"p-try": "^1.0.0"
-					}
-				},
-				"p-locate": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-					"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-					"dev": true,
-					"requires": {
-						"p-limit": "^1.1.0"
-					}
-				},
-				"p-try": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-					"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
-					"dev": true
-				},
-				"read-pkg-up": {
-					"version": "3.0.0",
-					"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
-					"integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
-					"dev": true,
-					"requires": {
-						"find-up": "^2.0.0",
-						"read-pkg": "^3.0.0"
+						"es-abstract": "^1.19.1"
 					}
 				},
 				"resolve": {
-					"version": "1.20.0",
-					"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
-					"integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+					"version": "1.21.0",
+					"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.21.0.tgz",
+					"integrity": "sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==",
 					"dev": true,
 					"requires": {
-						"is-core-module": "^2.2.0",
-						"path-parse": "^1.0.6"
+						"is-core-module": "^2.8.0",
+						"path-parse": "^1.0.7",
+						"supports-preserve-symlinks-flag": "^1.0.0"
 					}
 				},
 				"string.prototype.trimend": {
@@ -10569,35 +11297,35 @@
 			}
 		},
 		"eslint-plugin-jest": {
-			"version": "24.4.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.4.0.tgz",
-			"integrity": "sha512-8qnt/hgtZ94E9dA6viqfViKBfkJwFHXgJmTWlMGDgunw1XJEGqm3eiPjDsTanM3/u/3Az82nyQM9GX7PM/QGmg==",
+			"version": "24.7.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.7.0.tgz",
+			"integrity": "sha512-wUxdF2bAZiYSKBclsUMrYHH6WxiBreNjyDxbRv345TIvPeoCEgPNEn3Sa+ZrSqsf1Dl9SqqSREXMHExlMMu1DA==",
 			"dev": true,
 			"requires": {
 				"@typescript-eslint/experimental-utils": "^4.0.1"
 			}
 		},
 		"eslint-plugin-jsdoc": {
-			"version": "34.8.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-34.8.2.tgz",
-			"integrity": "sha512-UOU9A40Cl806JMtla2vF+RM6sNqfLPbhLv9FZqhcC7+LmChD3DVaWqM7ADxpF0kMyZNWe1QKUnqGnXaA3NTn+w==",
+			"version": "36.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-36.1.1.tgz",
+			"integrity": "sha512-nuLDvH1EJaKx0PCa9oeQIxH6pACIhZd1gkalTUxZbaxxwokjs7TplqY0Q8Ew3CoZaf5aowm0g/Z3JGHCatt+gQ==",
 			"dev": true,
 			"requires": {
-				"@es-joy/jsdoccomment": "^0.6.0",
-				"comment-parser": "1.1.5",
-				"debug": "^4.3.1",
+				"@es-joy/jsdoccomment": "0.10.8",
+				"comment-parser": "1.2.4",
+				"debug": "^4.3.2",
 				"esquery": "^1.4.0",
-				"jsdoctypeparser": "^9.0.0",
+				"jsdoc-type-pratt-parser": "^1.1.1",
 				"lodash": "^4.17.21",
-				"regextras": "^0.7.1",
+				"regextras": "^0.8.0",
 				"semver": "^7.3.5",
 				"spdx-expression-parse": "^3.0.1"
 			},
 			"dependencies": {
 				"debug": {
-					"version": "4.3.2",
-					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-					"integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+					"version": "4.3.3",
+					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+					"integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
 					"dev": true,
 					"requires": {
 						"ms": "2.1.2"
@@ -10621,22 +11349,23 @@
 			}
 		},
 		"eslint-plugin-jsx-a11y": {
-			"version": "6.4.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.4.1.tgz",
-			"integrity": "sha512-0rGPJBbwHoGNPU73/QCLP/vveMlM1b1Z9PponxO87jfr6tuH5ligXbDT6nHSSzBC8ovX2Z+BQu7Bk5D/Xgq9zg==",
+			"version": "6.5.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.5.1.tgz",
+			"integrity": "sha512-sVCFKX9fllURnXT2JwLN5Qgo24Ug5NF6dxhkmxsMEUZhXRcGg+X3e1JbJ84YePQKBl5E0ZjAH5Q4rkdcGY99+g==",
 			"dev": true,
 			"requires": {
-				"@babel/runtime": "^7.11.2",
+				"@babel/runtime": "^7.16.3",
 				"aria-query": "^4.2.2",
-				"array-includes": "^3.1.1",
+				"array-includes": "^3.1.4",
 				"ast-types-flow": "^0.0.7",
-				"axe-core": "^4.0.2",
+				"axe-core": "^4.3.5",
 				"axobject-query": "^2.2.0",
-				"damerau-levenshtein": "^1.0.6",
-				"emoji-regex": "^9.0.0",
+				"damerau-levenshtein": "^1.0.7",
+				"emoji-regex": "^9.2.2",
 				"has": "^1.0.3",
-				"jsx-ast-utils": "^3.1.0",
-				"language-tags": "^1.0.5"
+				"jsx-ast-utils": "^3.2.1",
+				"language-tags": "^1.0.5",
+				"minimatch": "^3.0.4"
 			},
 			"dependencies": {
 				"emoji-regex": {
@@ -10648,14 +11377,12 @@
 			}
 		},
 		"eslint-plugin-markdown": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-1.0.2.tgz",
-			"integrity": "sha512-BfvXKsO0K+zvdarNc801jsE/NTLmig4oKhZ1U3aSUgTf2dB/US5+CrfGxMsCK2Ki1vS1R3HPok+uYpufFndhzw==",
+			"version": "2.2.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-markdown/-/eslint-plugin-markdown-2.2.1.tgz",
+			"integrity": "sha512-FgWp4iyYvTFxPwfbxofTvXxgzPsDuSKHQy2S+a8Ve6savbujey+lgrFFbXQA0HPygISpRYWYBjooPzhYSF81iA==",
 			"dev": true,
 			"requires": {
-				"object-assign": "^4.0.1",
-				"remark-parse": "^5.0.0",
-				"unified": "^6.1.2"
+				"mdast-util-from-markdown": "^0.8.5"
 			}
 		},
 		"eslint-plugin-prettier": {
@@ -10668,24 +11395,25 @@
 			}
 		},
 		"eslint-plugin-react": {
-			"version": "7.25.1",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.25.1.tgz",
-			"integrity": "sha512-P4j9K1dHoFXxDNP05AtixcJEvIT6ht8FhYKsrkY0MPCPaUMYijhpWwNiRDZVtA8KFuZOkGSeft6QwH8KuVpJug==",
+			"version": "7.28.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.28.0.tgz",
+			"integrity": "sha512-IOlFIRHzWfEQQKcAD4iyYDndHwTQiCMcJVJjxempf203jnNLUnW34AXLrV33+nEXoifJE2ZEGmcjKPL8957eSw==",
 			"dev": true,
 			"requires": {
-				"array-includes": "^3.1.3",
-				"array.prototype.flatmap": "^1.2.4",
+				"array-includes": "^3.1.4",
+				"array.prototype.flatmap": "^1.2.5",
 				"doctrine": "^2.1.0",
-				"estraverse": "^5.2.0",
-				"has": "^1.0.3",
+				"estraverse": "^5.3.0",
 				"jsx-ast-utils": "^2.4.1 || ^3.0.0",
 				"minimatch": "^3.0.4",
-				"object.entries": "^1.1.4",
-				"object.fromentries": "^2.0.4",
-				"object.values": "^1.1.4",
+				"object.entries": "^1.1.5",
+				"object.fromentries": "^2.0.5",
+				"object.hasown": "^1.1.0",
+				"object.values": "^1.1.5",
 				"prop-types": "^15.7.2",
 				"resolve": "^2.0.0-next.3",
-				"string.prototype.matchall": "^4.0.5"
+				"semver": "^6.3.0",
+				"string.prototype.matchall": "^4.0.6"
 			},
 			"dependencies": {
 				"call-bind": {
@@ -10699,22 +11427,25 @@
 					}
 				},
 				"es-abstract": {
-					"version": "1.18.5",
-					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz",
-					"integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==",
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
 					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
 						"es-to-primitive": "^1.2.1",
 						"function-bind": "^1.1.1",
 						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
 						"has": "^1.0.3",
 						"has-symbols": "^1.0.2",
 						"internal-slot": "^1.0.3",
-						"is-callable": "^1.2.3",
+						"is-callable": "^1.2.4",
 						"is-negative-zero": "^2.0.1",
-						"is-regex": "^1.1.3",
-						"is-string": "^1.0.6",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
 						"object-inspect": "^1.11.0",
 						"object-keys": "^1.1.1",
 						"object.assign": "^4.1.2",
@@ -10737,9 +11468,9 @@
 					}
 				},
 				"estraverse": {
-					"version": "5.2.0",
-					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-					"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+					"version": "5.3.0",
+					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+					"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
 					"dev": true
 				},
 				"has-symbols": {
@@ -10765,20 +11496,20 @@
 					}
 				},
 				"object-inspect": {
-					"version": "1.11.0",
-					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
-					"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
+					"version": "1.12.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
+					"integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
 					"dev": true
 				},
 				"object.values": {
-					"version": "1.1.4",
-					"resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz",
-					"integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==",
+					"version": "1.1.5",
+					"resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
+					"integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
 					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
 						"define-properties": "^1.1.3",
-						"es-abstract": "^1.18.2"
+						"es-abstract": "^1.19.1"
 					}
 				},
 				"resolve": {
@@ -10791,6 +11522,12 @@
 						"path-parse": "^1.0.6"
 					}
 				},
+				"semver": {
+					"version": "6.3.0",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+					"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+					"dev": true
+				},
 				"string.prototype.trimend": {
 					"version": "1.0.4",
 					"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
@@ -10814,9 +11551,9 @@
 			}
 		},
 		"eslint-plugin-react-hooks": {
-			"version": "4.2.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.2.0.tgz",
-			"integrity": "sha512-623WEiZJqxR7VdxFCKLI6d6LLpwJkGPYKODnkH3D7WpOG5KM8yWueBd8TLsNAetEJNF5iJmolaAKO3F8yzyVBQ==",
+			"version": "4.3.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.3.0.tgz",
+			"integrity": "sha512-XslZy0LnMn+84NEG9jSGR6eGqaZB3133L8xewQo3fQagbQuGt7a63gf+P1NGKZavEYEC3UXaWEAA/AqDkuN6xA==",
 			"dev": true
 		},
 		"eslint-scope": {
@@ -10885,9 +11622,9 @@
 			},
 			"dependencies": {
 				"estraverse": {
-					"version": "5.2.0",
-					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-					"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+					"version": "5.3.0",
+					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+					"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
 					"dev": true
 				}
 			}
@@ -11468,9 +12205,9 @@
 			"dev": true
 		},
 		"fast-glob": {
-			"version": "3.2.7",
-			"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
-			"integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
+			"version": "3.2.11",
+			"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz",
+			"integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==",
 			"dev": true,
 			"requires": {
 				"@nodelib/fs.stat": "^2.0.2",
@@ -11515,9 +12252,9 @@
 					}
 				},
 				"picomatch": {
-					"version": "2.3.0",
-					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
-					"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+					"version": "2.3.1",
+					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+					"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
 					"dev": true
 				},
 				"to-regex-range": {
@@ -11548,6 +12285,16 @@
 			"resolved": "https://registry.npmjs.org/fast-memoize/-/fast-memoize-2.5.2.tgz",
 			"integrity": "sha512-Ue0LwpDYErFbmNnZSF0UH6eImUwDmogUO1jyE+JbN2gsQz/jICm1Ve7t9QT0rNSsfJt+Hs4/S3GnsDVjL4HVrw=="
 		},
+		"fast-xml-parser": {
+			"version": "3.21.1",
+			"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.21.1.tgz",
+			"integrity": "sha512-FTFVjYoBOZTJekiUsawGsSYV9QL0A+zDYCRj7y34IO6Jg+2IMYEtQa+bbictpdpV8dHxXywqU7C0gRDEOFtBFg==",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"strnum": "^1.0.4"
+			}
+		},
 		"fastest-levenshtein": {
 			"version": "1.0.12",
 			"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz",
@@ -11560,9 +12307,9 @@
 			"integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw=="
 		},
 		"fastq": {
-			"version": "1.12.0",
-			"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.12.0.tgz",
-			"integrity": "sha512-VNX0QkHK3RsXVKr9KrlUv/FoTa0NdbYoHHl7uXHv2rzyHSlxjdNAKug2twd9luJxpcyNeAgf5iPPMutJO67Dfg==",
+			"version": "1.13.0",
+			"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
+			"integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==",
 			"dev": true,
 			"requires": {
 				"reusify": "^1.0.4"
@@ -11586,94 +12333,50 @@
 				"bser": "2.1.1"
 			}
 		},
-		"fd-slicer": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
-			"integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
-			"dev": true,
-			"requires": {
-				"pend": "~1.2.0"
-			}
-		},
-		"fetch-blob": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-2.1.2.tgz",
-			"integrity": "sha512-YKqtUDwqLyfyMnmbw8XD6Q8j9i/HggKtPEI+pZ1+8bvheBu78biSmNaXWusx1TauGqtUUGx/cBb1mKdq2rLYow=="
-		},
-		"figgy-pudding": {
-			"version": "3.5.2",
-			"resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
-			"integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
-			"dev": true
-		},
-		"figures": {
-			"version": "1.7.0",
-			"resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
-			"integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
-			"dev": true,
-			"requires": {
-				"escape-string-regexp": "^1.0.5",
-				"object-assign": "^4.1.0"
-			}
-		},
-		"file-entry-cache": {
-			"version": "6.0.1",
-			"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
-			"integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
-			"dev": true,
-			"requires": {
-				"flat-cache": "^3.0.4"
-			}
-		},
-		"file-loader": {
-			"version": "6.2.0",
-			"resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
-			"integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
-			"dev": true,
-			"requires": {
-				"loader-utils": "^2.0.0",
-				"schema-utils": "^3.0.0"
-			},
-			"dependencies": {
-				"@types/json-schema": {
-					"version": "7.0.9",
-					"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
-					"integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
-					"dev": true
-				},
-				"json5": {
-					"version": "2.2.0",
-					"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
-					"integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
-					"dev": true,
-					"requires": {
-						"minimist": "^1.2.5"
-					}
-				},
-				"loader-utils": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-					"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-					"dev": true,
-					"requires": {
-						"big.js": "^5.2.2",
-						"emojis-list": "^3.0.0",
-						"json5": "^2.1.2"
-					}
-				},
-				"schema-utils": {
-					"version": "3.1.1",
-					"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
-					"integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
-					"dev": true,
-					"requires": {
-						"@types/json-schema": "^7.0.8",
-						"ajv": "^6.12.5",
-						"ajv-keywords": "^3.5.2"
-					}
-				}
-			}
-		},
+		"fd-slicer": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+			"integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
+			"dev": true,
+			"requires": {
+				"pend": "~1.2.0"
+			}
+		},
+		"fetch-blob": {
+			"version": "2.1.2",
+			"resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-2.1.2.tgz",
+			"integrity": "sha512-YKqtUDwqLyfyMnmbw8XD6Q8j9i/HggKtPEI+pZ1+8bvheBu78biSmNaXWusx1TauGqtUUGx/cBb1mKdq2rLYow=="
+		},
+		"figgy-pudding": {
+			"version": "3.5.2",
+			"resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz",
+			"integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==",
+			"dev": true
+		},
+		"figures": {
+			"version": "1.7.0",
+			"resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz",
+			"integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=",
+			"dev": true,
+			"requires": {
+				"escape-string-regexp": "^1.0.5",
+				"object-assign": "^4.1.0"
+			}
+		},
+		"file-entry-cache": {
+			"version": "6.0.1",
+			"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+			"integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+			"dev": true,
+			"requires": {
+				"flat-cache": "^3.0.4"
+			}
+		},
+		"file-saver": {
+			"version": "2.0.5",
+			"resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz",
+			"integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
+		},
 		"file-sync-cmp": {
 			"version": "0.1.1",
 			"resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz",
@@ -11800,9 +12503,9 @@
 			}
 		},
 		"find-process": {
-			"version": "1.4.4",
-			"resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.4.tgz",
-			"integrity": "sha512-rRSuT1LE4b+BFK588D2V8/VG9liW0Ark1XJgroxZXI0LtwmQJOb490DvDYvbm+Hek9ETFzTutGfJ90gumITPhQ==",
+			"version": "1.4.7",
+			"resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz",
+			"integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==",
 			"dev": true,
 			"requires": {
 				"chalk": "^4.0.0",
@@ -11841,72 +12544,6 @@
 				"semver-regex": "^2.0.0"
 			}
 		},
-		"findup-sync": {
-			"version": "3.0.0",
-			"resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz",
-			"integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==",
-			"dev": true,
-			"requires": {
-				"detect-file": "^1.0.0",
-				"is-glob": "^4.0.0",
-				"micromatch": "^3.0.4",
-				"resolve-dir": "^1.0.1"
-			},
-			"dependencies": {
-				"expand-tilde": {
-					"version": "2.0.2",
-					"resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
-					"integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=",
-					"dev": true,
-					"requires": {
-						"homedir-polyfill": "^1.0.1"
-					}
-				},
-				"global-modules": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz",
-					"integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==",
-					"dev": true,
-					"requires": {
-						"global-prefix": "^1.0.1",
-						"is-windows": "^1.0.1",
-						"resolve-dir": "^1.0.0"
-					}
-				},
-				"global-prefix": {
-					"version": "1.0.2",
-					"resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz",
-					"integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=",
-					"dev": true,
-					"requires": {
-						"expand-tilde": "^2.0.2",
-						"homedir-polyfill": "^1.0.1",
-						"ini": "^1.3.4",
-						"is-windows": "^1.0.1",
-						"which": "^1.2.14"
-					}
-				},
-				"resolve-dir": {
-					"version": "1.0.1",
-					"resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz",
-					"integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=",
-					"dev": true,
-					"requires": {
-						"expand-tilde": "^2.0.0",
-						"global-modules": "^1.0.0"
-					}
-				},
-				"which": {
-					"version": "1.3.1",
-					"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-					"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-					"dev": true,
-					"requires": {
-						"isexe": "^2.0.0"
-					}
-				}
-			}
-		},
 		"fined": {
 			"version": "1.2.0",
 			"resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz",
@@ -11967,9 +12604,9 @@
 			}
 		},
 		"flatted": {
-			"version": "3.2.2",
-			"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz",
-			"integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==",
+			"version": "3.2.4",
+			"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.4.tgz",
+			"integrity": "sha512-8/sOawo8tJ4QOBX8YlQBMxL8+RLZfxMQOif9o0KUKTNTjMYElWPE0r/m5VNFxTRd0NSw8qSy8dajrwX4RYI1Hw==",
 			"dev": true
 		},
 		"flush-write-stream": {
@@ -12035,9 +12672,9 @@
 			"dev": true
 		},
 		"fraction.js": {
-			"version": "4.1.1",
-			"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.1.tgz",
-			"integrity": "sha512-MHOhvvxHTfRFpF1geTK9czMIZ6xclsEor2wkIGYYq+PxcQqT7vStJqjhe6S1TenZrMZzo+wlqOufBDVepUEgPg==",
+			"version": "4.1.2",
+			"resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.1.2.tgz",
+			"integrity": "sha512-o2RiJQ6DZaR/5+Si0qJUIy637QMRudSi9kU/FFzx9EZazrIdnBgpU+3sEWCxAVhH2RtxW2Oz+T4p2o8uOPVcgA==",
 			"dev": true
 		},
 		"fragment-cache": {
@@ -12062,10 +12699,20 @@
 				"tslib": "^2.1.0"
 			},
 			"dependencies": {
-				"tslib": {
-					"version": "2.3.1",
-					"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
-					"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
+				"@emotion/is-prop-valid": {
+					"version": "0.8.8",
+					"resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz",
+					"integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==",
+					"optional": true,
+					"requires": {
+						"@emotion/memoize": "0.7.4"
+					}
+				},
+				"@emotion/memoize": {
+					"version": "0.7.4",
+					"resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz",
+					"integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==",
+					"optional": true
 				}
 			}
 		},
@@ -12075,13 +12722,6 @@
 			"integrity": "sha512-oc5m68HDO/tuK2blj7ZcdEBRx3p1PjrgHazL8GYEpvULhrtGIFbQArN6cQS2QhW8mitffaB+VYzMjDqBxxQeoA==",
 			"requires": {
 				"tslib": "^2.1.0"
-			},
-			"dependencies": {
-				"tslib": {
-					"version": "2.3.1",
-					"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
-					"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
-				}
 			}
 		},
 		"fresh": {
@@ -12139,15 +12779,6 @@
 				}
 			}
 		},
-		"fs-minipass": {
-			"version": "2.1.0",
-			"resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
-			"integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
-			"dev": true,
-			"requires": {
-				"minipass": "^3.0.0"
-			}
-		},
 		"fs-write-stream-atomic": {
 			"version": "1.0.10",
 			"resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz",
@@ -12177,13 +12808,13 @@
 			"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
 		},
 		"function.prototype.name": {
-			"version": "1.1.4",
-			"resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.4.tgz",
-			"integrity": "sha512-iqy1pIotY/RmhdFZygSSlW0wko2yxkSCKqsuv4pr8QESohpYyG/Z7B/XXvPRKTJS//960rgguE5mSRUsDdaJrQ==",
+			"version": "1.1.5",
+			"resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz",
+			"integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==",
 			"requires": {
 				"call-bind": "^1.0.2",
 				"define-properties": "^1.1.3",
-				"es-abstract": "^1.18.0-next.2",
+				"es-abstract": "^1.19.0",
 				"functions-have-names": "^1.2.2"
 			},
 			"dependencies": {
@@ -12197,21 +12828,24 @@
 					}
 				},
 				"es-abstract": {
-					"version": "1.18.5",
-					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz",
-					"integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==",
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
 					"requires": {
 						"call-bind": "^1.0.2",
 						"es-to-primitive": "^1.2.1",
 						"function-bind": "^1.1.1",
 						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
 						"has": "^1.0.3",
 						"has-symbols": "^1.0.2",
 						"internal-slot": "^1.0.3",
-						"is-callable": "^1.2.3",
+						"is-callable": "^1.2.4",
 						"is-negative-zero": "^2.0.1",
-						"is-regex": "^1.1.3",
-						"is-string": "^1.0.6",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
 						"object-inspect": "^1.11.0",
 						"object-keys": "^1.1.1",
 						"object.assign": "^4.1.2",
@@ -12252,9 +12886,9 @@
 					}
 				},
 				"object-inspect": {
-					"version": "1.11.0",
-					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
-					"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg=="
+					"version": "1.12.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
+					"integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g=="
 				},
 				"string.prototype.trimend": {
 					"version": "1.0.4",
@@ -12353,6 +12987,36 @@
 				"pump": "^3.0.0"
 			}
 		},
+		"get-symbol-description": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+			"integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+			"requires": {
+				"call-bind": "^1.0.2",
+				"get-intrinsic": "^1.1.1"
+			},
+			"dependencies": {
+				"call-bind": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+					"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+					"requires": {
+						"function-bind": "^1.1.1",
+						"get-intrinsic": "^1.0.2"
+					}
+				},
+				"get-intrinsic": {
+					"version": "1.1.1",
+					"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+					"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+					"requires": {
+						"function-bind": "^1.1.1",
+						"has": "^1.0.3",
+						"has-symbols": "^1.0.1"
+					}
+				}
+			}
+		},
 		"get-value": {
 			"version": "2.0.6",
 			"resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
@@ -12595,12 +13259,6 @@
 			"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
 			"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
 		},
-		"graceful-readlink": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
-			"integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
-			"dev": true
-		},
 		"gradient-parser": {
 			"version": "0.1.5",
 			"resolved": "https://registry.npmjs.org/gradient-parser/-/gradient-parser-0.1.5.tgz",
@@ -12779,55 +13437,13 @@
 			}
 		},
 		"grunt-contrib-concat": {
-			"version": "1.0.1",
-			"resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-1.0.1.tgz",
-			"integrity": "sha1-YVCYYwhOhx1+ht5IwBUlntl3Rb0=",
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-2.0.0.tgz",
+			"integrity": "sha512-/cfWwsGiprVTOl7c2bZwMdQ8hIf3e1f4szm1i7qhY9hOnR/X2KL+Xe7dynNweTYHa6aWPZx2B5GPsUpxAXNCaA==",
 			"dev": true,
 			"requires": {
-				"chalk": "^1.0.0",
+				"chalk": "^4.1.2",
 				"source-map": "^0.5.3"
-			},
-			"dependencies": {
-				"ansi-regex": {
-					"version": "2.1.1",
-					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-					"integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
-					"dev": true
-				},
-				"ansi-styles": {
-					"version": "2.2.1",
-					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-					"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
-					"dev": true
-				},
-				"chalk": {
-					"version": "1.1.3",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-					"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-					"dev": true,
-					"requires": {
-						"ansi-styles": "^2.2.1",
-						"escape-string-regexp": "^1.0.2",
-						"has-ansi": "^2.0.0",
-						"strip-ansi": "^3.0.0",
-						"supports-color": "^2.0.0"
-					}
-				},
-				"strip-ansi": {
-					"version": "3.0.1",
-					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-					"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-					"dev": true,
-					"requires": {
-						"ansi-regex": "^2.0.0"
-					}
-				},
-				"supports-color": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-					"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
-					"dev": true
-				}
 			}
 		},
 		"grunt-contrib-copy": {
@@ -12990,60 +13606,32 @@
 			}
 		},
 		"grunt-contrib-jshint": {
-			"version": "3.0.0",
-			"resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-3.0.0.tgz",
-			"integrity": "sha512-o0V3HNK54+w2Lss/AP0LsAUCEmPDQIcgsDFvTy0sE8sdPXq/8vHdNdMEitK9Wcfoq7H6v02v6soiiwJ0wavT7A==",
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-3.1.1.tgz",
+			"integrity": "sha512-EwMY6L91FqTcMlZTVoDeeq/EZL+7MoFyo1rxIea9sxyv73geVggeE37jcUhNbu5hLbxHE82CGIUqitHuR2/q+g==",
 			"dev": true,
 			"requires": {
 				"chalk": "^4.1.0",
 				"hooker": "^0.2.3",
-				"jshint": "~2.12.0"
+				"jshint": "~2.13.0"
 			}
 		},
 		"grunt-contrib-qunit": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/grunt-contrib-qunit/-/grunt-contrib-qunit-4.0.0.tgz",
-			"integrity": "sha512-XP9Ks+uoSQzic0eic6koD8kYAKQnSYfu2G1HBqvrvUyXaDDnSSXOKELND8j7dwudnJj4N6KgW6OU7AHeM5PGKA==",
+			"version": "5.1.1",
+			"resolved": "https://registry.npmjs.org/grunt-contrib-qunit/-/grunt-contrib-qunit-5.1.1.tgz",
+			"integrity": "sha512-W1V+55kWF8TARdCDWEwzrbAoielwqrKKppiTwnu3N2kMa73oQIlKNQOnOq32tzruXdTDZX4B5yYustfNp3bdRA==",
 			"dev": true,
 			"requires": {
 				"eventemitter2": "^6.4.2",
 				"p-each-series": "^2.1.0",
-				"puppeteer": "^4.0.0"
+				"puppeteer": "^5.0.0"
 			},
 			"dependencies": {
 				"eventemitter2": {
-					"version": "6.4.3",
-					"resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.3.tgz",
-					"integrity": "sha512-t0A2msp6BzOf+QAcI6z9XMktLj52OjGQg+8SJH6v5+3uxNpWYRR3wQmfA+6xtMU9kOC59qk9licus5dYcrYkMQ==",
+					"version": "6.4.5",
+					"resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.5.tgz",
+					"integrity": "sha512-bXE7Dyc1i6oQElDG0jMRZJrRAn9QR2xyyFGmBdZleNmyQX0FqGYmhZIrIrpPfm/w//LTo4tVQGOGQcGCb5q9uw==",
 					"dev": true
-				},
-				"puppeteer": {
-					"version": "4.0.1",
-					"resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-4.0.1.tgz",
-					"integrity": "sha512-LIiSWTRqpTnnm3R2yAoMBx1inSeKwVZy66RFSkgSTDINzheJZPd5z5mMbPM0FkvwWAZ27a+69j5nZf+Fpyhn3Q==",
-					"dev": true,
-					"requires": {
-						"debug": "^4.1.0",
-						"extract-zip": "^2.0.0",
-						"https-proxy-agent": "^4.0.0",
-						"mime": "^2.0.3",
-						"mitt": "^2.0.1",
-						"progress": "^2.0.1",
-						"proxy-from-env": "^1.0.0",
-						"rimraf": "^3.0.2",
-						"tar-fs": "^2.0.0",
-						"unbzip2-stream": "^1.3.3",
-						"ws": "^7.2.3"
-					}
-				},
-				"rimraf": {
-					"version": "3.0.2",
-					"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
-					"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
-					"dev": true,
-					"requires": {
-						"glob": "^7.1.3"
-					}
 				}
 			}
 		},
@@ -13090,12 +13678,6 @@
 			"integrity": "sha1-P376M2lvoFdwsoCU9EUIyvxdLto=",
 			"dev": true
 		},
-		"grunt-includes": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/grunt-includes/-/grunt-includes-1.1.0.tgz",
-			"integrity": "sha512-aZQfL+fiAonPI173QUjGyuCkaUTJci7+a5SkmSAbezUikwLban7Jp6W+vbA/Mnacmy+EPipnuK5kAF6O0SvrDw==",
-			"dev": true
-		},
 		"grunt-jsdoc": {
 			"version": "2.4.1",
 			"resolved": "https://registry.npmjs.org/grunt-jsdoc/-/grunt-jsdoc-2.4.1.tgz",
@@ -13580,6 +14162,14 @@
 			"resolved": "https://registry.npmjs.org/highlight-words-core/-/highlight-words-core-1.2.2.tgz",
 			"integrity": "sha512-BXUKIkUuh6cmmxzi5OIbUJxrG8OAk2MqoL1DtO3Wo9D2faJg2ph5ntyuQeLqaHJmzER6H5tllCDA9ZnNe9BVGg=="
 		},
+		"history": {
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/history/-/history-5.2.0.tgz",
+			"integrity": "sha512-uPSF6lAJb3nSePJ43hN3eKj1dTWpN9gMod0ZssbFTIsen+WehTmEadgL+kg78xLJFdRfrrC//SavDzmRVdE+Ig==",
+			"requires": {
+				"@babel/runtime": "^7.7.6"
+			}
+		},
 		"hmac-drbg": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
@@ -13654,13 +14244,6 @@
 			"integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=",
 			"dev": true
 		},
-		"html-comment-regex": {
-			"version": "1.1.2",
-			"resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz",
-			"integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==",
-			"dev": true,
-			"optional": true
-		},
 		"html-element-map": {
 			"version": "1.3.1",
 			"resolved": "https://registry.npmjs.org/html-element-map/-/html-element-map-1.3.1.tgz",
@@ -13889,7 +14472,8 @@
 		"ieee754": {
 			"version": "1.2.1",
 			"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
-			"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
+			"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+			"dev": true
 		},
 		"iferr": {
 			"version": "0.1.5",
@@ -13898,15 +14482,9 @@
 			"dev": true
 		},
 		"ignore": {
-			"version": "5.1.8",
-			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz",
-			"integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==",
-			"dev": true
-		},
-		"ignore-emit-webpack-plugin": {
-			"version": "2.0.6",
-			"resolved": "https://registry.npmjs.org/ignore-emit-webpack-plugin/-/ignore-emit-webpack-plugin-2.0.6.tgz",
-			"integrity": "sha512-/zC18RWCC2wz4ZwnS4UoujGWzvSKy28DLjtE+jrGBOXej6YdmityhBDzE8E0NlktEqi4tgdNbydX8B6G4haHSQ==",
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz",
+			"integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==",
 			"dev": true
 		},
 		"imagemin": {
@@ -14090,18 +14668,6 @@
 			"requires": {
 				"is-svg": "^4.2.1",
 				"svgo": "^1.3.2"
-			},
-			"dependencies": {
-				"is-svg": {
-					"version": "4.2.1",
-					"resolved": "https://registry.npmjs.org/is-svg/-/is-svg-4.2.1.tgz",
-					"integrity": "sha512-PHx3ANecKsKNl5y5+Jvt53Y4J7MfMpbNZkv384QNiswMKAWIbvcqbPz+sYbFKJI8Xv3be01GSFniPmoaP+Ai5A==",
-					"dev": true,
-					"optional": true,
-					"requires": {
-						"html-comment-regex": "^1.1.2"
-					}
-				}
 			}
 		},
 		"imagesloaded": {
@@ -14112,6 +14678,11 @@
 				"ev-emitter": "^1.0.0"
 			}
 		},
+		"immediate": {
+			"version": "3.0.6",
+			"resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
+			"integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps="
+		},
 		"import-fresh": {
 			"version": "3.3.0",
 			"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@@ -14128,9 +14699,9 @@
 			"dev": true
 		},
 		"import-local": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz",
-			"integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==",
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+			"integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
 			"dev": true,
 			"requires": {
 				"pkg-dir": "^4.2.0",
@@ -14353,9 +14924,9 @@
 			}
 		},
 		"interpret": {
-			"version": "1.4.0",
-			"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
-			"integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+			"integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
 			"dev": true
 		},
 		"into-stream": {
@@ -14771,6 +15342,11 @@
 			"dev": true,
 			"optional": true
 		},
+		"is-shared-array-buffer": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz",
+			"integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA=="
+		},
 		"is-stream": {
 			"version": "1.1.0",
 			"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
@@ -14791,6 +15367,16 @@
 			"integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=",
 			"dev": true
 		},
+		"is-svg": {
+			"version": "4.3.1",
+			"resolved": "https://registry.npmjs.org/is-svg/-/is-svg-4.3.1.tgz",
+			"integrity": "sha512-h2CGs+yPUyvkgTJQS9cJzo9lYK06WgRiXUqBBHtglSzVKAuH4/oWsqk7LGfbSa1hGk9QcZ0SyQtVggvBA8LZXA==",
+			"dev": true,
+			"optional": true,
+			"requires": {
+				"fast-xml-parser": "^3.19.0"
+			}
+		},
 		"is-symbol": {
 			"version": "1.0.3",
 			"resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
@@ -14836,11 +15422,24 @@
 			"integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
 			"dev": true
 		},
-		"is-whitespace-character": {
-			"version": "1.0.4",
-			"resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz",
-			"integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==",
-			"dev": true
+		"is-weakref": {
+			"version": "1.0.2",
+			"resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+			"integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+			"requires": {
+				"call-bind": "^1.0.2"
+			},
+			"dependencies": {
+				"call-bind": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+					"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+					"requires": {
+						"function-bind": "^1.1.1",
+						"get-intrinsic": "^1.0.2"
+					}
+				}
+			}
 		},
 		"is-windows": {
 			"version": "1.0.2",
@@ -14848,12 +15447,6 @@
 			"integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
 			"dev": true
 		},
-		"is-word-character": {
-			"version": "1.0.4",
-			"resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz",
-			"integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==",
-			"dev": true
-		},
 		"is-wsl": {
 			"version": "1.1.0",
 			"resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
@@ -14899,23 +15492,30 @@
 			"dev": true
 		},
 		"istanbul-lib-coverage": {
-			"version": "3.0.0",
-			"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz",
-			"integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==",
+			"version": "3.2.0",
+			"resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz",
+			"integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==",
 			"dev": true
 		},
 		"istanbul-lib-instrument": {
-			"version": "4.0.3",
-			"resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz",
-			"integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==",
+			"version": "5.1.0",
+			"resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz",
+			"integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==",
 			"dev": true,
 			"requires": {
-				"@babel/core": "^7.7.5",
+				"@babel/core": "^7.12.3",
+				"@babel/parser": "^7.14.7",
 				"@istanbuljs/schema": "^0.1.2",
-				"istanbul-lib-coverage": "^3.0.0",
+				"istanbul-lib-coverage": "^3.2.0",
 				"semver": "^6.3.0"
 			},
 			"dependencies": {
+				"@babel/parser": {
+					"version": "7.16.8",
+					"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz",
+					"integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==",
+					"dev": true
+				},
 				"semver": {
 					"version": "6.3.0",
 					"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
@@ -14968,9 +15568,9 @@
 			}
 		},
 		"istanbul-lib-source-maps": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.0.tgz",
-			"integrity": "sha512-c16LpFRkR8vQXyHZ5nLpY35JZtzj1PQY1iZmesUbf1FZHbIupcWfjgOXBY9YHkLEQ6puz1u4Dgj6qmU/DisrZg==",
+			"version": "4.0.1",
+			"resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+			"integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
 			"dev": true,
 			"requires": {
 				"debug": "^4.1.1",
@@ -14987,9 +15587,9 @@
 			}
 		},
 		"istanbul-reports": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.2.tgz",
-			"integrity": "sha512-9tZvz7AiR3PEDNGiV9vIouQ/EAcqMXFmkcA1CDFTwOB98OZVDL0PH9glHotf5Ugp6GCOTypfzGWI/OqjWNCRUw==",
+			"version": "3.1.3",
+			"resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz",
+			"integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==",
 			"dev": true,
 			"requires": {
 				"html-escaper": "^2.0.0",
@@ -15019,9 +15619,9 @@
 			},
 			"dependencies": {
 				"ansi-regex": {
-					"version": "5.0.0",
-					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-					"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+					"version": "5.0.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+					"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 					"dev": true
 				},
 				"ansi-styles": {
@@ -15127,23 +15727,23 @@
 					"dev": true
 				},
 				"string-width": {
-					"version": "4.2.2",
-					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
-					"integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+					"version": "4.2.3",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+					"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 					"dev": true,
 					"requires": {
 						"emoji-regex": "^8.0.0",
 						"is-fullwidth-code-point": "^3.0.0",
-						"strip-ansi": "^6.0.0"
+						"strip-ansi": "^6.0.1"
 					}
 				},
 				"strip-ansi": {
-					"version": "6.0.0",
-					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-					"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+					"version": "6.0.1",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+					"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 					"dev": true,
 					"requires": {
-						"ansi-regex": "^5.0.0"
+						"ansi-regex": "^5.0.1"
 					}
 				},
 				"wrap-ansi": {
@@ -15370,9 +15970,9 @@
 					}
 				},
 				"picomatch": {
-					"version": "2.3.0",
-					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
-					"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+					"version": "2.3.1",
+					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+					"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
 					"dev": true
 				},
 				"to-regex-range": {
@@ -15387,86 +15987,46 @@
 			}
 		},
 		"jest-dev-server": {
-			"version": "4.4.0",
-			"resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-4.4.0.tgz",
-			"integrity": "sha512-STEHJ3iPSC8HbrQ3TME0ozGX2KT28lbT4XopPxUm2WimsX3fcB3YOptRh12YphQisMhfqNSNTZUmWyT3HEXS2A==",
+			"version": "5.0.3",
+			"resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-5.0.3.tgz",
+			"integrity": "sha512-aJR3a5KdY18Lsz+VbREKwx2HM3iukiui+J9rlv9o6iYTwZCSsJazSTStcD9K1q0AIF3oA+FqLOKDyo/sc7+fJw==",
 			"dev": true,
 			"requires": {
-				"chalk": "^3.0.0",
+				"chalk": "^4.1.1",
 				"cwd": "^0.10.0",
-				"find-process": "^1.4.3",
-				"prompts": "^2.3.0",
-				"spawnd": "^4.4.0",
+				"find-process": "^1.4.4",
+				"prompts": "^2.4.1",
+				"spawnd": "^5.0.0",
 				"tree-kill": "^1.2.2",
-				"wait-on": "^3.3.0"
+				"wait-on": "^5.3.0"
 			},
 			"dependencies": {
-				"ansi-styles": {
-					"version": "4.3.0",
-					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-					"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-					"dev": true,
-					"requires": {
-						"color-convert": "^2.0.1"
-					}
-				},
-				"chalk": {
-					"version": "3.0.0",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
-					"integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
-					"dev": true,
-					"requires": {
-						"ansi-styles": "^4.1.0",
-						"supports-color": "^7.1.0"
-					}
-				},
-				"color-convert": {
-					"version": "2.0.1",
-					"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-					"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+				"rxjs": {
+					"version": "6.6.7",
+					"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
+					"integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
 					"dev": true,
 					"requires": {
-						"color-name": "~1.1.4"
+						"tslib": "^1.9.0"
 					}
 				},
-				"color-name": {
-					"version": "1.1.4",
-					"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-					"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-					"dev": true
-				},
-				"core-js": {
-					"version": "2.6.12",
-					"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
-					"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
-					"dev": true
-				},
-				"has-flag": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-					"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+				"tslib": {
+					"version": "1.14.1",
+					"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+					"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
 					"dev": true
 				},
-				"supports-color": {
-					"version": "7.2.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-					"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^4.0.0"
-					}
-				},
 				"wait-on": {
-					"version": "3.3.0",
-					"resolved": "https://registry.npmjs.org/wait-on/-/wait-on-3.3.0.tgz",
-					"integrity": "sha512-97dEuUapx4+Y12aknWZn7D25kkjMk16PbWoYzpSdA8bYpVfS6hpl2a2pOWZ3c+Tyt3/i4/pglyZctG3J4V1hWQ==",
+					"version": "5.3.0",
+					"resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz",
+					"integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==",
 					"dev": true,
 					"requires": {
-						"@hapi/joi": "^15.0.3",
-						"core-js": "^2.6.5",
-						"minimist": "^1.2.0",
-						"request": "^2.88.0",
-						"rx": "^4.1.0"
+						"axios": "^0.21.1",
+						"joi": "^17.3.0",
+						"lodash": "^4.17.21",
+						"minimist": "^1.2.5",
+						"rxjs": "^6.6.3"
 					}
 				}
 			}
@@ -15597,9 +16157,9 @@
 					}
 				},
 				"picomatch": {
-					"version": "2.3.0",
-					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
-					"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+					"version": "2.3.1",
+					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+					"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
 					"dev": true
 				},
 				"to-regex-range": {
@@ -15771,9 +16331,9 @@
 					}
 				},
 				"picomatch": {
-					"version": "2.3.0",
-					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
-					"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+					"version": "2.3.1",
+					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+					"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
 					"dev": true
 				},
 				"to-regex-range": {
@@ -15859,26 +16419,6 @@
 					"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
 					"dev": true
 				},
-				"read-pkg": {
-					"version": "5.2.0",
-					"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
-					"integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
-					"dev": true,
-					"requires": {
-						"@types/normalize-package-data": "^2.4.0",
-						"normalize-package-data": "^2.5.0",
-						"parse-json": "^5.0.0",
-						"type-fest": "^0.6.0"
-					},
-					"dependencies": {
-						"type-fest": {
-							"version": "0.6.0",
-							"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
-							"integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
-							"dev": true
-						}
-					}
-				},
 				"read-pkg-up": {
 					"version": "7.0.1",
 					"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
@@ -15967,9 +16507,9 @@
 			},
 			"dependencies": {
 				"ansi-regex": {
-					"version": "5.0.0",
-					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-					"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+					"version": "5.0.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+					"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 					"dev": true
 				},
 				"ansi-styles": {
@@ -16054,23 +16594,23 @@
 					"dev": true
 				},
 				"string-width": {
-					"version": "4.2.2",
-					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
-					"integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+					"version": "4.2.3",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+					"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 					"dev": true,
 					"requires": {
 						"emoji-regex": "^8.0.0",
 						"is-fullwidth-code-point": "^3.0.0",
-						"strip-ansi": "^6.0.0"
+						"strip-ansi": "^6.0.1"
 					}
 				},
 				"strip-ansi": {
-					"version": "6.0.0",
-					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-					"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+					"version": "6.0.1",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+					"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 					"dev": true,
 					"requires": {
-						"ansi-regex": "^5.0.0"
+						"ansi-regex": "^5.0.1"
 					}
 				},
 				"strip-bom": {
@@ -16204,9 +16744,9 @@
 					}
 				},
 				"picomatch": {
-					"version": "2.3.0",
-					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
-					"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+					"version": "2.3.1",
+					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+					"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
 					"dev": true
 				},
 				"to-regex-range": {
@@ -16235,9 +16775,9 @@
 			},
 			"dependencies": {
 				"camelcase": {
-					"version": "6.2.0",
-					"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
-					"integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
+					"version": "6.3.0",
+					"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+					"integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
 					"dev": true
 				}
 			}
@@ -16286,9 +16826,9 @@
 			}
 		},
 		"joi": {
-			"version": "17.4.0",
-			"resolved": "https://registry.npmjs.org/joi/-/joi-17.4.0.tgz",
-			"integrity": "sha512-F4WiW2xaV6wc1jxete70Rw4V/VuMd6IN+a5ilZsxG4uYtUXWu2kq9W5P2dz30e7Gmw8RCbY/u/uk+dMPma9tAg==",
+			"version": "17.4.2",
+			"resolved": "https://registry.npmjs.org/joi/-/joi-17.4.2.tgz",
+			"integrity": "sha512-Lm56PP+n0+Z2A2rfRvsfWVDXGEWjXxatPopkQ8qQ5mxCEhwHG+Ettgg5o98FFaxilOxozoa14cFhrE/hOzh/Nw==",
 			"dev": true,
 			"requires": {
 				"@hapi/hoek": "^9.0.0",
@@ -16296,23 +16836,6 @@
 				"@sideway/address": "^4.1.0",
 				"@sideway/formula": "^3.0.0",
 				"@sideway/pinpoint": "^2.0.0"
-			},
-			"dependencies": {
-				"@hapi/hoek": {
-					"version": "9.1.1",
-					"resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.1.1.tgz",
-					"integrity": "sha512-CAEbWH7OIur6jEOzaai83jq3FmKmv4PmX1JYfs9IrYcGEVI/lyL1EXJGCj7eFVJ0bg5QR8LMxBlEtA+xKiLpFw==",
-					"dev": true
-				},
-				"@hapi/topo": {
-					"version": "5.0.0",
-					"resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.0.0.tgz",
-					"integrity": "sha512-tFJlT47db0kMqVm3H4nQYgn6Pwg10GTZHb1pwmSiv1K4ks6drQOtfEF5ZnPjkvC+y4/bUPHK+bc87QvLcL+WMw==",
-					"dev": true,
-					"requires": {
-						"@hapi/hoek": "^9.0.0"
-					}
-				}
 			}
 		},
 		"jpegtran-bin": {
@@ -16346,9 +16869,9 @@
 			}
 		},
 		"jquery-hoverintent": {
-			"version": "1.10.1",
-			"resolved": "https://registry.npmjs.org/jquery-hoverintent/-/jquery-hoverintent-1.10.1.tgz",
-			"integrity": "sha512-PNZAVnNcuIB5MDmZPWK7H2lQINRJ4Z8+EGLseIZd/gnd5Q9W3dBOKv0vKG7WPFxG2/Na1YX0/soeufucO6bCJQ==",
+			"version": "1.10.2",
+			"resolved": "https://registry.npmjs.org/jquery-hoverintent/-/jquery-hoverintent-1.10.2.tgz",
+			"integrity": "sha512-YU4xvTywSu+/aZvbtSV8Svgcv7F3iMsXXO8Fm1Scvt9wvKDP7C1F6w1j3Pjn0lQqICxc5s7MnsL3Nbh8DEeOcg==",
 			"requires": {
 				"jquery": ">=1.7.0"
 			}
@@ -16424,10 +16947,10 @@
 				}
 			}
 		},
-		"jsdoctypeparser": {
-			"version": "9.0.0",
-			"resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz",
-			"integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==",
+		"jsdoc-type-pratt-parser": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.2.0.tgz",
+			"integrity": "sha512-4STjeF14jp4bqha44nKMY1OUI6d2/g6uclHWUCZ7B4DoLzaB5bmpTkQrpqU+vSVzMD0LsKAOskcnI3I3VfIpmg==",
 			"dev": true
 		},
 		"jsdom": {
@@ -16466,9 +16989,9 @@
 			},
 			"dependencies": {
 				"acorn": {
-					"version": "8.4.1",
-					"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz",
-					"integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==",
+					"version": "8.7.0",
+					"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
+					"integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
 					"dev": true
 				},
 				"agent-base": {
@@ -16501,11 +17024,31 @@
 						"debug": "4"
 					}
 				},
+				"tr46": {
+					"version": "2.1.0",
+					"resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
+					"integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
+					"dev": true,
+					"requires": {
+						"punycode": "^2.1.1"
+					}
+				},
 				"webidl-conversions": {
 					"version": "6.1.0",
 					"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
 					"integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
 					"dev": true
+				},
+				"whatwg-url": {
+					"version": "8.7.0",
+					"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
+					"integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
+					"dev": true,
+					"requires": {
+						"lodash": "^4.7.0",
+						"tr46": "^2.1.0",
+						"webidl-conversions": "^6.1.0"
+					}
 				}
 			}
 		},
@@ -16516,16 +17059,16 @@
 			"dev": true
 		},
 		"jshint": {
-			"version": "2.12.0",
-			"resolved": "https://registry.npmjs.org/jshint/-/jshint-2.12.0.tgz",
-			"integrity": "sha512-TwuuaUDmra0JMkuqvqy+WGo2xGHSNjv1BA1nTIgtH2K5z1jHuAEeAgp7laaR+hLRmajRjcrM71+vByBDanCyYA==",
+			"version": "2.13.1",
+			"resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.1.tgz",
+			"integrity": "sha512-vymzfR3OysF5P774x6zYv0bD4EpH6NWRxpq54wO9mA9RuY49yb1teKSICkLx2Ryx+mfzlVVNNbTBtsRtg78t7g==",
 			"dev": true,
 			"requires": {
 				"cli": "~1.0.0",
 				"console-browserify": "1.1.x",
 				"exit": "0.1.x",
 				"htmlparser2": "3.8.x",
-				"lodash": "~4.17.19",
+				"lodash": "~4.17.21",
 				"minimatch": "~3.0.2",
 				"shelljs": "0.3.x",
 				"strip-json-comments": "1.0.x"
@@ -16673,9 +17216,9 @@
 			}
 		},
 		"jsonc-parser": {
-			"version": "2.2.1",
-			"resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.2.1.tgz",
-			"integrity": "sha512-o6/yDBYccGvTz1+QFevz6l6OBZ2+fMVu2JZ9CIhzsYRX4mjaK5IyX9eldUdCmga16zlgQxyrj5pt9kzuj2C02w==",
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz",
+			"integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==",
 			"dev": true
 		},
 		"jsonfile": {
@@ -16700,15 +17243,26 @@
 			}
 		},
 		"jsx-ast-utils": {
-			"version": "3.2.0",
-			"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz",
-			"integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==",
+			"version": "3.2.1",
+			"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz",
+			"integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==",
 			"dev": true,
 			"requires": {
-				"array-includes": "^3.1.2",
+				"array-includes": "^3.1.3",
 				"object.assign": "^4.1.2"
 			}
 		},
+		"jszip": {
+			"version": "3.7.1",
+			"resolved": "https://registry.npmjs.org/jszip/-/jszip-3.7.1.tgz",
+			"integrity": "sha512-ghL0tz1XG9ZEmRMcEN2vt7xabrDdqHHeykgARpmZ0BiIctWxM47Vt63ZO2dnp4QYt/xJVLLy5Zv1l/xRdh2byg==",
+			"requires": {
+				"lie": "~3.3.0",
+				"pako": "~1.0.2",
+				"readable-stream": "~2.3.6",
+				"set-immediate-shim": "~1.0.1"
+			}
+		},
 		"just-extend": {
 			"version": "4.2.1",
 			"resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.2.1.tgz",
@@ -16940,9 +17494,9 @@
 			"dev": true
 		},
 		"klona": {
-			"version": "2.0.4",
-			"resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz",
-			"integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==",
+			"version": "2.0.5",
+			"resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz",
+			"integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==",
 			"dev": true
 		},
 		"known-css-properties": {
@@ -16987,6 +17541,14 @@
 				"type-check": "~0.4.0"
 			}
 		},
+		"lie": {
+			"version": "3.3.0",
+			"resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz",
+			"integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==",
+			"requires": {
+				"immediate": "~3.0.5"
+			}
+		},
 		"liftup": {
 			"version": "3.0.1",
 			"resolved": "https://registry.npmjs.org/liftup/-/liftup-3.0.1.tgz",
@@ -17118,6 +17680,12 @@
 				}
 			}
 		},
+		"lilconfig": {
+			"version": "2.0.4",
+			"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz",
+			"integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==",
+			"dev": true
+		},
 		"line-height": {
 			"version": "0.3.1",
 			"resolved": "https://registry.npmjs.org/line-height/-/line-height-0.3.1.tgz",
@@ -17127,9 +17695,9 @@
 			}
 		},
 		"lines-and-columns": {
-			"version": "1.1.6",
-			"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
-			"integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA="
+			"version": "1.2.4",
+			"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+			"integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
 		},
 		"linkify-it": {
 			"version": "2.2.0",
@@ -17216,12 +17784,6 @@
 			"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
 			"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
 		},
-		"lodash.clonedeep": {
-			"version": "4.5.0",
-			"resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
-			"integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
-			"dev": true
-		},
 		"lodash.debounce": {
 			"version": "4.0.8",
 			"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -17443,12 +18005,12 @@
 			}
 		},
 		"makeerror": {
-			"version": "1.0.11",
-			"resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz",
-			"integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=",
+			"version": "1.0.12",
+			"resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+			"integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
 			"dev": true,
 			"requires": {
-				"tmpl": "1.0.x"
+				"tmpl": "1.0.5"
 			}
 		},
 		"map-cache": {
@@ -17478,12 +18040,6 @@
 				"object-visit": "^1.0.0"
 			}
 		},
-		"markdown-escapes": {
-			"version": "1.0.4",
-			"resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz",
-			"integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==",
-			"dev": true
-		},
 		"markdown-it": {
 			"version": "10.0.0",
 			"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-10.0.0.tgz",
@@ -17512,60 +18068,105 @@
 			"dev": true
 		},
 		"markdownlint": {
-			"version": "0.18.0",
-			"resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.18.0.tgz",
-			"integrity": "sha512-nQAfK9Pbq0ZRoMC/abNGterEnV3kL8MZmi0WHhw8WJKoIbsm3cXGufGsxzCRvjW15cxe74KWcxRSKqwplS26Bw==",
+			"version": "0.23.1",
+			"resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.23.1.tgz",
+			"integrity": "sha512-iOEwhDfNmq2IJlaA8mzEkHYUi/Hwoa6Ss+HO5jkwUR6wQ4quFr0WzSx+Z9rsWZKUaPbyirIdL1zGmJRkWawr4Q==",
 			"dev": true,
 			"requires": {
-				"markdown-it": "10.0.0"
+				"markdown-it": "12.0.4"
+			},
+			"dependencies": {
+				"argparse": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+					"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+					"dev": true
+				},
+				"linkify-it": {
+					"version": "3.0.3",
+					"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
+					"integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
+					"dev": true,
+					"requires": {
+						"uc.micro": "^1.0.1"
+					}
+				},
+				"markdown-it": {
+					"version": "12.0.4",
+					"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.0.4.tgz",
+					"integrity": "sha512-34RwOXZT8kyuOJy25oJNJoulO8L0bTHYWXcdZBYZqFnjIy3NgjeoM3FmPXIOFQ26/lSHYMr8oc62B6adxXcb3Q==",
+					"dev": true,
+					"requires": {
+						"argparse": "^2.0.1",
+						"entities": "~2.1.0",
+						"linkify-it": "^3.0.1",
+						"mdurl": "^1.0.1",
+						"uc.micro": "^1.0.5"
+					}
+				}
 			}
 		},
 		"markdownlint-cli": {
-			"version": "0.21.0",
-			"resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.21.0.tgz",
-			"integrity": "sha512-gvnczz3W3Wgex851/cIQ/2y8GNhY+EVK8Ael8kRd8hoSQ0ps9xjhtwPwMyJPoiYbAoPxG6vSBFISiysaAbCEZg==",
+			"version": "0.27.1",
+			"resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.27.1.tgz",
+			"integrity": "sha512-p1VV6aSbGrDlpUWzHizAnSNEQAweVR3qUI/AIUubxW7BGPXziSXkIED+uRtSohUlRS/jmqp3Wi4es5j6fIrdeQ==",
 			"dev": true,
 			"requires": {
-				"commander": "~2.9.0",
-				"deep-extend": "~0.5.1",
-				"get-stdin": "~5.0.1",
-				"glob": "~7.1.2",
-				"ignore": "~5.1.4",
-				"js-yaml": "~3.13.1",
-				"jsonc-parser": "~2.2.0",
+				"commander": "~7.1.0",
+				"deep-extend": "~0.6.0",
+				"get-stdin": "~8.0.0",
+				"glob": "~7.1.6",
+				"ignore": "~5.1.8",
+				"js-yaml": "^4.0.0",
+				"jsonc-parser": "~3.0.0",
 				"lodash.differencewith": "~4.5.0",
 				"lodash.flatten": "~4.4.0",
-				"markdownlint": "~0.18.0",
-				"markdownlint-rule-helpers": "~0.6.0",
+				"markdownlint": "~0.23.1",
+				"markdownlint-rule-helpers": "~0.14.0",
 				"minimatch": "~3.0.4",
-				"rc": "~1.2.7"
+				"minimist": "~1.2.5",
+				"rc": "~1.2.8"
 			},
 			"dependencies": {
+				"argparse": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+					"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+					"dev": true
+				},
 				"commander": {
-					"version": "2.9.0",
-					"resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
-					"integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
-					"dev": true,
-					"requires": {
-						"graceful-readlink": ">= 1.0.0"
-					}
+					"version": "7.1.0",
+					"resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz",
+					"integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==",
+					"dev": true
+				},
+				"get-stdin": {
+					"version": "8.0.0",
+					"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
+					"integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
+					"dev": true
+				},
+				"ignore": {
+					"version": "5.1.9",
+					"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.9.tgz",
+					"integrity": "sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ==",
+					"dev": true
 				},
 				"js-yaml": {
-					"version": "3.13.1",
-					"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
-					"integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+					"version": "4.1.0",
+					"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+					"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
 					"dev": true,
 					"requires": {
-						"argparse": "^1.0.7",
-						"esprima": "^4.0.0"
+						"argparse": "^2.0.1"
 					}
 				}
 			}
 		},
 		"markdownlint-rule-helpers": {
-			"version": "0.6.0",
-			"resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.6.0.tgz",
-			"integrity": "sha512-LiZVAbg9/cqkBHtLNNqHV3xuy4Y2L/KuGU6+ZXqCT9NnCdEkIoxeI5/96t+ExquBY0iHy2CVWxPH16nG1RKQVQ==",
+			"version": "0.14.0",
+			"resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.14.0.tgz",
+			"integrity": "sha512-vRTPqSU4JK8vVXmjICHSBhwXUvbfh/VJo+j7hvxqe15tLJyomv3FLgFdFgb8kpj0Fe8SsJa/TZUAXv7/sN+N7A==",
 			"dev": true
 		},
 		"marked": {
@@ -17761,31 +18362,6 @@
 				"micromark": "~2.11.0",
 				"parse-entities": "^2.0.0",
 				"unist-util-stringify-position": "^2.0.0"
-			},
-			"dependencies": {
-				"parse-entities": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
-					"integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
-					"dev": true,
-					"requires": {
-						"character-entities": "^1.0.0",
-						"character-entities-legacy": "^1.0.0",
-						"character-reference-invalid": "^1.0.0",
-						"is-alphanumerical": "^1.0.0",
-						"is-decimal": "^1.0.0",
-						"is-hexadecimal": "^1.0.0"
-					}
-				},
-				"unist-util-stringify-position": {
-					"version": "2.0.3",
-					"resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
-					"integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
-					"dev": true,
-					"requires": {
-						"@types/unist": "^2.0.2"
-					}
-				}
 			}
 		},
 		"mdast-util-to-markdown": {
@@ -17795,27 +18371,11 @@
 			"dev": true,
 			"requires": {
 				"@types/unist": "^2.0.0",
-				"longest-streak": "^2.0.0",
-				"mdast-util-to-string": "^2.0.0",
-				"parse-entities": "^2.0.0",
-				"repeat-string": "^1.0.0",
-				"zwitch": "^1.0.0"
-			},
-			"dependencies": {
-				"parse-entities": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
-					"integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
-					"dev": true,
-					"requires": {
-						"character-entities": "^1.0.0",
-						"character-entities-legacy": "^1.0.0",
-						"character-reference-invalid": "^1.0.0",
-						"is-alphanumerical": "^1.0.0",
-						"is-decimal": "^1.0.0",
-						"is-hexadecimal": "^1.0.0"
-					}
-				}
+				"longest-streak": "^2.0.0",
+				"mdast-util-to-string": "^2.0.0",
+				"parse-entities": "^2.0.0",
+				"repeat-string": "^1.0.0",
+				"zwitch": "^1.0.0"
 			}
 		},
 		"mdast-util-to-string": {
@@ -17917,22 +18477,6 @@
 			"requires": {
 				"debug": "^4.0.0",
 				"parse-entities": "^2.0.0"
-			},
-			"dependencies": {
-				"parse-entities": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
-					"integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
-					"dev": true,
-					"requires": {
-						"character-entities": "^1.0.0",
-						"character-entities-legacy": "^1.0.0",
-						"character-reference-invalid": "^1.0.0",
-						"is-alphanumerical": "^1.0.0",
-						"is-decimal": "^1.0.0",
-						"is-hexadecimal": "^1.0.0"
-					}
-				}
 			}
 		},
 		"micromatch": {
@@ -17965,9 +18509,9 @@
 			}
 		},
 		"micromodal": {
-			"version": "0.4.6",
-			"resolved": "https://registry.npmjs.org/micromodal/-/micromodal-0.4.6.tgz",
-			"integrity": "sha512-2VDso2a22jWPpqwuWT/4RomVpoU3Bl9qF9D01xzwlNp5UVsImeA0gY4nSpF44vqcQtQOtkiMUV9EZkAJSRxBsg=="
+			"version": "0.4.10",
+			"resolved": "https://registry.npmjs.org/micromodal/-/micromodal-0.4.10.tgz",
+			"integrity": "sha512-BUrEnzMPFBwK8nOE4xUDYHLrlGlLULQVjpja99tpJQPSUEWgw3kTLp1n1qv0HmKU29AiHE7Y7sMLiRziDK4ghQ=="
 		},
 		"miller-rabin": {
 			"version": "4.0.1",
@@ -18025,14 +18569,12 @@
 			"dev": true
 		},
 		"mini-css-extract-plugin": {
-			"version": "1.6.2",
-			"resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz",
-			"integrity": "sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==",
+			"version": "2.5.2",
+			"resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.2.tgz",
+			"integrity": "sha512-Lwgq9qLNyBK6yNLgzssXnq4r2+mB9Mz3cJWlM8kseysHIvTicFhDNimFgY94jjqlwhNzLPsq8wv4X+vOHtMdYA==",
 			"dev": true,
 			"requires": {
-				"loader-utils": "^2.0.0",
-				"schema-utils": "^3.0.0",
-				"webpack-sources": "^1.1.0"
+				"schema-utils": "^4.0.0"
 			},
 			"dependencies": {
 				"@types/json-schema": {
@@ -18041,35 +18583,43 @@
 					"integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
 					"dev": true
 				},
-				"json5": {
-					"version": "2.2.0",
-					"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
-					"integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
+				"ajv": {
+					"version": "8.9.0",
+					"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz",
+					"integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==",
 					"dev": true,
 					"requires": {
-						"minimist": "^1.2.5"
+						"fast-deep-equal": "^3.1.1",
+						"json-schema-traverse": "^1.0.0",
+						"require-from-string": "^2.0.2",
+						"uri-js": "^4.2.2"
 					}
 				},
-				"loader-utils": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-					"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
+				"ajv-keywords": {
+					"version": "5.1.0",
+					"resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+					"integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
 					"dev": true,
 					"requires": {
-						"big.js": "^5.2.2",
-						"emojis-list": "^3.0.0",
-						"json5": "^2.1.2"
+						"fast-deep-equal": "^3.1.3"
 					}
 				},
+				"json-schema-traverse": {
+					"version": "1.0.0",
+					"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+					"integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+					"dev": true
+				},
 				"schema-utils": {
-					"version": "3.1.1",
-					"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
-					"integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz",
+					"integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==",
 					"dev": true,
 					"requires": {
-						"@types/json-schema": "^7.0.8",
-						"ajv": "^6.12.5",
-						"ajv-keywords": "^3.5.2"
+						"@types/json-schema": "^7.0.9",
+						"ajv": "^8.8.0",
+						"ajv-formats": "^2.1.1",
+						"ajv-keywords": "^5.0.0"
 					}
 				}
 			}
@@ -18119,52 +18669,6 @@
 				}
 			}
 		},
-		"minipass": {
-			"version": "3.1.3",
-			"resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
-			"integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
-			"dev": true,
-			"requires": {
-				"yallist": "^4.0.0"
-			}
-		},
-		"minipass-collect": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
-			"integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
-			"dev": true,
-			"requires": {
-				"minipass": "^3.0.0"
-			}
-		},
-		"minipass-flush": {
-			"version": "1.0.5",
-			"resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
-			"integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
-			"dev": true,
-			"requires": {
-				"minipass": "^3.0.0"
-			}
-		},
-		"minipass-pipeline": {
-			"version": "1.2.4",
-			"resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
-			"integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
-			"dev": true,
-			"requires": {
-				"minipass": "^3.0.0"
-			}
-		},
-		"minizlib": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
-			"integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
-			"dev": true,
-			"requires": {
-				"minipass": "^3.0.0",
-				"yallist": "^4.0.0"
-			}
-		},
 		"mississippi": {
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz",
@@ -18183,12 +18687,6 @@
 				"through2": "^2.0.0"
 			}
 		},
-		"mitt": {
-			"version": "2.1.0",
-			"resolved": "https://registry.npmjs.org/mitt/-/mitt-2.1.0.tgz",
-			"integrity": "sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg==",
-			"dev": true
-		},
 		"mixin-deep": {
 			"version": "1.3.2",
 			"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
@@ -18257,9 +18755,9 @@
 			"integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ=="
 		},
 		"moment-timezone": {
-			"version": "0.5.33",
-			"resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.33.tgz",
-			"integrity": "sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==",
+			"version": "0.5.34",
+			"resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.34.tgz",
+			"integrity": "sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==",
 			"requires": {
 				"moment": ">= 2.9.0"
 			}
@@ -18289,6 +18787,12 @@
 				"run-queue": "^1.0.3"
 			}
 		},
+		"mrmime": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.0.tgz",
+			"integrity": "sha512-a70zx7zFfVO7XpnQ2IX1Myh9yY4UYvfld/dikWRnsXxbyvMcfz+u6UfgNAtH+k2QqtJuzVpv6eLTx1G2+WKZbQ==",
+			"dev": true
+		},
 		"ms": {
 			"version": "2.1.3",
 			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
@@ -18329,9 +18833,9 @@
 			"optional": true
 		},
 		"nanoid": {
-			"version": "3.1.25",
-			"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.25.tgz",
-			"integrity": "sha512-rdwtIXaXCLFAQbnfqDRnI6jaRHp9fTcYBjtFKE8eezcZ7LuLjhUaQGNeMXf1HmRoCH32CLz6XwX0TtxEOS/A3Q==",
+			"version": "3.2.0",
+			"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.2.0.tgz",
+			"integrity": "sha512-fmsZYa9lpn69Ad5eDn7FMcnnSR+8R34W9qJEijxYhTbfOWzr22n1QxCMzXLK+ODyW2973V3Fux959iQoUxzUIA==",
 			"dev": true
 		},
 		"nanomatch": {
@@ -18421,9 +18925,9 @@
 			},
 			"dependencies": {
 				"@sinonjs/fake-timers": {
-					"version": "7.1.1",
-					"resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.1.tgz",
-					"integrity": "sha512-am34LJf0N2nON/PT9G7pauA+xjcwX9P6x31m4hBgfUeSXYRZBRv/R6EcdWs8iV4XJjPO++NTsrj7ua/cN2s6ZA==",
+					"version": "7.1.2",
+					"resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.2.tgz",
+					"integrity": "sha512-iQADsW4LBMISqZ6Ci1dupJL9pprqwcVFTcOsEmQOEhW+KLCVn/Y4Jrvg2k19fIHCp+iFprriYPTdRcQR8NbUPg==",
 					"dev": true,
 					"requires": {
 						"@sinonjs/commons": "^1.7.0"
@@ -18447,10 +18951,13 @@
 			}
 		},
 		"node-fetch": {
-			"version": "2.6.1",
-			"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
-			"integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
-			"dev": true
+			"version": "2.6.6",
+			"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.6.tgz",
+			"integrity": "sha512-Z8/6vRlTUChSdIgMa51jxQ4lrw/Jy5SOW10ObaA47/RElsAN2c5Pn8bTgFGWn/ibwzXTE8qwr1Yzx28vsecXEA==",
+			"dev": true,
+			"requires": {
+				"whatwg-url": "^5.0.0"
+			}
 		},
 		"node-forge": {
 			"version": "0.10.0",
@@ -18514,12 +19021,6 @@
 				}
 			}
 		},
-		"node-modules-regexp": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/node-modules-regexp/-/node-modules-regexp-1.0.0.tgz",
-			"integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=",
-			"dev": true
-		},
 		"node-notifier": {
 			"version": "8.0.2",
 			"resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.2.tgz",
@@ -18554,9 +19055,9 @@
 			"dev": true
 		},
 		"node-watch": {
-			"version": "0.7.1",
-			"resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.1.tgz",
-			"integrity": "sha512-UWblPYuZYrkCQCW5PxAwYSxaELNBLUckrTBBk8xr1/bUgyOkYYTsUcV4e3ytcazFEOyiRyiUrsG37pu6I0I05g==",
+			"version": "0.7.2",
+			"resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.7.2.tgz",
+			"integrity": "sha512-g53VjSARRv1JdST0LZRIg8RiuLr1TaBbVPsVvxh0/0Ymvi0xYUjDuoqQQAWtHJQUXhiShowPT/aXKNeHBcyQsw==",
 			"dev": true
 		},
 		"nopt": {
@@ -18605,6 +19106,12 @@
 			"integrity": "sha1-0LFF62kRicY6eNIB3E/bEpPvDAM=",
 			"dev": true
 		},
+		"normalize-url": {
+			"version": "6.1.0",
+			"resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+			"integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+			"dev": true
+		},
 		"normalize-wheel": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
@@ -18631,20 +19138,20 @@
 			}
 		},
 		"npm-package-json-lint": {
-			"version": "5.2.3",
-			"resolved": "https://registry.npmjs.org/npm-package-json-lint/-/npm-package-json-lint-5.2.3.tgz",
-			"integrity": "sha512-rSgc4eVhtfwrU7AWwovqFWy8OEkgQL99vD3vWJmqtU9gxxJxKzi6Wqgo3gF7lhrBpyVcnlKxy/L2JCsvjWruDA==",
+			"version": "5.4.2",
+			"resolved": "https://registry.npmjs.org/npm-package-json-lint/-/npm-package-json-lint-5.4.2.tgz",
+			"integrity": "sha512-DH1MSvYvm+cuQFXcPehIIu/WiYzMYs7BOxlhOOFHaH2SNrA+P2uDtTEe5LOG90Ci7PTwgF/dCmSKM2HWTgWXNA==",
 			"dev": true,
 			"requires": {
 				"ajv": "^6.12.6",
 				"ajv-errors": "^1.0.1",
 				"chalk": "^4.1.2",
-				"cosmiconfig": "^6.0.0",
+				"cosmiconfig": "^7.0.1",
 				"debug": "^4.3.2",
 				"globby": "^11.0.4",
-				"ignore": "^5.1.8",
+				"ignore": "^5.1.9",
 				"is-plain-obj": "^3.0.0",
-				"jsonc-parser": "^2.3.1",
+				"jsonc-parser": "^3.0.0",
 				"log-symbols": "^4.1.0",
 				"meow": "^6.1.1",
 				"plur": "^4.0.0",
@@ -18653,15 +19160,6 @@
 				"strip-json-comments": "^3.1.1"
 			},
 			"dependencies": {
-				"ansi-styles": {
-					"version": "4.3.0",
-					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-					"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-					"dev": true,
-					"requires": {
-						"color-convert": "^2.0.1"
-					}
-				},
 				"array-union": {
 					"version": "2.1.0",
 					"resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
@@ -18679,35 +19177,23 @@
 						"quick-lru": "^4.0.1"
 					}
 				},
-				"chalk": {
-					"version": "4.1.2",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
-					"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-					"dev": true,
-					"requires": {
-						"ansi-styles": "^4.1.0",
-						"supports-color": "^7.1.0"
-					}
-				},
-				"color-convert": {
-					"version": "2.0.1",
-					"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-					"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+				"cosmiconfig": {
+					"version": "7.0.1",
+					"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
+					"integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==",
 					"dev": true,
 					"requires": {
-						"color-name": "~1.1.4"
+						"@types/parse-json": "^4.0.0",
+						"import-fresh": "^3.2.1",
+						"parse-json": "^5.0.0",
+						"path-type": "^4.0.0",
+						"yaml": "^1.10.0"
 					}
 				},
-				"color-name": {
-					"version": "1.1.4",
-					"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-					"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-					"dev": true
-				},
 				"debug": {
-					"version": "4.3.2",
-					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-					"integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+					"version": "4.3.3",
+					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+					"integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
 					"dev": true,
 					"requires": {
 						"ms": "2.1.2"
@@ -18724,25 +19210,19 @@
 					}
 				},
 				"globby": {
-					"version": "11.0.4",
-					"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
-					"integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
+					"version": "11.1.0",
+					"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+					"integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
 					"dev": true,
 					"requires": {
 						"array-union": "^2.1.0",
 						"dir-glob": "^3.0.1",
-						"fast-glob": "^3.1.1",
-						"ignore": "^5.1.4",
-						"merge2": "^1.3.0",
+						"fast-glob": "^3.2.9",
+						"ignore": "^5.2.0",
+						"merge2": "^1.4.1",
 						"slash": "^3.0.0"
 					}
 				},
-				"has-flag": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-					"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-					"dev": true
-				},
 				"indent-string": {
 					"version": "4.0.0",
 					"resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
@@ -18755,12 +19235,6 @@
 					"integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
 					"dev": true
 				},
-				"jsonc-parser": {
-					"version": "2.3.1",
-					"resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-2.3.1.tgz",
-					"integrity": "sha512-H8jvkz1O50L3dMZCsLqiuB2tA7muqbSg1AtGEkN0leAqGjsUzDJir3Zwr02BhqdcITPg3ei3mZ+HjMocAknhhg==",
-					"dev": true
-				},
 				"locate-path": {
 					"version": "5.0.0",
 					"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@@ -18771,9 +19245,9 @@
 					}
 				},
 				"map-obj": {
-					"version": "4.2.1",
-					"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz",
-					"integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==",
+					"version": "4.3.0",
+					"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
+					"integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
 					"dev": true
 				},
 				"meow": {
@@ -18816,26 +19290,6 @@
 					"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
 					"dev": true
 				},
-				"read-pkg": {
-					"version": "5.2.0",
-					"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
-					"integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
-					"dev": true,
-					"requires": {
-						"@types/normalize-package-data": "^2.4.0",
-						"normalize-package-data": "^2.5.0",
-						"parse-json": "^5.0.0",
-						"type-fest": "^0.6.0"
-					},
-					"dependencies": {
-						"type-fest": {
-							"version": "0.6.0",
-							"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
-							"integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
-							"dev": true
-						}
-					}
-				},
 				"read-pkg-up": {
 					"version": "7.0.1",
 					"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
@@ -18883,15 +19337,6 @@
 						"min-indent": "^1.0.0"
 					}
 				},
-				"supports-color": {
-					"version": "7.2.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-					"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^4.0.0"
-					}
-				},
 				"trim-newlines": {
 					"version": "3.0.1",
 					"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
@@ -19054,13 +19499,13 @@
 			}
 		},
 		"object.entries": {
-			"version": "1.1.4",
-			"resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz",
-			"integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==",
+			"version": "1.1.5",
+			"resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz",
+			"integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==",
 			"requires": {
 				"call-bind": "^1.0.2",
 				"define-properties": "^1.1.3",
-				"es-abstract": "^1.18.2"
+				"es-abstract": "^1.19.1"
 			},
 			"dependencies": {
 				"call-bind": {
@@ -19073,21 +19518,24 @@
 					}
 				},
 				"es-abstract": {
-					"version": "1.18.5",
-					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz",
-					"integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==",
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
 					"requires": {
 						"call-bind": "^1.0.2",
 						"es-to-primitive": "^1.2.1",
 						"function-bind": "^1.1.1",
 						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
 						"has": "^1.0.3",
 						"has-symbols": "^1.0.2",
 						"internal-slot": "^1.0.3",
-						"is-callable": "^1.2.3",
+						"is-callable": "^1.2.4",
 						"is-negative-zero": "^2.0.1",
-						"is-regex": "^1.1.3",
-						"is-string": "^1.0.6",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
 						"object-inspect": "^1.11.0",
 						"object-keys": "^1.1.1",
 						"object.assign": "^4.1.2",
@@ -19128,9 +19576,9 @@
 					}
 				},
 				"object-inspect": {
-					"version": "1.11.0",
-					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
-					"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg=="
+					"version": "1.12.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
+					"integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g=="
 				},
 				"string.prototype.trimend": {
 					"version": "1.0.4",
@@ -19153,15 +19601,14 @@
 			}
 		},
 		"object.fromentries": {
-			"version": "2.0.4",
-			"resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz",
-			"integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==",
+			"version": "2.0.5",
+			"resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz",
+			"integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==",
 			"dev": true,
 			"requires": {
 				"call-bind": "^1.0.2",
 				"define-properties": "^1.1.3",
-				"es-abstract": "^1.18.0-next.2",
-				"has": "^1.0.3"
+				"es-abstract": "^1.19.1"
 			},
 			"dependencies": {
 				"call-bind": {
@@ -19175,22 +19622,25 @@
 					}
 				},
 				"es-abstract": {
-					"version": "1.18.5",
-					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz",
-					"integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==",
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
 					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
 						"es-to-primitive": "^1.2.1",
 						"function-bind": "^1.1.1",
 						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
 						"has": "^1.0.3",
 						"has-symbols": "^1.0.2",
 						"internal-slot": "^1.0.3",
-						"is-callable": "^1.2.3",
+						"is-callable": "^1.2.4",
 						"is-negative-zero": "^2.0.1",
-						"is-regex": "^1.1.3",
-						"is-string": "^1.0.6",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
 						"object-inspect": "^1.11.0",
 						"object-keys": "^1.1.1",
 						"object.assign": "^4.1.2",
@@ -19235,9 +19685,9 @@
 					}
 				},
 				"object-inspect": {
-					"version": "1.11.0",
-					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
-					"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
+					"version": "1.12.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
+					"integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
 					"dev": true
 				},
 				"string.prototype.trimend": {
@@ -19295,6 +19745,115 @@
 				}
 			}
 		},
+		"object.hasown": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz",
+			"integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==",
+			"dev": true,
+			"requires": {
+				"define-properties": "^1.1.3",
+				"es-abstract": "^1.19.1"
+			},
+			"dependencies": {
+				"call-bind": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+					"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+					"dev": true,
+					"requires": {
+						"function-bind": "^1.1.1",
+						"get-intrinsic": "^1.0.2"
+					}
+				},
+				"es-abstract": {
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
+					"dev": true,
+					"requires": {
+						"call-bind": "^1.0.2",
+						"es-to-primitive": "^1.2.1",
+						"function-bind": "^1.1.1",
+						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
+						"has": "^1.0.3",
+						"has-symbols": "^1.0.2",
+						"internal-slot": "^1.0.3",
+						"is-callable": "^1.2.4",
+						"is-negative-zero": "^2.0.1",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
+						"object-inspect": "^1.11.0",
+						"object-keys": "^1.1.1",
+						"object.assign": "^4.1.2",
+						"string.prototype.trimend": "^1.0.4",
+						"string.prototype.trimstart": "^1.0.4",
+						"unbox-primitive": "^1.0.1"
+					}
+				},
+				"get-intrinsic": {
+					"version": "1.1.1",
+					"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+					"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+					"dev": true,
+					"requires": {
+						"function-bind": "^1.1.1",
+						"has": "^1.0.3",
+						"has-symbols": "^1.0.1"
+					}
+				},
+				"has-symbols": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+					"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+					"dev": true
+				},
+				"is-callable": {
+					"version": "1.2.4",
+					"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
+					"integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
+					"dev": true
+				},
+				"is-regex": {
+					"version": "1.1.4",
+					"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+					"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+					"dev": true,
+					"requires": {
+						"call-bind": "^1.0.2",
+						"has-tostringtag": "^1.0.0"
+					}
+				},
+				"object-inspect": {
+					"version": "1.12.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
+					"integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
+					"dev": true
+				},
+				"string.prototype.trimend": {
+					"version": "1.0.4",
+					"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
+					"integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
+					"dev": true,
+					"requires": {
+						"call-bind": "^1.0.2",
+						"define-properties": "^1.1.3"
+					}
+				},
+				"string.prototype.trimstart": {
+					"version": "1.0.4",
+					"resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
+					"integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
+					"dev": true,
+					"requires": {
+						"call-bind": "^1.0.2",
+						"define-properties": "^1.1.3"
+					}
+				}
+			}
+		},
 		"object.map": {
 			"version": "1.0.1",
 			"resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz",
@@ -19610,8 +20169,7 @@
 		"pako": {
 			"version": "1.0.11",
 			"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
-			"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
-			"dev": true
+			"integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw=="
 		},
 		"parallel-transform": {
 			"version": "1.2.0",
@@ -19646,9 +20204,9 @@
 			}
 		},
 		"parse-entities": {
-			"version": "1.2.2",
-			"resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz",
-			"integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==",
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz",
+			"integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==",
 			"dev": true,
 			"requires": {
 				"character-entities": "^1.0.0",
@@ -19754,9 +20312,9 @@
 			"dev": true
 		},
 		"path-parse": {
-			"version": "1.0.6",
-			"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-			"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
+			"version": "1.0.7",
+			"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+			"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
 		},
 		"path-root": {
 			"version": "0.1.1",
@@ -19809,6 +20367,12 @@
 			"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
 			"dev": true
 		},
+		"picocolors": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+			"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+			"dev": true
+		},
 		"picomatch": {
 			"version": "2.2.2",
 			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
@@ -19841,13 +20405,10 @@
 			}
 		},
 		"pirates": {
-			"version": "4.0.1",
-			"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.1.tgz",
-			"integrity": "sha512-WuNqLTbMI3tmfef2TKxlQmAiLHKtFhlsCZnPIpuv2Ow0RDVO8lfy1Opf4NUzlMXLjPl+Men7AuVdX6TA+s+uGA==",
-			"dev": true,
-			"requires": {
-				"node-modules-regexp": "^1.0.0"
-			}
+			"version": "4.0.4",
+			"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.4.tgz",
+			"integrity": "sha512-ZIrVPH+A52Dw84R0L3/VS9Op04PuQ2SEoJL6bkshmiTic/HldyW9Tf7oH5mhJZBK7NmDx27vSMrYEXPXclpDKw==",
+			"dev": true
 		},
 		"pixelmatch": {
 			"version": "5.2.1",
@@ -19875,60 +20436,6 @@
 				"find-up": "^3.0.0"
 			}
 		},
-		"pkg-up": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
-			"integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
-			"dev": true,
-			"requires": {
-				"find-up": "^2.1.0"
-			},
-			"dependencies": {
-				"find-up": {
-					"version": "2.1.0",
-					"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-					"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-					"dev": true,
-					"requires": {
-						"locate-path": "^2.0.0"
-					}
-				},
-				"locate-path": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-					"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
-					"dev": true,
-					"requires": {
-						"p-locate": "^2.0.0",
-						"path-exists": "^3.0.0"
-					}
-				},
-				"p-limit": {
-					"version": "1.3.0",
-					"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-					"integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-					"dev": true,
-					"requires": {
-						"p-try": "^1.0.0"
-					}
-				},
-				"p-locate": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-					"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-					"dev": true,
-					"requires": {
-						"p-limit": "^1.1.0"
-					}
-				},
-				"p-try": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-					"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
-					"dev": true
-				}
-			}
-		},
 		"plur": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz",
@@ -20054,13 +20561,6 @@
 				"hey-listen": "^1.0.8",
 				"style-value-types": "4.1.4",
 				"tslib": "^2.1.0"
-			},
-			"dependencies": {
-				"tslib": {
-					"version": "2.3.1",
-					"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
-					"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
-				}
 			}
 		},
 		"portfinder": {
@@ -20092,52 +20592,26 @@
 			"dev": true
 		},
 		"postcss": {
-			"version": "7.0.35",
-			"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-			"integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+			"version": "7.0.39",
+			"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+			"integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
 			"dev": true,
 			"requires": {
-				"chalk": "^2.4.2",
-				"source-map": "^0.6.1",
-				"supports-color": "^6.1.0"
+				"picocolors": "^0.2.1",
+				"source-map": "^0.6.1"
 			},
 			"dependencies": {
-				"chalk": {
-					"version": "2.4.2",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-					"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-					"dev": true,
-					"requires": {
-						"ansi-styles": "^3.2.1",
-						"escape-string-regexp": "^1.0.5",
-						"supports-color": "^5.3.0"
-					},
-					"dependencies": {
-						"supports-color": {
-							"version": "5.5.0",
-							"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-							"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-							"dev": true,
-							"requires": {
-								"has-flag": "^3.0.0"
-							}
-						}
-					}
+				"picocolors": {
+					"version": "0.2.1",
+					"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+					"integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+					"dev": true
 				},
 				"source-map": {
 					"version": "0.6.1",
 					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 					"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
 					"dev": true
-				},
-				"supports-color": {
-					"version": "6.1.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-					"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^3.0.0"
-					}
 				}
 			}
 		},
@@ -20280,24 +20754,16 @@
 			}
 		},
 		"postcss-loader": {
-			"version": "4.3.0",
-			"resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz",
-			"integrity": "sha512-M/dSoIiNDOo8Rk0mUqoj4kpGq91gcxCfb9PoyZVdZ76/AuhxylHDYZblNE8o+EQ9AMSASeMFEKxZf5aU6wlx1Q==",
+			"version": "6.2.1",
+			"resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz",
+			"integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==",
 			"dev": true,
 			"requires": {
 				"cosmiconfig": "^7.0.0",
-				"klona": "^2.0.4",
-				"loader-utils": "^2.0.0",
-				"schema-utils": "^3.0.0",
-				"semver": "^7.3.4"
+				"klona": "^2.0.5",
+				"semver": "^7.3.5"
 			},
 			"dependencies": {
-				"@types/json-schema": {
-					"version": "7.0.9",
-					"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
-					"integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
-					"dev": true
-				},
 				"cosmiconfig": {
 					"version": "7.0.1",
 					"resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz",
@@ -20311,35 +20777,13 @@
 						"yaml": "^1.10.0"
 					}
 				},
-				"json5": {
-					"version": "2.2.0",
-					"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
-					"integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
-					"dev": true,
-					"requires": {
-						"minimist": "^1.2.5"
-					}
-				},
-				"loader-utils": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-					"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-					"dev": true,
-					"requires": {
-						"big.js": "^5.2.2",
-						"emojis-list": "^3.0.0",
-						"json5": "^2.1.2"
-					}
-				},
-				"schema-utils": {
-					"version": "3.1.1",
-					"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
-					"integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
+				"semver": {
+					"version": "7.3.5",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+					"integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
 					"dev": true,
 					"requires": {
-						"@types/json-schema": "^7.0.8",
-						"ajv": "^6.12.5",
-						"ajv-keywords": "^3.5.2"
+						"lru-cache": "^6.0.0"
 					}
 				}
 			}
@@ -20468,9 +20912,9 @@
 			},
 			"dependencies": {
 				"postcss-value-parser": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
-					"integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
+					"version": "4.2.0",
+					"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+					"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
 					"dev": true
 				}
 			}
@@ -20765,9 +21209,9 @@
 			},
 			"dependencies": {
 				"ansi-regex": {
-					"version": "5.0.0",
-					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-					"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+					"version": "5.0.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+					"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 					"dev": true
 				},
 				"ansi-styles": {
@@ -20831,9 +21275,9 @@
 			"integrity": "sha1-zQTv9G9clcOn0EVZHXm14+AfEtc="
 		},
 		"prompts": {
-			"version": "2.4.1",
-			"resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.1.tgz",
-			"integrity": "sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ==",
+			"version": "2.4.2",
+			"resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+			"integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
 			"dev": true,
 			"requires": {
 				"kleur": "^3.0.3",
@@ -20841,13 +21285,13 @@
 			}
 		},
 		"prop-types": {
-			"version": "15.7.2",
-			"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.7.2.tgz",
-			"integrity": "sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==",
+			"version": "15.8.1",
+			"resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+			"integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
 			"requires": {
 				"loose-envify": "^1.4.0",
 				"object-assign": "^4.1.1",
-				"react-is": "^16.8.1"
+				"react-is": "^16.13.1"
 			}
 		},
 		"prop-types-exact": {
@@ -20959,27 +21403,108 @@
 		"punycode": {
 			"version": "2.1.1",
 			"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
-			"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+			"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+			"dev": true
 		},
-		"puppeteer-core": {
-			"version": "9.1.1",
-			"resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-9.1.1.tgz",
-			"integrity": "sha512-zbedbitVIGhmgz0nt7eIdLsnaoVZSlNJfBivqm2w67T8LR2bU1dvnruDZ8nQO0zn++Iet7zHbAOdnuS5+H2E7A==",
+		"puppeteer": {
+			"version": "5.5.0",
+			"resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-5.5.0.tgz",
+			"integrity": "sha512-OM8ZvTXAhfgFA7wBIIGlPQzvyEETzDjeRa4mZRCRHxYL+GNH5WAuYUQdja3rpWZvkX/JKqmuVgbsxDNsDFjMEg==",
 			"dev": true,
 			"requires": {
 				"debug": "^4.1.0",
-				"devtools-protocol": "0.0.869402",
+				"devtools-protocol": "0.0.818844",
 				"extract-zip": "^2.0.0",
-				"https-proxy-agent": "^5.0.0",
+				"https-proxy-agent": "^4.0.0",
 				"node-fetch": "^2.6.1",
 				"pkg-dir": "^4.2.0",
 				"progress": "^2.0.1",
-				"proxy-from-env": "^1.1.0",
+				"proxy-from-env": "^1.0.0",
 				"rimraf": "^3.0.2",
 				"tar-fs": "^2.0.0",
 				"unbzip2-stream": "^1.3.3",
 				"ws": "^7.2.3"
 			},
+			"dependencies": {
+				"devtools-protocol": {
+					"version": "0.0.818844",
+					"resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.818844.tgz",
+					"integrity": "sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg==",
+					"dev": true
+				},
+				"find-up": {
+					"version": "4.1.0",
+					"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+					"integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+					"dev": true,
+					"requires": {
+						"locate-path": "^5.0.0",
+						"path-exists": "^4.0.0"
+					}
+				},
+				"locate-path": {
+					"version": "5.0.0",
+					"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+					"integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+					"dev": true,
+					"requires": {
+						"p-locate": "^4.1.0"
+					}
+				},
+				"p-locate": {
+					"version": "4.1.0",
+					"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+					"integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+					"dev": true,
+					"requires": {
+						"p-limit": "^2.2.0"
+					}
+				},
+				"path-exists": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+					"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+					"dev": true
+				},
+				"pkg-dir": {
+					"version": "4.2.0",
+					"resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+					"integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+					"dev": true,
+					"requires": {
+						"find-up": "^4.0.0"
+					}
+				},
+				"rimraf": {
+					"version": "3.0.2",
+					"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+					"integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+					"dev": true,
+					"requires": {
+						"glob": "^7.1.3"
+					}
+				}
+			}
+		},
+		"puppeteer-core": {
+			"version": "10.4.0",
+			"resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-10.4.0.tgz",
+			"integrity": "sha512-KU8zyb7AIOqNjLCN3wkrFXxh+EVaG+zrs2P03ATNjc3iwSxHsu5/EvZiREpQ/IJiT9xfQbDVgKcsvRuzLCxglQ==",
+			"dev": true,
+			"requires": {
+				"debug": "4.3.1",
+				"devtools-protocol": "0.0.901419",
+				"extract-zip": "2.0.1",
+				"https-proxy-agent": "5.0.0",
+				"node-fetch": "2.6.1",
+				"pkg-dir": "4.2.0",
+				"progress": "2.0.1",
+				"proxy-from-env": "1.1.0",
+				"rimraf": "3.0.2",
+				"tar-fs": "2.0.0",
+				"unbzip2-stream": "1.3.3",
+				"ws": "7.4.6"
+			},
 			"dependencies": {
 				"agent-base": {
 					"version": "6.0.2",
@@ -20990,6 +21515,15 @@
 						"debug": "4"
 					}
 				},
+				"debug": {
+					"version": "4.3.1",
+					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
+					"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
+					"dev": true,
+					"requires": {
+						"ms": "2.1.2"
+					}
+				},
 				"find-up": {
 					"version": "4.1.0",
 					"resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
@@ -21019,6 +21553,18 @@
 						"p-locate": "^4.1.0"
 					}
 				},
+				"ms": {
+					"version": "2.1.2",
+					"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+					"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+					"dev": true
+				},
+				"node-fetch": {
+					"version": "2.6.1",
+					"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz",
+					"integrity": "sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw==",
+					"dev": true
+				},
 				"p-locate": {
 					"version": "4.1.0",
 					"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
@@ -21043,6 +21589,12 @@
 						"find-up": "^4.0.0"
 					}
 				},
+				"progress": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/progress/-/progress-2.0.1.tgz",
+					"integrity": "sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg==",
+					"dev": true
+				},
 				"rimraf": {
 					"version": "3.0.2",
 					"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
@@ -21051,6 +21603,28 @@
 					"requires": {
 						"glob": "^7.1.3"
 					}
+				},
+				"tar-fs": {
+					"version": "2.0.0",
+					"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.0.0.tgz",
+					"integrity": "sha512-vaY0obB6Om/fso8a8vakQBzwholQ7v5+uy+tF3Ozvxv1KNezmVQAiWtcNmMHFSFPqL3dJA8ha6gdtFbfX9mcxA==",
+					"dev": true,
+					"requires": {
+						"chownr": "^1.1.1",
+						"mkdirp": "^0.5.1",
+						"pump": "^3.0.0",
+						"tar-stream": "^2.0.0"
+					}
+				},
+				"unbzip2-stream": {
+					"version": "1.3.3",
+					"resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.3.3.tgz",
+					"integrity": "sha512-fUlAF7U9Ah1Q6EieQ4x4zLNejrRvDWUYmxXUpN3uziFYCHapjWFaCAnreY9bGgxzaMCFAPPpYNng57CypwJVhg==",
+					"dev": true,
+					"requires": {
+						"buffer": "^5.2.1",
+						"through": "^2.3.8"
+					}
 				}
 			}
 		},
@@ -21096,20 +21670,20 @@
 			"dev": true
 		},
 		"qunit": {
-			"version": "2.16.0",
-			"resolved": "https://registry.npmjs.org/qunit/-/qunit-2.16.0.tgz",
-			"integrity": "sha512-88x9t+rRMbB6IrCIUZvYU4pJy7NiBEv7SX8jD4LZAsIj+dV+kwGnFStOmPNvqa6HM96VZMD8CIIFKH2+3qvluA==",
+			"version": "2.17.2",
+			"resolved": "https://registry.npmjs.org/qunit/-/qunit-2.17.2.tgz",
+			"integrity": "sha512-17isVvuOmALzsPjiV7wFg/6O5vJYXBrQZPwocfQSSh0I/rXvfX7bKMFJ4GMVW3U4P8r2mBeUy8EAngti4QD2Vw==",
 			"dev": true,
 			"requires": {
-				"commander": "7.1.0",
-				"node-watch": "0.7.1",
-				"tiny-glob": "0.2.8"
+				"commander": "7.2.0",
+				"node-watch": "0.7.2",
+				"tiny-glob": "0.2.9"
 			},
 			"dependencies": {
 				"commander": {
-					"version": "7.1.0",
-					"resolved": "https://registry.npmjs.org/commander/-/commander-7.1.0.tgz",
-					"integrity": "sha512-pRxBna3MJe6HKnBGsDyMv8ETbptw3axEdYHoqNh7gu5oDcew8fs0xnivZGm06Ogk8zGAJ9VX+OPEr2GXEQK4dg==",
+					"version": "7.2.0",
+					"resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+					"integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
 					"dev": true
 				}
 			}
@@ -21196,12 +21770,6 @@
 				"strip-json-comments": "~2.0.1"
 			},
 			"dependencies": {
-				"deep-extend": {
-					"version": "0.6.0",
-					"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
-					"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
-					"dev": true
-				},
 				"strip-json-comments": {
 					"version": "2.0.1",
 					"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
@@ -21211,21 +21779,20 @@
 			}
 		},
 		"re-resizable": {
-			"version": "6.9.0",
-			"resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.0.tgz",
-			"integrity": "sha512-3cUDG81ylyqI0Pdgle/RHwwRYq0ORZzsUaySOCO8IbEtNyaRtrIHYm/jMQ5pjcNiKCxR3vsSymIQZHwJq4gg2Q==",
+			"version": "6.9.1",
+			"resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.1.tgz",
+			"integrity": "sha512-KRYAgr9/j1PJ3K+t+MBhlQ+qkkoLDJ1rs0z1heIWvYbCW/9Vq4djDU+QumJ3hQbwwtzXF6OInla6rOx6hhgRhQ==",
 			"requires": {
 				"fast-memoize": "^2.5.1"
 			}
 		},
 		"react": {
-			"version": "16.13.1",
-			"resolved": "https://registry.npmjs.org/react/-/react-16.13.1.tgz",
-			"integrity": "sha512-YMZQQq32xHLX0bz5Mnibv1/LHb3Sqzngu7xstSM+vrkE5Kzr9xE0yMByK5kMoTK30YVJE61WfbxIFFvfeDKT1w==",
+			"version": "17.0.1",
+			"resolved": "https://registry.npmjs.org/react/-/react-17.0.1.tgz",
+			"integrity": "sha512-lG9c9UuMHdcAexXtigOZLX8exLWkW0Ku29qPRU8uhF2R9BN96dLCt0psvzPLlHc5OWkgymP3qwTRgbnw5BKx3w==",
 			"requires": {
 				"loose-envify": "^1.1.0",
-				"object-assign": "^4.1.1",
-				"prop-types": "^15.6.2"
+				"object-assign": "^4.1.1"
 			}
 		},
 		"react-addons-shallow-compare": {
@@ -21246,6 +21813,11 @@
 				"prop-types": "^15.5.6"
 			}
 		},
+		"react-colorful": {
+			"version": "5.5.1",
+			"resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.5.1.tgz",
+			"integrity": "sha512-M1TJH2X3RXEt12sWkpa6hLc/bbYS0H6F4rIqjQZ+RxNBstpY67d9TrFXtqdZwhpmBXcCwEi7stKqFue3ZRkiOg=="
+		},
 		"react-dates": {
 			"version": "17.2.0",
 			"resolved": "https://registry.npmjs.org/react-dates/-/react-dates-17.2.0.tgz",
@@ -21267,20 +21839,19 @@
 			}
 		},
 		"react-dom": {
-			"version": "16.13.1",
-			"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.13.1.tgz",
-			"integrity": "sha512-81PIMmVLnCNLO/fFOQxdQkvEq/+Hfpv24XNJfpyZhTRfO0QcmQIF/PgCa1zCOj2w1hrn12MFLyaJ/G0+Mxtfag==",
+			"version": "17.0.1",
+			"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-17.0.1.tgz",
+			"integrity": "sha512-6eV150oJZ9U2t9svnsspTMrWNyHc6chX0KzDeAOXftRa8bNeOKTTfCJ7KorIwenkHd2xqVTBTCZd79yk/lx/Ug==",
 			"requires": {
 				"loose-envify": "^1.1.0",
 				"object-assign": "^4.1.1",
-				"prop-types": "^15.6.2",
-				"scheduler": "^0.19.1"
+				"scheduler": "^0.20.1"
 			}
 		},
 		"react-easy-crop": {
-			"version": "3.5.2",
-			"resolved": "https://registry.npmjs.org/react-easy-crop/-/react-easy-crop-3.5.2.tgz",
-			"integrity": "sha512-cwSGO/wk42XDpEyrdAcnQ6OJetVDZZO2ry1i19+kSGZQ750aN06RU9y9z95B5QI6sW3SnaWQRKv5r5GSqVV//g==",
+			"version": "3.5.3",
+			"resolved": "https://registry.npmjs.org/react-easy-crop/-/react-easy-crop-3.5.3.tgz",
+			"integrity": "sha512-ApTbh+lzKAvKqYW81ihd5J6ZTNN3vPDwi6ncFuUrHPI4bko2DlYOESkRm+0NYoW0H8YLaD7bxox+Z3EvIzAbUA==",
 			"requires": {
 				"normalize-wheel": "^1.0.1",
 				"tslib": "2.0.1"
@@ -21306,14 +21877,6 @@
 				"moment": ">=1.6.0"
 			}
 		},
-		"react-native-url-polyfill": {
-			"version": "1.3.0",
-			"resolved": "https://registry.npmjs.org/react-native-url-polyfill/-/react-native-url-polyfill-1.3.0.tgz",
-			"integrity": "sha512-w9JfSkvpqqlix9UjDvJjm1EjSt652zVQ6iwCIj1cVVkwXf4jQhQgTNXY6EVTwuAmUjg6BC6k9RHCBynoLFo3IQ==",
-			"requires": {
-				"whatwg-url-without-unicode": "8.0.0-3"
-			}
-		},
 		"react-outside-click-handler": {
 			"version": "1.3.0",
 			"resolved": "https://registry.npmjs.org/react-outside-click-handler/-/react-outside-click-handler-1.3.0.tgz",
@@ -21335,9 +21898,9 @@
 			}
 		},
 		"react-resize-aware": {
-			"version": "3.1.0",
-			"resolved": "https://registry.npmjs.org/react-resize-aware/-/react-resize-aware-3.1.0.tgz",
-			"integrity": "sha512-bIhHlxVTX7xKUz14ksXMEHjzCZPTpQZKZISY3nbTD273pDKPABGFNFBP6Tr42KECxzC5YQiKpMchjTVJCqaxpA=="
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/react-resize-aware/-/react-resize-aware-3.1.1.tgz",
+			"integrity": "sha512-M8IyVLBN8D6tEUss+bxQlWte3ZYtNEGhg7rBxtCVG8yEBjUlZwUo5EFLq6tnvTZXcgAbCLjsQn+NCoTJKumRYg=="
 		},
 		"react-shallow-renderer": {
 			"version": "16.14.1",
@@ -21349,15 +21912,6 @@
 				"react-is": "^16.12.0 || ^17.0.0"
 			}
 		},
-		"react-spring": {
-			"version": "8.0.27",
-			"resolved": "https://registry.npmjs.org/react-spring/-/react-spring-8.0.27.tgz",
-			"integrity": "sha512-nDpWBe3ZVezukNRandTeLSPcwwTMjNVu1IDq9qA/AMiUqHuRN4BeSWvKr3eIxxg1vtiYiOLy4FqdfCP5IoP77g==",
-			"requires": {
-				"@babel/runtime": "^7.3.1",
-				"prop-types": "^15.5.8"
-			}
-		},
 		"react-test-renderer": {
 			"version": "17.0.2",
 			"resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-17.0.2.tgz",
@@ -21375,16 +21929,6 @@
 					"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
 					"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
 					"dev": true
-				},
-				"scheduler": {
-					"version": "0.20.2",
-					"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
-					"integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
-					"dev": true,
-					"requires": {
-						"loose-envify": "^1.1.0",
-						"object-assign": "^4.1.1"
-					}
 				}
 			}
 		},
@@ -21394,18 +21938,120 @@
 			"integrity": "sha512-CdqA2SmS/fj3kkS2W8ZU8wjTbVBAIwDWaRprX7OKaj7HlGwBasGEFggmk5qNklknqk9zK/h8D355bEJFTpqEMg=="
 		},
 		"react-with-direction": {
-			"version": "1.3.1",
-			"resolved": "https://registry.npmjs.org/react-with-direction/-/react-with-direction-1.3.1.tgz",
-			"integrity": "sha512-aGcM21ZzhqeXFvDCfPj0rVNYuaVXfTz5D3Rbn0QMz/unZe+CCiLHthrjQWO7s6qdfXORgYFtmS7OVsRgSk5LXQ==",
+			"version": "1.4.0",
+			"resolved": "https://registry.npmjs.org/react-with-direction/-/react-with-direction-1.4.0.tgz",
+			"integrity": "sha512-ybHNPiAmaJpoWwugwqry9Hd1Irl2hnNXlo/2SXQBwbLn/jGMauMS2y9jw+ydyX5V9ICryCqObNSthNt5R94xpg==",
 			"requires": {
-				"airbnb-prop-types": "^2.10.0",
+				"airbnb-prop-types": "^2.16.0",
 				"brcast": "^2.0.2",
 				"deepmerge": "^1.5.2",
-				"direction": "^1.0.2",
-				"hoist-non-react-statics": "^3.3.0",
-				"object.assign": "^4.1.0",
-				"object.values": "^1.0.4",
-				"prop-types": "^15.6.2"
+				"direction": "^1.0.4",
+				"hoist-non-react-statics": "^3.3.2",
+				"object.assign": "^4.1.2",
+				"object.values": "^1.1.5",
+				"prop-types": "^15.7.2"
+			},
+			"dependencies": {
+				"call-bind": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+					"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+					"requires": {
+						"function-bind": "^1.1.1",
+						"get-intrinsic": "^1.0.2"
+					}
+				},
+				"es-abstract": {
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
+					"requires": {
+						"call-bind": "^1.0.2",
+						"es-to-primitive": "^1.2.1",
+						"function-bind": "^1.1.1",
+						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
+						"has": "^1.0.3",
+						"has-symbols": "^1.0.2",
+						"internal-slot": "^1.0.3",
+						"is-callable": "^1.2.4",
+						"is-negative-zero": "^2.0.1",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
+						"object-inspect": "^1.11.0",
+						"object-keys": "^1.1.1",
+						"object.assign": "^4.1.2",
+						"string.prototype.trimend": "^1.0.4",
+						"string.prototype.trimstart": "^1.0.4",
+						"unbox-primitive": "^1.0.1"
+					},
+					"dependencies": {
+						"get-intrinsic": {
+							"version": "1.1.1",
+							"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+							"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+							"requires": {
+								"function-bind": "^1.1.1",
+								"has": "^1.0.3",
+								"has-symbols": "^1.0.1"
+							}
+						}
+					}
+				},
+				"has-symbols": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+					"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw=="
+				},
+				"is-callable": {
+					"version": "1.2.4",
+					"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
+					"integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w=="
+				},
+				"is-regex": {
+					"version": "1.1.4",
+					"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+					"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+					"requires": {
+						"call-bind": "^1.0.2",
+						"has-tostringtag": "^1.0.0"
+					}
+				},
+				"object-inspect": {
+					"version": "1.12.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
+					"integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g=="
+				},
+				"object.values": {
+					"version": "1.1.5",
+					"resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
+					"integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
+					"requires": {
+						"call-bind": "^1.0.2",
+						"define-properties": "^1.1.3",
+						"es-abstract": "^1.19.1"
+					}
+				},
+				"string.prototype.trimend": {
+					"version": "1.0.4",
+					"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
+					"integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
+					"requires": {
+						"call-bind": "^1.0.2",
+						"define-properties": "^1.1.3"
+					}
+				},
+				"string.prototype.trimstart": {
+					"version": "1.0.4",
+					"resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
+					"integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
+					"requires": {
+						"call-bind": "^1.0.2",
+						"define-properties": "^1.1.3"
+					}
+				}
 			}
 		},
 		"react-with-styles": {
@@ -21429,51 +22075,21 @@
 			}
 		},
 		"read-pkg": {
-			"version": "3.0.0",
-			"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
-			"integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
+			"version": "5.2.0",
+			"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+			"integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
 			"dev": true,
 			"requires": {
-				"load-json-file": "^4.0.0",
-				"normalize-package-data": "^2.3.2",
-				"path-type": "^3.0.0"
+				"@types/normalize-package-data": "^2.4.0",
+				"normalize-package-data": "^2.5.0",
+				"parse-json": "^5.0.0",
+				"type-fest": "^0.6.0"
 			},
 			"dependencies": {
-				"load-json-file": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
-					"integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
-					"dev": true,
-					"requires": {
-						"graceful-fs": "^4.1.2",
-						"parse-json": "^4.0.0",
-						"pify": "^3.0.0",
-						"strip-bom": "^3.0.0"
-					}
-				},
-				"parse-json": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
-					"integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
-					"dev": true,
-					"requires": {
-						"error-ex": "^1.3.1",
-						"json-parse-better-errors": "^1.0.1"
-					}
-				},
-				"path-type": {
-					"version": "3.0.0",
-					"resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
-					"integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
-					"dev": true,
-					"requires": {
-						"pify": "^3.0.0"
-					}
-				},
-				"pify": {
-					"version": "3.0.0",
-					"resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
-					"integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
+				"type-fest": {
+					"version": "0.6.0",
+					"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+					"integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
 					"dev": true
 				}
 			}
@@ -21567,36 +22183,36 @@
 			}
 		},
 		"reakit": {
-			"version": "1.3.8",
-			"resolved": "https://registry.npmjs.org/reakit/-/reakit-1.3.8.tgz",
-			"integrity": "sha512-8SVejx6FUaFi2+Q9eXoDAd4wWi/xAn6v8JgXH8x2xnzye8pb6v5bYvegACVpYVZnrS5w/JUgMTGh1Xy8MkkPww==",
+			"version": "1.3.11",
+			"resolved": "https://registry.npmjs.org/reakit/-/reakit-1.3.11.tgz",
+			"integrity": "sha512-mYxw2z0fsJNOQKAEn5FJCPTU3rcrY33YZ/HzoWqZX0G7FwySp1wkCYW79WhuYMNIUFQ8s3Baob1RtsEywmZSig==",
 			"requires": {
 				"@popperjs/core": "^2.5.4",
 				"body-scroll-lock": "^3.1.5",
-				"reakit-system": "^0.15.1",
-				"reakit-utils": "^0.15.1",
-				"reakit-warning": "^0.6.1"
+				"reakit-system": "^0.15.2",
+				"reakit-utils": "^0.15.2",
+				"reakit-warning": "^0.6.2"
 			}
 		},
 		"reakit-system": {
-			"version": "0.15.1",
-			"resolved": "https://registry.npmjs.org/reakit-system/-/reakit-system-0.15.1.tgz",
-			"integrity": "sha512-PkqfAyEohtcEu/gUvKriCv42NywDtUgvocEN3147BI45dOFAB89nrT7wRIbIcKJiUT598F+JlPXAZZVLWhc1Kg==",
+			"version": "0.15.2",
+			"resolved": "https://registry.npmjs.org/reakit-system/-/reakit-system-0.15.2.tgz",
+			"integrity": "sha512-TvRthEz0DmD0rcJkGamMYx+bATwnGNWJpe/lc8UV2Js8nnPvkaxrHk5fX9cVASFrWbaIyegZHCWUBfxr30bmmA==",
 			"requires": {
-				"reakit-utils": "^0.15.1"
+				"reakit-utils": "^0.15.2"
 			}
 		},
 		"reakit-utils": {
-			"version": "0.15.1",
-			"resolved": "https://registry.npmjs.org/reakit-utils/-/reakit-utils-0.15.1.tgz",
-			"integrity": "sha512-6cZgKGvOkAMQgkwU9jdYbHfkuIN1Pr+vwcB19plLvcTfVN0Or10JhIuj9X+JaPZyI7ydqTDFaKNdUcDP69o/+Q=="
+			"version": "0.15.2",
+			"resolved": "https://registry.npmjs.org/reakit-utils/-/reakit-utils-0.15.2.tgz",
+			"integrity": "sha512-i/RYkq+W6hvfFmXw5QW7zvfJJT/K8a4qZ0hjA79T61JAFPGt23DsfxwyBbyK91GZrJ9HMrXFVXWMovsKBc1qEQ=="
 		},
 		"reakit-warning": {
-			"version": "0.6.1",
-			"resolved": "https://registry.npmjs.org/reakit-warning/-/reakit-warning-0.6.1.tgz",
-			"integrity": "sha512-poFUV0EyxB+CcV9uTNBAFmcgsnR2DzAbOTkld4Ul+QOKSeEHZB3b3+MoZQgcYHmbvG19Na1uWaM7ES+/Eyr8tQ==",
+			"version": "0.6.2",
+			"resolved": "https://registry.npmjs.org/reakit-warning/-/reakit-warning-0.6.2.tgz",
+			"integrity": "sha512-z/3fvuc46DJyD3nJAUOto6inz2EbSQTjvI/KBQDqxwB0y02HDyeP8IWOJxvkuAUGkWpeSx+H3QWQFSNiPcHtmw==",
 			"requires": {
-				"reakit-utils": "^0.15.1"
+				"reakit-utils": "^0.15.2"
 			}
 		},
 		"rechoir": {
@@ -21620,9 +22236,9 @@
 			}
 		},
 		"redux": {
-			"version": "4.1.1",
-			"resolved": "https://registry.npmjs.org/redux/-/redux-4.1.1.tgz",
-			"integrity": "sha512-hZQZdDEM25UY2P493kPYuKqviVwZ58lEmGQNeQ+gXa+U0gYPUBf7NKYazbe3m+bs/DzM/ahN12DbF+NG8i0CWw==",
+			"version": "4.1.2",
+			"resolved": "https://registry.npmjs.org/redux/-/redux-4.1.2.tgz",
+			"integrity": "sha512-SH8PglcebESbd/shgf6mii6EIoRM0zrQyjcuQ+ojmfxjTtE0z9Y8pa62iA/OJ58qjP6j27uyW4kUF4jl/jd6sw==",
 			"requires": {
 				"@babel/runtime": "^7.9.2"
 			}
@@ -21644,18 +22260,18 @@
 			"dev": true
 		},
 		"regenerate-unicode-properties": {
-			"version": "8.2.0",
-			"resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
-			"integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
+			"version": "9.0.0",
+			"resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz",
+			"integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==",
 			"dev": true,
 			"requires": {
-				"regenerate": "^1.4.0"
+				"regenerate": "^1.4.2"
 			}
 		},
 		"regenerator-runtime": {
-			"version": "0.13.7",
-			"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
-			"integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew=="
+			"version": "0.13.9",
+			"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
+			"integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA=="
 		},
 		"regenerator-transform": {
 			"version": "0.14.5",
@@ -21693,23 +22309,23 @@
 			"dev": true
 		},
 		"regexpu-core": {
-			"version": "4.7.1",
-			"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz",
-			"integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==",
+			"version": "4.8.0",
+			"resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz",
+			"integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==",
 			"dev": true,
 			"requires": {
-				"regenerate": "^1.4.0",
-				"regenerate-unicode-properties": "^8.2.0",
-				"regjsgen": "^0.5.1",
-				"regjsparser": "^0.6.4",
-				"unicode-match-property-ecmascript": "^1.0.4",
-				"unicode-match-property-value-ecmascript": "^1.2.0"
+				"regenerate": "^1.4.2",
+				"regenerate-unicode-properties": "^9.0.0",
+				"regjsgen": "^0.5.2",
+				"regjsparser": "^0.7.0",
+				"unicode-match-property-ecmascript": "^2.0.0",
+				"unicode-match-property-value-ecmascript": "^2.0.0"
 			}
 		},
 		"regextras": {
-			"version": "0.7.1",
-			"resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz",
-			"integrity": "sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==",
+			"version": "0.8.0",
+			"resolved": "https://registry.npmjs.org/regextras/-/regextras-0.8.0.tgz",
+			"integrity": "sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==",
 			"dev": true
 		},
 		"regjsgen": {
@@ -21719,9 +22335,9 @@
 			"dev": true
 		},
 		"regjsparser": {
-			"version": "0.6.9",
-			"resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz",
-			"integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==",
+			"version": "0.7.0",
+			"resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz",
+			"integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==",
 			"dev": true,
 			"requires": {
 				"jsesc": "~0.5.0"
@@ -21744,97 +22360,15 @@
 				"remark-parse": "^9.0.0",
 				"remark-stringify": "^9.0.0",
 				"unified": "^9.1.0"
-			},
-			"dependencies": {
-				"is-buffer": {
-					"version": "2.0.5",
-					"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
-					"integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
-					"dev": true
-				},
-				"is-plain-obj": {
-					"version": "2.1.0",
-					"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
-					"integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
-					"dev": true
-				},
-				"remark-parse": {
-					"version": "9.0.0",
-					"resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
-					"integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
-					"dev": true,
-					"requires": {
-						"mdast-util-from-markdown": "^0.8.0"
-					}
-				},
-				"unified": {
-					"version": "9.2.2",
-					"resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz",
-					"integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==",
-					"dev": true,
-					"requires": {
-						"bail": "^1.0.0",
-						"extend": "^3.0.0",
-						"is-buffer": "^2.0.0",
-						"is-plain-obj": "^2.0.0",
-						"trough": "^1.0.0",
-						"vfile": "^4.0.0"
-					}
-				},
-				"unist-util-stringify-position": {
-					"version": "2.0.3",
-					"resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
-					"integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
-					"dev": true,
-					"requires": {
-						"@types/unist": "^2.0.2"
-					}
-				},
-				"vfile": {
-					"version": "4.2.1",
-					"resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
-					"integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
-					"dev": true,
-					"requires": {
-						"@types/unist": "^2.0.0",
-						"is-buffer": "^2.0.0",
-						"unist-util-stringify-position": "^2.0.0",
-						"vfile-message": "^2.0.0"
-					}
-				},
-				"vfile-message": {
-					"version": "2.0.4",
-					"resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
-					"integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
-					"dev": true,
-					"requires": {
-						"@types/unist": "^2.0.0",
-						"unist-util-stringify-position": "^2.0.0"
-					}
-				}
 			}
 		},
 		"remark-parse": {
-			"version": "5.0.0",
-			"resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-5.0.0.tgz",
-			"integrity": "sha512-b3iXszZLH1TLoyUzrATcTQUZrwNl1rE70rVdSruJFlDaJ9z5aMkhrG43Pp68OgfHndL/ADz6V69Zow8cTQu+JA==",
+			"version": "9.0.0",
+			"resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-9.0.0.tgz",
+			"integrity": "sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==",
 			"dev": true,
 			"requires": {
-				"collapse-white-space": "^1.0.2",
-				"is-alphabetical": "^1.0.0",
-				"is-decimal": "^1.0.0",
-				"is-whitespace-character": "^1.0.0",
-				"is-word-character": "^1.0.0",
-				"markdown-escapes": "^1.0.0",
-				"parse-entities": "^1.1.0",
-				"repeat-string": "^1.5.4",
-				"state-toggle": "^1.0.0",
-				"trim": "0.0.1",
-				"trim-trailing-lines": "^1.0.0",
-				"unherit": "^1.0.4",
-				"unist-util-remove-position": "^1.0.0",
-				"vfile-location": "^2.0.0",
-				"xtend": "^4.0.1"
+				"mdast-util-from-markdown": "^0.8.0"
 			}
 		},
 		"remark-stringify": {
@@ -21982,9 +22516,9 @@
 			}
 		},
 		"resolve-bin": {
-			"version": "0.4.1",
-			"resolved": "https://registry.npmjs.org/resolve-bin/-/resolve-bin-0.4.1.tgz",
-			"integrity": "sha512-cPOo/AQjgGONYhFbAcJd1+nuVHKs5NZ8K96Zb6mW+nDl55a7+ya9MWkeYuSMDv/S+YpksZ3EbeAnGWs5x04x8w==",
+			"version": "0.4.3",
+			"resolved": "https://registry.npmjs.org/resolve-bin/-/resolve-bin-0.4.3.tgz",
+			"integrity": "sha512-9u8TMpc+SEHXxQXblXHz5yRvRZERkCZimFN9oz85QI3uhkh7nqfjm6OGTLg+8vucpXGcY4jLK6WkylPmt7GSvw==",
 			"dev": true,
 			"requires": {
 				"find-parent-dir": "~0.3.0"
@@ -22218,12 +22752,6 @@
 			"resolved": "https://registry.npmjs.org/rungen/-/rungen-0.3.2.tgz",
 			"integrity": "sha1-QAwJ6+kU57F+C27zJjQA/Cq8fLM="
 		},
-		"rx": {
-			"version": "4.1.0",
-			"resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz",
-			"integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=",
-			"dev": true
-		},
 		"rxjs": {
 			"version": "5.5.12",
 			"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.12.tgz",
@@ -22390,64 +22918,22 @@
 			}
 		},
 		"sass": {
-			"version": "1.34.1",
-			"resolved": "https://registry.npmjs.org/sass/-/sass-1.34.1.tgz",
-			"integrity": "sha512-scLA7EIZM+MmYlej6sdVr0HRbZX5caX5ofDT9asWnUJj21oqgsC+1LuNfm0eg+vM0fCTZHhwImTiCU0sx9h9CQ==",
+			"version": "1.43.4",
+			"resolved": "https://registry.npmjs.org/sass/-/sass-1.43.4.tgz",
+			"integrity": "sha512-/ptG7KE9lxpGSYiXn7Ar+lKOv37xfWsZRtFYal2QHNigyVQDx685VFT/h7ejVr+R8w7H4tmUgtulsKl5YpveOg==",
 			"dev": true,
 			"requires": {
 				"chokidar": ">=3.0.0 <4.0.0"
 			}
 		},
 		"sass-loader": {
-			"version": "10.2.0",
-			"resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.2.0.tgz",
-			"integrity": "sha512-kUceLzC1gIHz0zNJPpqRsJyisWatGYNFRmv2CKZK2/ngMJgLqxTbXwe/hJ85luyvZkgqU3VlJ33UVF2T/0g6mw==",
+			"version": "12.4.0",
+			"resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz",
+			"integrity": "sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg==",
 			"dev": true,
 			"requires": {
 				"klona": "^2.0.4",
-				"loader-utils": "^2.0.0",
-				"neo-async": "^2.6.2",
-				"schema-utils": "^3.0.0",
-				"semver": "^7.3.2"
-			},
-			"dependencies": {
-				"@types/json-schema": {
-					"version": "7.0.9",
-					"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
-					"integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
-					"dev": true
-				},
-				"json5": {
-					"version": "2.2.0",
-					"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
-					"integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
-					"dev": true,
-					"requires": {
-						"minimist": "^1.2.5"
-					}
-				},
-				"loader-utils": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-					"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-					"dev": true,
-					"requires": {
-						"big.js": "^5.2.2",
-						"emojis-list": "^3.0.0",
-						"json5": "^2.1.2"
-					}
-				},
-				"schema-utils": {
-					"version": "3.1.1",
-					"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
-					"integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
-					"dev": true,
-					"requires": {
-						"@types/json-schema": "^7.0.8",
-						"ajv": "^6.12.5",
-						"ajv-keywords": "^3.5.2"
-					}
-				}
+				"neo-async": "^2.6.2"
 			}
 		},
 		"sax": {
@@ -22466,9 +22952,9 @@
 			}
 		},
 		"scheduler": {
-			"version": "0.19.1",
-			"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.19.1.tgz",
-			"integrity": "sha512-n/zwRWRYSUj0/3g/otKDRPMh6qv2SYMWNq85IEa8iZyAv8od9zDYpGSnpBEjNgcMNq6Scbu5KfIPxNF72R/2EA==",
+			"version": "0.20.2",
+			"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.20.2.tgz",
+			"integrity": "sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==",
 			"requires": {
 				"loose-envify": "^1.1.0",
 				"object-assign": "^4.1.1"
@@ -22688,6 +23174,11 @@
 			"resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
 			"integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc="
 		},
+		"set-immediate-shim": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz",
+			"integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E="
+		},
 		"set-value": {
 			"version": "2.0.1",
 			"resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
@@ -22836,13 +23327,13 @@
 			}
 		},
 		"sinon": {
-			"version": "11.1.1",
-			"resolved": "https://registry.npmjs.org/sinon/-/sinon-11.1.1.tgz",
-			"integrity": "sha512-ZSSmlkSyhUWbkF01Z9tEbxZLF/5tRC9eojCdFh33gtQaP7ITQVaMWQHGuFM7Cuf/KEfihuh1tTl3/ABju3AQMg==",
+			"version": "12.0.1",
+			"resolved": "https://registry.npmjs.org/sinon/-/sinon-12.0.1.tgz",
+			"integrity": "sha512-iGu29Xhym33ydkAT+aNQFBINakjq69kKO6ByPvTsm3yyIACfyQttRTP03aBP/I8GfhFmLzrnKwNNkr0ORb1udg==",
 			"dev": true,
 			"requires": {
 				"@sinonjs/commons": "^1.8.3",
-				"@sinonjs/fake-timers": "^7.1.0",
+				"@sinonjs/fake-timers": "^8.1.0",
 				"@sinonjs/samsam": "^6.0.2",
 				"diff": "^5.0.0",
 				"nise": "^5.1.0",
@@ -22859,9 +23350,9 @@
 					}
 				},
 				"@sinonjs/fake-timers": {
-					"version": "7.1.1",
-					"resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-7.1.1.tgz",
-					"integrity": "sha512-am34LJf0N2nON/PT9G7pauA+xjcwX9P6x31m4hBgfUeSXYRZBRv/R6EcdWs8iV4XJjPO++NTsrj7ua/cN2s6ZA==",
+					"version": "8.1.0",
+					"resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz",
+					"integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==",
 					"dev": true,
 					"requires": {
 						"@sinonjs/commons": "^1.7.0"
@@ -22891,19 +23382,19 @@
 			}
 		},
 		"sinon-test": {
-			"version": "3.1.0",
-			"resolved": "https://registry.npmjs.org/sinon-test/-/sinon-test-3.1.0.tgz",
-			"integrity": "sha512-aGQwq6Xl9eJg/8Ugv4Ko4LQWUqjwRYNI8UtxnKa9hmcMEz3HBTR3nnzYrbW4isuRLsJWFuJTUcPGuz7f4XvODg==",
+			"version": "3.1.1",
+			"resolved": "https://registry.npmjs.org/sinon-test/-/sinon-test-3.1.1.tgz",
+			"integrity": "sha512-1sM7QhfTGHXU8umSSyDyIQuAwPkUX2I0JK5WFcjzhChNxDYlVw5Vj0fGoJAaS/FvywKmN2U4YgGC/XqDKhYOTA==",
 			"dev": true
 		},
 		"sirv": {
-			"version": "1.0.17",
-			"resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.17.tgz",
-			"integrity": "sha512-qx9go5yraB7ekT7bCMqUHJ5jEaOC/GXBxUWv+jeWnb7WzHUFdcQPGWk7YmAwFBaQBrogpuSqd/azbC2lZRqqmw==",
+			"version": "1.0.19",
+			"resolved": "https://registry.npmjs.org/sirv/-/sirv-1.0.19.tgz",
+			"integrity": "sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==",
 			"dev": true,
 			"requires": {
 				"@polka/url": "^1.0.0-next.20",
-				"mime": "^2.3.1",
+				"mrmime": "^1.0.0",
 				"totalist": "^1.0.0"
 			}
 		},
@@ -23234,9 +23725,9 @@
 			"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
 		},
 		"source-map-js": {
-			"version": "0.6.2",
-			"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz",
-			"integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==",
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz",
+			"integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==",
 			"dev": true
 		},
 		"source-map-loader": {
@@ -23330,15 +23821,15 @@
 			"dev": true
 		},
 		"spawnd": {
-			"version": "4.4.0",
-			"resolved": "https://registry.npmjs.org/spawnd/-/spawnd-4.4.0.tgz",
-			"integrity": "sha512-jLPOfB6QOEgMOQY15Z6+lwZEhH3F5ncXxIaZ7WHPIapwNNLyjrs61okj3VJ3K6tmP5TZ6cO0VAu9rEY4MD4YQg==",
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/spawnd/-/spawnd-5.0.0.tgz",
+			"integrity": "sha512-28+AJr82moMVWolQvlAIv3JcYDkjkFTEmfDc503wxrF5l2rQ3dFz6DpbXp3kD4zmgGGldfM4xM4v1sFj/ZaIOA==",
 			"dev": true,
 			"requires": {
 				"exit": "^0.1.2",
-				"signal-exit": "^3.0.2",
+				"signal-exit": "^3.0.3",
 				"tree-kill": "^1.2.2",
-				"wait-port": "^0.2.7"
+				"wait-port": "^0.2.9"
 			}
 		},
 		"spdx-correct": {
@@ -23540,9 +24031,9 @@
 			"dev": true
 		},
 		"stack-utils": {
-			"version": "2.0.3",
-			"resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz",
-			"integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==",
+			"version": "2.0.5",
+			"resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.5.tgz",
+			"integrity": "sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==",
 			"dev": true,
 			"requires": {
 				"escape-string-regexp": "^2.0.0"
@@ -23556,12 +24047,6 @@
 				}
 			}
 		},
-		"state-toggle": {
-			"version": "1.0.3",
-			"resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz",
-			"integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==",
-			"dev": true
-		},
 		"static-extend": {
 			"version": "0.1.2",
 			"resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
@@ -23680,18 +24165,18 @@
 			},
 			"dependencies": {
 				"ansi-regex": {
-					"version": "5.0.0",
-					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-					"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+					"version": "5.0.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+					"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 					"dev": true
 				},
 				"strip-ansi": {
-					"version": "6.0.0",
-					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-					"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+					"version": "6.0.1",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+					"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 					"dev": true,
 					"requires": {
-						"ansi-regex": "^5.0.0"
+						"ansi-regex": "^5.0.1"
 					}
 				}
 			}
@@ -23713,14 +24198,14 @@
 			}
 		},
 		"string.prototype.matchall": {
-			"version": "4.0.5",
-			"resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz",
-			"integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==",
+			"version": "4.0.6",
+			"resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz",
+			"integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==",
 			"dev": true,
 			"requires": {
 				"call-bind": "^1.0.2",
 				"define-properties": "^1.1.3",
-				"es-abstract": "^1.18.2",
+				"es-abstract": "^1.19.1",
 				"get-intrinsic": "^1.1.1",
 				"has-symbols": "^1.0.2",
 				"internal-slot": "^1.0.3",
@@ -23739,22 +24224,25 @@
 					}
 				},
 				"es-abstract": {
-					"version": "1.18.5",
-					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz",
-					"integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==",
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
 					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
 						"es-to-primitive": "^1.2.1",
 						"function-bind": "^1.1.1",
 						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
 						"has": "^1.0.3",
 						"has-symbols": "^1.0.2",
 						"internal-slot": "^1.0.3",
-						"is-callable": "^1.2.3",
+						"is-callable": "^1.2.4",
 						"is-negative-zero": "^2.0.1",
-						"is-regex": "^1.1.3",
-						"is-string": "^1.0.6",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
 						"object-inspect": "^1.11.0",
 						"object-keys": "^1.1.1",
 						"object.assign": "^4.1.2",
@@ -23797,15 +24285,15 @@
 					}
 				},
 				"object-inspect": {
-					"version": "1.11.0",
-					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
-					"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
+					"version": "1.12.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
+					"integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
 					"dev": true
 				},
 				"regexp.prototype.flags": {
-					"version": "1.3.1",
-					"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz",
-					"integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==",
+					"version": "1.4.1",
+					"resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.1.tgz",
+					"integrity": "sha512-pMR7hBVUUGI7PMA37m2ofIdQCsomVnas+Jn5UPGAHQ+/LlwKm/aTLJHdasmHRzlfeZwHiAOaRSo2rbBDm3nNUQ==",
 					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
@@ -23835,14 +24323,14 @@
 			}
 		},
 		"string.prototype.trim": {
-			"version": "1.2.4",
-			"resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.4.tgz",
-			"integrity": "sha512-hWCk/iqf7lp0/AgTF7/ddO1IWtSNPASjlzCicV5irAVdE1grjsneK26YG6xACMBEdCvO8fUST0UzDMh/2Qy+9Q==",
+			"version": "1.2.5",
+			"resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.5.tgz",
+			"integrity": "sha512-Lnh17webJVsD6ECeovpVN17RlAKjmz4rF9S+8Y45CkMc/ufVpTkU3vZIyIC7sllQ1FCvObZnnCdNs/HXTUOTlg==",
 			"dev": true,
 			"requires": {
 				"call-bind": "^1.0.2",
 				"define-properties": "^1.1.3",
-				"es-abstract": "^1.18.0-next.2"
+				"es-abstract": "^1.19.1"
 			},
 			"dependencies": {
 				"call-bind": {
@@ -23856,22 +24344,25 @@
 					}
 				},
 				"es-abstract": {
-					"version": "1.18.5",
-					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.5.tgz",
-					"integrity": "sha512-DDggyJLoS91CkJjgauM5c0yZMjiD1uK3KcaCeAmffGwZ+ODWzOkPN4QwRbsK5DOFf06fywmyLci3ZD8jLGhVYA==",
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
 					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
 						"es-to-primitive": "^1.2.1",
 						"function-bind": "^1.1.1",
 						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
 						"has": "^1.0.3",
 						"has-symbols": "^1.0.2",
 						"internal-slot": "^1.0.3",
-						"is-callable": "^1.2.3",
+						"is-callable": "^1.2.4",
 						"is-negative-zero": "^2.0.1",
-						"is-regex": "^1.1.3",
-						"is-string": "^1.0.6",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
 						"object-inspect": "^1.11.0",
 						"object-keys": "^1.1.1",
 						"object.assign": "^4.1.2",
@@ -23916,9 +24407,9 @@
 					}
 				},
 				"object-inspect": {
-					"version": "1.11.0",
-					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
-					"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
+					"version": "1.12.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz",
+					"integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==",
 					"dev": true
 				},
 				"string.prototype.trimend": {
@@ -24046,6 +24537,13 @@
 				"escape-string-regexp": "^1.0.2"
 			}
 		},
+		"strnum": {
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.4.tgz",
+			"integrity": "sha512-lMzNMfDpaQOLt4B2mEbfzYS0+T7dvCXeojnlGf6f1AygvWDMcWyXYaLbyICfjVu29sErR8fnRagQfBW/N/hGgw==",
+			"dev": true,
+			"optional": true
+		},
 		"style-search": {
 			"version": "0.1.0",
 			"resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
@@ -24059,13 +24557,6 @@
 			"requires": {
 				"hey-listen": "^1.0.8",
 				"tslib": "^2.1.0"
-			},
-			"dependencies": {
-				"tslib": {
-					"version": "2.3.1",
-					"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
-					"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
-				}
 			}
 		},
 		"stylehacks": {
@@ -24149,9 +24640,9 @@
 			},
 			"dependencies": {
 				"ansi-regex": {
-					"version": "5.0.0",
-					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-					"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+					"version": "5.0.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+					"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 					"dev": true
 				},
 				"array-union": {
@@ -24200,9 +24691,9 @@
 					}
 				},
 				"debug": {
-					"version": "4.3.2",
-					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
-					"integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+					"version": "4.3.3",
+					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz",
+					"integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==",
 					"dev": true,
 					"requires": {
 						"ms": "2.1.2"
@@ -24260,23 +24751,23 @@
 					}
 				},
 				"globby": {
-					"version": "11.0.4",
-					"resolved": "https://registry.npmjs.org/globby/-/globby-11.0.4.tgz",
-					"integrity": "sha512-9O4MVG9ioZJ08ffbcyVYyLOJLk5JQ688pJ4eMGLpdWLHq/Wr1D9BlriLQyL0E+jbkuePVZXYFj47QM/v093wHg==",
+					"version": "11.1.0",
+					"resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+					"integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
 					"dev": true,
 					"requires": {
 						"array-union": "^2.1.0",
 						"dir-glob": "^3.0.1",
-						"fast-glob": "^3.1.1",
-						"ignore": "^5.1.4",
-						"merge2": "^1.3.0",
+						"fast-glob": "^3.2.9",
+						"ignore": "^5.2.0",
+						"merge2": "^1.4.1",
 						"slash": "^3.0.0"
 					}
 				},
 				"hosted-git-info": {
-					"version": "4.0.2",
-					"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz",
-					"integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==",
+					"version": "4.1.0",
+					"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+					"integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
 					"dev": true,
 					"requires": {
 						"lru-cache": "^6.0.0"
@@ -24289,9 +24780,9 @@
 					"dev": true
 				},
 				"is-core-module": {
-					"version": "2.6.0",
-					"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz",
-					"integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==",
+					"version": "2.8.1",
+					"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
+					"integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
 					"dev": true,
 					"requires": {
 						"has": "^1.0.3"
@@ -24325,9 +24816,9 @@
 					}
 				},
 				"map-obj": {
-					"version": "4.2.1",
-					"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.2.1.tgz",
-					"integrity": "sha512-+WA2/1sPmDj1dlvvJmB5G6JKfY9dpn7EVBUL06+y6PoljPkh+6V1QihwxNkbcGxCRjt2b0F9K0taiCuo7MbdFQ==",
+					"version": "4.3.0",
+					"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
+					"integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
 					"dev": true
 				},
 				"meow": {
@@ -24394,15 +24885,15 @@
 					"dev": true
 				},
 				"picomatch": {
-					"version": "2.3.0",
-					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
-					"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+					"version": "2.3.1",
+					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+					"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
 					"dev": true
 				},
 				"postcss-selector-parser": {
-					"version": "6.0.6",
-					"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz",
-					"integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==",
+					"version": "6.0.8",
+					"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz",
+					"integrity": "sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ==",
 					"dev": true,
 					"requires": {
 						"cssesc": "^3.0.0",
@@ -24410,55 +24901,11 @@
 					}
 				},
 				"postcss-value-parser": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
-					"integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
+					"version": "4.2.0",
+					"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+					"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
 					"dev": true
 				},
-				"read-pkg": {
-					"version": "5.2.0",
-					"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
-					"integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
-					"dev": true,
-					"requires": {
-						"@types/normalize-package-data": "^2.4.0",
-						"normalize-package-data": "^2.5.0",
-						"parse-json": "^5.0.0",
-						"type-fest": "^0.6.0"
-					},
-					"dependencies": {
-						"hosted-git-info": {
-							"version": "2.8.9",
-							"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
-							"integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
-							"dev": true
-						},
-						"normalize-package-data": {
-							"version": "2.5.0",
-							"resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
-							"integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
-							"dev": true,
-							"requires": {
-								"hosted-git-info": "^2.1.4",
-								"resolve": "^1.10.0",
-								"semver": "2 || 3 || 4 || 5",
-								"validate-npm-package-license": "^3.0.1"
-							}
-						},
-						"semver": {
-							"version": "5.7.1",
-							"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-							"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
-							"dev": true
-						},
-						"type-fest": {
-							"version": "0.6.0",
-							"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
-							"integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
-							"dev": true
-						}
-					}
-				},
 				"read-pkg-up": {
 					"version": "7.0.1",
 					"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
@@ -24495,23 +24942,23 @@
 					"dev": true
 				},
 				"string-width": {
-					"version": "4.2.2",
-					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
-					"integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+					"version": "4.2.3",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+					"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 					"dev": true,
 					"requires": {
 						"emoji-regex": "^8.0.0",
 						"is-fullwidth-code-point": "^3.0.0",
-						"strip-ansi": "^6.0.0"
+						"strip-ansi": "^6.0.1"
 					}
 				},
 				"strip-ansi": {
-					"version": "6.0.0",
-					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-					"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+					"version": "6.0.1",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+					"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 					"dev": true,
 					"requires": {
-						"ansi-regex": "^5.0.0"
+						"ansi-regex": "^5.0.1"
 					}
 				},
 				"strip-indent": {
@@ -24585,9 +25032,9 @@
 			}
 		},
 		"stylelint-scss": {
-			"version": "3.20.1",
-			"resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.20.1.tgz",
-			"integrity": "sha512-OTd55O1TTAC5nGKkVmUDLpz53LlK39R3MImv1CfuvsK7/qugktqiZAeQLuuC4UBhzxCnsc7fp9u/gfRZwFAIkA==",
+			"version": "3.21.0",
+			"resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.21.0.tgz",
+			"integrity": "sha512-CMI2wSHL+XVlNExpauy/+DbUcB/oUZLARDtMIXkpV/5yd8nthzylYd1cdHeDMJVBXeYHldsnebUX6MoV5zPW4A==",
 			"dev": true,
 			"requires": {
 				"lodash": "^4.17.15",
@@ -24598,13 +25045,18 @@
 			},
 			"dependencies": {
 				"postcss-value-parser": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz",
-					"integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==",
+					"version": "4.2.0",
+					"resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+					"integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
 					"dev": true
 				}
 			}
 		},
+		"stylis": {
+			"version": "4.0.13",
+			"resolved": "https://registry.npmjs.org/stylis/-/stylis-4.0.13.tgz",
+			"integrity": "sha512-xGPXiFVl4YED9Jh7Euv2V220mriG9u4B2TA6Ybjc1catrstKD2PpIdU3U0RKpkVBC2EhmL/F0sPCr9vrFTNRag=="
+		},
 		"sugarss": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz",
@@ -24649,6 +25101,12 @@
 				}
 			}
 		},
+		"supports-preserve-symlinks-flag": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+			"integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+			"dev": true
+		},
 		"svg-parser": {
 			"version": "2.0.4",
 			"resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
@@ -24702,23 +25160,22 @@
 			"dev": true
 		},
 		"table": {
-			"version": "6.7.1",
-			"resolved": "https://registry.npmjs.org/table/-/table-6.7.1.tgz",
-			"integrity": "sha512-ZGum47Yi6KOOFDE8m223td53ath2enHcYLgOCjGr5ngu8bdIARQk6mN/wRMv4yMRcHnCSnHbCEha4sobQx5yWg==",
+			"version": "6.8.0",
+			"resolved": "https://registry.npmjs.org/table/-/table-6.8.0.tgz",
+			"integrity": "sha512-s/fitrbVeEyHKFa7mFdkuQMWlH1Wgw/yEXMt5xACT4ZpzWFluehAxRtUUQKPuWhaLAWhFcVx6w3oC8VKaUfPGA==",
 			"dev": true,
 			"requires": {
 				"ajv": "^8.0.1",
-				"lodash.clonedeep": "^4.5.0",
 				"lodash.truncate": "^4.4.2",
 				"slice-ansi": "^4.0.0",
-				"string-width": "^4.2.0",
-				"strip-ansi": "^6.0.0"
+				"string-width": "^4.2.3",
+				"strip-ansi": "^6.0.1"
 			},
 			"dependencies": {
 				"ajv": {
-					"version": "8.6.2",
-					"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.6.2.tgz",
-					"integrity": "sha512-9807RlWAgT564wT+DjeyU5OFMPjmzxVobvDFmNAhY+5zD6A2ly3jDp6sgnfyDtlIQ+7H97oc/DGCzzfu9rjw9w==",
+					"version": "8.9.0",
+					"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz",
+					"integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==",
 					"dev": true,
 					"requires": {
 						"fast-deep-equal": "^3.1.1",
@@ -24728,9 +25185,9 @@
 					}
 				},
 				"ansi-regex": {
-					"version": "5.0.0",
-					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-					"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+					"version": "5.0.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+					"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 					"dev": true
 				},
 				"emoji-regex": {
@@ -24752,23 +25209,23 @@
 					"dev": true
 				},
 				"string-width": {
-					"version": "4.2.2",
-					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
-					"integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+					"version": "4.2.3",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+					"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 					"dev": true,
 					"requires": {
 						"emoji-regex": "^8.0.0",
 						"is-fullwidth-code-point": "^3.0.0",
-						"strip-ansi": "^6.0.0"
+						"strip-ansi": "^6.0.1"
 					}
 				},
 				"strip-ansi": {
-					"version": "6.0.0",
-					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-					"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+					"version": "6.0.1",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+					"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 					"dev": true,
 					"requires": {
-						"ansi-regex": "^5.0.0"
+						"ansi-regex": "^5.0.1"
 					}
 				}
 			}
@@ -24793,34 +25250,6 @@
 			"integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==",
 			"dev": true
 		},
-		"tar": {
-			"version": "6.1.11",
-			"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
-			"integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
-			"dev": true,
-			"requires": {
-				"chownr": "^2.0.0",
-				"fs-minipass": "^2.0.0",
-				"minipass": "^3.0.0",
-				"minizlib": "^2.1.1",
-				"mkdirp": "^1.0.3",
-				"yallist": "^4.0.0"
-			},
-			"dependencies": {
-				"chownr": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
-					"integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
-					"dev": true
-				},
-				"mkdirp": {
-					"version": "1.0.4",
-					"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-					"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-					"dev": true
-				}
-			}
-		},
 		"tar-fs": {
 			"version": "2.1.1",
 			"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz",
@@ -24957,64 +25386,6 @@
 			"integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
 			"dev": true
 		},
-		"thread-loader": {
-			"version": "3.0.4",
-			"resolved": "https://registry.npmjs.org/thread-loader/-/thread-loader-3.0.4.tgz",
-			"integrity": "sha512-ByaL2TPb+m6yArpqQUZvP+5S1mZtXsEP7nWKKlAUTm7fCml8kB5s1uI3+eHRP2bk5mVYfRSBI7FFf+tWEyLZwA==",
-			"dev": true,
-			"requires": {
-				"json-parse-better-errors": "^1.0.2",
-				"loader-runner": "^4.1.0",
-				"loader-utils": "^2.0.0",
-				"neo-async": "^2.6.2",
-				"schema-utils": "^3.0.0"
-			},
-			"dependencies": {
-				"@types/json-schema": {
-					"version": "7.0.9",
-					"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
-					"integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
-					"dev": true
-				},
-				"json5": {
-					"version": "2.2.0",
-					"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
-					"integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
-					"dev": true,
-					"requires": {
-						"minimist": "^1.2.5"
-					}
-				},
-				"loader-runner": {
-					"version": "4.2.0",
-					"resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz",
-					"integrity": "sha512-92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==",
-					"dev": true
-				},
-				"loader-utils": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-					"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
-					"dev": true,
-					"requires": {
-						"big.js": "^5.2.2",
-						"emojis-list": "^3.0.0",
-						"json5": "^2.1.2"
-					}
-				},
-				"schema-utils": {
-					"version": "3.1.1",
-					"resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz",
-					"integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==",
-					"dev": true,
-					"requires": {
-						"@types/json-schema": "^7.0.8",
-						"ajv": "^6.12.5",
-						"ajv-keywords": "^3.5.2"
-					}
-				}
-			}
-		},
 		"throat": {
 			"version": "5.0.0",
 			"resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
@@ -25071,9 +25442,9 @@
 			"integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
 		},
 		"tiny-glob": {
-			"version": "0.2.8",
-			"resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.8.tgz",
-			"integrity": "sha512-vkQP7qOslq63XRX9kMswlby99kyO5OvKptw7AMwBVMjXEI7Tb61eoI5DydyEMOseyGS5anDN1VPoVxEvH01q8w==",
+			"version": "0.2.9",
+			"resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz",
+			"integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==",
 			"dev": true,
 			"requires": {
 				"globalyzer": "0.1.0",
@@ -25105,11 +25476,6 @@
 				}
 			}
 		},
-		"tinycolor2": {
-			"version": "1.4.2",
-			"resolved": "https://registry.npmjs.org/tinycolor2/-/tinycolor2-1.4.2.tgz",
-			"integrity": "sha512-vJhccZPs965sV/L2sU4oRQVAos0pQXwsvTLkWYdqJ+a8Q5kPFzJTuOFwy7UniPli44NKQGAglksjvOcpo95aZA=="
-		},
 		"tmp": {
 			"version": "0.0.33",
 			"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
@@ -25120,9 +25486,9 @@
 			}
 		},
 		"tmpl": {
-			"version": "1.0.4",
-			"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
-			"integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=",
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+			"integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
 			"dev": true
 		},
 		"to-arraybuffer": {
@@ -25202,13 +25568,10 @@
 			}
 		},
 		"tr46": {
-			"version": "2.1.0",
-			"resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz",
-			"integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==",
-			"dev": true,
-			"requires": {
-				"punycode": "^2.1.1"
-			}
+			"version": "0.0.3",
+			"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+			"integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
+			"dev": true
 		},
 		"traverse": {
 			"version": "0.6.6",
@@ -25221,12 +25584,6 @@
 			"integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
 			"dev": true
 		},
-		"trim": {
-			"version": "0.0.1",
-			"resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz",
-			"integrity": "sha1-WFhUf2spB1fulczMZm+1AITEYN0=",
-			"dev": true
-		},
 		"trim-newlines": {
 			"version": "1.0.0",
 			"resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
@@ -25243,12 +25600,6 @@
 				"escape-string-regexp": "^1.0.2"
 			}
 		},
-		"trim-trailing-lines": {
-			"version": "1.1.4",
-			"resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.4.tgz",
-			"integrity": "sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==",
-			"dev": true
-		},
 		"trough": {
 			"version": "1.0.5",
 			"resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz",
@@ -25256,9 +25607,9 @@
 			"dev": true
 		},
 		"tsconfig-paths": {
-			"version": "3.11.0",
-			"resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz",
-			"integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==",
+			"version": "3.12.0",
+			"resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.12.0.tgz",
+			"integrity": "sha512-e5adrnOYT6zqVnWqZu7i/BQ3BnhzvGbjEjejFXO20lKIKpwTaupkCPgEfv4GZK1IBciJUEhYs3J3p75FdaTFVg==",
 			"dev": true,
 			"requires": {
 				"@types/json5": "^0.0.29",
@@ -25268,10 +25619,9 @@
 			}
 		},
 		"tslib": {
-			"version": "1.14.1",
-			"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
-			"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
-			"dev": true
+			"version": "2.3.1",
+			"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz",
+			"integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw=="
 		},
 		"tsutils": {
 			"version": "3.21.0",
@@ -25280,6 +25630,14 @@
 			"dev": true,
 			"requires": {
 				"tslib": "^1.8.1"
+			},
+			"dependencies": {
+				"tslib": {
+					"version": "1.14.1",
+					"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+					"integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+					"dev": true
+				}
 			}
 		},
 		"tty-browserify": {
@@ -25381,9 +25739,9 @@
 			"dev": true
 		},
 		"uglify-js": {
-			"version": "3.13.9",
-			"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.13.9.tgz",
-			"integrity": "sha512-wZbyTQ1w6Y7fHdt8sJnHfSIuWeDgk6B5rCb4E/AM6QNNPbOMIZph21PW5dRB3h7Df0GszN+t7RuUH6sWK5bF0g==",
+			"version": "3.14.3",
+			"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.14.3.tgz",
+			"integrity": "sha512-mic3aOdiq01DuSVx0TseaEzMIVqebMZ0Z3vaeDhFEh9bsc24hV1TFvN74reA2vs08D0ZWfNjAcJ3UbVLaBss+g==",
 			"dev": true
 		},
 		"uglify-to-browserify": {
@@ -25472,56 +25830,60 @@
 				"util-deprecate": "^1.0.2"
 			}
 		},
-		"unherit": {
-			"version": "1.1.3",
-			"resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz",
-			"integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==",
-			"dev": true,
-			"requires": {
-				"inherits": "^2.0.0",
-				"xtend": "^4.0.0"
-			}
-		},
 		"unicode-canonical-property-names-ecmascript": {
-			"version": "1.0.4",
-			"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
-			"integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
+			"integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==",
 			"dev": true
 		},
 		"unicode-match-property-ecmascript": {
-			"version": "1.0.4",
-			"resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
-			"integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+			"integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
 			"dev": true,
 			"requires": {
-				"unicode-canonical-property-names-ecmascript": "^1.0.4",
-				"unicode-property-aliases-ecmascript": "^1.0.4"
+				"unicode-canonical-property-names-ecmascript": "^2.0.0",
+				"unicode-property-aliases-ecmascript": "^2.0.0"
 			}
 		},
 		"unicode-match-property-value-ecmascript": {
-			"version": "1.2.0",
-			"resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
-			"integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==",
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz",
+			"integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==",
 			"dev": true
 		},
 		"unicode-property-aliases-ecmascript": {
-			"version": "1.1.0",
-			"resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
-			"integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz",
+			"integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==",
 			"dev": true
 		},
 		"unified": {
-			"version": "6.2.0",
-			"resolved": "https://registry.npmjs.org/unified/-/unified-6.2.0.tgz",
-			"integrity": "sha512-1k+KPhlVtqmG99RaTbAv/usu85fcSRu3wY8X+vnsEhIxNP5VbVIDiXnLqyKIG+UMdyTg0ZX9EI6k2AfjJkHPtA==",
+			"version": "9.2.2",
+			"resolved": "https://registry.npmjs.org/unified/-/unified-9.2.2.tgz",
+			"integrity": "sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==",
 			"dev": true,
 			"requires": {
 				"bail": "^1.0.0",
 				"extend": "^3.0.0",
-				"is-plain-obj": "^1.1.0",
+				"is-buffer": "^2.0.0",
+				"is-plain-obj": "^2.0.0",
 				"trough": "^1.0.0",
-				"vfile": "^2.0.0",
-				"x-is-string": "^0.1.0"
+				"vfile": "^4.0.0"
+			},
+			"dependencies": {
+				"is-buffer": {
+					"version": "2.0.5",
+					"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+					"integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
+					"dev": true
+				},
+				"is-plain-obj": {
+					"version": "2.1.0",
+					"resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
+					"integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
+					"dev": true
+				}
 			}
 		},
 		"union-value": {
@@ -25567,59 +25929,27 @@
 			}
 		},
 		"unist-util-find-all-after": {
-			"version": "3.0.2",
-			"resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz",
-			"integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==",
-			"dev": true,
-			"requires": {
-				"unist-util-is": "^4.0.0"
-			},
-			"dependencies": {
-				"unist-util-is": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz",
-					"integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==",
-					"dev": true
-				}
-			}
-		},
-		"unist-util-is": {
-			"version": "3.0.0",
-			"resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz",
-			"integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==",
-			"dev": true
-		},
-		"unist-util-remove-position": {
-			"version": "1.1.4",
-			"resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz",
-			"integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==",
-			"dev": true,
-			"requires": {
-				"unist-util-visit": "^1.1.0"
-			}
-		},
-		"unist-util-stringify-position": {
-			"version": "1.1.2",
-			"resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz",
-			"integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==",
-			"dev": true
-		},
-		"unist-util-visit": {
-			"version": "1.4.1",
-			"resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz",
-			"integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==",
+			"version": "3.0.2",
+			"resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-3.0.2.tgz",
+			"integrity": "sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==",
 			"dev": true,
 			"requires": {
-				"unist-util-visit-parents": "^2.0.0"
+				"unist-util-is": "^4.0.0"
 			}
 		},
-		"unist-util-visit-parents": {
-			"version": "2.1.2",
-			"resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz",
-			"integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==",
+		"unist-util-is": {
+			"version": "4.1.0",
+			"resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-4.1.0.tgz",
+			"integrity": "sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==",
+			"dev": true
+		},
+		"unist-util-stringify-position": {
+			"version": "2.0.3",
+			"resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz",
+			"integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==",
 			"dev": true,
 			"requires": {
-				"unist-util-is": "^3.0.0"
+				"@types/unist": "^2.0.2"
 			}
 		},
 		"universalify": {
@@ -25755,9 +26085,9 @@
 					}
 				},
 				"loader-utils": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
-					"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
+					"version": "2.0.2",
+					"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz",
+					"integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==",
 					"dev": true,
 					"requires": {
 						"big.js": "^5.2.2",
@@ -25779,9 +26109,9 @@
 			}
 		},
 		"url-parse": {
-			"version": "1.5.1",
-			"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.1.tgz",
-			"integrity": "sha512-HOfCOUJt7iSYzEx/UqgtwKRMC6EU91NFhsCHMv9oM03VJcVo2Qrp8T8kI9D7amFf1cu+/3CEhgb3rF9zL7k85Q==",
+			"version": "1.5.3",
+			"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.3.tgz",
+			"integrity": "sha512-IIORyIQD9rvj0A4CLWsHkBBJuNqWpFQe224b6j9t/ABmquIS0qDU2pY6kl6AuOrL5OkCXHMCFNe1jBcuAggjvQ==",
 			"dev": true,
 			"requires": {
 				"querystringify": "^2.1.1",
@@ -25932,30 +26262,33 @@
 			}
 		},
 		"vfile": {
-			"version": "2.3.0",
-			"resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz",
-			"integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==",
+			"version": "4.2.1",
+			"resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz",
+			"integrity": "sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==",
 			"dev": true,
 			"requires": {
-				"is-buffer": "^1.1.4",
-				"replace-ext": "1.0.0",
-				"unist-util-stringify-position": "^1.0.0",
-				"vfile-message": "^1.0.0"
+				"@types/unist": "^2.0.0",
+				"is-buffer": "^2.0.0",
+				"unist-util-stringify-position": "^2.0.0",
+				"vfile-message": "^2.0.0"
+			},
+			"dependencies": {
+				"is-buffer": {
+					"version": "2.0.5",
+					"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz",
+					"integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==",
+					"dev": true
+				}
 			}
 		},
-		"vfile-location": {
-			"version": "2.0.6",
-			"resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz",
-			"integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==",
-			"dev": true
-		},
 		"vfile-message": {
-			"version": "1.1.1",
-			"resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz",
-			"integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==",
+			"version": "2.0.4",
+			"resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz",
+			"integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==",
 			"dev": true,
 			"requires": {
-				"unist-util-stringify-position": "^1.1.1"
+				"@types/unist": "^2.0.0",
+				"unist-util-stringify-position": "^2.0.0"
 			}
 		},
 		"vm-browserify": {
@@ -25988,26 +26321,32 @@
 			}
 		},
 		"wait-on": {
-			"version": "5.3.0",
-			"resolved": "https://registry.npmjs.org/wait-on/-/wait-on-5.3.0.tgz",
-			"integrity": "sha512-DwrHrnTK+/0QFaB9a8Ol5Lna3k7WvUR4jzSKmz0YaPBpuN2sACyiPVKVfj6ejnjcajAcvn3wlbTyMIn9AZouOg==",
+			"version": "6.0.0",
+			"resolved": "https://registry.npmjs.org/wait-on/-/wait-on-6.0.0.tgz",
+			"integrity": "sha512-tnUJr9p5r+bEYXPUdRseolmz5XqJTTj98JgOsfBn7Oz2dxfE2g3zw1jE+Mo8lopM3j3et/Mq1yW7kKX6qw7RVw==",
 			"dev": true,
 			"requires": {
 				"axios": "^0.21.1",
-				"joi": "^17.3.0",
+				"joi": "^17.4.0",
 				"lodash": "^4.17.21",
 				"minimist": "^1.2.5",
-				"rxjs": "^6.6.3"
+				"rxjs": "^7.1.0"
 			},
 			"dependencies": {
 				"rxjs": {
-					"version": "6.6.6",
-					"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.6.tgz",
-					"integrity": "sha512-/oTwee4N4iWzAMAL9xdGKjkEHmIwupR3oXbQjCKywF1BeFohswF3vZdogbmEF6pZkOsXTzWkrZszrWpQTByYVg==",
+					"version": "7.4.0",
+					"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.4.0.tgz",
+					"integrity": "sha512-7SQDi7xeTMCJpqViXh8gL/lebcwlp3d831F05+9B44A4B0WfsEwUQHR64gsH1kvJ+Ep/J9K2+n1hVl1CsGN23w==",
 					"dev": true,
 					"requires": {
-						"tslib": "^1.9.0"
+						"tslib": "~2.1.0"
 					}
+				},
+				"tslib": {
+					"version": "2.1.0",
+					"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.1.0.tgz",
+					"integrity": "sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A==",
+					"dev": true
 				}
 			}
 		},
@@ -26042,12 +26381,12 @@
 			}
 		},
 		"walker": {
-			"version": "1.0.7",
-			"resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz",
-			"integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=",
+			"version": "1.0.8",
+			"resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+			"integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
 			"dev": true,
 			"requires": {
-				"makeerror": "1.0.x"
+				"makeerror": "1.0.12"
 			}
 		},
 		"watchpack": {
@@ -26196,9 +26535,10 @@
 			"integrity": "sha512-TOMFWtQdxzjWp8qx4DAraTWTsdhxVSiWa6NkPFSaPtZ1diKUxTn4yTix73A1euG1WbSOMMPcY51cnjTIHrGtDA=="
 		},
 		"webidl-conversions": {
-			"version": "5.0.0",
-			"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz",
-			"integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA=="
+			"version": "3.0.1",
+			"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+			"integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=",
+			"dev": true
 		},
 		"webpack": {
 			"version": "4.43.0",
@@ -26232,15 +26572,15 @@
 			}
 		},
 		"webpack-bundle-analyzer": {
-			"version": "4.4.2",
-			"resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.4.2.tgz",
-			"integrity": "sha512-PIagMYhlEzFfhMYOzs5gFT55DkUdkyrJi/SxJp8EF3YMWhS+T9vvs2EoTetpk5qb6VsCq02eXTlRDOydRhDFAQ==",
+			"version": "4.5.0",
+			"resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.5.0.tgz",
+			"integrity": "sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==",
 			"dev": true,
 			"requires": {
 				"acorn": "^8.0.4",
 				"acorn-walk": "^8.0.0",
 				"chalk": "^4.1.0",
-				"commander": "^6.2.0",
+				"commander": "^7.2.0",
 				"gzip-size": "^6.0.0",
 				"lodash": "^4.17.20",
 				"opener": "^1.5.2",
@@ -26249,181 +26589,126 @@
 			},
 			"dependencies": {
 				"acorn": {
-					"version": "8.4.1",
-					"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.4.1.tgz",
-					"integrity": "sha512-asabaBSkEKosYKMITunzX177CXxQ4Q8BSSzMTKD+FefUhipQC70gfW5SiUDhYQ3vk8G+81HqQk7Fv9OXwwn9KA==",
+					"version": "8.7.0",
+					"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz",
+					"integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==",
 					"dev": true
 				},
 				"acorn-walk": {
-					"version": "8.1.1",
-					"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.1.1.tgz",
-					"integrity": "sha512-FbJdceMlPHEAWJOILDk1fXD8lnTlEIWFkqtfk+MvmL5q/qlHfN7GEHcsFZWt/Tea9jRNPWUZG4G976nqAAmU9w==",
+					"version": "8.2.0",
+					"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz",
+					"integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
 					"dev": true
 				},
 				"commander": {
-					"version": "6.2.1",
-					"resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz",
-					"integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==",
+					"version": "7.2.0",
+					"resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+					"integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
 					"dev": true
 				}
 			}
 		},
 		"webpack-cli": {
-			"version": "3.3.12",
-			"resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz",
-			"integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==",
-			"dev": true,
-			"requires": {
-				"chalk": "^2.4.2",
-				"cross-spawn": "^6.0.5",
-				"enhanced-resolve": "^4.1.1",
-				"findup-sync": "^3.0.0",
-				"global-modules": "^2.0.0",
-				"import-local": "^2.0.0",
-				"interpret": "^1.4.0",
-				"loader-utils": "^1.4.0",
-				"supports-color": "^6.1.0",
-				"v8-compile-cache": "^2.1.1",
-				"yargs": "^13.3.2"
+			"version": "4.9.1",
+			"resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.1.tgz",
+			"integrity": "sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ==",
+			"dev": true,
+			"requires": {
+				"@discoveryjs/json-ext": "^0.5.0",
+				"@webpack-cli/configtest": "^1.1.0",
+				"@webpack-cli/info": "^1.4.0",
+				"@webpack-cli/serve": "^1.6.0",
+				"colorette": "^2.0.14",
+				"commander": "^7.0.0",
+				"execa": "^5.0.0",
+				"fastest-levenshtein": "^1.0.12",
+				"import-local": "^3.0.2",
+				"interpret": "^2.2.0",
+				"rechoir": "^0.7.0",
+				"webpack-merge": "^5.7.3"
 			},
 			"dependencies": {
-				"chalk": {
-					"version": "2.4.2",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-					"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-					"dev": true,
-					"requires": {
-						"ansi-styles": "^3.2.1",
-						"escape-string-regexp": "^1.0.5",
-						"supports-color": "^5.3.0"
-					},
-					"dependencies": {
-						"supports-color": {
-							"version": "5.5.0",
-							"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-							"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-							"dev": true,
-							"requires": {
-								"has-flag": "^3.0.0"
-							}
-						}
-					}
+				"commander": {
+					"version": "7.2.0",
+					"resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+					"integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+					"dev": true
 				},
 				"cross-spawn": {
-					"version": "6.0.5",
-					"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
-					"integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
-					"dev": true,
-					"requires": {
-						"nice-try": "^1.0.4",
-						"path-key": "^2.0.1",
-						"semver": "^5.5.0",
-						"shebang-command": "^1.2.0",
-						"which": "^1.2.9"
-					}
-				},
-				"global-modules": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
-					"integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
-					"dev": true,
-					"requires": {
-						"global-prefix": "^3.0.0"
-					}
-				},
-				"global-prefix": {
-					"version": "3.0.0",
-					"resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
-					"integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+					"version": "7.0.3",
+					"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+					"integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
 					"dev": true,
 					"requires": {
-						"ini": "^1.3.5",
-						"kind-of": "^6.0.2",
-						"which": "^1.3.1"
+						"path-key": "^3.1.0",
+						"shebang-command": "^2.0.0",
+						"which": "^2.0.1"
 					}
 				},
-				"import-local": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz",
-					"integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==",
+				"execa": {
+					"version": "5.1.1",
+					"resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+					"integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
 					"dev": true,
 					"requires": {
-						"pkg-dir": "^3.0.0",
-						"resolve-cwd": "^2.0.0"
+						"cross-spawn": "^7.0.3",
+						"get-stream": "^6.0.0",
+						"human-signals": "^2.1.0",
+						"is-stream": "^2.0.0",
+						"merge-stream": "^2.0.0",
+						"npm-run-path": "^4.0.1",
+						"onetime": "^5.1.2",
+						"signal-exit": "^3.0.3",
+						"strip-final-newline": "^2.0.0"
 					}
 				},
-				"kind-of": {
-					"version": "6.0.3",
-					"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
-					"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+				"get-stream": {
+					"version": "6.0.1",
+					"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+					"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
 					"dev": true
 				},
-				"resolve-cwd": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz",
-					"integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=",
-					"dev": true,
-					"requires": {
-						"resolve-from": "^3.0.0"
-					}
-				},
-				"resolve-from": {
-					"version": "3.0.0",
-					"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
-					"integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
+				"human-signals": {
+					"version": "2.1.0",
+					"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+					"integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
 					"dev": true
 				},
-				"semver": {
-					"version": "5.7.1",
-					"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
-					"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+				"is-stream": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+					"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
 					"dev": true
 				},
-				"supports-color": {
-					"version": "6.1.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-					"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+				"npm-run-path": {
+					"version": "4.0.1",
+					"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+					"integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
 					"dev": true,
 					"requires": {
-						"has-flag": "^3.0.0"
+						"path-key": "^3.0.0"
 					}
 				},
-				"which": {
-					"version": "1.3.1",
-					"resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-					"integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-					"dev": true,
-					"requires": {
-						"isexe": "^2.0.0"
-					}
+				"path-key": {
+					"version": "3.1.1",
+					"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+					"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+					"dev": true
 				},
-				"yargs": {
-					"version": "13.3.2",
-					"resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
-					"integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
+				"shebang-command": {
+					"version": "2.0.0",
+					"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+					"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
 					"dev": true,
 					"requires": {
-						"cliui": "^5.0.0",
-						"find-up": "^3.0.0",
-						"get-caller-file": "^2.0.1",
-						"require-directory": "^2.1.1",
-						"require-main-filename": "^2.0.0",
-						"set-blocking": "^2.0.0",
-						"string-width": "^3.0.0",
-						"which-module": "^2.0.0",
-						"y18n": "^4.0.0",
-						"yargs-parser": "^13.1.2"
+						"shebang-regex": "^3.0.0"
 					}
 				},
-				"yargs-parser": {
-					"version": "13.1.2",
-					"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
-					"integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
-					"dev": true,
-					"requires": {
-						"camelcase": "^5.0.0",
-						"decamelize": "^1.2.0"
-					}
+				"shebang-regex": {
+					"version": "3.0.0",
+					"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+					"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+					"dev": true
 				}
 			}
 		},
@@ -26723,6 +27008,44 @@
 				}
 			}
 		},
+		"webpack-merge": {
+			"version": "5.8.0",
+			"resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz",
+			"integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==",
+			"dev": true,
+			"requires": {
+				"clone-deep": "^4.0.1",
+				"wildcard": "^2.0.0"
+			},
+			"dependencies": {
+				"clone-deep": {
+					"version": "4.0.1",
+					"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+					"integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+					"dev": true,
+					"requires": {
+						"is-plain-object": "^2.0.4",
+						"kind-of": "^6.0.2",
+						"shallow-clone": "^3.0.0"
+					}
+				},
+				"kind-of": {
+					"version": "6.0.3",
+					"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+					"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+					"dev": true
+				},
+				"shallow-clone": {
+					"version": "3.0.1",
+					"resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+					"integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+					"dev": true,
+					"requires": {
+						"kind-of": "^6.0.2"
+					}
+				}
+			}
+		},
 		"webpack-sources": {
 			"version": "1.4.3",
 			"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
@@ -26790,32 +27113,13 @@
 			"dev": true
 		},
 		"whatwg-url": {
-			"version": "8.7.0",
-			"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz",
-			"integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==",
+			"version": "5.0.0",
+			"resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+			"integrity": "sha1-lmRU6HZUYuN2RNNib2dCzotwll0=",
 			"dev": true,
 			"requires": {
-				"lodash": "^4.7.0",
-				"tr46": "^2.1.0",
-				"webidl-conversions": "^6.1.0"
-			},
-			"dependencies": {
-				"webidl-conversions": {
-					"version": "6.1.0",
-					"resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
-					"integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
-					"dev": true
-				}
-			}
-		},
-		"whatwg-url-without-unicode": {
-			"version": "8.0.0-3",
-			"resolved": "https://registry.npmjs.org/whatwg-url-without-unicode/-/whatwg-url-without-unicode-8.0.0-3.tgz",
-			"integrity": "sha512-HoKuzZrUlgpz35YO27XgD28uh/WJH4B0+3ttFqRo//lmq+9T/mIOJ6kqmINI9HpUpz1imRC/nR/lxKpJiv0uig==",
-			"requires": {
-				"buffer": "^5.4.3",
-				"punycode": "^2.1.1",
-				"webidl-conversions": "^5.0.0"
+				"tr46": "~0.0.3",
+				"webidl-conversions": "^3.0.0"
 			}
 		},
 		"which": {
@@ -26849,6 +27153,12 @@
 			"resolved": "https://registry.npmjs.org/wicg-inert/-/wicg-inert-3.1.1.tgz",
 			"integrity": "sha512-PhBaNh8ur9Xm4Ggy4umelwNIP6pPP1bv3EaWaKqfb/QNme2rdLjm7wIInvV4WhxVHhzA4Spgw9qNSqWtB/ca2A=="
 		},
+		"wildcard": {
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz",
+			"integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==",
+			"dev": true
+		},
 		"window-size": {
 			"version": "0.1.0",
 			"resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
@@ -26906,12 +27216,6 @@
 			"resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz",
 			"integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A=="
 		},
-		"x-is-string": {
-			"version": "0.1.0",
-			"resolved": "https://registry.npmjs.org/x-is-string/-/x-is-string-0.1.0.tgz",
-			"integrity": "sha1-R0tQhlrzpJqcRlfwWs0UVFj3fYI=",
-			"dev": true
-		},
 		"xml-name-validator": {
 			"version": "3.0.0",
 			"resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
@@ -27009,12 +27313,6 @@
 				"fd-slicer": "~1.1.0"
 			}
 		},
-		"yocto-queue": {
-			"version": "0.1.0",
-			"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
-			"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
-			"dev": true
-		},
 		"zwitch": {
 			"version": "1.0.5",
 			"resolved": "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz",
diff --git a/package.json b/package.json
index d3b6998d60..ba128fee6a 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
 	"name": "WordPress",
-	"version": "5.9.0",
+	"version": "6.0.0",
 	"description": "WordPress is open source software you can use to create a beautiful website, blog, or app.",
 	"repository": {
 		"type": "svn",
@@ -24,14 +24,14 @@
 		"last 2 Opera versions"
 	],
 	"devDependencies": {
-		"@wordpress/babel-preset-default": "6.2.1",
-		"@wordpress/custom-templated-path-webpack-plugin": "2.0.5",
-		"@wordpress/dependency-extraction-webpack-plugin": "3.1.4",
-		"@wordpress/e2e-test-utils": "5.4.3",
-		"@wordpress/library-export-default-webpack-plugin": "2.0.5",
-		"@wordpress/scripts": "16.1.5",
-		"autoprefixer": "^9.8.6",
-		"chalk": "4.1.1",
+		"@wordpress/babel-preset-default": "6.4.1",
+		"@wordpress/custom-templated-path-webpack-plugin": "2.1.0",
+		"@wordpress/dependency-extraction-webpack-plugin": "3.2.1",
+		"@wordpress/e2e-test-utils": "5.4.10",
+		"@wordpress/library-export-default-webpack-plugin": "2.2.0",
+		"@wordpress/scripts": "19.2.4",
+		"autoprefixer": "^9.8.8",
+		"chalk": "4.1.2",
 		"check-node-version": "4.1.0",
 		"copy-webpack-plugin": "^5.1.2",
 		"cssnano": "4.1.11",
@@ -40,16 +40,15 @@
 		"grunt": "~1.4.1",
 		"grunt-banner": "^0.6.0",
 		"grunt-contrib-clean": "~2.0.0",
-		"grunt-contrib-concat": "1.0.1",
+		"grunt-contrib-concat": "2.0.0",
 		"grunt-contrib-copy": "~1.0.0",
 		"grunt-contrib-cssmin": "~4.0.0",
 		"grunt-contrib-imagemin": "~4.0.0",
-		"grunt-contrib-jshint": "3.0.0",
-		"grunt-contrib-qunit": "^4.0.0",
+		"grunt-contrib-jshint": "3.1.1",
+		"grunt-contrib-qunit": "^5.1.1",
 		"grunt-contrib-uglify": "~5.0.1",
 		"grunt-contrib-watch": "~1.1.0",
 		"grunt-file-append": "0.0.7",
-		"grunt-includes": "~1.1.0",
 		"grunt-jsdoc": "2.4.1",
 		"grunt-jsvalidate": "~0.2.2",
 		"grunt-legacy-util": "^2.0.1",
@@ -64,72 +63,73 @@
 		"jest-image-snapshot": "3.0.1",
 		"matchdep": "~2.0.0",
 		"prettier": "npm:wp-prettier@2.0.5",
-		"qunit": "~2.16.0",
-		"sass": "^1.34.1",
-		"sinon": "~11.1.1",
-		"sinon-test": "~3.1.0",
+		"qunit": "~2.17.2",
+		"sass": "^1.43.4",
+		"sinon": "~12.0.1",
+		"sinon-test": "~3.1.1",
 		"source-map-loader": "^1.1.3",
-		"uglify-js": "^3.13.9",
+		"uglify-js": "^3.14.3",
 		"uglifyjs-webpack-plugin": "2.2.0",
 		"uuid": "8.3.2",
-		"wait-on": "5.3.0",
+		"wait-on": "6.0.0",
 		"webpack": "4.43.0",
 		"webpack-dev-server": "3.11.2",
 		"webpack-livereload-plugin": "2.3.0"
 	},
 	"dependencies": {
-		"@wordpress/a11y": "3.1.2",
-		"@wordpress/annotations": "2.1.6",
-		"@wordpress/api-fetch": "5.1.2",
-		"@wordpress/autop": "3.1.2",
-		"@wordpress/blob": "3.1.2",
-		"@wordpress/block-directory": "2.1.21",
-		"@wordpress/block-editor": "6.1.14",
-		"@wordpress/block-library": "3.2.19",
-		"@wordpress/block-serialization-default-parser": "4.1.2",
-		"@wordpress/blocks": "9.1.8",
-		"@wordpress/components": "14.1.11",
-		"@wordpress/compose": "4.1.6",
-		"@wordpress/core-data": "3.1.12",
-		"@wordpress/customize-widgets": "1.0.20",
-		"@wordpress/data": "5.1.6",
-		"@wordpress/data-controls": "2.1.6",
-		"@wordpress/date": "4.1.2",
-		"@wordpress/deprecated": "3.1.2",
-		"@wordpress/dom": "3.1.5",
-		"@wordpress/dom-ready": "3.1.2",
-		"@wordpress/edit-post": "4.1.21",
-		"@wordpress/edit-widgets": "2.1.21",
-		"@wordpress/editor": "10.1.17",
-		"@wordpress/element": "3.1.2",
-		"@wordpress/escape-html": "2.1.2",
-		"@wordpress/format-library": "2.1.14",
-		"@wordpress/hooks": "3.1.1",
-		"@wordpress/html-entities": "3.1.2",
-		"@wordpress/i18n": "4.1.2",
-		"@wordpress/icons": "4.0.3",
-		"@wordpress/interface": "3.1.12",
-		"@wordpress/is-shallow-equal": "4.1.1",
-		"@wordpress/keyboard-shortcuts": "2.1.7",
-		"@wordpress/keycodes": "3.1.2",
-		"@wordpress/list-reusable-blocks": "2.1.11",
-		"@wordpress/media-utils": "2.1.2",
-		"@wordpress/notices": "3.1.6",
-		"@wordpress/nux": "4.1.11",
-		"@wordpress/plugins": "3.1.6",
-		"@wordpress/primitives": "2.1.2",
-		"@wordpress/priority-queue": "2.1.2",
-		"@wordpress/redux-routine": "4.1.2",
-		"@wordpress/reusable-blocks": "2.1.17",
-		"@wordpress/rich-text": "4.1.6",
-		"@wordpress/server-side-render": "2.1.12",
-		"@wordpress/shortcode": "3.1.2",
-		"@wordpress/token-list": "2.1.1",
-		"@wordpress/url": "3.1.2",
-		"@wordpress/viewport": "3.1.6",
-		"@wordpress/warning": "2.1.2",
-		"@wordpress/widgets": "1.1.19",
-		"@wordpress/wordcount": "3.1.2",
+		"@wordpress/a11y": "3.2.4",
+		"@wordpress/annotations": "2.2.9",
+		"@wordpress/api-fetch": "5.2.6",
+		"@wordpress/autop": "3.2.3",
+		"@wordpress/blob": "3.2.2",
+		"@wordpress/block-directory": "3.0.26",
+		"@wordpress/block-editor": "8.0.16",
+		"@wordpress/block-library": "6.0.25",
+		"@wordpress/block-serialization-default-parser": "4.2.3",
+		"@wordpress/blocks": "11.1.5",
+		"@wordpress/components": "19.2.2",
+		"@wordpress/compose": "5.0.7",
+		"@wordpress/core-data": "4.0.9",
+		"@wordpress/customize-widgets": "2.0.26",
+		"@wordpress/data": "6.1.5",
+		"@wordpress/data-controls": "2.2.8",
+		"@wordpress/date": "4.2.3",
+		"@wordpress/deprecated": "3.2.3",
+		"@wordpress/dom": "3.2.7",
+		"@wordpress/dom-ready": "3.2.3",
+		"@wordpress/edit-post": "5.0.26",
+		"@wordpress/edit-site": "3.0.26",
+		"@wordpress/edit-widgets": "3.1.21",
+		"@wordpress/editor": "12.0.20",
+		"@wordpress/element": "4.0.4",
+		"@wordpress/escape-html": "2.2.3",
+		"@wordpress/format-library": "3.0.22",
+		"@wordpress/hooks": "3.2.2",
+		"@wordpress/html-entities": "3.2.3",
+		"@wordpress/i18n": "4.2.4",
+		"@wordpress/icons": "6.1.1",
+		"@wordpress/interface": "4.1.17",
+		"@wordpress/is-shallow-equal": "4.2.1",
+		"@wordpress/keyboard-shortcuts": "3.0.7",
+		"@wordpress/keycodes": "3.2.4",
+		"@wordpress/list-reusable-blocks": "3.0.19",
+		"@wordpress/media-utils": "3.0.5",
+		"@wordpress/notices": "3.2.8",
+		"@wordpress/nux": "5.0.19",
+		"@wordpress/plugins": "4.0.7",
+		"@wordpress/primitives": "3.0.4",
+		"@wordpress/priority-queue": "2.2.3",
+		"@wordpress/redux-routine": "4.2.2",
+		"@wordpress/reusable-blocks": "3.0.22",
+		"@wordpress/rich-text": "5.0.8",
+		"@wordpress/server-side-render": "3.0.19",
+		"@wordpress/shortcode": "3.2.3",
+		"@wordpress/token-list": "2.2.2",
+		"@wordpress/url": "3.3.1",
+		"@wordpress/viewport": "4.0.7",
+		"@wordpress/warning": "2.2.2",
+		"@wordpress/widgets": "2.0.22",
+		"@wordpress/wordcount": "3.2.3",
 		"backbone": "1.4.0",
 		"clipboard": "2.0.8",
 		"core-js-url-browser": "3.6.4",
@@ -140,15 +140,15 @@
 		"jquery": "3.6.0",
 		"jquery-color": "2.2.0",
 		"jquery-form": "4.3.0",
-		"jquery-hoverintent": "1.10.1",
+		"jquery-hoverintent": "1.10.2",
 		"lodash": "4.17.21",
 		"masonry-layout": "4.2.2",
 		"moment": "2.29.1",
 		"objectFitPolyfill": "2.3.5",
 		"polyfill-library": "3.105.0",
-		"react": "16.13.1",
-		"react-dom": "16.13.1",
-		"regenerator-runtime": "0.13.7",
+		"react": "17.0.1",
+		"react-dom": "17.0.1",
+		"regenerator-runtime": "0.13.9",
 		"twemoji": "13.1.0",
 		"underscore": "1.13.1",
 		"whatwg-fetch": "3.6.2"
diff --git a/phpcompat.xml.dist b/phpcompat.xml.dist
index 5af8e2a503..fbc436cf0d 100644
--- a/phpcompat.xml.dist
+++ b/phpcompat.xml.dist
@@ -11,7 +11,7 @@
 	<arg name="extensions" value="php"/>
 
 	<!-- Whenever possible, cache the scan results and re-use those for unchanged files on the next scan. -->
-	<arg name="cache"/>
+	<arg name="cache" value=".cache/phpcompat.json"/>
 
 	<!-- Set the memory limit to 256M.
 		 For most standard PHP configurations, this means the memory limit will temporarily be raised.
@@ -40,6 +40,15 @@
 	-->
 	<exclude-pattern>/vendor/*</exclude-pattern>
 
+	<!-- Must-Use plugins. -->
+	<exclude-pattern>/src/wp-content/mu-plugins/*</exclude-pattern>
+
+	<!-- Plugins. -->
+	<exclude-pattern>/src/wp-content/plugins/*</exclude-pattern>
+
+	<!-- Themes except the twenty* themes. -->
+	<exclude-pattern>/src/wp-content/themes/(?!twenty)*</exclude-pattern>
+
 	<!--
 		PHPCompatibilityParagonieSodiumCompat prevents false positives in `sodium_compat`.
 		However, because these files are included in a non-standard path, false positives are triggered in WordPress Core.
diff --git a/phpcs.xml.dist b/phpcs.xml.dist
index dedf053d63..62287650cf 100644
--- a/phpcs.xml.dist
+++ b/phpcs.xml.dist
@@ -6,7 +6,7 @@
 	<arg name="extensions" value="php"/>
 
 	<!-- Whenever possible, cache the scan results and re-use those for unchanged files on the next scan. -->
-	<arg name="cache"/>
+	<arg name="cache" value=".cache/phpcs.json"/>
 
 	<!-- Set the memory limit to 256M.
 		 For most standard PHP configurations, this means the memory limit will temporarily be raised.
@@ -249,6 +249,7 @@
 				<element value="WP_REST_Test_Controller"/>
 				<element value="WP_Image_Editor_Mock"/>
 				<element value="WP_Filesystem_MockFS"/>
+				<element value="Mock_Invokable"/>
 				<element value="MockPHPMailer"/>
 				<element value="MockAction"/>
 				<element value="WP_Object_Cache"/>
diff --git a/src/js/_enqueues/admin/common.js b/src/js/_enqueues/admin/common.js
index d5e2d9ad58..5e15893d1f 100644
--- a/src/js/_enqueues/admin/common.js
+++ b/src/js/_enqueues/admin/common.js
@@ -1309,7 +1309,7 @@ $( function() {
 	});
 
 	/**
-	 * Handles tab keypresses in theme and plugin editor textareas.
+	 * Handles tab keypresses in theme and plugin file editor textareas.
 	 *
 	 * @param {Event} e The event object.
 	 *
@@ -1695,25 +1695,6 @@ $( function() {
 				}
 			} );
 
-			// Close sidebar when focus moves outside of toggle and sidebar.
-			$( '#wp-admin-bar-menu-toggle, #adminmenumain' ).on( 'focusout', function() {
-				var focusIsInToggle, focusIsInSidebar;
-
-				if ( ! $wpwrap.hasClass( 'wp-responsive-open' ) ) {
-					return;
-				}
-
-				// A brief delay is required to allow focus to switch to another element.
-				setTimeout( function() {
-					focusIsInToggle  = $.contains( $( '#wp-admin-bar-menu-toggle' )[0], $( ':focus' )[0] );
-					focusIsInSidebar = $.contains( $( '#adminmenumain' )[0], $( ':focus' )[0] );
-
-					if ( ! focusIsInToggle && ! focusIsInSidebar ) {
-						$( '#wp-admin-bar-menu-toggle' ).trigger( 'click.wp-responsive' );
-					}
-				}, 10 );
-			} );
-
 			// Add menu events.
 			$adminmenu.on( 'click.wp-responsive', 'li.wp-has-submenu > a', function( event ) {
 				if ( ! $adminmenu.data('wp-responsive') ) {
@@ -1727,7 +1708,7 @@ $( function() {
 			self.trigger();
 			$document.on( 'wp-window-resized.wp-responsive', this.trigger.bind( this ) );
 
-			// This needs to run later as UI Sortable may be initialized later on $(document).ready().
+			// This needs to run later as UI Sortable may be initialized when the document is ready.
 			$window.on( 'load.wp-responsive', this.maybeDisableSortables );
 			$document.on( 'postbox-toggled', this.maybeDisableSortables );
 
diff --git a/src/js/_enqueues/admin/post.js b/src/js/_enqueues/admin/post.js
index b0fca99135..c9b002a65a 100644
--- a/src/js/_enqueues/admin/post.js
+++ b/src/js/_enqueues/admin/post.js
@@ -135,21 +135,26 @@ window.wp = window.wp || {};
 	 * @global
 	 */
 	window.WPRemoveThumbnail = function(nonce){
-		$.post(ajaxurl, {
-			action: 'set-post-thumbnail', post_id: $( '#post_ID' ).val(), thumbnail_id: -1, _ajax_nonce: nonce, cookie: encodeURIComponent( document.cookie )
-		},
+		$.post(
+			ajaxurl, {
+				action: 'set-post-thumbnail',
+				post_id: $( '#post_ID' ).val(),
+				thumbnail_id: -1,
+				_ajax_nonce: nonce,
+				cookie: encodeURIComponent( document.cookie )
+			},
 			/**
 			 * Handle server response
 			 *
 			 * @param {string} str Response, will be '0' when an error occurred otherwise contains link to add Featured Image.
 			 */
 			function(str){
-			if ( str == '0' ) {
-				alert( __( 'Could not set that as the thumbnail image. Try a different attachment.' ) );
-			} else {
-				WPSetThumbnailHTML(str);
+				if ( str == '0' ) {
+					alert( __( 'Could not set that as the thumbnail image. Try a different attachment.' ) );
+				} else {
+					WPSetThumbnailHTML(str);
+				}
 			}
-		}
 		);
 	};
 
@@ -207,7 +212,9 @@ window.wp = window.wp || {};
 							height: 64,
 							alt: '',
 							src: received.lock_error.avatar_src,
-							srcset: received.lock_error.avatar_src_2x ? received.lock_error.avatar_src_2x + ' 2x' : undefined
+							srcset: received.lock_error.avatar_src_2x ?
+								received.lock_error.avatar_src_2x + ' 2x' :
+								undefined
 						} );
 						wrap.find('div.post-locked-avatar').empty().append( avatar );
 					}
@@ -666,11 +673,15 @@ jQuery( function($) {
 		});
 
 		// Sync checked items between "All {taxonomy}" and "Most used" lists.
-		$('#' + taxonomy + 'checklist, #' + taxonomy + 'checklist-pop').on( 'click', 'li.popular-category > label input[type="checkbox"]', function() {
-			var t = $(this), c = t.is(':checked'), id = t.val();
-			if ( id && t.parents('#taxonomy-'+taxonomy).length )
-				$('#in-' + taxonomy + '-' + id + ', #in-popular-' + taxonomy + '-' + id).prop( 'checked', c );
-		});
+		$('#' + taxonomy + 'checklist, #' + taxonomy + 'checklist-pop').on(
+			'click',
+			'li.popular-category > label input[type="checkbox"]',
+			function() {
+				var t = $(this), c = t.is(':checked'), id = t.val();
+				if ( id && t.parents('#taxonomy-'+taxonomy).length )
+					$('#in-' + taxonomy + '-' + id + ', #in-popular-' + taxonomy + '-' + id).prop( 'checked', c );
+			}
+		);
 
 	}); // End cats.
 
@@ -749,11 +760,28 @@ jQuery( function($) {
 				mm = $('#mm').val(), jj = $('#jj').val(), hh = $('#hh').val(), mn = $('#mn').val();
 
 			attemptedDate = new Date( aa, mm - 1, jj, hh, mn );
-			originalDate = new Date( $('#hidden_aa').val(), $('#hidden_mm').val() -1, $('#hidden_jj').val(), $('#hidden_hh').val(), $('#hidden_mn').val() );
-			currentDate = new Date( $('#cur_aa').val(), $('#cur_mm').val() -1, $('#cur_jj').val(), $('#cur_hh').val(), $('#cur_mn').val() );
+			originalDate = new Date(
+				$('#hidden_aa').val(),
+				$('#hidden_mm').val() -1,
+				$('#hidden_jj').val(),
+				$('#hidden_hh').val(),
+				$('#hidden_mn').val()
+			);
+			currentDate = new Date(
+				$('#cur_aa').val(),
+				$('#cur_mm').val() -1,
+				$('#cur_jj').val(),
+				$('#cur_hh').val(),
+				$('#cur_mn').val()
+			);
 
 			// Catch unexpected date problems.
-			if ( attemptedDate.getFullYear() != aa || (1 + attemptedDate.getMonth()) != mm || attemptedDate.getDate() != jj || attemptedDate.getMinutes() != mn ) {
+			if (
+				attemptedDate.getFullYear() != aa ||
+				(1 + attemptedDate.getMonth()) != mm ||
+				attemptedDate.getDate() != jj ||
+				attemptedDate.getMinutes() != mn
+			) {
 				$timestampdiv.find('.timestamp-wrap').addClass('form-invalid');
 				return false;
 			} else {
@@ -820,7 +848,10 @@ jQuery( function($) {
 			);
 
 			// Show or hide the "Save Draft" button.
-			if ( $('option:selected', postStatus).val() == 'private' || $('option:selected', postStatus).val() == 'publish' ) {
+			if (
+				$('option:selected', postStatus).val() == 'private' ||
+				$('option:selected', postStatus).val() == 'publish'
+			) {
 				$('#save-post').hide();
 			} else {
 				$('#save-post').show();
@@ -972,7 +1003,7 @@ jQuery( function($) {
 	 * @return {void}
 	 */
 	function editPermalink() {
-		var i, slug_value,
+		var i, slug_value, slug_label,
 			$el, revert_e,
 			c = 0,
 			real_slug = $('#post_name'),
@@ -994,7 +1025,10 @@ jQuery( function($) {
 		$el = $( '#editable-post-name' );
 		revert_e = $el.html();
 
-		buttons.html( '<button type="button" class="save button button-small">' + __( 'OK' ) + '</button> <button type="button" class="cancel button-link">' + __( 'Cancel' ) + '</button>' );
+		buttons.html(
+			'<button type="button" class="save button button-small">' + __( 'OK' ) + '</button> ' +
+			'<button type="button" class="cancel button-link">' + __( 'Cancel' ) + '</button>'
+		);
 
 		// Save permalink changes.
 		buttons.children( '.save' ).on( 'click', function() {
@@ -1048,8 +1082,12 @@ jQuery( function($) {
 				c++;
 		}
 		slug_value = ( c > full.length / 4 ) ? '' : full;
+		slug_label = __( 'URL Slug' );
 
-		$el.html( '<input type="text" id="new-post-slug" value="' + slug_value + '" autocomplete="off" />' ).children( 'input' ).on( 'keydown', function( e ) {
+		$el.html(
+			'<label for="new-post-slug" class="screen-reader-text">' + slug_label + '</label>' +
+			'<input type="text" id="new-post-slug" value="' + slug_value + '" autocomplete="off" spellcheck="false" />'
+		).children( 'input' ).on( 'keydown', function( e ) {
 			var key = e.which;
 			// On [Enter], just save the new slug, don't save the post.
 			if ( 13 === key ) {
@@ -1223,7 +1261,12 @@ jQuery( function($) {
 	$textarea.on( 'keydown.wp-autosave', function( event ) {
 		// Key [S] has code 83.
 		if ( event.which === 83 ) {
-			if ( event.shiftKey || event.altKey || ( isMac && ( ! event.metaKey || event.ctrlKey ) ) || ( ! isMac && ! event.ctrlKey ) ) {
+			if (
+				event.shiftKey ||
+				event.altKey ||
+				( isMac && ( ! event.metaKey || event.ctrlKey ) ) ||
+				( ! isMac && ! event.ctrlKey )
+			) {
 				return;
 			}
 
diff --git a/src/js/_enqueues/admin/user-profile.js b/src/js/_enqueues/admin/user-profile.js
index c2a403fe38..b379c0abfa 100644
--- a/src/js/_enqueues/admin/user-profile.js
+++ b/src/js/_enqueues/admin/user-profile.js
@@ -43,6 +43,9 @@
 
 		// Once zxcvbn loads, passwords strength is known.
 		$( '#pw-weak-text-label' ).text( __( 'Confirm use of weak password' ) );
+
+		// Focus the password field.
+		$( $pass1 ).trigger( 'focus' );
 	}
 
 	function bindPass1() {
@@ -213,7 +216,7 @@
 			updateLock = true;
 
 			// Make sure the password fields are shown.
-			$generateButton.attr( 'aria-expanded', 'true' );
+			$generateButton.not( '.skip-aria-expanded' ).attr( 'aria-expanded', 'true' );
 			$passwordWrapper
 				.show()
 				.addClass( 'is-open' );
@@ -254,6 +257,8 @@
 
 			// Stop an empty password from being submitted as a change.
 			$submitButtons.prop( 'disabled', false );
+
+			$generateButton.attr( 'aria-expanded', 'false' );
 		} );
 
 		$pass1Row.closest( 'form' ).on( 'submit', function () {
diff --git a/src/js/_enqueues/lib/ajax-response.js b/src/js/_enqueues/lib/ajax-response.js
index 38816f3c38..b764823742 100644
--- a/src/js/_enqueues/lib/ajax-response.js
+++ b/src/js/_enqueues/lib/ajax-response.js
@@ -18,7 +18,7 @@ window.wpAjax = jQuery.extend( {
 		return r;
 	},
 	parseAjaxResponse: function( x, r, e ) { // 1 = good, 0 = strange (bad data?), -1 = you lack permission.
-		var parsed = {}, re = jQuery('#' + r).empty(), err = '';
+		var parsed = {}, re = jQuery('#' + r).empty(), err = '', successmsg = '';
 
 		if ( x && typeof x === 'object' && x.getElementsByTagName('wp_ajax') ) {
 			parsed.responses = [];
@@ -27,6 +27,9 @@ window.wpAjax = jQuery.extend( {
 				var th = jQuery(this), child = jQuery(this.firstChild), response;
 				response = { action: th.attr('action'), what: child.get(0).nodeName, id: child.attr('id'), oldId: child.attr('old_id'), position: child.attr('position') };
 				response.data = jQuery( 'response_data', child ).text();
+				if ( jQuery( 'body' ).hasClass( 'edit-tags-php' ) ) {
+					successmsg += response.data;
+				}
 				response.supplemental = {};
 				if ( !jQuery( 'supplemental', child ).children().each( function() {
 					response.supplemental[this.nodeName] = jQuery(this).text();
@@ -46,7 +49,14 @@ window.wpAjax = jQuery.extend( {
 				} ).length ) { response.errors = false; }
 				parsed.responses.push( response );
 			} );
-			if ( err.length ) { re.html( '<div class="error">' + err + '</div>' ); }
+			if ( err.length ) {
+				re.html( '<div class="error">' + err + '</div>' );
+				wp.a11y.speak( err );
+			} else if ( successmsg.length ) {
+				re.html( '<div class="updated notice is-dismissible"><p>' + successmsg + '</p></div>');
+				jQuery(document).trigger( 'wp-updates-notice-added' );
+				wp.a11y.speak( successmsg );
+			}
 			return parsed;
 		}
 		if ( isNaN(x) ) { return !re.html('<div class="error"><p>' + x + '</p></div>'); }
diff --git a/src/js/_enqueues/lib/embed-template.js b/src/js/_enqueues/lib/embed-template.js
index 86fb7d2c84..ae58e4e967 100644
--- a/src/js/_enqueues/lib/embed-template.js
+++ b/src/js/_enqueues/lib/embed-template.js
@@ -18,6 +18,13 @@
 		}, '*' );
 	}
 
+	/**
+	 * Send the height message to the parent window.
+	 */
+	function sendHeightMessage() {
+		sendEmbedMessage( 'height', Math.ceil( document.body.getBoundingClientRect().height ) );
+	}
+
 	function onLoad() {
 		if ( loaded ) {
 			return;
@@ -138,13 +145,11 @@
 		}
 
 		// Send this document's height to the parent (embedding) site.
-		sendEmbedMessage( 'height', Math.ceil( document.body.getBoundingClientRect().height ) );
+		sendHeightMessage();
 
 		// Send the document's height again after the featured image has been loaded.
 		if ( featured_image ) {
-			featured_image.addEventListener( 'load', function() {
-				sendEmbedMessage( 'height', Math.ceil( document.body.getBoundingClientRect().height ) );
-			} );
+			featured_image.addEventListener( 'load', sendHeightMessage );
 		}
 
 		/**
@@ -184,9 +189,36 @@
 
 		clearTimeout( resizing );
 
-		resizing = setTimeout( function () {
-			sendEmbedMessage( 'height', Math.ceil( document.body.getBoundingClientRect().height ) );
-		}, 100 );
+		resizing = setTimeout( sendHeightMessage, 100 );
+	}
+
+	/**
+	 * Message handler.
+	 *
+	 * @param {MessageEvent} event
+	 */
+	function onMessage( event ) {
+		var data = event.data;
+
+		if ( ! data ) {
+			return;
+		}
+
+		if ( event.source !== window.parent ) {
+			return;
+		}
+
+		if ( ! ( data.secret || data.message ) ) {
+			return;
+		}
+
+		if ( data.secret !== secret ) {
+			return;
+		}
+
+		if ( 'ready' === data.message ) {
+			sendHeightMessage();
+		}
 	}
 
 	/**
@@ -212,5 +244,6 @@
 		document.addEventListener( 'DOMContentLoaded', onLoad, false );
 		window.addEventListener( 'load', onLoad, false );
 		window.addEventListener( 'resize', onResize, false );
+		window.addEventListener( 'message', onMessage, false );
 	}
 })( window, document );
diff --git a/src/js/_enqueues/lib/lists.js b/src/js/_enqueues/lib/lists.js
index aa6796cc0f..70e054fda8 100644
--- a/src/js/_enqueues/lib/lists.js
+++ b/src/js/_enqueues/lib/lists.js
@@ -218,7 +218,7 @@ wpList = {
 	 * Example 1: data-wp-lists="delete:the-comment-list:comment-{comment_ID}:66cc66:unspam=1"
 	 * Example 2: data-wp-lists="dim:the-comment-list:comment-{comment_ID}:unapproved:e7e7d3:e7e7d3:new=approved"
 	 *
-	 * Returns an unassociated array with the following data:
+	 * Returns an unassociative array with the following data:
 	 * data[0] - Data identifier: 'list', 'add', 'delete', or 'dim'.
 	 * data[1] - ID of the corresponding list. If data[0] is 'list', the type of list ('comment', 'category', etc).
 	 * data[2] - ID of the parent element of all inputs necessary for the request.
diff --git a/src/js/_enqueues/lib/nav-menu.js b/src/js/_enqueues/lib/nav-menu.js
index 655d904bc3..7633d92453 100644
--- a/src/js/_enqueues/lib/nav-menu.js
+++ b/src/js/_enqueues/lib/nav-menu.js
@@ -311,7 +311,8 @@
 				nextItemDepth = parseInt( nextItem.menuItemDepth(), 10 ) + 1,
 				prevItem = thisItem.prev(),
 				prevItemDepth = parseInt( prevItem.menuItemDepth(), 10 ),
-				prevItemId = prevItem.getItemData()['menu-item-db-id'];
+				prevItemId = prevItem.getItemData()['menu-item-db-id'],
+				a11ySpeech = menus[ 'moved' + dir.charAt(0).toUpperCase() + dir.slice(1) ];
 
 			switch ( dir ) {
 			case 'up':
@@ -399,6 +400,10 @@
 			api.registerChange();
 			api.refreshKeyboardAccessibility();
 			api.refreshAdvancedAccessibility();
+
+			if ( a11ySpeech ) {
+				wp.a11y.speak( a11ySpeech );
+			}
 		},
 
 		initAccessibility : function() {
@@ -1224,6 +1229,7 @@
 			$menuMarkup.hideAdvancedMenuItemFields().appendTo( api.targetList );
 			api.refreshKeyboardAccessibility();
 			api.refreshAdvancedAccessibility();
+			wp.a11y.speak( menus.itemAdded );
 			$( document ).trigger( 'menu-item-added', [ $menuMarkup ] );
 		},
 
@@ -1239,6 +1245,7 @@
 			$menuMarkup.hideAdvancedMenuItemFields().prependTo( api.targetList );
 			api.refreshKeyboardAccessibility();
 			api.refreshAdvancedAccessibility();
+			wp.a11y.speak( menus.itemAdded );
 			$( document ).trigger( 'menu-item-added', [ $menuMarkup ] );
 		},
 
@@ -1513,6 +1520,7 @@
 						ins.removeClass( 'menu-instructions-inactive' );
 					}
 					api.refreshAdvancedAccessibility();
+					wp.a11y.speak( menus.itemRemoved );
 				});
 		},
 
diff --git a/src/js/_enqueues/vendor/jquery/jquery.color.min.js b/src/js/_enqueues/vendor/jquery/jquery.color.min.js
deleted file mode 100644
index be3fb9ca3c..0000000000
--- a/src/js/_enqueues/vendor/jquery/jquery.color.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! jQuery Color v@2.1.2 with SVG Color Names http://github.com/jquery/jquery-color | jquery.org/license */
-(function(a,b){function m(a,b,c){var d=h[b.type]||{};return a==null?c||!b.def?null:b.def:(a=d.floor?~~a:parseFloat(a),isNaN(a)?b.def:d.mod?(a+d.mod)%d.mod:0>a?0:d.max<a?d.max:a)}function n(b){var c=f(),d=c._rgba=[];return b=b.toLowerCase(),l(e,function(a,e){var f,h=e.re.exec(b),i=h&&e.parse(h),j=e.space||"rgba";if(i)return f=c[j](i),c[g[j].cache]=f[g[j].cache],d=c._rgba=f._rgba,!1}),d.length?(d.join()==="0,0,0,0"&&a.extend(d,k.transparent),c):k[b]}function o(a,b,c){return c=(c+1)%1,c*6<1?a+(b-a)*c*6:c*2<1?b:c*3<2?a+(b-a)*(2/3-c)*6:a}var c="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",d=/^([\-+])=\s*(\d+\.?\d*)/,e=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(a){return[a[1],a[2],a[3],a[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(a){return[a[1]*2.55,a[2]*2.55,a[3]*2.55,a[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(a){return[parseInt(a[1],16),parseInt(a[2],16),parseInt(a[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(a){return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(a){return[a[1],a[2]/100,a[3]/100,a[4]]}}],f=a.Color=function(b,c,d,e){return new a.Color.fn.parse(b,c,d,e)},g={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},h={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},i=f.support={},j=a("<p>")[0],k,l=a.each;j.style.cssText="background-color:rgba(1,1,1,.5)",i.rgba=j.style.backgroundColor.indexOf("rgba")>-1,l(g,function(a,b){b.cache="_"+a,b.props.alpha={idx:3,type:"percent",def:1}}),f.fn=a.extend(f.prototype,{parse:function(c,d,e,h){if(c===b)return this._rgba=[null,null,null,null],this;if(c.jquery||c.nodeType)c=a(c).css(d),d=b;var i=this,j=a.type(c),o=this._rgba=[];d!==b&&(c=[c,d,e,h],j="array");if(j==="string")return this.parse(n(c)||k._default);if(j==="array")return l(g.rgba.props,function(a,b){o[b.idx]=m(c[b.idx],b)}),this;if(j==="object")return c instanceof f?l(g,function(a,b){c[b.cache]&&(i[b.cache]=c[b.cache].slice())}):l(g,function(b,d){var e=d.cache;l(d.props,function(a,b){if(!i[e]&&d.to){if(a==="alpha"||c[a]==null)return;i[e]=d.to(i._rgba)}i[e][b.idx]=m(c[a],b,!0)}),i[e]&&a.inArray(null,i[e].slice(0,3))<0&&(i[e][3]=1,d.from&&(i._rgba=d.from(i[e])))}),this},is:function(a){var b=f(a),c=!0,d=this;return l(g,function(a,e){var f,g=b[e.cache];return g&&(f=d[e.cache]||e.to&&e.to(d._rgba)||[],l(e.props,function(a,b){if(g[b.idx]!=null)return c=g[b.idx]===f[b.idx],c})),c}),c},_space:function(){var a=[],b=this;return l(g,function(c,d){b[d.cache]&&a.push(c)}),a.pop()},transition:function(a,b){var c=f(a),d=c._space(),e=g[d],i=this.alpha()===0?f("transparent"):this,j=i[e.cache]||e.to(i._rgba),k=j.slice();return c=c[e.cache],l(e.props,function(a,d){var e=d.idx,f=j[e],g=c[e],i=h[d.type]||{};if(g===null)return;f===null?k[e]=g:(i.mod&&(g-f>i.mod/2?f+=i.mod:f-g>i.mod/2&&(f-=i.mod)),k[e]=m((g-f)*b+f,d))}),this[d](k)},blend:function(b){if(this._rgba[3]===1)return this;var c=this._rgba.slice(),d=c.pop(),e=f(b)._rgba;return f(a.map(c,function(a,b){return(1-d)*e[b]+d*a}))},toRgbaString:function(){var b="rgba(",c=a.map(this._rgba,function(a,b){return a==null?b>2?1:0:a});return c[3]===1&&(c.pop(),b="rgb("),b+c.join()+")"},toHslaString:function(){var b="hsla(",c=a.map(this.hsla(),function(a,b){return a==null&&(a=b>2?1:0),b&&b<3&&(a=Math.round(a*100)+"%"),a});return c[3]===1&&(c.pop(),b="hsl("),b+c.join()+")"},toHexString:function(b){var c=this._rgba.slice(),d=c.pop();return b&&c.push(~~(d*255)),"#"+a.map(c,function(a){return a=(a||0).toString(16),a.length===1?"0"+a:a}).join("")},toString:function(){return this._rgba[3]===0?"transparent":this.toRgbaString()}}),f.fn.parse.prototype=f.fn,g.hsla.to=function(a){if(a[0]==null||a[1]==null||a[2]==null)return[null,null,null,a[3]];var b=a[0]/255,c=a[1]/255,d=a[2]/255,e=a[3],f=Math.max(b,c,d),g=Math.min(b,c,d),h=f-g,i=f+g,j=i*.5,k,l;return g===f?k=0:b===f?k=60*(c-d)/h+360:c===f?k=60*(d-b)/h+120:k=60*(b-c)/h+240,h===0?l=0:j<=.5?l=h/i:l=h/(2-i),[Math.round(k)%360,l,j,e==null?1:e]},g.hsla.from=function(a){if(a[0]==null||a[1]==null||a[2]==null)return[null,null,null,a[3]];var b=a[0]/360,c=a[1],d=a[2],e=a[3],f=d<=.5?d*(1+c):d+c-d*c,g=2*d-f;return[Math.round(o(g,f,b+1/3)*255),Math.round(o(g,f,b)*255),Math.round(o(g,f,b-1/3)*255),e]},l(g,function(c,e){var g=e.props,h=e.cache,i=e.to,j=e.from;f.fn[c]=function(c){i&&!this[h]&&(this[h]=i(this._rgba));if(c===b)return this[h].slice();var d,e=a.type(c),k=e==="array"||e==="object"?c:arguments,n=this[h].slice();return l(g,function(a,b){var c=k[e==="object"?a:b.idx];c==null&&(c=n[b.idx]),n[b.idx]=m(c,b)}),j?(d=f(j(n)),d[h]=n,d):f(n)},l(g,function(b,e){if(f.fn[b])return;f.fn[b]=function(f){var g=a.type(f),h=b==="alpha"?this._hsla?"hsla":"rgba":c,i=this[h](),j=i[e.idx],k;return g==="undefined"?j:(g==="function"&&(f=f.call(this,j),g=a.type(f)),f==null&&e.empty?this:(g==="string"&&(k=d.exec(f),k&&(f=j+parseFloat(k[2])*(k[1]==="+"?1:-1))),i[e.idx]=f,this[h](i)))}})}),f.hook=function(b){var c=b.split(" ");l(c,function(b,c){a.cssHooks[c]={set:function(b,d){var e,g,h="";if(d!=="transparent"&&(a.type(d)!=="string"||(e=n(d)))){d=f(e||d);if(!i.rgba&&d._rgba[3]!==1){g=c==="backgroundColor"?b.parentNode:b;while((h===""||h==="transparent")&&g&&g.style)try{h=a.css(g,"backgroundColor"),g=g.parentNode}catch(j){}d=d.blend(h&&h!=="transparent"?h:"_default")}d=d.toRgbaString()}try{b.style[c]=d}catch(j){}}},a.fx.step[c]=function(b){b.colorInit||(b.start=f(b.elem,c),b.end=f(b.end),b.colorInit=!0),a.cssHooks[c].set(b.elem,b.start.transition(b.end,b.pos))}})},f.hook(c),a.cssHooks.borderColor={expand:function(a){var b={};return l(["Top","Right","Bottom","Left"],function(c,d){b["border"+d+"Color"]=a}),b}},k=a.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}})(jQuery),jQuery.extend(jQuery.Color.names,{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",blanchedalmond:"#ffebcd",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyan:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",limegreen:"#32cd32",linen:"#faf0e6",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",oldlace:"#fdf5e6",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",steelblue:"#4682b4",tan:"#d2b48c",thistle:"#d8bfd8",tomato:"#ff6347",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",whitesmoke:"#f5f5f5",yellowgreen:"#9acd32"});
\ No newline at end of file
diff --git a/src/js/_enqueues/vendor/jquery/ui/accordion.js b/src/js/_enqueues/vendor/jquery/ui/accordion.js
index 0c1035d82e..f77d2d4ff7 100644
--- a/src/js/_enqueues/vendor/jquery/ui/accordion.js
+++ b/src/js/_enqueues/vendor/jquery/ui/accordion.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Accordion 1.13.0
+ * jQuery UI Accordion 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -37,7 +37,7 @@
 "use strict";
 
 return $.widget( "ui.accordion", {
-	version: "1.13.0",
+	version: "1.13.1",
 	options: {
 		active: 0,
 		animate: {},
@@ -204,24 +204,24 @@ return $.widget( "ui.accordion", {
 			toFocus = false;
 
 		switch ( event.keyCode ) {
-		case keyCode.RIGHT:
-		case keyCode.DOWN:
-			toFocus = this.headers[ ( currentIndex + 1 ) % length ];
-			break;
-		case keyCode.LEFT:
-		case keyCode.UP:
-			toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
-			break;
-		case keyCode.SPACE:
-		case keyCode.ENTER:
-			this._eventHandler( event );
-			break;
-		case keyCode.HOME:
-			toFocus = this.headers[ 0 ];
-			break;
-		case keyCode.END:
-			toFocus = this.headers[ length - 1 ];
-			break;
+			case keyCode.RIGHT:
+			case keyCode.DOWN:
+				toFocus = this.headers[ ( currentIndex + 1 ) % length ];
+				break;
+			case keyCode.LEFT:
+			case keyCode.UP:
+				toFocus = this.headers[ ( currentIndex - 1 + length ) % length ];
+				break;
+			case keyCode.SPACE:
+			case keyCode.ENTER:
+				this._eventHandler( event );
+				break;
+			case keyCode.HOME:
+				toFocus = this.headers[ 0 ];
+				break;
+			case keyCode.END:
+				toFocus = this.headers[ length - 1 ];
+				break;
 		}
 
 		if ( toFocus ) {
@@ -244,15 +244,15 @@ return $.widget( "ui.accordion", {
 
 		// Was collapsed or no panel
 		if ( ( options.active === false && options.collapsible === true ) ||
-				!this.headers.length ) {
+			!this.headers.length ) {
 			options.active = false;
 			this.active = $();
 
-		// active false only when collapsible is true
+			// active false only when collapsible is true
 		} else if ( options.active === false ) {
 			this._activate( 0 );
 
-		// was active, but active panel is gone
+			// was active, but active panel is gone
 		} else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) {
 
 			// all remaining panel are disabled
@@ -260,12 +260,12 @@ return $.widget( "ui.accordion", {
 				options.active = false;
 				this.active = $();
 
-			// activate previous panel
+				// activate previous panel
 			} else {
 				this._activate( Math.max( 0, options.active - 1 ) );
 			}
 
-		// was active, active panel still exists
+			// was active, active panel still exists
 		} else {
 
 			// make sure active index is correct
@@ -322,20 +322,20 @@ return $.widget( "ui.accordion", {
 				panel.attr( "aria-labelledby", headerId );
 			} )
 			.next()
-				.attr( "role", "tabpanel" );
+			.attr( "role", "tabpanel" );
 
 		this.headers
 			.not( this.active )
-				.attr( {
-					"aria-selected": "false",
-					"aria-expanded": "false",
-					tabIndex: -1
-				} )
-				.next()
-					.attr( {
-						"aria-hidden": "true"
-					} )
-					.hide();
+			.attr( {
+				"aria-selected": "false",
+				"aria-expanded": "false",
+				tabIndex: -1
+			} )
+			.next()
+			.attr( {
+				"aria-hidden": "true"
+			} )
+			.hide();
 
 		// Make sure at least one header is in the tab order
 		if ( !this.active.length ) {
@@ -347,9 +347,9 @@ return $.widget( "ui.accordion", {
 				tabIndex: 0
 			} )
 				.next()
-					.attr( {
-						"aria-hidden": "false"
-					} );
+				.attr( {
+					"aria-hidden": "false"
+				} );
 		}
 
 		this._createIcons();
@@ -454,11 +454,11 @@ return $.widget( "ui.accordion", {
 
 		if (
 
-				// click on active header, but not collapsible
-				( clickedIsActive && !options.collapsible ) ||
+			// click on active header, but not collapsible
+			( clickedIsActive && !options.collapsible ) ||
 
-				// allow canceling activation
-				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
+			// allow canceling activation
+			( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
 			return;
 		}
 
@@ -534,11 +534,11 @@ return $.widget( "ui.accordion", {
 		toShow
 			.attr( "aria-hidden", "false" )
 			.prev()
-				.attr( {
-					"aria-selected": "true",
-					"aria-expanded": "true",
-					tabIndex: 0
-				} );
+			.attr( {
+				"aria-selected": "true",
+				"aria-expanded": "true",
+				tabIndex: 0
+			} );
 	},
 
 	_animate: function( toShow, toHide, data ) {
diff --git a/src/js/_enqueues/vendor/jquery/ui/autocomplete.js b/src/js/_enqueues/vendor/jquery/ui/autocomplete.js
index 7116629005..a8cfbfb4aa 100644
--- a/src/js/_enqueues/vendor/jquery/ui/autocomplete.js
+++ b/src/js/_enqueues/vendor/jquery/ui/autocomplete.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Autocomplete 1.13.0
+ * jQuery UI Autocomplete 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -36,7 +36,7 @@
 "use strict";
 
 $.widget( "ui.autocomplete", {
-	version: "1.13.0",
+	version: "1.13.1",
 	defaultElement: "<input>",
 	options: {
 		appendTo: null,
@@ -62,6 +62,7 @@ $.widget( "ui.autocomplete", {
 
 	requestIndex: 0,
 	pending: 0,
+	liveRegionTimer: null,
 
 	_create: function() {
 
@@ -103,58 +104,58 @@ $.widget( "ui.autocomplete", {
 				suppressKeyPressRepeat = false;
 				var keyCode = $.ui.keyCode;
 				switch ( event.keyCode ) {
-				case keyCode.PAGE_UP:
-					suppressKeyPress = true;
-					this._move( "previousPage", event );
-					break;
-				case keyCode.PAGE_DOWN:
-					suppressKeyPress = true;
-					this._move( "nextPage", event );
-					break;
-				case keyCode.UP:
-					suppressKeyPress = true;
-					this._keyEvent( "previous", event );
-					break;
-				case keyCode.DOWN:
-					suppressKeyPress = true;
-					this._keyEvent( "next", event );
-					break;
-				case keyCode.ENTER:
-
-					// when menu is open and has focus
-					if ( this.menu.active ) {
-
-						// #6055 - Opera still allows the keypress to occur
-						// which causes forms to submit
+					case keyCode.PAGE_UP:
 						suppressKeyPress = true;
-						event.preventDefault();
-						this.menu.select( event );
-					}
-					break;
-				case keyCode.TAB:
-					if ( this.menu.active ) {
-						this.menu.select( event );
-					}
-					break;
-				case keyCode.ESCAPE:
-					if ( this.menu.element.is( ":visible" ) ) {
-						if ( !this.isMultiLine ) {
-							this._value( this.term );
+						this._move( "previousPage", event );
+						break;
+					case keyCode.PAGE_DOWN:
+						suppressKeyPress = true;
+						this._move( "nextPage", event );
+						break;
+					case keyCode.UP:
+						suppressKeyPress = true;
+						this._keyEvent( "previous", event );
+						break;
+					case keyCode.DOWN:
+						suppressKeyPress = true;
+						this._keyEvent( "next", event );
+						break;
+					case keyCode.ENTER:
+
+						// when menu is open and has focus
+						if ( this.menu.active ) {
+
+							// #6055 - Opera still allows the keypress to occur
+							// which causes forms to submit
+							suppressKeyPress = true;
+							event.preventDefault();
+							this.menu.select( event );
 						}
-						this.close( event );
-
-						// Different browsers have different default behavior for escape
-						// Single press can mean undo or clear
-						// Double press in IE means clear the whole form
-						event.preventDefault();
-					}
-					break;
-				default:
-					suppressKeyPressRepeat = true;
+						break;
+					case keyCode.TAB:
+						if ( this.menu.active ) {
+							this.menu.select( event );
+						}
+						break;
+					case keyCode.ESCAPE:
+						if ( this.menu.element.is( ":visible" ) ) {
+							if ( !this.isMultiLine ) {
+								this._value( this.term );
+							}
+							this.close( event );
+
+							// Different browsers have different default behavior for escape
+							// Single press can mean undo or clear
+							// Double press in IE means clear the whole form
+							event.preventDefault();
+						}
+						break;
+					default:
+						suppressKeyPressRepeat = true;
 
-					// search timeout should be triggered before the input value is changed
-					this._searchTimeout( event );
-					break;
+						// search timeout should be triggered before the input value is changed
+						this._searchTimeout( event );
+						break;
 				}
 			},
 			keypress: function( event ) {
@@ -172,18 +173,18 @@ $.widget( "ui.autocomplete", {
 				// Replicate some key handlers to allow them to repeat in Firefox and Opera
 				var keyCode = $.ui.keyCode;
 				switch ( event.keyCode ) {
-				case keyCode.PAGE_UP:
-					this._move( "previousPage", event );
-					break;
-				case keyCode.PAGE_DOWN:
-					this._move( "nextPage", event );
-					break;
-				case keyCode.UP:
-					this._keyEvent( "previous", event );
-					break;
-				case keyCode.DOWN:
-					this._keyEvent( "next", event );
-					break;
+					case keyCode.PAGE_UP:
+						this._move( "previousPage", event );
+						break;
+					case keyCode.PAGE_DOWN:
+						this._move( "nextPage", event );
+						break;
+					case keyCode.UP:
+						this._keyEvent( "previous", event );
+						break;
+					case keyCode.DOWN:
+						this._keyEvent( "next", event );
+						break;
 				}
 			},
 			input: function( event ) {
@@ -263,8 +264,10 @@ $.widget( "ui.autocomplete", {
 				// Announce the value in the liveRegion
 				label = ui.item.attr( "aria-label" ) || item.value;
 				if ( label && String.prototype.trim.call( label ).length ) {
-					this.liveRegion.children().hide();
-					$( "<div>" ).text( label ).appendTo( this.liveRegion );
+					clearTimeout( this.liveRegionTimer );
+					this.liveRegionTimer = this._delay( function() {
+						this.liveRegion.html( $( "<div>" ).text( label ) );
+					}, 100 );
 				}
 			},
 			menuselect: function( event, ui ) {
@@ -574,7 +577,7 @@ $.widget( "ui.autocomplete", {
 			return;
 		}
 		if ( this.menu.isFirstItem() && /^previous/.test( direction ) ||
-				this.menu.isLastItem() && /^next/.test( direction ) ) {
+			this.menu.isLastItem() && /^next/.test( direction ) ) {
 
 			if ( !this.isMultiLine ) {
 				this._value( this.term );
@@ -659,8 +662,10 @@ $.widget( "ui.autocomplete", $.ui.autocomplete, {
 		} else {
 			message = this.options.messages.noResults;
 		}
-		this.liveRegion.children().hide();
-		$( "<div>" ).text( message ).appendTo( this.liveRegion );
+		clearTimeout( this.liveRegionTimer );
+		this.liveRegionTimer = this._delay( function() {
+			this.liveRegion.html( $( "<div>" ).text( message ) );
+		}, 100 );
 	}
 } );
 
diff --git a/src/js/_enqueues/vendor/jquery/ui/button.js b/src/js/_enqueues/vendor/jquery/ui/button.js
index cb9c8c0c6b..71013ee4c8 100644
--- a/src/js/_enqueues/vendor/jquery/ui/button.js
+++ b/src/js/_enqueues/vendor/jquery/ui/button.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Button 1.13.0
+ * jQuery UI Button 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -41,7 +41,7 @@
 "use strict";
 
 $.widget( "ui.button", {
-	version: "1.13.0",
+	version: "1.13.1",
 	defaultElement: "<button>",
 	options: {
 		classes: {
@@ -240,8 +240,8 @@ $.widget( "ui.button", {
 
 		// Make sure we can't end up with a button that has neither text nor icon
 		if ( key === "showLabel" ) {
-				this._toggleClass( "ui-button-icon-only", null, !value );
-				this._updateTooltip();
+			this._toggleClass( "ui-button-icon-only", null, !value );
+			this._updateTooltip();
 		}
 
 		if ( key === "label" ) {
@@ -306,7 +306,7 @@ if ( $.uiBackCompat !== false ) {
 				this.options.text = this.options.showLabel;
 			}
 			if ( !this.options.icon && ( this.options.icons.primary ||
-					this.options.icons.secondary ) ) {
+				this.options.icons.secondary ) ) {
 				if ( this.options.icons.primary ) {
 					this.options.icon = this.options.icons.primary;
 				} else {
diff --git a/src/js/_enqueues/vendor/jquery/ui/checkboxradio.js b/src/js/_enqueues/vendor/jquery/ui/checkboxradio.js
index 22e8d03ab7..4033a6c930 100644
--- a/src/js/_enqueues/vendor/jquery/ui/checkboxradio.js
+++ b/src/js/_enqueues/vendor/jquery/ui/checkboxradio.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Checkboxradio 1.13.0
+ * jQuery UI Checkboxradio 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -36,7 +36,7 @@
 "use strict";
 
 $.widget( "ui.checkboxradio", [ $.ui.formResetMixin, {
-	version: "1.13.0",
+	version: "1.13.1",
 	options: {
 		disabled: null,
 		label: null,
diff --git a/src/js/_enqueues/vendor/jquery/ui/controlgroup.js b/src/js/_enqueues/vendor/jquery/ui/controlgroup.js
index 828f032221..0099ca2784 100644
--- a/src/js/_enqueues/vendor/jquery/ui/controlgroup.js
+++ b/src/js/_enqueues/vendor/jquery/ui/controlgroup.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Controlgroup 1.13.0
+ * jQuery UI Controlgroup 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -37,7 +37,7 @@
 var controlgroupCornerRegex = /ui-corner-([a-z]){2,6}/g;
 
 return $.widget( "ui.controlgroup", {
-	version: "1.13.0",
+	version: "1.13.1",
 	defaultElement: "<div>",
 	options: {
 		direction: "horizontal",
diff --git a/src/js/_enqueues/vendor/jquery/ui/core.js b/src/js/_enqueues/vendor/jquery/ui/core.js
index 37ba1bea76..b5be5f9a75 100644
--- a/src/js/_enqueues/vendor/jquery/ui/core.js
+++ b/src/js/_enqueues/vendor/jquery/ui/core.js
@@ -1,4 +1,4 @@
-/*! jQuery UI - v1.13.0 - 2021-10-07
+/*! jQuery UI - v1.13.1 - 2022-01-20
 * http://jqueryui.com
 * Includes: data.js, disable-selection.js, escape-selector.js, focusable.js, form-reset-mixin.js, form.js, ie.js, jquery-1-7.js, keycode.js, labels.js, plugin.js, position.js, safe-active-element.js, safe-blur.js, scroll-parent.js, tabbable.js, unique-id.js, version.js, widget.js
 * Copyright jQuery Foundation and other contributors; Licensed  */
@@ -20,11 +20,11 @@
 // Source: version.js
 $.ui = $.ui || {};
 
-$.ui.version = "1.13.0";
+$.ui.version = "1.13.1";
 
 // Source: data.js
 /*!
- * jQuery UI :data 1.13.0
+ * jQuery UI :data 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -53,7 +53,7 @@ $.extend( $.expr.pseudos, {
 
 // Source: disable-selection.js
 /*!
- * jQuery UI Disable Selection 1.13.0
+ * jQuery UI Disable Selection 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -87,7 +87,7 @@ $.fn.extend( {
 
 // Source: focusable.js
 /*!
- * jQuery UI Focusable 1.13.0
+ * jQuery UI Focusable 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -155,7 +155,6 @@ $.extend( $.expr.pseudos, {
 	}
 } );
 
-// Source: form.js
 // Support: IE8 Only
 // IE8 does not support the form attribute and when it is supplied. It overwrites the form prop
 // with a string, so we need to find the proper form.
@@ -165,7 +164,7 @@ $.fn._form = function() {
 
 // Source: form-reset-mixin.js
 /*!
- * jQuery UI Form Reset Mixin 1.13.0
+ * jQuery UI Form Reset Mixin 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -304,7 +303,7 @@ if ( !$.fn.even || !$.fn.odd ) {
 
 // Source: keycode.js
 /*!
- * jQuery UI Keycode 1.13.0
+ * jQuery UI Keycode 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -338,7 +337,7 @@ $.ui.keyCode = {
 
 // Source: labels.js
 /*!
- * jQuery UI Labels 1.13.0
+ * jQuery UI Labels 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -410,7 +409,7 @@ $.ui.plugin = {
 		}
 
 		if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode ||
-				instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
+			instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
 			return;
 		}
 
@@ -424,7 +423,7 @@ $.ui.plugin = {
 
 // Source: position.js
 /*!
- * jQuery UI Position 1.13.0
+ * jQuery UI Position 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -957,7 +956,7 @@ $.ui.safeBlur = function( element ) {
 
 // Source: scroll-parent.js
 /*!
- * jQuery UI Scroll Parent 1.13.0
+ * jQuery UI Scroll Parent 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -990,7 +989,7 @@ $.fn.scrollParent = function( includeHidden ) {
 
 // Source: tabbable.js
 /*!
- * jQuery UI Tabbable 1.13.0
+ * jQuery UI Tabbable 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -1013,7 +1012,7 @@ $.extend( $.expr.pseudos, {
 
 // Source: unique-id.js
 /*!
- * jQuery UI Unique ID 1.13.0
+ * jQuery UI Unique ID 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -1050,7 +1049,7 @@ $.fn.extend( {
 
 // Source: widget.js
 /*!
- * jQuery UI Widget 1.13.0
+ * jQuery UI Widget 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -1113,7 +1112,7 @@ $.widget = function( name, base, prototype ) {
 	constructor = $[ namespace ][ name ] = function( options, element ) {
 
 		// Allow instantiation without "new" keyword
-		if ( !this._createWidget ) {
+		if ( !this || !this._createWidget ) {
 			return new constructor( options, element );
 		}
 
@@ -1233,7 +1232,7 @@ $.widget.extend = function( target ) {
 						// Don't extend strings, arrays, etc. with objects
 						$.widget.extend( {}, value );
 
-				// Copy everything else by reference
+					// Copy everything else by reference
 				} else {
 					target[ key ] = value;
 				}
@@ -1482,8 +1481,8 @@ $.Widget.prototype = {
 		for ( classKey in value ) {
 			currentElements = this.classesElementLookup[ classKey ];
 			if ( value[ classKey ] === this.options.classes[ classKey ] ||
-					!currentElements ||
-					!currentElements.length ) {
+				!currentElements ||
+				!currentElements.length ) {
 				continue;
 			}
 
@@ -1535,6 +1534,8 @@ $.Widget.prototype = {
 		}, options );
 
 		function bindRemoveEvent() {
+			var nodesToBind = [];
+
 			options.element.each( function( _, element ) {
 				var isTracked = $.map( that.classesElementLookup, function( elements ) {
 					return elements;
@@ -1544,11 +1545,13 @@ $.Widget.prototype = {
 					} );
 
 				if ( !isTracked ) {
-					that._on( $( element ), {
-						remove: "_untrackClassesElement"
-					} );
+					nodesToBind.push( element );
 				}
 			} );
+
+			that._on( $( nodesToBind ), {
+				remove: "_untrackClassesElement"
+			} );
 		}
 
 		function processClassString( classes, checkOption ) {
@@ -1639,7 +1642,7 @@ $.Widget.prototype = {
 				// - disabled as an array instead of boolean
 				// - disabled class as method for disabling individual parts
 				if ( !suppressDisabledCheck &&
-						( instance.options.disabled === true ||
+					( instance.options.disabled === true ||
 						$( this ).hasClass( "ui-state-disabled" ) ) ) {
 					return;
 				}
diff --git a/src/js/_enqueues/vendor/jquery/ui/datepicker.js b/src/js/_enqueues/vendor/jquery/ui/datepicker.js
index 594c0d2ad6..3a05534533 100644
--- a/src/js/_enqueues/vendor/jquery/ui/datepicker.js
+++ b/src/js/_enqueues/vendor/jquery/ui/datepicker.js
@@ -1,6 +1,6 @@
 /* eslint-disable max-len, camelcase */
 /*!
- * jQuery UI Datepicker 1.13.0
+ * jQuery UI Datepicker 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -35,7 +35,7 @@
 } )( function( $ ) {
 "use strict";
 
-$.extend( $.ui, { datepicker: { version: "1.13.0" } } );
+$.extend( $.ui, { datepicker: { version: "1.13.1" } } );
 
 var datepicker_instActive;
 
@@ -107,40 +107,40 @@ function Datepicker() {
 	};
 	this._defaults = { // Global defaults for all the date picker instances
 		showOn: "focus", // "focus" for popup on focus,
-			// "button" for trigger button, or "both" for either
+		// "button" for trigger button, or "both" for either
 		showAnim: "fadeIn", // Name of jQuery animation for popup
 		showOptions: {}, // Options for enhanced animations
 		defaultDate: null, // Used when field is blank: actual date,
-			// +/-number for offset from today, null for today
+		// +/-number for offset from today, null for today
 		appendText: "", // Display text following the input box, e.g. showing the format
 		buttonText: "...", // Text for trigger button
 		buttonImage: "", // URL for trigger button image
 		buttonImageOnly: false, // True if the image appears alone, false if it appears on a button
 		hideIfNoPrevNext: false, // True to hide next/previous month links
-			// if not applicable, false to just disable them
+		// if not applicable, false to just disable them
 		navigationAsDateFormat: false, // True if date formatting applied to prev/today/next links
 		gotoCurrent: false, // True if today link goes back to current selection instead
 		changeMonth: false, // True if month can be selected directly, false if only prev/next
 		changeYear: false, // True if year can be selected directly, false if only prev/next
 		yearRange: "c-10:c+10", // Range of years to display in drop-down,
-			// either relative to today's year (-nn:+nn), relative to currently displayed year
-			// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
+		// either relative to today's year (-nn:+nn), relative to currently displayed year
+		// (c-nn:c+nn), absolute (nnnn:nnnn), or a combination of the above (nnnn:-n)
 		showOtherMonths: false, // True to show dates in other months, false to leave blank
 		selectOtherMonths: false, // True to allow selection of dates in other months, false for unselectable
 		showWeek: false, // True to show week of the year, false to not show it
 		calculateWeek: this.iso8601Week, // How to calculate the week of the year,
-			// takes a Date and returns the number of the week for it
+		// takes a Date and returns the number of the week for it
 		shortYearCutoff: "+10", // Short year values < this are in the current century,
-			// > this are in the previous century,
-			// string value starting with "+" for current year + value
+		// > this are in the previous century,
+		// string value starting with "+" for current year + value
 		minDate: null, // The earliest selectable date, or null for no limit
 		maxDate: null, // The latest selectable date, or null for no limit
 		duration: "fast", // Duration of display/closure
 		beforeShowDay: null, // Function that takes a date and returns an array with
-			// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
-			// [2] = cell title (optional), e.g. $.datepicker.noWeekends
+		// [0] = true if selectable, false if not, [1] = custom CSS class name(s) or "",
+		// [2] = cell title (optional), e.g. $.datepicker.noWeekends
 		beforeShow: null, // Function that takes an input field and
-			// returns a set of custom settings for the date picker
+		// returns a set of custom settings for the date picker
 		onSelect: null, // Define a callback function when a date is selected
 		onChangeMonthYear: null, // Define a callback function when the month or year is changed
 		onClose: null, // Define a callback function when the datepicker is closed
@@ -213,7 +213,7 @@ $.extend( Datepicker.prototype, {
 			drawMonth: 0, drawYear: 0, // month being drawn
 			inline: inline, // is datepicker inline or not
 			dpDiv: ( !inline ? this.dpDiv : // presentation div
-			datepicker_bindHover( $( "<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) ) ) };
+				datepicker_bindHover( $( "<div class='" + this._inlineClass + " ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all'></div>" ) ) ) };
 	},
 
 	/* Attach the date picker to an input field. */
@@ -226,7 +226,7 @@ $.extend( Datepicker.prototype, {
 		}
 		this._attachments( input, inst );
 		input.addClass( this.markerClassName ).on( "keydown", this._doKeyDown ).
-			on( "keypress", this._doKeyPress ).on( "keyup", this._doKeyUp );
+		on( "keypress", this._doKeyPress ).on( "keyup", this._doKeyUp );
 		this._autoSize( inst );
 		$.data( target, "datepicker", inst );
 
@@ -426,10 +426,10 @@ $.extend( Datepicker.prototype, {
 			inst.append.remove();
 			inst.trigger.remove();
 			$target.removeClass( this.markerClassName ).
-				off( "focus", this._showDatepicker ).
-				off( "keydown", this._doKeyDown ).
-				off( "keypress", this._doKeyPress ).
-				off( "keyup", this._doKeyUp );
+			off( "focus", this._showDatepicker ).
+			off( "keydown", this._doKeyDown ).
+			off( "keypress", this._doKeyPress ).
+			off( "keyup", this._doKeyUp );
 		} else if ( nodeName === "div" || nodeName === "span" ) {
 			$target.removeClass( this.markerClassName ).empty();
 		}
@@ -456,15 +456,15 @@ $.extend( Datepicker.prototype, {
 		if ( nodeName === "input" ) {
 			target.disabled = false;
 			inst.trigger.filter( "button" ).
-				each( function() {
-					this.disabled = false;
-				} ).end().
-				filter( "img" ).css( { opacity: "1.0", cursor: "" } );
+			each( function() {
+				this.disabled = false;
+			} ).end().
+			filter( "img" ).css( { opacity: "1.0", cursor: "" } );
 		} else if ( nodeName === "div" || nodeName === "span" ) {
 			inline = $target.children( "." + this._inlineClass );
 			inline.children().removeClass( "ui-state-disabled" );
 			inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
-				prop( "disabled", false );
+			prop( "disabled", false );
 		}
 		this._disabledInputs = $.map( this._disabledInputs,
 
@@ -490,15 +490,15 @@ $.extend( Datepicker.prototype, {
 		if ( nodeName === "input" ) {
 			target.disabled = true;
 			inst.trigger.filter( "button" ).
-				each( function() {
-					this.disabled = true;
-				} ).end().
-				filter( "img" ).css( { opacity: "0.5", cursor: "default" } );
+			each( function() {
+				this.disabled = true;
+			} ).end().
+			filter( "img" ).css( { opacity: "0.5", cursor: "default" } );
 		} else if ( nodeName === "div" || nodeName === "span" ) {
 			inline = $target.children( "." + this._inlineClass );
 			inline.children().addClass( "ui-state-disabled" );
 			inline.find( "select.ui-datepicker-month, select.ui-datepicker-year" ).
-				prop( "disabled", true );
+			prop( "disabled", true );
 		}
 		this._disabledInputs = $.map( this._disabledInputs,
 
@@ -554,7 +554,7 @@ $.extend( Datepicker.prototype, {
 		if ( arguments.length === 2 && typeof name === "string" ) {
 			return ( name === "defaults" ? $.extend( {}, $.datepicker._defaults ) :
 				( inst ? ( name === "all" ? $.extend( {}, inst.settings ) :
-				this._get( inst, name ) ) : null ) );
+					this._get( inst, name ) ) : null ) );
 		}
 
 		settings = name || {};
@@ -647,83 +647,83 @@ $.extend( Datepicker.prototype, {
 		if ( $.datepicker._datepickerShowing ) {
 			switch ( event.keyCode ) {
 				case 9: $.datepicker._hideDatepicker();
-						handled = false;
-						break; // hide on tab out
+					handled = false;
+					break; // hide on tab out
 				case 13: sel = $( "td." + $.datepicker._dayOverClass + ":not(." +
-									$.datepicker._currentClass + ")", inst.dpDiv );
-						if ( sel[ 0 ] ) {
-							$.datepicker._selectDay( event.target, inst.selectedMonth, inst.selectedYear, sel[ 0 ] );
-						}
+					$.datepicker._currentClass + ")", inst.dpDiv );
+					if ( sel[ 0 ] ) {
+						$.datepicker._selectDay( event.target, inst.selectedMonth, inst.selectedYear, sel[ 0 ] );
+					}
 
-						onSelect = $.datepicker._get( inst, "onSelect" );
-						if ( onSelect ) {
-							dateStr = $.datepicker._formatDate( inst );
+					onSelect = $.datepicker._get( inst, "onSelect" );
+					if ( onSelect ) {
+						dateStr = $.datepicker._formatDate( inst );
 
-							// Trigger custom callback
-							onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );
-						} else {
-							$.datepicker._hideDatepicker();
-						}
+						// Trigger custom callback
+						onSelect.apply( ( inst.input ? inst.input[ 0 ] : null ), [ dateStr, inst ] );
+					} else {
+						$.datepicker._hideDatepicker();
+					}
 
-						return false; // don't submit the form
+					return false; // don't submit the form
 				case 27: $.datepicker._hideDatepicker();
-						break; // hide on escape
+					break; // hide on escape
 				case 33: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
-							-$.datepicker._get( inst, "stepBigMonths" ) :
-							-$.datepicker._get( inst, "stepMonths" ) ), "M" );
-						break; // previous month/year on page up/+ ctrl
+					-$.datepicker._get( inst, "stepBigMonths" ) :
+					-$.datepicker._get( inst, "stepMonths" ) ), "M" );
+					break; // previous month/year on page up/+ ctrl
 				case 34: $.datepicker._adjustDate( event.target, ( event.ctrlKey ?
-							+$.datepicker._get( inst, "stepBigMonths" ) :
-							+$.datepicker._get( inst, "stepMonths" ) ), "M" );
-						break; // next month/year on page down/+ ctrl
+					+$.datepicker._get( inst, "stepBigMonths" ) :
+					+$.datepicker._get( inst, "stepMonths" ) ), "M" );
+					break; // next month/year on page down/+ ctrl
 				case 35: if ( event.ctrlKey || event.metaKey ) {
-							$.datepicker._clearDate( event.target );
-						}
-						handled = event.ctrlKey || event.metaKey;
-						break; // clear on ctrl or command +end
+					$.datepicker._clearDate( event.target );
+				}
+					handled = event.ctrlKey || event.metaKey;
+					break; // clear on ctrl or command +end
 				case 36: if ( event.ctrlKey || event.metaKey ) {
-							$.datepicker._gotoToday( event.target );
-						}
-						handled = event.ctrlKey || event.metaKey;
-						break; // current on ctrl or command +home
+					$.datepicker._gotoToday( event.target );
+				}
+					handled = event.ctrlKey || event.metaKey;
+					break; // current on ctrl or command +home
 				case 37: if ( event.ctrlKey || event.metaKey ) {
-							$.datepicker._adjustDate( event.target, ( isRTL ? +1 : -1 ), "D" );
-						}
-						handled = event.ctrlKey || event.metaKey;
+					$.datepicker._adjustDate( event.target, ( isRTL ? +1 : -1 ), "D" );
+				}
+					handled = event.ctrlKey || event.metaKey;
 
-						// -1 day on ctrl or command +left
-						if ( event.originalEvent.altKey ) {
-							$.datepicker._adjustDate( event.target, ( event.ctrlKey ?
-								-$.datepicker._get( inst, "stepBigMonths" ) :
-								-$.datepicker._get( inst, "stepMonths" ) ), "M" );
-						}
+					// -1 day on ctrl or command +left
+					if ( event.originalEvent.altKey ) {
+						$.datepicker._adjustDate( event.target, ( event.ctrlKey ?
+							-$.datepicker._get( inst, "stepBigMonths" ) :
+							-$.datepicker._get( inst, "stepMonths" ) ), "M" );
+					}
 
-						// next month/year on alt +left on Mac
-						break;
+					// next month/year on alt +left on Mac
+					break;
 				case 38: if ( event.ctrlKey || event.metaKey ) {
-							$.datepicker._adjustDate( event.target, -7, "D" );
-						}
-						handled = event.ctrlKey || event.metaKey;
-						break; // -1 week on ctrl or command +up
+					$.datepicker._adjustDate( event.target, -7, "D" );
+				}
+					handled = event.ctrlKey || event.metaKey;
+					break; // -1 week on ctrl or command +up
 				case 39: if ( event.ctrlKey || event.metaKey ) {
-							$.datepicker._adjustDate( event.target, ( isRTL ? -1 : +1 ), "D" );
-						}
-						handled = event.ctrlKey || event.metaKey;
+					$.datepicker._adjustDate( event.target, ( isRTL ? -1 : +1 ), "D" );
+				}
+					handled = event.ctrlKey || event.metaKey;
 
-						// +1 day on ctrl or command +right
-						if ( event.originalEvent.altKey ) {
-							$.datepicker._adjustDate( event.target, ( event.ctrlKey ?
-								+$.datepicker._get( inst, "stepBigMonths" ) :
-								+$.datepicker._get( inst, "stepMonths" ) ), "M" );
-						}
+					// +1 day on ctrl or command +right
+					if ( event.originalEvent.altKey ) {
+						$.datepicker._adjustDate( event.target, ( event.ctrlKey ?
+							+$.datepicker._get( inst, "stepBigMonths" ) :
+							+$.datepicker._get( inst, "stepMonths" ) ), "M" );
+					}
 
-						// next month/year on alt +right
-						break;
+					// next month/year on alt +right
+					break;
 				case 40: if ( event.ctrlKey || event.metaKey ) {
-							$.datepicker._adjustDate( event.target, +7, "D" );
-						}
-						handled = event.ctrlKey || event.metaKey;
-						break; // +1 week on ctrl or command +down
+					$.datepicker._adjustDate( event.target, +7, "D" );
+				}
+					handled = event.ctrlKey || event.metaKey;
+					break; // +1 week on ctrl or command +down
 				default: handled = false;
 			}
 		} else if ( event.keyCode === 36 && event.ctrlKey ) { // display the date picker on ctrl+home
@@ -837,7 +837,7 @@ $.extend( Datepicker.prototype, {
 		// and adjust position before showing
 		offset = $.datepicker._checkOffset( inst, offset, isFixed );
 		inst.dpDiv.css( { position: ( $.datepicker._inDialog && $.blockUI ?
-			"static" : ( isFixed ? "fixed" : "absolute" ) ), display: "none",
+				"static" : ( isFixed ? "fixed" : "absolute" ) ), display: "none",
 			left: offset.left + "px", top: offset.top + "px" } );
 
 		if ( !inst.inline ) {
@@ -883,9 +883,9 @@ $.extend( Datepicker.prototype, {
 			inst.dpDiv.addClass( "ui-datepicker-multi-" + cols ).css( "width", ( width * cols ) + "em" );
 		}
 		inst.dpDiv[ ( numMonths[ 0 ] !== 1 || numMonths[ 1 ] !== 1 ? "add" : "remove" ) +
-			"Class" ]( "ui-datepicker-multi" );
+		"Class" ]( "ui-datepicker-multi" );
 		inst.dpDiv[ ( this._get( inst, "isRTL" ) ? "add" : "remove" ) +
-			"Class" ]( "ui-datepicker-rtl" );
+		"Class" ]( "ui-datepicker-rtl" );
 
 		if ( inst === $.datepicker._curInst && $.datepicker._datepickerShowing && $.datepicker._shouldFocusInput( inst ) ) {
 			inst.input.trigger( "focus" );
@@ -1020,7 +1020,7 @@ $.extend( Datepicker.prototype, {
 				!$target.closest( "." + $.datepicker._triggerClass ).length &&
 				$.datepicker._datepickerShowing && !( $.datepicker._inDialog && $.blockUI ) ) ) ||
 			( $target.hasClass( $.datepicker.markerClassName ) && $.datepicker._curInst !== inst ) ) {
-				$.datepicker._hideDatepicker();
+			$.datepicker._hideDatepicker();
 		}
 	},
 
@@ -1062,8 +1062,8 @@ $.extend( Datepicker.prototype, {
 			inst = this._getInst( target[ 0 ] );
 
 		inst[ "selected" + ( period === "M" ? "Month" : "Year" ) ] =
-		inst[ "draw" + ( period === "M" ? "Month" : "Year" ) ] =
-			parseInt( select.options[ select.selectedIndex ].value, 10 );
+			inst[ "draw" + ( period === "M" ? "Month" : "Year" ) ] =
+				parseInt( select.options[ select.selectedIndex ].value, 10 );
 
 		this._notifyChange( inst );
 		this._adjustDate( target );
@@ -1214,7 +1214,7 @@ $.extend( Datepicker.prototype, {
 			getNumber = function( match ) {
 				var isDoubled = lookAhead( match ),
 					size = ( match === "@" ? 14 : ( match === "!" ? 20 :
-					( match === "y" && isDoubled ? 4 : ( match === "o" ? 3 : 2 ) ) ) ),
+						( match === "y" && isDoubled ? 4 : ( match === "o" ? 3 : 2 ) ) ) ),
 					minSize = ( match === "y" ? size : 1 ),
 					digits = new RegExp( "^\\d{" + minSize + "," + size + "}" ),
 					num = value.substring( iValue ).match( digits );
@@ -1577,7 +1577,7 @@ $.extend( Datepicker.prototype, {
 				}
 
 				var date = ( offset.toLowerCase().match( /^c/ ) ?
-					$.datepicker._getDate( inst ) : null ) || new Date(),
+						$.datepicker._getDate( inst ) : null ) || new Date(),
 					year = date.getFullYear(),
 					month = date.getMonth(),
 					day = date.getDate(),
@@ -1654,8 +1654,8 @@ $.extend( Datepicker.prototype, {
 	_getDate: function( inst ) {
 		var startDate = ( !inst.currentYear || ( inst.input && inst.input.val() === "" ) ? null :
 			this._daylightSavingAdjust( new Date(
-			inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
-			return startDate;
+				inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
+		return startDate;
 	},
 
 	/* Attach the onxxx handlers.  These are declared statically so
@@ -1882,7 +1882,7 @@ $.extend( Datepicker.prototype, {
 					( /all|left/.test( cornerClass ) && row === 0 ? ( isRTL ? next : prev ) : "" ) +
 					( /all|right/.test( cornerClass ) && row === 0 ? ( isRTL ? prev : next ) : "" ) +
 					this._generateMonthYearHeader( inst, drawMonth, drawYear, minDate, maxDate,
-					row > 0 || col > 0, monthNames, monthNamesShort ) + // draw month headers
+						row > 0 || col > 0, monthNames, monthNamesShort ) + // draw month headers
 					"</div><table class='ui-datepicker-calendar'><thead>" +
 					"<tr>";
 				thead = ( showWeek ? "<th class='ui-datepicker-week-col'>" + this._get( inst, "weekHeader" ) + "</th>" : "" );
@@ -1917,22 +1917,22 @@ $.extend( Datepicker.prototype, {
 							( ( printDate.getTime() === selectedDate.getTime() && drawMonth === inst.selectedMonth && inst._keyEvent ) || // user pressed key
 							( defaultDate.getTime() === printDate.getTime() && defaultDate.getTime() === selectedDate.getTime() ) ?
 
-							// or defaultDate is current printedDate and defaultDate is selectedDate
-							" " + this._dayOverClass : "" ) + // highlight selected day
+								// or defaultDate is current printedDate and defaultDate is selectedDate
+								" " + this._dayOverClass : "" ) + // highlight selected day
 							( unselectable ? " " + this._unselectableClass + " ui-state-disabled" : "" ) +  // highlight unselectable days
 							( otherMonth && !showOtherMonths ? "" : " " + daySettings[ 1 ] + // highlight custom dates
-							( printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "" ) + // highlight selected day
-							( printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "" ) ) + "'" + // highlight today (if different)
+								( printDate.getTime() === currentDate.getTime() ? " " + this._currentClass : "" ) + // highlight selected day
+								( printDate.getTime() === today.getTime() ? " ui-datepicker-today" : "" ) ) + "'" + // highlight today (if different)
 							( ( !otherMonth || showOtherMonths ) && daySettings[ 2 ] ? " title='" + daySettings[ 2 ].replace( /'/g, "&#39;" ) + "'" : "" ) + // cell title
 							( unselectable ? "" : " data-handler='selectDay' data-event='click' data-month='" + printDate.getMonth() + "' data-year='" + printDate.getFullYear() + "'" ) + ">" + // actions
 							( otherMonth && !showOtherMonths ? "&#xa0;" : // display for other months
-							( unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
-							( printDate.getTime() === today.getTime() ? " ui-state-highlight" : "" ) +
-							( printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "" ) + // highlight selected day
-							( otherMonth ? " ui-priority-secondary" : "" ) + // distinguish dates from other months
-							"' href='#' aria-current='" + ( printDate.getTime() === currentDate.getTime() ? "true" : "false" ) + // mark date as selected for screen reader
-							"' data-date='" + printDate.getDate() + // store date as data
-							"'>" + printDate.getDate() + "</a>" ) ) + "</td>"; // display selectable date
+								( unselectable ? "<span class='ui-state-default'>" + printDate.getDate() + "</span>" : "<a class='ui-state-default" +
+									( printDate.getTime() === today.getTime() ? " ui-state-highlight" : "" ) +
+									( printDate.getTime() === currentDate.getTime() ? " ui-state-active" : "" ) + // highlight selected day
+									( otherMonth ? " ui-priority-secondary" : "" ) + // distinguish dates from other months
+									"' href='#' aria-current='" + ( printDate.getTime() === currentDate.getTime() ? "true" : "false" ) + // mark date as selected for screen reader
+									"' data-date='" + printDate.getDate() + // store date as data
+									"'>" + printDate.getDate() + "</a>" ) ) + "</td>"; // display selectable date
 						printDate.setDate( printDate.getDate() + 1 );
 						printDate = this._daylightSavingAdjust( printDate );
 					}
@@ -1944,7 +1944,7 @@ $.extend( Datepicker.prototype, {
 					drawYear++;
 				}
 				calender += "</tbody></table>" + ( isMultiMonth ? "</div>" +
-							( ( numMonths[ 0 ] > 0 && col === numMonths[ 1 ] - 1 ) ? "<div class='ui-datepicker-row-break'></div>" : "" ) : "" );
+					( ( numMonths[ 0 ] > 0 && col === numMonths[ 1 ] - 1 ) ? "<div class='ui-datepicker-row-break'></div>" : "" ) : "" );
 				group += calender;
 			}
 			html += group;
@@ -1956,7 +1956,7 @@ $.extend( Datepicker.prototype, {
 
 	/* Generate the month and year header. */
 	_generateMonthYearHeader: function( inst, drawMonth, drawYear, minDate, maxDate,
-			secondary, monthNames, monthNamesShort ) {
+										secondary, monthNames, monthNamesShort ) {
 
 		var inMinYear, inMaxYear, month, years, thisYear, determineYear, year, endYear,
 			changeMonth = this._get( inst, "changeMonth" ),
@@ -2001,7 +2001,7 @@ $.extend( Datepicker.prototype, {
 				determineYear = function( value ) {
 					var year = ( value.match( /c[+\-].*/ ) ? drawYear + parseInt( value.substring( 1 ), 10 ) :
 						( value.match( /[+\-].*/ ) ? thisYear + parseInt( value, 10 ) :
-						parseInt( value, 10 ) ) );
+							parseInt( value, 10 ) ) );
 					return ( isNaN( year ) ? thisYear : year );
 				};
 				year = determineYear( years[ 0 ] );
@@ -2086,7 +2086,7 @@ $.extend( Datepicker.prototype, {
 	_canAdjustMonth: function( inst, offset, curYear, curMonth ) {
 		var numMonths = this._getNumberOfMonths( inst ),
 			date = this._daylightSavingAdjust( new Date( curYear,
-			curMonth + ( offset < 0 ? offset : numMonths[ 0 ] * numMonths[ 1 ] ), 1 ) );
+				curMonth + ( offset < 0 ? offset : numMonths[ 0 ] * numMonths[ 1 ] ), 1 ) );
 
 		if ( offset < 0 ) {
 			date.setDate( this._getDaysInMonth( date.getFullYear(), date.getMonth() ) );
@@ -2102,18 +2102,18 @@ $.extend( Datepicker.prototype, {
 			minYear = null,
 			maxYear = null,
 			years = this._get( inst, "yearRange" );
-			if ( years ) {
-				yearSplit = years.split( ":" );
-				currentYear = new Date().getFullYear();
-				minYear = parseInt( yearSplit[ 0 ], 10 );
-				maxYear = parseInt( yearSplit[ 1 ], 10 );
-				if ( yearSplit[ 0 ].match( /[+\-].*/ ) ) {
-					minYear += currentYear;
-				}
-				if ( yearSplit[ 1 ].match( /[+\-].*/ ) ) {
-					maxYear += currentYear;
-				}
+		if ( years ) {
+			yearSplit = years.split( ":" );
+			currentYear = new Date().getFullYear();
+			minYear = parseInt( yearSplit[ 0 ], 10 );
+			maxYear = parseInt( yearSplit[ 1 ], 10 );
+			if ( yearSplit[ 0 ].match( /[+\-].*/ ) ) {
+				minYear += currentYear;
 			}
+			if ( yearSplit[ 1 ].match( /[+\-].*/ ) ) {
+				maxYear += currentYear;
+			}
+		}
 
 		return ( ( !minDate || date.getTime() >= minDate.getTime() ) &&
 			( !maxDate || date.getTime() <= maxDate.getTime() ) &&
@@ -2139,7 +2139,7 @@ $.extend( Datepicker.prototype, {
 			inst.currentYear = inst.selectedYear;
 		}
 		var date = ( day ? ( typeof day === "object" ? day :
-			this._daylightSavingAdjust( new Date( year, month, day ) ) ) :
+				this._daylightSavingAdjust( new Date( year, month, day ) ) ) :
 			this._daylightSavingAdjust( new Date( inst.currentYear, inst.currentMonth, inst.currentDay ) ) );
 		return this.formatDate( this._get( inst, "dateFormat" ), date, this._getFormatConfig( inst ) );
 	}
@@ -2153,14 +2153,14 @@ $.extend( Datepicker.prototype, {
 function datepicker_bindHover( dpDiv ) {
 	var selector = "button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";
 	return dpDiv.on( "mouseout", selector, function() {
-			$( this ).removeClass( "ui-state-hover" );
-			if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
-				$( this ).removeClass( "ui-datepicker-prev-hover" );
-			}
-			if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
-				$( this ).removeClass( "ui-datepicker-next-hover" );
-			}
-		} )
+		$( this ).removeClass( "ui-state-hover" );
+		if ( this.className.indexOf( "ui-datepicker-prev" ) !== -1 ) {
+			$( this ).removeClass( "ui-datepicker-prev-hover" );
+		}
+		if ( this.className.indexOf( "ui-datepicker-next" ) !== -1 ) {
+			$( this ).removeClass( "ui-datepicker-next-hover" );
+		}
+	} )
 		.on( "mouseover", selector, datepicker_handleMouseover );
 }
 
@@ -2213,11 +2213,11 @@ $.fn.datepicker = function( options ) {
 	var otherArgs = Array.prototype.slice.call( arguments, 1 );
 	if ( typeof options === "string" && ( options === "isDisabled" || options === "getDate" || options === "widget" ) ) {
 		return $.datepicker[ "_" + options + "Datepicker" ].
-			apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
+		apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
 	}
 	if ( options === "option" && arguments.length === 2 && typeof arguments[ 1 ] === "string" ) {
 		return $.datepicker[ "_" + options + "Datepicker" ].
-			apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
+		apply( $.datepicker, [ this[ 0 ] ].concat( otherArgs ) );
 	}
 	return this.each( function() {
 		if ( typeof options === "string" ) {
@@ -2232,7 +2232,7 @@ $.fn.datepicker = function( options ) {
 $.datepicker = new Datepicker(); // singleton instance
 $.datepicker.initialized = false;
 $.datepicker.uuid = new Date().getTime();
-$.datepicker.version = "1.13.0";
+$.datepicker.version = "1.13.1";
 
 return $.datepicker;
 
diff --git a/src/js/_enqueues/vendor/jquery/ui/dialog.js b/src/js/_enqueues/vendor/jquery/ui/dialog.js
index 4d6483746d..7687bc0f03 100644
--- a/src/js/_enqueues/vendor/jquery/ui/dialog.js
+++ b/src/js/_enqueues/vendor/jquery/ui/dialog.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Dialog 1.13.0
+ * jQuery UI Dialog 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -39,7 +39,7 @@
 "use strict";
 
 $.widget( "ui.dialog", {
-	version: "1.13.0",
+	version: "1.13.1",
 	options: {
 		appendTo: "body",
 		autoOpen: true,
@@ -354,7 +354,7 @@ $.widget( "ui.dialog", {
 		this._on( this.uiDialog, {
 			keydown: function( event ) {
 				if ( this.options.closeOnEscape && !event.isDefaultPrevented() && event.keyCode &&
-						event.keyCode === $.ui.keyCode.ESCAPE ) {
+					event.keyCode === $.ui.keyCode.ESCAPE ) {
 					event.preventDefault();
 					this.close( event );
 					return;
@@ -369,13 +369,13 @@ $.widget( "ui.dialog", {
 					last = tabbables.last();
 
 				if ( ( event.target === last[ 0 ] || event.target === this.uiDialog[ 0 ] ) &&
-						!event.shiftKey ) {
+					!event.shiftKey ) {
 					this._delay( function() {
 						first.trigger( "focus" );
 					} );
 					event.preventDefault();
 				} else if ( ( event.target === first[ 0 ] ||
-						event.target === this.uiDialog[ 0 ] ) && event.shiftKey ) {
+					event.target === this.uiDialog[ 0 ] ) && event.shiftKey ) {
 					this._delay( function() {
 						last.trigger( "focus" );
 					} );
diff --git a/src/js/_enqueues/vendor/jquery/ui/draggable.js b/src/js/_enqueues/vendor/jquery/ui/draggable.js
index 63875f0c59..91327578ad 100644
--- a/src/js/_enqueues/vendor/jquery/ui/draggable.js
+++ b/src/js/_enqueues/vendor/jquery/ui/draggable.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Draggable 1.13.0
+ * jQuery UI Draggable 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -34,7 +34,7 @@
 "use strict";
 
 $.widget( "ui.draggable", $.ui.mouse, {
-	version: "1.13.0",
+	version: "1.13.1",
 	widgetEventPrefix: "drag",
 	options: {
 		addClasses: true,
@@ -102,7 +102,7 @@ $.widget( "ui.draggable", $.ui.mouse, {
 
 		// Among others, prevent a drag on a resizable-handle
 		if ( this.helper || o.disabled ||
-				$( event.target ).closest( ".ui-resizable-handle" ).length > 0 ) {
+			$( event.target ).closest( ".ui-resizable-handle" ).length > 0 ) {
 			return false;
 		}
 
@@ -185,8 +185,8 @@ $.widget( "ui.draggable", $.ui.mouse, {
 		this.scrollParent = this.helper.scrollParent( true );
 		this.offsetParent = this.helper.offsetParent();
 		this.hasFixedAncestor = this.helper.parents().filter( function() {
-				return $( this ).css( "position" ) === "fixed";
-			} ).length > 0;
+			return $( this ).css( "position" ) === "fixed";
+		} ).length > 0;
 
 		//The element's absolute position on the page minus margins
 		this.positionAbs = this.element.offset();
@@ -294,8 +294,8 @@ $.widget( "ui.draggable", $.ui.mouse, {
 		}
 
 		if ( ( this.options.revert === "invalid" && !dropped ) ||
-				( this.options.revert === "valid" && dropped ) ||
-				this.options.revert === true || ( typeof this.options.revert === "function" &&
+			( this.options.revert === "valid" && dropped ) ||
+			this.options.revert === true || ( typeof this.options.revert === "function" &&
 				this.options.revert.call( this.element, dropped ) )
 		) {
 			$( this.helper ).animate(
@@ -388,7 +388,7 @@ $.widget( "ui.draggable", $.ui.mouse, {
 		}
 
 		if ( helper[ 0 ] !== this.element[ 0 ] &&
-				!( /(fixed|absolute)/ ).test( helper.css( "position" ) ) ) {
+			!( /(fixed|absolute)/ ).test( helper.css( "position" ) ) ) {
 			helper.css( "position", "absolute" );
 		}
 
@@ -441,7 +441,7 @@ $.widget( "ui.draggable", $.ui.mouse, {
 		// the document, which means that the scroll is included in the initial calculation of the
 		// offset of the parent, and never recalculated upon drag
 		if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== document &&
-				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
+			$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
 			po.left += this.scrollParent.scrollLeft();
 			po.top += this.scrollParent.scrollTop();
 		}
@@ -508,10 +508,10 @@ $.widget( "ui.draggable", $.ui.mouse, {
 				$( window ).scrollLeft() - this.offset.relative.left - this.offset.parent.left,
 				$( window ).scrollTop() - this.offset.relative.top - this.offset.parent.top,
 				$( window ).scrollLeft() + $( window ).width() -
-					this.helperProportions.width - this.margins.left,
+				this.helperProportions.width - this.margins.left,
 				$( window ).scrollTop() +
-					( $( window ).height() || document.body.parentNode.scrollHeight ) -
-					this.helperProportions.height - this.margins.top
+				( $( window ).height() || document.body.parentNode.scrollHeight ) -
+				this.helperProportions.height - this.margins.top
 			];
 			return;
 		}
@@ -522,7 +522,7 @@ $.widget( "ui.draggable", $.ui.mouse, {
 				0,
 				$( document ).width() - this.helperProportions.width - this.margins.left,
 				( $( document ).height() || document.body.parentNode.scrollHeight ) -
-					this.helperProportions.height - this.margins.top
+				this.helperProportions.height - this.margins.top
 			];
 			return;
 		}
@@ -547,21 +547,21 @@ $.widget( "ui.draggable", $.ui.mouse, {
 
 		this.containment = [
 			( parseInt( c.css( "borderLeftWidth" ), 10 ) || 0 ) +
-				( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
+			( parseInt( c.css( "paddingLeft" ), 10 ) || 0 ),
 			( parseInt( c.css( "borderTopWidth" ), 10 ) || 0 ) +
-				( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
+			( parseInt( c.css( "paddingTop" ), 10 ) || 0 ),
 			( isUserScrollable ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
-				( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
-				( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
-				this.helperProportions.width -
-				this.margins.left -
-				this.margins.right,
+			( parseInt( c.css( "borderRightWidth" ), 10 ) || 0 ) -
+			( parseInt( c.css( "paddingRight" ), 10 ) || 0 ) -
+			this.helperProportions.width -
+			this.margins.left -
+			this.margins.right,
 			( isUserScrollable ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
-				( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) -
-				( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) -
-				this.helperProportions.height -
-				this.margins.top -
-				this.margins.bottom
+			( parseInt( c.css( "borderBottomWidth" ), 10 ) || 0 ) -
+			( parseInt( c.css( "paddingBottom" ), 10 ) || 0 ) -
+			this.helperProportions.height -
+			this.margins.top -
+			this.margins.bottom
 		];
 		this.relativeContainer = c;
 	},
@@ -666,18 +666,18 @@ $.widget( "ui.draggable", $.ui.mouse, {
 					this.originalPageY ) / o.grid[ 1 ] ) * o.grid[ 1 ] : this.originalPageY;
 				pageY = containment ? ( ( top - this.offset.click.top >= containment[ 1 ] ||
 					top - this.offset.click.top > containment[ 3 ] ) ?
-						top :
-						( ( top - this.offset.click.top >= containment[ 1 ] ) ?
-							top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : top;
+					top :
+					( ( top - this.offset.click.top >= containment[ 1 ] ) ?
+						top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) : top;
 
 				left = o.grid[ 0 ] ? this.originalPageX +
 					Math.round( ( pageX - this.originalPageX ) / o.grid[ 0 ] ) * o.grid[ 0 ] :
 					this.originalPageX;
 				pageX = containment ? ( ( left - this.offset.click.left >= containment[ 0 ] ||
 					left - this.offset.click.left > containment[ 2 ] ) ?
-						left :
-						( ( left - this.offset.click.left >= containment[ 0 ] ) ?
-							left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : left;
+					left :
+					( ( left - this.offset.click.left >= containment[ 0 ] ) ?
+						left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) : left;
 			}
 
 			if ( o.axis === "y" ) {
@@ -851,8 +851,8 @@ $.ui.plugin.add( "draggable", "connectToSortable", {
 					this.offset.click = draggable.offset.click;
 
 					if ( this !== sortable &&
-							this._intersectsWith( this.containerCache ) &&
-							$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
+						this._intersectsWith( this.containerCache ) &&
+						$.contains( sortable.element[ 0 ], this.element[ 0 ] ) ) {
 						innermostIntersecting = false;
 					}
 
@@ -1012,7 +1012,7 @@ $.ui.plugin.add( "draggable", "scroll", {
 		}
 
 		if ( i.scrollParentNotHidden[ 0 ] !== i.document[ 0 ] &&
-				i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
+			i.scrollParentNotHidden[ 0 ].tagName !== "HTML" ) {
 			i.overflowOffset = i.scrollParentNotHidden.offset();
 		}
 	},
@@ -1026,7 +1026,7 @@ $.ui.plugin.add( "draggable", "scroll", {
 		if ( scrollParent !== document && scrollParent.tagName !== "HTML" ) {
 			if ( !o.axis || o.axis !== "x" ) {
 				if ( ( i.overflowOffset.top + scrollParent.offsetHeight ) - event.pageY <
-						o.scrollSensitivity ) {
+					o.scrollSensitivity ) {
 					scrollParent.scrollTop = scrolled = scrollParent.scrollTop + o.scrollSpeed;
 				} else if ( event.pageY - i.overflowOffset.top < o.scrollSensitivity ) {
 					scrollParent.scrollTop = scrolled = scrollParent.scrollTop - o.scrollSpeed;
@@ -1035,7 +1035,7 @@ $.ui.plugin.add( "draggable", "scroll", {
 
 			if ( !o.axis || o.axis !== "y" ) {
 				if ( ( i.overflowOffset.left + scrollParent.offsetWidth ) - event.pageX <
-						o.scrollSensitivity ) {
+					o.scrollSensitivity ) {
 					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft + o.scrollSpeed;
 				} else if ( event.pageX - i.overflowOffset.left < o.scrollSensitivity ) {
 					scrollParent.scrollLeft = scrolled = scrollParent.scrollLeft - o.scrollSpeed;
@@ -1048,7 +1048,7 @@ $.ui.plugin.add( "draggable", "scroll", {
 				if ( event.pageY - $( document ).scrollTop() < o.scrollSensitivity ) {
 					scrolled = $( document ).scrollTop( $( document ).scrollTop() - o.scrollSpeed );
 				} else if ( $( window ).height() - ( event.pageY - $( document ).scrollTop() ) <
-						o.scrollSensitivity ) {
+					o.scrollSensitivity ) {
 					scrolled = $( document ).scrollTop( $( document ).scrollTop() + o.scrollSpeed );
 				}
 			}
@@ -1059,7 +1059,7 @@ $.ui.plugin.add( "draggable", "scroll", {
 						$( document ).scrollLeft() - o.scrollSpeed
 					);
 				} else if ( $( window ).width() - ( event.pageX - $( document ).scrollLeft() ) <
-						o.scrollSensitivity ) {
+					o.scrollSensitivity ) {
 					scrolled = $( document ).scrollLeft(
 						$( document ).scrollLeft() + o.scrollSpeed
 					);
@@ -1112,7 +1112,7 @@ $.ui.plugin.add( "draggable", "snap", {
 			b = t + inst.snapElements[ i ].height;
 
 			if ( x2 < l - d || x1 > r + d || y2 < t - d || y1 > b + d ||
-					!$.contains( inst.snapElements[ i ].item.ownerDocument,
+				!$.contains( inst.snapElements[ i ].item.ownerDocument,
 					inst.snapElements[ i ].item ) ) {
 				if ( inst.snapElements[ i ].snapping ) {
 					if ( inst.options.snap.release ) {
diff --git a/src/js/_enqueues/vendor/jquery/ui/droppable.js b/src/js/_enqueues/vendor/jquery/ui/droppable.js
index 05db6c8d09..17aca5e721 100644
--- a/src/js/_enqueues/vendor/jquery/ui/droppable.js
+++ b/src/js/_enqueues/vendor/jquery/ui/droppable.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Droppable 1.13.0
+ * jQuery UI Droppable 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -34,7 +34,7 @@
 "use strict";
 
 $.widget( "ui.droppable", {
-	version: "1.13.0",
+	version: "1.13.1",
 	widgetEventPrefix: "drop",
 	options: {
 		accept: "*",
@@ -150,12 +150,12 @@ $.widget( "ui.droppable", {
 
 		// Bail if draggable and droppable are same element
 		if ( !draggable || ( draggable.currentItem ||
-				draggable.element )[ 0 ] === this.element[ 0 ] ) {
+			draggable.element )[ 0 ] === this.element[ 0 ] ) {
 			return;
 		}
 
 		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||
-				draggable.element ) ) ) {
+			draggable.element ) ) ) {
 			this._addHoverClass();
 			this._trigger( "over", event, this.ui( draggable ) );
 		}
@@ -168,12 +168,12 @@ $.widget( "ui.droppable", {
 
 		// Bail if draggable and droppable are same element
 		if ( !draggable || ( draggable.currentItem ||
-				draggable.element )[ 0 ] === this.element[ 0 ] ) {
+			draggable.element )[ 0 ] === this.element[ 0 ] ) {
 			return;
 		}
 
 		if ( this.accept.call( this.element[ 0 ], ( draggable.currentItem ||
-				draggable.element ) ) ) {
+			draggable.element ) ) ) {
 			this._removeHoverClass();
 			this._trigger( "out", event, this.ui( draggable ) );
 		}
@@ -187,7 +187,7 @@ $.widget( "ui.droppable", {
 
 		// Bail if draggable and droppable are same element
 		if ( !draggable || ( draggable.currentItem ||
-				draggable.element )[ 0 ] === this.element[ 0 ] ) {
+			draggable.element )[ 0 ] === this.element[ 0 ] ) {
 			return false;
 		}
 
@@ -218,7 +218,7 @@ $.widget( "ui.droppable", {
 		}
 
 		if ( this.accept.call( this.element[ 0 ],
-				( draggable.currentItem || draggable.element ) ) ) {
+			( draggable.currentItem || draggable.element ) ) ) {
 			this._removeActiveClass();
 			this._removeHoverClass();
 
@@ -281,28 +281,28 @@ $.ui.intersect = ( function() {
 			b = t + droppable.proportions().height;
 
 		switch ( toleranceMode ) {
-		case "fit":
-			return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );
-		case "intersect":
-			return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half
-				x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half
-				t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half
-				y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half
-		case "pointer":
-			return isOverAxis( event.pageY, t, droppable.proportions().height ) &&
-				isOverAxis( event.pageX, l, droppable.proportions().width );
-		case "touch":
-			return (
-				( y1 >= t && y1 <= b ) || // Top edge touching
-				( y2 >= t && y2 <= b ) || // Bottom edge touching
-				( y1 < t && y2 > b ) // Surrounded vertically
-			) && (
-				( x1 >= l && x1 <= r ) || // Left edge touching
-				( x2 >= l && x2 <= r ) || // Right edge touching
-				( x1 < l && x2 > r ) // Surrounded horizontally
-			);
-		default:
-			return false;
+			case "fit":
+				return ( l <= x1 && x2 <= r && t <= y1 && y2 <= b );
+			case "intersect":
+				return ( l < x1 + ( draggable.helperProportions.width / 2 ) && // Right Half
+					x2 - ( draggable.helperProportions.width / 2 ) < r && // Left Half
+					t < y1 + ( draggable.helperProportions.height / 2 ) && // Bottom Half
+					y2 - ( draggable.helperProportions.height / 2 ) < b ); // Top Half
+			case "pointer":
+				return isOverAxis( event.pageY, t, droppable.proportions().height ) &&
+					isOverAxis( event.pageX, l, droppable.proportions().width );
+			case "touch":
+				return (
+					( y1 >= t && y1 <= b ) || // Top edge touching
+					( y2 >= t && y2 <= b ) || // Bottom edge touching
+					( y1 < t && y2 > b ) // Surrounded vertically
+				) && (
+					( x1 >= l && x1 <= r ) || // Left edge touching
+					( x2 >= l && x2 <= r ) || // Right edge touching
+					( x1 < l && x2 > r ) // Surrounded horizontally
+				);
+			default:
+				return false;
 		}
 	};
 } )();
@@ -324,7 +324,7 @@ $.ui.ddmanager = {
 
 			// No disabled and non-accepted
 			if ( m[ i ].options.disabled || ( t && !m[ i ].accept.call( m[ i ].element[ 0 ],
-					( t.currentItem || t.element ) ) ) ) {
+				( t.currentItem || t.element ) ) ) ) {
 				continue;
 			}
 
@@ -366,12 +366,12 @@ $.ui.ddmanager = {
 				return;
 			}
 			if ( !this.options.disabled && this.visible &&
-					$.ui.intersect( draggable, this, this.options.tolerance, event ) ) {
+				$.ui.intersect( draggable, this, this.options.tolerance, event ) ) {
 				dropped = this._drop.call( this, event ) || dropped;
 			}
 
 			if ( !this.options.disabled && this.visible && this.accept.call( this.element[ 0 ],
-					( draggable.currentItem || draggable.element ) ) ) {
+				( draggable.currentItem || draggable.element ) ) ) {
 				this.isout = true;
 				this.isover = false;
 				this._deactivate.call( this, event );
diff --git a/src/js/_enqueues/vendor/jquery/ui/effect-blind.js b/src/js/_enqueues/vendor/jquery/ui/effect-blind.js
index b74dea4bdf..7d9da99807 100644
--- a/src/js/_enqueues/vendor/jquery/ui/effect-blind.js
+++ b/src/js/_enqueues/vendor/jquery/ui/effect-blind.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Blind 1.13.0
+ * jQuery UI Effects Blind 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
diff --git a/src/js/_enqueues/vendor/jquery/ui/effect-bounce.js b/src/js/_enqueues/vendor/jquery/ui/effect-bounce.js
index b8ee5042f2..682ca2cd37 100644
--- a/src/js/_enqueues/vendor/jquery/ui/effect-bounce.js
+++ b/src/js/_enqueues/vendor/jquery/ui/effect-bounce.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Bounce 1.13.0
+ * jQuery UI Effects Bounce 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
diff --git a/src/js/_enqueues/vendor/jquery/ui/effect-clip.js b/src/js/_enqueues/vendor/jquery/ui/effect-clip.js
index b54415605b..2c32aec629 100644
--- a/src/js/_enqueues/vendor/jquery/ui/effect-clip.js
+++ b/src/js/_enqueues/vendor/jquery/ui/effect-clip.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Clip 1.13.0
+ * jQuery UI Effects Clip 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
diff --git a/src/js/_enqueues/vendor/jquery/ui/effect-drop.js b/src/js/_enqueues/vendor/jquery/ui/effect-drop.js
index 4e7dd86561..0acd95d4b2 100644
--- a/src/js/_enqueues/vendor/jquery/ui/effect-drop.js
+++ b/src/js/_enqueues/vendor/jquery/ui/effect-drop.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Drop 1.13.0
+ * jQuery UI Effects Drop 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
diff --git a/src/js/_enqueues/vendor/jquery/ui/effect-explode.js b/src/js/_enqueues/vendor/jquery/ui/effect-explode.js
index ec4529284c..598a40a6d7 100644
--- a/src/js/_enqueues/vendor/jquery/ui/effect-explode.js
+++ b/src/js/_enqueues/vendor/jquery/ui/effect-explode.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Explode 1.13.0
+ * jQuery UI Effects Explode 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -83,21 +83,21 @@ return $.effects.define( "explode", "hide", function( options, done ) {
 				// Select the wrapper - make it overflow: hidden and absolute positioned based on
 				// where the original was located +left and +top equal to the size of pieces
 				.parent()
-					.addClass( "ui-effects-explode" )
-					.css( {
-						position: "absolute",
-						overflow: "hidden",
-						width: width,
-						height: height,
-						left: left + ( show ? mx * width : 0 ),
-						top: top + ( show ? my * height : 0 ),
-						opacity: show ? 0 : 1
-					} )
-					.animate( {
-						left: left + ( show ? 0 : mx * width ),
-						top: top + ( show ? 0 : my * height ),
-						opacity: show ? 1 : 0
-					}, options.duration || 500, options.easing, childComplete );
+				.addClass( "ui-effects-explode" )
+				.css( {
+					position: "absolute",
+					overflow: "hidden",
+					width: width,
+					height: height,
+					left: left + ( show ? mx * width : 0 ),
+					top: top + ( show ? my * height : 0 ),
+					opacity: show ? 0 : 1
+				} )
+				.animate( {
+					left: left + ( show ? 0 : mx * width ),
+					top: top + ( show ? 0 : my * height ),
+					opacity: show ? 1 : 0
+				}, options.duration || 500, options.easing, childComplete );
 		}
 	}
 
diff --git a/src/js/_enqueues/vendor/jquery/ui/effect-fade.js b/src/js/_enqueues/vendor/jquery/ui/effect-fade.js
index b0de90b500..4622b7d221 100644
--- a/src/js/_enqueues/vendor/jquery/ui/effect-fade.js
+++ b/src/js/_enqueues/vendor/jquery/ui/effect-fade.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Fade 1.13.0
+ * jQuery UI Effects Fade 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
diff --git a/src/js/_enqueues/vendor/jquery/ui/effect-fold.js b/src/js/_enqueues/vendor/jquery/ui/effect-fold.js
index 26c382b6d8..b28d2fa1ee 100644
--- a/src/js/_enqueues/vendor/jquery/ui/effect-fold.js
+++ b/src/js/_enqueues/vendor/jquery/ui/effect-fold.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Fold 1.13.0
+ * jQuery UI Effects Fold 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
diff --git a/src/js/_enqueues/vendor/jquery/ui/effect-highlight.js b/src/js/_enqueues/vendor/jquery/ui/effect-highlight.js
index 36f0e9a721..4143c9bb7f 100644
--- a/src/js/_enqueues/vendor/jquery/ui/effect-highlight.js
+++ b/src/js/_enqueues/vendor/jquery/ui/effect-highlight.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Highlight 1.13.0
+ * jQuery UI Effects Highlight 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
diff --git a/src/js/_enqueues/vendor/jquery/ui/effect-puff.js b/src/js/_enqueues/vendor/jquery/ui/effect-puff.js
index 7a7f0e96dc..85bd1218c5 100644
--- a/src/js/_enqueues/vendor/jquery/ui/effect-puff.js
+++ b/src/js/_enqueues/vendor/jquery/ui/effect-puff.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Puff 1.13.0
+ * jQuery UI Effects Puff 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
diff --git a/src/js/_enqueues/vendor/jquery/ui/effect-pulsate.js b/src/js/_enqueues/vendor/jquery/ui/effect-pulsate.js
index ad1495d550..69469dc168 100644
--- a/src/js/_enqueues/vendor/jquery/ui/effect-pulsate.js
+++ b/src/js/_enqueues/vendor/jquery/ui/effect-pulsate.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Pulsate 1.13.0
+ * jQuery UI Effects Pulsate 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
diff --git a/src/js/_enqueues/vendor/jquery/ui/effect-scale.js b/src/js/_enqueues/vendor/jquery/ui/effect-scale.js
index f7a5a84155..2ac88b04db 100644
--- a/src/js/_enqueues/vendor/jquery/ui/effect-scale.js
+++ b/src/js/_enqueues/vendor/jquery/ui/effect-scale.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Scale 1.13.0
+ * jQuery UI Effects Scale 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
diff --git a/src/js/_enqueues/vendor/jquery/ui/effect-shake.js b/src/js/_enqueues/vendor/jquery/ui/effect-shake.js
index ab942c0d07..84f4734e7e 100644
--- a/src/js/_enqueues/vendor/jquery/ui/effect-shake.js
+++ b/src/js/_enqueues/vendor/jquery/ui/effect-shake.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Shake 1.13.0
+ * jQuery UI Effects Shake 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
diff --git a/src/js/_enqueues/vendor/jquery/ui/effect-size.js b/src/js/_enqueues/vendor/jquery/ui/effect-size.js
index 7e2c8874ba..97c6bf910e 100644
--- a/src/js/_enqueues/vendor/jquery/ui/effect-size.js
+++ b/src/js/_enqueues/vendor/jquery/ui/effect-size.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Size 1.13.0
+ * jQuery UI Effects Size 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
diff --git a/src/js/_enqueues/vendor/jquery/ui/effect-slide.js b/src/js/_enqueues/vendor/jquery/ui/effect-slide.js
index d19b80e75b..51fda6b374 100644
--- a/src/js/_enqueues/vendor/jquery/ui/effect-slide.js
+++ b/src/js/_enqueues/vendor/jquery/ui/effect-slide.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Slide 1.13.0
+ * jQuery UI Effects Slide 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
diff --git a/src/js/_enqueues/vendor/jquery/ui/effect-transfer.js b/src/js/_enqueues/vendor/jquery/ui/effect-transfer.js
index 9c0540259a..8d2e173c4b 100644
--- a/src/js/_enqueues/vendor/jquery/ui/effect-transfer.js
+++ b/src/js/_enqueues/vendor/jquery/ui/effect-transfer.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects Transfer 1.13.0
+ * jQuery UI Effects Transfer 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
diff --git a/src/js/_enqueues/vendor/jquery/ui/effect.js b/src/js/_enqueues/vendor/jquery/ui/effect.js
index e8c7ca0089..2e39261a85 100644
--- a/src/js/_enqueues/vendor/jquery/ui/effect.js
+++ b/src/js/_enqueues/vendor/jquery/ui/effect.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Effects 1.13.0
+ * jQuery UI Effects 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -32,7 +32,7 @@
 
 // Include version.js
 $.ui = $.ui || {};
-$.ui.version = "1.13.0";
+$.ui.version = "1.13.1";
 
 // Source: jquery-var-for-color.js
 // Create a local jQuery because jQuery Color relies on it and the
@@ -812,7 +812,7 @@ function getElementStyles( elem ) {
 			}
 		}
 
-	// Support: Opera, IE <9
+		// Support: Opera, IE <9
 	} else {
 		for ( key in style ) {
 			if ( typeof style[ key ] === "string" ) {
@@ -1119,7 +1119,7 @@ if ( $.uiBackCompat !== false ) {
 }
 
 $.extend( $.effects, {
-	version: "1.13.0",
+	version: "1.13.1",
 
 	define: function( name, mode, effect ) {
 		if ( !effect ) {
@@ -1201,31 +1201,31 @@ $.extend( $.effects, {
 		var y, x;
 
 		switch ( origin[ 0 ] ) {
-		case "top":
-			y = 0;
-			break;
-		case "middle":
-			y = 0.5;
-			break;
-		case "bottom":
-			y = 1;
-			break;
-		default:
-			y = origin[ 0 ] / original.height;
+			case "top":
+				y = 0;
+				break;
+			case "middle":
+				y = 0.5;
+				break;
+			case "bottom":
+				y = 1;
+				break;
+			default:
+				y = origin[ 0 ] / original.height;
 		}
 
 		switch ( origin[ 1 ] ) {
-		case "left":
-			x = 0;
-			break;
-		case "center":
-			x = 0.5;
-			break;
-		case "right":
-			x = 1;
-			break;
-		default:
-			x = origin[ 1 ] / original.width;
+			case "left":
+				x = 0;
+				break;
+			case "center":
+				x = 0.5;
+				break;
+			case "right":
+				x = 1;
+				break;
+			default:
+				x = origin[ 1 ] / original.width;
 		}
 
 		return {
@@ -1250,8 +1250,8 @@ $.extend( $.effects, {
 			marginLeft: element.css( "marginLeft" ),
 			marginRight: element.css( "marginRight" )
 		} )
-		.outerWidth( element.outerWidth() )
-		.outerHeight( element.outerHeight() );
+			.outerWidth( element.outerWidth() )
+			.outerHeight( element.outerHeight() );
 
 		if ( /^(static|relative)/.test( cssPosition ) ) {
 			cssPosition = "absolute";
@@ -1272,9 +1272,9 @@ $.extend( $.effects, {
 				marginRight: element.css( "marginRight" ),
 				"float": element.css( "float" )
 			} )
-			.outerWidth( element.outerWidth() )
-			.outerHeight( element.outerHeight() )
-			.addClass( "ui-effects-placeholder" );
+				.outerWidth( element.outerWidth() )
+				.outerHeight( element.outerHeight() )
+				.addClass( "ui-effects-placeholder" );
 
 			element.data( dataSpace + "placeholder", placeholder );
 		}
@@ -1290,7 +1290,7 @@ $.extend( $.effects, {
 
 	removePlaceholder: function( element ) {
 		var dataKey = dataSpace + "placeholder",
-				placeholder = element.data( dataKey );
+			placeholder = element.data( dataKey );
 
 		if ( placeholder ) {
 			placeholder.remove();
@@ -1362,8 +1362,8 @@ function _normalizeArguments( effect, options, speed, callback ) {
 	speed = speed || options.duration;
 	effect.duration = $.fx.off ? 0 :
 		typeof speed === "number" ? speed :
-		speed in $.fx.speeds ? $.fx.speeds[ speed ] :
-		$.fx.speeds._default;
+			speed in $.fx.speeds ? $.fx.speeds[ speed ] :
+				$.fx.speeds._default;
 
 	effect.complete = callback || options.complete;
 
@@ -1420,7 +1420,7 @@ $.fn.extend( {
 
 				// See $.uiBackCompat inside of run() for removal of defaultMode in 1.14
 				if ( defaultMode && ( normalizedMode === "show" ||
-						( normalizedMode === defaultMode && normalizedMode === "hide" ) ) ) {
+					( normalizedMode === defaultMode && normalizedMode === "hide" ) ) ) {
 					el.show();
 				}
 
@@ -1598,17 +1598,17 @@ $.fn.extend( {
 } );
 
 function parseClip( str, element ) {
-		var outerWidth = element.outerWidth(),
-			outerHeight = element.outerHeight(),
-			clipRegex = /^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,
-			values = clipRegex.exec( str ) || [ "", 0, outerWidth, outerHeight, 0 ];
-
-		return {
-			top: parseFloat( values[ 1 ] ) || 0,
-			right: values[ 2 ] === "auto" ? outerWidth : parseFloat( values[ 2 ] ),
-			bottom: values[ 3 ] === "auto" ? outerHeight : parseFloat( values[ 3 ] ),
-			left: parseFloat( values[ 4 ] ) || 0
-		};
+	var outerWidth = element.outerWidth(),
+		outerHeight = element.outerHeight(),
+		clipRegex = /^rect\((-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto),?\s*(-?\d*\.?\d*px|-?\d+%|auto)\)$/,
+		values = clipRegex.exec( str ) || [ "", 0, outerWidth, outerHeight, 0 ];
+
+	return {
+		top: parseFloat( values[ 1 ] ) || 0,
+		right: values[ 2 ] === "auto" ? outerWidth : parseFloat( values[ 2 ] ),
+		bottom: values[ 3 ] === "auto" ? outerHeight : parseFloat( values[ 3 ] ),
+		left: parseFloat( values[ 4 ] ) || 0
+	};
 }
 
 $.fx.step.clip = function( fx ) {
diff --git a/src/js/_enqueues/vendor/jquery/ui/menu.js b/src/js/_enqueues/vendor/jquery/ui/menu.js
index 1e43abd09f..18e71c9bd9 100644
--- a/src/js/_enqueues/vendor/jquery/ui/menu.js
+++ b/src/js/_enqueues/vendor/jquery/ui/menu.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Menu 1.13.0
+ * jQuery UI Menu 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -35,7 +35,7 @@
 "use strict";
 
 return $.widget( "ui.menu", {
-	version: "1.13.0",
+	version: "1.13.1",
 	defaultElement: "<ul>",
 	delay: 300,
 	options: {
@@ -95,7 +95,7 @@ return $.widget( "ui.menu", {
 					if ( target.has( ".ui-menu" ).length ) {
 						this.expand( event );
 					} else if ( !this.element.is( ":focus" ) &&
-							active.closest( ".ui-menu" ).length ) {
+						active.closest( ".ui-menu" ).length ) {
 
 						// Redirect focus to the menu
 						this.element.trigger( "focus", [ true ] );
@@ -162,7 +162,7 @@ return $.widget( "ui.menu", {
 
 		// If the mouse didn't actually move, but the page was scrolled, ignore the event (#9356)
 		if ( event.clientX === this.lastMousePosition.x &&
-				event.clientY === this.lastMousePosition.y ) {
+			event.clientY === this.lastMousePosition.y ) {
 			return;
 		}
 
@@ -202,10 +202,10 @@ return $.widget( "ui.menu", {
 		this.element
 			.removeAttr( "aria-activedescendant" )
 			.find( ".ui-menu" ).addBack()
-				.removeAttr( "role aria-labelledby aria-expanded aria-hidden aria-disabled " +
-					"tabIndex" )
-				.removeUniqueId()
-				.show();
+			.removeAttr( "role aria-labelledby aria-expanded aria-hidden aria-disabled " +
+				"tabIndex" )
+			.removeUniqueId()
+			.show();
 
 		submenus.children().each( function() {
 			var elem = $( this );
@@ -220,77 +220,77 @@ return $.widget( "ui.menu", {
 			preventDefault = true;
 
 		switch ( event.keyCode ) {
-		case $.ui.keyCode.PAGE_UP:
-			this.previousPage( event );
-			break;
-		case $.ui.keyCode.PAGE_DOWN:
-			this.nextPage( event );
-			break;
-		case $.ui.keyCode.HOME:
-			this._move( "first", "first", event );
-			break;
-		case $.ui.keyCode.END:
-			this._move( "last", "last", event );
-			break;
-		case $.ui.keyCode.UP:
-			this.previous( event );
-			break;
-		case $.ui.keyCode.DOWN:
-			this.next( event );
-			break;
-		case $.ui.keyCode.LEFT:
-			this.collapse( event );
-			break;
-		case $.ui.keyCode.RIGHT:
-			if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
-				this.expand( event );
-			}
-			break;
-		case $.ui.keyCode.ENTER:
-		case $.ui.keyCode.SPACE:
-			this._activate( event );
-			break;
-		case $.ui.keyCode.ESCAPE:
-			this.collapse( event );
-			break;
-		default:
-			preventDefault = false;
-			prev = this.previousFilter || "";
-			skip = false;
-
-			// Support number pad values
-			character = event.keyCode >= 96 && event.keyCode <= 105 ?
-				( event.keyCode - 96 ).toString() : String.fromCharCode( event.keyCode );
-
-			clearTimeout( this.filterTimer );
-
-			if ( character === prev ) {
-				skip = true;
-			} else {
-				character = prev + character;
-			}
-
-			match = this._filterMenuItems( character );
-			match = skip && match.index( this.active.next() ) !== -1 ?
-				this.active.nextAll( ".ui-menu-item" ) :
-				match;
+			case $.ui.keyCode.PAGE_UP:
+				this.previousPage( event );
+				break;
+			case $.ui.keyCode.PAGE_DOWN:
+				this.nextPage( event );
+				break;
+			case $.ui.keyCode.HOME:
+				this._move( "first", "first", event );
+				break;
+			case $.ui.keyCode.END:
+				this._move( "last", "last", event );
+				break;
+			case $.ui.keyCode.UP:
+				this.previous( event );
+				break;
+			case $.ui.keyCode.DOWN:
+				this.next( event );
+				break;
+			case $.ui.keyCode.LEFT:
+				this.collapse( event );
+				break;
+			case $.ui.keyCode.RIGHT:
+				if ( this.active && !this.active.is( ".ui-state-disabled" ) ) {
+					this.expand( event );
+				}
+				break;
+			case $.ui.keyCode.ENTER:
+			case $.ui.keyCode.SPACE:
+				this._activate( event );
+				break;
+			case $.ui.keyCode.ESCAPE:
+				this.collapse( event );
+				break;
+			default:
+				preventDefault = false;
+				prev = this.previousFilter || "";
+				skip = false;
+
+				// Support number pad values
+				character = event.keyCode >= 96 && event.keyCode <= 105 ?
+					( event.keyCode - 96 ).toString() : String.fromCharCode( event.keyCode );
+
+				clearTimeout( this.filterTimer );
+
+				if ( character === prev ) {
+					skip = true;
+				} else {
+					character = prev + character;
+				}
 
-			// If no matches on the current filter, reset to the last character pressed
-			// to move down the menu to the first item that starts with that character
-			if ( !match.length ) {
-				character = String.fromCharCode( event.keyCode );
 				match = this._filterMenuItems( character );
-			}
+				match = skip && match.index( this.active.next() ) !== -1 ?
+					this.active.nextAll( ".ui-menu-item" ) :
+					match;
+
+				// If no matches on the current filter, reset to the last character pressed
+				// to move down the menu to the first item that starts with that character
+				if ( !match.length ) {
+					character = String.fromCharCode( event.keyCode );
+					match = this._filterMenuItems( character );
+				}
 
-			if ( match.length ) {
-				this.focus( event, match );
-				this.previousFilter = character;
-				this.filterTimer = this._delay( function() {
+				if ( match.length ) {
+					this.focus( event, match );
+					this.previousFilter = character;
+					this.filterTimer = this._delay( function() {
+						delete this.previousFilter;
+					}, 1000 );
+				} else {
 					delete this.previousFilter;
-				}, 1000 );
-			} else {
-				delete this.previousFilter;
-			}
+				}
 		}
 
 		if ( preventDefault ) {
@@ -353,11 +353,11 @@ return $.widget( "ui.menu", {
 		newItems = items.not( ".ui-menu-item, .ui-menu-divider" );
 		newWrappers = newItems.children()
 			.not( ".ui-menu" )
-				.uniqueId()
-				.attr( {
-					tabIndex: -1,
-					role: this._itemRole()
-				} );
+			.uniqueId()
+			.attr( {
+				tabIndex: -1,
+				role: this._itemRole()
+			} );
 		this._addClass( newItems, "ui-menu-item" )
 			._addClass( newWrappers, "ui-menu-item-wrapper" );
 
@@ -413,8 +413,8 @@ return $.widget( "ui.menu", {
 		// Highlight active parent menu item, if any
 		activeParent = this.active
 			.parent()
-				.closest( ".ui-menu-item" )
-					.children( ".ui-menu-item-wrapper" );
+			.closest( ".ui-menu-item" )
+			.children( ".ui-menu-item-wrapper" );
 		this._addClass( activeParent, null, "ui-state-active" );
 
 		if ( event && event.type === "keydown" ) {
@@ -695,13 +695,13 @@ return $.widget( "ui.menu", {
 		return this.activeMenu
 			.find( this.options.items )
 
-				// Only match on items, not dividers or other content (#10571)
-				.filter( ".ui-menu-item" )
-					.filter( function() {
-						return regex.test(
-							String.prototype.trim.call(
-								$( this ).children( ".ui-menu-item-wrapper" ).text() ) );
-					} );
+			// Only match on items, not dividers or other content (#10571)
+			.filter( ".ui-menu-item" )
+			.filter( function() {
+				return regex.test(
+					String.prototype.trim.call(
+						$( this ).children( ".ui-menu-item-wrapper" ).text() ) );
+			} );
 	}
 } );
 
diff --git a/src/js/_enqueues/vendor/jquery/ui/mouse.js b/src/js/_enqueues/vendor/jquery/ui/mouse.js
index c3a6a6edf1..8ad7d9aaef 100644
--- a/src/js/_enqueues/vendor/jquery/ui/mouse.js
+++ b/src/js/_enqueues/vendor/jquery/ui/mouse.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Mouse 1.13.0
+ * jQuery UI Mouse 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -36,7 +36,7 @@ $( document ).on( "mouseup", function() {
 } );
 
 return $.widget( "ui.mouse", {
-	version: "1.13.0",
+	version: "1.13.1",
 	options: {
 		cancel: "input, textarea, button, select, option",
 		distance: 1,
@@ -146,17 +146,17 @@ return $.widget( "ui.mouse", {
 
 			// IE mouseup check - mouseup happened when mouse was out of window
 			if ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) &&
-					!event.button ) {
+				!event.button ) {
 				return this._mouseUp( event );
 
-			// Iframe mouseup check - mouseup occurred in another document
+				// Iframe mouseup check - mouseup occurred in another document
 			} else if ( !event.which ) {
 
 				// Support: Safari <=8 - 9
 				// Safari sets which to 0 if you press any of the following keys
 				// during a drag (#14461)
 				if ( event.originalEvent.altKey || event.originalEvent.ctrlKey ||
-						event.originalEvent.metaKey || event.originalEvent.shiftKey ) {
+					event.originalEvent.metaKey || event.originalEvent.shiftKey ) {
 					this.ignoreMissingWhich = true;
 				} else if ( !this.ignoreMissingWhich ) {
 					return this._mouseUp( event );
diff --git a/src/js/_enqueues/vendor/jquery/ui/progressbar.js b/src/js/_enqueues/vendor/jquery/ui/progressbar.js
index e1c78112da..e2c4677ceb 100644
--- a/src/js/_enqueues/vendor/jquery/ui/progressbar.js
+++ b/src/js/_enqueues/vendor/jquery/ui/progressbar.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Progressbar 1.13.0
+ * jQuery UI Progressbar 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -37,7 +37,7 @@
 "use strict";
 
 return $.widget( "ui.progressbar", {
-	version: "1.13.0",
+	version: "1.13.1",
 	options: {
 		classes: {
 			"ui-progressbar": "ui-corner-all",
diff --git a/src/js/_enqueues/vendor/jquery/ui/resizable.js b/src/js/_enqueues/vendor/jquery/ui/resizable.js
index 5fc38f53b3..e6cec7522f 100644
--- a/src/js/_enqueues/vendor/jquery/ui/resizable.js
+++ b/src/js/_enqueues/vendor/jquery/ui/resizable.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Resizable 1.13.0
+ * jQuery UI Resizable 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -36,7 +36,7 @@
 "use strict";
 
 $.widget( "ui.resizable", $.ui.mouse, {
-	version: "1.13.0",
+	version: "1.13.1",
 	widgetEventPrefix: "resize",
 	options: {
 		alsoResize: false,
@@ -228,15 +228,15 @@ $.widget( "ui.resizable", $.ui.mouse, {
 		this._super( key, value );
 
 		switch ( key ) {
-		case "handles":
-			this._removeHandles();
-			this._setupHandles();
-			break;
-		case "aspectRatio":
-			this._aspectRatio = !!value;
-			break;
-		default:
-			break;
+			case "handles":
+				this._removeHandles();
+				this._setupHandles();
+				break;
+			case "aspectRatio":
+				this._aspectRatio = !!value;
+				break;
+			default:
+				break;
 		}
 	},
 
@@ -300,9 +300,9 @@ $.widget( "ui.resizable", $.ui.mouse, {
 				}
 
 				if ( this.elementIsWrapper &&
-						this.originalElement[ 0 ]
-							.nodeName
-							.match( /^(textarea|input|select|button)$/i ) ) {
+					this.originalElement[ 0 ]
+						.nodeName
+						.match( /^(textarea|input|select|button)$/i ) ) {
 					axis = $( this.handles[ i ], this.element );
 
 					padWrapper = /sw|ne|nw|se|n|s/.test( i ) ?
@@ -311,8 +311,8 @@ $.widget( "ui.resizable", $.ui.mouse, {
 
 					padPos = [ "padding",
 						/ne|nw|n/.test( i ) ? "Top" :
-						/se|sw|s/.test( i ) ? "Bottom" :
-						/^e$/.test( i ) ? "Right" : "Left" ].join( "" );
+							/se|sw|s/.test( i ) ? "Bottom" :
+								/^e$/.test( i ) ? "Right" : "Left" ].join( "" );
 
 					target.css( padPos, padWrapper );
 
@@ -384,20 +384,20 @@ $.widget( "ui.resizable", $.ui.mouse, {
 		this.position = { left: curleft, top: curtop };
 
 		this.size = this._helper ? {
-				width: this.helper.width(),
-				height: this.helper.height()
-			} : {
-				width: el.width(),
-				height: el.height()
-			};
+			width: this.helper.width(),
+			height: this.helper.height()
+		} : {
+			width: el.width(),
+			height: el.height()
+		};
 
 		this.originalSize = this._helper ? {
-				width: el.outerWidth(),
-				height: el.outerHeight()
-			} : {
-				width: el.width(),
-				height: el.height()
-			};
+			width: el.outerWidth(),
+			height: el.outerHeight()
+		} : {
+			width: el.width(),
+			height: el.height()
+		};
 
 		this.sizeDiff = {
 			width: el.outerWidth() - el.width(),
@@ -1063,21 +1063,21 @@ $.ui.plugin.add( "resizable", "alsoResize", {
 				left: ( that.position.left - op.left ) || 0
 			};
 
-			$( o.alsoResize ).each( function() {
-				var el = $( this ), start = $( this ).data( "ui-resizable-alsoresize" ), style = {},
-					css = el.parents( ui.originalElement[ 0 ] ).length ?
-							[ "width", "height" ] :
-							[ "width", "height", "top", "left" ];
-
-				$.each( css, function( i, prop ) {
-					var sum = ( start[ prop ] || 0 ) + ( delta[ prop ] || 0 );
-					if ( sum && sum >= 0 ) {
-						style[ prop ] = sum || null;
-					}
-				} );
-
-				el.css( style );
+		$( o.alsoResize ).each( function() {
+			var el = $( this ), start = $( this ).data( "ui-resizable-alsoresize" ), style = {},
+				css = el.parents( ui.originalElement[ 0 ] ).length ?
+					[ "width", "height" ] :
+					[ "width", "height", "top", "left" ];
+
+			$.each( css, function( i, prop ) {
+				var sum = ( start[ prop ] || 0 ) + ( delta[ prop ] || 0 );
+				if ( sum && sum >= 0 ) {
+					style[ prop ] = sum || null;
+				}
 			} );
+
+			el.css( style );
+		} );
 	},
 
 	stop: function() {
diff --git a/src/js/_enqueues/vendor/jquery/ui/selectable.js b/src/js/_enqueues/vendor/jquery/ui/selectable.js
index ae95624da4..5aef397b6c 100644
--- a/src/js/_enqueues/vendor/jquery/ui/selectable.js
+++ b/src/js/_enqueues/vendor/jquery/ui/selectable.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Selectable 1.13.0
+ * jQuery UI Selectable 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -34,7 +34,7 @@
 "use strict";
 
 return $.widget( "ui.selectable", $.ui.mouse, {
-	version: "1.13.0",
+	version: "1.13.1",
 	options: {
 		appendTo: "body",
 		autoRefresh: true,
@@ -210,10 +210,10 @@ return $.widget( "ui.selectable", $.ui.mouse, {
 
 			if ( options.tolerance === "touch" ) {
 				hit = ( !( offset.left > x2 || offset.right < x1 || offset.top > y2 ||
-                    offset.bottom < y1 ) );
+					offset.bottom < y1 ) );
 			} else if ( options.tolerance === "fit" ) {
 				hit = ( offset.left > x1 && offset.right < x2 && offset.top > y1 &&
-                    offset.bottom < y2 );
+					offset.bottom < y2 );
 			}
 
 			if ( hit ) {
diff --git a/src/js/_enqueues/vendor/jquery/ui/selectmenu.js b/src/js/_enqueues/vendor/jquery/ui/selectmenu.js
index 2db744de1b..0e9fcf955a 100644
--- a/src/js/_enqueues/vendor/jquery/ui/selectmenu.js
+++ b/src/js/_enqueues/vendor/jquery/ui/selectmenu.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Selectmenu 1.13.0
+ * jQuery UI Selectmenu 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -38,7 +38,7 @@
 "use strict";
 
 return $.widget( "ui.selectmenu", [ $.ui.formResetMixin, {
-	version: "1.13.0",
+	version: "1.13.1",
 	defaultElement: "<select>",
 	options: {
 		appendTo: null,
@@ -227,7 +227,7 @@ return $.widget( "ui.selectmenu", [ $.ui.formResetMixin, {
 		this.menuInstance.refresh();
 		this.menuItems = this.menu.find( "li" )
 			.not( ".ui-selectmenu-optgroup" )
-				.find( ".ui-menu-item-wrapper" );
+			.find( ".ui-menu-item-wrapper" );
 
 		this._rendered = true;
 
@@ -403,7 +403,7 @@ return $.widget( "ui.selectmenu", [ $.ui.formResetMixin, {
 			selection.removeAllRanges();
 			selection.addRange( this.range );
 
-		// Support: IE8
+			// Support: IE8
 		} else {
 			this.range.select();
 		}
@@ -439,7 +439,7 @@ return $.widget( "ui.selectmenu", [ $.ui.formResetMixin, {
 					this.range = selection.getRangeAt( 0 );
 				}
 
-			// Support: IE8
+				// Support: IE8
 			} else {
 				this.range = document.selection.createRange();
 			}
@@ -453,54 +453,54 @@ return $.widget( "ui.selectmenu", [ $.ui.formResetMixin, {
 		keydown: function( event ) {
 			var preventDefault = true;
 			switch ( event.keyCode ) {
-			case $.ui.keyCode.TAB:
-			case $.ui.keyCode.ESCAPE:
-				this.close( event );
-				preventDefault = false;
-				break;
-			case $.ui.keyCode.ENTER:
-				if ( this.isOpen ) {
-					this._selectFocusedItem( event );
-				}
-				break;
-			case $.ui.keyCode.UP:
-				if ( event.altKey ) {
-					this._toggle( event );
-				} else {
+				case $.ui.keyCode.TAB:
+				case $.ui.keyCode.ESCAPE:
+					this.close( event );
+					preventDefault = false;
+					break;
+				case $.ui.keyCode.ENTER:
+					if ( this.isOpen ) {
+						this._selectFocusedItem( event );
+					}
+					break;
+				case $.ui.keyCode.UP:
+					if ( event.altKey ) {
+						this._toggle( event );
+					} else {
+						this._move( "prev", event );
+					}
+					break;
+				case $.ui.keyCode.DOWN:
+					if ( event.altKey ) {
+						this._toggle( event );
+					} else {
+						this._move( "next", event );
+					}
+					break;
+				case $.ui.keyCode.SPACE:
+					if ( this.isOpen ) {
+						this._selectFocusedItem( event );
+					} else {
+						this._toggle( event );
+					}
+					break;
+				case $.ui.keyCode.LEFT:
 					this._move( "prev", event );
-				}
-				break;
-			case $.ui.keyCode.DOWN:
-				if ( event.altKey ) {
-					this._toggle( event );
-				} else {
+					break;
+				case $.ui.keyCode.RIGHT:
 					this._move( "next", event );
-				}
-				break;
-			case $.ui.keyCode.SPACE:
-				if ( this.isOpen ) {
-					this._selectFocusedItem( event );
-				} else {
-					this._toggle( event );
-				}
-				break;
-			case $.ui.keyCode.LEFT:
-				this._move( "prev", event );
-				break;
-			case $.ui.keyCode.RIGHT:
-				this._move( "next", event );
-				break;
-			case $.ui.keyCode.HOME:
-			case $.ui.keyCode.PAGE_UP:
-				this._move( "first", event );
-				break;
-			case $.ui.keyCode.END:
-			case $.ui.keyCode.PAGE_DOWN:
-				this._move( "last", event );
-				break;
-			default:
-				this.menu.trigger( event );
-				preventDefault = false;
+					break;
+				case $.ui.keyCode.HOME:
+				case $.ui.keyCode.PAGE_UP:
+					this._move( "first", event );
+					break;
+				case $.ui.keyCode.END:
+				case $.ui.keyCode.PAGE_DOWN:
+					this._move( "last", event );
+					break;
+				default:
+					this.menu.trigger( event );
+					preventDefault = false;
 			}
 
 			if ( preventDefault ) {
diff --git a/src/js/_enqueues/vendor/jquery/ui/slider.js b/src/js/_enqueues/vendor/jquery/ui/slider.js
index 0de5936353..e50b6f8d2f 100644
--- a/src/js/_enqueues/vendor/jquery/ui/slider.js
+++ b/src/js/_enqueues/vendor/jquery/ui/slider.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Slider 1.13.0
+ * jQuery UI Slider 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -36,7 +36,7 @@
 "use strict";
 
 return $.widget( "ui.slider", $.ui.mouse, {
-	version: "1.13.0",
+	version: "1.13.1",
 	widgetEventPrefix: "slide",
 
 	options: {
@@ -642,8 +642,8 @@ return $.widget( "ui.slider", $.ui.mouse, {
 			valueMin = this._valueMin();
 			valueMax = this._valueMax();
 			valPercent = ( valueMax !== valueMin ) ?
-					( value - valueMin ) / ( valueMax - valueMin ) * 100 :
-					0;
+				( value - valueMin ) / ( valueMax - valueMin ) * 100 :
+				0;
 			_set[ this.orientation === "horizontal" ? "left" : "bottom" ] = valPercent + "%";
 			this.handle.stop( 1, 1 )[ animate ? "animate" : "css" ]( _set, o.animate );
 
diff --git a/src/js/_enqueues/vendor/jquery/ui/sortable.js b/src/js/_enqueues/vendor/jquery/ui/sortable.js
index fa43254907..3627aa7727 100644
--- a/src/js/_enqueues/vendor/jquery/ui/sortable.js
+++ b/src/js/_enqueues/vendor/jquery/ui/sortable.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Sortable 1.13.0
+ * jQuery UI Sortable 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -34,7 +34,7 @@
 "use strict";
 
 return $.widget( "ui.sortable", $.ui.mouse, {
-	version: "1.13.0",
+	version: "1.13.1",
 	widgetEventPrefix: "sort",
 	ready: false,
 	options: {
@@ -196,8 +196,8 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 
 		//Prepare the dragged items parent
 		this.appendTo = $( o.appendTo !== "parent" ?
-				o.appendTo :
-				this.currentItem.parent() );
+			o.appendTo :
+			this.currentItem.parent() );
 
 		//Create and append the visible helper
 		this.helper = this._createHelper( event );
@@ -299,7 +299,7 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 
 		//Prepare scrolling
 		if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
-				this.scrollParent[ 0 ].tagName !== "HTML" ) {
+			this.scrollParent[ 0 ].tagName !== "HTML" ) {
 			this.overflowOffset = this.scrollParent.offset();
 		}
 
@@ -356,10 +356,10 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 			scrolled = false;
 
 		if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
-				this.scrollParent[ 0 ].tagName !== "HTML" ) {
+			this.scrollParent[ 0 ].tagName !== "HTML" ) {
 
 			if ( ( this.overflowOffset.top + this.scrollParent[ 0 ].offsetHeight ) -
-					event.pageY < o.scrollSensitivity ) {
+				event.pageY < o.scrollSensitivity ) {
 				this.scrollParent[ 0 ].scrollTop =
 					scrolled = this.scrollParent[ 0 ].scrollTop + o.scrollSpeed;
 			} else if ( event.pageY - this.overflowOffset.top < o.scrollSensitivity ) {
@@ -368,7 +368,7 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 			}
 
 			if ( ( this.overflowOffset.left + this.scrollParent[ 0 ].offsetWidth ) -
-					event.pageX < o.scrollSensitivity ) {
+				event.pageX < o.scrollSensitivity ) {
 				this.scrollParent[ 0 ].scrollLeft = scrolled =
 					this.scrollParent[ 0 ].scrollLeft + o.scrollSpeed;
 			} else if ( event.pageX - this.overflowOffset.left < o.scrollSensitivity ) {
@@ -381,7 +381,7 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 			if ( event.pageY - this.document.scrollTop() < o.scrollSensitivity ) {
 				scrolled = this.document.scrollTop( this.document.scrollTop() - o.scrollSpeed );
 			} else if ( this.window.height() - ( event.pageY - this.document.scrollTop() ) <
-					o.scrollSensitivity ) {
+				o.scrollSensitivity ) {
 				scrolled = this.document.scrollTop( this.document.scrollTop() + o.scrollSpeed );
 			}
 
@@ -390,7 +390,7 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 					this.document.scrollLeft() - o.scrollSpeed
 				);
 			} else if ( this.window.width() - ( event.pageX - this.document.scrollLeft() ) <
-					o.scrollSensitivity ) {
+				o.scrollSensitivity ) {
 				scrolled = this.document.scrollLeft(
 					this.document.scrollLeft() + o.scrollSpeed
 				);
@@ -417,79 +417,76 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 			this.helper[ 0 ].style.top = this.position.top + "px";
 		}
 
-		//Post events to containers
-		this._contactContainers( event );
-
-		if ( this.innermostContainer !== null ) {
-
-			//Do scrolling
-			if ( o.scroll ) {
-				if ( this._scroll( event ) !== false ) {
+		//Do scrolling
+		if ( o.scroll ) {
+			if ( this._scroll( event ) !== false ) {
 
-					//Update item positions used in position checks
-					this._refreshItemPositions( true );
+				//Update item positions used in position checks
+				this._refreshItemPositions( true );
 
-					if ( $.ui.ddmanager && !o.dropBehaviour ) {
-						$.ui.ddmanager.prepareOffsets( this, event );
-					}
+				if ( $.ui.ddmanager && !o.dropBehaviour ) {
+					$.ui.ddmanager.prepareOffsets( this, event );
 				}
 			}
+		}
 
-			this.dragDirection = {
-				vertical: this._getDragVerticalDirection(),
-				horizontal: this._getDragHorizontalDirection()
-			};
+		this.dragDirection = {
+			vertical: this._getDragVerticalDirection(),
+			horizontal: this._getDragHorizontalDirection()
+		};
 
-			//Rearrange
-			for ( i = this.items.length - 1; i >= 0; i-- ) {
+		//Rearrange
+		for ( i = this.items.length - 1; i >= 0; i-- ) {
 
-				//Cache variables and intersection, continue if no intersection
-				item = this.items[ i ];
-				itemElement = item.item[ 0 ];
-				intersection = this._intersectsWithPointer( item );
-				if ( !intersection ) {
-					continue;
-				}
+			//Cache variables and intersection, continue if no intersection
+			item = this.items[ i ];
+			itemElement = item.item[ 0 ];
+			intersection = this._intersectsWithPointer( item );
+			if ( !intersection ) {
+				continue;
+			}
 
-				// Only put the placeholder inside the current Container, skip all
-				// items from other containers. This works because when moving
-				// an item from one container to another the
-				// currentContainer is switched before the placeholder is moved.
-				//
-				// Without this, moving items in "sub-sortables" can cause
-				// the placeholder to jitter between the outer and inner container.
-				if ( item.instance !== this.currentContainer ) {
-					continue;
-				}
+			// Only put the placeholder inside the current Container, skip all
+			// items from other containers. This works because when moving
+			// an item from one container to another the
+			// currentContainer is switched before the placeholder is moved.
+			//
+			// Without this, moving items in "sub-sortables" can cause
+			// the placeholder to jitter between the outer and inner container.
+			if ( item.instance !== this.currentContainer ) {
+				continue;
+			}
 
-				// Cannot intersect with itself
-				// no useless actions that have been done before
-				// no action if the item moved is the parent of the item checked
-				if ( itemElement !== this.currentItem[ 0 ] &&
-					this.placeholder[ intersection === 1 ?
+			// Cannot intersect with itself
+			// no useless actions that have been done before
+			// no action if the item moved is the parent of the item checked
+			if ( itemElement !== this.currentItem[ 0 ] &&
+				this.placeholder[ intersection === 1 ?
 					"next" : "prev" ]()[ 0 ] !== itemElement &&
-					!$.contains( this.placeholder[ 0 ], itemElement ) &&
-					( this.options.type === "semi-dynamic" ?
+				!$.contains( this.placeholder[ 0 ], itemElement ) &&
+				( this.options.type === "semi-dynamic" ?
 						!$.contains( this.element[ 0 ], itemElement ) :
 						true
-					)
-				) {
-
-					this.direction = intersection === 1 ? "down" : "up";
+				)
+			) {
 
-					if ( this.options.tolerance === "pointer" ||
-							this._intersectsWithSides( item ) ) {
-						this._rearrange( event, item );
-					} else {
-						break;
-					}
+				this.direction = intersection === 1 ? "down" : "up";
 
-					this._trigger( "change", event, this._uiHash() );
+				if ( this.options.tolerance === "pointer" ||
+					this._intersectsWithSides( item ) ) {
+					this._rearrange( event, item );
+				} else {
 					break;
 				}
+
+				this._trigger( "change", event, this._uiHash() );
+				break;
 			}
 		}
 
+		//Post events to containers
+		this._contactContainers( event );
+
 		//Interconnect with droppables
 		if ( $.ui.ddmanager ) {
 			$.ui.ddmanager.drag( this, event );
@@ -523,15 +520,15 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 			if ( !axis || axis === "x" ) {
 				animation.left = cur.left - this.offset.parent.left - this.margins.left +
 					( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
-						0 :
-						this.offsetParent[ 0 ].scrollLeft
+							0 :
+							this.offsetParent[ 0 ].scrollLeft
 					);
 			}
 			if ( !axis || axis === "y" ) {
 				animation.top = cur.top - this.offset.parent.top - this.margins.top +
 					( this.offsetParent[ 0 ] === this.document[ 0 ].body ?
-						0 :
-						this.offsetParent[ 0 ].scrollTop
+							0 :
+							this.offsetParent[ 0 ].scrollTop
 					);
 			}
 			this.reverting = true;
@@ -582,7 +579,7 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 				this.placeholder[ 0 ].parentNode.removeChild( this.placeholder[ 0 ] );
 			}
 			if ( this.options.helper !== "original" && this.helper &&
-					this.helper[ 0 ].parentNode ) {
+				this.helper[ 0 ].parentNode ) {
 				this.helper.remove();
 			}
 
@@ -858,7 +855,7 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 
 			//We ignore calculating positions of all connected containers when we're not over them
 			if ( this.currentContainer && item.instance !== this.currentContainer &&
-					item.item[ 0 ] !== this.currentItem[ 0 ] ) {
+				item.item[ 0 ] !== this.currentItem[ 0 ] ) {
 				continue;
 			}
 
@@ -884,10 +881,14 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 			this.options.axis === "x" || this._isFloating( this.items[ 0 ].item ) :
 			false;
 
-		if ( this.innermostContainer !== null ) {
-			this._refreshItemPositions( fast );
+		// This has to be redone because due to the item being moved out/into the offsetParent,
+		// the offsetParent's position will change
+		if ( this.offsetParent && this.helper ) {
+			this.offset.parent = this._getParentOffset();
 		}
 
+		this._refreshItemPositions( fast );
+
 		var i, p;
 
 		if ( this.options.custom && this.options.custom.refreshContainers ) {
@@ -921,7 +922,7 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 					var element = $( "<" + nodeName + ">", that.document[ 0 ] );
 
 					that._addClass( element, "ui-sortable-placeholder",
-							className || that.currentItem[ 0 ].className )
+						className || that.currentItem[ 0 ].className )
 						._removeClass( element, "ui-sortable-helper" );
 
 					if ( nodeName === "tbody" ) {
@@ -959,7 +960,7 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 					// always assign the height of the dragged item given forcePlaceholderSize
 					// is true.
 					if ( !p.height() || ( o.forcePlaceholderSize &&
-							( nodeName === "tbody" || nodeName === "tr" ) ) ) {
+						( nodeName === "tbody" || nodeName === "tr" ) ) ) {
 						p.height(
 							that.currentItem.innerHeight() -
 							parseInt( that.currentItem.css( "paddingTop" ) || 0, 10 ) -
@@ -1014,9 +1015,9 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 
 				// If we've already found a container and it's more "inner" than this, then continue
 				if ( innermostContainer &&
-						$.contains(
-							this.containers[ i ].element[ 0 ],
-							innermostContainer.element[ 0 ] ) ) {
+					$.contains(
+						this.containers[ i ].element[ 0 ],
+						innermostContainer.element[ 0 ] ) ) {
 					continue;
 				}
 
@@ -1034,8 +1035,6 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 
 		}
 
-		this.innermostContainer = innermostContainer;
-
 		// If no intersecting containers found, return
 		if ( !innermostContainer ) {
 			return;
@@ -1060,7 +1059,7 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 
 			for ( j = this.items.length - 1; j >= 0; j-- ) {
 				if ( !$.contains(
-						this.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )
+					this.containers[ innermostIndex ].element[ 0 ], this.items[ j ].item[ 0 ] )
 				) {
 					continue;
 				}
@@ -1111,7 +1110,7 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 
 			//Update overflowOffset
 			if ( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
-					this.scrollParent[ 0 ].tagName !== "HTML" ) {
+				this.scrollParent[ 0 ].tagName !== "HTML" ) {
 				this.overflowOffset = this.scrollParent.offset();
 			}
 
@@ -1189,7 +1188,7 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 		// the document, which means that the scroll is included in the initial calculation of the
 		// offset of the parent, and never recalculated upon drag
 		if ( this.cssPosition === "absolute" && this.scrollParent[ 0 ] !== this.document[ 0 ] &&
-				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
+			$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) {
 			po.left += this.scrollParent.scrollLeft();
 			po.top += this.scrollParent.scrollTop();
 		}
@@ -1197,7 +1196,7 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 		// This needs to be actually done for all browsers, since pageX/pageY includes this
 		// information with an ugly IE fix
 		if ( this.offsetParent[ 0 ] === this.document[ 0 ].body ||
-				( this.offsetParent[ 0 ].tagName &&
+			( this.offsetParent[ 0 ].tagName &&
 				this.offsetParent[ 0 ].tagName.toLowerCase() === "html" && $.ui.ie ) ) {
 			po = { top: 0, left: 0 };
 		}
@@ -1254,8 +1253,8 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 					this.document.width() :
 					this.window.width() - this.helperProportions.width - this.margins.left,
 				( o.containment === "document" ?
-					( this.document.height() || document.body.parentNode.scrollHeight ) :
-					this.window.height() || this.document[ 0 ].body.parentNode.scrollHeight
+						( this.document.height() || document.body.parentNode.scrollHeight ) :
+						this.window.height() || this.document[ 0 ].body.parentNode.scrollHeight
 				) - this.helperProportions.height - this.margins.top
 			];
 		}
@@ -1267,17 +1266,17 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 
 			this.containment = [
 				co.left + ( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) +
-					( parseInt( $( ce ).css( "paddingLeft" ), 10 ) || 0 ) - this.margins.left,
+				( parseInt( $( ce ).css( "paddingLeft" ), 10 ) || 0 ) - this.margins.left,
 				co.top + ( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) +
-					( parseInt( $( ce ).css( "paddingTop" ), 10 ) || 0 ) - this.margins.top,
+				( parseInt( $( ce ).css( "paddingTop" ), 10 ) || 0 ) - this.margins.top,
 				co.left + ( over ? Math.max( ce.scrollWidth, ce.offsetWidth ) : ce.offsetWidth ) -
-					( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) -
-					( parseInt( $( ce ).css( "paddingRight" ), 10 ) || 0 ) -
-					this.helperProportions.width - this.margins.left,
+				( parseInt( $( ce ).css( "borderLeftWidth" ), 10 ) || 0 ) -
+				( parseInt( $( ce ).css( "paddingRight" ), 10 ) || 0 ) -
+				this.helperProportions.width - this.margins.left,
 				co.top + ( over ? Math.max( ce.scrollHeight, ce.offsetHeight ) : ce.offsetHeight ) -
-					( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) -
-					( parseInt( $( ce ).css( "paddingBottom" ), 10 ) || 0 ) -
-					this.helperProportions.height - this.margins.top
+				( parseInt( $( ce ).css( "borderTopWidth" ), 10 ) || 0 ) -
+				( parseInt( $( ce ).css( "paddingBottom" ), 10 ) || 0 ) -
+				this.helperProportions.height - this.margins.top
 			];
 		}
 
@@ -1290,10 +1289,10 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 		}
 		var mod = d === "absolute" ? 1 : -1,
 			scroll = this.cssPosition === "absolute" &&
-				!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
+			!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
 				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
-					this.offsetParent :
-					this.scrollParent,
+				this.offsetParent :
+				this.scrollParent,
 			scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
 
 		return {
@@ -1323,7 +1322,7 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 				this.offset.parent.left * mod	-
 				( ( this.cssPosition === "fixed" ?
 					-this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 :
-					scroll.scrollLeft() ) * mod )
+						scroll.scrollLeft() ) * mod )
 			)
 		};
 
@@ -1336,18 +1335,18 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 			pageX = event.pageX,
 			pageY = event.pageY,
 			scroll = this.cssPosition === "absolute" &&
-				!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
+			!( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
 				$.contains( this.scrollParent[ 0 ], this.offsetParent[ 0 ] ) ) ?
-					this.offsetParent :
-					this.scrollParent,
-				scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
+				this.offsetParent :
+				this.scrollParent,
+			scrollIsRootNode = ( /(html|body)/i ).test( scroll[ 0 ].tagName );
 
 		// This is another very weird special case that only happens for relative elements:
 		// 1. If the css position is relative
 		// 2. and the scroll parent is the document or similar to the offset parent
 		// we have to refresh the relative offset during the scroll so there are no jumps
 		if ( this.cssPosition === "relative" && !( this.scrollParent[ 0 ] !== this.document[ 0 ] &&
-				this.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {
+			this.scrollParent[ 0 ] !== this.offsetParent[ 0 ] ) ) {
 			this.offset.relative = this._getRelativeOffset();
 		}
 
@@ -1379,20 +1378,20 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 				pageY = this.containment ?
 					( ( top - this.offset.click.top >= this.containment[ 1 ] &&
 						top - this.offset.click.top <= this.containment[ 3 ] ) ?
-							top :
-							( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?
-								top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :
-								top;
+						top :
+						( ( top - this.offset.click.top >= this.containment[ 1 ] ) ?
+							top - o.grid[ 1 ] : top + o.grid[ 1 ] ) ) :
+					top;
 
 				left = this.originalPageX + Math.round( ( pageX - this.originalPageX ) /
 					o.grid[ 0 ] ) * o.grid[ 0 ];
 				pageX = this.containment ?
 					( ( left - this.offset.click.left >= this.containment[ 0 ] &&
 						left - this.offset.click.left <= this.containment[ 2 ] ) ?
-							left :
-							( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?
-								left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :
-								left;
+						left :
+						( ( left - this.offset.click.left >= this.containment[ 0 ] ) ?
+							left - o.grid[ 0 ] : left + o.grid[ 0 ] ) ) :
+					left;
 			}
 
 		}
@@ -1499,9 +1498,9 @@ return $.widget( "ui.sortable", $.ui.mouse, {
 			} );
 		}
 		if ( ( this.fromOutside ||
-				this.domPosition.prev !==
-				this.currentItem.prev().not( ".ui-sortable-helper" )[ 0 ] ||
-				this.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {
+			this.domPosition.prev !==
+			this.currentItem.prev().not( ".ui-sortable-helper" )[ 0 ] ||
+			this.domPosition.parent !== this.currentItem.parent()[ 0 ] ) && !noPropagation ) {
 
 			// Trigger update callback if the DOM position has changed
 			delayedTriggers.push( function( event ) {
diff --git a/src/js/_enqueues/vendor/jquery/ui/spinner.js b/src/js/_enqueues/vendor/jquery/ui/spinner.js
index eca42bf40b..54b2679430 100644
--- a/src/js/_enqueues/vendor/jquery/ui/spinner.js
+++ b/src/js/_enqueues/vendor/jquery/ui/spinner.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Spinner 1.13.0
+ * jQuery UI Spinner 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -47,7 +47,7 @@ function spinnerModifier( fn ) {
 }
 
 $.widget( "ui.spinner", {
-	version: "1.13.0",
+	version: "1.13.1",
 	defaultElement: "<input>",
 	widgetEventPrefix: "spin",
 	options: {
@@ -234,10 +234,10 @@ $.widget( "ui.spinner", {
 			.wrap( "<span>" )
 			.parent()
 
-				// Add buttons
-				.append(
-					"<a></a><a></a>"
-				);
+			// Add buttons
+			.append(
+				"<a></a><a></a>"
+			);
 	},
 
 	_draw: function() {
@@ -275,7 +275,7 @@ $.widget( "ui.spinner", {
 		// IE 6 doesn't understand height: 50% for the buttons
 		// unless the wrapper has an explicit height
 		if ( this.buttons.height() > Math.ceil( this.uiSpinner.height() * 0.5 ) &&
-				this.uiSpinner.height() > 0 ) {
+			this.uiSpinner.height() > 0 ) {
 			this.uiSpinner.height( this.uiSpinner.height() );
 		}
 	},
@@ -285,18 +285,18 @@ $.widget( "ui.spinner", {
 			keyCode = $.ui.keyCode;
 
 		switch ( event.keyCode ) {
-		case keyCode.UP:
-			this._repeat( null, 1, event );
-			return true;
-		case keyCode.DOWN:
-			this._repeat( null, -1, event );
-			return true;
-		case keyCode.PAGE_UP:
-			this._repeat( null, options.page, event );
-			return true;
-		case keyCode.PAGE_DOWN:
-			this._repeat( null, -options.page, event );
-			return true;
+			case keyCode.UP:
+				this._repeat( null, 1, event );
+				return true;
+			case keyCode.DOWN:
+				this._repeat( null, -1, event );
+				return true;
+			case keyCode.PAGE_UP:
+				this._repeat( null, options.page, event );
+				return true;
+			case keyCode.PAGE_DOWN:
+				this._repeat( null, -options.page, event );
+				return true;
 		}
 
 		return false;
@@ -561,8 +561,8 @@ if ( $.uiBackCompat !== false ) {
 				.wrap( this._uiSpinnerHtml() )
 				.parent()
 
-					// Add buttons
-					.append( this._buttonHtml() );
+				// Add buttons
+				.append( this._buttonHtml() );
 		},
 		_uiSpinnerHtml: function() {
 			return "<span>";
diff --git a/src/js/_enqueues/vendor/jquery/ui/tabs.js b/src/js/_enqueues/vendor/jquery/ui/tabs.js
index 8cddc5d0e5..5d44bdd5f6 100644
--- a/src/js/_enqueues/vendor/jquery/ui/tabs.js
+++ b/src/js/_enqueues/vendor/jquery/ui/tabs.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Tabs 1.13.0
+ * jQuery UI Tabs 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -35,7 +35,7 @@
 "use strict";
 
 $.widget( "ui.tabs", {
-	version: "1.13.0",
+	version: "1.13.1",
 	delay: 300,
 	options: {
 		active: null,
@@ -176,39 +176,39 @@ $.widget( "ui.tabs", {
 		}
 
 		switch ( event.keyCode ) {
-		case $.ui.keyCode.RIGHT:
-		case $.ui.keyCode.DOWN:
-			selectedIndex++;
-			break;
-		case $.ui.keyCode.UP:
-		case $.ui.keyCode.LEFT:
-			goingForward = false;
-			selectedIndex--;
-			break;
-		case $.ui.keyCode.END:
-			selectedIndex = this.anchors.length - 1;
-			break;
-		case $.ui.keyCode.HOME:
-			selectedIndex = 0;
-			break;
-		case $.ui.keyCode.SPACE:
-
-			// Activate only, no collapsing
-			event.preventDefault();
-			clearTimeout( this.activating );
-			this._activate( selectedIndex );
-			return;
-		case $.ui.keyCode.ENTER:
+			case $.ui.keyCode.RIGHT:
+			case $.ui.keyCode.DOWN:
+				selectedIndex++;
+				break;
+			case $.ui.keyCode.UP:
+			case $.ui.keyCode.LEFT:
+				goingForward = false;
+				selectedIndex--;
+				break;
+			case $.ui.keyCode.END:
+				selectedIndex = this.anchors.length - 1;
+				break;
+			case $.ui.keyCode.HOME:
+				selectedIndex = 0;
+				break;
+			case $.ui.keyCode.SPACE:
+
+				// Activate only, no collapsing
+				event.preventDefault();
+				clearTimeout( this.activating );
+				this._activate( selectedIndex );
+				return;
+			case $.ui.keyCode.ENTER:
 
-			// Toggle (cancel delayed activation, allow collapsing)
-			event.preventDefault();
-			clearTimeout( this.activating );
+				// Toggle (cancel delayed activation, allow collapsing)
+				event.preventDefault();
+				clearTimeout( this.activating );
 
-			// Determine if we should collapse or activate
-			this._activate( selectedIndex === this.options.active ? false : selectedIndex );
-			return;
-		default:
-			return;
+				// Determine if we should collapse or activate
+				this._activate( selectedIndex === this.options.active ? false : selectedIndex );
+				return;
+			default:
+				return;
 		}
 
 		// Focus the appropriate tab, based on which key was pressed
@@ -330,7 +330,7 @@ $.widget( "ui.tabs", {
 			options.active = false;
 			this.active = $();
 
-		// was active, but active tab is gone
+			// was active, but active tab is gone
 		} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
 
 			// all remaining tabs are disabled
@@ -338,12 +338,12 @@ $.widget( "ui.tabs", {
 				options.active = false;
 				this.active = $();
 
-			// activate previous tab
+				// activate previous tab
 			} else {
 				this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
 			}
 
-		// was active, active tab still exists
+			// was active, active tab still exists
 		} else {
 
 			// make sure active index is correct
@@ -447,7 +447,7 @@ $.widget( "ui.tabs", {
 				panelId = selector.substring( 1 );
 				panel = that.element.find( that._sanitizeSelector( selector ) );
 
-			// remote tab
+				// remote tab
 			} else {
 
 				// If the tab doesn't already have aria-controls,
@@ -605,17 +605,17 @@ $.widget( "ui.tabs", {
 
 		if ( tab.hasClass( "ui-state-disabled" ) ||
 
-				// tab is already loading
-				tab.hasClass( "ui-tabs-loading" ) ||
+			// tab is already loading
+			tab.hasClass( "ui-tabs-loading" ) ||
 
-				// can't switch durning an animation
-				this.running ||
+			// can't switch durning an animation
+			this.running ||
 
-				// click on active header, but not collapsible
-				( clickedIsActive && !options.collapsible ) ||
+			// click on active header, but not collapsible
+			( clickedIsActive && !options.collapsible ) ||
 
-				// allow canceling activation
-				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
+			// allow canceling activation
+			( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
 			return;
 		}
 
diff --git a/src/js/_enqueues/vendor/jquery/ui/tooltip.js b/src/js/_enqueues/vendor/jquery/ui/tooltip.js
index 9665f0763d..d4c8d74172 100644
--- a/src/js/_enqueues/vendor/jquery/ui/tooltip.js
+++ b/src/js/_enqueues/vendor/jquery/ui/tooltip.js
@@ -1,5 +1,5 @@
 /*!
- * jQuery UI Tooltip 1.13.0
+ * jQuery UI Tooltip 1.13.1
  * http://jqueryui.com
  *
  * Copyright jQuery Foundation and other contributors
@@ -35,7 +35,7 @@
 "use strict";
 
 $.widget( "ui.tooltip", {
-	version: "1.13.0",
+	version: "1.13.1",
 	options: {
 		classes: {
 			"ui-tooltip": "ui-corner-all ui-widget-shadow"
@@ -217,7 +217,7 @@ $.widget( "ui.tooltip", {
 			eventType = event ? event.type : null;
 
 		if ( typeof contentOption === "string" || contentOption.nodeType ||
-				contentOption.jquery ) {
+			contentOption.jquery ) {
 			return this._open( event, target, contentOption );
 		}
 
@@ -348,7 +348,10 @@ $.widget( "ui.tooltip", {
 		// tooltips will handle this in destroy.
 		if ( target[ 0 ] !== this.element[ 0 ] ) {
 			events.remove = function() {
-				this._removeTooltip( this._find( target ).tooltip );
+				var targetElement = this._find( target );
+				if ( targetElement ) {
+					this._removeTooltip( targetElement.tooltip );
+				}
 			};
 		}
 
diff --git a/src/js/_enqueues/vendor/tinymce/plugins/wordpress/plugin.js b/src/js/_enqueues/vendor/tinymce/plugins/wordpress/plugin.js
index 3f95448266..ecfa881449 100644
--- a/src/js/_enqueues/vendor/tinymce/plugins/wordpress/plugin.js
+++ b/src/js/_enqueues/vendor/tinymce/plugins/wordpress/plugin.js
@@ -758,7 +758,7 @@ tinymce.PluginManager.add( 'wordpress', function( editor ) {
 				tooltip = getTooltip( button.settings.tooltip );
 				button.settings.tooltip = tooltip;
 
-				// Override the aria label wiht the translated tooltip + shortcut.
+				// Override the aria label with the translated tooltip + shortcut.
 				if ( button._aria && button._aria.label ) {
 					button._aria.label = tooltip;
 				}
diff --git a/src/js/_enqueues/wp/embed.js b/src/js/_enqueues/wp/embed.js
index 887c7483fb..fa2934f379 100644
--- a/src/js/_enqueues/wp/embed.js
+++ b/src/js/_enqueues/wp/embed.js
@@ -27,6 +27,11 @@
 		return;
 	}
 
+	/**
+	 * Receive embed message.
+	 *
+	 * @param {MessageEvent} e
+	 */
 	window.wp.receiveEmbedMessage = function( e ) {
 		var data = e.data;
 
@@ -102,9 +107,11 @@
 			iframeClone, i, source, secret;
 
 		for ( i = 0; i < iframes.length; i++ ) {
+			/** @var {IframeElement} */
 			source = iframes[ i ];
 
-			if ( ! source.getAttribute( 'data-secret' ) ) {
+			secret = source.getAttribute( 'data-secret' );
+			if ( ! secret ) {
 				/* Add secret to iframe */
 				secret = Math.random().toString( 36 ).substr( 2, 10 );
 				source.src += '#?secret=' + secret;
@@ -117,6 +124,16 @@
 				iframeClone.removeAttribute( 'security' );
 				source.parentNode.replaceChild( iframeClone, source );
 			}
+
+			/*
+			 * Let post embed window know that the parent is ready for receiving the height message, in case the iframe
+			 * loaded before wp-embed.js was loaded. When the ready message is received by the post embed window, the
+			 * window will then (re-)send the height message right away.
+			 */
+			source.contentWindow.postMessage( {
+				message: 'ready',
+				secret: secret
+			}, '*' );
 		}
 	}
 
diff --git a/src/js/_enqueues/wp/updates.js b/src/js/_enqueues/wp/updates.js
index 1e101f0c59..1e00589cec 100644
--- a/src/js/_enqueues/wp/updates.js
+++ b/src/js/_enqueues/wp/updates.js
@@ -33,6 +33,7 @@
 	var $document = $( document ),
 		__ = wp.i18n.__,
 		_x = wp.i18n._x,
+		_n = wp.i18n._n,
 		sprintf = wp.i18n.sprintf;
 
 	wp = wp || {};
@@ -352,8 +353,14 @@
 			$appearanceNavMenuUpdateCount = $( 'a[href="themes.php"] .update-plugins' ),
 			itemCount;
 
-		$adminBarUpdates.find( '.ab-item' ).removeAttr( 'title' );
 		$adminBarUpdates.find( '.ab-label' ).text( settings.totals.counts.total );
+		$adminBarUpdates.find( '.updates-available-text' ).text(
+			sprintf(
+				/* translators: %s: Total number of updates available. */
+				_n( '%s update available', '%s updates available', settings.totals.counts.total ),
+				settings.totals.counts.total
+			)
+		);
 
 		// Remove the update count from the toolbar if it's zero.
 		if ( 0 === settings.totals.counts.total ) {
diff --git a/src/js/media/controllers/featured-image.js b/src/js/media/controllers/featured-image.js
index e08129fa2d..0f87ff659c 100644
--- a/src/js/media/controllers/featured-image.js
+++ b/src/js/media/controllers/featured-image.js
@@ -87,7 +87,6 @@ FeaturedImage = Library.extend(/** @lends wp.media.controller.FeaturedImage.prot
 	 * @since 3.5.0
 	 */
 	activate: function() {
-		this.updateSelection();
 		this.frame.on( 'open', this.updateSelection, this );
 
 		Library.prototype.activate.apply( this, arguments );
diff --git a/src/js/media/controllers/library.js b/src/js/media/controllers/library.js
index ace0028644..2acc89a586 100644
--- a/src/js/media/controllers/library.js
+++ b/src/js/media/controllers/library.js
@@ -196,7 +196,7 @@ Library = wp.media.controller.State.extend(/** @lends wp.media.controller.Librar
 	isImageAttachment: function( attachment ) {
 		// If uploading, we know the filename but not the mime type.
 		if ( attachment.get('uploading') ) {
-			return /\.(jpe?g|png|gif)$/i.test( attachment.get('filename') );
+			return /\.(jpe?g|png|gif|webp)$/i.test( attachment.get('filename') );
 		}
 
 		return attachment.get('type') === 'image';
diff --git a/src/js/media/controllers/replace-image.js b/src/js/media/controllers/replace-image.js
index eb6823a22b..46dce6d1ba 100644
--- a/src/js/media/controllers/replace-image.js
+++ b/src/js/media/controllers/replace-image.js
@@ -90,10 +90,20 @@ ReplaceImage = Library.extend(/** @lends wp.media.controller.ReplaceImage.protot
 	 * @since 3.9.0
 	 */
 	activate: function() {
-		this.updateSelection();
+		this.frame.on( 'content:render:browse', this.updateSelection, this );
+
 		Library.prototype.activate.apply( this, arguments );
 	},
 
+	/**
+	 * @since 5.9.0
+	 */
+	deactivate: function() {
+		this.frame.off( 'content:render:browse', this.updateSelection, this );
+
+		Library.prototype.deactivate.apply( this, arguments );
+	},
+
 	/**
 	 * @since 3.9.0
 	 */
diff --git a/src/js/media/views/attachments/browser.js b/src/js/media/views/attachments/browser.js
index eace0eec9e..7f40140fc5 100644
--- a/src/js/media/views/attachments/browser.js
+++ b/src/js/media/views/attachments/browser.js
@@ -130,7 +130,7 @@ AttachmentsBrowser = View.extend(/** @lends wp.media.view.AttachmentsBrowser.pro
 			mediaFoundHasMoreResultsMessage = __( 'Number of media items displayed: %d. Scroll the page for more results.' );
 		}
 
-		if ( this.collection.mirroring.args.s ) {
+		if ( this.collection.hasOwnProperty('mirroring') && this.collection.mirroring.args.s ) {
 			count = this.collection.length;
 
 			if ( 0 === count ) {
diff --git a/src/js/media/views/modal.js b/src/js/media/views/modal.js
index f28c92e7e6..8ef4fbb6e1 100644
--- a/src/js/media/views/modal.js
+++ b/src/js/media/views/modal.js
@@ -138,7 +138,7 @@ Modal = wp.media.View.extend(/** @lends wp.media.view.Modal.prototype */{
 		// Enable page scrolling.
 		$( 'body' ).removeClass( 'modal-open' );
 
-		// Hide the modal element by adding display none.
+		// Hide the modal element by adding display:none.
 		this.$el.hide();
 
 		/*
diff --git a/src/license.txt b/src/license.txt
index 37bcf30ee1..5efa95e73b 100644
--- a/src/license.txt
+++ b/src/license.txt
@@ -1,6 +1,6 @@
 WordPress - Web publishing software
 
-Copyright 2011-2021 by the contributors
+Copyright 2011-2022 by the contributors
 
 This program is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
diff --git a/src/readme.html b/src/readme.html
index e246fb641e..89a3ba656a 100644
--- a/src/readme.html
+++ b/src/readme.html
@@ -51,14 +51,14 @@
 
 <h2>System Requirements</h2>
 <ul>
-	<li><a href="https://secure.php.net/">PHP</a> version <strong>5.6.20</strong> or higher.</li>
-	<li><a href="https://www.mysql.com/">MySQL</a> version <strong>5.0</strong> or higher.</li>
+	<li><a href="https://secure.php.net/">PHP</a> version <strong>5.6.20</strong> or greater.</li>
+	<li><a href="https://www.mysql.com/">MySQL</a> version <strong>5.0</strong> or greater.</li>
 </ul>
 
 <h3>Recommendations</h3>
 <ul>
-	<li><a href="https://secure.php.net/">PHP</a> version <strong>7.4</strong> or higher.</li>
-	<li><a href="https://www.mysql.com/">MySQL</a> version <strong>5.6</strong> or higher.</li>
+	<li><a href="https://secure.php.net/">PHP</a> version <strong>7.4</strong> or greater.</li>
+	<li><a href="https://www.mysql.com/">MySQL</a> version <strong>5.7</strong> or greater OR <a href="https://mariadb.org/">MariaDB</a> version <strong>10.2</strong> or greater.</li>
 	<li>The <a href="https://httpd.apache.org/docs/2.2/mod/mod_rewrite.html">mod_rewrite</a> Apache module.</li>
 	<li><a href="https://wordpress.org/news/2016/12/moving-toward-ssl/">HTTPS</a> support.</li>
 	<li>A link to <a href="https://wordpress.org/">wordpress.org</a> on your site.</li>
diff --git a/src/wp-admin/about.php b/src/wp-admin/about.php
index 5b65bd06d2..9b9f0867fc 100644
--- a/src/wp-admin/about.php
+++ b/src/wp-admin/about.php
@@ -23,12 +23,12 @@ require_once ABSPATH . 'wp-admin/admin-header.php';
 			<div class="about__header-title">
 				<h1>
 					<?php _e( 'WordPress' ); ?>
-					<?php echo $display_version; ?>
+					<span class="screen-reader-text"><?php echo $display_version; ?></span>
 				</h1>
 			</div>
 
 			<div class="about__header-text">
-				<?php _e( 'The next stop on the road to full site editing' ); ?>
+				<?php _e( 'Build the site you&#8217;ve always wanted &#8212; with blocks' ); ?>
 			</div>
 
 			<nav class="about__header-navigation nav-tab-wrapper wp-clearfix" aria-label="<?php esc_attr_e( 'Secondary menu' ); ?>">
@@ -39,60 +39,77 @@ require_once ABSPATH . 'wp-admin/admin-header.php';
 			</nav>
 		</div>
 
-		<hr />
+		<hr class="is-large" />
 
 		<div class="about__section">
 			<h2 class="aligncenter">
-				<?php _e( 'Three Essential Powerhouses' ); ?>
+				<?php _e( 'Full Site Editing is here' ); ?>
 			</h2>
+			<p class="aligncenter is-subheading">
+				<?php _e( 'It puts you in control of your whole site, right in the WordPress Admin.' ); ?>
+			</p>
 		</div>
 
-		<div class="about__section has-2-columns is-wider-left">
-			<div class="column about__image is-vertically-aligned-center">
-				<img src="https://s.w.org/images/core/5.8/about-widgets-blocks.png" alt="" />
+		<hr />
+
+		<div class="about__section has-2-columns has-gutters is-wider-left">
+			<div class="column about__image is-vertically-aligned-center is-edge-to-edge">
+				<img src="https://s.w.org/images/core/5.9/twenty-twenty-two.png" alt="" />
 			</div>
-			<div class="column">
+			<div class="column is-edge-to-edge">
 				<h3>
-					<?php _e( 'Manage Widgets with Blocks' ); ?>
+					<?php _e( 'Say hello to Twenty Twenty&#8209;Two' ); ?>
 				</h3>
+				<p>
+					<?php _e( 'And say hello to the first default block theme in the history of WordPress. This is more than just a new default theme. It&#8217;s a brand-new way to work with WordPress themes.' ); ?>
+				</p>
+				<p>
+					<?php _e( 'Block themes put a wide array of visual choices in your hands, from color schemes and typeface combinations to page templates and image filters &#8212; all together, in the site editing interface. By making changes in one place, you can give Twenty Twenty&#8209;Two the same look and feel as your brand or other websites &#8212; or take your site&#8217;s look in another direction.' ); ?>
+				</p>
+				<?php if ( current_user_can( 'switch_themes' ) ) : ?>
 				<p>
 					<?php
 					printf(
-						/* translators: %s: Widgets dev note link. */
-						__( 'After months of hard work, the power of blocks has come to both the Block Widgets Editor and the Customizer. Now you can add blocks both in widget areas across your site and with live preview through the Customizer. This opens up new possibilities to create content: from no-code mini layouts to the vast library of core and third-party blocks. For our developers, you can find more details in the <a href="%s">Widgets dev note</a>.' ),
-						'https://make.wordpress.org/core/2021/06/29/block-based-widgets-editor-in-wordpress-5-8/'
+						/* translators: %s: Link to Themes screen. */
+						__( 'The Twenty Twenty&#8209;Two theme is already available to you. It came installed with WordPress 5.9, and you will find it with <a href="%s">your other installed themes</a>.' ),
+						admin_url( 'themes.php' )
 					);
 					?>
 				</p>
+				<?php endif; ?>
 			</div>
 		</div>
 
-		<div class="about__section has-2-columns is-wider-right">
-			<div class="column">
+		<div class="about__section has-2-columns has-gutters is-wider-right">
+			<div class="column is-edge-to-edge">
 				<h3>
-					<?php _e( 'Display Posts with New Blocks and Patterns' ); ?>
+					<?php _e( 'Your personal paintbox awaits' ); ?>
 				</h3>
 				<p>
-					<?php _e( 'The Query Loop Block makes it possible to display posts based on specified parameters; like a PHP loop without the code. Easily display posts from a specific category, to do things like create a portfolio or a page full of your favorite recipes. Think of it as a more complex and powerful Latest Posts Block! Plus, pattern suggestions make it easier than ever to create a list of posts with the design you want.' ); ?>
+					<?php _e( 'More block themes built for full site editing features are in the Theme Directory alongside the Twenty Twenty&#8209;Two theme, just waiting to be explored. Expect more to come!' ); ?>
+				</p>
+				<p>
+					<?php _e( 'When you use any of those new themes, you no longer need the Customizer. Instead, you have all the power of the Styles interface inside the Site Editor. Just as in Twenty Twenty&#8209;Two, you build your site&#8217;s look and feel there, with the tools you need for the job in a fluid interface that practically comes alive in your hands.' ); ?>
 				</p>
 			</div>
-			<div class="column about__image is-vertically-aligned-center">
-				<img src="https://s.w.org/images/core/5.8/about-query-loop.png" alt="" />
+			<div class="column about__image is-vertically-aligned-center is-edge-to-edge">
+				<img src="https://s.w.org/images/core/5.9/global-styles.png" alt="" />
 			</div>
 		</div>
 
-		<div class="about__section has-2-columns is-wider-left">
-			<div class="column about__image is-vertically-aligned-center">
-				<img src="https://s.w.org/images/core/5.8/about-template.png" alt="" />
+		<div class="about__section has-2-columns has-gutters is-wider-left">
+			<div class="column about__image is-vertically-aligned-center is-edge-to-edge">
+				<img src="https://s.w.org/images/core/5.9/navigation-block.png" alt="" />
 			</div>
-			<div class="column">
+			<div class="column is-edge-to-edge">
 				<h3>
-					<?php _e( 'Edit the Templates Around Posts' ); ?>
+					<?php _e( 'The Navigation block' ); ?>
 				</h3>
 				<p>
-					<?php
-					_e( 'You can use the familiar block editor to edit templates that hold your content—simply activate a block theme or a theme that has opted in for this feature. Switch from editing your posts to editing your pages and back again, all while using a familiar block editor. There are more than 20 new blocks available within compatible themes. Read more about this feature and how to experiment with it in the release notes.' );
-					?>
+					<?php _e( 'Blocks come to site navigation, the heart of user experience.' ); ?>
+				</p>
+				<p>
+					<?php _e( 'The new Navigation block gives you the power to choose: an always-on responsive menu or one that adapts to your user&#8217;s screen size. Whatever you create, know it&#8217;s there to reuse wherever you like, whether in a brand new template or after switching themes.' ); ?>
 				</p>
 			</div>
 		</div>
@@ -101,133 +118,167 @@ require_once ABSPATH . 'wp-admin/admin-header.php';
 
 		<div class="about__section">
 			<h2 class="aligncenter">
-				<?php _e( 'Three Workflow Helpers' ); ?>
+				<?php _e( 'More improvements and updates' ); ?>
 			</h2>
+			<p class="aligncenter is-subheading">
+				<?php _e( 'Do you love to blog or produce content? New tweaks to the publishing flow help you say more, faster.' ); ?>
+			</p>
 		</div>
 
-		<div class="about__section has-2-columns is-wider-left">
-			<div class="column about__image is-vertically-aligned-center">
-				<img src="https://s.w.org/images/core/5.8/about-list-view.png" alt="" />
+		<hr />
+
+		<div class="about__section has-2-columns has-gutters is-wider-left">
+			<div class="column about__image is-vertically-aligned-center is-edge-to-edge">
+				<img src="https://s.w.org/images/core/5.9/block-controls.png" alt="" />
 			</div>
-			<div class="column">
+			<div class="column is-edge-to-edge">
 				<h3>
-					<?php _e( 'Overview of the Page Structure' ); ?>
+					<?php _e( 'Better block controls' ); ?>
 				</h3>
 				<p>
-					<?php
-					_e( 'Sometimes you need a simple landing page, but sometimes you need something a little more robust. As blocks increase, patterns emerge, and content creation gets easier, new solutions are needed to make complex content easy to navigate. List View is the best way to jump between layers of content and nested blocks. Since the List View gives you an overview of all the blocks in your content, you can now navigate quickly to the precise block you need. Ready to focus completely on your content? Toggle it on or off to suit your workflow.' );
-					?>
+					<?php _e( 'WordPress 5.9 features new typography tools, flexible layout controls, and finer control over details like spacing, borders, and more &#8212; to help you get not just the look, but the polish that says you care about details.' ); ?>
 				</p>
 			</div>
 		</div>
 
-		<div class="about__section has-2-columns is-wider-right">
-			<div class="column">
+		<div class="about__section has-2-columns has-gutters is-wider-right">
+			<div class="column is-edge-to-edge">
 				<h3>
-					<?php _e( 'Suggested Patterns for Blocks' ); ?>
+					<?php _e( 'The power of patterns' ); ?>
 				</h3>
 				<p>
-					<?php
-					_e( 'Starting in this release the Pattern Transformations tool will suggest block patterns based on the block you are using. Right now, you can give it a try in the Query Block and Social Icon Block. As more patterns are added, you will be able to get inspiration for how to style your site without ever leaving the editor!' );
-					?>
+					<?php _e( 'The WordPress Pattern Directory is the home of a wide range of block patterns built to save you time and add core site functionality. And you can edit them as you see fit. Need something different in the header or footer for your theme? Swap it out with a new one in a few clicks.' ); ?>
+				</p>
+				<p>
+					<?php _e( 'With a near full-screen view that draws you in to see fine details, the Pattern Explorer makes it easy to compare patterns and choose the one your users will expect.' ); ?>
 				</p>
 			</div>
-			<div class="column about__image is-vertically-aligned-center">
-				<img src="https://s.w.org/images/core/5.8/about-pattern-suggestions.png" alt="" />
+			<div class="column about__image is-vertically-aligned-center is-edge-to-edge">
+				<img src="https://s.w.org/images/core/5.9/pattern-explorer.png" alt="" />
 			</div>
 		</div>
 
-		<div class="about__section has-2-columns is-wider-left">
-			<div class="column about__image is-vertically-aligned-center">
-				<img src="https://s.w.org/images/core/5.8/about-duotone.png" alt="" />
+		<div class="about__section has-2-columns has-gutters is-wider-left">
+			<div class="column about__image is-vertically-aligned-center is-edge-to-edge">
+				<img src="https://s.w.org/images/core/5.9/list-view.png" alt="" />
 			</div>
-			<div class="column">
+			<div class="column is-edge-to-edge">
 				<h3>
-					<?php _e( 'Style and Colorize Images' ); ?>
+					<?php _e( 'A revamped List View' ); ?>
 				</h3>
 				<p>
-					<?php
-					_e( 'Colorize your image and cover blocks with duotone filters! Duotone can add a pop of color to your designs and style your images (or videos in the cover block) to integrate well with your themes. You can think of the duotone effect as a black and white filter, but instead of the shadows being black and the highlights being white, you pick your own colors for the shadows and highlights. There’s more to learn about how it works in the documentation.' );
-					?>
+					<?php _e( 'In 5.9, the List View lets you drag and drop your content exactly where you want it. Managing complex documents is easier, too: simple controls let you expand and collapse sections as you build your site &#8212; and add HTML anchors to your blocks to help users get around the page.' ); ?>
+				</p>
+			</div>
+		</div>
+
+		<div class="about__section has-2-columns has-gutters is-wider-right">
+			<div class="column is-edge-to-edge">
+				<h3>
+					<?php _e( 'A better Gallery block' ); ?>
+				</h3>
+				<p>
+					<?php _e( 'Treat every image in a Gallery block the same way you would treat it in the Image block.' ); ?>
+				</p>
+				<p>
+					<?php _e( 'Style every image in your gallery differently from the next (with different crops, or duotones, for instance) or make them all the same. And change the layout with drag-and-drop.' ); ?>
 				</p>
 			</div>
+			<div class="column about__image is-vertically-aligned-center is-edge-to-edge">
+				<img src="https://s.w.org/images/core/5.9/gallery-block.png" alt="" />
+			</div>
 		</div>
 
 		<hr class="is-large" />
 
 		<div class="about__section">
 			<h2 class="aligncenter" style="margin-bottom:0;">
-				<?php _e( 'For Developers to Explore' ); ?>
+				<?php
+				printf(
+					/* translators: %s: Version number. */
+					__( 'WordPress %s for developers' ),
+					$display_version
+				);
+				?>
 			</h2>
-			<div class="column about__image is-vertically-aligned-center">
-				<picture>
-					<source srcset="https://s.w.org/images/core/5.8/about-theme-json.png, https://s.w.org/images/core/5.8/about-theme-json-2x.png 2x" />
-					<img src="https://s.w.org/images/core/5.8/about-theme-json.png" alt="" />
-				</picture>
-			</div>
 		</div>
 
-		<div class="about__section has-1-column">
-			<div class="column">
+		<div class="about__section has-gutters has-2-columns">
+			<div class="column is-edge-to-edge">
 				<h3>
-					<?php _e( 'Theme.json' ); ?>
+					<?php _e( 'Introducing block themes' ); ?>
 				</h3>
 				<p>
 					<?php
 					printf(
-						/* translators: %s: Theme.json dev note link. */
-						__( 'Introducing the Global Styles and Global Settings APIs: control the editor settings, available customization tools, and style blocks using a theme.json file in the active theme. This configuration file enables or disables features and sets default styles for both a website and blocks. If you build themes, you can experiment with this early iteration of a useful new feature. For more about what is currently available and how it works, <a href="%s">check out this dev note</a>.' ),
-						'https://make.wordpress.org/core/2021/06/25/introducing-theme-json-in-wordpress-5-8/'
+						/* translators: %s: Block-based themes dev note link. */
+						__( 'A new way to build themes: Block themes use blocks to define the templates that structure your entire site. The new templates and template parts are defined in HTML and use the custom styling offered in theme.json. More information is available in the <a href="%s">block themes dev note</a>.' ),
+						'https://make.wordpress.org/core/2022/01/04/block-themes-a-new-way-to-build-themes-in-wordpress-5-9/'
 					);
 					?>
 				</p>
 			</div>
-		</div>
-
-		<div class="about__section has-3-columns">
-			<div class="column">
+			<div class="column is-edge-to-edge">
 				<h3>
-					<?php _e( 'Dropping support for Internet Explorer 11' ); ?>
+					<?php _e( 'Multiple stylesheets for a block' ); ?>
 				</h3>
 				<p>
 					<?php
 					printf(
-						/* translators: %s: Link to Browse Happy. */
-						__( 'Support for Internet Explorer 11 has been dropped as of this release. This means you may have issues managing your site that will not be fixed in the future. If you are currently using IE11, it is strongly recommended that you <a href="%s">switch to a more modern browser</a>.' ),
-						'https://browsehappy.com/'
+						/* translators: %s: Multiple stylesheets dev note link. */
+						__( 'Now you can register more than one stylesheet per block. You can use this to share styles across blocks you write, or to load styles for individual blocks, so your styles are only loaded when the block is used. Find out more about <a href="%s">using multiple stylesheets in a block</a>.' ),
+						'https://make.wordpress.org/core/2021/12/15/using-multiple-stylesheets-per-block/'
 					);
 					?>
 				</p>
 			</div>
-			<div class="column">
+		</div>
+		<div class="about__section has-gutters has-2-columns">
+			<div class="column is-edge-to-edge">
 				<h3>
-					<?php _e( 'Adding support for WebP' ); ?>
+					<?php _e( 'Block&#8209;level locking' ); ?>
+				</h3>
+				<p>
+					<?php _e( 'Now you can lock any block (or a few of them) in a pattern, just by adding a lock attribute to its settings in block.json &#8212; leaving the rest of the pattern free for site editors to adapt to their content.' ); ?>
+				</p>
+			</div>
+			<div class="column is-edge-to-edge">
+				<h3>
+					<?php _e( 'A refactored Gallery block' ); ?>
 				</h3>
 				<p>
 					<?php
-					_e( 'WebP is a modern image format that provides improved lossless and lossy compression for images on the web. WebP images are around 30% smaller on average than their JPEG or PNG equivalents, resulting in sites that are faster and use less bandwidth.' );
+					printf(
+						/* translators: %s: Gallery Refactor dev note link. */
+						__( 'The changes to the Gallery block listed above are the result of a near-complete refactoring. Have you built a plugin or theme on the Gallery block functionality? Be sure to read the <a href="%s">Gallery block compatibility dev note</a>.' ),
+						'https://make.wordpress.org/core/2021/08/20/gallery-block-refactor-dev-note/'
+					);
 					?>
 				</p>
 			</div>
+		</div>
+
+		<hr class="is-large" />
+
+		<div class="about__section has-subtle-background-color has-2-columns is-wider-right">
+			<div class="column about__image is-vertically-aligned-center">
+				<img src="https://s.w.org/images/core/5.9/learn-video.png" alt="" />
+			</div>
 			<div class="column">
-				<h3>
-					<?php _e( 'Adding Additional Block Supports' ); ?>
-				</h3>
+				<h3><?php _e( 'Learn more about the new features in 5.9' ); ?></h3>
 				<p>
 					<?php
 					printf(
-						/* translators: %1$s: Link to 5.6's block dev notes. %2$s: Link to 5.7's block dev notes. %3$s: Link to 5.8's block dev notes. */
-						__( 'Expanding on previously implemented block supports in WordPress <a href="%1$s">5.6</a> and <a href="%2$s">5.7</a>, WordPress 5.8 introduces several new block support flags and new options to customize your registered blocks. More information is available in the <a href="%3$s">block supports dev note</a>.' ),
-						'https://make.wordpress.org/core/2020/11/18/block-supports-in-wordpress-5-6/',
-						'https://make.wordpress.org/core/2021/02/24/changes-to-block-editor-components-and-blocks/',
-						'https://make.wordpress.org/core/2021/06/25/block-supports-api-updates-for-wordpress-5-8/'
+						/* translators: %s: Learn WordPress link. */
+						__( 'Want to dive into 5.9 but don&#8217;t know where to start? Visit <a href="%s">learn.wordpress.org</a> for expanding resources on new features in WordPress 5.9.' ),
+						'https://learn.wordpress.org'
 					);
 					?>
 				</p>
 			</div>
 		</div>
 
-		<hr class="is-small" />
+		<hr class="is-large" />
 
 		<div class="about__section">
 			<div class="column">
@@ -235,9 +286,9 @@ require_once ABSPATH . 'wp-admin/admin-header.php';
 				<p>
 					<?php
 					printf(
-						/* translators: %s: WordPress 5.8 Field Guide link. */
-						__( 'Check out the latest version of the WordPress Field Guide. It highlights developer notes for each change you may want to be aware of. <a href="%s">WordPress 5.8 Field Guide.</a>' ),
-						'https://make.wordpress.org/core/2021/07/03/wordpress-5-8-field-guide/'
+						/* translators: %s: WordPress 5.9 Field Guide link. */
+						__( 'Check out the latest version of the WordPress Field Guide. It highlights developer notes for each change you may want to be aware of. <a href="%s">WordPress 5.9 Field Guide.</a>' ),
+						'https://make.wordpress.org/core/2022/01/10/wordpress-5-9-field-guide/'
 					);
 					?>
 				</p>
diff --git a/src/wp-admin/admin-header.php b/src/wp-admin/admin-header.php
index 9106c63a03..57e036496f 100644
--- a/src/wp-admin/admin-header.php
+++ b/src/wp-admin/admin-header.php
@@ -97,7 +97,7 @@ wp_enqueue_script( 'svg-painter' );
 $admin_body_class = preg_replace( '/[^a-z0-9_-]+/i', '-', $hook_suffix );
 ?>
 <script type="text/javascript">
-addLoadEvent = function(func){if(typeof jQuery!=='undefined')jQuery(document).ready(func);else if(typeof wpOnload!=='function'){wpOnload=func;}else{var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}};
+addLoadEvent = function(func){if(typeof jQuery!=='undefined')jQuery(function(){func();});else if(typeof wpOnload!=='function'){wpOnload=func;}else{var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}};
 var ajaxurl = '<?php echo esc_js( admin_url( 'admin-ajax.php', 'relative' ) ); ?>',
 	pagenow = '<?php echo esc_js( $current_screen->id ); ?>',
 	typenow = '<?php echo esc_js( $current_screen->post_type ); ?>',
diff --git a/src/wp-admin/async-upload.php b/src/wp-admin/async-upload.php
index d152673f69..f0f6dd0070 100644
--- a/src/wp-admin/async-upload.php
+++ b/src/wp-admin/async-upload.php
@@ -74,7 +74,7 @@ if ( isset( $_REQUEST['attachment_id'] ) && (int) $_REQUEST['attachment_id'] &&
 					</span>
 					<?php
 					if ( current_user_can( 'edit_post', $id ) ) {
-						echo '<a class="edit-attachment" href="' . esc_url( get_edit_post_link( $id ) ) . '" target="_blank">' . _x( 'Edit', 'media item' ) . '</a>';
+						echo '<a class="edit-attachment" href="' . esc_url( get_edit_post_link( $id ) ) . '">' . _x( 'Edit', 'media item' ) . '</a>';
 					} else {
 						echo '<span class="edit-attachment">' . _x( 'Success', 'media item' ) . '</span>';
 					}
diff --git a/src/wp-admin/credits.php b/src/wp-admin/credits.php
index 65eb55792c..fed55c3611 100644
--- a/src/wp-admin/credits.php
+++ b/src/wp-admin/credits.php
@@ -29,7 +29,13 @@ $credits = wp_credits();
 		</div>
 
 		<div class="about__header-text">
-			<?php _e( 'WordPress 5.8 was created by a worldwide team of passionate individuals' ); ?>
+			<?php
+			printf(
+				/* translators: %s: Version number. */
+				__( 'WordPress %s was created by a worldwide team of passionate individuals' ),
+				$display_version
+			);
+			?>
 		</div>
 
 		<nav class="about__header-navigation nav-tab-wrapper wp-clearfix" aria-label="<?php esc_attr_e( 'Secondary menu' ); ?>">
diff --git a/src/wp-admin/css/about.css b/src/wp-admin/css/about.css
index e57ded61c7..eff4e2940c 100644
--- a/src/wp-admin/css/about.css
+++ b/src/wp-admin/css/about.css
@@ -29,7 +29,7 @@
 
 	/* Accent colors: used in header, on special classes. */
 	--accent-1: #3858e9; /* Accent background, link color */
-	--accent-2: #2d46ba; /* Header background */
+	--accent-2: #3858e9; /* Header background */
 
 	/* Navigation colors. */
 	--nav-background: #fff;
@@ -140,25 +140,19 @@
 	margin: 0 0 var(--gap);
 }
 
-.about__section .column {
+.about__section .column:not(.is-edge-to-edge) {
 	padding: var(--gap);
 }
 
-.about__section + .about__section .column {
-	padding-top: 0;
-}
-
 .about__section + .about__section .is-section-header {
 	padding-bottom: var(--gap);
 }
 
 .about__section .column[class*="background-color"],
+.about__section:where([class*="background-color"]) .column,
 .about__section .column.has-border {
 	padding-top: var(--gap);
-}
-
-.about__section .column.is-edge-to-edge {
-	padding: 0;
+	padding-bottom: var(--gap);
 }
 
 .about__section .column p:first-of-type {
@@ -214,7 +208,8 @@
 }
 
 .about__section.has-gutters {
-	gap: calc(var(--gap) / 2);
+	gap: var(--gap);
+	margin-bottom: calc(var(--gap) * 2);
 }
 
 .about__section.has-2-columns {
@@ -222,11 +217,11 @@
 }
 
 .about__section.has-2-columns.is-wider-right {
-	grid-template-columns: 1fr 2fr;
+	grid-template-columns: 2fr 3fr;
 }
 
 .about__section.has-2-columns.is-wider-left {
-	grid-template-columns: 2fr 1fr;
+	grid-template-columns: 3fr 2fr;
 }
 
 .about__section.has-2-columns .is-section-header {
@@ -328,13 +323,24 @@
 	.about__section.has-2-columns.is-wider-left,
 	.about__section.has-3-columns {
 		display: block;
-		padding-bottom: calc(var(--gap) / 2);
+		margin-bottom: calc(var(--gap) / 2);
+	}
+
+	.about__section .column:not(.is-edge-to-edge) {
+		padding-top: var(--gap);
+		padding-bottom: var(--gap);
+	}
+
+	.about__section.has-2-columns.has-gutters.is-wider-right,
+	.about__section.has-2-columns.has-gutters.is-wider-left,
+	.about__section.has-3-columns.has-gutters {
+		margin-bottom: calc(var(--gap) * 2);
 	}
 
 	.about__section.has-2-columns.has-gutters .column,
 	.about__section.has-2-columns.has-gutters .column,
 	.about__section.has-3-columns.has-gutters .column {
-		margin-bottom: calc(var(--gap) / 2);
+		margin-bottom: var(--gap);
 	}
 
 	.about__section.has-2-columns.has-gutters .column:last-child,
@@ -393,21 +399,25 @@
 @media screen and (max-width: 600px) {
 	.about__section.has-2-columns {
 		display: block;
+		margin-bottom: var(--gap);
+	}
+
+	.about__section.has-2-columns:not(.has-gutters) .column:nth-of-type(n) {
+		padding-top: calc(var(--gap) / 2);
 		padding-bottom: calc(var(--gap) / 2);
 	}
 
+	.about__section.has-2-columns.has-gutters {
+		margin-bottom: calc(var(--gap) * 2);
+	}
+
 	.about__section.has-2-columns.has-gutters .column {
-		margin-bottom: calc(var(--gap) / 2);
+		margin-bottom: var(--gap);
 	}
 
 	.about__section.has-2-columns.has-gutters .column:last-child {
 		margin-bottom: 0;
 	}
-
-	.about__section.has-2-columns .column:nth-of-type(n) {
-		padding-top: calc(var(--gap) / 2);
-		padding-bottom: calc(var(--gap) / 2);
-	}
 }
 
 @media screen and (max-width: 480px) {
@@ -470,6 +480,11 @@
 	line-height: inherit;
 }
 
+.about__container p.is-subheading {
+	margin-top: 0;
+	font-size: 1.8em;
+}
+
 .about__section a {
 	color: var(--accent-1);
 	text-decoration: underline;
@@ -523,46 +538,6 @@
 	margin-right: auto;
 }
 
-.about__container .about__image-comparison {
-	position: relative;
-	display: inline-block;
-	max-width: 100%;
-}
-
-.about__container .about__image-comparison img {
-	-webkit-user-select: none;
-	user-select: none;
-	width: auto;
-	max-width: none;
-	max-height: 100%;
-}
-
-.about__container .about__image-comparison > img {
-	max-width: 100%;
-}
-
-.about__container .about__image-comparison-resize {
-	position: absolute !important; /* Needed to override inline style on ResizableBox */
-	top: 0;
-	bottom: 0;
-	left: 0;
-	width: 50%;
-	max-width: 100%;
-}
-
-.about__container .about__image-comparison.no-js .about__image-comparison-resize {
-	overflow: hidden;
-	border-right: 2px solid var(--wp-admin-theme-color);
-}
-
-.about__container .about__image-comparison-resize .components-resizable-box__side-handle::before {
-	width: 4px;
-	right: calc(50% - 2px);
-	transition: none;
-	animation: none;
-	opacity: 1;
-}
-
 .about__container .about__image + h3 {
 	margin-top: 1.5em;
 }
@@ -611,25 +586,46 @@
 /* 1.3 - Header */
 
 .about__header {
+	position: relative;
 	margin-bottom: var(--gap);
 	padding-top: 0;
-	background-position: center;
-	background-repeat: no-repeat;
-	background-size: cover;
-	background-image: url('../images/about-header-about.svg');
+	background-image: url('../images/about-texture.png');
 	background-color: var(--accent-2);
+	background-size: 500px 500px;
+	background-blend-mode: overlay;
 	color: var(--text-light);
 }
 
-.credits-php .about__header {
+.about__header::before {
+	content: "";
+	position: absolute;
+	top: 0;
+	right: 64px;
+	z-index: 0;
+	width: 300px;
+	height: 382px;
+	background: url(../images/about-header-about.svg) no-repeat center;
+	background-size: contain;
+}
+
+.credits-php .about__header::before {
+	top: auto;
+	bottom: 70px;
+	height: 310px;
 	background-image: url('../images/about-header-credits.svg');
 }
 
-.freedoms-php .about__header {
+.freedoms-php .about__header::before {
+	top: calc(50% - 182px);
+	right: 32px;
+	width: 375px;
+	height: 300px;
 	background-image: url('../images/about-header-freedoms.svg');
 }
 
-.privacy-php .about__header {
+.privacy-php .about__header::before {
+	top: auto;
+	bottom: -16px;
 	background-image: url('../images/about-header-privacy.svg');
 }
 
@@ -638,7 +634,9 @@
 }
 
 .about__header-title {
-	padding: 2rem 0 0;
+	box-sizing: border-box;
+	/* 380px = 300px (balloon width) + 64px (offset from edge) + 16px (spacing). */
+	padding: 6rem 380px 0 0;
 	margin: 0 2rem;
 }
 
@@ -651,14 +649,24 @@
 }
 
 .about__header-text {
-	max-width: 42rem;
-	margin: 0 0 5em;
-	padding: 0 2rem;
-	font-size: 2rem;
+	box-sizing: border-box;
+	margin: 0 0 7rem;
+	/* 380px = 300px (balloon width) + 64px (offset from edge) + 16px (spacing). */
+	padding: 0 380px 0 2rem;
+	font-size: 1.6rem;
 	line-height: 1.15;
 }
 
+.freedoms-php .about__header-title,
+.freedoms-php .about__header-text {
+	/* 423px = 375px (balloon width) + 32px (offset from edge) + 16px (spacing). */
+	padding-right: 423px;
+	margin-right: 0;
+}
+
 .about__header-navigation {
+	position: relative;
+	z-index: 1;
 	display: flex;
 	justify-content: center;
 	padding-top: 0;
@@ -707,6 +715,27 @@
 }
 
 @media screen and (max-width: 782px) {
+	.about__header::before {
+		width: 240px;
+		height: 305px;
+		right: 32px;
+	}
+
+	.credits-php .about__header::before {
+		height: 248px;
+	}
+
+	.freedoms-php .about__header::before {
+		top: calc(50% - 132px);
+		height: 192px;
+		width: 240px;
+	}
+
+	.privacy-php .about__header::before {
+		bottom: 0;
+		height: 280px;
+	}
+
 	.about__container .about__header-text {
 		font-size: 1.4em;
 	}
@@ -715,13 +744,24 @@
 		display: block;
 	}
 
+	.about__header-title,
+	.about__header-text {
+		/* 288px = 240px (balloon width) + 32px (offset from edge) + 16px (spacing). */
+		padding-right: 288px !important;
+	}
+
 	.about__header-title,
 	.about__header-image {
 		margin-left: calc(var(--gap) / 2);
 		margin-right: calc(var(--gap) / 2);
 	}
 
-	.about__header-text,
+	.about__header-text {
+		margin-top: 0;
+		margin-right: 0;
+		padding-left: calc(var(--gap) / 2);
+	}
+
 	.about__header-navigation .nav-tab {
 		margin-top: 0;
 		margin-right: 0;
@@ -730,13 +770,28 @@
 	}
 }
 
+@media screen and (max-width: 600px) {
+	.about__header::before {
+		display: none;
+	}
+
+	.about__header-title,
+	.about__header-text {
+		padding-right: calc(var(--gap) / 2) !important;
+	}
+}
+
 @media screen and (max-width: 480px) {
 	.about__header-title p {
 		font-size: 2.4em;
 	}
 
+	.about__header-title {
+		padding-top: 2rem;
+	}
+
 	.about__header-text {
-		margin-bottom: 1em;
+		margin-bottom: 2rem;
 	}
 
 	.about__header-navigation {
diff --git a/src/wp-admin/css/colors/_admin.scss b/src/wp-admin/css/colors/_admin.scss
index 449b0a8e27..cb241905a0 100644
--- a/src/wp-admin/css/colors/_admin.scss
+++ b/src/wp-admin/css/colors/_admin.scss
@@ -781,3 +781,17 @@ div#wp-responsive-toggle a:before {
 		color: $link;
 	}
 }
+
+/* Welcome Panel */
+
+.welcome-panel {
+	background-color: $highlight-color;
+}
+
+[class*="welcome-panel-icon"] {
+	@if ( $scheme-name == "light" ) {
+		background-color: $icon-color;
+	} @else {
+		background-color: $base-color;
+	}
+}
diff --git a/src/wp-admin/css/colors/_variables.scss b/src/wp-admin/css/colors/_variables.scss
index 8287a23202..21621342a4 100644
--- a/src/wp-admin/css/colors/_variables.scss
+++ b/src/wp-admin/css/colors/_variables.scss
@@ -1,5 +1,6 @@
 // assign default value to all undefined variables
 
+$scheme-name: "default" !default;
 
 // core variables
 
diff --git a/src/wp-admin/css/colors/blue/colors.scss b/src/wp-admin/css/colors/blue/colors.scss
index b254d73a8f..f44e540adf 100644
--- a/src/wp-admin/css/colors/blue/colors.scss
+++ b/src/wp-admin/css/colors/blue/colors.scss
@@ -1,3 +1,4 @@
+$scheme-name: "blue";
 $base-color: #52accc;
 $icon-color: #e5f8ff;
 $highlight-color: #096484;
diff --git a/src/wp-admin/css/colors/coffee/colors.scss b/src/wp-admin/css/colors/coffee/colors.scss
index 64de62e491..a52491d57d 100644
--- a/src/wp-admin/css/colors/coffee/colors.scss
+++ b/src/wp-admin/css/colors/coffee/colors.scss
@@ -1,3 +1,4 @@
+$scheme-name: "coffee";
 $base-color: #59524c;
 $highlight-color: #c7a589;
 $notification-color: #9ea476;
diff --git a/src/wp-admin/css/colors/ectoplasm/colors.scss b/src/wp-admin/css/colors/ectoplasm/colors.scss
index 8d14570770..230ff9efb4 100644
--- a/src/wp-admin/css/colors/ectoplasm/colors.scss
+++ b/src/wp-admin/css/colors/ectoplasm/colors.scss
@@ -1,3 +1,4 @@
+$scheme-name: "ectoplasm";
 $base-color: #523f6d;
 $icon-color: #ece6f6;
 $highlight-color: #a3b745;
diff --git a/src/wp-admin/css/colors/light/colors.scss b/src/wp-admin/css/colors/light/colors.scss
index 5a75889a55..817bd34549 100644
--- a/src/wp-admin/css/colors/light/colors.scss
+++ b/src/wp-admin/css/colors/light/colors.scss
@@ -1,3 +1,4 @@
+$scheme-name: "light";
 $base-color: #e5e5e5;
 $icon-color: #999;
 $text-color: #333;
diff --git a/src/wp-admin/css/colors/midnight/colors.scss b/src/wp-admin/css/colors/midnight/colors.scss
index 591232b708..8570c9526e 100644
--- a/src/wp-admin/css/colors/midnight/colors.scss
+++ b/src/wp-admin/css/colors/midnight/colors.scss
@@ -1,3 +1,4 @@
+$scheme-name: "midnight";
 $base-color: #363b3f;
 $highlight-color: #e14d43;
 $notification-color: #69a8bb;
diff --git a/src/wp-admin/css/colors/modern/colors.scss b/src/wp-admin/css/colors/modern/colors.scss
index dc32bf0e4d..7b7918174c 100644
--- a/src/wp-admin/css/colors/modern/colors.scss
+++ b/src/wp-admin/css/colors/modern/colors.scss
@@ -1,3 +1,4 @@
+$scheme-name: "modern";
 $base-color: #1e1e1e;
 $highlight-color: #3858e9;
 $menu-submenu-focus-text: #33f078;
diff --git a/src/wp-admin/css/colors/ocean/colors.scss b/src/wp-admin/css/colors/ocean/colors.scss
index 807d98dccf..027c27d470 100644
--- a/src/wp-admin/css/colors/ocean/colors.scss
+++ b/src/wp-admin/css/colors/ocean/colors.scss
@@ -1,3 +1,4 @@
+$scheme-name: "ocean";
 $base-color: #738e96;
 $icon-color: #f2fcff;
 $highlight-color: #9ebaa0;
diff --git a/src/wp-admin/css/colors/sunrise/colors.scss b/src/wp-admin/css/colors/sunrise/colors.scss
index 5dd8d82fc1..75d74d8670 100644
--- a/src/wp-admin/css/colors/sunrise/colors.scss
+++ b/src/wp-admin/css/colors/sunrise/colors.scss
@@ -1,3 +1,4 @@
+$scheme-name: "sunrise";
 $base-color: #cf4944;
 $highlight-color: #dd823b;
 $notification-color: #ccaf0b;
diff --git a/src/wp-admin/css/common.css b/src/wp-admin/css/common.css
index f75d9b55e1..40da73b3e0 100644
--- a/src/wp-admin/css/common.css
+++ b/src/wp-admin/css/common.css
@@ -823,8 +823,6 @@ img.emoji {
 	outline: 0;
 }
 
-.welcome-panel .welcome-panel-close:hover:before,
-.welcome-panel .welcome-panel-close:focus:before,
 .tagchecklist .ntdelbutton:hover .remove-tag-icon:before,
 .tagchecklist .ntdelbutton:focus .remove-tag-icon:before,
 #bulk-titles div a:hover:before,
@@ -3145,7 +3143,7 @@ img {
 	width: 300px;
 }
 
-/* Theme/Plugin Editor */
+/* Theme/Plugin file editor */
 .alignleft h2 {
 	margin: 0;
 }
@@ -3198,7 +3196,7 @@ img {
 }
 
 /*
- * Styles for Theme and Plugin editors.
+ * Styles for Theme and Plugin file editors.
  */
 
 /* Hide collapsed items. */
diff --git a/src/wp-admin/css/dashboard.css b/src/wp-admin/css/dashboard.css
index 1f42793ac1..dcc1ac0144 100644
--- a/src/wp-admin/css/dashboard.css
+++ b/src/wp-admin/css/dashboard.css
@@ -115,48 +115,77 @@
 	position: relative;
 	overflow: auto;
 	margin: 16px 0;
-	padding: 23px 10px 0;
-	border: 1px solid #c3c4c7;
-	box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
-	background: #fff;
-	font-size: 13px;
-	line-height: 1.7;
+	background: #2271b1 url(../images/about-texture.png) center repeat;
+	background-size: 500px 500px;
+	background-blend-mode: overlay;
+	font-size: 14px;
+	line-height: 1.3;
+}
+
+.welcome-panel::before {
+	content: "";
+	position: absolute;
+	top: -16px;
+	right: 96px;
+	z-index: 0;
+	width: 300px;
+	height: 382px;
+	background: url(../images/about-header-about.svg) no-repeat center;
+	background-size: contain;
 }
 
 .welcome-panel h2 {
 	margin: 0;
-	font-size: 21px;
-	font-weight: 400;
-	line-height: 1.2;
+	font-size: 48px;
+	font-weight: 600;
+	line-height: 1.25;
+	color: #fff;
 }
 
 .welcome-panel h3 {
-	margin: 1.33em 0 0;
-	font-size: 16px;
+	margin: 0;
+	font-size: 20px;
+	font-weight: 400;
+	line-height: 1.4;
 }
 
-.welcome-panel li {
-	font-size: 14px;
+.welcome-panel p {
+	font-size: inherit;
+	line-height: inherit;
 }
 
-.welcome-panel p {
-	color: #646970;
+.welcome-panel-header {
+	color: #fff;
 }
 
-.welcome-panel li a {
+.welcome-panel-header a {
+	color: #fff;
+}
+
+.welcome-panel-header a:focus,
+.welcome-panel-header a:hover {
+	color: #f5e6ab;
 	text-decoration: none;
 }
 
-.welcome-panel .about-description {
-	font-size: 16px;
-	margin: 0;
+.welcome-panel-header a:focus,
+.welcome-panel .welcome-panel-close:focus {
+	outline-color: currentColor;
+	outline-offset: 1px;
+	box-shadow: none;
+}
+
+.welcome-panel-header p {
+	margin: 0.5em 0 0;
+	font-size: 20px;
+	line-height: 1.4;
 }
 
 .welcome-panel .welcome-panel-close {
 	position: absolute;
 	top: 10px;
 	right: 10px;
-	padding: 10px 15px 10px 21px;
+	padding: 10px 15px 10px 24px;
 	font-size: 13px;
 	line-height: 1.23076923; /* Chrome rounding, needs to be 16px equivalent */
 	text-decoration: none;
@@ -167,8 +196,23 @@
 	top: 8px;
 	left: 0;
 	transition: all .1s ease-in-out;
+	content: '\f335';
+	font-size: 24px;
+	color: #fff;
+}
+
+.welcome-panel .welcome-panel-close {
+	color: #fff;
 }
 
+.welcome-panel .welcome-panel-close:hover,
+.welcome-panel .welcome-panel-close:focus,
+.welcome-panel .welcome-panel-close:hover::before,
+.welcome-panel .welcome-panel-close:focus::before {
+	color: #f5e6ab;
+}
+
+/* @deprecated 5.9.0 -- Button removed from panel. */
 .wp-core-ui .welcome-panel .button.button-hero {
 	margin: 15px 13px 3px 0;
 	padding: 12px 36px;
@@ -178,54 +222,99 @@
 }
 
 .welcome-panel-content {
-	margin-left: 13px;
+	min-height: 400px;
+	display: flex;
+	flex-direction: column;
+	justify-content: space-between;
+}
+
+.welcome-panel-header {
+	box-sizing: border-box;
+	margin-left: auto;
+	margin-right: auto;
 	max-width: 1500px;
+	width: 100%;
+	/* 408px = 300px (balloon width) + 96px (offset from edge) + 16px (spacing). */
+	padding: 48px 408px 48px 48px;
 }
 
 .welcome-panel .welcome-panel-column-container {
+	box-sizing: border-box;
+	width: 100%;
 	clear: both;
-	position: relative;
+	display: grid;
+	z-index: 1;
+	margin-top: 32px;
+	padding: 48px;
+	grid-template-columns: repeat(3, 1fr);
+	gap: 32px;
+	align-self: flex-end;
+	background: #fff;
 }
 
-.welcome-panel .welcome-panel-column {
-	width: 32%;
-	min-width: 200px;
-	float: left;
+[class*="welcome-panel-icon"] {
+	height: 60px;
+	width: 60px;
+	background-color: #1d2327;
+	background-position: center;
+	background-size: 24px 24px;
+	background-repeat: no-repeat;
+	border-radius: 100%;
+}
+
+.welcome-panel-column {
+	display: grid;
+	grid-template-columns: min-content 1fr;
+	gap: 24px;
 }
 
-.welcome-panel .welcome-panel-column:first-child {
-	width: 36%;
+.welcome-panel-icon-pages {
+	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M7 13.8h6v-1.5H7v1.5zM18 16V4c0-1.1-.9-2-2-2H6c-1.1 0-2 .9-2 2v12c0 1.1.9 2 2 2h10c1.1 0 2-.9 2-2zM5.5 16V4c0-.3.2-.5.5-.5h10c.3 0 .5.2.5.5v12c0 .3-.2.5-.5.5H6c-.3 0-.5-.2-.5-.5zM7 10.5h8V9H7v1.5zm0-3.3h8V5.8H7v1.4zM20.2 6v13c0 .7-.6 1.2-1.2 1.2H8v1.5h11c1.5 0 2.7-1.2 2.7-2.8V6h-1.5z' /%3E%3C/svg%3E");
 }
 
-.welcome-panel-column p.hide-if-no-customize {
-	margin-top: 10px;
+.welcome-panel-icon-layout {
+	background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M18 5.5H6a.5.5 0 00-.5.5v3h13V6a.5.5 0 00-.5-.5zm.5 5H10v8h8a.5.5 0 00.5-.5v-7.5zm-10 0h-3V18a.5.5 0 00.5.5h2.5v-8zM6 4h12a2 2 0 012 2v12a2 2 0 01-2 2H6a2 2 0 01-2-2V6a2 2 0 012-2z' /%3E%3C/svg%3E");
 }
 
-.welcome-panel-column p {
-	margin-top: 7px;
-	color: #3c434a;
+.welcome-panel-icon-styles {
+	background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%23fff' d='M12 4c-4.4 0-8 3.6-8 8v.1c0 4.1 3.2 7.5 7.2 7.9h.8c4.4 0 8-3.6 8-8s-3.6-8-8-8zm0 15V5c3.9 0 7 3.1 7 7s-3.1 7-7 7z' /%3E%3C/svg%3E");
 }
 
+/* @deprecated 5.9.0 -- Section removed from welcome panel. */
 .welcome-panel .welcome-widgets-menus {
 	line-height: 1.14285714;
 }
 
+/* @deprecated 5.9.0 -- Lists removed from welcome panel. */
 .welcome-panel .welcome-panel-column ul {
 	margin: 0.8em 1em 1em 0;
 }
 
+/* @deprecated 5.9.0 -- Lists removed from welcome panel. */
+.welcome-panel li {
+	font-size: 14px;
+}
+
+/* @deprecated 5.9.0 -- Lists removed from welcome panel. */
+.welcome-panel li a {
+	text-decoration: none;
+}
+
+/* @deprecated 5.9.0 -- Lists removed from welcome panel. */
 .welcome-panel .welcome-panel-column li {
 	line-height: 1.14285714;
 	list-style-type: none;
 	padding: 0 0 8px;
 }
 
+/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
 .welcome-panel .welcome-icon {
 	background: transparent !important;
 }
 
 /* Welcome Panel and Right Now common Icons style */
 
+/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
 .welcome-panel .welcome-icon:before,
 #dashboard_right_now li a:before,
 #dashboard_right_now li span:before,
@@ -244,47 +333,56 @@
 
 /* Welcome Panel specific Icons styles */
 
+/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
 .welcome-panel .welcome-write-blog:before,
 .welcome-panel .welcome-edit-page:before {
 	content: "\f119";
 	top: -3px;
 }
 
+/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
 .welcome-panel .welcome-add-page:before {
 	content: "\f132";
 	top: -1px;
 }
 
+/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
 .welcome-panel .welcome-setup-home:before {
 	content: "\f102";
 	top: -1px;
 }
 
+/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
 .welcome-panel .welcome-view-site:before {
 	content: "\f115";
 	top: -2px;
 }
 
+/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
 .welcome-panel .welcome-widgets-menus:before {
 	content: "\f116";
 	top: -2px;
 }
 
+/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
 .welcome-panel .welcome-widgets:before {
 	content: "\f538";
 	top: -2px;
 }
 
+/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
 .welcome-panel .welcome-menus:before {
 	content: "\f163";
 	top: -2px;
 }
 
+/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
 .welcome-panel .welcome-comments:before {
 	content: "\f117";
 	top: -1px;
 }
 
+/* @deprecated 5.9.0 -- Icons removed from welcome panel. */
 .welcome-panel .welcome-learn-more:before {
 	content: "\f118";
 	top: -1px;
@@ -1102,6 +1200,18 @@ a.rsswidget {
 /* =Media Queries
 -------------------------------------------------------------- */
 
+@media only screen and (min-width: 1600px) {
+	.welcome-panel .welcome-panel-column-container {
+		display: flex;
+		justify-content: center;
+	}
+
+	.welcome-panel-column {
+		width: 100%;
+		max-width: 460px;
+	}
+}
+
 /* one column on the dash */
 @media only screen and (max-width: 799px) {
 	#wpbody-content #dashboard-widgets .postbox-container {
@@ -1213,25 +1323,69 @@ a.rsswidget {
 }
 
 @media screen and (max-width: 870px) {
-	.welcome-panel .welcome-panel-column,
-	.welcome-panel .welcome-panel-column:first-child {
-		display: block;
-		float: none;
-		width: 100%;
-	}
-
+	/* @deprecated 5.9.0 -- Lists removed from welcome panel. */
 	.welcome-panel .welcome-panel-column li {
 		display: inline-block;
 		margin-right: 13px;
 	}
 
+	/* @deprecated 5.9.0 -- Lists removed from welcome panel. */
 	.welcome-panel .welcome-panel-column ul {
 		margin: 0.4em 0 0;
 	}
 
 }
 
+@media screen and (max-width: 1180px) and (min-width: 783px) {
+	.welcome-panel-column {
+		grid-template-columns: 1fr;
+	}
+
+	[class*="welcome-panel-icon"] {
+		display: none;
+	}
+}
+
 @media screen and (max-width: 782px) {
+	.welcome-panel::before {
+		width: 240px;
+		height: 305px;
+		right: 32px;
+	}
+
+	.welcome-panel-header {
+		/* 288px = 240px (balloon width) + 32px (offset from edge) + 16px (spacing). */
+		padding: 32px 288px 32px 32px;
+	}
+
+	.welcome-panel .welcome-panel-column-container {
+		grid-template-columns: 1fr;
+		box-sizing: border-box;
+		padding: 32px;
+		width: 100%;
+	}
+
+	.welcome-panel .welcome-panel-column-content {
+		max-width: 520px;
+	}
+
+	/* Keep the close icon from overlapping the Welcome text. */
+	.welcome-panel .welcome-panel-close {
+		overflow: hidden;
+		text-indent: 40px;
+		white-space: nowrap;
+		width: 20px;
+		height: 20px;
+		padding: 5px;
+		top: 5px;
+		right: 5px;
+	}
+
+	.welcome-panel .welcome-panel-close::before {
+		top: 5px;
+		left: -35px;
+	}
+
 	#dashboard-widgets h2 {
 		padding: 12px;
 	}
@@ -1274,23 +1428,28 @@ a.rsswidget {
 
 /* Smartphone */
 @media screen and (max-width: 600px) {
-	/* Keep the close icon from overlapping the Welcome text. */
-	.welcome-panel .welcome-panel-close {
-		overflow: hidden;
-		text-indent: 40px;
-		white-space: nowrap;
-		width: 20px;
-		height: 20px;
-		padding: 5px;
-		top: 5px;
-		right: 5px;
+	.welcome-panel::before {
+		display: none;
 	}
 
-	/* Make the close icon larger for tappability. */
-	.welcome-panel .welcome-panel-close:before {
-		font-size: 20px;
-		top: 5px;
-		left: -35px;
+	.welcome-panel-header {
+		padding: 32px;
+	}
+}
+
+@media screen and (max-width: 480px) {
+	.welcome-panel-column {
+		gap: 16px;
+	}
+}
+
+@media screen and (max-width: 360px) {
+	.welcome-panel-column {
+		grid-template-columns: 1fr;
+	}
+
+	[class*="welcome-panel-icon"] {
+		display: none;
 	}
 }
 
diff --git a/src/wp-admin/css/edit.css b/src/wp-admin/css/edit.css
index 44a444b714..5394f4205e 100644
--- a/src/wp-admin/css/edit.css
+++ b/src/wp-admin/css/edit.css
@@ -146,6 +146,11 @@ body.post-new-php .submitbox .submitdelete {
 	margin-top: 3px;
 }
 
+body.post-type-wp_navigation div#minor-publishing,
+body.post-type-wp_navigation .inline-edit-status {
+	display: none;
+}
+
 /* Post Screen */
 
 /* Only highlight drop zones when dragging and only in the 2 columns layout. */
diff --git a/src/wp-admin/css/forms.css b/src/wp-admin/css/forms.css
index 7893915d6d..005196c28c 100644
--- a/src/wp-admin/css/forms.css
+++ b/src/wp-admin/css/forms.css
@@ -1528,6 +1528,10 @@ table.form-table td .updated p {
 		margin: 0 3px;
 	}
 
+	.form-table input[type='text']#mailserver_port.small-text {
+		margin-top: 3px;
+	}
+
 	#pass-strength-result {
 		width: 100%;
 		box-sizing: border-box;
diff --git a/src/wp-admin/css/login.css b/src/wp-admin/css/login.css
index 3c795ebab5..1f89db216e 100644
--- a/src/wp-admin/css/login.css
+++ b/src/wp-admin/css/login.css
@@ -50,6 +50,7 @@ p {
 	margin-bottom: 20px;
 	background-color: #fff;
 	box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
+	word-wrap: break-word;
 }
 
 .login .success {
@@ -281,7 +282,7 @@ p {
 
 #login {
 	width: 320px;
-	padding: 8% 0 0;
+	padding: 5% 0 0;
 	margin: auto;
 }
 
@@ -297,7 +298,7 @@ p {
 
 #backtoblog {
 	margin: 16px 0;
-	word-break: break-word;
+	word-wrap: break-word;
 }
 
 .login #nav a,
@@ -321,7 +322,7 @@ p {
 .login .privacy-policy-page-link {
 	text-align: center;
 	width: 100%;
-	margin: 5em 0 2em;
+	margin: 3em 0 2em;
 }
 
 .login form .input,
@@ -409,10 +410,46 @@ input::-ms-reveal {
 	display: none;
 }
 
+#language-switcher {
+	padding: 0;
+	overflow: visible;
+	background: none;
+	border: none;
+	box-shadow: none;
+}
+
+#language-switcher select {
+	margin-right: 0.25em;
+}
+
+.language-switcher {
+	margin: 0 auto;
+	padding: 0 0 24px;
+	text-align: center;
+}
+
+.language-switcher label {
+	margin-right: 0.25em;
+}
+
+.language-switcher label .dashicons {
+	width: auto;
+	height: auto;
+}
+
+.login .language-switcher .button-primary {
+	float: none;
+	margin-bottom: 0;
+}
+
 @media screen and (max-height: 550px) {
 	#login {
 		padding: 20px 0;
 	}
+
+	#language-switcher {
+		margin-top: 0;
+	}
 }
 
 
@@ -427,4 +464,16 @@ input::-ms-reveal {
 		height: 1.3125rem;
 		margin: -0.1875rem 0 0 -0.25rem;
 	}
+
+	#language-switcher label,
+	#language-switcher select {
+		margin-right: 0;
+	}
+}
+
+@media screen and (max-width: 400px) {
+	.login .language-switcher .button-primary {
+		display: block;
+		margin: 5px auto 0;
+	}
 }
diff --git a/src/wp-admin/css/media.css b/src/wp-admin/css/media.css
index 5aaf859ad4..623b5b15a4 100644
--- a/src/wp-admin/css/media.css
+++ b/src/wp-admin/css/media.css
@@ -507,24 +507,6 @@ border color while dragging a file over the uploader drop area */
 	background: none;
 }
 
-.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors {
-	top: -10px;
-	right: -14px;
-	padding: 10px;
-}
-
-.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:before {
-	content: "\f153";
-	display: block;
-	font: normal 16px/1 dashicons;
-	color: #787c82;
-}
-
-.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:focus:before,
-.upload-php .mode-grid .media-sidebar .media-uploader-status .upload-dismiss-errors:hover:before {
-	color: #d63638;
-}
-
 .upload-php .mode-grid .media-sidebar .media-uploader-status.errors h2 {
 	display: none;
 }
diff --git a/src/wp-admin/css/themes.css b/src/wp-admin/css/themes.css
index 04bfdd00f7..893a4f9fbe 100644
--- a/src/wp-admin/css/themes.css
+++ b/src/wp-admin/css/themes.css
@@ -7,6 +7,10 @@
   16.1 - Manage Themes
 ------------------------------------------------------------------------------*/
 
+.themes-php {
+	overflow-y: scroll;
+}
+
 body.js .theme-browser.search-loading {
 	display: none;
 }
@@ -1801,7 +1805,7 @@ body.full-overlay-active {
 #customize-container iframe,
 .theme-install-overlay iframe {
 	height: 100%;
-	width: 100%;
+	width: 100vw;
 	z-index: 20;
 	transition: opacity 0.3s;
 }
diff --git a/src/wp-admin/css/widgets.css b/src/wp-admin/css/widgets.css
index 9d64f97970..8faca8f9ac 100644
--- a/src/wp-admin/css/widgets.css
+++ b/src/wp-admin/css/widgets.css
@@ -346,7 +346,8 @@
 	margin: 0;
 	padding: 8px 10px;
 	overflow: hidden;
-	white-space: nowrap;
+	white-space: normal;
+	line-height: 1.5;
 }
 
 .widgets-holder-wrap .description {
@@ -481,7 +482,7 @@ div#widgets-right .sidebar-description {
 
 div#widgets-right .sidebar-name h2,
 div#widgets-right .sidebar-name h3 {
-	padding: 15px 7px;
+	padding: 15px 15px 15px 7px;
 }
 
 div#widgets-right .widget-top {
@@ -508,6 +509,12 @@ div#widgets-right .closed .widgets-sortables {
 	margin: -5px 5px;
 }
 
+.sidebar-name .spinner {
+	position: absolute;
+	top: 18px;
+	right: 30px;
+}
+
 /* Dragging a widget over a closed sidebar */
 #widgets-right .widgets-holder-wrap.widget-hover {
 	border-color: #787c82;
diff --git a/src/wp-admin/customize.php b/src/wp-admin/customize.php
index 0dd548d43a..aed0646336 100644
--- a/src/wp-admin/customize.php
+++ b/src/wp-admin/customize.php
@@ -188,16 +188,8 @@ do_action( 'customize_controls_head' );
 			<?php
 			$compatible_wp  = is_wp_version_compatible( $wp_customize->theme()->get( 'RequiresWP' ) );
 			$compatible_php = is_php_version_compatible( $wp_customize->theme()->get( 'RequiresPHP' ) );
-			$fse_safe       = true;
-
-			// Check if the theme requires the Gutenberg plugin to work correctly.
-			$theme_tags = $wp_customize->theme()->get( 'Tags' );
-
-			if ( ! empty( $theme_tags ) && in_array( 'full-site-editing', $theme_tags, true ) && ! function_exists( 'gutenberg_is_fse_theme' ) ) {
-				$fse_safe = false;
-			}
 			?>
-			<?php if ( $compatible_wp && $compatible_php && $fse_safe ) : ?>
+			<?php if ( $compatible_wp && $compatible_php ) : ?>
 				<?php $save_text = $wp_customize->is_theme_active() ? __( 'Publish' ) : __( 'Activate &amp; Publish' ); ?>
 				<div id="customize-save-button-wrapper" class="customize-save-button-wrapper" >
 					<?php submit_button( $save_text, 'primary save', 'save', false ); ?>
@@ -241,9 +233,16 @@ do_action( 'customize_controls_head' );
 						<button type="button" class="customize-help-toggle dashicons dashicons-editor-help" aria-expanded="false"><span class="screen-reader-text"><?php _e( 'Help' ); ?></span></button>
 					</div>
 					<div class="customize-panel-description">
-					<?php
-						_e( 'The Customizer allows you to preview changes to your site before publishing them. You can navigate to different pages on your site within the preview. Edit shortcuts are shown for some editable elements.' );
-					?>
+						<p>
+							<?php
+							_e( 'The Customizer allows you to preview changes to your site before publishing them. You can navigate to different pages on your site within the preview. Edit shortcuts are shown for some editable elements.' );
+							?>
+						</p>
+						<p>
+							<?php
+							_e( '<a href="https://wordpress.org/support/article/appearance-customize-screen/">Documentation on Customizer</a>' );
+							?>
+						</p>
 					</div>
 				</div>
 
diff --git a/src/wp-admin/edit-form-blocks.php b/src/wp-admin/edit-form-blocks.php
index 969d138ecb..5e7b39d619 100644
--- a/src/wp-admin/edit-form-blocks.php
+++ b/src/wp-admin/edit-form-blocks.php
@@ -28,6 +28,10 @@ $block_editor_context = new WP_Block_Editor_Context( array( 'post' => $post ) );
 $current_screen = get_current_screen();
 $current_screen->is_block_editor( true );
 
+// Load block patterns from w.org.
+_load_remote_block_patterns();
+_load_remote_featured_patterns();
+
 // Default to is-fullscreen-mode to avoid jumps in the UI.
 add_filter(
 	'admin_body_class',
@@ -77,16 +81,22 @@ wp_add_inline_script(
  * Assign initial edits, if applicable. These are not initially assigned to the persisted post,
  * but should be included in its save payload.
  */
-$initial_edits = null;
+$initial_edits = array();
 $is_new_post   = false;
 if ( 'auto-draft' === $post->post_status ) {
 	$is_new_post = true;
 	// Override "(Auto Draft)" new post default title with empty string, or filtered value.
-	$initial_edits = array(
-		'title'   => $post->post_title,
-		'content' => $post->post_content,
-		'excerpt' => $post->post_excerpt,
-	);
+	if ( post_type_supports( $post->post_type, 'title' ) ) {
+		$initial_edits['title'] = $post->post_title;
+	}
+
+	if ( post_type_supports( $post->post_type, 'editor' ) ) {
+		$initial_edits['content'] = $post->post_content;
+	}
+
+	if ( post_type_supports( $post->post_type, 'excerpt' ) ) {
+		$initial_edits['excerpt'] = $post->post_excerpt;
+	}
 }
 
 // Preload server-registered block schemas.
@@ -223,6 +233,10 @@ if ( $is_new_post && ! isset( $editor_settings['template'] ) && 'post' === $post
 	}
 }
 
+if ( wp_is_block_theme() && $editor_settings['supportsTemplateMode'] ) {
+	$editor_settings['defaultTemplatePartAreas'] = get_allowed_block_template_part_areas();
+}
+
 /**
  * Scripts
  */
diff --git a/src/wp-admin/edit-tag-form.php b/src/wp-admin/edit-tag-form.php
index 3752b8f52c..d0d8f4af5e 100644
--- a/src/wp-admin/edit-tag-form.php
+++ b/src/wp-admin/edit-tag-form.php
@@ -146,7 +146,7 @@ if ( isset( $tag->name ) ) {
 		<tr class="form-field form-required term-name-wrap">
 			<th scope="row"><label for="name"><?php _ex( 'Name', 'term name' ); ?></label></th>
 			<td><input name="name" id="name" type="text" value="<?php echo $tag_name_value; ?>" size="40" aria-required="true" />
-			<p class="description"><?php _e( 'The name is how it appears on your site.' ); ?></p></td>
+			<p class="description"><?php echo $tax->labels->name_field_description; ?></p></td>
 		</tr>
 <?php if ( ! global_terms_enabled() ) { ?>
 		<tr class="form-field term-slug-wrap">
@@ -168,7 +168,7 @@ if ( isset( $tag->name ) ) {
 			$slug = isset( $tag->slug ) ? apply_filters( 'editable_slug', $tag->slug, $tag ) : '';
 			?>
 			<td><input name="slug" id="slug" type="text" value="<?php echo esc_attr( $slug ); ?>" size="40" />
-			<p class="description"><?php _e( 'The &#8220;slug&#8221; is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.' ); ?></p></td>
+			<p class="description"><?php echo $tax->labels->slug_field_description; ?></p></td>
 		</tr>
 <?php } ?>
 <?php if ( is_taxonomy_hierarchical( $taxonomy ) ) : ?>
@@ -195,7 +195,7 @@ if ( isset( $tag->name ) ) {
 				<?php if ( 'category' === $taxonomy ) : ?>
 					<p class="description"><?php _e( 'Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have children categories for Bebop and Big Band. Totally optional.' ); ?></p>
 				<?php else : ?>
-					<p class="description"><?php _e( 'Assign a parent term to create a hierarchy. The term Jazz, for example, would be the parent of Bebop and Big Band.' ); ?></p>
+					<p class="description"><?php echo $tax->labels->parent_field_description; ?></p>
 				<?php endif; ?>
 			</td>
 		</tr>
@@ -203,7 +203,7 @@ if ( isset( $tag->name ) ) {
 		<tr class="form-field term-description-wrap">
 			<th scope="row"><label for="description"><?php _e( 'Description' ); ?></label></th>
 			<td><textarea name="description" id="description" rows="5" cols="50" class="large-text"><?php echo $tag->description; // textarea_escaped ?></textarea>
-			<p class="description"><?php _e( 'The description is not prominent by default; however, some themes may show it.' ); ?></p></td>
+			<p class="description"><?php echo $tax->labels->desc_field_description; ?></p></td>
 		</tr>
 		<?php
 		// Back compat hooks.
diff --git a/src/wp-admin/edit-tags.php b/src/wp-admin/edit-tags.php
index f95eba68c5..8cd22fa184 100644
--- a/src/wp-admin/edit-tags.php
+++ b/src/wp-admin/edit-tags.php
@@ -454,13 +454,13 @@ if ( $can_edit_terms ) {
 <div class="form-field form-required term-name-wrap">
 	<label for="tag-name"><?php _ex( 'Name', 'term name' ); ?></label>
 	<input name="tag-name" id="tag-name" type="text" value="" size="40" aria-required="true" />
-	<p><?php _e( 'The name is how it appears on your site.' ); ?></p>
+	<p><?php echo $tax->labels->name_field_description; ?></p>
 </div>
 	<?php if ( ! global_terms_enabled() ) : ?>
 <div class="form-field term-slug-wrap">
 	<label for="tag-slug"><?php _e( 'Slug' ); ?></label>
 	<input name="slug" id="tag-slug" type="text" value="" size="40" />
-	<p><?php _e( 'The &#8220;slug&#8221; is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.' ); ?></p>
+	<p><?php echo $tax->labels->slug_field_description; ?></p>
 </div>
 <?php endif; // global_terms_enabled() ?>
 	<?php if ( is_taxonomy_hierarchical( $taxonomy ) ) : ?>
@@ -505,14 +505,14 @@ if ( $can_edit_terms ) {
 		<?php if ( 'category' === $taxonomy ) : ?>
 		<p><?php _e( 'Categories, unlike tags, can have a hierarchy. You might have a Jazz category, and under that have children categories for Bebop and Big Band. Totally optional.' ); ?></p>
 	<?php else : ?>
-		<p><?php _e( 'Assign a parent term to create a hierarchy. The term Jazz, for example, would be the parent of Bebop and Big Band.' ); ?></p>
+		<p><?php echo $tax->labels->parent_field_description; ?></p>
 	<?php endif; ?>
 </div>
 	<?php endif; // is_taxonomy_hierarchical() ?>
 <div class="form-field term-description-wrap">
 	<label for="tag-description"><?php _e( 'Description' ); ?></label>
 	<textarea name="description" id="tag-description" rows="5" cols="40"></textarea>
-	<p><?php _e( 'The description is not prominent by default; however, some themes may show it.' ); ?></p>
+	<p><?php echo $tax->labels->desc_field_description; ?></p>
 </div>
 
 	<?php
diff --git a/src/wp-admin/export.php b/src/wp-admin/export.php
index df7e94541f..eb4e1168c5 100644
--- a/src/wp-admin/export.php
+++ b/src/wp-admin/export.php
@@ -27,7 +27,7 @@ $title = __( 'Export' );
 function export_add_js() {
 	?>
 <script type="text/javascript">
-	jQuery(document).ready(function($){
+	jQuery( function($) {
 		var form = $('#export-filters'),
 			filters = form.find('.export-filters');
 		filters.hide();
@@ -39,7 +39,7 @@ function export_add_js() {
 				case 'pages': $('#page-filters').slideDown(); break;
 			}
 		});
-	});
+	} );
 </script>
 	<?php
 }
diff --git a/src/wp-admin/freedoms.php b/src/wp-admin/freedoms.php
index 0a2d6ca241..b22f621f67 100644
--- a/src/wp-admin/freedoms.php
+++ b/src/wp-admin/freedoms.php
@@ -32,7 +32,7 @@ require_once ABSPATH . 'wp-admin/admin-header.php';
 		</div>
 
 		<div class="about__header-text">
-			<?php _e( 'WordPress is free and open source software, built by a distributed community of mostly volunteer developers from around the world' ); ?>
+			<?php _e( 'WordPress is free and open source software' ); ?>
 		</div>
 
 		<nav class="about__header-navigation nav-tab-wrapper wp-clearfix" aria-label="<?php esc_attr_e( 'Secondary menu' ); ?>">
@@ -103,8 +103,6 @@ require_once ABSPATH . 'wp-admin/admin-header.php';
 			);
 			?>
 			</p>
-
-			<p><?php _e( 'Don&#8217;t you wish all software came with these freedoms? So do we! For more information, check out the <a href="https://www.fsf.org/">Free Software Foundation</a>.' ); ?></p>
 		</div>
 	</div>
 
diff --git a/src/wp-admin/images/about-header-about.svg b/src/wp-admin/images/about-header-about.svg
index ea6db98a31..c2e4bbf26c 100644
--- a/src/wp-admin/images/about-header-about.svg
+++ b/src/wp-admin/images/about-header-about.svg
@@ -1,3 +1,11 @@
-<svg width="1208" height="538" fill="none" xmlns="http://www.w3.org/2000/svg">
-  <path d="M386.726 149.795c4.069-.097 8.235.581 12.11-1.066-4.069-.097-8.332-2.713-12.013 1.163-1.259.096-3.294-.388-3.294.871 0 1.454 1.066 3.294 2.228 4.457 1.26 1.162 2.907.678 4.554-1.163-1.938-.872-3.876-1.84-3.585-4.262zm-112.477 62.778c-2.325.775-7.46-.582-3.778 4.844.097.096-.194.581-.388.871-2.906 5.038-2.616 6.588 1.938 9.204.872.484 1.744 1.26 2.519.194.678-.969 0-1.744-.775-2.519-1.066-1.066-2.713-1.647-2.81-3.391 1.453-.969 3.1 1.26 3.681-.29.872-2.326-2.615-3.294-2.518-5.619 1.162-.194 1.743 1.646 2.615.871 1.841-1.453-.775-2.712-.484-4.165 1.162-1.454 2.422-2.81 1.453-5.038-1.356-2.81-.581-5.716.097-8.429.678-2.712-.194-5.328.484-8.041.582-2.325-1.647-2.809-3.39-3.294-.969-.29-2.325-1.162-3.004.291-.678 1.647.969 2.519 1.841 3.585.872 1.162 2.325 2.034 1.744 3.972-2.035-.291-2.035-2.907-4.36-2.616-.29 2.228.775 3.875 2.519 5.135 1.066.775 2.519 1.84 1.26 3.003-1.357 1.162-2.035-.872-2.907-1.647-1.259-1.066-2.228-2.325-3.487-3.294-.582-.484-1.357-.969-2.132-.291-.775.775-.097 1.454.291 2.132 1.162 2.228 3.294 3.487 5.231 4.941 2.035 1.453 4.263 2.906 3.585 5.812-2.035 1.163-2.228-2.809-4.457-.775 1.841 1.647 2.326 4.457 5.232 4.554zm75.76 241.714c.581 4.553-1.841 9.01-.485 13.466 1.744 5.91 2.229 12.013 2.325 18.117.097 4.747-.096 9.494.679 14.338.968 5.813.775 11.819.581 17.826-.097 2.325-2.616 4.456 1.162 6.394 2.132 1.066 3.391 3.875 6.394 3.294 9.107-1.55 18.505-.678 27.514-3.197 7.266-2.035 7.654-1.841 7.266-9.397-.387-6.976-1.84-13.951-1.162-21.023.097-.969-.291-1.938-.485-2.81-1.162-4.747-1.55-9.688-.872-14.435 1.163-8.816-.968-17.535-.775-26.448.388-13.273-2.518-26.545-.387-39.914 1.55-9.979-4.941-19.473-1.163-29.452.097-.387 0-1.065-.29-1.356-2.519-3.391-1.357-7.072-.969-10.754 1.647-15.985.678-16.663-15.21-15.307-7.751.678-15.307 2.422-23.154 1.744-5.232-.484-8.913 4.553-8.138 9.882a341.055 341.055 0 012.325 19.957c.581 6.588.194 13.273 1.259 19.763.969 5.523-1.356 11.142.194 16.276 2.906 10.948.872 22.186 3.391 33.036zm-249.175 67.816v.194c3.101 0 6.104-.194 9.204.096 2.906.194 3.488-.968 3.585-3.584a757.219 757.219 0 012.325-29.839c2.131-20.732 3.39-41.464 4.553-62.197.775-14.822 1.744-29.645 2.81-44.371.871-12.013 2.034-24.122 3.1-36.136.193-2.034.193-3.487-2.519-3.584-9.785-.485-19.667-.969-29.548-.775-2.616.097-3.682.872-3.682 3.681 0 3.972-.387 8.041-.872 12.013-2.81 22.767-4.069 45.631-5.619 68.397-1.066 15.889-2.228 31.874-3.39 47.762-.97 13.951-2.035 27.998-3.1 41.949-.291 3.294.484 5.231 4.262 5.425 6.297.097 12.594.581 18.891.969zm750.817-80.216c1.066 10.947.388 22.863.775 34.779.291 9.01 2.325 18.117.678 27.32-.775 4.457 0 9.398.678 13.951.485 2.906 1.647 5.813 6.104 5.135 8.235-1.26 16.469-1.55 24.704.387 5.329 1.26 8.623-1.162 8.526-6.588 0-3.197-.485-6.394-.388-9.688.194-15.985.484-31.873.775-47.858.097-8.913-.484-17.826.291-26.642 1.744-20.442-.291-40.98 1.453-61.422.484-5.909-3.197-8.622-8.719-6.491-8.622 3.294-17.632 2.907-26.545 3.585-6.879.484-8.235 1.453-8.235 8.332 0 9.494.775 19.085.581 28.482-.387 12.013-.097 23.929-.678 36.718zm-386.356-37.493c0-16.469-.096-32.939 0-49.312 0-3.293-1.065-4.165-4.165-4.068-8.332.29-16.761.484-25.189.29-4.553-.097-5.91 1.453-5.813 5.813.678 24.704-2.131 49.215-2.519 73.919-.29 15.598-.678 31.292-1.065 46.89-.291 12.206 1.162 24.51.29 36.717-.193 3.1 1.744 2.713 3.391 2.616 10.56-.581 21.217-.485 31.777 0 3.003.097 4.165-1.163 3.875-3.972-.291-3.682-.678-7.363-.678-11.045-.097-17.244-.097-34.489-.097-51.636.193-15.598.193-30.905.193-46.212zm603.755 115.965v-.194c4.65 0 9.4-.29 14.05.097 3.58.291 4.36-.775 4.36-4.263-.1-22.476.09-44.855 0-67.331 0-7.944.96-15.888.38-23.638-1.26-16.954.2-33.811 1.36-50.668.19-3.004-.29-4.651-3.78-4.457-11.43.388-22.86.678-34.29.969-1.84 0-3.1.484-2.91 2.713.48 5.619-.87 11.238-.78 16.857.49 18.116-.96 36.136-.96 54.252 0 24.026.29 48.052-1.07 72.078-.19 4.166 1.26 5.426 5.23 4.941 6.2-.678 12.31-.872 18.41-1.356zm-510.944-25.092c.194 6.394 0 13.951-.872 21.507-.387 3.294.775 5.135 4.457 5.329 8.719.29 17.341.969 25.963 2.519 5.619 1.065 6.394 0 6.491-5.716.678-22.186 1.26-44.468 2.228-66.653 1.26-28.967-.193-58.031 1.744-86.998.194-2.713-.872-3.682-3.584-3.778-8.235-.388-16.373-1.066-24.608-1.551-5.522-.29-5.909.194-6.103 5.813-.775 19.957-1.163 39.915-2.519 59.872-1.55 22.67-2.131 45.63-3.197 69.656zm416.582-209.26v38.752c0 2.132.097 3.682 3.1 3.488a631.56 631.56 0 0127.032-1.744c3.87-.194 5.13-1.55 5.33-5.522.77-18.892.38-37.783.48-56.675.1-19.569.58-39.042 1.84-58.515.68-10.947 1.26-21.895 1.26-32.842 0-1.647.78-3.778-2.23-3.778-10.46.097-21.02-.097-31.483.775-2.132.193-3.197 1.065-3.197 3.293.096 10.657-1.744 21.217-1.841 31.874-.097 26.932-1.55 53.865-.291 80.894zM160.609 480.638c-.484 7.363.291 21.411 0 35.458-.097 2.81.872 3.779 3.585 3.779 8.428 0 16.76.097 25.188.193 2.616 0 3.682-.968 3.876-3.681.775-13.466 1.937-27.03 2.615-40.496 1.55-30.42.291-60.937 3.1-91.357.776-8.526.776-17.051 1.551-25.576.484-5.426.29-6.298-5.329-6.201-8.235.097-16.469.582-24.704.582-3.682 0-4.65 1.259-4.747 4.844-.388 11.625-.872 23.251-1.841 34.779-2.422 26.836-3.003 53.865-3.294 87.676zm106.858-58.127h.291c0-19.861-.097-39.624.097-59.484 0-3.779-1.066-5.329-4.941-5.038-8.235.581-16.373.969-24.607 1.453-3.294.194-4.844 1.744-4.747 5.232.096 6.006.29 11.916-.097 17.922-1.066 16.664-1.938 33.424-2.325 50.184-.776 27.998-.194 55.996-.194 83.994 0 3.004 1.065 4.457 4.262 4.457 8.913-.194 17.729-.291 26.642-.291 3.1 0 3.779-1.55 3.779-4.166.581-31.389 1.162-62.777 1.84-94.263zm408.541 13.563h.388l-2.034-63.359c-.097-3.197-1.163-4.069-4.554-4.457-8.622-1.066-16.954 1.163-25.479 1.26-4.553 0-6.007 1.259-6.007 6.006.097 29.839.194 59.678.969 89.517.388 14.338.872 28.676 1.066 43.014.097 4.069 1.162 6.104 5.619 6.394 8.331.582 16.663-.484 25.092.194 6.103.485 6.394-.388 6.297-6.588-.291-23.929-.775-47.955-1.357-71.981zm79.732 17.244h-.775c0-10.657.194-21.313 0-31.873-.29-17.729-1.744-35.361-2.906-53.09-.291-3.778-1.841-4.65-5.232-4.166-6.975.969-14.047 1.744-21.119 2.519-8.235.969-8.138.872-7.751 9.107 1.454 27.998 2.81 55.996 4.166 83.994.872 19.279 1.647 38.655 2.422 57.934.097 2.325.969 2.81 3.003 2.422 8.041-1.356 16.082-1.065 24.123-1.065 6.007 0 6.298-.388 6.104-6.298-.581-19.86-1.356-39.72-2.035-59.484zm199.572-55.221h-.678v-32.358c0-2.616-.387-4.456-3.584-4.359-8.235.387-16.47.678-24.608.968-3.584.097-5.038 1.454-4.941 5.329.485 18.019.679 36.136 1.163 54.155.387 14.145 1.356 28.386 1.841 42.531.484 17.147.678 34.392.968 51.636 0 2.81.775 4.166 3.876 3.972 8.331-.484 16.76-.871 25.091-1.162 2.907-.097 4.069-1.453 3.972-4.166-.29-4.65-.678-9.3-.775-14.047-.871-34.102-1.55-68.301-2.325-102.499zm152.388 51.637v40.108c0 8.235.2 16.47.2 24.704 0 2.81 1.06 3.585 3.78 3.585 9.2-.097 18.4-.097 27.61.097 2.81.096 3.58-.969 3.58-3.682.1-6.491-.1-12.885.1-19.279.77-25.77.19-51.54.68-77.31.29-13.854.87-27.707 1.45-41.464.1-3.197-.39-4.844-4.17-4.65-8.04.484-16.08.872-24.12.775-3.97 0-5.23 1.259-5.52 5.134-1.94 23.93-3.2 47.956-3.59 71.982zm57.07 39.236v22.767c0 2.422.38 4.456 3.58 4.553 9.3.194 18.6 1.356 28 1.066 2.32-.097 3.49-.581 3.49-3.294-.1-14.144.09-28.386.09-42.53 0-22.67-.67-45.437 1.55-68.107.68-7.363 1.55-14.725 1.94-22.088.1-2.131.19-4.36-2.81-4.65-9.3-.679-18.6-1.357-27.9-2.132-2.91-.193-3.68 1.453-4.17 4.069-2.03 11.335-2.13 22.767-2.61 34.199-1.07 25.285-2.33 50.668-1.16 76.147zm41.56-231.542c-.97-8.041.29-14.92-.29-21.895-.49-6.006-1.65-12.207.38-18.213 2.33-6.685-1.93-11.723-9.01-10.56-6.49 1.066-13.07 2.131-19.66.387-4.56-1.259-8.33.679-8.14 5.619.58 13.079-2.13 26.061-2.13 39.14 0 6.297 1.45 12.885-2.42 18.794-.49.679-.29 1.938-.2 2.81 1.26 8.816 1.75 17.632-.68 26.351-.19.678.1 1.55.39 2.325 2.13 6.588 1.16 13.273-.77 19.473-1.46 4.844-.68 8.429 2.23 12.013 3 3.682 6.49 3.294 10.75 2.228 5.23-1.356 10.75-1.937 15.89.969 4.07 2.325 10.07-1.453 9.88-6.103-.97-18.795 1.06-37.59.77-56.481.1-6.297 1.46-12.11 3.01-16.857zM823.944 386.665v-15.016c0-1.647 0-3.585-2.422-3.391-8.526.872-17.051-1.259-25.577-.581-2.906.194-3.972 1.259-4.069 4.069-.193 13.078-.678 26.157-.871 39.236-.194 19.957-.388 40.011-.291 59.968.097 15.792-.775 31.583-1.841 47.375-.29 4.65 2.035 6.394 5.813 6.103 6.782-.484 13.466.775 20.248.484 2.228-.096 2.906-.872 3.1-3.1 1.841-18.601 1.937-37.299 3.294-55.899 1.937-25.48 1.841-51.25 2.616-79.248zM402.13 294.92c0 3.875.097 7.751 0 11.626-.194 8.913.581 9.785 9.3 9.978 5.135.097 10.367 0 15.501-.193 1.938-.097 3.778 0 5.716.387 5.232 1.26 8.041-1.453 7.266-6.878-.194-1.55-.775-3.004-.581-4.747 1.356-10.366 2.034-20.83 1.744-31.292-.097-2.519-.872-5.038-.485-7.654 1.744-13.563 1.55-27.223 1.938-40.786.29-8.526.194-17.051.872-25.576.484-5.426-.969-7.848-6.491-8.526-7.848-.969-15.695-.097-23.542-.969-6.782-.678-8.235 1.163-8.235 7.944-.097 14.048.097 28.096-.387 42.046-.582 18.31-2.519 36.427-2.616 54.64zm-97.848-9.3h-.872c0 10.463.193 20.926-.097 31.486-.097 3.778 1.259 5.134 4.941 5.231 8.331.291 16.663.969 25.091 1.647 2.229.194 3.101-.484 3.294-2.809 1.454-19.958 3.197-39.818 4.554-59.775 1.55-22.864 2.325-45.727 4.844-68.494.193-1.841.097-3.197-2.229-3.294-9.881-.29-19.666-.484-29.548-.775-2.809-.097-3.972 1.55-3.972 3.778 0 6.007-1.55 11.82-1.937 17.729-1.454 24.995-2.713 50.184-4.069 75.276zM1017.7 435.396h-1.55c0-23.058-.09-46.115.1-69.172 0-3.391-.48-4.36-4.17-4.263-7.65.097-15.013 1.647-22.666 1.841-2.906.096-3.391 1.55-3.197 4.069.484 10.172.775 20.247 1.066 30.42.871 26.254-.388 52.508.871 78.86.679 13.078.485 26.157.582 39.139 0 3.778 1.647 4.747 5.038 4.457 6.876-.485 13.856-.969 20.736-1.163 3.19-.097 4.16-1.259 3.97-4.456-.39-7.363-.68-14.823-.78-22.186-.09-19.182 0-38.364 0-57.546zm51.35-176.999h-.1V203.66c0-4.36.1-8.719-.09-13.079-.2-4.553-2.81-7.072-5.91-6.491-7.08 1.163-14.15 3.003-21.51 1.938-4.07-.582-6.4 2.615-8.33 5.619-1.36 2.034-1.46 4.553.67 6.103 2.81 2.035 2.91 4.747 3.01 7.75.58 17.729-.1 35.361.48 53.09.78 21.798.29 43.596.2 65.297 0 4.457 1.45 6.588 5.91 6.879 6.58.484 13.17.484 19.76-.097 4.46-.388 5.91-2.422 5.91-6.879-.1-21.798 0-43.595 0-65.393zm41.08-140.379c0 9.301.29 18.698-.1 27.998-.19 4.069 1.45 4.554 4.65 4.36 9.49-.484 18.99-1.066 28.48-1.163 4.07-.096 5.33-1.55 5.04-5.425-1.16-16.276 0-32.551.87-48.827.97-19.28 2.13-38.558 3.3-57.934.29-4.36-1.26-5.62-5.43-5.522-9.98.194-19.96.193-29.94.969-2.81.193-4.36 1.162-4.45 4.36-.87 27.125-3.3 54.155-2.42 81.184zM89.887 152.023c0-.097 0-.097 0 0 3.585 0 7.072 0 10.657-.097 5.328-.097 7.363-2.034 7.363-7.363 0-36.33.097-72.756 1.937-109.086.291-6.297 2.81-12.4.775-18.989-1.356-4.36-3.584-7.266-8.234-6.684-3.391.484-6.588.387-9.979-.485-9.979-2.422-15.404 2.132-15.695 12.304-.096 4.069 1.454 7.847 1.26 11.916-.484 9.01-1.453 18.02-1.26 27.03.291 10.85 0 21.604-.096 32.454-.097 11.723.097 23.251-2.422 34.877-1.454 6.297 1.259 13.079.29 19.763-.387 2.81 1.26 4.457 4.457 4.36 3.487-.194 7.266 0 10.947 0zm805.554 96.008c0-22.767-.388-45.437.678-68.204.194-3.875-1.066-4.553-4.747-4.262-8.041.775-16.082 1.356-24.123 1.453-3.585.097-4.166 1.453-4.069 4.553.484 28.58.194 57.062.872 85.642.387 16.954 1.162 33.811 1.744 50.668.096 3.1 1.453 3.778 4.262 3.584 6.394-.387 12.885-.969 19.279-.775 4.941.097 6.201-1.744 6.201-6.491-.194-21.991-.097-44.08-.097-66.168zM59.661 372.908c0-9.881-.097-16.663.097-23.445.096-2.712-.388-3.584-3.488-3.293-6.394.678-12.885.968-19.28.871-3.293 0-3.778 1.357-3.971 3.973-1.84 25.769-1.84 51.539-2.616 77.309-.29 11.238.581 22.573.484 33.811 0 13.854.776 27.708-.484 41.659-.484 5.037 1.453 6.975 5.813 6.781 5.813-.194 11.625-.678 17.438-.678 2.81 0 3.585-1.066 3.682-3.681.193-7.751.775-15.501.872-23.251.387-37.59-.679-75.373 1.453-110.056zm615.088-228.442c-.194 9.688 1.259 12.013 5.619 12.401 7.072.581 14.145.969 21.217 1.841 4.456.581 5.909-.872 5.909-5.426.291-22.088 2.229-44.177 4.166-66.072 1.647-18.988 2.228-37.976 4.36-56.868.484-4.36-1.26-5.91-5.232-5.91-7.266-.096-14.532-.096-21.798-.58-4.553-.291-6.006 1.55-6.2 5.715-.291 11.916-2.228 23.736-2.809 35.652-1.454 27.32-3.585 54.834-5.232 79.247zM777.248 28.308v-3.682c0-1.453-.582-2.616-2.229-2.519-9.009.485-18.019.872-27.029 1.454-2.325.096-3.391 1.55-3.488 3.875-.097 2.422-.193 4.844-.387 7.266-1.066 18.31-2.035 36.717-3.1 55.027a1000.648 1000.648 0 00-1.744 63.844c0 2.809.872 4.166 3.875 4.166 7.557 0 15.113 0 22.67.969 3.778.484 5.619-.775 5.522-4.941-.484-20.539 1.647-40.883 2.325-61.422.775-21.12 2.325-41.949 3.585-64.037zM485.35 144.273c2.131 0 4.262-.194 6.297 0 4.166.484 6.103-.872 6.297-5.426.194-9.785.581-19.666 1.453-29.451 2.616-31.68 3.681-63.36 6.878-94.942.194-1.647.679-3.681-1.84-3.488-9.01.678-18.02-.872-27.03-.581-2.906.097-3.875 1.453-4.069 4.166-1.259 15.597-2.712 31.098-3.778 46.696a1240.627 1240.627 0 00-2.034 38.17c-.485 13.563-2.519 26.933-2.229 40.496.097 3.197 1.163 4.65 4.263 4.069 5.232-.872 10.463.775 15.792.291zM1030.3 13.195c-12.4 0-12.6-.097-13.95 11.14-1.75 14.533-3.39 29.065-4.56 43.693-1.35 16.373-2.13 32.746-3 49.215-.48 8.719-.78 17.342-1.07 26.061-.09 2.228-.19 4.65 3.2 4.747 8.24.484 16.37 1.066 24.61 1.647 2.81.194 3.97-.969 4.07-3.972.39-12.595 1.06-25.092 1.45-37.686.39-13.854 2.04-27.611 3.29-41.465 1.46-16.179 3.01-32.455 4.65-48.633.3-2.907-.58-4.07-3.58-4.166-5.33.194-10.66-.969-15.11-.582zM500.463 242.799h.193c0-21.895-.096-43.886.097-65.781 0-3.1-.872-4.069-3.778-3.875-7.75.29-15.404.581-23.154.775-2.422.097-3.391 1.162-3.488 3.487-.29 6.394-.872 12.885-.969 19.279-.193 18.698-.193 37.396-.29 56.094-.097 18.988 0 38.073-.097 57.062 0 1.84-.485 3.584 2.422 3.487 8.719-.484 17.341-.968 26.06-1.259 2.713-.097 3.101-1.066 3.101-3.488-.194-21.991-.097-43.886-.097-65.781zM30.5 137.588v-.291c4.65 0 9.397-.097 14.047 0 2.422.097 3.488-.484 3.488-3.197.097-7.266.775-14.532.775-21.701.097-19.473 2.325-38.945 3.39-58.321a370.778 370.778 0 013.198-32.746c.484-3.197 0-5.619-4.457-5.231-8.622.775-17.34 1.356-26.06 1.55-4.457.097-5.91 2.325-6.2 6.2-1.454 18.31-3.585 36.524-4.263 54.834-.678 18.698-2.035 37.299-.969 55.996.097 2.519.775 2.907 3.003 2.81 4.65 0 9.398.097 14.048.097zm568.295 129.528c.679 18.31-.581 37.977.776 57.643.29 3.972 1.743 4.457 4.94 4.263 6.588-.291 13.273-.872 19.861-.484 4.456.29 5.909-.582 5.716-5.329-.388-10.657-.194-21.313-.097-31.97.29-31.583.484-63.166.872-94.845.096-3.972-1.454-5.135-5.135-4.844-5.328.387-10.657.484-15.985.678-9.979.484-9.591.484-10.076 10.075-1.162 21.217-.29 42.337-.872 64.813zm318.347 39.139c0 6.976.194 13.854-.097 20.829-.097 3.1 1.162 3.972 3.972 3.876 7.944 0 15.791-.001 23.735.096 2.229 0 3.101-.484 3.197-2.906.485-12.11 1.647-24.123 1.551-36.233 0-30.711 3.778-61.131 4.359-91.745.097-3.197-.775-3.972-3.681-3.875-4.844.194-9.688.097-14.532.097-12.595 0-12.595 0-13.37 12.303 0 .291 0 .679-.096.969-2.519 32.164-4.069 64.328-5.038 96.589zm169.248-.484v22.767c0 2.422.48 3.972 3.39 3.972 7.27.096 14.53.387 21.7.678 2.62.097 3.88-1.163 3.78-3.875-.19-6.782.87-13.564.97-20.248.29-19.667 2.42-39.237 3.58-58.903.97-16.566 2.14-33.133 3.49-49.699.29-4.263-1.26-5.813-5.33-6.104-7.26-.484-14.43-1.162-21.7-1.259-3.19 0-4.16.872-4.36 3.972-2.61 36.233-3.78 72.466-5.52 108.699zm-543.494 8.816v.194c4.069 0 8.041-.097 12.11 0 3.003.097 3.681-.969 3.778-3.972.388-18.892.872-37.687 1.647-56.578.485-10.754 1.744-21.507 2.325-32.261.582-11.916.775-23.832 1.163-35.749.097-2.518-.388-4.359-3.585-4.359-7.75-.194-15.5-.485-23.154-.969-3.584-.194-4.747 1.163-4.844 4.65-.969 18.02-1.841 36.039-2.325 54.156-.484 15.113-1.647 30.226-2.325 45.34-.388 8.331-.291 16.76-.485 25.188-.096 3.294 1.357 4.65 4.651 4.457 3.584-.291 7.266-.097 11.044-.097zm-9.494 68.494c-1.163-13.854-2.228-26.642-3.197-39.527-.194-2.81-1.938-3.1-3.972-2.81-5.232.582-10.463 2.035-15.792 2.035-2.131 0-2.906 1.356-2.809 3.584 1.162 20.248 1.453 40.593 2.906 60.841 1.841 24.413 2.81 48.924 4.263 73.338.581 10.172 1.259 20.247 1.744 30.42.097 2.519.678 3.972 3.681 3.681 4.941-.581 9.979-1.066 14.92-1.259 4.262-.097 5.328-1.744 5.037-5.91-1.259-20.442-2.228-40.883-3.294-61.325-1.162-21.313-2.325-42.724-3.487-63.068zm-318.347-87.58c0 5.523.097 11.335-.096 17.148-.097 2.422.581 2.907 2.906 2.907 8.429-.097 16.76.096 25.189.29 3.487.097 5.037-1.259 5.037-4.747 0-17.923 2.132-35.748 2.326-53.574.193-11.238 1.453-22.476 2.325-33.714.678-8.816 1.453-17.632 2.131-26.545.194-2.035.581-4.457-2.713-4.457-8.525-.097-17.05-.097-25.576-.387-3.197-.097-4.359 1.162-4.844 4.456-1.55 12.013-2.131 24.026-2.906 36.136-1.066 20.732-2.422 41.465-3.779 62.487zM935.452 21.236c0-1.454-.097-3.488 0-5.62.194-3.003-.969-4.36-4.166-4.456-7.556-.097-15.113-.387-22.767-.678-2.615-.097-3.584.678-3.778 3.488-1.453 19.57-3.294 39.139-4.65 58.805-1.453 20.926-2.519 41.852-3.875 62.778-.194 2.422.484 3.682 3.1 3.779 7.944.193 15.791.484 23.735.775 3.101.097 4.36-1.163 4.36-4.263.194-6.588.581-13.176.969-19.86 1.84-31.39 3.681-62.778 7.072-94.748zM804.18 270.506v4.844c-.194 13.078-.387 26.157-.581 39.139 0 2.519-.097 4.941 3.584 4.941 6.976-.097 13.854-.194 20.83-.097 2.422 0 3.39-.872 3.487-3.391.194-8.235.581-16.469.969-24.607.775-15.307 1.453-30.614 2.325-45.921 1.066-17.342 2.228-34.683 3.391-52.025.194-3.293-.775-4.553-4.263-4.65-7.944 0-15.791-.29-23.638-.872-3.779-.29-5.135.872-5.038 4.747.387 25.964-1.841 51.928-1.066 77.892zM374.132 99.999h-.388c0 11.819.194 23.541-.097 35.361-.096 3.39.969 4.262 4.069 4.165 7.557-.096 15.21-.096 22.767 0 2.422 0 3.197-.387 3.294-3.197.097-11.238.678-22.573.969-33.811.872-29.16 1.647-58.321 2.615-87.579.097-2.615-.484-3.875-3.39-3.778a817.51 817.51 0 01-21.798.29c-2.907 0-4.069 1.357-4.166 4.07-.194 7.556-1.163 15.113-1.55 22.67-1.163 20.538-1.55 41.173-2.325 61.809zm485.463-69.076h-4.456c-2.907-.096-3.972 1.357-4.166 4.07-.581 9.494-1.259 18.988-1.938 28.482-1.259 16.663-2.615 33.423-3.681 50.087-.678 9.494-.872 18.988-1.356 28.482-.097 2.422.581 3.972 3.39 4.069 8.526.194 17.051.388 25.577.775 2.809.097 4.165-1.065 4.165-3.875.097-3.584.388-7.072.485-10.657.581-18.697 2.519-37.298 3.875-55.9a2724.962 2724.962 0 013.197-39.526c.291-3.488-.872-4.94-4.456-5.038-6.491-.194-13.079-.678-20.636-.969zM309.997 135.36h.194c0 2.712.194 5.522-.097 8.234-.29 2.81.872 3.682 3.585 3.682 7.363.097 14.822.29 22.185.678 4.069.194 5.426-1.55 5.522-5.328.097-6.782.291-13.564.582-20.248 1.453-31.874 3.294-63.65 6.781-95.427.388-3.487-.872-4.65-4.069-4.844-5.328-.193-10.656-.678-15.888-.968-9.203-.485-9.107-.485-9.882 8.816-2.034 22.476-4.262 44.855-6.2 67.331-1.162 12.691-1.841 25.382-2.713 38.074zM71.674 310.227v-.387c3.875 0 7.75-.097 11.625 0 2.616.097 3.391-.969 3.391-3.391.194-6.394.581-12.885.775-19.279.484-13.854.581-27.708 1.356-41.465 1.26-21.701 3.294-43.402 5.716-65.006.291-2.809-.678-3.778-3.39-3.778-7.073.097-14.145.194-21.314.097-3.681 0-5.425 1.259-5.522 5.231-.581 12.885-1.356 25.77-2.132 38.558-.968 16.276-1.937 32.455-2.712 48.731-.581 12.4-.872 24.801-1.453 37.202-.194 3.197 1.065 3.778 3.972 3.487 3.197-.29 6.49 0 9.688 0zM948.724 96.22h.291v43.015c0 3.584 1.841 4.941 5.135 4.844 7.266 0 14.532-.097 21.798 0 2.519 0 3.39-.969 3.294-3.488-.582-13.079 0-26.061.29-39.139.581-25.286 2.519-50.571 3.778-75.76.194-3.1-.775-4.069-3.681-3.972-8.235.387-16.373.872-24.607 1.163-3.197.096-3.972 1.743-4.069 4.65-.775 22.96-1.55 45.824-2.229 68.687zM325.595 439.174c.388-24.801.291-49.699-.484-74.5-.097-4.166-1.357-5.91-5.619-5.619-4.457.29-9.01.193-13.563.096-2.616-.096-3.682.775-3.682 3.585.097 21.41 0 42.918 0 64.328 0 29.645 1.26 59.29 2.035 88.935.193 8.72.193 8.72 9.009 8.526 12.304-.194 12.304-.194 12.304-12.401v-72.95zM536.986 14.066v.097c-2.228 0-4.553.097-6.781 0-3.004-.194-4.747 1.066-4.747 4.07.193 10.172-1.55 20.247-2.229 30.323-.968 14.822-1.647 29.645-2.712 44.37-.969 14.145-2.132 28.289-3.294 42.434-.194 2.712.484 3.778 3.294 3.875 6.878.29 13.854.581 20.732 1.259 3.003.291 3.778-.678 3.972-3.584.969-12.692 2.228-25.286 3.294-37.977 1.066-13.466 2.034-27.03 3.003-40.496.969-12.982 1.841-26.06 2.81-39.042.194-3.003-.678-4.457-3.972-4.457-4.36 0-8.816-.484-13.37-.872zm-245.977 16.47c-.484-1.453 1.841-4.36-2.131-4.844-7.169-.872-14.338-1.938-21.701-1.938-2.035 0-3.294.679-3.585 3.004-.581 5.231-1.55 10.463-2.131 15.791-1.453 12.304-2.713 24.607-4.069 37.008-2.422 21.507-4.65 42.918-7.266 64.328-.388 3.391.678 4.263 3.778 4.457a586.74 586.74 0 0118.795 1.453c3.294.29 4.359-.872 4.941-4.069 2.519-14.145 3.294-28.483 5.037-42.724 2.907-23.93 5.523-47.955 8.332-72.466zM159.931 277.773h.291v3.39c.29 11.142.581 22.283.968 33.424.097 2.034-.096 4.359 3.197 4.166a729.102 729.102 0 0120.248-1.163c1.938-.097 2.81-1.066 2.422-2.713-1.356-7.266.678-14.435-.097-21.701-.968-9.978-.484-19.957-.193-29.935a8609.854 8609.854 0 012.325-70.141c.097-3.488-1.066-4.65-4.457-4.263-6.2.678-12.497 1.453-18.794 1.453-4.554.097-5.135 2.422-4.747 5.813.484 3.682.581 7.363.484 11.141-.581 23.542-1.066 47.084-1.647 70.529zM594.436 32.57c-1.647 0-3.197-.096-4.844 0-10.366.582-8.913-1.646-9.591 9.495-1.26 21.894-2.228 43.79-3.197 65.684-.581 13.079-.775 26.157-.969 39.139-.097 6.685 0 6.685 6.491 6.879 5.038.194 9.979.29 15.016.872 4.069.387 5.329-1.163 5.522-5.038 1.647-34.78 3.391-69.56 5.135-104.34.581-12.884.581-12.884-12.497-12.788-.388.097-.775.097-1.066.097zm62.681 213.62h-.194v25.189c.097 9.978.291 19.957.291 30.032 0 4.457 1.356 6.685 6.491 6.394 4.65-.29 9.3-.775 13.95-.872 4.263-.097 5.426-1.937 5.426-6.006.097-19.182.872-38.365 1.84-57.45.872-17.244 1.454-34.489 2.035-51.733.194-6.104 0-6.298-6.2-5.91-6.298.387-12.498 1.162-18.795 1.453-4.069.194-4.941 2.035-4.941 5.813.194 17.632.097 35.361.097 53.09zm-457.853-93.295v.097c4.166-.388 8.332-.872 12.498-1.066 2.712-.097 3.584-1.356 3.681-3.875.388-12.207 1.744-24.414 1.841-36.718.097-11.722 1.162-23.541 1.55-35.264.581-18.407 2.034-36.717 3.487-55.027.194-2.616-.871-3.1-3.003-2.907-6.781.582-13.466 1.163-20.248 1.647-2.906.194-3.294 1.841-3.39 4.166-.485 11.432-1.163 22.864-1.55 34.296-1.066 29.548-2.035 58.999-3.004 88.547-.194 5.716.194 6.201 5.716 6.104h2.422zm-80.216 160.723v.291c3.391 0 6.781-.194 10.172.097 3.1.29 3.779-1.066 3.779-3.876.387-18.407 2.809-36.62 4.262-54.93 1.55-19.57 3.391-39.14 5.232-58.806.193-2.228-.388-3.197-2.713-3.391a678.675 678.675 0 01-19.763-1.744c-2.325-.194-3.391.775-3.391 3.003-.097 12.304-3.197 24.317-3.875 36.524-1.357 24.317-5.426 48.343-6.782 72.563-.484 9.494-.969 9.397 8.235 9.978 1.647.194 3.197.194 4.844.291zM827.141 39.74c.484-3.973.678-10.754.872-17.536.096-2.81-.776-3.778-3.488-3.584-5.813.29-11.626.484-17.438.581-2.616 0-3.585 1.163-3.779 3.778-.872 15.889-2.422 31.777-2.906 47.762-.581 24.123-.969 48.343.097 72.466.194 4.166-2.713 9.688.29 11.916 2.907 2.131 8.332.581 12.595.775 7.266.194 8.331-.678 8.525-8.041.291-13.079 1.163-26.061 1.55-39.139.775-22.186 1.938-44.177 3.682-68.978zm-56.772 210.616c0-21.798-.097-41.852.097-61.809 0-3.488-1.066-5.038-4.65-4.844-5.329.193-10.657.29-15.985.096-3.197-.096-3.972 1.066-3.972 4.263.29 13.563.678 27.03.968 40.593.679 30.614 1.841 61.227 3.101 91.841.096 2.616.871 3.294 3.39 3.101 4.36-.485 8.623-.969 12.982-.969 3.294 0 4.263-1.26 4.069-4.36-.29-5.134-.581-10.269-.581-15.501-.194-18.116-.194-36.232.581-52.411zm-400.016 32.357v25.189c0 8.041 0 8.041 7.848 7.75 1.744-.096 3.584-.193 5.328 0 4.263.485 5.522-1.259 5.522-5.522.097-16.275.194-32.648.969-48.924.678-13.079.484-26.157.872-39.236.581-17.729.969-35.458.969-53.187 0-9.107-.485-9.204-9.882-9.204-11.044 0-9.107-2.034-9.591 9.01-1.066 24.801.097 49.603-1.938 74.501-.968 13.078-.097 26.351-.097 39.623zM627.762 140.3c0 2.713.194 5.523 0 8.235-.29 3.875.969 5.716 5.135 5.522 3.488-.193 7.072 0 10.657.388 4.069.581 5.619-1.163 5.813-5.038.581-10.947 1.937-21.798 2.325-32.842.484-12.691 2.131-25.382 3.197-38.074 1.453-17.05 2.809-34.101 4.262-51.055.194-2.713-.871-3.875-3.584-3.875-4.166-.194-8.332-.485-12.594-.678-7.073-.194-7.363-.097-7.945 6.878-.968 12.013-1.647 24.123-2.712 36.136-2.132 24.898-2.132 49.699-4.554 74.403zm-496.798-3.681c0 2.228.097 5.619 0 9.01-.097 2.809.775 4.166 3.972 3.778 3.682-.387 7.46-.775 11.044-.387 4.554.387 5.426-1.647 5.426-5.619 0-21.314 2.228-42.434 3.39-63.65 1.163-20.926 2.035-41.852 4.263-62.681.291-3.004-.872-4.263-3.778-3.972-5.135.484-10.269.29-15.404.871-3.197.388-4.069 1.841-4.069 4.65-.291 13.08-1.356 26.061-1.938 39.14-1.259 25.867-1.937 51.734-2.906 78.86zm934.796 11.335v.969c-.1 12.594-.1 12.594 12.2 12.594 7.27 0 7.46 0 7.36-7.557 0-17.244 1.26-34.489 2.33-51.733 1.65-25.576 4.07-51.056 6.1-76.632.2-2.713-.77-3.875-3.48-3.875-4.07 0-8.05 0-12.11-.097-2.33 0-3.59.872-3.78 3.294-.1 1.938-.68 3.778-.78 5.716-.97 16.372-2.9 32.745-4.36 49.118-1.84 22.863-1.64 45.63-3.48 68.203zm76.82 136.6h-1.26c-.29 12.11.29 24.22-.48 36.233-.39 6.685-.1 6.685 6.78 6.588 1.94 0 3.87-.097 5.81.097 2.71.29 3.88-.485 3.78-3.391-.68-12.304.97-24.511.97-36.717.1-12.692.77-25.48 1.26-38.171.77-21.41 1.94-42.821 3.29-64.231.97-15.21.39-15.21-15.21-13.369-3.1.387-4.07 1.55-4.16 4.553-.2 8.719-.78 17.341-.78 26.061-.1 27.513 0 54.93 0 82.347zM24.687 159.483c-1.453 0-2.906.097-4.36 0-4.165-.485-6.49.29-6.394 5.522.194 10.172-.387 20.248-.58 30.42-.485 21.217-.873 42.53-1.26 63.747-.194 12.885-.097 25.77-.582 38.655-.387 10.463-.58 10.075 9.98 10.947 4.94.388 5.812-1.259 5.909-5.716.581-22.863 1.26-45.727 2.422-68.591 1.162-21.894 3.1-43.692 4.456-65.49.581-9.494.29-9.591-9.59-9.494zm1148.603-34.005v10.172c0 2.325.97 3.585 3.49 3.585 5.52.194 10.95.484 16.37.872 2.33.097 3.59-.678 3.68-3.197.49-7.557 1.07-15.113 1.65-22.67 1.16-13.757 2.33-27.61 3.78-41.368 1.16-11.238 2.71-22.379 4.16-33.617.49-3.778-.19-6.103-4.84-6.2-4.36-.097-8.62-.775-12.98-1.453-4.65-.679-6.69 1.065-7.07 5.812-.97 12.014-2.04 24.123-3.69 36.04-2.42 17.341-3.77 34.682-4.55 52.024zM703.522 319.431c0 2.712.194 5.522 0 8.235-.194 2.809.388 4.165 3.682 3.681 2.519-.388 5.134-.097 7.75.097 7.944.678 8.429.484 8.913-7.75 1.066-18.795 1.938-37.687 3.003-56.481 1.163-21.217 2.325-42.434 3.585-63.747.097-2.228-.194-3.391-2.519-3.488-4.069-.193-8.041-.29-12.11-.484-3.003-.097-4.263 1.066-4.456 4.166-.776 12.885-2.035 25.673-2.616 38.558-.582 12.11-1.647 24.123-2.422 36.136-1.066 13.757-1.841 27.417-2.81 41.077zM434.1 148.245c1.938 0 3.391-.097 4.844 0 3.488.29 4.844-1.163 4.844-4.747.097-20.539 1.066-40.981 2.132-61.422.968-18.504 1.646-37.008 2.615-55.609.485-9.979.678-9.979-9.106-9.591-1.454 0-2.907.194-4.36.194-3.003 0-4.069 1.356-4.166 4.456-.097 6.394-.581 12.885-1.162 19.28-2.422 23.25-3.294 46.598-4.166 69.946-.291 8.913-.485 17.729-.872 26.642-.194 9.107-.097 12.304 9.397 10.851zM271.343 259.462c-2.132-.581-4.069-4.65-5.329-2.615-1.647 2.809 3.197 2.518 4.36 4.456.097.194.484.388.775.484.969.388 1.937.582 2.712-.193.679-.679.291-1.454.194-2.229-.581-4.262-1.453-8.622-.581-12.981.872-4.069-2.906-8.913 2.713-12.788-6.007 4.843-8.72-1.744-13.273-2.326 5.135 3.488 5.425 9.301 8.332 13.757-2.035.775-2.422-2.131-4.263-1.065.581 3.584 5.425 5.037 4.36 9.591-.582-.582-.969-1.066-1.454-1.357-1.55-.968-1.84-4.94-4.165-3.003-1.454 1.26 1.162 3.488 2.422 5.135.29.387.678.678 1.162.872 1.453.872 2.616 2.034 2.035 4.262zm3.293 128.366h-1.55v57.062c2.519-19.085-.581-38.074 1.55-57.062zm822.314 96.976c.78-4.36-1.45-8.138-2.23-12.207-.29-1.259-.58-3.294-2.52-2.809-1.45.387-.97 2.228-.97 3.391 0 1.065 0 2.518.68 3.197 2.52 2.518 1.94 5.522 2.13 8.525.2 2.035-1.16 5.716 1.46 5.619 2.52.097.87-3.681 1.45-5.716zM833.438 64.444c-2.132 7.266-4.844 14.435-3.779 22.185.097.872.291 2.132 1.551 1.938 1.259-.194.968-1.453 1.065-2.325.291-3.682-.872-7.557.678-10.948 1.744-3.584 1.454-7.072.485-10.85zM335.574 480.832c-.872 7.944-2.229 15.985 1.453 23.639 3.197-8.138-2.131-15.792-1.453-23.639zm456.206-180.68c0 3.681-.194 6.878.775 10.075.29 1.163.096 3.197 1.647 3.003 1.84-.193 1.453-2.228 1.356-3.584a145.325 145.325 0 00-.872-9.107c-.388-2.712 1.066-7.944-1.259-7.75-3.391.387-.776 5.134-1.647 7.363zM469.364 399.55c2.229-8.719.388-17.438.679-26.254 0-1.26.581-3.391-1.551-3.294-1.55.097-.968 2.131-1.065 3.294-.775 8.816 3.294 17.244 1.937 26.254zM5.214 175.952c-.775-2.712 1.163-7.556-1.937-7.556-3.875.096-1.744 4.844-1.841 7.556-.194 2.228-1.453 6.394 1.938 6.297 3.1.097.968-4.069 1.84-6.297zm1.841-20.829c.29 1.163-.387 3.972 1.938 3.197 2.615-.872 5.037-3.1 5.328-6.297.194-1.938-1.453-2.81-3.294-2.616-3.197.291-4.069 2.519-3.972 5.716zm339.175-18.891c.969-5.135.097-26.061-1.065-29.936.387 9.881-2.132 19.279 1.065 29.936zm-11.334 275.622h.968v-25.092h-.968v25.092zm801.774-189.981c0-1.647 0-3.197-.1-4.844 0-.969-.09-2.131-1.35-2.228-1.26-.097-1.36 1.162-1.46 2.131-.29 2.713-.77 5.425-.87 8.138-.09 1.453.2 3.294 1.94 3.391 2.13.097 1.65-1.938 1.74-3.197.2-1.163.1-2.325.1-3.391zm-565.873 31.873c0-2.422.097-4.068 0-5.619-.097-1.065-.387-2.422-1.84-2.325-1.454.097-1.744 1.357-1.744 2.519 0 1.744.097 3.585.581 5.232.581 2.034-.775 5.909 1.744 5.716 2.712-.291.775-4.166 1.259-5.523zm581.373-115.868c1.45-4.65.87-9.3.87-13.95 0-.775-.09-1.744-1.06-1.938-.68-.097-1.26.388-1.26 1.066-.2 5.038-1.26 10.075 1.45 14.822zM301.472 246.577c-1.162 5.619-.387 11.335-2.616 16.664-.387.968-.097 2.422 1.163 2.809.969.388 1.55-.484 1.647-1.259.581-6.104 1.356-12.11-.194-18.214zM1.242 81.591c.097 1.26 0 2.616.097 3.876.097 1.356-.194 3.39 1.84 3.197 1.745-.194 1.745-2.132 1.745-3.488-.097-1.938-.388-3.875-.678-5.716-.291-1.453.678-3.972-1.55-3.875-1.841.097-1.26 2.616-1.454 4.069-.097.678 0 1.356 0 1.938zm201.413 217.301c-.581-1.55 1.162-5.134-1.647-5.231-2.422-.097-1.841 3.488-2.131 5.619v.484c.387 2.228-.485 5.91 2.325 5.813 2.422-.097 1.162-3.778 1.453-5.813.097-.194 0-.387 0-.872zm780.559 146.289c-3.391 4.068-3.391 12.691-.097 15.985.581-5.426.581-10.366.097-15.985zM419.956 44.293c0 3.972-.097 7.944 0 11.916 0 1.163.581 2.325 2.034 2.034 1.163-.193 1.55-1.259 1.453-2.228-.387-4.069-.678-8.138-3.487-11.722zm628.454 80.797c-2.71 4.263-1.74 8.913-1.64 13.37 0 .484.67 1.259 1.06 1.356.97.194 1.36-.678 1.36-1.55.29-4.36.77-8.816-.78-13.176zm-647.927 96.492c-1.163-2.034 1.259-6.394-1.647-6.491-2.519-.096-1.356 4.263-1.356 6.685 0 2.132-1.26 5.91 1.647 6.007 2.131.097.678-3.875 1.356-6.201zM621.078 97.673c.969 1.938-.872 6.201 1.259 6.104 3.1-.097 1.647-4.07 1.744-6.394 0-2.228 1.647-6.297-1.55-6.394-2.325 0-.775 4.262-1.453 6.684zM460.451 82.27c0-.775.097-1.26 0-1.744-.193-1.647.388-4.36-1.937-4.166-2.616.097-1.744 2.906-1.841 4.65 0 .485 0 1.066.194 1.453.872 1.744-.484 5.232 2.131 5.038 2.325-.194 1.066-3.584 1.453-5.231zm458.628 312.339h-.968v19.183h.968v-19.183zM504.725 238.633h-2.131v22.67c1.938-7.557-.387-15.21 2.131-22.67zM354.853 48.556c1.84-3.391-.097-5.91 0-8.526 0-1.26.097-2.712-1.26-3.39-1.162-.582-1.744.387-2.228 1.259-.775 1.453-1.841 3.39-.387 4.36 2.131 1.453 2.712 3.584 3.875 6.297zM474.402 477.15c2.325-4.941 1.55-9.01 1.26-13.079-.097-.678-.582-1.163-1.357-1.066-.387.097-.872.582-.969.872-.193 4.069-1.065 8.235 1.066 13.273zm494.183-176.709a622.05 622.05 0 01-1.453-.29c-.872 3.487-1.938 6.878-2.713 10.366-.194 1.066.291 2.325 1.744 2.422 1.259.097 1.55-1.066 1.647-2.035.387-3.487.581-6.975.775-10.463zm-48.827 200.929c-.679-2.132 1.065-6.104-1.744-6.104-2.422 0-1.26 3.972-1.26 6.201 0 2.034-1.162 5.715 1.453 5.618 2.519 0 .872-3.681 1.551-5.715zm240.162-168.958c-3.97-1.938-8.04-1.454-12.01-.485-.78.194-1.65.582-1.45 1.55.29 1.163 1.35 1.357 2.32 1.163 3.68-.775 7.36-1.453 11.14-2.228zm-566.453-24.511c-1.55 4.457-1.55 8.816 0 13.176 1.163-4.36 2.422-8.719 0-13.176zM1132.7 173.724c.68 1.356-.58 4.166 2.13 4.359 1.94.194 2.33-2.034 2.03-3.584-.38-1.938.68-5.231-2.42-5.328-2.32-.097-1.35 2.712-1.74 4.553zM978.079 375.233v21.411c.484-7.072 2.713-14.242 0-21.411zM350.203 212.379c.581 0 1.162 0 1.646-.097-.193-5.231.679-10.56-1.646-15.694v15.791zM57.723 88.469c2.131-3.68 1.55-7.265 1.453-10.947 0-.968-.29-2.13-1.453-2.13-1.26 0-1.356 1.259-1.26 2.227.388 3.682.776 7.266 1.26 10.85zm356.226 21.993c-.29-1.841.291-4.166-2.422-4.651-1.356-.193-2.325.872-1.937 2.132.581 2.131.678 5.037 2.809 5.716 1.938.678 1.26-1.938 1.55-3.197zm689.591-82.154c-1.07 3.39-1.26 6.006.29 8.428.77 1.163 2.13 1.453 3.39 1.066.77-.194 1.07-1.163.48-1.453-2.61-1.744-1.26-5.522-4.16-8.041zM810.187 537.41c1.356-.291 3.778.387 3.487-1.938-.193-2.131-2.615-1.937-4.262-1.937-1.357 0-3.391-.291-3.294 1.647.097 2.518 2.422 1.937 4.069 2.228zM831.5 140.494v9.688c0 .872-.097 2.228 1.163 2.325 1.55.097 1.55-1.356 1.647-2.422.29-3.197-.097-6.2-2.81-9.591zm-672.344-83.22c.678 4.845-.484 9.882.969 14.726.387-4.94 2.325-9.978-.969-14.725zM226.1 87.308c-.582-1.647.775-4.747-1.357-4.844-2.325-.096-1.55 2.907-1.453 4.65 0 1.745-.097 4.65 2.132 4.457 2.034-.194.29-2.713.678-4.263zm40.592 173.802c.775 4.844 4.747 7.848 6.782 12.013.969-5.812-4.747-7.847-6.782-12.013zm-7.75-20.538c-.194-1.453.097-3.391-1.647-3.488-2.325-.194-2.034 2.035-2.034 3.488 0 1.356-.388 3.391 1.453 3.488 2.131.193 2.034-1.938 2.228-3.488zm698.017-39.236c-1.55 3.875-1.356 6.781-1.259 9.688 0 .775.097 1.84 1.065 1.937 1.357.097 1.357-1.065 1.454-2.034.29-3.004-.485-5.813-1.26-9.591zM157.703 355.567h-1.357v10.172c0 .969.194 2.228 1.357 2.132 1.55-.097 1.453-1.647 1.162-2.616-.968-3.1-1.356-6.297-1.162-9.688zM662.93 75.875c-1.163 4.166-1.26 8.332 0 12.498 1.356-4.166 1.162-8.332 0-12.498zM199.361 188.353c0-1.647-.969-2.325-2.422-2.422-1.744-.194-3.294.387-3.488 2.325-.097 1.647 1.163 2.131 2.519 2.131 1.55 0 2.907-.29 3.391-2.034zM414.724 13.776c-1.065 4.262-1.162 8.428.194 12.594.775-4.263 1.55-8.428-.194-12.594zM915.689 3.41c-1.647-.775-3.197-.097-4.651.193-1.647.291-4.844-.968-4.456 1.55.29 2.229 3.488 1.357 5.425 1.163 1.55-.194 2.907-1.163 3.682-2.906zM420.537 478.895c-.969 4.165-1.162 8.331 0 13.756 1.356-5.037 1.453-9.397 0-13.756zM382.851 6.219c2.809-2.034 5.522-2.906 8.428-2.712.872.096 2.132-.097 2.132-1.357-.097-1.162-1.26-1.26-2.228-1.356-2.81-.388-6.588 1.937-8.332 5.425zm206.353 271.36c-.871 4.069-1.065 8.235.194 12.207.872-4.069 1.26-8.138-.194-12.207zm-224.082-22.864h-.678v23.348h.678v-23.348zm793.348-145.997c-.49 0-.97.097-1.36.097v9.009c0 .775.39 1.744 1.26 1.744.97.097 1.36-.872 1.26-1.647-.29-3.1-.77-6.2-1.16-9.203zm-21.8 147.547c-.19-1.356.19-3.487-1.65-3.584-1.84-.097-1.84 1.937-2.03 3.294-.19 1.453.1 3.294 1.74 3.487 2.33.194 1.65-1.937 1.94-3.197zm-429.369-57.449c-.872 3.294-1.454 6.491-.969 9.881 0 .097 1.065.388 1.162.194 1.744-2.422.678-5.231 1.26-7.847.097-.775.29-1.647-1.453-2.228zM166.616 71.806c1.84-3.1.387-5.909.193-8.912-.096-.872-.29-2.132-1.646-1.744-1.066.387-1.066 1.55-.776 2.422.679 2.712 1.454 5.425 2.229 8.235zm933.434 434.602c1.84-4.165 2.13-8.428 0-12.594v12.594zm-823.767 11.82c-.193-1.357.097-3.197-1.937-3.197-1.938 0-1.841 1.84-1.841 3.294 0 1.259.097 2.809 1.647 3.003 2.131.097 1.938-1.647 2.131-3.1zm381.803-408.929c.194 1.356-.194 3.294 1.937 3.1 1.55-.097 1.744-1.647 1.647-3.003 0-1.453 0-3.197-1.84-3.294-2.035-.097-1.454 1.841-1.744 3.197zm-373.083-92.81c-.388-1.841-2.035-2.423-3.488-2.81-1.356-.388-2.81-.097-2.713 1.744.097 1.743 1.55 2.325 3.1 2.519 1.163.193 2.519.29 3.101-1.454zM157.897 317.105c-.291-1.647-1.26-2.132-2.519-1.841-1.938.581-3.488 1.744-3.682 3.972-.097.872.775 1.744 1.453 1.259 1.647-1.162 4.263-1.065 4.748-3.39zm477.228 115.286v16.47c-.097-5.522 1.938-10.948 0-16.47zm197.247-5.812c-.097-1.066 0-2.616-1.453-2.616-2.131 0-2.228 1.937-2.228 3.487 0 1.26 0 2.907 1.84 2.519 1.841-.193 1.744-1.937 1.841-3.39zM731.617 105.133c-1.84.485-1.84 2.035-1.743 3.488.096 1.356.387 2.906 2.131 2.519 1.55-.291 1.55-1.841 1.55-3.197-.097-1.163-.194-2.519-1.938-2.81zm155.105 11.723c.193 1.356-.194 3.197 1.84 3.197 1.647 0 1.841-1.55 1.55-2.81-.387-1.453 0-3.778-1.937-3.778-1.841 0-1.163 2.131-1.453 3.391zM78.842 342.488c.195 1.26-.096 3.197 1.648 2.907 1.937-.291 1.55-2.519 1.84-4.069.194-1.066 0-2.713-1.356-2.616-2.228.194-1.84 2.325-2.131 3.778zm391.104 104.63v-14.241c-.775 4.844-2.81 9.494 0 14.241zm-343.632-73.241v7.169c0 .872 0 2.228 1.356 2.132 1.163-.097 1.163-1.357 1.26-2.229.29-2.422-.582-4.359-2.616-7.072zM15.387 18.038c1.937.388 2.325-1.259 3.487-1.84 1.454-.775 4.748-.872 3.682-2.616-1.357-2.422-3.488.678-5.232 1.162-1.26.388-2.228 1.454-1.937 3.294zm926.847 18.504c.775-2.906 1.162-5.425-.194-7.653-.291-.484-1.357-.29-1.55.387-.678 2.422-1.26 4.941 1.744 7.266zM15.774 314.2c2.713.097 4.747 2.422 7.557 1.26.775-.291.872-1.647.194-2.035-2.325-1.453-4.844-.872-7.363-.29 0 .097 0 .29-.388 1.065zm994.086 44.759c1.35-.388 3.48 0 3.68-2.132.09-1.356-1.46-1.453-2.62-1.453-1.45 0-3.1 0-3.39 1.841-.29 1.647 1.16 1.647 2.33 1.744zM693.931 213.929c-1.259 4.941-1.453 8.428.194 11.819.775-3.487 1.066-6.975-.194-11.819zM395.348 7.285c-2.809-.969-5.134-1.356-7.556.194-.097.096 0 1.065.194 1.162 2.325.872 4.65.969 6.878-.387.194 0 .194-.291.484-.97zm172.834 271.263c-1.551 3.487-1.26 6.878-.194 10.269 1.162-3.391.969-6.879.194-10.269zM710.788 21.429c1.55.29 2.907.485 4.166.872.581.194 1.163.485 1.744.775 1.453.485 3.294 1.26 2.422-1.453-.581-1.744-2.713-1.453-4.263-1.453-1.259 0-2.809-.581-4.069 1.26zm-18.891 166.536c-2.422 3.682-1.357 6.297.29 8.913.582-2.712 1.26-5.328-.29-8.913zm323.483 140.476c1.55-.194 1.94-1.454 1.94-2.713.09-1.259 0-2.81-1.75-2.713-1.55.097-1.74 1.647-1.74 2.907-.1 1.162.09 2.325 1.55 2.519zM467.039.891c-.193.194-.29.387-.484.581 1.647 1.84 3.197 3.778 4.941 5.522.678.775 1.744 1.163 2.519.194.775-.969.193-1.84-.582-2.422-2.228-1.26-4.359-2.519-6.394-3.875zm128.559 264.19c-1.743 3.294-1.937 6.685 0 10.076v-10.076zm107.052-19.86c-1.162.194-1.84.969-1.743 2.228 0 1.454.193 3.004 2.034 3.294 1.259.194 1.453-.969 1.55-1.937 0-1.357.194-2.907-1.841-3.585zM422.668 109.977c-.29-1.259.388-3.197-1.55-3.487-1.453-.194-1.84 1.162-1.743 2.325.193 1.55 0 3.681 2.034 3.875 1.453.194 1.066-1.647 1.259-2.713zM414.143 6.994c-.387-1.453-1.453-2.034-2.809-2.131-1.454-.097-2.519.581-2.229 2.228.194 1.26.969 2.035 2.229 1.938 1.162-.194 2.518-.388 2.809-2.035zM250.901 90.407c-1.356.388-1.55 1.454-1.259 2.616.29 1.356.29 3.391 2.034 3.294 1.647 0 1.259-1.937 1.259-3.1 0-1.356-.387-2.616-2.034-2.81zm916.479 282.017c-.19-1.066-.19-2.519-1.84-2.131-1.16.29-2.52.871-2.52 2.422-.09 1.453.58 2.712 2.04 2.712 1.74 0 1.93-1.647 2.32-3.003zM657.311 133.325h.484c.291-2.809.678-5.619.969-8.525.097-.775-.194-1.744-1.066-1.938-1.453-.194-1.55 1.066-1.453 1.938.291 2.906.678 5.716 1.066 8.525zM831.016 24.433c.097.968-.581 2.518 1.065 2.712 1.647.194 2.035-1.356 2.132-2.616.097-1.259.29-3.1-1.163-3.294-2.228-.29-1.259 2.035-2.034 3.198zm63.456 10.269c1.647-.582 1.744-2.035 1.841-3.488.096-1.066.097-2.713-1.26-2.616-2.034.29-1.453 2.52-1.841 3.876-.29 1.065-.096 2.034 1.26 2.228zM364.638 284.264c-1.938 3.972-.194 7.75.387 11.625.388-3.875.775-7.75-.387-11.625zM120.404 494.105c1.066-3.101 1.453-6.104-.29-9.204-.679 3.003-1.357 6.103.29 9.204zm596.391 5.231c-.581 3.197-1.066 5.619.194 7.75.29.582 1.356.582 1.55-.193.872-2.325.096-4.554-1.744-7.557zM351.946 70.644c-.193-1.163.291-2.906-1.453-3.1-1.453-.097-1.453 1.453-1.356 2.519.097 1.26-.581 3.294 1.55 3.294 1.356 0 1.066-1.744 1.259-2.713zm114.609 100.367c.678.485-.581 2.422 1.162 2.325 1.841-.096 2.326-1.84 2.326-3.487 0-1.26-.582-2.229-2.035-2.035-1.647.194-1.55 1.55-1.453 3.197zm667.305 116.837c.97-2.809 1.36-5.716-.19-9.785-1.16 4.069-.97 6.879.19 9.785zM504.338 352.66c.775-3.003.969-5.231-.969-7.072-.194-.193-1.066-.097-1.259.194-1.647 2.228.678 3.681 1.065 5.619.097.194.485.484 1.163 1.259zM363.572 195.619c1.066-3.1 1.55-6.201-.291-10.27-.969 4.166-.969 7.266.291 10.27zM252.16 296.761c-.775 2.906-1.743 5.91.582 9.979.387-4.263.678-7.17-.582-9.979zm427.239 75.954c-.387-.872.388-2.713-1.259-3.004-1.55-.193-1.356 1.357-1.356 2.422 0 1.163-.388 3.004 1.162 3.197 1.55.291 1.163-1.453 1.453-2.615zm-159.367-82.251c1.163-.097 1.454-1.066 1.357-2.035 0-1.356.581-3.294-1.454-3.584-1.356-.194-1.743 1.356-1.84 2.422-.097 1.259.387 2.519 1.937 3.197zm244.621 38.074c3.294.484 5.329 1.356 7.266-.194.194-.097 0-1.066-.29-1.163-2.035-1.453-4.069-1.065-6.976 1.357zM223.678 16.488c1.55-2.034 1.356-3.681-.194-4.94-1.55-1.26-3.197-1.357-4.844-.097 2.713.678 4.844 1.647 5.038 5.037zM103.935 194.65c-.291-1.066.484-2.906-1.454-2.906-1.356 0-1.356 1.646-1.356 2.712 0 1.163-.291 3.003 1.55 2.907 1.357 0 1.066-1.647 1.26-2.713zM60.823 519.778c-.387-1.357-1.453-1.647-2.615-1.357-1.163.291-2.81.582-2.422 2.326.29 1.356 1.743 1.162 2.906 1.065 1.162-.097 2.131-.581 2.131-2.034zm517.628-356.517c1.453-.194 2.906-.581 3.197-2.228.29-1.26-.872-1.744-1.841-1.55-1.356.29-3.003.678-3.391 2.228-.194 1.356 1.066 1.453 2.035 1.55zM167.003 19.491c.969-2.615 1.453-4.65-.387-6.49-.485-.485-1.357-.388-1.647.194-.775 2.325.29 4.068 2.034 6.297zm660.622 128.366c-.194-1.066.097-2.713-1.356-2.616-1.647.097-1.357 1.938-1.357 3.101 0 1.065-.193 2.712 1.26 2.518 1.744-.097 1.259-1.84 1.453-3.003zM329.373 498.464c-.484 2.81-1.259 5.716.291 8.429 1.066-2.907 1.356-5.716-.291-8.429zm470.06-478.972c-2.616 3.294-2.325 6.394.194 9.397-.291-3.1-.291-6.2-.194-9.397zM716.31 358.183c1.357-.194 3.294.29 3.585-1.454.291-1.55-1.356-1.356-2.422-1.356-1.356 0-3.294-.097-3.585 1.55-.387 1.647 1.454 1.066 2.422 1.26zm468.03 164.307c3 1.938 5.13 1.55 6.97-.581-2.32-.872-4.55-1.259-6.97.581zM963.838 360.992c-.291-.872-.388-2.422-1.841-2.713-1.744-.29-1.453 1.26-1.55 2.326 0 1.259-.097 2.809 1.744 2.712 1.162 0 1.647-.969 1.647-2.325zM1157.5 84.11c-1.55.485-1.65 1.841-1.84 3.1-.19 1.357.48 2.229 1.84 2.229s2.03-.97 1.84-2.228c-.19-1.26-.29-2.616-1.84-3.1zM593.37 227.59c1.163-3.391.678-6.491-.775-9.591 0 3.294-.969 6.588.775 9.591zM9.865 98.158c-.872 2.616-1.163 5.135.193 7.557.872-2.616 1.163-5.135-.193-7.557zm505.517 20.732h-.581c-.484 2.325-1.066 4.553-1.55 6.879-.194.775-.194 1.743.775 1.937 1.065.194 1.259-.775 1.356-1.55v-7.266zm-46.018 348.379c-2.228 2.131-2.131 4.069-1.55 6.007.194.581 1.066 1.162 1.454.581 1.356-1.647.871-3.682.096-6.588zM711.563 152.41c.969-3.972.969-7.847-.097-11.722-.581 3.972.582 7.847.097 11.722zm-183.199 34.877c.775-2.616 1.647-5.231-1.453-7.363-.969 3.004.194 5.135 1.453 7.363zm106.664 329.391c1.841 1.84 3.682 2.809 6.007 1.55.194-.097.388-1.066.194-1.26-1.744-1.744-3.682-1.937-6.201-.29zm522.862-371.34c2.52-3.003 1.35-5.134 0-7.266-.97 2.228-1.36 4.554 0 7.266zm-898.367 52.025c1.55 1.84-.387 4.359 1.55 5.909.678.581 1.26-.484 1.454-1.356.775-2.325-.097-3.875-3.004-4.553zM507.632 3.507c.969-.097 2.228 0 2.325-1.26.097-1.647-1.356-1.55-2.422-1.55S504.919.6 505.016 2.15c0 1.453 1.55 1.26 2.616 1.357zm10.657 143.672c0-1.066-.291-2.035-1.357-2.228-1.453-.194-1.937.872-2.034 2.131-.097 1.066.194 2.131 1.356 2.228 1.356.097 1.841-.969 2.035-2.131zM1076.9 16.392c0-1.26-.88-1.744-1.94-1.647-1.45.096-2.42.872-2.52 2.421 0 .97.68 1.454 1.55 1.357 1.36-.097 2.52-.678 2.91-2.131zM948.046 355.47c-1.356.194-2.519.484-2.519 2.131 0 .872.776 1.26 1.647 1.26 1.26-.097 2.616-.388 2.81-1.841.097-1.356-.969-1.453-1.938-1.55zm64.524-330.36c-2.91 2.81-3.1 5.135-1.55 7.945 0-2.422 2.23-4.457 1.55-7.944zm-501.547 87.967c1.065-2.422 1.162-4.359 0-6.2-.388-.581-1.26-.484-1.55.194-.872 2.034-.485 3.875 1.55 6.006zM286.94 97.286c-.678 2.422-1.744 4.844-.387 7.944 2.131-2.906 1.55-5.425.387-7.944zm557.155-24.123c-2.616 1.647-3.004 3.488-2.422 5.619.193.581.775 1.26 1.356.872 1.744-1.163.775-3.197 1.162-4.747.097-.388 0-.872-.096-1.744zm-48.15-29.258c-.096 2.81-.775 4.844.582 6.685.097.194 1.065.097 1.162-.097 1.066-2.131.775-4.166-1.744-6.588zM255.261 61.15c-.388-1.26-.485-3.003-2.326-3.003-1.162 0-1.453 1.162-1.356 2.13.097 1.357.775 2.52 2.131 2.81 1.26.194 1.551-.775 1.551-1.937zm162.467 4.36c1.356-2.035 1.453-3.779.29-5.523-.387-.58-1.356-.484-1.55.194-.775 1.84-.484 3.585 1.26 5.329zM844.87 40.61c0-.968 0-2.13-1.26-2.13-1.259 0-1.647 1.258-1.937 2.324-.291 1.066.193 1.938 1.259 2.035 1.453 0 1.841-1.066 1.938-2.229zM210.987 310.227c-.097-1.162-.485-2.228-1.744-2.422-1.357-.193-1.453.872-1.55 1.841 0 1.066.097 2.325 1.55 2.422 1.259 0 1.647-.872 1.744-1.841zM57.432 34.702c1.938-1.647 2.229-3.294 1.647-5.232-.193-.678-1.065-.968-1.453-.484-1.26 1.647-1.26 3.488-.194 5.716zm609.179 94.748c-1.55 2.325-2.325 3.972-.969 5.91.194.193 1.066.193 1.26 0 1.162-1.841 1.065-3.585-.291-5.91zm-541.363 10.754c.291.872-.484 2.615 1.356 2.325 1.26-.194 1.357-1.647 1.26-2.713 0-1.066 0-2.616-1.55-2.325-1.357.097-.872 1.647-1.066 2.713zm176.03-.969c-.097-1.066-.387-2.035-1.55-2.132-1.453-.096-1.84.969-1.84 2.132 0 .969.387 1.937 1.453 2.034 1.55.194 1.84-.969 1.937-2.034zm437.993 70.722c.872-.484 1.162-1.356 1.066-2.325 0-1.066.096-2.519-1.454-2.616-1.162 0-1.259 1.26-1.259 2.228 0 1.066.097 2.229 1.647 2.713zM536.889 356.148c-.193-.775-.193-2.034-1.453-1.937-1.453.193-1.259 1.647-1.259 2.712 0 .969 0 2.228 1.259 2.132 1.453-.194 1.357-1.647 1.453-2.907zm169.152-189.787c-2.325-1.066-4.65-1.55-7.556.194 3.003 1.066 5.328 1.065 7.556-.194zm-528.865 19.473c2.325.775 4.553 1.066 6.587-.291-2.325-.872-4.553-1.162-6.587.291zm800.903 293.642c3.197-1.26 4.069-3.488 2.616-7.072a495.408 495.408 0 00-2.616 7.072zm-57.934-3.972c-.097-1.163-.581-2.229-1.841-2.325-1.065-.097-1.744.678-1.84 1.647-.194 1.356.484 2.131 1.743 2.228 1.066.097 1.841-.388 1.938-1.55zm-268.26-284.923c1.163 0 1.938-.484 1.938-1.647 0-1.259-.291-2.616-1.744-3.1-1.259-.388-1.647.775-1.647 1.744-.193 1.259-.193 2.615 1.453 3.003zm319.316 122.553c-.775 1.937-1.647 3.681-.194 5.716.194.193 1.162.29 1.162.096.872-1.84.775-3.681-.193-5.425 0-.194-.291-.194-.775-.387zM39.703 205.888c.194-3.1.97-5.135-.775-6.878-.193-.194-1.162-.194-1.259 0-1.066 1.84.581 3.293.678 5.037-.097.291.29.485 1.356 1.841z" fill="#3858E9"/>
-</svg>
+<svg width="382" height="463" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <path d="M145.188 250.097s-11.586 3.662-12.064 2.677c-.479-.984 2.23.774.114-7.334-2.115-8.109-23.919-16.143-23.249-14.087.671 2.056 34.626 143.402 70.698 201.355 0 0 5.969 7.07 2.591 18.86" stroke="#1E1E1E" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+  <path d="m110.327 223.338-1.905 4.617 2.719 1.126 2.301-1.824-3.115-3.919Zm0 0c3.115 3.919 3.116 3.918 3.118 3.917l.004-.004.014-.011.048-.039.177-.141a170.005 170.005 0 0 0 3.095-2.574 264.56 264.56 0 0 0 8.557-7.621c7.025-6.524 16.33-15.809 25.411-26.837 9.065-11.01 18.012-23.883 24.212-37.585 6.193-13.687 9.783-28.509 7.692-43.253-6.465-45.589-50.772-76.288-98.397-69.665C36.634 46.15 2.58 87.748 9.045 133.337c2.091 14.744 9.665 28.013 19.426 39.481 9.772 11.481 21.953 21.415 33.73 29.526 11.796 8.124 23.324 14.512 31.892 18.867a267.38 267.38 0 0 0 10.346 4.992c1.249.568 2.233 1.001 2.91 1.295l.782.335.208.088.058.024.016.006.005.003c.002 0 .004.001 1.909-4.616Z" fill="#fff" stroke="#fff" stroke-width="10"/>
+  <path d="m109.98 228.201-7.578 22.991s6.168 3.421 15.804.934l-5.973-23.823-2.253-.102Z" fill="#fff"/>
+  <rect x="106" y="233.128" width="9" height="2" rx="1" transform="rotate(-.815 106 233.128)" fill="#1E1E1E"/>
+  <path d="M294.325 242.139c-1.065-.105-27.318 5.204-24.956-5.487 0 0 .495-2.865 3.506-6.483 0 0 6.764-9.294-3.601-11.954 0 0-9.446-1.754-12.025-5.016L152.045 368.455l14.787 27.241s13.521 25.847 32.305 35.85" stroke="#1E1E1E" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+  <path d="m257.447 200.963-2.862 4.104 2.451 1.706 2.666-1.351-2.255-4.459Zm0 0a739.01 739.01 0 0 0 2.258 4.457l.005-.002.017-.008.055-.029c.047-.024.115-.058.202-.104.175-.09.429-.222.757-.395a181.86 181.86 0 0 0 2.814-1.52 265.502 265.502 0 0 0 9.978-5.798c8.248-5.025 19.308-12.321 30.515-21.397 11.189-9.061 22.651-19.996 31.601-32.323 8.942-12.315 15.565-26.283 16.63-41.339 3.292-46.559-33.479-86.347-81.53-89.68-48.052-3.331-90.063 30.995-93.354 77.553-1.065 15.056 3.528 29.802 10.649 43.23 7.129 13.443 16.94 25.853 26.745 36.37 9.821 10.533 19.746 19.285 27.206 25.399a264.686 264.686 0 0 0 9.065 7.119 171.026 171.026 0 0 0 3.452 2.52l.051.036.015.01.004.003c.002.001.003.002 2.865-4.102Z" fill="#fff" stroke="#fff" stroke-width="10"/>
+  <path d="m257.965 207.459 2.594 24.048s-6.751 2.078-15.656-2.336l10.837-22.076 2.225.364Z" fill="#fff"/>
+  <rect x="252.136" y="210.563" width="8" height="2" rx="1" transform="rotate(3.25 252.136 210.563)" fill="#1E1E1E"/>
+  <path d="M93.67 116.884c4.373-.77 8.572-.744 12.595.08 4.008.737 7.599 2.179 10.773 4.325 3.174 2.146 5.828 4.925 7.963 8.337 2.222 3.396 3.726 7.325 4.512 11.786.833 4.724.713 9.164-.358 13.321-.984 4.142-2.767 7.838-5.351 11.089-2.568 3.339-5.821 6.122-9.757 8.349-3.921 2.314-8.331 3.903-13.23 4.766-6.823 1.203-13.2.839-19.132-1.092-5.845-1.946-10.606-5.166-14.284-9.659l8.254-12.277a27.758 27.758 0 0 0 10.618 6.517c4.028 1.364 8.01 1.699 11.947 1.006 4.723-.833 8.326-2.911 10.806-6.234 2.553-3.426 3.413-7.501 2.581-12.224-.802-4.549-2.892-7.968-6.272-10.259-3.293-2.306-7.126-3.073-11.5-2.302a17.716 17.716 0 0 0-7.787 3.401c-2.219 1.744-3.87 3.884-4.957 6.421L65.74 144.94c-.046-.262-.041-1.255.016-2.979l.156-6.792c.047-2.804.091-5.878.133-9.223.027-3.431.09-6.915.188-10.45.156-8.324.318-17.642.485-27.953l45.923-8.094 2.821 16.008-33.196 5.85-.128 21.533c.849-1.322 2.218-2.511 4.106-3.565 1.976-1.07 4.451-1.867 7.425-2.391ZM147.158 166.232l.002-19.186 14.655.002-.002 19.185-14.655-.001ZM233.754 87.603c.484-4.593 1.818-8.784 4.002-12.573 2.185-3.79 4.933-6.984 8.243-9.582 3.407-2.679 7.275-4.638 11.603-5.88 4.417-1.232 9.054-1.593 13.913-1.082 5.3.558 9.967 2.031 14.003 4.42 4.124 2.4 7.492 5.611 10.105 9.637 2.613 4.026 4.431 8.817 5.455 14.373 1.12 5.476 1.323 11.615.608 18.417-.902 8.568-2.584 16.072-5.048 22.511-2.366 6.36-5.371 11.581-9.016 15.663-3.565 4.18-7.721 7.181-12.468 9.004-4.747 1.823-9.902 2.442-15.467 1.856-5.919-.622-11.261-2.479-16.026-5.571-4.766-3.091-8.62-7.203-11.563-12.335l11.373-10.057c1.767 3.58 4.231 6.474 7.393 8.682 3.161 2.208 6.73 3.521 10.705 3.939 5.918.623 10.846-1.226 14.783-5.545 4.026-4.31 6.578-10.74 7.656-19.289-2.101 2.994-4.972 5.237-8.612 6.73-3.64 1.492-7.713 2.002-12.218 1.528-4.681-.493-8.926-1.743-12.734-3.751-3.807-2.008-7.02-4.579-9.638-7.713-2.617-3.133-4.566-6.687-5.844-10.662-1.27-4.063-1.672-8.303-1.208-12.72ZM269.94 73.46a16.117 16.117 0 0 0-6.911.746c-2.125.67-4.07 1.76-5.837 3.271-1.757 1.423-3.238 3.187-4.442 5.293-1.106 2.028-1.785 4.234-2.036 6.619-.251 2.385-.046 4.683.614 6.896a21.262 21.262 0 0 0 3.139 5.823 17.186 17.186 0 0 0 5.175 4.296c2.027 1.106 4.233 1.785 6.618 2.035 2.385.251 4.684.047 6.897-.614 2.213-.66 4.153-1.706 5.822-3.138a17.575 17.575 0 0 0 4.282-5.042c1.195-2.018 1.917-4.22 2.168-6.605a16.124 16.124 0 0 0-.746-6.91c-.651-2.302-1.688-4.33-3.111-6.088-1.423-1.757-3.143-3.233-5.161-4.428-1.929-1.185-4.086-1.903-6.471-2.154Z" fill="#1E1E1E"/>
+</svg>
\ No newline at end of file
diff --git a/src/wp-admin/images/about-header-credits.svg b/src/wp-admin/images/about-header-credits.svg
index 8154f18709..bae4c28d54 100644
--- a/src/wp-admin/images/about-header-credits.svg
+++ b/src/wp-admin/images/about-header-credits.svg
@@ -1,3 +1,15 @@
-<svg width="1196" height="533" fill="none" xmlns="http://www.w3.org/2000/svg">
-  <path d="M566.939 402.937c-1.07.9-1.199 2.27-1.541 3.47-.429 1.371-1.157 2.227-2.484 2.699-2.441.942-4.282 2.484-5.224 5.012-.343.942-1.028 1.542-2.056 1.627-2.269.257-3.725 1.757-4.881 3.47-5.696 8.354-13.361 13.665-23.21 16.364-7.108 1.928-14.045 1.671-21.111.514-1.156-.171-2.269-.214-3.34.3-1.028.471-2.269.728-3.083 0-2.655-2.313-6.166-2.956-8.993-4.883-2.141-1.5-4.11-3.128-5.695-5.098-2.783-3.513-5.866-6.811-7.922-10.838-.556-1.114-.942-2.227-1.113-3.427a2018.309 2018.309 0 01-2.355-16.064c-.086-.557-.214-1.242 0-1.671 2.826-4.712 2.697-10.323 4.71-15.293 2.826-6.982 6.38-13.45 11.476-19.148 2.912-3.213 6.252-5.911 9.635-8.353 2.355-1.714 4.839-3.641 7.836-4.498 2.313-.643 4.197-2.399 6.681-2.785.899-.128 1.541-.171 2.398.258 4.71 2.398 8.35 6.339 12.932 9.038 5.738 3.342 11.776 5.997 17.514 9.339.856.514 1.713.985 2.569 1.542.471.3.942.771 1.542.428.642-.342.728-1.028.77-1.67 0-.771-.471-1.585 0-2.314.557-.856.771-2.313 1.97-2.356 1.713-.042 3.383.729 4.539 1.928 2.869 3.127 2.741 7.325 3.811 11.138-1.67 1.97-.128 3.641.086 5.569.3 2.227 1.028 3.469 2.612 4.883 1.413 1.285 1.071 3.427 1.199 5.269.086 1.242-.428 2.613.857 3.598-.129 3.941-.129 7.968-.129 11.952zM540.39 6.263c2.141 1.628 3.34 3.941 4.71 6.169 1.456 2.399 3.64 4.37 5.567 6.468a88.13 88.13 0 018.521 10.624c1.628 2.356 2.056 4.969 2.099 7.71.043 2.014.342 3.984.556 5.955.643 6.083.129 11.952-3.34 17.22-.77 1.157-1.327 2.314-1.584 3.685-.471 2.313-1.756 4.155-3.297 5.911-4.668 5.27-10.278 9.424-15.673 13.837-.942.77-2.098.856-3.169 1.285-2.955 1.2-5.652 2.913-8.907 3.427-2.184.343-4.367.428-6.551.814-1.157.214-2.184.214-2.655 1.628-.386 1.07-1.114 1.113-1.456-.086-.3-.985-.9-1.371-1.842-1.414-4.11-.214-7.75-1.842-11.262-3.77-3.168-1.756-6.38-3.555-9.292-5.654-3.554-2.57-6.209-6.04-8.264-9.895-1.285-2.4-2.484-4.798-4.454-6.94-1.37-1.457-2.312-3.813-3.254-5.826-1.157-2.485-.214-4.027 2.483-4.712.942-.214 2.013-.3 1.97-1.542-.086-1.414 1.156-2.999-.814-4.241-1.498-.9-2.569-2.356-1.884-4.327.685-1.97 2.698-3.298 4.839-3.212.642.042.899-.258 1.114-.772.385-.9.984-1.799 1.156-2.741.599-3.47 3.254-5.526 5.395-7.925 2.313-2.613 4.454-5.398 7.023-7.754 4.539-4.198 9.292-8.182 14.816-11.095 3.426-1.799 6.894-2.998 10.834-1.97 1.156.3 2.441.171 3.426-.771 4.325-.086 8.778-.086 13.189-.086zM566.939 506.175c-1.413 1.928-2.655 3.941-2.955 6.34-.171 1.328.257 2.528 1.456 3.384 1.328.943 1.285 2.014.043 2.956-1.97 1.499-3.982 2.999-6.038 4.412-1.456.986-4.753-.599-5.395-2.87-.685-2.399-2.141-2.784-4.154-2.57-2.484.257-4.967.471-7.408.942-2.783.557-4.71 4.884-3.34 7.368.813 1.5.728 3.17 1.37 4.713.428 1.028-.385 1.456-1.242 1.456-3.297 0-6.551 0-9.849-.086-1.07-.042-1.927-.557-2.184-1.713-.299-1.328-1.284-1.628-2.44-1.542-7.88.642-15.373-1.757-22.996-3.17-1.67-.3-3.168-1.585-4.796-2.313-2.783-1.243-5.309-3.042-8.35-3.77-1.242-.3-1.798-1.371-1.755-2.656.042-1.328-.514-2.313-1.456-3.17-11.006-10.238-10.663-26.045-5.267-36.926 2.141-4.326 4.539-8.567 7.665-12.123 2.312-2.656 4.367-5.869 7.964-7.411 1.328-.557 2.613-1.713 3.469-3.084 1.242-1.928 3.94-2.999 6.123-2.228 1.628.6 2.356.343 2.57-1.499.171-1.799.985-1.97 2.612-1.071a267.305 267.305 0 017.836 4.37c3.041 1.756 6.423 2.741 9.25 5.054 3.126 2.528 7.279 3.727 10.876 5.784 7.109 4.069 13.318 9.038 16.187 17.134.771 2.185 2.227 4.156 1.028 6.64-.343.728 1.884 3.984 2.655 4.198.728.214.77-.428 1.027-.814.428-.642.942-.856 1.627-.556.728.342.686 1.028.429 1.67-.043.129-.129.257-.172.386-.299 1.028-.77 2.142.386 2.87.728.471 2.612-1.328 2.612-2.57-.043-2.185.642-4.37.171-6.597-.043-.257-.043-.557-.043-.857.086-.814-.299-1.928.557-2.356 1.071-.557 1.242.899 1.97 1.199-.043 7.068-.043 14.094-.043 21.076zM484.251 128.435c1.97-2.399 3.297-4.969 5.353-6.939.642-.643.299-1.286.085-1.971-.3-.942.086-1.499 1.071-1.071.899.386 1.456.043 2.098-.514 4.625-4.241 9.763-7.753 15.202-10.881 1.199-.685 2.398-1.713 3.425-2.741 4.454-4.498 12.89-3.556 16.529-.129 2.441 2.314 5.011 4.455 7.88 6.212 3.04 1.842 6.037 3.769 8.821 6.04 1.584 1.285 2.612 2.784 3.34 4.626.942 2.399 2.141 4.669 3.811 6.64 1.97 2.313 2.698 5.312 4.068 7.968a226.787 226.787 0 012.227 4.626c1.67 3.47 1.284 7.068.728 10.667-.086.428-.257.814-.386 1.242-.599 1.885-.642 2.999 1.927 3.641 4.325 1.071 6.552 6.426 4.754 10.538-1.371 3.17-2.655 6.511-5.439 8.867-.342.258-.599.772-.942.814-4.625.943-5.695 5.398-8.307 8.354-.728.814-1.413 1.67-2.484 1.927-2.055.472-3.083 1.928-3.597 3.813-.471 1.799-1.884 2.784-3.169 3.941-.257.214-.685.514-.942.428-2.355-.771-4.196.771-6.295 1.328-1.541.429-2.098-.257-2.226-1.67-.129-1.286-.6-2.442-2.056-2.656-1.498-.257-2.269.728-2.954 1.97-.514.943-.471 2.656-1.799 2.656-1.413-.043-1.07-1.756-1.541-2.699-.257-.557-.429-1.499-1.199-1.242-1.285.471-2.912.343-3.555 1.971-.77 2.013-1.884 3.812-3.597 5.226-1.541 1.285-3.126 2.784-5.31 2.056-2.44-.814-4.196-2.442-4.667-5.098-.043-.342-.171-.685-.214-1.028-.171-1.071-.386-2.227-1.585-2.57-1.07-.3-1.327.9-1.884 1.499-1.113 1.285-2.355 1.799-3.982 1.028-1.242-.599-2.484-.385-3.768-.085-1.97.385-3.469-.172-5.011-1.542-3.168-2.828-6.166-5.955-10.02-8.011-1.327-.685-1.927-1.799-2.098-3.256-.3-2.613-1.071-5.14-.685-7.839.128-.985.171-2.57-1.842-1.671-.899.386-1.455-.385-1.841-1.113-1.028-1.885-2.012-3.899-1.97-6.04.043-5.355-.513-10.71.6-16.022.128-.556.214-1.156.086-1.713-1.071-4.07.556-7.497 2.398-10.924.899-1.627 1.798-3.255 2.398-5.012.599-1.842 1.67-3.255 2.954-4.626 2.527-2.956 4.154-2.742 5.61.985zM560.046 271.212c1.07 8.868-3.555 15.679-10.235 21.505-2.826 2.484-4.881 5.74-8.179 7.796-3.939 2.442-7.922 4.584-12.503 5.783-8.051 2.099-15.93.557-23.852-.343a65.744 65.744 0 01-11.905-2.356c-6.808-1.97-11.904-5.654-15.801-11.823-4.368-6.897-6.294-14.05-6.08-22.018.214-6.469 2.312-12.423 4.838-18.292 3.084-7.068 7.537-13.279 12.89-18.677 2.912-2.956 6.209-5.612 9.977-7.625 4.154-2.227 8.222-4.541 12.247-6.897 1.028-.599 1.756-.514 2.912-.171 5.738 1.671 10.149 6.04 15.501 7.882 6.467 2.228 11.177 6.426 15.844 10.838 3.255 3.041 5.268 7.068 7.623 10.795 2.74 4.412 4.325 9.253 5.909 14.136.985 2.87.942 5.869.814 9.467zM67.173 6.263c1.799 1.457 2.955 3.77 5.995 3.17 1.37-.3 3.64 3.127 3.811 5.183.086.857 0 1.757.257 2.528.386 1.242.942 2.27 2.612 1.285 1.927-1.114 2.655 1.157 4.026 1.67.942.343.685 1.2.342 2.014-.342.9-.3 1.756.942 1.842 2.313.171 3.512 1.885 3.983 3.641.942 3.513 3.211 6.297 4.753 9.467 1.499 3.084 2.398 6.04 2.098 9.596-.514 5.868-2.098 11.309-4.624 16.578-1.028 2.142-1.071 4.712-2.57 6.725-.214.257-.171.728.171.986.514.385.9 0 1.328-.3.557-.386 1.113-1.328 1.756-.557.6.685-.343 1.242-.728 1.799-3.298 4.926-7.665 8.739-12.461 12.209-1.542 1.113-2.998 2.441-4.368 3.77-2.612 2.57-5.91 3.555-9.292 3.855-9.978.942-19.784.042-29.162-3.856-6.123-2.57-10.92-6.597-13.874-12.68-2.098-4.283-4.154-8.567-5.353-13.236-1.884-7.24-1.07-14.137 1.756-20.905.642-1.542 1.199-2.999.556-4.712-.342-.9-.214-1.842 1.2-1.414.77.214 1.027-.214 1.327-.728 1.242-2.185 3.04-4.24 3.511-6.554.514-2.527.942-4.07 3.726-5.012 1.541-.514 2.227-2.956 3.511-4.412 2.612-2.913 6.252-4.455 8.993-7.197.128-.129.385-.214.514-.386 1.541-2.141 3.383-3.555 6.252-3.041.813.129 1.67-.343 1.926-1.37h8.137c1.113 1.413 2.312 3.17 4.11 2.955 1.927-.214 2.227.171 2.184 1.885-.043 1.5 1.585 1.37 2.484 1.97.343.214.77.172.77-.3.044-.9.429-1.841-.385-2.655-.47-.429-.899-.943-1.327-1.371-.728-.686-1.07-1.5-.985-2.485.685.043 1.37.043 2.098.043zM85.63 357.144c.042-1.028 0-1.585.128-2.099.257-.943.385-2.142 1.584-2.313 1.113-.172 1.841.728 2.312 1.627.6 1.114 1.242 2.314 1.456 3.513.557 3.341 2.655 6.126 3.212 9.596.428 2.741.77 5.526 1.328 8.224.385 1.885 1.755 3.642 2.654 5.484 1.542 3.17 1.542 6.468.257 9.338-1.242 2.827-.942 5.612-1.37 8.396-.514 3.599-.214 3.641-3.982 4.198-1.028.172-1.542.686-1.413 1.757.513 4.455-1.285 8.224-3.383 11.908-1.5 2.614-3.255 3.17-6.124 2.785-1.756-.214-2.955 1.028-3.597 2.484-.6 1.371-1.499 2.399-2.57 3.385-2.012 1.885-3.468 1.97-5.352.042-.985-.985-1.627-.942-2.698-.214-1.927 1.328-3.083 1.157-4.282-.599-.556-.771-.899-.557-1.284-.086-.9.985-2.013 1.328-3.298.985-.685-.171-1.199.214-1.755.557-1.885 1.071-4.068 1.285-6.167 1.671-.685.128-1.284-.172-1.755-.643-1.242-1.371-2.827-2.57-3.64-4.198-1.028-2.013-.642-4.455-.214-6.597.214-1.199.171-1.885-.9-2.399-.685-.342-1.027-.942-1.413-1.585-.642-1.156-1.627-1.156-2.954-1.371-2.655-.385-4.84.129-7.109 1.371-.985.514-1.841-.514-2.355-1.413-.77-1.414-2.013-2.014-3.511-2.528-4.454-1.585-8.822-3.341-11.82-7.282-.513-.643-1.24-.9-2.012-1.114-4.11-1.028-5.695-4.412-7.15-7.882-.172-.343-.172-.942 0-1.242 1.84-3.256-.087-5.998-1.243-8.825-.214-.514-.642-1.028-.514-1.585 1.157-4.712.557-9.638 1.842-14.35 2.226-8.097 6.038-15.379 11.262-21.89 2.227-2.785 3.897-5.955 6.509-8.482 2.483-2.399 5.695-3.47 8.436-5.312 2.483-1.67 4.582-1.628 7.28-.514 2.74 1.114 5.823 1.328 8.692 2.099 4.197 1.114 7.408 3.598 10.406 6.469 2.184 2.099 4.71 2.784 7.58 2.656 1.626-.086 3.125.257 3.939 1.67 2.055 3.599 5.78 5.441 8.607 8.182 1.67 1.628 3.64 2.956 4.839 5.012.342.171.813.428 1.541 1.114zM17.372 174.657c-.6 1.285-.215 2.484-.3 3.684-.086 1.199-.214 2.356-1.67 2.613-1.328.214-2.098-.643-2.655-1.757-.214-.428-.343-.942-.428-1.413-.257-1.542-.943-1.971-2.57-1.371-2.14.814-4.881-.428-6.038-2.399-.256-.6-.642-1.114-1.07-1.585-2.998-3.513-2.826-6.04.128-9.467 1.242-1.456 1.842-3.47 1.842-5.483-.043-2.57.3-4.884 2.27-6.854 1.626-1.628 1.241-4.027 1.54-6.126.558-3.77 1.414-4.712 5.182-5.183 1.499-.172 1.927-1.371 2.098-2.57.172-1.243.343-2.528.257-3.813-.17-2.099 1.328-3.127 3.34-2.485.386.129.814.3 1.2.429 2.826.728 2.826.428 2.997-2.399.128-2.485.942-4.798-.6-7.197-.428-.685.429-2.142 1.628-2.013 1.37.171 2.698-.471 4.025.043 1.07.428 1.285-.086 1.07-1.028-.17-.729-.17-1.414.343-2.057.386-.514.814-1.028 1.585-.899.685.128.813.685.942 1.285.042.3.085.557.17.857.172.599.13 1.413.857 1.628.771.214 1.028-.6 1.456-1.029 1.884-1.799 2.57-4.198 3.126-6.596.3-1.243.942-1.628 1.927-1.328 1.499.428 2.74-.043 3.768-.943 1.97-1.713 4.454-2.442 6.595-3.855 1.713-1.114 3.897-1.585 5.61-3.127 1.199-1.028 2.526.642 3.425 1.413 1.114.943 1.842 1.842 3.469.986.728-.386 1.798 0 1.156 1.113-.6 1.071 0 1.414.685 1.842.942.6 1.927.986 2.955.086.814-.728 1.499-2.356 2.655-1.628 1.541.985 3.897 1.671 4.11 3.727.472 4.541 4.154 5.526 7.237 7.282 4.154 2.356 7.237 5.655 8.051 10.453.385 2.227 1.97 3.727 2.484 5.868.513 2.142.984 4.284.942 6.469 0 .514.128.942.342 1.413 2.87 6.041 3.383 12.295 1.328 18.678-1.542 4.84-3.34 9.552-6.38 13.665-.9 1.199-1.028 2.656-.9 4.112.171 2.185-.642 3.77-2.698 4.627-.942.385-1.627 1.07-2.27 1.884-1.07 1.328-2.312 2.399-4.067 2.999-1.756.6-2.955 2.185-4.325 3.384-1.97 1.756-3.426 1.542-4.368-.942-.514-1.328-1.199-1.371-2.312-1.028-2.741.942-5.053 2.955-8.05 3.384-.9.128-.9 1.199-.9 1.97.043 1.928-.942 3.427-2.184 4.755-1.884 2.056-4.753 2.056-7.151.172-1.97-1.543-3.64-3.342-4.796-5.612-1.028-1.971-3.94-2.399-5.567-.943-.77.686-1.413.386-2.141 0-3.383-1.842-3.426-1.842-5.867.986-.342.385-.6.899-1.199.599-.556-.257-.6-.813-.47-1.285 1.37-4.069-.729-6.639-3.683-8.867-2.912-2.142-5.053-4.969-6.98-8.011-.257-.385-.386-.942-1.156-1.113zM7.223 267.528c-.172-10.623 2.44-19.748 7.879-27.887 2.912-4.326 6.295-8.439 10.277-11.823 2.826-2.399 5.438-5.14 8.778-6.94.814-.428 1.5-.257 2.27-.128 1.713.3 3.297.385 5.139-.171 1.67-.514 4.11.342 5.31 2.227 1.327 2.099 3.596 1.371 5.395 1.885.77.214 1.37-1.285 1.841-2.142.343-.642.6-1.328 1.542-1.157.813.172 1.37.6 1.713 1.414 1.284 3.256 1.927 3.513 5.181 2.228 2.398-.943 3.897.599 5.182 2.013 1.284 1.414 2.697 1.971 4.496 1.928 1.284-.043 2.57-.086 3.854 0 1.927.128 3.211-.814 4.325-2.271.728-.942 1.627-1.67 2.27.129.256.728.899 1.071 1.498 1.499.471.386.9.857.514 1.457-1.67 2.527 1.456 3.127 1.927 4.755.085.299.642.299.942.042.428-.385.3-.856-.086-1.113-2.44-1.457-1.541-4.113-2.14-6.212-.386-1.328 1.198-2.484 2.611-2.956 1.242-.385 2.698.215 2.698 1.414.043 3.813 3.469 5.569 4.796 8.525.814 1.885 1.67 3.769 2.313 5.697.513 1.585-.3 2.313-1.885 1.756-1.841-.642-3.81-.171-5.695-.771-.856-.257-1.713-1.756-2.57-.728-.77.9.258 2.056.772 2.913 2.27 3.813 2.826 8.182 4.282 12.209.428 1.199.985 1.799 2.483 1.713 2.013-.128 2.912 1.457 3.084 3.17.342 2.913.3 5.826.042 8.739-.042.685-.257 1.542-.728 1.97-2.954 2.913-3.168 7.968-6.637 9.982-4.496 2.655-5.91 7.667-9.849 10.666-2.698 2.056-5.481 3.813-8.521 5.183-1.542.686-2.912 1.457-4.068 2.656-1.97 2.056-4.283 2.913-7.28 2.785-4.025-.129-8.136.385-12.076 1.413-4.196 1.114-8.221.686-12.247-.385-6.252-1.628-12.161-4.198-16.957-8.696-4.753-4.455-8.693-9.467-10.791-15.85-1.242-3.77-2.141-7.711-1.884-11.138zM86.4 468.735c1.584-.814 2.783-.899 3.426.857.085.214.428.386.685.428 2.012.215 2.826.9 1.413 2.828-.343.471.043.899.3 1.37.856 1.328 1.199 2.485-.514 3.599-.9.557-1.328 1.713-2.141 2.527-.728.728.385 1.071.942.943 2.14-.514 2.055.814 2.526 2.313 1.2 4.155-.257 8.267.129 12.423.171 1.756-1.585 3.555-1.585 5.783 0 1.071-1.456 2.313-3.126 1.071-1.284-.943-2.055-.257-2.697.899-1.328 2.313-1.5 2.313-2.784 0-.128-.257-.257-.557-.6-.514-.47.086-.47.471-.385.857.043.214.172.385.215.6.428 1.285 1.584 2.613.942 3.812-1.071 1.971-2.313 3.941-4.326 5.184-.642.385-1.327.771-2.012.299-2.57-1.842-5.224-1.585-7.922-.385-.685.3-1.627.3-1.97-.386-1.199-2.356-4.368-2.784-5.31-5.44-.257-.685-.813-.643-1.413-.3-1.456.857-1.841 2.613-.856 4.07.985 1.499-.086 2.27-1.156 2.527-2.655.6-3.94 2.956-5.953 4.369-.728.514-.813 1.457-.899 2.314-.214 1.542-.171 3.17-1.028 4.54-1.712 2.828-3.34 3.042-5.438.515-1.156-1.414-1.927-.814-2.698.214-.728.985-1.413 1.799-2.826 1.071-1.413-.729-1.413-1.842-1.07-3.085.642-2.27 1.027-4.583 1.97-6.768.984-2.313-.686-6.34-3.084-6.94-3.169-.771-6.295-1.842-9.678-1.585-1.584.129-2.483.729-3.04 2.185-.814 2.099-4.11 3.513-6.123 2.785-2.27-.857-3.94-4.327-2.87-6.597 1.285-2.742 1.157-4.841-.984-7.283-6.766-7.839-10.277-16.706-8.479-27.373 1.841-10.966 5.481-21.076 12.076-30.072 2.483-3.384 5.438-6.168 9.164-8.01 1.541-.729 3.297-1.114 5.31-.514 3.682 1.028 7.022 2.613 10.32 4.498 1.67.985 3.982.471 5.995.985a60.746 60.746 0 0118.755 8.61c3.811 2.613 7.023 6.169 9.592 10.195.814 1.286 1.585 1.971 3.04.9.729-.514 1.585-.3 2.441-.129 2.313.472 3.34 2.699 5.31 3.685.942.471.215 2.827-.513 4.198-.343.556-1.071.813-1.071 1.927zM189.468 6.263c.086.343.3.728.214 1.028-.856 3.084 1.242 3.256 3.34 3.598 1.071.172 1.242-.556 1.456-1.199.6-1.713 1.413-2.099 2.998-.9 2.141 1.585 4.582 2.4 7.365 2.27 2.227-.128 4.282.858 6.38 1.586 5.31 1.842 10.92 2.998 15.63 6.297 5.224 3.641 9.464 8.225 12.333 13.922 1.67 3.341 3.597 6.683 4.325 10.367.685 3.512 1.841 6.982 1.755 10.623-.042 1.757-.856 3.299-1.841 4.713-3.597 5.226-7.108 10.495-10.962 15.55-4.025 5.226-8.907 9.424-14.945 12.465-11.476 5.698-22.481 4.07-33.486-.985-4.497-2.056-8.265-5.183-11.048-9.21-3.041-4.37-4.754-9.424-5.353-14.736-.6-5.355 0-10.624.728-15.936 1.327-9.338 4.582-17.906 9.207-26.045 1.241-2.185 3.382-3.427 5.01-5.226 1.327-1.5.685-1.542-.685-1.842-1.371-.3-2.741-.771-4.068-1.328-1.842-.814-1.799-1.414-.514-3.041.985-1.243 2.783-.686 3.597-2.014 2.869.043 5.695.043 8.564.043zM253.358 384.56c.042 2.142-.129 4.284-.9 6.34-.813 2.185-1.969 2.527-3.854 1.199-.513-.342-1.113-.985-1.67-.3-.599.772.343 1.071.728 1.5 3.126 3.298 1.199 7.282-1.327 9.253-.857.685-1.927.342-2.869.042-1.071-.342-1.884-.556-1.285 1.157.899 2.699 0 4.841-2.612 6.169-3.297 1.67-6.081 3.898-8.222 6.939-1.027 1.414-2.483 1.971-3.939 1.328-3.34-1.456-6.209.257-8.993 1.243-2.612.899-5.438 1.842-7.622 3.769a.323.323 0 01-.171.086c-5.31-.129-5.696 4.241-6.252 7.625-.643 3.727-1.927 5.654-5.91 5.697-1.37 0-2.697.6-4.153.215-2.441-.643-3.255-1.928-2.57-4.37.257-.985.429-1.371-.985-1.156-4.41.685-8.264-1.757-9.292-5.655-.085-.386-.257-.942-.128-1.242 1.327-2.656-.3-4.798-1.156-7.111-.215-.6-.643-.857-1.199-1.114-1.628-.728-3.084-2.013-3.512-3.556-.942-3.341-3.297-4.498-6.209-5.354-3.126-.9-6.209-5.312-6.081-8.568.043-.685-.342-1.199-.471-1.842-.813-3.47-2.012-6.939-1.156-10.623.343-1.414.728-2.913.257-4.455a1.456 1.456 0 010-.857c2.869-6.169 3.469-13.108 6.637-19.234 3.683-7.111 8.865-12.851 15.074-17.778 3.554-2.784 7.708-4.626 11.176-7.496.514-.429 1.113-.771 1.756-.643 1.456.343 2.612.129 3.511-1.199.343-.514.985-.557 1.585-.386.685.214 1.413.386 1.969.771 5.696 3.984 12.376 5.569 18.671 8.097 4.282 1.713 9.035 2.27 12.932 4.926 5.524 3.727 9.849 8.225 12.589 14.607 2.527 5.912 2.441 12.423 5.396 18.163.514 1.071.214 2.528.257 3.813zM253.314 261.06c-.471 7.839-3.169 14.993-7.023 21.761-2.184 3.813-4.153 7.754-6.98 11.181-6.08 7.368-13.231 12.637-23.123 13.365-8.864.642-17.471-.686-25.779-3.77-2.355-.857-5.096-.857-6.894-3.084-.471-.557-1.328-.343-2.013-.043-3.083 1.242-4.753.728-6.08-2.313-.814-1.799-1.884-2.442-3.769-2.399-2.483.043-4.753-2.013-4.838-4.369-.086-2.614-.686-5.098-1.542-7.497-1.756-5.012-1.542-10.152-.814-15.293 1.413-9.81 4.754-19.02 9.892-27.373 2.313-3.813 4.282-8.439 9.035-10.324.172-.085.429-.214.514-.385 1.157-3.47 4.24-2.699 6.809-3.085.728-.085 1.37.043 1.67-.899.814-2.442 2.184-3.427 4.839-3.513 1.584-.043 3.211.514 4.71-.642.685-.514 1.456.214 1.97.856.728.943 1.542 1.243 2.569.6.514-.3 1.071-.428 1.628-.171.899.471 1.498.085 2.012-.6.514-.728 1.242-1.157 2.056-1.499 1.156-.429 1.841-.215 2.141 1.156.642 3.256.942 3.47 4.153 3.299.942-.043 1.67.385 2.356.856 3.083 2.228 6.294 4.156 10.105 4.884.686.128 1.285.557 1.885.942 2.569 1.671 5.053 3.427 7.665 5.055 3.34 2.056 5.652 5.184 8.35 7.925.599.6 1.284 1.328 1.413 2.099.728 4.541 3.34 8.568 3.083 13.28zM206.125 194.362c-2.183-.086-4.153-.557-6.166-.471-1.242.042-2.398.085-3.211 1.285-.557.771-1.328.985-2.013.257-2.527-2.528-5.738-1.542-8.693-1.671-1.242-.086-2.355.171-3.254-.942-.814-1.028-2.056-1.2-3.255-1.414-2.612-.428-4.71-1.028-5.866-4.07-.857-2.27-3.041-4.069-4.668-6.04-.385-.471-.899-.342-1.327 0-1.199.857-2.013.172-2.741-.685-.856-.985-.385-1.842.428-2.613.257-.257.514-.514.685-.814.3-.514.557-1.157 0-1.542-.556-.386-.856.3-1.156.642-.856.943-1.884 1.842-3.126.986-1.242-.857-.985-2.228-.556-3.513.299-.857.813-1.628 1.584-1.971 1.67-.813 1.841-1.97 1.584-3.641-1.37-8.91.514-17.349 3.298-25.831 1.927-5.868 5.053-11.009 8.05-16.235 1.114-1.928 2.398-4.369 4.967-5.269.129-.043.343-.128.343-.214.385-2.57 2.955-2.913 4.411-4.37 2.184-2.184 5.181-2.827 8.007-3.898 2.57-.985 5.653-.471 7.665-2.956.685-.813 1.585-.471 2.313.043 2.697 1.885 5.909 2.785 8.735 4.455 4.454 2.613 9.635 3.856 14.131 6.426 5.096 2.913 9.807 6.426 13.96 10.538 3.769 3.77 5.353 8.91 6.68 14.093 2.013 7.883-1.498 14.308-4.539 20.991-3.211 7.025-7.708 13.151-13.403 18.334-3.939 3.599-8.136 6.726-13.489 7.968-3.211.685-6.252 1.97-9.378 2.142zM161.162 483.942c.728-9.253 3.255-17.906 8.051-25.916 3.04-5.055 6.594-9.425 11.733-12.509 1.327-.771 2.441-1.97 3.469-3.127 2.012-2.185 4.796-3.041 7.194-4.584.899-.556 2.012-.171 2.826.429 3.725 2.784 8.05 4.241 12.418 5.654 4.796 1.542 9.549 3.342 14.474 4.627 2.184.557 4.068 1.885 5.096 3.984 1.07 2.099 2.654 3.726 4.453 5.14 3.169 2.57 5.695 5.569 7.365 9.253.557 1.285 1.799 2.185 2.056 3.684.128.771 1.027.985 1.755.814.728-.171 1.157-.942.942-1.499-.599-1.585-.171-2.913.557-4.284.343-.6-.171-1.242-.3-1.842-.085-.514-.214-1.028.3-1.371.557-.343.942.086 1.328.343 2.697 1.842 4.282 4.712 6.209 7.239.813 1.028.471 2.956-1.028 3.941-.814.514-.728.857-.043 1.414 2.313 1.971 2.355 4.541 2.355 7.368 0 2.313-.428 4.626-.214 6.94.086.771.086 1.456-.771 1.756-2.312.9-3.382 2.87-4.41 4.926-.814 1.585-1.884 2.999-3.554 3.727-.942.429-1.157.985-.985 1.842.342 1.671-.428 2.827-1.585 3.941-2.055 2.014-4.239 3.813-7.022 4.755-.814.3-1.585.643-1.884 1.585-.686 2.014-2.227 3.127-4.026 4.155-3.083 1.8-5.095 1.157-7.965-1.67-.899-.9-1.67-1.328-2.911-1.328-1.713 0-3.212 1.028-5.011.728-.813-.128-1.113.857-1.07 1.756.043 1.928-.899 3.085-2.741 3.513-1.027.214-1.712.814-2.269 1.756-1.456 2.399-2.955 2.999-5.695 2.485-.557-.086-1.114-.3-1.67-.3-4.54.043-7.195-2.27-8.222-6.597-.214-.985-.985-1.328-1.842-1.542-2.44-.557-4.924-.9-7.279-1.671-10.963-3.427-16.915-11.266-19.141-22.232-.429-2.271-.985-4.712-.943-7.283zm81.832-1.113v-.814c-.256-2.185-1.199-4.413.985-6.255.343-.299.343-1.071.386-1.627.043-.429-.428-.814-.643-.514-.77 1.113-2.526 1.542-2.655 2.955-.128 1.971-.556 3.941-.685 5.912-.085 1.242.643 2.57 1.756 2.57 1.542 0 .471-1.585.856-2.227zM365.248 6.263c.385 1.67 1.884 2.27 3.126 3.042 2.227 1.37 4.796 2.184 6.809 3.984.299.257.728.514 1.156.3.557-.3.428-.857.342-1.329-.042-.214-.128-.428-.171-.6-.214-.942-.985-2.056.043-2.74 1.113-.73 2.569-.344 3.426.385 1.413 1.156 2.612 2.613 3.168 4.455.215.77.172 1.114-.727.9-.643-.172-1.499-1.371-1.885-.215-.342 1.028-.728 2.442.343 3.427 1.113 1.028 2.269 2.014 3.511 2.785a39.811 39.811 0 017.879 6.554c1.328 1.413 2.613 2.827 2.698 4.926.043.685.257 1.542.942 1.842 1.927.942 2.441 2.656 2.869 4.498a4.118 4.118 0 001.842 2.527c1.798 1.114 1.713 2.699 1.498 4.455-.214 1.757-.299 3.513-.385 5.27-.043.513.214 1.028.685 1.242 1.67.77 1.456 2.099 1.071 3.47-1.156 4.026-3.169 7.582-5.824 10.837-2.312 2.828-5.438 5.012-7.194 8.054-1.542 2.656-3.726 4.412-5.781 6.383-1.884 1.799-4.325 2.313-6.851 2.698-4.368.686-8.822.857-13.018 2.356-1.585.557-3.126-.085-4.668-.214-5.524-.428-11.09-.557-16.443-2.442-3.255-1.156-6.295-2.698-9.292-4.369-.6-.343-1.242-1.028-1.927-.771-3.983 1.328-4.882-2.87-7.409-4.112-.428-.215-.599-.857-.471-1.371.429-1.757-.728-2.742-1.755-3.898-.429.6.257 1.799-.942 1.842-1.071.042-1.927-.772-1.927-1.671-.043-4.284-1.67-8.353-1.199-12.723.385-3.298-.343-6.64.085-10.024 1.199-9.253 2.869-18.248 7.794-26.43a63.486 63.486 0 015.995-8.268c1.113-1.328 2.74-2.056 4.196-2.913.985-.6 2.013-1.114 2.655-2.099 8.607-.043 17.172-.043 25.736-.043zM379.594 431.51c1.113 4.155-.642 6.125-4.753 5.568-1.285-.171-2.527-.299-3.811-.342-2.142-.086-3.469-1.285-3.597-3.47-.215-3.127-1.842-5.44-3.812-7.668-.257-.3-.728-.642-1.07-.642-3.64.299-6.124-2.399-9.207-3.556-2.569-.985-5.267-1.199-7.836-2.056-.343-.129-.899 0-1.242.214-2.141 1.499-3.725.6-5.224-1.071-.814-.942-1.884-1.499-2.955-2.099-9.506-5.312-16.615-12.894-20.126-23.218-1.756-5.14-1.413-10.709-.043-16.064 2.912-11.266 8.821-20.99 15.973-29.986 2.141-2.699 4.838-5.098 7.536-7.411 2.57-2.184 5.695-3.427 8.093-5.911 2.099-2.142 5.353-1.885 8.308-1.757.471.043 1.07.472 1.413.3 3.083-1.413 5.096.686 7.023 2.313 2.355 2.014 5.181 2.871 7.836 4.156 3.597 1.67 7.323 3.17 10.92 4.926 2.869 1.414 4.881 3.898 6.723 6.426.899 1.242 1.798 2.27 3.126 3.127 1.67 1.071 3.297 2.741 3.811 4.412 1.241 4.027 4.153 6.94 5.952 10.581 1.798 3.684 3.811 7.111 4.71 11.266 1.371 6.254 2.056 11.395.557 17.52-.728 3.042-1.199 6.212-3.255 8.911-1.284 1.713-2.697 2.784-4.753 3.298-2.398.557-4.025 1.714-4.839 4.412-.513 1.714-1.755 3.77-4.196 4.07-.728.085-1.113.642-1.285 1.285-.214.814-.599 1.756-.428 2.485 1.156 4.583-1.156 7.582-4.453 10.195-.771.6-1.499.771-2.398.557-.728-.215-1.585-.472-2.698-.771zM325.296 184.167c.129-.643.171-1.328-.257-1.842-2.612-2.999-2.569-6.683-2.869-10.367-.257-3.17-1.456-6.211-1.927-9.381-.685-4.327-.385-8.611.086-12.937.985-9.596 4.239-18.292 9.592-26.259 2.612-3.942 5.567-7.711 9.378-10.453 2.098-1.499 4.796-2.57 6.723-4.198 2.226-1.928 4.967-1.799 7.322-2.956 2.313-1.113 5.696-2.056 8.35.472.814.771 1.97.899 2.998.428 2.955-1.285 5.481-.557 7.579 1.628 1.542 1.628 3.512 2.656 5.31 3.855 6.038 4.027 12.376 7.582 18.328 11.738 4.924 3.469 7.536 8.567 7.879 14.693.086 1.413.128 2.827.557 4.241.342 1.113.514 2.313.128 3.384-1.07 2.913-1.756 6.126-1.584 8.953.299 5.354-4.154 8.267-5.139 12.808-.599 2.742-1.756 5.312-3.468 7.668-2.099 2.87-4.454 5.355-7.409 7.282-1.156.729-1.798 1.585-2.012 3.042-.3 2.613-3.169 4.284-6.081 3.513-1.456-.386-1.884-.086-2.055 1.327-.171 1.5-1.328 2.142-2.655 1.543-3.255-1.414-5.824.3-8.35 1.799-1.071.642-1.884.771-3.126.471-3.041-.728-6.209-.428-9.293-1.157-4.325-.985-8.607-1.927-12.632-3.855-1.07-.514-1.841-.3-2.741.386-1.498 1.156-2.954 1.071-4.068-.514-.685-.943-1.284-.943-2.355-.6-2.441.814-6.38-2.356-6.209-4.712zM321.57 264.83c.257-5.655.129-11.738 1.756-17.649.599-2.271 1.37-4.584 2.783-6.426 2.141-2.827 4.197-5.74 6.424-8.482 2.355-2.913 5.566-5.055 7.622-8.225.942-1.456 2.912-1.67 4.368-2.57.599-.385 1.241-.642 1.713-1.199 2.226-2.571 5.352-2.742 7.793-.3.642.642 1.156.985 2.013.514.171-.086.471-.257.599-.171 2.398 1.627 5.353-.043 7.794 1.327 1.113.6 2.355.472 3.554.643 2.269.343 4.41 1.199 6.423 2.27 3.683 1.885 7.665 3.385 10.877 5.912 3.897 3.041 7.451 6.554 9.206 11.566 1.071 3.127 2.441 6.126 4.411 8.953 2.055 2.956 2.698 6.554 2.741 10.195.042 2.571.171 5.012 1.156 7.497.899 2.27.043 4.926-.043 7.368-.043.557-.343 1.157-.214 1.671 1.113 4.926-.428 9.595-1.285 14.307-.514 2.742-1.798 3.941-4.667 3.984-1.413 0-2.655.343-3.083 2.014-.429 1.713-1.927 2.613-3.084 3.726-.728.686-1.498.257-2.184-.085-1.755-.857-3.211-.6-4.239 1.114-1.242 2.013-3.511 1.242-5.224 1.884-3.383 1.243-3.554.986-5.738-1.927-.3-.386-.685-.986-1.071-.986-1.541 0-2.869.086-3.597-1.756-.299-.685-1.199.171-1.242.771-.085 1.971-1.199 2.785-3.04 2.87-1.499.086-3.04.3-4.111-1.156-.257-.343-.556-.771-1.027-.6-.686.257-.343.814-.3 1.285.171 1.028.043 1.928-1.028 2.27-1.37.429-1.456-.856-1.756-1.627-.642-1.585-1.712-2.356-3.468-2.271-1.585.086-3.126-.043-4.668-.3-1.199-.214-2.398-.128-3.383.814-.942.9-1.841.857-2.226-.514-.343-1.156-1.371-1.413-2.27-1.713-9.292-3.127-13.96-10.324-16.615-19.191-1.456-5.141-1.67-10.281-1.67-15.807zM406.743 475.461c-.171 4.369-1.413 8.396-2.74 12.423-.172.556-.728 1.028-1.156 1.499-.686.771-1.328 1.585-1.414 2.613-.428 4.541-3.126 7.882-5.952 11.052-1.67 1.885-1.627 4.027-1.67 6.211 0 .771.171 1.543-.257 2.271-.342.6-.899.942-1.584.857-.643-.086-.985-.514-1.199-1.071-.086-.215-.086-.429-.171-.643-.343-1.199-.429-2.784-2.27-2.442-2.484.472-3.511 1.971-3.083 4.07.342 1.756.3 3.555.128 5.312-.214 2.399-2.44 4.626-4.839 5.097-1.969.386-3.939.643-5.866 1.071-2.098.471-3.597-1.071-4.668-2.484-1.584-2.142-3.896-2.57-6.166-3.213-.471-.129-1.199-.043-1.413-.343-1.627-2.184-4.025-1.199-6.124-1.628-.556-.128-1.241-.085-1.627.3-2.74 2.785-5.609 1.328-8.007-.128-2.013-1.2-4.026-2.056-6.209-2.613-7.323-1.842-12.504-6.297-15.759-13.066-1.841-3.812-3.468-7.753-5.224-11.651-.471-1.114-.557-2.185 0-3.299.599-1.285.428-2.656.385-4.027-.299-14.779 6.295-26.173 16.958-35.855 2.912-2.613 6.337-4.283 9.335-6.682 2.012-1.585 4.667-2.356 7.065-3.427 1.157-.514 2.056.214 2.869.985 1.371 1.328 2.698 2.785 4.111 4.07 1.285 1.199 2.57 2.484 4.582 2.441.428 0 .985.257 1.328.557 3.768 3.213 8.221 5.312 12.546 7.497 3.512 1.756 6.895 3.684 10.32 5.569 5.995 3.298 9.764 8.353 12.419 14.479.171.428.042 1.156.685 1.199.556.043.728-.6.985-.985.342-.643.685-1.371 1.541-1.242 1.071.171.514 1.156.728 1.756.471 1.242.942 2.356 1.413 3.47zM628.554 135.589c1.071-.9 1.199-2.27 1.542-3.47.428-1.371 1.156-2.227 2.483-2.699 2.441-.942 4.282-2.484 5.225-5.011.342-.943 1.027-1.543 2.055-1.628 2.269-.257 3.725-1.757 4.882-3.47 5.695-8.353 13.36-13.665 23.209-16.364 7.108-1.928 14.045-1.671 21.111-.514 1.156.171 2.27.214 3.34-.3 1.028-.471 2.27-.728 3.083 0 2.655 2.313 6.166 2.956 8.993 4.884 2.141 1.499 4.111 3.127 5.695 5.097 2.783 3.513 5.867 6.811 7.922 10.838.557 1.114.942 2.228 1.113 3.427a2065.3 2065.3 0 012.356 16.064c.085.557.214 1.242 0 1.671-2.827 4.712-2.698 10.324-4.711 15.293-2.826 6.982-6.38 13.451-11.476 19.148-2.912 3.213-6.252 5.912-9.635 8.353-2.355 1.714-4.839 3.641-7.836 4.498-2.313.643-4.197 2.399-6.68 2.785-.9.128-1.542.171-2.398-.257-4.711-2.399-8.351-6.34-12.933-9.039-5.738-3.341-11.775-5.997-17.514-9.339-.856-.514-1.712-.985-2.569-1.542-.471-.3-.942-.771-1.541-.428-.643.343-.728 1.028-.771 1.67 0 .772.471 1.585 0 2.314-.557.856-.771 2.313-1.97 2.356-1.713.043-3.383-.728-4.539-1.928-2.869-3.127-2.741-7.325-3.811-11.138 1.67-1.97.128-3.641-.086-5.568-.3-2.228-1.028-3.47-2.612-4.884-1.413-1.285-1.071-3.427-1.199-5.269-.086-1.242.428-2.613-.856-3.598.128-3.941.128-7.968.128-11.952zM655.103 532.263c-2.141-1.628-3.34-3.941-4.71-6.168-1.456-2.399-3.64-4.37-5.567-6.469a88.087 88.087 0 01-8.521-10.624c-1.627-2.356-2.056-4.969-2.099-7.71-.042-2.014-.342-3.984-.556-5.955-.643-6.083-.129-11.951 3.34-17.22.771-1.157 1.327-2.313 1.584-3.684.471-2.313 1.756-4.155 3.298-5.912 4.667-5.269 10.277-9.424 15.672-13.836.942-.771 2.098-.857 3.169-1.285 2.955-1.2 5.652-2.913 8.907-3.427 2.184-.343 4.368-.429 6.552-.814 1.156-.214 2.183-.214 2.654-1.628.386-1.071 1.114-1.114 1.456.086.3.985.9 1.37 1.842 1.413 4.111.214 7.75 1.842 11.262 3.77 3.169 1.756 6.38 3.555 9.292 5.654 3.554 2.571 6.209 6.04 8.265 9.896 1.284 2.399 2.483 4.798 4.453 6.939 1.37 1.457 2.312 3.813 3.255 5.826 1.156 2.485.214 4.027-2.484 4.712-.942.215-2.013.3-1.97 1.543.086 1.413-1.156 2.998.814 4.241 1.498.899 2.569 2.356 1.884 4.326-.685 1.971-2.698 3.299-4.839 3.213-.642-.043-.899.257-1.113.771-.386.9-.985 1.799-1.157 2.742-.599 3.469-3.254 5.526-5.395 7.924-2.312 2.614-4.453 5.398-7.023 7.754-4.539 4.198-9.292 8.182-14.816 11.095-3.426 1.799-6.894 2.999-10.834 1.97-1.156-.299-2.441-.171-3.426.772-4.325.085-8.778.085-13.189.085zM628.554 32.351c1.413-1.928 2.655-3.94 2.955-6.34.171-1.328-.257-2.527-1.456-3.384-1.328-.942-1.285-2.013-.043-2.956 1.97-1.499 3.982-2.998 6.038-4.412 1.456-.985 4.753.6 5.395 2.87.686 2.399 2.141 2.785 4.154 2.57 2.484-.257 4.967-.47 7.408-.942 2.784-.557 4.711-4.884 3.34-7.368-.813-1.5-.728-3.17-1.37-4.712-.428-1.028.385-1.457 1.242-1.457 3.297 0 6.552 0 9.849.086 1.07.043 1.927.557 2.184 1.713.299 1.328 1.284 1.628 2.441 1.543 7.879-.643 15.373 1.756 22.995 3.17 1.67.3 3.169 1.585 4.796 2.313 2.783 1.242 5.31 3.041 8.35 3.77 1.242.3 1.798 1.37 1.756 2.655-.043 1.328.513 2.314 1.456 3.17 11.005 10.239 10.662 26.045 5.267 36.926-2.141 4.327-4.539 8.568-7.665 12.123-2.313 2.656-4.368 5.869-7.965 7.411-1.328.557-2.612 1.714-3.469 3.084-1.242 1.928-3.939 2.999-6.123 2.228-1.627-.6-2.355-.343-2.57 1.5-.171 1.798-.984 1.97-2.612 1.07a267.534 267.534 0 01-7.836-4.37c-3.04-1.756-6.423-2.74-9.249-5.054-3.126-2.528-7.28-3.727-10.877-5.783-7.109-4.07-13.318-9.039-16.187-17.135-.77-2.185-2.226-4.155-1.027-6.64.342-.728-1.885-3.984-2.655-4.198-.728-.214-.771.428-1.028.814-.428.643-.942.857-1.627.557-.728-.343-.685-1.028-.429-1.67.043-.13.129-.258.172-.386.3-1.028.771-2.142-.386-2.87-.728-.472-2.612 1.328-2.612 2.57.043 2.184-.642 4.37-.171 6.597.043.257.043.557.043.856-.086.814.3 1.928-.557 2.357-1.07.556-1.242-.9-1.97-1.2.043-7.068.043-14.093.043-21.076zM711.242 410.091c-1.969 2.399-3.297 4.969-5.352 6.94-.643.642-.3 1.285-.086 1.97.3.942-.086 1.499-1.071 1.071-.899-.386-1.455-.043-2.098.514-4.625 4.241-9.763 7.754-15.201 10.881-1.199.685-2.398 1.713-3.426 2.741-4.454 4.498-12.889 3.556-16.529.129-2.441-2.313-5.01-4.455-7.879-6.212-3.041-1.842-6.038-3.769-8.822-6.04-1.584-1.285-2.612-2.784-3.34-4.626-.942-2.399-2.141-4.669-3.811-6.64-1.97-2.313-2.698-5.312-4.068-7.968a226.787 226.787 0 01-2.227-4.626c-1.67-3.47-1.284-7.068-.728-10.667.086-.428.257-.814.386-1.242.599-1.885.642-2.998-1.927-3.641-4.325-1.071-6.552-6.426-4.753-10.538 1.37-3.17 2.655-6.511 5.438-8.867.343-.257.599-.771.942-.814 4.625-.943 5.695-5.398 8.307-8.354.728-.813 1.414-1.67 2.484-1.927 2.055-.471 3.083-1.928 3.597-3.813.471-1.799 1.884-2.784 3.169-3.941.257-.214.685-.514.942-.428 2.355.771 4.196-.771 6.295-1.328 1.541-.429 2.098.257 2.226 1.671.129 1.285.6 2.441 2.056 2.655 1.499.257 2.269-.728 2.955-1.97.513-.943.471-2.656 1.798-2.656 1.413.043 1.071 1.756 1.542 2.699.257.557.428 1.499 1.199 1.242 1.284-.471 2.911-.343 3.554-1.97.771-2.014 1.884-3.813 3.597-5.227 1.541-1.285 3.126-2.784 5.31-2.056 2.441.814 4.196 2.442 4.667 5.098.043.343.172.685.214 1.028.172 1.071.386 2.227 1.585 2.57 1.07.3 1.327-.899 1.884-1.499 1.113-1.285 2.355-1.799 3.982-1.028 1.242.599 2.484.385 3.769.085 1.969-.385 3.468.172 5.01 1.543 3.168 2.827 6.166 5.954 10.02 8.01 1.327.686 1.927 1.799 2.098 3.256.3 2.613 1.071 5.14.685 7.839-.128.985-.171 2.57 1.842 1.671.899-.386 1.456.385 1.841 1.113 1.028 1.885 2.013 3.899 1.97 6.041-.043 5.354.514 10.709-.6 16.021-.128.557-.214 1.156-.085 1.713 1.07 4.07-.557 7.497-2.398 10.924-.9 1.628-1.799 3.255-2.398 5.012-.6 1.842-1.67 3.255-2.955 4.626-2.527 2.956-4.154 2.742-5.61-.985zM635.448 267.314c-1.07-8.867 3.555-15.679 10.235-21.504 2.826-2.485 4.881-5.741 8.179-7.797 3.939-2.442 7.922-4.583 12.504-5.783 8.05-2.099 15.929-.557 23.851.343a65.744 65.744 0 0111.905 2.356c6.808 1.97 11.904 5.654 15.801 11.823 4.368 6.897 6.295 14.051 6.081 22.018-.215 6.469-2.313 12.423-4.839 18.292-3.083 7.068-7.537 13.279-12.89 18.677-2.911 2.956-6.209 5.612-9.977 7.625-4.154 2.228-8.222 4.541-12.247 6.897-1.028.6-1.756.514-2.912.171-5.738-1.67-10.149-6.04-15.501-7.882-6.466-2.227-11.177-6.425-15.844-10.838-3.255-3.041-5.267-7.068-7.623-10.795-2.74-4.412-4.325-9.253-5.909-14.136-.985-2.87-.942-5.869-.814-9.467zM1128.32 522.263c-1.8-1.457-2.95-3.77-5.99-3.17-1.37.3-3.64-3.127-3.81-5.183-.09-.857 0-1.757-.26-2.528-.39-1.242-.94-2.27-2.61-1.285-1.93 1.114-2.66-1.157-4.03-1.671-.94-.342-.68-1.199-.34-2.013.34-.9.3-1.756-.94-1.842-2.32-.171-3.51-1.885-3.99-3.641-.94-3.513-3.21-6.297-4.75-9.467-1.5-3.085-2.4-6.04-2.1-9.596.52-5.869 2.1-11.309 4.63-16.578 1.03-2.142 1.07-4.712 2.57-6.725.21-.257.17-.729-.17-.986-.52-.385-.9 0-1.33.3-.56.386-1.12 1.328-1.76.557-.6-.685.35-1.242.73-1.799 3.3-4.926 7.67-8.739 12.46-12.209 1.54-1.113 3-2.441 4.37-3.769 2.61-2.571 5.91-3.556 9.29-3.856 9.98-.942 19.79-.043 29.16 3.856 6.13 2.57 10.92 6.597 13.88 12.68 2.1 4.283 4.15 8.567 5.35 13.236 1.88 7.24 1.07 14.137-1.76 20.905-.64 1.542-1.19 2.999-.55 4.712.34.9.21 1.842-1.2 1.414-.77-.215-1.03.214-1.33.728-1.24 2.185-3.04 4.241-3.51 6.554-.51 2.527-.94 4.07-3.73 5.012-1.54.514-2.22 2.956-3.51 4.412-2.61 2.913-6.25 4.455-8.99 7.197-.13.128-.38.214-.51.385-1.55 2.142-3.39 3.556-6.26 3.042-.81-.129-1.67.343-1.92 1.371h-8.14c-1.11-1.414-2.31-3.17-4.11-2.956-1.93.214-2.23-.171-2.18-1.885.04-1.499-1.59-1.371-2.49-1.97-.34-.215-.77-.172-.77.299-.04.9-.43 1.842.39 2.656.47.429.9.943 1.33 1.371.72.685 1.07 1.499.98 2.485-.69-.043-1.37-.043-2.1-.043zM1109.87 171.382c-.05 1.028 0 1.585-.13 2.099-.26.942-.39 2.142-1.59 2.313-1.11.172-1.84-.728-2.31-1.628-.6-1.113-1.24-2.313-1.46-3.512-.55-3.342-2.65-6.126-3.21-9.596-.43-2.741-.77-5.526-1.32-8.225-.39-1.884-1.76-3.641-2.66-5.483-1.54-3.17-1.54-6.468-.26-9.338 1.25-2.828.95-5.612 1.37-8.396.52-3.599.22-3.642 3.99-4.199 1.02-.171 1.54-.685 1.41-1.756-.51-4.455 1.28-8.225 3.38-11.909 1.5-2.613 3.26-3.17 6.13-2.784 1.75.214 2.95-1.028 3.59-2.485.6-1.37 1.5-2.399 2.57-3.384 2.01-1.885 3.47-1.97 5.35-.043.99.986 1.63.943 2.7.215 1.93-1.328 3.09-1.157 4.28.599.56.771.9.557 1.29.086.9-.985 2.01-1.328 3.3-.985.68.171 1.2-.214 1.75-.557 1.89-1.071 4.07-1.285 6.17-1.671.68-.128 1.28.172 1.75.643 1.25 1.371 2.83 2.57 3.64 4.198 1.03 2.013.65 4.455.22 6.597-.22 1.199-.17 1.885.9 2.399.68.342 1.03.942 1.41 1.585.64 1.156 1.63 1.156 2.96 1.37 2.65.386 4.83-.128 7.1-1.37.99-.514 1.85.514 2.36 1.413.77 1.414 2.01 2.014 3.51 2.528 4.45 1.585 8.82 3.341 11.82 7.282.51.643 1.24.9 2.01 1.114 4.11 1.028 5.7 4.412 7.15 7.882.17.343.17.942 0 1.242-1.84 3.256.09 5.997 1.24 8.825.22.514.65 1.028.52 1.585-1.16 4.712-.56 9.638-1.84 14.35-2.23 8.096-6.04 15.379-11.26 21.89-2.23 2.784-3.9 5.954-6.51 8.482-2.49 2.399-5.7 3.47-8.44 5.312-2.48 1.67-4.58 1.628-7.28.514-2.74-1.114-5.82-1.328-8.69-2.099-4.2-1.114-7.41-3.599-10.41-6.469-2.18-2.099-4.71-2.784-7.58-2.656-1.62.086-3.12-.257-3.94-1.67-2.05-3.599-5.78-5.441-8.6-8.182-1.67-1.628-3.64-2.956-4.84-5.012-.35-.172-.82-.429-1.54-1.114zM1178.12 353.869c.6-1.285.22-2.484.3-3.684.09-1.199.22-2.356 1.67-2.613 1.33-.214 2.1.643 2.66 1.756.21.429.34.943.43 1.414.25 1.542.94 1.971 2.57 1.371 2.14-.814 4.88.428 6.03 2.399.26.6.65 1.114 1.07 1.585 3 3.512 2.83 6.04-.12 9.467-1.25 1.456-1.85 3.47-1.85 5.483.05 2.57-.3 4.883-2.27 6.854-1.62 1.628-1.24 4.027-1.54 6.126-.55 3.769-1.41 4.712-5.18 5.183-1.5.171-1.93 1.371-2.1 2.57-.17 1.243-.34 2.528-.25 3.813.17 2.099-1.33 3.127-3.34 2.484-.39-.128-.82-.299-1.2-.428-2.83-.728-2.83-.428-3 2.399-.13 2.484-.94 4.798.6 7.197.43.685-.43 2.141-1.63 2.013-1.37-.171-2.7.471-4.02-.043-1.07-.428-1.29.086-1.07 1.028.17.728.17 1.414-.35 2.056-.38.514-.81 1.029-1.58.9-.69-.129-.81-.685-.94-1.285-.05-.3-.09-.557-.17-.857-.18-.6-.13-1.413-.86-1.628-.77-.214-1.03.6-1.46 1.028-1.88 1.8-2.57 4.198-3.12 6.597-.3 1.243-.94 1.628-1.93 1.328-1.5-.428-2.74.043-3.77.943-1.97 1.713-4.45 2.441-6.59 3.855-1.71 1.114-3.9 1.585-5.61 3.127-1.2 1.028-2.53-.642-3.43-1.413-1.11-.943-1.84-1.842-3.47-.986-.72.386-1.79 0-1.15-1.113.6-1.071 0-1.414-.69-1.842-.94-.6-1.92-.986-2.95-.086-.82.728-1.5 2.356-2.66 1.628-1.54-.986-3.89-1.671-4.11-3.727-.47-4.541-4.15-5.526-7.23-7.283-4.16-2.356-7.24-5.654-8.05-10.452-.39-2.227-1.97-3.727-2.49-5.869-.51-2.141-.98-4.283-.94-6.468 0-.514-.13-.942-.34-1.414-2.87-6.04-3.39-12.294-1.33-18.677 1.54-4.84 3.34-9.552 6.38-13.665.9-1.199 1.03-2.656.9-4.112-.17-2.185.64-3.77 2.7-4.627.94-.385 1.62-1.071 2.27-1.884 1.07-1.328 2.31-2.399 4.06-2.999 1.76-.6 2.96-2.185 4.33-3.384 1.97-1.757 3.43-1.542 4.37.942.51 1.328 1.2 1.371 2.31 1.028 2.74-.942 5.05-2.956 8.05-3.384.9-.128.9-1.199.9-1.97-.04-1.928.94-3.427 2.18-4.755 1.89-2.057 4.76-2.057 7.15-.172 1.97 1.542 3.64 3.342 4.8 5.612 1.03 1.971 3.94 2.399 5.57.942.77-.685 1.41-.385 2.14 0 3.38 1.842 3.42 1.842 5.86-.985.35-.385.6-.899 1.2-.6.56.257.6.814.47 1.286-1.37 4.069.73 6.639 3.69 8.867 2.91 2.142 5.05 4.969 6.98 8.01.25.386.38.943 1.15 1.114zM1188.27 260.998c.17 10.623-2.44 19.748-7.88 27.887-2.91 4.327-6.29 8.439-10.27 11.823-2.83 2.399-5.44 5.141-8.78 6.94-.82.428-1.5.257-2.27.128-1.71-.3-3.3-.385-5.14.172-1.67.514-4.11-.343-5.31-2.228-1.33-2.099-3.6-1.371-5.4-1.885-.77-.214-1.37 1.285-1.84 2.142-.34.643-.6 1.328-1.54 1.157-.81-.172-1.37-.6-1.71-1.414-1.29-3.256-1.93-3.513-5.18-2.228-2.4.943-3.9-.599-5.18-2.013-1.29-1.414-2.7-1.97-4.5-1.928-1.29.043-2.57.086-3.85 0-1.93-.128-3.22.814-4.33 2.271-.73.942-1.63 1.67-2.27-.129-.26-.728-.9-1.071-1.5-1.499-.47-.386-.9-.857-.51-1.456 1.67-2.528-1.46-3.128-1.93-4.755-.08-.3-.64-.3-.94-.043-.43.385-.3.856.08 1.113 2.45 1.457 1.55 4.113 2.15 6.212.38 1.328-1.2 2.484-2.62 2.956-1.24.385-2.69-.214-2.69-1.414-.05-3.812-3.47-5.569-4.8-8.525-.81-1.884-1.67-3.769-2.31-5.697-.52-1.585.3-2.313 1.88-1.756 1.84.642 3.81.171 5.7.771.85.257 1.71 1.756 2.57.728.77-.9-.26-2.056-.77-2.913-2.27-3.812-2.83-8.182-4.29-12.209-.42-1.199-.98-1.799-2.48-1.713-2.01.128-2.91-1.457-3.08-3.17-.35-2.913-.3-5.826-.05-8.739.05-.685.26-1.542.73-1.97 2.96-2.913 3.17-7.968 6.64-9.981 4.5-2.656 5.91-7.668 9.85-10.667 2.7-2.056 5.48-3.812 8.52-5.183 1.54-.686 2.91-1.457 4.07-2.656 1.97-2.056 4.28-2.913 7.28-2.785 4.02.129 8.13-.385 12.07-1.413 4.2-1.114 8.22-.686 12.25.385 6.25 1.628 12.16 4.198 16.96 8.696 4.75 4.455 8.69 9.467 10.79 15.85 1.24 3.77 2.14 7.711 1.88 11.138zM1109.1 59.79c-1.59.815-2.79.9-3.43-.856-.09-.214-.43-.386-.69-.428-2.01-.215-2.82-.9-1.41-2.828.34-.471-.04-.9-.3-1.37-.86-1.328-1.2-2.485.52-3.599.89-.557 1.32-1.713 2.14-2.527.72-.729-.39-1.071-.95-.943-2.14.514-2.05-.814-2.52-2.313-1.2-4.155.25-8.268-.13-12.423-.17-1.756 1.58-3.555 1.58-5.783 0-1.07 1.46-2.313 3.13-1.07 1.28.942 2.06.256 2.7-.9 1.32-2.314 1.5-2.314 2.78 0 .13.257.26.556.6.514.47-.086.47-.471.39-.857-.05-.214-.18-.386-.22-.6-.43-1.285-1.58-2.613-.94-3.812 1.07-1.97 2.31-3.941 4.32-5.184.65-.385 1.33-.77 2.02-.3 2.57 1.843 5.22 1.585 7.92.386.68-.3 1.63-.3 1.97.386 1.2 2.356 4.37 2.784 5.31 5.44.26.685.81.643 1.41.3 1.46-.857 1.84-2.613.86-4.07-.99-1.5.08-2.27 1.15-2.527 2.66-.6 3.94-2.956 5.96-4.37.72-.514.81-1.456.9-2.313.21-1.542.17-3.17 1.02-4.54 1.72-2.828 3.34-3.042 5.44-.515 1.16 1.414 1.93.814 2.7-.214.73-.985 1.41-1.799 2.83-1.07 1.41.727 1.41 1.841 1.07 3.084-.65 2.27-1.03 4.583-1.97 6.768-.99 2.313.68 6.34 3.08 6.94 3.17.77 6.29 1.841 9.68 1.584 1.58-.128 2.48-.728 3.04-2.184.81-2.1 4.11-3.513 6.12-2.785 2.27.857 3.94 4.327 2.87 6.597-1.28 2.742-1.16 4.841.99 7.283 6.76 7.839 10.27 16.706 8.47 27.373-1.84 10.966-5.48 21.076-12.07 30.072-2.49 3.384-5.44 6.168-9.17 8.01-1.54.728-3.29 1.114-5.31.514-3.68-1.028-7.02-2.613-10.32-4.498-1.67-.985-3.98-.47-5.99-.985a60.774 60.774 0 01-18.76-8.61c-3.81-2.613-7.02-6.169-9.59-10.195-.81-1.286-1.58-1.971-3.04-.9-.73.514-1.58.3-2.44.128-2.31-.47-3.34-2.698-5.31-3.684-.94-.47-.21-2.827.51-4.198.35-.557 1.08-.814 1.08-1.927zM1006.03 522.263c-.09-.343-.3-.728-.22-1.028.86-3.084-1.24-3.256-3.34-3.598-1.07-.172-1.24.557-1.45 1.199-.6 1.714-1.417 2.099-3.001.9-2.142-1.585-4.582-2.399-7.366-2.271-2.227.129-4.282-.856-6.38-1.585-5.31-1.842-10.92-2.998-15.63-6.297-5.224-3.641-9.464-8.225-12.333-13.922-1.67-3.341-3.597-6.683-4.325-10.367-.685-3.512-1.841-6.982-1.755-10.623.042-1.757.856-3.299 1.841-4.712 3.597-5.227 7.108-10.496 10.962-15.55 4.026-5.226 8.907-9.425 14.945-12.466 11.476-5.697 22.482-4.07 33.482.985 4.5 2.056 8.27 5.184 11.05 9.21 3.04 4.37 4.76 9.425 5.36 14.736.59 5.355 0 10.624-.73 15.936-1.33 9.338-4.58 17.906-9.21 26.045-1.24 2.185-3.38 3.427-5.01 5.226-1.33 1.499-.68 1.542.69 1.842 1.37.3 2.74.771 4.06 1.328 1.84.814 1.8 1.414.52 3.042-.99 1.242-2.79.685-3.6 2.013-2.87-.043-5.69-.043-8.56-.043zM942.136 143.966c-.043-2.142.128-4.284.899-6.34.813-2.184 1.97-2.527 3.854-1.199.514.342 1.113.985 1.67.3.599-.771-.343-1.071-.728-1.5-3.126-3.298-1.199-7.282 1.327-9.253.857-.685 1.927-.342 2.869-.042 1.071.342 1.884.557 1.285-1.157-.899-2.699 0-4.841 2.612-6.169 3.297-1.67 6.081-3.898 8.222-6.939 1.028-1.414 2.483-1.971 3.939-1.328 3.341 1.456 6.21-.257 8.993-1.242 2.612-.9 5.438-1.842 7.622-3.77a.327.327 0 01.171-.086c5.31.129 5.696-4.241 6.252-7.625.643-3.727 1.927-5.654 5.91-5.697 1.37 0 2.698-.6 4.157-.214 2.44.642 3.25 1.927 2.57 4.369-.26.985-.43 1.37.98 1.157 4.41-.686 8.27 1.756 9.29 5.654.09.386.26.943.13 1.242-1.33 2.656.3 4.798 1.16 7.111.21.6.64.857 1.2 1.114 1.62.728 3.08 2.014 3.51 3.556.94 3.341 3.3 4.498 6.21 5.354 3.12.9 6.21 5.312 6.08 8.568-.05.685.34 1.199.47 1.842.81 3.47 2.01 6.94 1.15 10.624-.34 1.413-.72 2.912-.25 4.455.08.257.08.599 0 .856-2.87 6.169-3.47 13.109-6.64 19.234-3.68 7.111-8.86 12.852-15.07 17.778-3.56 2.784-7.71 4.626-11.18 7.496-.51.429-1.112.771-1.755.643-1.456-.343-2.612-.129-3.511 1.199-.343.514-.985.557-1.584.386-.686-.214-1.413-.386-1.97-.771-5.695-3.984-12.376-5.569-18.67-8.096-4.283-1.714-9.036-2.271-12.932-4.927-5.524-3.727-9.849-8.224-12.59-14.607-2.526-5.912-2.441-12.423-5.396-18.163-.513-1.071-.214-2.528-.256-3.813zM942.179 267.466c.471-7.839 3.169-14.993 7.023-21.761 2.184-3.812 4.154-7.754 6.98-11.181 6.08-7.368 13.232-12.637 23.123-13.365 8.864-.642 17.472.686 25.775 3.77 2.36.857 5.1.857 6.9 3.084.47.557 1.33.343 2.01.043 3.08-1.242 4.75-.728 6.08 2.313.82 1.799 1.89 2.442 3.77 2.399 2.48-.043 4.75 2.014 4.84 4.37.08 2.613.68 5.097 1.54 7.496 1.76 5.012 1.54 10.153.81 15.293-1.41 9.81-4.75 19.02-9.89 27.373-2.31 3.813-4.28 8.439-9.03 10.324-.17.086-.43.214-.52.385-1.15 3.47-4.24 2.699-6.81 3.085-.72.085-1.37-.043-1.67.899-.81 2.442-2.18 3.427-4.835 3.513-1.584.043-3.211-.514-4.71.643-.685.514-1.456-.215-1.97-.857-.728-.943-1.541-1.242-2.569-.6-.514.3-1.071.428-1.627.171-.9-.471-1.499-.085-2.013.6-.514.728-1.242 1.157-2.055 1.499-1.157.429-1.842.215-2.142-1.156-.642-3.256-.942-3.47-4.153-3.299-.942.043-1.67-.385-2.355-.856-3.084-2.228-6.295-4.156-10.106-4.884-.685-.128-1.285-.557-1.884-.942-2.57-1.671-5.053-3.427-7.665-5.055-3.341-2.056-5.653-5.183-8.351-7.925-.599-.6-1.284-1.328-1.413-2.099-.728-4.541-3.34-8.567-3.083-13.28zM989.369 334.164c2.184.086 4.153.557 6.166.471 1.242-.043 2.398-.085 3.212-1.285.556-.771 1.323-.985 2.013-.257 2.53 2.528 5.74 1.542 8.69 1.671 1.24.085 2.36-.172 3.26.942.81 1.028 2.05 1.2 3.25 1.414 2.61.428 4.71 1.028 5.87 4.069.85 2.271 3.04 4.07 4.66 6.04.39.472.9.343 1.33 0 1.2-.856 2.02-.171 2.74.686.86.985.39 1.842-.43 2.613-.25.257-.51.514-.68.814-.3.514-.56 1.156 0 1.542.56.386.86-.3 1.16-.643.85-.942 1.88-1.842 3.12-.985 1.24.857.99 2.228.56 3.513-.3.857-.82 1.628-1.59 1.97-1.67.814-1.84 1.971-1.58 3.642 1.37 8.91-.51 17.349-3.3 25.83-1.92 5.869-5.05 11.01-8.05 16.236-1.11 1.928-2.4 4.369-4.97 5.269-.12.043-.34.128-.34.214-.38 2.57-2.95 2.913-4.41 4.369-2.18 2.185-5.18 2.828-8.01 3.899-2.565.985-5.649.471-7.661 2.955-.685.814-1.585.472-2.313-.042-2.697-1.885-5.909-2.785-8.735-4.455-4.454-2.614-9.635-3.856-14.131-6.426-5.096-2.913-9.806-6.426-13.96-10.538-3.768-3.77-5.353-8.91-6.68-14.094-2.013-7.882 1.499-14.307 4.539-20.99 3.211-7.025 7.708-13.151 13.403-18.334 3.94-3.599 8.136-6.726 13.489-7.968 3.211-.685 6.252-1.971 9.378-2.142zM1034.33 44.584c-.73 9.252-3.25 17.906-8.05 25.916-3.04 5.055-6.59 9.424-11.73 12.509-1.33.77-2.44 1.97-3.47 3.127-2.01 2.185-4.8 3.041-7.2 4.583-.89.557-2.01.172-2.82-.428-3.727-2.784-8.052-4.24-12.42-5.654-4.796-1.543-9.549-3.342-14.474-4.627-2.183-.557-4.068-1.885-5.095-3.984-1.071-2.099-2.655-3.727-4.454-5.14-3.169-2.57-5.695-5.57-7.365-9.253-.557-1.285-1.799-2.185-2.056-3.684-.128-.771-1.027-.985-1.755-.814-.728.171-1.156.942-.942 1.5.599 1.584.171 2.912-.557 4.283-.343.6.171 1.242.3 1.842.085.514.214 1.028-.3 1.37-.557.343-.942-.085-1.327-.342-2.698-1.842-4.283-4.712-6.21-7.24-.813-1.028-.471-2.955 1.028-3.94.814-.514.728-.857.043-1.414-2.312-1.97-2.355-4.54-2.355-7.368 0-2.313.428-4.627.214-6.94-.086-.77-.086-1.456.771-1.756 2.312-.9 3.383-2.87 4.41-4.927.814-1.585 1.884-2.998 3.555-3.726.942-.429 1.156-.986.984-1.842-.342-1.671.429-2.828 1.585-3.941 2.055-2.014 4.239-3.813 7.023-4.755.813-.3 1.584-.643 1.884-1.585.685-2.014 2.226-3.127 4.025-4.155 3.083-1.8 5.096-1.157 7.965 1.67.899.9 1.67 1.328 2.912 1.328 1.712 0 3.211-1.028 5.01-.728.813.128 1.113-.857 1.07-1.756-.043-1.928.899-3.085 2.741-3.513 1.028-.214 1.713-.814 2.269-1.757 1.456-2.398 2.955-2.998 5.696-2.484.556.086 1.113.3 1.67.3 4.535-.043 7.195 2.27 8.225 6.597.21.985.98 1.328 1.84 1.542 2.44.557 4.92.9 7.28 1.67 10.96 3.428 16.91 11.267 19.14 22.233.43 2.27.98 4.712.94 7.283zm-81.831 1.113v.814c.257 2.185 1.199 4.412-.985 6.255-.343.3-.343 1.07-.386 1.627-.042.429.429.814.643.514.771-1.113 2.526-1.542 2.655-2.955.128-1.971.556-3.941.685-5.912.085-1.242-.642-2.57-1.756-2.57-1.541 0-.471 1.585-.856 2.227zM830.245 522.263c-.385-1.671-1.884-2.27-3.126-3.042-2.227-1.37-4.796-2.184-6.809-3.983-.299-.257-.727-.514-1.156-.3-.556.3-.428.856-.342 1.328.043.214.128.428.171.599.214.943.985 2.057-.043 2.742-1.113.728-2.569.343-3.426-.386-1.413-1.156-2.612-2.613-3.168-4.455-.214-.771-.172-1.113.728-.899.642.171 1.498 1.371 1.884.214.342-1.028.728-2.442-.343-3.427-1.113-1.028-2.269-2.013-3.511-2.784a39.794 39.794 0 01-7.879-6.555c-1.328-1.413-2.612-2.827-2.698-4.926-.043-.685-.257-1.542-.942-1.842-1.927-.942-2.441-2.656-2.869-4.498a4.117 4.117 0 00-1.842-2.527c-1.798-1.114-1.712-2.699-1.498-4.455.214-1.757.299-3.513.385-5.269.043-.514-.214-1.028-.685-1.243-1.67-.771-1.456-2.099-1.071-3.469 1.157-4.027 3.169-7.583 5.824-10.838 2.313-2.827 5.439-5.012 7.194-8.054 1.542-2.656 3.726-4.412 5.781-6.382 1.884-1.8 4.325-2.314 6.852-2.699 4.367-.686 8.821-.857 13.017-2.356 1.585-.557 3.126.085 4.668.214 5.524.428 11.091.557 16.443 2.442 3.255 1.156 6.295 2.698 9.293 4.369.599.343 1.241 1.028 1.927.771 3.982-1.328 4.881 2.87 7.408 4.113.428.214.599.856.471 1.37-.428 1.757.728 2.742 1.755 3.899.429-.6-.256-1.8.943-1.842 1.07-.043 1.927.771 1.927 1.67.042 4.284 1.67 8.354 1.199 12.723-.386 3.298.342 6.64-.086 10.024-1.199 9.253-2.869 18.249-7.794 26.431a63.527 63.527 0 01-5.995 8.267c-1.113 1.328-2.74 2.056-4.196 2.913-.985.6-2.013 1.114-2.655 2.099-8.607.043-17.172.043-25.736.043zM815.899 97.016c-1.113-4.155.643-6.125 4.754-5.568 1.284.171 2.526.3 3.811.342 2.141.086 3.468 1.285 3.597 3.47.214 3.127 1.841 5.441 3.811 7.668.257.3.728.643 1.07.643 3.64-.3 6.124 2.399 9.207 3.555 2.569.985 5.267 1.2 7.836 2.056.343.129.9 0 1.242-.214 2.141-1.499 3.726-.6 5.224 1.071.814.942 1.885 1.499 2.955 2.099 9.506 5.312 16.615 12.894 20.126 23.218 1.756 5.14 1.413 10.709.043 16.064-2.912 11.266-8.821 20.99-15.972 29.986-2.142 2.699-4.839 5.098-7.537 7.411-2.569 2.185-5.695 3.427-8.093 5.911-2.099 2.142-5.353 1.885-8.308 1.757-.471-.043-1.07-.471-1.413-.3-3.083 1.414-5.096-.685-7.023-2.313-2.355-2.014-5.181-2.87-7.836-4.156-3.597-1.67-7.322-3.169-10.919-4.926-2.869-1.413-4.882-3.898-6.723-6.425-.9-1.243-1.799-2.271-3.126-3.128-1.67-1.07-3.298-2.741-3.811-4.412-1.242-4.026-4.154-6.939-5.953-10.581-1.798-3.684-3.811-7.111-4.71-11.266-1.37-6.254-2.055-11.395-.557-17.52.728-3.042 1.199-6.212 3.255-8.91 1.284-1.714 2.697-2.785 4.753-3.299 2.398-.557 4.025-1.713 4.839-4.412.514-1.714 1.755-3.77 4.196-4.07.728-.085 1.114-.642 1.285-1.285.214-.814.599-1.756.428-2.484-1.156-4.584 1.156-7.583 4.454-10.196.77-.6 1.498-.77 2.398-.557.728.215 1.584.472 2.697.771zM870.197 344.359c-.128.643-.171 1.328.257 1.842 2.612 2.999 2.569 6.683 2.869 10.367.257 3.17 1.456 6.211 1.927 9.381.685 4.327.385 8.611-.086 12.937-.985 9.596-4.239 18.292-9.592 26.26-2.612 3.941-5.566 7.71-9.378 10.452-2.098 1.499-4.796 2.57-6.723 4.198-2.226 1.928-4.967 1.799-7.322 2.956-2.312 1.114-5.695 2.056-8.35-.471-.814-.772-1.97-.9-2.998-.429-2.954 1.285-5.481.557-7.579-1.628-1.542-1.627-3.512-2.656-5.31-3.855-6.038-4.027-12.375-7.582-18.328-11.737-4.924-3.47-7.536-8.568-7.879-14.694-.085-1.413-.128-2.827-.557-4.241-.342-1.113-.513-2.313-.128-3.384 1.071-2.913 1.756-6.125 1.584-8.953-.299-5.354 4.154-8.267 5.139-12.808.6-2.742 1.756-5.312 3.469-7.668 2.098-2.87 4.453-5.355 7.408-7.282 1.156-.729 1.798-1.585 2.012-3.042.3-2.613 3.169-4.283 6.081-3.512 1.456.385 1.884.085 2.055-1.328.172-1.5 1.328-2.142 2.655-1.543 3.255 1.414 5.824-.299 8.351-1.799 1.07-.642 1.884-.771 3.125-.471 3.041.728 6.21.428 9.293 1.157 4.325.985 8.607 1.927 12.632 3.855 1.071.514 1.841.3 2.741-.385 1.498-1.157 2.954-1.071 4.068.514.685.942 1.284.942 2.355.599 2.441-.814 6.38 2.356 6.209 4.712zM873.923 263.697c-.257 5.654-.129 11.737-1.756 17.649-.599 2.27-1.37 4.583-2.783 6.425-2.141 2.827-4.197 5.74-6.423 8.482-2.356 2.913-5.567 5.055-7.623 8.225-.942 1.456-2.912 1.67-4.367 2.57-.6.386-1.242.643-1.713 1.199-2.227 2.571-5.353 2.742-7.794.3-.642-.642-1.156-.985-2.012-.514-.172.086-.472.257-.6.172-2.398-1.628-5.353.042-7.794-1.328-1.113-.6-2.355-.472-3.554-.643-2.269-.343-4.41-1.199-6.423-2.27-3.683-1.885-7.665-3.384-10.877-5.912-3.896-3.041-7.451-6.554-9.206-11.566-1.071-3.127-2.441-6.126-4.411-8.953-2.055-2.956-2.698-6.554-2.74-10.195-.043-2.571-.172-5.012-1.157-7.497-.899-2.27-.042-4.926.043-7.368.043-.557.343-1.156.214-1.671-1.113-4.926.429-9.595 1.285-14.307.514-2.742 1.798-3.941 4.668-3.984 1.413 0 2.654-.343 3.083-2.013.428-1.714 1.927-2.614 3.083-3.727.728-.686 1.499-.257 2.184.085 1.755.857 3.211.6 4.239-1.113 1.242-2.014 3.511-1.243 5.224-1.885 3.383-1.242 3.554-.985 5.738 1.927.3.386.686.986 1.071.986 1.541 0 2.869-.086 3.597 1.756.3.685 1.199-.171 1.242-.771.085-1.971 1.199-2.784 3.04-2.87 1.499-.086 3.04-.3 4.111 1.156.257.343.557.772 1.028.6.685-.257.342-.814.299-1.285-.171-1.028-.042-1.928 1.028-2.27 1.37-.429 1.456.856 1.756 1.628.642 1.585 1.713 2.356 3.468 2.27 1.585-.086 3.126.043 4.668.3 1.199.214 2.398.128 3.383-.814.942-.9 1.841-.857 2.227.514.342 1.157 1.37 1.414 2.269 1.713 9.292 3.128 13.96 10.324 16.615 19.192 1.456 5.14 1.67 10.281 1.67 15.807zM788.751 53.065c.171-4.37 1.413-8.396 2.74-12.422.172-.557.728-1.029 1.157-1.5.685-.77 1.327-1.585 1.413-2.613.428-4.54 3.126-7.882 5.952-11.052 1.67-1.885 1.627-4.027 1.67-6.211 0-.771-.171-1.543.257-2.27.342-.6.899-.943 1.584-.857.643.085.985.514 1.199 1.07.086.215.086.429.172.643.342 1.2.428 2.784 2.269 2.442 2.484-.471 3.511-1.97 3.083-4.07-.342-1.756-.299-3.555-.128-5.312.214-2.398 2.441-4.626 4.839-5.097 1.969-.386 3.939-.643 5.866-1.071 2.098-.471 3.597 1.07 4.668 2.484 1.584 2.142 3.897 2.57 6.166 3.213.471.129 1.199.043 1.413.343 1.627 2.185 4.025 1.2 6.124 1.628.556.128 1.241.085 1.627-.3 2.74-2.785 5.609-1.328 8.007.128 2.013 1.2 4.026 2.057 6.21 2.613 7.322 1.843 12.504 6.297 15.758 13.066 1.841 3.812 3.468 7.753 5.224 11.652.471 1.113.557 2.184 0 3.298-.599 1.285-.428 2.656-.385 4.027.3 14.779-6.295 26.173-16.958 35.855-2.911 2.613-6.337 4.283-9.335 6.682-2.012 1.585-4.667 2.356-7.065 3.427-1.156.514-2.056-.214-2.869-.985-1.371-1.328-2.698-2.784-4.111-4.07-1.285-1.199-2.569-2.484-4.582-2.441-.428 0-.985-.257-1.327-.557-3.769-3.213-8.222-5.312-12.547-7.497-3.512-1.756-6.894-3.684-10.32-5.569-5.995-3.298-9.763-8.353-12.418-14.479-.172-.428-.043-1.156-.686-1.199-.556-.043-.728.6-.984.985-.343.643-.686 1.371-1.542 1.242-1.071-.17-.514-1.156-.728-1.756a96.5 96.5 0 00-1.413-3.47z" fill="#3858E9"/>
+<svg width="377" height="390" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <g clip-path="url(#a)">
+    <path d="m146.085 114.732 45.041 285.26M139.593 266.898l36.925 134.311M119.304 176.41l64.113 221.147M98.204 293.273l73.851 104.69M220.748 128.123 195.59 397.557M209.386 312.344l-5.275 85.619m15.825-258.479-10.55 258.479M290.541 232.407l-68.982 164.745" stroke="#000" stroke-width="2" stroke-linecap="round"/>
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M27.823 138.143c-11.294-25.563 1.612-55.05 27.485-66.482 25.873-11.43 56.368-1.126 67.675 24.428 3.778 8.545 4.066 17.83 2.808 26.402a98.184 98.184 0 0 1-7.252 24.272 154.846 154.846 0 0 1-9.392 18.177c-1.376 2.284-2.534 4.1-3.403 5.338a71.903 71.903 0 0 1-1 1.488l-.284.416-.073.051-.034.023-.053.037-1.46 2.007 5.124 6.815c-4.191 3.227-7.925 2.822-7.925 2.822l-.687-7.998-2.647-.322-.149-.015-.495-.071a90.78 90.78 0 0 1-1.772-.258 152.71 152.71 0 0 1-6.248-1.117 155.216 155.216 0 0 1-19.758-5.302 97.912 97.912 0 0 1-22.836-10.855c-7.178-4.85-13.812-11.305-17.624-19.856Z" fill="#fff"/>
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M23.353 252.649c-11.294-25.563 1.612-55.051 27.485-66.482 25.873-11.43 56.368-1.125 67.675 24.429 3.778 8.544 4.066 17.83 2.808 26.401a98.184 98.184 0 0 1-7.252 24.272 154.846 154.846 0 0 1-9.392 18.177c-1.376 2.284-2.534 4.1-3.403 5.338a75.413 75.413 0 0 1-1 1.489l-.284.415-.073.051-.034.023-.053.037-1.46 2.007 5.124 6.815c-4.19 3.227-7.925 2.822-7.925 2.822l-.687-7.998-2.647-.322-.149-.015-.494-.071a90.668 90.668 0 0 1-1.773-.258c-1.509-.235-3.653-.6-6.248-1.116a155.386 155.386 0 0 1-19.758-5.303 97.91 97.91 0 0 1-22.836-10.855c-7.178-4.85-13.812-11.305-17.624-19.856Z" fill="#fff"/>
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M186.711 196.688c-1.957-27.878-27.144-47.921-55.36-45.94-28.217 1.98-50.365 25.338-48.424 53.214.652 9.32 4.735 17.664 9.852 24.656a98.177 98.177 0 0 0 17.751 18.072 154.655 154.655 0 0 0 16.796 11.683c2.283 1.377 4.156 2.442 5.502 3.131.674.369 1.203.655 1.58.848l.445.235.089.011.04.005.064.008 2.229 1.092-1.347 8.42c5.213.895 8.325-1.208 8.325-1.208l-3.129-7.392 2.191-1.522.124-.082.404-.294c.341-.244.835-.6 1.447-1.057a152.656 152.656 0 0 0 5.002-3.906 155.292 155.292 0 0 0 14.993-13.919 97.931 97.931 0 0 0 15.119-20.265c4.081-7.642 6.931-16.449 6.307-25.79ZM231.87 21.947c-28.417.309-51.77 22.753-51.46 50.954.203 18.515 13.736 34.495 24.998 44.874a155.567 155.567 0 0 0 16.065 12.862 137.743 137.743 0 0 0 5.311 3.552c.643.412 1.165.735 1.53.953.176.118.32.202.425.261l.068.043.056.029 2.477 1.463-1.386 7.717c5.216.994 8.348-1.053 8.348-1.053l-2.853-7.11 1.796-1.112.063-.014.071-.016.064-.015.421-.27 1.508-.989c1.279-.854 3.08-2.093 5.227-3.676a157.426 157.426 0 0 0 15.776-13.221c11.031-10.618 24.211-26.897 24.008-45.413-.262-28.21-24.096-50.127-52.513-49.819Zm1.17 106.562.079-.018-.087.02.008-.002Z" fill="#fff"/>
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M128.239 3.048c28.026-4.708 54.972 13.265 59.642 41.078 3.066 18.26-7.436 36.377-16.691 48.58a155.555 155.555 0 0 1-13.545 15.494 137.363 137.363 0 0 1-4.601 4.433c-.559.519-1.016.929-1.337 1.207-.153.148-.28.256-.373.333l-.059.054-.051.039-2.179 1.876 2.725 7.352c-4.959 1.898-8.403.436-8.403.436l1.554-7.501-1.963-.779-.065-.002-.073-.004-.065-.003-.463-.191-1.658-.708a137.861 137.861 0 0 1-5.793-2.696 157.264 157.264 0 0 1-17.861-10.231c-12.731-8.506-28.576-22.205-31.642-40.466-4.719-27.815 14.875-53.592 42.901-58.3Zm17.646 105.097-.081-.003.089.004-.008-.001ZM231.523 195.316c-27.879-5.511-55.33 11.682-60.795 39.349-3.588 18.166 6.39 36.577 15.291 49.039a155.665 155.665 0 0 0 13.094 15.877 137.919 137.919 0 0 0 4.473 4.563c.544.535.989.958 1.302 1.245.149.152.272.264.363.343l.057.056.05.04 2.125 1.938-2.935 7.271c4.902 2.04 8.387.677 8.387.677l-1.339-7.543 1.985-.722.065-.001.073-.001.065-.001.468-.178 1.678-.66a138.844 138.844 0 0 0 5.868-2.529 157.137 157.137 0 0 0 18.147-9.714c12.97-8.138 29.202-21.376 32.79-39.542 5.514-27.668-13.332-53.997-41.212-59.507Zm-20.652 104.547.081-.001-.089.001h.008ZM267.86 149.945c10.388-25.945 40.498-37.324 66.757-26.81 26.259 10.515 40.202 39.527 29.829 65.474-3.47 8.674-9.91 15.37-16.919 20.461a98.187 98.187 0 0 1-22.428 11.778 154.947 154.947 0 0 1-19.564 5.988c-2.595.612-4.703 1.053-6.196 1.297-.754.146-1.346.256-1.764.325l-.495.087-.088-.016-.04-.008-.064-.012-2.455.358-1.293 8.428c-5.237-.742-7.557-3.695-7.557-3.695l5.24-6.082-1.62-2.118-.094-.117-.295-.403c-.249-.337-.61-.827-1.054-1.448a154.775 154.775 0 0 1-3.568-5.249 155.185 155.185 0 0 1-10.017-17.837 97.898 97.898 0 0 1-8.198-23.918c-1.548-8.524-1.569-17.781 1.883-26.483Z" fill="#fff"/>
+    <path fill-rule="evenodd" clip-rule="evenodd" d="M206.717 99.424c28.399-1.048 52.797 20.257 53.832 48.44.68 18.504-12.075 35.112-22.829 46.015a155.621 155.621 0 0 1-15.434 13.615 139.119 139.119 0 0 1-5.135 3.801 54.56 54.56 0 0 1-1.483 1.024c-.17.127-.31.217-.412.282l-.066.046-.055.032-2.404 1.579 1.753 7.642c-5.163 1.242-8.39-.653-8.39-.653l2.511-7.238-1.846-1.026-.064-.011-.072-.013-.064-.011-.434-.249-1.553-.917a136.962 136.962 0 0 1-5.396-3.422 157.361 157.361 0 0 1-16.389-12.453c-11.525-10.081-25.467-25.712-26.147-44.217-1.084-28.191 21.677-51.219 50.077-52.266Zm3.914 106.495-.08-.014.088.016-.008-.002Z" fill="#fff"/>
+  </g>
+  <defs>
+    <clipPath id="a">
+      <path fill="#fff" d="M0 0h377v390H0z"/>
+    </clipPath>
+  </defs>
 </svg>
diff --git a/src/wp-admin/images/about-header-freedoms.svg b/src/wp-admin/images/about-header-freedoms.svg
index bf309005e7..2b1f539437 100644
--- a/src/wp-admin/images/about-header-freedoms.svg
+++ b/src/wp-admin/images/about-header-freedoms.svg
@@ -1,3 +1,18 @@
-<svg width="1174" height="494" fill="none" xmlns="http://www.w3.org/2000/svg">
-  <path d="M1134.66 418.731c-5.4 6.566-9.03 13.6-14.65 18.992-1.76 1.759-.82 3.517-.24 5.393.82 2.579-.23 4.103-2.93 2.931-2.46-1.055-3.98-.117-5.74 1.407-12.66 11.606-26.72 21.219-41.6 29.777-3.28 1.876-6.56 4.689-9.38 7.503-12.18 12.309-35.27 9.73-45.23.351-6.68-6.33-13.71-12.192-21.565-16.998-8.321-5.041-16.524-10.317-24.142-16.53-4.336-3.517-7.148-7.62-9.14-12.661-2.579-6.566-5.86-12.779-10.43-18.172-5.391-6.33-7.383-14.537-11.133-21.805-2.11-4.22-4.102-8.441-6.094-12.661-4.571-9.496-3.516-19.344-1.992-29.191.234-1.173.703-2.228 1.054-3.4 1.641-5.158 1.758-8.206-5.273-9.965-11.836-2.931-17.93-17.585-13.008-28.839 3.75-8.675 7.265-17.82 14.883-24.267.937-.704 1.641-2.111 2.578-2.228 12.657-2.579 15.586-14.771 22.735-22.86 1.992-2.228 3.867-4.572 6.797-5.276 5.625-1.289 8.438-5.275 9.844-10.434 1.289-4.923 5.156-7.62 8.672-10.785.703-.586 1.875-1.407 2.578-1.172 6.445 2.11 11.485-2.111 17.227-3.635 4.219-1.172 5.739.704 6.089 4.573.36 3.517 1.65 6.682 5.63 7.268 4.1.703 6.21-1.993 8.09-5.393 1.4-2.579 1.29-7.268 4.92-7.268 3.87.117 2.93 4.806 4.22 7.386.7 1.524 1.17 4.103 3.28 3.399 3.51-1.289 7.97-.938 9.72-5.392 2.11-5.51 5.16-10.434 9.85-14.303 4.22-3.517 8.55-7.62 14.53-5.627 6.68 2.227 11.48 6.682 12.77 13.951.12.938.47 1.875.59 2.813.47 2.931 1.05 6.096 4.34 7.034 2.93.821 3.63-2.462 5.15-4.103 3.05-3.517 6.45-4.924 10.9-2.814 3.4 1.642 6.8 1.056 10.31.235 5.39-1.055 9.5.469 13.71 4.22 8.68 7.738 16.88 16.296 27.43 21.923 3.63 1.876 5.27 4.924 5.74 8.91.82 7.151 2.93 14.068 1.87 21.453-.35 2.697-.46 7.034 5.04 4.572 2.46-1.055 3.99 1.056 5.04 3.049 2.82 5.158 5.51 10.668 5.39 16.529-.11 14.655 1.41 29.309-1.64 43.846-.35 1.524-.58 3.165-.23 4.689 2.93 11.137-1.52 20.516-6.56 29.894-2.46 4.455-4.93 8.91-6.57 13.717-1.64 5.041-4.57 8.909-8.08 12.661-6.92 8.089-11.37 7.503-15.35-2.697zM896.098 138.225c.118 5.862-.351 11.724-2.461 17.351-2.226 5.979-5.39 6.917-10.547 3.283-1.406-.938-3.047-2.697-4.57-.821-1.641 2.11.937 2.931 1.992 4.103 8.555 9.027 3.281 19.93-3.633 25.322-2.344 1.876-5.273.938-7.851.118-2.93-.938-5.157-1.524-3.516 3.165 2.461 7.386 0 13.247-7.149 16.882-9.023 4.572-16.641 10.668-22.5 18.991-2.813 3.869-6.797 5.393-10.782 3.634-9.141-3.985-16.992.704-24.61 3.4-7.148 2.462-14.883 5.041-20.859 10.317-.118.117-.352.234-.469.234-14.532-.351-15.586 11.606-17.11 20.868-1.758 10.199-5.273 15.475-16.172 15.592-3.75 0-7.383 1.641-11.368.586-6.679-1.759-8.906-5.276-7.031-11.958.703-2.696 1.172-3.751-2.695-3.165-12.071 1.876-22.618-4.807-25.431-15.475-.234-1.055-.703-2.579-.351-3.4 3.633-7.268-.82-13.13-3.164-19.46-.586-1.642-1.758-2.345-3.282-3.048-4.453-1.993-8.437-5.51-9.609-9.731-2.578-9.144-9.024-12.309-16.993-14.654-8.555-2.462-16.992-14.537-16.641-23.447.118-1.875-.937-3.282-1.289-5.041-2.226-9.495-5.508-18.991-3.164-29.073.938-3.869 1.992-7.972.703-12.193-.234-.703-.234-1.641 0-2.344 7.852-16.882 9.493-35.874 18.165-52.638 10.078-19.46 24.258-35.17 41.251-48.652 9.726-7.62 21.094-12.66 30.586-20.516 1.406-1.172 3.047-2.11 4.805-1.758 3.984.938 7.149.352 9.61-3.283C750.9.008 752.658-.11 754.299.36c1.875.586 3.867 1.055 5.39 2.11 15.587 10.903 33.868 15.24 51.095 22.158 11.719 4.689 24.727 6.213 35.391 13.481 15.118 10.2 26.954 22.51 34.454 39.977 6.915 16.178 6.68 33.998 14.766 49.707 1.407 2.931.586 6.916.703 10.433zM288.336 369.89c-.469-29.074 6.68-54.045 21.563-76.319 7.969-11.841 17.227-23.095 28.126-32.356 7.734-6.566 14.883-14.068 24.024-18.992 2.226-1.173 4.101-.704 6.211-.352 4.687.821 9.023 1.055 14.063-.469 4.57-1.407 11.25.938 14.531 6.096 3.633 5.745 9.844 3.752 14.766 5.158 2.109.587 3.75-3.517 5.039-5.861.938-1.759 1.641-3.634 4.219-3.165 2.227.468 3.75 1.641 4.688 3.868 3.515 8.91 5.273 9.613 14.18 6.096 6.562-2.579 10.664 1.642 14.18 5.51 3.515 3.869 7.383 5.393 12.305 5.276 3.515-.117 7.031-.235 10.547 0 5.273.352 8.789-2.228 11.836-6.214 1.992-2.579 4.453-4.572 6.211.352.703 1.993 2.461 2.931 4.102 4.103 1.289 1.055 2.461 2.345 1.406 3.986-4.571 6.917 3.984 8.558 5.273 13.013.235.821 1.758.821 2.579.117 1.171-1.055.82-2.344-.235-3.048-6.68-3.986-4.219-11.254-5.859-16.999-1.055-3.634 3.281-6.799 7.148-8.089 3.399-1.055 7.383.587 7.383 3.869.117 10.434 9.493 15.24 13.126 23.329 2.226 5.159 4.57 10.317 6.328 15.592 1.406 4.338-.821 6.331-5.157 4.807-5.039-1.758-10.429-.469-15.586-2.11-2.344-.704-4.687-4.807-7.031-1.993-2.11 2.462.703 5.627 2.109 7.972 6.211 10.434 7.735 22.391 11.719 33.411 1.172 3.283 2.696 4.924 6.797 4.69 5.508-.352 7.969 3.985 8.438 8.675.937 7.972.82 15.943.117 23.915-.117 1.876-.703 4.221-1.992 5.393-8.086 7.972-8.672 21.805-18.165 27.315-12.305 7.269-16.172 20.985-26.953 29.191-7.383 5.628-15.001 10.434-23.321 14.186-4.219 1.875-7.969 3.986-11.133 7.268-5.391 5.627-11.719 7.972-19.922 7.62-11.016-.351-22.267 1.055-33.048 3.869-11.485 3.048-22.5 1.876-33.516-1.055-17.11-4.455-33.282-11.489-46.408-23.798-13.008-12.193-23.789-25.909-29.531-43.377-3.399-10.316-5.86-21.102-5.157-30.48zM47.232 199.243c-1.64 3.517-.586 6.799-.82 10.082-.234 3.282-.586 6.448-4.57 7.151-3.633.586-5.743-1.758-7.266-4.806-.586-1.173-.938-2.58-1.172-3.869-.703-4.221-2.578-5.393-7.031-3.752-5.86 2.228-13.36-1.172-16.524-6.565-.703-1.641-1.758-3.048-2.93-4.337-8.203-9.613-7.735-16.53.352-25.909 3.398-3.986 5.039-9.496 5.039-15.006-.117-7.034.82-13.364 6.21-18.757 4.454-4.455 3.4-11.02 4.22-16.764 1.523-10.317 3.867-12.896 14.18-14.186 4.101-.468 5.273-3.751 5.742-7.034.469-3.4.938-6.916.703-10.433-.469-5.745 3.633-8.558 9.14-6.8 1.056.352 2.227.82 3.282 1.172 7.735 1.993 7.735 1.173 8.203-6.565.352-6.8 2.579-13.13-1.64-19.695-1.172-1.876 1.172-5.861 4.453-5.51 3.75.47 7.383-1.29 11.016.118 2.93 1.172 3.516-.235 2.93-2.814-.47-1.993-.47-3.869.937-5.627 1.055-1.407 2.227-2.814 4.336-2.462 1.875.352 2.227 1.876 2.578 3.517.118.82.235 1.524.47 2.344.468 1.642.35 3.87 2.343 4.455 2.11.587 2.813-1.64 3.984-2.813 5.157-4.924 7.032-11.49 8.555-18.054.821-3.4 2.578-4.455 5.274-3.634 4.101 1.172 7.5-.118 10.313-2.58 5.39-4.689 12.187-6.682 18.047-10.55C142.273 6.51 148.25 5.222 152.938 1c3.281-2.813 6.914 1.759 9.375 3.87 3.047 2.578 5.039 5.04 9.492 2.696 1.992-1.056 4.922 0 3.164 3.048-1.64 2.93 0 3.868 1.875 5.04 2.579 1.642 5.274 2.697 8.087.235 2.226-1.993 4.101-6.448 7.265-4.455 4.219 2.697 10.665 4.572 11.251 10.2 1.289 12.426 11.367 15.123 19.805 19.93 11.367 6.447 19.805 15.474 22.031 28.604 1.055 6.096 5.391 10.2 6.797 16.061 1.407 5.862 2.696 11.723 2.579 17.702 0 1.407.351 2.579.937 3.869 7.852 16.53 9.258 33.646 3.633 51.114-4.219 13.247-9.141 26.143-17.461 37.397-2.461 3.283-2.813 7.268-2.461 11.254.468 5.979-1.758 10.317-7.383 12.662-2.578 1.055-4.454 2.93-6.211 5.158-2.93 3.634-6.329 6.565-11.133 8.206-4.805 1.641-8.087 5.979-11.837 9.262-5.39 4.806-9.375 4.22-11.953-2.58-1.406-3.634-3.281-3.751-6.328-2.813-7.5 2.579-13.829 8.089-22.032 9.261-2.461.352-2.461 3.283-2.461 5.393.117 5.275-2.578 9.379-5.977 13.013-5.156 5.627-13.008 5.627-19.57.469-5.391-4.221-9.961-9.144-13.126-15.358-2.812-5.392-10.781-6.565-15.234-2.579-2.11 1.876-3.868 1.055-5.86 0-9.258-5.041-9.375-5.041-16.055 2.696-.937 1.056-1.64 2.462-3.281 1.642-1.524-.704-1.64-2.228-1.29-3.517 3.75-11.137-1.991-18.171-10.077-24.268-7.97-5.861-13.829-13.599-19.102-21.922-.704-1.055-1.055-2.579-3.165-3.048zM583.708 326.812c-.199.594 0 1.385-.398 1.978-3.386 4.946 1.991 15.825-3.187 15.034-8.365-1.187-18.92.791-25.294-8.308-4.979-6.923-5.775-13.846-1.394-20.967 2.788-4.748 3.983-11.869 12.547-9.099 10.357 3.362 18.124 12.659 17.726 21.362zM1090.89 218.29c-3.41.328-4.18-1.637-4.18-4.038 0-2.947 4.95-10.151 6.92-9.714 3.41.764 5.06 3.602 5.5 6.658.66 3.711-3.63 6.985-8.24 7.094zM149.661 281.074c.043-.128 0-.298.086-.426.727-1.063-.429-3.402.685-3.232 1.798.255 4.068-.17 5.438 1.786 1.071 1.489 1.242 2.977.3 4.508-.6 1.021-.857 2.552-2.698 1.957-2.227-.723-3.897-2.722-3.811-4.593z" fill="#3858E9"/>
+<svg viewBox="0 0 464 363" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <path d="M78.913 192.621c-.04-5.218-11.878-13.339-11.788-11.996.091 1.343-.955 91.866 11.876 132.297 0 0 2.504 5.168-1.301 11.789" stroke="#1E1E1E" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+  <path d="m66.025 169.397-2.246 4.468 2.651 1.332 2.44-1.688-2.846-4.112Zm0 0c2.845 4.112 2.846 4.111 2.848 4.11l.003-.003.01-.007.035-.024.121-.085c.103-.073.252-.177.442-.313.38-.273.927-.67 1.617-1.183a166.555 166.555 0 0 0 5.664-4.421c4.653-3.79 10.85-9.22 16.993-15.763 6.126-6.526 12.309-14.278 16.824-22.723 4.508-8.431 7.509-17.846 6.829-27.564-2.078-29.724-29.002-51.417-59.586-49.278C27.241 54.282 3.6 79.51 5.677 109.235c.68 9.718 4.962 18.622 10.6 26.344 5.646 7.735 12.848 14.551 19.822 20.161 6.993 5.625 13.887 10.139 19.021 13.244a165.576 165.576 0 0 0 6.225 3.59 103.129 103.129 0 0 0 2.247 1.195l.131.067.038.019.011.006.004.002c.002.001.003.002 2.248-4.466Z" fill="#fff" stroke="#fff" stroke-width="10"/>
+  <path d="m65.879 177.285-5.663 13.965s3.649 2.391 9.688 1.26l-2.642-15.065-1.383-.16Z" fill="#fff"/>
+  <rect x="62.953" y="178.598" width="6.106" height="1.97" rx=".985" transform="rotate(3.18 62.953 178.598)" fill="#1E1E1E"/>
+  <path d="M186.961 242.688s-.127-1.806-1.751-4.234c0 0-3.577-6.178 2.952-7.191 0 0 5.908-.507 7.694-2.372.492 16.768.952 56.344-1.149 80.507-.986 15.32-2.136 49.902 1.149 65.66" stroke="#1E1E1E" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+  <path d="m194.464 217.687 3.154 3.881-2.341 1.902-2.774-1.184 1.961-4.599Zm0 0a816.555 816.555 0 0 1-1.964 4.598l-.004-.002-.012-.005-.039-.016-.136-.059a112.689 112.689 0 0 1-2.328-1.058 164.825 164.825 0 0 1-6.469-3.213c-5.347-2.796-12.55-6.899-19.93-12.121-14.417-10.199-30.946-25.657-33.662-44.98-4.198-29.869 17.489-57.102 47.927-61.38 30.439-4.277 58.792 15.922 62.99 45.792 2.715 19.323-8.913 38.738-19.96 52.515-5.655 7.054-11.447 12.984-15.817 17.146a165.602 165.602 0 0 1-5.333 4.871 111.123 111.123 0 0 1-1.997 1.701l-.063.052-.033.027-.01.008-.004.003c-.001.001-.002.002-3.156-3.879Z" fill="#fff" stroke="#fff" stroke-width="10"/>
+  <path d="m194.905 224.66-3.449 14.669s3.972 1.802 9.766-.244l-4.926-14.48-1.391.055Z" fill="#fff"/>
+  <rect width="5.103" height="1.97" rx=".985" transform="scale(-1 1) rotate(2.085 -6324.149 -5336.641)" fill="#1E1E1E"/>
+  <path d="M272.674 146.172c-.395-5.204 10.723-14.284 10.745-12.938.022 1.345 8.621 91.465-.79 132.827 0 0-2.064 5.358 2.28 11.638" stroke="#1E1E1E" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+  <path d="m284.568 122.79 2.611 4.265-2.531 1.549-2.572-1.479 2.492-4.335Zm0 0c-2.492 4.335-2.493 4.334-2.495 4.333l-.004-.002-.011-.006-.036-.021-.128-.075a106.955 106.955 0 0 1-2.176-1.319 165.633 165.633 0 0 1-6.014-3.933c-4.952-3.388-11.582-8.281-18.249-14.289-6.649-5.992-13.458-13.2-18.662-21.24-5.197-8.025-8.973-17.156-9.107-26.897-.41-29.793 24.609-53.658 55.265-54.08 30.656-.422 56.321 22.745 56.731 52.539.135 9.74-3.389 18.972-8.362 27.138-4.982 8.179-11.589 15.572-18.071 21.745-6.499 6.189-12.991 11.263-17.849 14.786a167.49 167.49 0 0 1-5.903 4.096c-.718.474-1.287.84-1.681 1.091l-.458.288a9.846 9.846 0 0 0-.126.078l-.036.022-.011.007-.003.002c-.002.001-.003.002-2.614-4.263Z" fill="#fff" stroke="#fff" stroke-width="10"/>
+  <path d="m284.383 130.802 6.808 13.443s-3.436 2.688-9.549 2.064l1.376-15.233 1.365-.274Z" fill="#fff"/>
+  <rect width="6.106" height="1.97" rx=".985" transform="scale(-1 1) rotate(7.968 -1090.36 -1997.313)" fill="#1E1E1E"/>
+  <path d="M415.822 213.413c-.66 0-16.451 4.903-15.663-1.87 0 0 .126-1.807 1.751-4.235 0 0 3.577-6.177-2.952-7.19 0 0-5.909-.508-7.694-2.372-.493 16.767-.952 56.343 1.149 80.506.985 15.321 2.135 49.902-1.149 65.66" stroke="#1E1E1E" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+  <path d="m393.572 188.375-3.154 3.88 2.341 1.903 2.775-1.184-1.962-4.599Zm0 0c1.962 4.599 1.963 4.599 1.965 4.598l.004-.002.012-.005.039-.017.136-.059a113.778 113.778 0 0 0 2.328-1.058 164.53 164.53 0 0 0 6.469-3.212c5.347-2.796 12.549-6.9 19.93-12.121 14.416-10.2 30.946-25.657 33.661-44.98 4.198-29.87-17.489-57.102-47.927-61.38-30.439-4.278-58.791 15.922-62.989 45.792-2.716 19.323 8.912 38.737 19.959 52.515 5.656 7.054 11.448 12.984 15.817 17.146a166.688 166.688 0 0 0 5.333 4.871 117.548 117.548 0 0 0 1.997 1.7l.064.053.032.026.011.008.003.003c.001.001.002.002 3.156-3.878Z" fill="#fff" stroke="#fff" stroke-width="10"/>
+  <path d="m393.123 195.432 3.45 14.669s-3.973 1.802-9.767-.244l4.927-14.48 1.39.055Z" fill="#fff"/>
+  <rect x="388.766" y="197.329" width="6.234" height="1.97" rx=".985" transform="rotate(2.085 388.766 197.329)" fill="#1E1E1E"/>
 </svg>
diff --git a/src/wp-admin/images/about-header-privacy.svg b/src/wp-admin/images/about-header-privacy.svg
index 5bf69b2cea..2d7166b84c 100644
--- a/src/wp-admin/images/about-header-privacy.svg
+++ b/src/wp-admin/images/about-header-privacy.svg
@@ -1,16 +1,12 @@
-<svg width="1280" height="568" fill="none" xmlns="http://www.w3.org/2000/svg">
-  <g clip-path="url(#clip0)">
-    <g clip-path="url(#clip1)" fill="#3858E9">
-      <path d="M1198.19 326.128c4.48 34.433-6.49 68.552-10.69 103.364a66.133 66.133 0 01-11.19 27.433 51.192 51.192 0 00-9.46 24.438c0 2.113-.55 4.189-1.6 6.022-20.49 25.889-33.01 59.345-62.36 76.53-15.25 8.924-24.68 25.226-44.13 29.798-8.95 2.145-20.43 10.438-29.47 17.343a104.507 104.507 0 01-30.329 15.767c-14.185 4.887-28.906 7.725-42.02 16.46-13.114 8.734-27.994 9.46-43.944 7.631-19.198-2.208-38.806-1.356-58.224-1.23-38.742.315-73.071-14.253-105.257-33.299-23.327-13.779-44.353-31.532-66.514-47.299a57.609 57.609 0 01-21.846-29.892c-2.396-7.474-6.872-8.167-12.609-8.798-6.904-.725-8.922 3.153-12.295 8.861-15.762 26.929-29.127 57.168-55.166 75.268a183.653 183.653 0 01-78.272 31.848c-32.879 4.761-65.127 13.559-98.479 15.262-15.226.788-30.484 2.428-45.395-1.798a52.236 52.236 0 00-20.206-1.545c-27.488 3.154-52.329-5.612-74.395-20.37-30.862-20.622-62.669-40.519-89.149-66.565-23.264-22.924-38.364-51.966-50.437-82.489C91.338 405.464 89.32 316.731 80.62 229.26c-2.932-29.326 4.287-58.21 15.762-85.895 11.474-27.686 22.066-56.38 31.523-85.138 11.727-35.222 34.96-61.552 62.574-84.508a225.646 225.646 0 01112.76-51.587c36.315-5.234 71.873-15.766 108.724-16.618a177.46 177.46 0 0172.283 12.613c14.911 6.086 31.524 8.073 47.034 12.613 28.371 8.199 56.962 18.132 76.601 40.677 14.312 16.429 31.524 30.02 44.669 47.3 5.832 7.599 13.24 8.576 20.711 3.153 45.456-33.204 98.605-48.687 150.587-67.543 42.179-15.294 84.231-20.654 128.207-14.158 23.989 3.563 47.694 9.05 68.405 21.82 54.35 33.52 100.59 74.543 122.19 137.514 10.9 31.753 27.51 61.457 35.84 94.125 10.87 42.979 24.55 85.768 19.7 132.5zm-958.314-71.39c1.135 10.942 1.608 22.073 3.5 32.825 8.164 46.479 13.555 93.526 26.732 138.965 5.327 18.415 11.348 37.46 24.871 51.965 17.307 18.542 40.666 29.01 61.251 43.263a18.91 18.91 0 0013.208 4.131c37.513-4.099 75.467-5.581 111.751-17.248 9.74-3.154 20.679-5.203 27.331-14.505 19.135-26.614 41.673-51.272 48.356-85.139 4.445-22.514 17.937-42.505 17.528-66.502-.789-44.398-7.282-88.985 5.737-132.941 5.391-18.195-4.602-35.096-9.457-51.871-8.795-30.492-27.772-54.394-53.59-73.345-19.828-14.631-43.786-17.88-66.199-23.02a125.241 125.241 0 00-68.091 4.7c-22.728 7.567-42.998 24.248-68.941 21.694a4.452 4.452 0 00-3.5 2.396c-2.932 9.46-12.199 11.068-18.914 15.766-20.459 14.411-25.219 37.114-30.2 58.903-3.341 14.726-2.427 30.303-16.518 40.488-2.963 2.145-6.462 6.055-4.792 9.271 7.125 13.559-2.9 26.897-.031 40.204h-.032zm485.461 43.925c-1.733 52.407 8.04 99.517 35.276 145.05 23.39 39.163 53.59 67.259 94.57 81.386 52.518 18.005 99.614-1.482 143.589-30.272 22.068-14.379 27.738-39.195 36.848-60.826 6.31-14.663 13.31-29.326 17.91-44.934 15.76-53.353-2.46-104.846-7.6-157.064a13.664 13.664 0 00-2.39-5.771c-19.45-29.262-27.68-64.168-47.921-93.241-24.02-34.686-58.601-52.376-96.556-44.367-31.523 6.685-62.164 17.816-93.12 27.118a8.197 8.197 0 00-4.918 3.406c-4.445 9.46-13.996 12.613-22.066 16.87-19.261 10.153-31.523 25.983-42.273 44.461-11.191 18.919-12.767 40.551-13.334 59.912a547.521 547.521 0 002.017 58.272h-.032z"/>
-      <path d="M405.281 413.631c-5.769.441-11.539 1.198-17.276 1.292-19.734.316-35.022-6.306-50.122-20.906-48.672-46.731-52.802-146.973-23.075-191.119a54.45 54.45 0 0138.553-24.532c36.662-4.573 73.009-2.838 105.478 16.365 27.331 16.145 48.482 36.294 54.503 71.989 5.328 31.533 4.13 59.912-7.597 88.922a79.11 79.11 0 01-11.254 20.433c-22.98 28.726-52.013 42.79-89.21 37.556zm-20.018-114.779c-2.743 13.622 6.904 24.879 11.065 37.618 3.783 11.699 14.91 13.275 20.679 2.302a234.248 234.248 0 0019.891-55.213c.73-3.604.816-7.309.252-10.942-2.427-18.541-18.315-25.447-33.225-14.253a44.876 44.876 0 00-18.725 40.488h.063zM785.547 306.104c-.378-21.82.568-43.168 10.593-64.169 13.208-27.685 37.828-40.298 63.677-45.407 32.185-6.306 64.308-1.86 90.788 23.335 30.924 29.42 43.281 64.421 38.962 106.17a205.454 205.454 0 00-2.206 26.645c1.008 37.839-15.604 65.178-47.286 85.611-31.681 20.433-61.534 12.865-91.765-1.072-9.457-4.352-17.432-11.604-26.7-16.366-18.094-9.459-26.133-25.73-29.916-44.145a265.17 265.17 0 01-6.147-70.602zm71.874 24.848c-2.364 14.537 3.404 26.74 10.623 38.533 5.548 9.113 12.389 18.762 23.391 18.541 12.799-.252 10.749-13.811 13.208-22.073 9.962-33.235 9.079-65.903-8.038-97.089-3.657-6.685-8.701-10.437-16.487-9.144-7.786 1.293-13.587 5.266-14.753 13.874l-7.944 57.358z"/>
-    </g>
-  </g>
-  <defs>
-    <clipPath id="clip0">
-      <path fill="#fff" d="M0 0h1280v568H0z"/>
-    </clipPath>
-    <clipPath id="clip1">
-      <path fill="#fff" transform="translate(79.738 -94.55)" d="M0 0h1119.52v757.098H0z"/>
-    </clipPath>
-  </defs>
+<svg viewBox="0 0 374 440" fill="none" xmlns="http://www.w3.org/2000/svg">
+  <path d="M101.194 187.586c-.132-7.011-16.16-17.748-16.018-15.944.142 1.803.084 123.457 17.928 177.596 0 0 3.441 6.907-1.573 15.86" stroke="#1E1E1E" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+  <path d="m84.922 161.647-2.246 4.467 2.651 1.333 2.44-1.689-2.845-4.111Zm0 0c2.845 4.111 2.847 4.11 2.848 4.109l.004-.003.013-.009.044-.03.157-.11a145.38 145.38 0 0 0 2.73-1.984 221.81 221.81 0 0 0 7.551-5.895c6.212-5.059 14.481-12.304 22.668-21.025 8.171-8.705 16.373-19 22.346-30.171 5.966-11.157 9.861-23.48 8.978-36.11-2.721-38.907-37.994-67.44-78.238-64.626C33.78 8.607 2.821 41.771 5.541 80.68c.883 12.63 6.456 24.291 13.916 34.509 7.47 10.231 17.025 19.284 26.328 26.767 9.321 7.497 18.518 13.52 25.373 17.666a220.806 220.806 0 0 0 8.3 4.786 153.7 153.7 0 0 0 2.978 1.585 22.04 22.04 0 0 0 .171.087l.047.024.014.007.005.003c.002.001.003.001 2.249-4.466Z" fill="#fff" stroke="#fff" stroke-width="10"/>
+  <path d="m84.203 171.048-7.61 18.766s4.903 3.213 13.02 1.693l-3.552-20.244-1.858-.215Z" fill="#fff"/>
+  <rect x="82.418" y="171.164" width="6.5" height="2" rx="1" transform="rotate(3.18 82.418 171.164)" fill="#1E1E1E"/>
+  <path d="M297.781 246.24c-.847.263-19.158 12.848-20.847 3.841 0 0-.557-2.369.56-6.132 0 0 2.129-9.354-6.654-8.052 0 0-7.785 1.703-10.819.022l-29.618 153.729 20.187 16.219s18.766 15.555 36.375 17.192" stroke="#1E1E1E" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+  <path d="m260.954 227.215-3.154 3.881 2.341 1.902 2.774-1.184-1.961-4.599Zm0 0a816.555 816.555 0 0 0 1.964 4.598l.005-.002.015-.006.049-.021.176-.077.656-.289c.567-.253 1.389-.626 2.431-1.114a220.542 220.542 0 0 0 8.626-4.283c7.138-3.733 16.747-9.208 26.586-16.169 19.332-13.677 40.984-34.081 44.525-59.28 5.5-39.137-22.915-74.916-62.942-80.542-40.028-5.625-77.205 20.936-82.705 60.073-3.541 25.199 11.647 50.78 26.461 69.256 7.539 9.403 15.266 17.315 21.099 22.871a221.255 221.255 0 0 0 7.111 6.495 146.147 146.147 0 0 0 2.58 2.199l.149.122.041.034.013.01.004.003c.001.002.002.003 3.156-3.878Z" fill="#fff" stroke="#fff" stroke-width="10"/>
+  <path d="m260.833 238.042.743 20.237s-5.706 1.345-12.815-2.855l10.252-17.815 1.82.433Z" fill="#fff"/>
+  <rect x="256.704" y="237.275" width="5.997" height="2" rx="1" transform="rotate(7.245 256.704 237.275)" fill="#1E1E1E"/>
+  <path d="M318.718 133.121a2.06 2.06 0 0 0-1.031-.854c-.37-.14-7.335-2.746-21.144-5.18-10.426-1.839-16.715-1.581-21.755-1.373-.669.027-1.317.053-1.953.073-1.685.056-3.467.196-5.192.327-3.712.292-7.573.589-10.649.075-3.07-.57-6.585-2.167-9.985-3.713-1.574-.713-3.203-1.455-4.768-2.083-.591-.237-1.195-.486-1.819-.741-4.668-1.92-10.482-4.309-20.901-6.147-14.014-2.471-21.347-2.366-21.651-2.36a2.063 2.063 0 0 0-1.396.578 2.026 2.026 0 0 0-.618 1.37l-.267 6.138a2.04 2.04 0 0 0 1.197 1.946c1.895.874 1.925 1.149 2.157 3.29.021.209.045.426.072.656.145 1.242.395 3.218.657 5.303.323 2.621.707 5.599.943 7.642.336 2.941 1.24 10.758 15.054 14.97 10.902 3.326 18.758 3.461 24.016.415 5.125-2.971 10.636-13.08 12.065-16.425a6.725 6.725 0 0 1 .873-1.584l5.324.939c.171.581.264 1.182.279 1.787.198 3.634 1.921 15.019 5.717 19.56 2.872 3.432 7.657 5.725 14.531 6.938 2.706.462 5.437.76 8.179.892 6.03.322 10.844-.71 14.328-3.057 3.024-2.045 4.315-4.62 4.941-5.871.889-1.783 2.156-4.249 3.381-6.634a541.984 541.984 0 0 0 2.549-4.997l.293-.592c.95-1.933 1.072-2.181 3.152-2.353a2.061 2.061 0 0 0 1.112-.44 2.04 2.04 0 0 0 .676-.98l1.851-5.856c.083-.276.107-.567.07-.852a2.048 2.048 0 0 0-.288-.807Z" fill="#1E1E1E"/>
+  <rect x="315.517" y="132.793" width="39.784" height="7.784" rx="2" transform="rotate(12 315.517 132.793)" fill="#1E1E1E"/>
 </svg>
diff --git a/src/wp-admin/images/about-texture.png b/src/wp-admin/images/about-texture.png
new file mode 100644
index 0000000000..58cf58bfec
Binary files /dev/null and b/src/wp-admin/images/about-texture.png differ
diff --git a/src/wp-admin/includes/ajax-actions.php b/src/wp-admin/includes/ajax-actions.php
index 1ba480f2f1..191e5b54dd 100644
--- a/src/wp-admin/includes/ajax-actions.php
+++ b/src/wp-admin/includes/ajax-actions.php
@@ -1102,9 +1102,19 @@ function wp_ajax_add_tag() {
 	$wp_list_table->single_row( $tag );
 	$parents = ob_get_clean();
 
+	require ABSPATH . 'wp-admin/includes/edit-tag-messages.php';
+
+	$message = '';
+	if ( isset( $messages[ $tax->name ][1] ) ) {
+		$message = $messages[ $tax->name ][1];
+	} elseif ( isset( $messages['_item'][1] ) ) {
+		$message = $messages['_item'][1];
+	}
+
 	$x->add(
 		array(
 			'what'         => 'taxonomy',
+			'data'         => $message,
 			'supplemental' => compact( 'parents', 'noparents' ),
 		)
 	);
diff --git a/src/wp-admin/includes/bookmark.php b/src/wp-admin/includes/bookmark.php
index e3c10c54ea..abc79d4353 100644
--- a/src/wp-admin/includes/bookmark.php
+++ b/src/wp-admin/includes/bookmark.php
@@ -163,7 +163,6 @@ function get_link_to_edit( $link ) {
  *     @type string $link_visible     Optional. 'Y' means visible, anything else means not.
  *     @type int    $link_owner       Optional. A user ID.
  *     @type int    $link_rating      Optional. A rating for the link.
- *     @type string $link_updated     Optional. When the link was last updated.
  *     @type string $link_rel         Optional. A relationship of the link to you.
  *     @type string $link_notes       Optional. An extended description of or notes on the link.
  *     @type string $link_rss         Optional. A URL of an associated RSS feed.
diff --git a/src/wp-admin/includes/class-core-upgrader.php b/src/wp-admin/includes/class-core-upgrader.php
index a7a1d05f2b..4017c51887 100644
--- a/src/wp-admin/includes/class-core-upgrader.php
+++ b/src/wp-admin/includes/class-core-upgrader.php
@@ -126,7 +126,7 @@ class Core_Upgrader extends WP_Upgrader {
 		// Allow for signature soft-fail.
 		// WARNING: This may be removed in the future.
 		if ( is_wp_error( $download ) && $download->get_error_data( 'softfail-filename' ) ) {
-			// Outout the failure error as a normal feedback, and not as an error:
+			// Output the failure error as a normal feedback, and not as an error:
 			/** This filter is documented in wp-admin/includes/update-core.php */
 			apply_filters( 'update_feedback', $download->get_error_message() );
 
diff --git a/src/wp-admin/includes/class-custom-image-header.php b/src/wp-admin/includes/class-custom-image-header.php
index 68fc78797d..f8d1bb6630 100644
--- a/src/wp-admin/includes/class-custom-image-header.php
+++ b/src/wp-admin/includes/class-custom-image-header.php
@@ -393,7 +393,7 @@ class Custom_Image_Header {
 		}
 	}
 
-	$(document).ready(function() {
+	$( function() {
 		var text_color = $('#text-color');
 		header_text_fields = $('.displaying-header-text');
 		text_color.wpColorPicker({
@@ -408,7 +408,7 @@ class Custom_Image_Header {
 		<?php if ( ! display_header_text() ) : ?>
 		toggle_text();
 		<?php endif; ?>
-	});
+	} );
 })(jQuery);
 </script>
 		<?php
@@ -430,7 +430,7 @@ class Custom_Image_Header {
 		jQuery( '#height' ).val(coords.h);
 	}
 
-	jQuery(document).ready(function() {
+	jQuery( function() {
 		var xinit = <?php echo absint( get_theme_support( 'custom-header', 'width' ) ); ?>;
 		var yinit = <?php echo absint( get_theme_support( 'custom-header', 'height' ) ); ?>;
 		var ratio = xinit / yinit;
@@ -485,7 +485,7 @@ class Custom_Image_Header {
 				jQuery('#height').val(c.height);
 			}
 		});
-	});
+	} );
 </script>
 		<?php
 	}
@@ -817,7 +817,7 @@ endif;
 		if ( ! current_theme_supports( 'custom-header', 'uploads' ) ) {
 			wp_die(
 				'<h1>' . __( 'Something went wrong.' ) . '</h1>' .
-				'<p>' . __( 'The current theme does not support uploading a custom header image.' ) . '</p>',
+				'<p>' . __( 'The active theme does not support uploading a custom header image.' ) . '</p>',
 				403
 			);
 		}
@@ -1003,7 +1003,7 @@ endif;
 		if ( ! current_theme_supports( 'custom-header', 'uploads' ) ) {
 			wp_die(
 				'<h1>' . __( 'Something went wrong.' ) . '</h1>' .
-				'<p>' . __( 'The current theme does not support uploading a custom header image.' ) . '</p>',
+				'<p>' . __( 'The active theme does not support uploading a custom header image.' ) . '</p>',
 				403
 			);
 		}
@@ -1014,7 +1014,7 @@ endif;
 		) {
 			wp_die(
 				'<h1>' . __( 'Something went wrong.' ) . '</h1>' .
-				'<p>' . __( 'The current theme does not support a flexible sized header image.' ) . '</p>',
+				'<p>' . __( 'The active theme does not support a flexible sized header image.' ) . '</p>',
 				403
 			);
 		}
@@ -1455,7 +1455,7 @@ endif;
 
 	/**
 	 * Given an attachment ID for a header image, unsets it as a user-uploaded
-	 * header image for the current theme.
+	 * header image for the active theme.
 	 *
 	 * Triggered when the user clicks the overlay "X" button next to each image
 	 * choice in the Customizer's Header tool.
diff --git a/src/wp-admin/includes/class-plugin-upgrader.php b/src/wp-admin/includes/class-plugin-upgrader.php
index aeefaf9875..76083b5211 100644
--- a/src/wp-admin/includes/class-plugin-upgrader.php
+++ b/src/wp-admin/includes/class-plugin-upgrader.php
@@ -226,14 +226,9 @@ class Plugin_Upgrader extends WP_Upgrader {
 				'clear_destination' => true,
 				'clear_working'     => true,
 				'hook_extra'        => array(
-					'plugin'      => $plugin,
-					'type'        => 'plugin',
-					'action'      => 'update',
-					'temp_backup' => array(
-						'slug' => dirname( $plugin ),
-						'src'  => WP_PLUGIN_DIR,
-						'dir'  => 'plugins',
-					),
+					'plugin' => $plugin,
+					'type'   => 'plugin',
+					'action' => 'update',
 				),
 			)
 		);
@@ -347,12 +342,7 @@ class Plugin_Upgrader extends WP_Upgrader {
 					'clear_working'     => true,
 					'is_multi'          => true,
 					'hook_extra'        => array(
-						'plugin'      => $plugin,
-						'temp_backup' => array(
-							'slug' => dirname( $plugin ),
-							'src'  => WP_PLUGIN_DIR,
-							'dir'  => 'plugins',
-						),
+						'plugin' => $plugin,
 					),
 				)
 			);
diff --git a/src/wp-admin/includes/class-theme-installer-skin.php b/src/wp-admin/includes/class-theme-installer-skin.php
index 1af614d0b4..91c3a50088 100644
--- a/src/wp-admin/includes/class-theme-installer-skin.php
+++ b/src/wp-admin/includes/class-theme-installer-skin.php
@@ -223,7 +223,7 @@ class Theme_Installer_Skin extends WP_Upgrader_Skin {
 
 		echo '<h2 class="update-from-upload-heading">' . esc_html__( 'This theme is already installed.' ) . '</h2>';
 
-		// Check errors for current theme.
+		// Check errors for active theme.
 		if ( is_wp_error( $current_theme_data->errors() ) ) {
 			$this->feedback( 'current_theme_has_errors', $current_theme_data->errors()->get_error_message() );
 		}
@@ -245,7 +245,7 @@ class Theme_Installer_Skin extends WP_Upgrader_Skin {
 		);
 
 		$table  = '<table class="update-from-upload-comparison"><tbody>';
-		$table .= '<tr><th></th><th>' . esc_html_x( 'Current', 'theme' ) . '</th><th>' . esc_html_x( 'Uploaded', 'theme' ) . '</th></tr>';
+		$table .= '<tr><th></th><th>' . esc_html_x( 'Active', 'theme' ) . '</th><th>' . esc_html_x( 'Uploaded', 'theme' ) . '</th></tr>';
 
 		$is_same_theme = true; // Let's consider only these rows.
 
@@ -282,9 +282,9 @@ class Theme_Installer_Skin extends WP_Upgrader_Skin {
 		 *
 		 * @since 5.5.0
 		 *
-		 * @param string $table              The output table with Name, Version, Author, RequiresWP, and RequiresPHP info.
-		 * @param array  $current_theme_data Array with current theme data.
-		 * @param array  $new_theme_data     Array with uploaded theme data.
+		 * @param string   $table              The output table with Name, Version, Author, RequiresWP, and RequiresPHP info.
+		 * @param WP_Theme $current_theme_data Active theme data.
+		 * @param array    $new_theme_data     Array with uploaded theme data.
 		 */
 		echo apply_filters( 'install_theme_overwrite_comparison', $table, $current_theme_data, $new_theme_data );
 
@@ -327,7 +327,7 @@ class Theme_Installer_Skin extends WP_Upgrader_Skin {
 			if ( $this->is_downgrading ) {
 				$warning = sprintf(
 					/* translators: %s: Documentation URL. */
-					__( 'You are uploading an older version of a current theme. You can continue to install the older version, but be sure to <a href="%s">back up your database and files</a> first.' ),
+					__( 'You are uploading an older version of the active theme. You can continue to install the older version, but be sure to <a href="%s">back up your database and files</a> first.' ),
 					__( 'https://wordpress.org/support/article/wordpress-backups/' )
 				);
 			} else {
@@ -345,7 +345,7 @@ class Theme_Installer_Skin extends WP_Upgrader_Skin {
 			$install_actions['overwrite_theme'] = sprintf(
 				'<a class="button button-primary update-from-upload-overwrite" href="%s" target="_parent">%s</a>',
 				wp_nonce_url( add_query_arg( 'overwrite', $overwrite, $this->url ), 'theme-upload' ),
-				_x( 'Replace current with uploaded', 'theme' )
+				_x( 'Replace active with uploaded', 'theme' )
 			);
 		} else {
 			echo $blocked_message;
diff --git a/src/wp-admin/includes/class-theme-upgrader.php b/src/wp-admin/includes/class-theme-upgrader.php
index 3a7beaf1fd..864af8f3c5 100644
--- a/src/wp-admin/includes/class-theme-upgrader.php
+++ b/src/wp-admin/includes/class-theme-upgrader.php
@@ -92,7 +92,7 @@ class Theme_Upgrader extends WP_Upgrader {
 		/* translators: %s: Theme name. */
 		$this->strings['parent_theme_not_found'] = sprintf( __( '<strong>The parent theme could not be found.</strong> You will need to install the parent theme, %s, before you can use this child theme.' ), '<strong>%s</strong>' );
 		/* translators: %s: Theme error. */
-		$this->strings['current_theme_has_errors'] = __( 'The current theme has the following error: "%s".' );
+		$this->strings['current_theme_has_errors'] = __( 'The active theme has the following error: "%s".' );
 
 		if ( ! empty( $this->skin->overwrite ) ) {
 			if ( 'update-theme' === $this->skin->overwrite ) {
@@ -328,14 +328,9 @@ class Theme_Upgrader extends WP_Upgrader {
 				'clear_destination' => true,
 				'clear_working'     => true,
 				'hook_extra'        => array(
-					'theme'       => $theme,
-					'type'        => 'theme',
-					'action'      => 'update',
-					'temp_backup' => array(
-						'slug' => $theme,
-						'src'  => get_theme_root( $theme ),
-						'dir'  => 'themes',
-					),
+					'theme'  => $theme,
+					'type'   => 'theme',
+					'action' => 'update',
 				),
 			)
 		);
@@ -448,12 +443,7 @@ class Theme_Upgrader extends WP_Upgrader {
 					'clear_working'     => true,
 					'is_multi'          => true,
 					'hook_extra'        => array(
-						'theme'       => $theme,
-						'temp_backup' => array(
-							'slug' => $theme,
-							'src'  => get_theme_root( $theme ),
-							'dir'  => 'themes',
-						),
+						'theme' => $theme,
 					),
 				)
 			);
@@ -619,7 +609,7 @@ class Theme_Upgrader extends WP_Upgrader {
 	}
 
 	/**
-	 * Turn on maintenance mode before attempting to upgrade the current theme.
+	 * Turn on maintenance mode before attempting to upgrade the active theme.
 	 *
 	 * Hooked to the {@see 'upgrader_pre_install'} filter by Theme_Upgrader::upgrade() and
 	 * Theme_Upgrader::bulk_upgrade().
@@ -637,7 +627,7 @@ class Theme_Upgrader extends WP_Upgrader {
 
 		$theme = isset( $theme['theme'] ) ? $theme['theme'] : '';
 
-		// Only run if current theme
+		// Only run if active theme
 		if ( get_stylesheet() !== $theme ) {
 			return $return;
 		}
@@ -651,7 +641,7 @@ class Theme_Upgrader extends WP_Upgrader {
 	}
 
 	/**
-	 * Turn off maintenance mode after upgrading the current theme.
+	 * Turn off maintenance mode after upgrading the active theme.
 	 *
 	 * Hooked to the {@see 'upgrader_post_install'} filter by Theme_Upgrader::upgrade()
 	 * and Theme_Upgrader::bulk_upgrade().
@@ -669,7 +659,7 @@ class Theme_Upgrader extends WP_Upgrader {
 
 		$theme = isset( $theme['theme'] ) ? $theme['theme'] : '';
 
-		// Only run if current theme.
+		// Only run if active theme.
 		if ( get_stylesheet() !== $theme ) {
 			return $return;
 		}
diff --git a/src/wp-admin/includes/class-walker-nav-menu-edit.php b/src/wp-admin/includes/class-walker-nav-menu-edit.php
index f91c086950..ac8e36b85f 100644
--- a/src/wp-admin/includes/class-walker-nav-menu-edit.php
+++ b/src/wp-admin/includes/class-walker-nav-menu-edit.php
@@ -232,7 +232,7 @@ class Walker_Nav_Menu_Edit extends Walker_Nav_Menu {
 					<label for="edit-menu-item-description-<?php echo $item_id; ?>">
 						<?php _e( 'Description' ); ?><br />
 						<textarea id="edit-menu-item-description-<?php echo $item_id; ?>" class="widefat edit-menu-item-description" rows="3" cols="20" name="menu-item-description[<?php echo $item_id; ?>]"><?php echo esc_html( $menu_item->description ); // textarea_escaped ?></textarea>
-						<span class="description"><?php _e( 'The description will be displayed in the menu if the current theme supports it.' ); ?></span>
+						<span class="description"><?php _e( 'The description will be displayed in the menu if the active theme supports it.' ); ?></span>
 					</label>
 				</p>
 
@@ -242,11 +242,11 @@ class Walker_Nav_Menu_Edit extends Walker_Nav_Menu {
 				 *
 				 * @since 5.4.0
 				 *
-				 * @param int      $item_id           Menu item ID.
-				 * @param WP_Post  $menu_item         Menu item data object.
-				 * @param int      $depth             Depth of menu item. Used for padding.
-				 * @param stdClass $args              An object of menu item arguments.
-				 * @param int      $current_object_id Nav menu ID.
+				 * @param string        $item_id           Menu item ID as a numeric string.
+				 * @param WP_Post       $menu_item         Menu item data object.
+				 * @param int           $depth             Depth of menu item. Used for padding.
+				 * @param stdClass|null $args              An object of menu item arguments.
+				 * @param int           $current_object_id Nav menu ID.
 				 */
 				do_action( 'wp_nav_menu_item_custom_fields', $item_id, $menu_item, $depth, $args, $current_object_id );
 				?>
diff --git a/src/wp-admin/includes/class-wp-automatic-updater.php b/src/wp-admin/includes/class-wp-automatic-updater.php
index 641db4b325..7ba6b71b52 100644
--- a/src/wp-admin/includes/class-wp-automatic-updater.php
+++ b/src/wp-admin/includes/class-wp-automatic-updater.php
@@ -193,9 +193,10 @@ class WP_Automatic_Updater {
 		 *  - `auto_update_theme`
 		 *  - `auto_update_translation`
 		 *
-		 * Generally speaking, plugins, themes, and major core versions are not updated
-		 * by default, while translations and minor and development versions for core
-		 * are updated by default.
+		 * Since WordPress 3.7, minor and development versions of core, and translations have
+		 * been auto-updated by default. New installs on WordPress 5.6 or higher will also
+		 * auto-update major versions by default. Starting in 5.6, older sites can opt-in to
+		 * major version auto-updates, and auto-updates for plugins and themes.
 		 *
 		 * See the {@see 'allow_dev_auto_core_updates'}, {@see 'allow_minor_auto_core_updates'},
 		 * and {@see 'allow_major_auto_core_updates'} filters for a more straightforward way to
@@ -418,9 +419,10 @@ class WP_Automatic_Updater {
 				return false;
 			}
 
-			// Core doesn't output this, so let's append it so we don't get confused.
+			// Core doesn't output this, so let's append it, so we don't get confused.
 			if ( is_wp_error( $upgrade_result ) ) {
-				$skin->error( __( 'Installation failed.' ), $upgrade_result );
+				$upgrade_result->add( 'installation_failed', __( 'Installation failed.' ) );
+				$skin->error( $upgrade_result );
 			} else {
 				$skin->feedback( __( 'WordPress updated successfully.' ) );
 			}
diff --git a/src/wp-admin/includes/class-wp-comments-list-table.php b/src/wp-admin/includes/class-wp-comments-list-table.php
index 9f7a998a4d..d806262a27 100644
--- a/src/wp-admin/includes/class-wp-comments-list-table.php
+++ b/src/wp-admin/includes/class-wp-comments-list-table.php
@@ -1072,7 +1072,7 @@ class WP_Comments_List_Table extends WP_List_Table {
 		 * @since 2.8.0
 		 *
 		 * @param string $column_name The custom column's name.
-		 * @param int    $comment_id  The custom column's unique ID number.
+		 * @param string $comment_id  The comment ID as a numeric string.
 		 */
 		do_action( 'manage_comments_custom_column', $column_name, $item->comment_ID );
 	}
diff --git a/src/wp-admin/includes/class-wp-community-events.php b/src/wp-admin/includes/class-wp-community-events.php
index cf995eeac8..3f43f8d1db 100644
--- a/src/wp-admin/includes/class-wp-community-events.php
+++ b/src/wp-admin/includes/class-wp-community-events.php
@@ -453,6 +453,7 @@ class WP_Community_Events {
 	 * @since 4.8.0
 	 * @since 4.9.7 Stick a WordCamp to the final list.
 	 * @since 5.5.2 Accepts and returns only the events, rather than an entire HTTP response.
+	 * @since 6.0.0 Decode HTML entities from the event title.
 	 *
 	 * @param array $events The events that will be prepared.
 	 * @return array The response body with events trimmed.
@@ -468,6 +469,9 @@ class WP_Community_Events {
 			$end_time = (int) $event['end_unix_timestamp'];
 
 			if ( time() < $end_time ) {
+				// Decode HTML entities from the event title.
+				$event['title'] = html_entity_decode( $event['title'], ENT_QUOTES, 'UTF-8' );
+
 				array_push( $future_events, $event );
 			}
 		}
diff --git a/src/wp-admin/includes/class-wp-filesystem-base.php b/src/wp-admin/includes/class-wp-filesystem-base.php
index 646522b412..de5ce054cf 100644
--- a/src/wp-admin/includes/class-wp-filesystem-base.php
+++ b/src/wp-admin/includes/class-wp-filesystem-base.php
@@ -838,7 +838,7 @@ class WP_Filesystem_Base {
 	 *     @type mixed  $lastmod     Last modified month (3 letter) and day (without leading 0).
 	 *     @type int    $time        Last modified time.
 	 *     @type string $type        Type of resource. 'f' for file, 'd' for directory.
-	 *     @type mixed  $files       If a directory and $recursive is true, contains another array of files.
+	 *     @type mixed  $files       If a directory and `$recursive` is true, contains another array of files.
 	 * }
 	 */
 	public function dirlist( $path, $include_hidden = true, $recursive = false ) {
diff --git a/src/wp-admin/includes/class-wp-filesystem-direct.php b/src/wp-admin/includes/class-wp-filesystem-direct.php
index 49a51b0ccd..887ad4e715 100644
--- a/src/wp-admin/includes/class-wp-filesystem-direct.php
+++ b/src/wp-admin/includes/class-wp-filesystem-direct.php
@@ -595,7 +595,7 @@ class WP_Filesystem_Direct extends WP_Filesystem_Base {
 	 *     @type mixed  $lastmod     Last modified month (3 letter) and day (without leading 0).
 	 *     @type int    $time        Last modified time.
 	 *     @type string $type        Type of resource. 'f' for file, 'd' for directory.
-	 *     @type mixed  $files       If a directory and $recursive is true, contains another array of files.
+	 *     @type mixed  $files       If a directory and `$recursive` is true, contains another array of files.
 	 * }
 	 */
 	public function dirlist( $path, $include_hidden = true, $recursive = false ) {
diff --git a/src/wp-admin/includes/class-wp-filesystem-ftpext.php b/src/wp-admin/includes/class-wp-filesystem-ftpext.php
index 038d8468ce..627128fcac 100644
--- a/src/wp-admin/includes/class-wp-filesystem-ftpext.php
+++ b/src/wp-admin/includes/class-wp-filesystem-ftpext.php
@@ -703,7 +703,7 @@ class WP_Filesystem_FTPext extends WP_Filesystem_Base {
 	 *     @type mixed  $lastmod     Last modified month (3 letter) and day (without leading 0).
 	 *     @type int    $time        Last modified time.
 	 *     @type string $type        Type of resource. 'f' for file, 'd' for directory.
-	 *     @type mixed  $files       If a directory and $recursive is true, contains another array of files.
+	 *     @type mixed  $files       If a directory and `$recursive` is true, contains another array of files.
 	 * }
 	 */
 	public function dirlist( $path = '.', $include_hidden = true, $recursive = false ) {
diff --git a/src/wp-admin/includes/class-wp-filesystem-ftpsockets.php b/src/wp-admin/includes/class-wp-filesystem-ftpsockets.php
index 3c6b55f4ee..3c0c659456 100644
--- a/src/wp-admin/includes/class-wp-filesystem-ftpsockets.php
+++ b/src/wp-admin/includes/class-wp-filesystem-ftpsockets.php
@@ -616,7 +616,7 @@ class WP_Filesystem_ftpsockets extends WP_Filesystem_Base {
 	 *     @type mixed  $lastmod     Last modified month (3 letter) and day (without leading 0).
 	 *     @type int    $time        Last modified time.
 	 *     @type string $type        Type of resource. 'f' for file, 'd' for directory.
-	 *     @type mixed  $files       If a directory and $recursive is true, contains another array of files.
+	 *     @type mixed  $files       If a directory and `$recursive` is true, contains another array of files.
 	 * }
 	 */
 	public function dirlist( $path = '.', $include_hidden = true, $recursive = false ) {
diff --git a/src/wp-admin/includes/class-wp-filesystem-ssh2.php b/src/wp-admin/includes/class-wp-filesystem-ssh2.php
index 4d01655b70..bd2f6ba951 100644
--- a/src/wp-admin/includes/class-wp-filesystem-ssh2.php
+++ b/src/wp-admin/includes/class-wp-filesystem-ssh2.php
@@ -26,7 +26,7 @@
  * Restart Apache!
  * Check phpinfo() streams to confirm that: ssh2.shell, ssh2.exec, ssh2.tunnel, ssh2.scp, ssh2.sftp  exist.
  *
- * Note: As of WordPress 2.8, this utilises the PHP5+ function `stream_get_contents()`.
+ * Note: As of WordPress 2.8, this utilizes the PHP5+ function `stream_get_contents()`.
  *
  * @since 2.7.0
  *
@@ -745,7 +745,7 @@ class WP_Filesystem_SSH2 extends WP_Filesystem_Base {
 	 *     @type mixed  $lastmod     Last modified month (3 letter) and day (without leading 0).
 	 *     @type int    $time        Last modified time.
 	 *     @type string $type        Type of resource. 'f' for file, 'd' for directory.
-	 *     @type mixed  $files       If a directory and $recursive is true, contains another array of files.
+	 *     @type mixed  $files       If a directory and `$recursive` is true, contains another array of files.
 	 * }
 	 */
 	public function dirlist( $path, $include_hidden = true, $recursive = false ) {
diff --git a/src/wp-admin/includes/class-wp-internal-pointers.php b/src/wp-admin/includes/class-wp-internal-pointers.php
index a17caf5521..08cf817744 100644
--- a/src/wp-admin/includes/class-wp-internal-pointers.php
+++ b/src/wp-admin/includes/class-wp-internal-pointers.php
@@ -140,7 +140,9 @@ final class WP_Internal_Pointers {
 			if ( options.position && options.position.defer_loading )
 				$(window).bind( 'load.wp-pointers', setup );
 			else
-				$(document).ready( setup );
+				$( function() {
+					setup();
+				} );
 
 		})( jQuery );
 		</script>
diff --git a/src/wp-admin/includes/class-wp-ms-sites-list-table.php b/src/wp-admin/includes/class-wp-ms-sites-list-table.php
index b185664bd6..2d014700bb 100644
--- a/src/wp-admin/includes/class-wp-ms-sites-list-table.php
+++ b/src/wp-admin/includes/class-wp-ms-sites-list-table.php
@@ -635,9 +635,9 @@ class WP_MS_Sites_List_Table extends WP_List_Table {
 		 *
 		 * @since 5.3.0
 		 *
-		 * @param array $site_states An array of site states. Default 'Main',
-		 *                           'Archived', 'Mature', 'Spam', 'Deleted'.
-		 * @param WP_Site $site The current site object.
+		 * @param string[] $site_states An array of site states. Default 'Main',
+		 *                              'Archived', 'Mature', 'Spam', 'Deleted'.
+		 * @param WP_Site  $site        The current site object.
 		 */
 		$site_states = apply_filters( 'display_site_states', $site_states, $_site );
 
diff --git a/src/wp-admin/includes/class-wp-ms-users-list-table.php b/src/wp-admin/includes/class-wp-ms-users-list-table.php
index 3494f8c871..be72876c36 100644
--- a/src/wp-admin/includes/class-wp-ms-users-list-table.php
+++ b/src/wp-admin/includes/class-wp-ms-users-list-table.php
@@ -370,13 +370,13 @@ class WP_MS_Users_List_Table extends WP_List_Table {
 			return;
 		}
 
-		foreach ( $blogs as $val ) {
-			if ( ! can_edit_network( $val->site_id ) ) {
+		foreach ( $blogs as $site ) {
+			if ( ! can_edit_network( $site->site_id ) ) {
 				continue;
 			}
 
-			$path         = ( '/' === $val->path ) ? '' : $val->path;
-			$site_classes = array( 'site-' . $val->site_id );
+			$path         = ( '/' === $site->path ) ? '' : $site->path;
+			$site_classes = array( 'site-' . $site->site_id );
 			/**
 			 * Filters the span class for a site listing on the mulisite user list table.
 			 *
@@ -387,33 +387,33 @@ class WP_MS_Users_List_Table extends WP_List_Table {
 			 * @param int      $network_id   Network ID.
 			 * @param WP_User  $user         WP_User object.
 			 */
-			$site_classes = apply_filters( 'ms_user_list_site_class', $site_classes, $val->userblog_id, $val->site_id, $user );
+			$site_classes = apply_filters( 'ms_user_list_site_class', $site_classes, $site->userblog_id, $site->site_id, $user );
 			if ( is_array( $site_classes ) && ! empty( $site_classes ) ) {
 				$site_classes = array_map( 'sanitize_html_class', array_unique( $site_classes ) );
 				echo '<span class="' . esc_attr( implode( ' ', $site_classes ) ) . '">';
 			} else {
 				echo '<span>';
 			}
-			echo '<a href="' . esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) . '">' . str_replace( '.' . get_network()->domain, '', $val->domain . $path ) . '</a>';
+			echo '<a href="' . esc_url( network_admin_url( 'site-info.php?id=' . $site->userblog_id ) ) . '">' . str_replace( '.' . get_network()->domain, '', $site->domain . $path ) . '</a>';
 			echo ' <small class="row-actions">';
 			$actions         = array();
-			$actions['edit'] = '<a href="' . esc_url( network_admin_url( 'site-info.php?id=' . $val->userblog_id ) ) . '">' . __( 'Edit' ) . '</a>';
+			$actions['edit'] = '<a href="' . esc_url( network_admin_url( 'site-info.php?id=' . $site->userblog_id ) ) . '">' . __( 'Edit' ) . '</a>';
 
 			$class = '';
-			if ( 1 == $val->spam ) {
+			if ( 1 === (int) $site->spam ) {
 				$class .= 'site-spammed ';
 			}
-			if ( 1 == $val->mature ) {
+			if ( 1 === (int) $site->mature ) {
 				$class .= 'site-mature ';
 			}
-			if ( 1 == $val->deleted ) {
+			if ( 1 === (int) $site->deleted ) {
 				$class .= 'site-deleted ';
 			}
-			if ( 1 == $val->archived ) {
+			if ( 1 === (int) $site->archived ) {
 				$class .= 'site-archived ';
 			}
 
-			$actions['view'] = '<a class="' . $class . '" href="' . esc_url( get_home_url( $val->userblog_id ) ) . '">' . __( 'View' ) . '</a>';
+			$actions['view'] = '<a class="' . $class . '" href="' . esc_url( get_home_url( $site->userblog_id ) ) . '">' . __( 'View' ) . '</a>';
 
 			/**
 			 * Filters the action links displayed next the sites a user belongs to
@@ -424,7 +424,7 @@ class WP_MS_Users_List_Table extends WP_List_Table {
 			 * @param string[] $actions     An array of action links to be displayed. Default 'Edit', 'View'.
 			 * @param int      $userblog_id The site ID.
 			 */
-			$actions = apply_filters( 'ms_user_list_site_actions', $actions, $val->userblog_id );
+			$actions = apply_filters( 'ms_user_list_site_actions', $actions, $site->userblog_id );
 
 			$action_count = count( $actions );
 
diff --git a/src/wp-admin/includes/class-wp-plugins-list-table.php b/src/wp-admin/includes/class-wp-plugins-list-table.php
index 32af4ad8ae..9e3f566344 100644
--- a/src/wp-admin/includes/class-wp-plugins-list-table.php
+++ b/src/wp-admin/includes/class-wp-plugins-list-table.php
@@ -899,12 +899,15 @@ class WP_Plugins_List_Table extends WP_List_Table {
 			 *
 			 * @since 3.1.0
 			 *
-			 * @param string[] $actions     An array of plugin action links. By default this can include 'activate',
-			 *                              'deactivate', and 'delete'.
+			 * @param string[] $actions     An array of plugin action links. By default this can include
+			 *                              'activate', 'deactivate', and 'delete'.
 			 * @param string   $plugin_file Path to the plugin file relative to the plugins directory.
-			 * @param array    $plugin_data An array of plugin data. See `get_plugin_data()`.
-			 * @param string   $context     The plugin context. By default this can include 'all', 'active', 'inactive',
-			 *                              'recently_activated', 'upgrade', 'mustuse', 'dropins', and 'search'.
+			 * @param array    $plugin_data An array of plugin data. See `get_plugin_data()`
+			 *                              and the {@see 'plugin_row_meta'} filter for the list
+			 *                              of possible values.
+			 * @param string   $context     The plugin context. By default this can include 'all',
+			 *                              'active', 'inactive', 'recently_activated', 'upgrade',
+			 *                              'mustuse', 'dropins', and 'search'.
 			 */
 			$actions = apply_filters( 'network_admin_plugin_action_links', $actions, $plugin_file, $plugin_data, $context );
 
@@ -916,12 +919,15 @@ class WP_Plugins_List_Table extends WP_List_Table {
 			 *
 			 * @since 3.1.0
 			 *
-			 * @param string[] $actions     An array of plugin action links. By default this can include 'activate',
-			 *                              'deactivate', and 'delete'.
+			 * @param string[] $actions     An array of plugin action links. By default this can include
+			 *                              'activate', 'deactivate', and 'delete'.
 			 * @param string   $plugin_file Path to the plugin file relative to the plugins directory.
-			 * @param array    $plugin_data An array of plugin data. See `get_plugin_data()`.
-			 * @param string   $context     The plugin context. By default this can include 'all', 'active', 'inactive',
-			 *                              'recently_activated', 'upgrade', 'mustuse', 'dropins', and 'search'.
+			 * @param array    $plugin_data An array of plugin data. See `get_plugin_data()`
+			 *                              and the {@see 'plugin_row_meta'} filter for the list
+			 *                              of possible values.
+			 * @param string   $context     The plugin context. By default this can include 'all',
+			 *                              'active', 'inactive', 'recently_activated', 'upgrade',
+			 *                              'mustuse', 'dropins', and 'search'.
 			 */
 			$actions = apply_filters( "network_admin_plugin_action_links_{$plugin_file}", $actions, $plugin_file, $plugin_data, $context );
 
@@ -934,13 +940,16 @@ class WP_Plugins_List_Table extends WP_List_Table {
 			 * @since 2.6.0 The `$context` parameter was added.
 			 * @since 4.9.0 The 'Edit' link was removed from the list of action links.
 			 *
-			 * @param string[] $actions     An array of plugin action links. By default this can include 'activate',
-			 *                              'deactivate', and 'delete'. With Multisite active this can also include
-			 *                              'network_active' and 'network_only' items.
+			 * @param string[] $actions     An array of plugin action links. By default this can include
+			 *                              'activate', 'deactivate', and 'delete'. With Multisite active
+			 *                              this can also include 'network_active' and 'network_only' items.
 			 * @param string   $plugin_file Path to the plugin file relative to the plugins directory.
-			 * @param array    $plugin_data An array of plugin data. See `get_plugin_data()`.
-			 * @param string   $context     The plugin context. By default this can include 'all', 'active', 'inactive',
-			 *                              'recently_activated', 'upgrade', 'mustuse', 'dropins', and 'search'.
+			 * @param array    $plugin_data An array of plugin data. See `get_plugin_data()`
+			 *                              and the {@see 'plugin_row_meta'} filter for the list
+			 *                              of possible values.
+			 * @param string   $context     The plugin context. By default this can include 'all',
+			 *                              'active', 'inactive', 'recently_activated', 'upgrade',
+			 *                              'mustuse', 'dropins', and 'search'.
 			 */
 			$actions = apply_filters( 'plugin_action_links', $actions, $plugin_file, $plugin_data, $context );
 
@@ -953,13 +962,16 @@ class WP_Plugins_List_Table extends WP_List_Table {
 			 * @since 2.7.0
 			 * @since 4.9.0 The 'Edit' link was removed from the list of action links.
 			 *
-			 * @param string[] $actions     An array of plugin action links. By default this can include 'activate',
-			 *                              'deactivate', and 'delete'. With Multisite active this can also include
-			 *                              'network_active' and 'network_only' items.
+			 * @param string[] $actions     An array of plugin action links. By default this can include
+			 *                              'activate', 'deactivate', and 'delete'. With Multisite active
+			 *                              this can also include 'network_active' and 'network_only' items.
 			 * @param string   $plugin_file Path to the plugin file relative to the plugins directory.
-			 * @param array    $plugin_data An array of plugin data. See `get_plugin_data()`.
-			 * @param string   $context     The plugin context. By default this can include 'all', 'active', 'inactive',
-			 *                              'recently_activated', 'upgrade', 'mustuse', 'dropins', and 'search'.
+			 * @param array    $plugin_data An array of plugin data. See `get_plugin_data()`
+			 *                              and the {@see 'plugin_row_meta'} filter for the list
+			 *                              of possible values.
+			 * @param string   $context     The plugin context. By default this can include 'all',
+			 *                              'active', 'inactive', 'recently_activated', 'upgrade',
+			 *                              'mustuse', 'dropins', and 'search'.
 			 */
 			$actions = apply_filters( "plugin_action_links_{$plugin_file}", $actions, $plugin_file, $plugin_data, $context );
 
@@ -1085,7 +1097,39 @@ class WP_Plugins_List_Table extends WP_List_Table {
 					 * @param string[] $plugin_meta An array of the plugin's metadata, including
 					 *                              the version, author, author URI, and plugin URI.
 					 * @param string   $plugin_file Path to the plugin file relative to the plugins directory.
-					 * @param array    $plugin_data An array of plugin data.
+					 * @param array    $plugin_data {
+					 *     An array of plugin data.
+					 *
+					 *     @type string   $id               Plugin ID, e.g. `w.org/plugins/[plugin-name]`.
+					 *     @type string   $slug             Plugin slug.
+					 *     @type string   $plugin           Plugin basename.
+					 *     @type string   $new_version      New plugin version.
+					 *     @type string   $url              Plugin URL.
+					 *     @type string   $package          Plugin update package URL.
+					 *     @type string[] $icons            An array of plugin icon URLs.
+					 *     @type string[] $banners          An array of plugin banner URLs.
+					 *     @type string[] $banners_rtl      An array of plugin RTL banner URLs.
+					 *     @type string   $requires         The version of WordPress which the plugin requires.
+					 *     @type string   $tested           The version of WordPress the plugin is tested against.
+					 *     @type string   $requires_php     The version of PHP which the plugin requires.
+					 *     @type string   $upgrade_notice   The upgrade notice for the new plugin version.
+					 *     @type bool     $update-supported Whether the plugin supports updates.
+					 *     @type string   $Name             The human-readable name of the plugin.
+					 *     @type string   $PluginURI        Plugin URI.
+					 *     @type string   $Version          Plugin version.
+					 *     @type string   $Description      Plugin description.
+					 *     @type string   $Author           Plugin author.
+					 *     @type string   $AuthorURI        Plugin author URI.
+					 *     @type string   $TextDomain       Plugin textdomain.
+					 *     @type string   $DomainPath       Relative path to the plugin's .mo file(s).
+					 *     @type bool     $Network          Whether the plugin can only be activated network-wide.
+					 *     @type string   $RequiresWP       The version of WordPress which the plugin requires.
+					 *     @type string   $RequiresPHP      The version of PHP which the plugin requires.
+					 *     @type string   $UpdateURI        ID of the plugin for update purposes, should be a URI.
+					 *     @type string   $Title            The human-readable title of the plugin.
+					 *     @type string   $AuthorName       Plugin author's name.
+					 *     @type bool     $update           Whether there's an available update. Default null.
+					 * }
 					 * @param string   $status      Status filter currently applied to the plugin list. Possible
 					 *                              values are: 'all', 'active', 'inactive', 'recently_activated',
 					 *                              'upgrade', 'mustuse', 'dropins', 'search', 'paused',
@@ -1181,10 +1225,13 @@ class WP_Plugins_List_Table extends WP_List_Table {
 					 *
 					 * @since 5.5.0
 					 *
-					 * @param string $html        The HTML of the plugin's auto-update column content, including
-					 *                            toggle auto-update action links and time to next update.
+					 * @param string $html        The HTML of the plugin's auto-update column content,
+					 *                            including toggle auto-update action links and
+					 *                            time to next update.
 					 * @param string $plugin_file Path to the plugin file relative to the plugins directory.
-					 * @param array  $plugin_data An array of plugin data.
+					 * @param array  $plugin_data An array of plugin data. See `get_plugin_data()`
+					 *                            and the {@see 'plugin_row_meta'} filter for the list
+					 *                            of possible values.
 					 */
 					echo apply_filters( 'plugin_auto_update_setting_html', $html, $plugin_file, $plugin_data );
 
@@ -1204,7 +1251,9 @@ class WP_Plugins_List_Table extends WP_List_Table {
 					 *
 					 * @param string $column_name Name of the column.
 					 * @param string $plugin_file Path to the plugin file relative to the plugins directory.
-					 * @param array  $plugin_data An array of plugin data.
+					 * @param array  $plugin_data An array of plugin data. See `get_plugin_data()`
+					 *                            and the {@see 'plugin_row_meta'} filter for the list
+					 *                            of possible values.
 					 */
 					do_action( 'manage_plugins_custom_column', $column_name, $plugin_file, $plugin_data );
 
@@ -1274,14 +1323,17 @@ class WP_Plugins_List_Table extends WP_List_Table {
 		 * Fires after each row in the Plugins list table.
 		 *
 		 * @since 2.3.0
-		 * @since 5.5.0 Added 'auto-update-enabled' and 'auto-update-disabled' to possible values for `$status`.
+		 * @since 5.5.0 Added 'auto-update-enabled' and 'auto-update-disabled'
+		 *              to possible values for `$status`.
 		 *
 		 * @param string $plugin_file Path to the plugin file relative to the plugins directory.
-		 * @param array  $plugin_data An array of plugin data.
-		 * @param string $status      Status filter currently applied to the plugin list. Possible
-		 *                            values are: 'all', 'active', 'inactive', 'recently_activated',
-		 *                            'upgrade', 'mustuse', 'dropins', 'search', 'paused',
-		 *                            'auto-update-enabled', 'auto-update-disabled'.
+		 * @param array  $plugin_data An array of plugin data. See `get_plugin_data()`
+		 *                            and the {@see 'plugin_row_meta'} filter for the list
+		 *                            of possible values.
+		 * @param string $status      Status filter currently applied to the plugin list.
+		 *                            Possible values are: 'all', 'active', 'inactive',
+		 *                            'recently_activated', 'upgrade', 'mustuse', 'dropins',
+		 *                            'search', 'paused', 'auto-update-enabled', 'auto-update-disabled'.
 		 */
 		do_action( 'after_plugin_row', $plugin_file, $plugin_data, $status );
 
@@ -1292,14 +1344,17 @@ class WP_Plugins_List_Table extends WP_List_Table {
 		 * to the plugin file, relative to the plugins directory.
 		 *
 		 * @since 2.7.0
-		 * @since 5.5.0 Added 'auto-update-enabled' and 'auto-update-disabled' to possible values for `$status`.
+		 * @since 5.5.0 Added 'auto-update-enabled' and 'auto-update-disabled'
+		 *              to possible values for `$status`.
 		 *
 		 * @param string $plugin_file Path to the plugin file relative to the plugins directory.
-		 * @param array  $plugin_data An array of plugin data.
-		 * @param string $status      Status filter currently applied to the plugin list. Possible
-		 *                            values are: 'all', 'active', 'inactive', 'recently_activated',
-		 *                            'upgrade', 'mustuse', 'dropins', 'search', 'paused',
-		 *                            'auto-update-enabled', 'auto-update-disabled'.
+		 * @param array  $plugin_data An array of plugin data. See `get_plugin_data()`
+		 *                            and the {@see 'plugin_row_meta'} filter for the list
+		 *                            of possible values.
+		 * @param string $status      Status filter currently applied to the plugin list.
+		 *                            Possible values are: 'all', 'active', 'inactive',
+		 *                            'recently_activated', 'upgrade', 'mustuse', 'dropins',
+		 *                            'search', 'paused', 'auto-update-enabled', 'auto-update-disabled'.
 		 */
 		do_action( "after_plugin_row_{$plugin_file}", $plugin_file, $plugin_data, $status );
 	}
diff --git a/src/wp-admin/includes/class-wp-posts-list-table.php b/src/wp-admin/includes/class-wp-posts-list-table.php
index 213ca201d9..639bed1da4 100644
--- a/src/wp-admin/includes/class-wp-posts-list-table.php
+++ b/src/wp-admin/includes/class-wp-posts-list-table.php
@@ -817,8 +817,8 @@ class WP_Posts_List_Table extends WP_List_Table {
 		}
 
 		/*
-		 * Arrange pages into two parts: top level pages and children_pages
-		 * children_pages is two dimensional array, eg.
+		 * Arrange pages into two parts: top level pages and children_pages.
+		 * children_pages is two dimensional array. Example:
 		 * children_pages[10][] contains all sub-pages whose parent is 10.
 		 * It only takes O( N ) to arrange this and it takes O( 1 ) for subsequent lookup operations
 		 * If searching, ignore hierarchy and treat everything as top level
@@ -1636,7 +1636,7 @@ class WP_Posts_List_Table extends WP_List_Table {
 
 							<label>
 								<span class="title"><?php _e( 'Slug' ); ?></span>
-								<span class="input-text-wrap"><input type="text" name="post_name" value="" /></span>
+								<span class="input-text-wrap"><input type="text" name="post_name" value="" autocomplete="off" spellcheck="false" /></span>
 							</label>
 
 						<?php endif; // is_post_type_viewable() ?>
diff --git a/src/wp-admin/includes/class-wp-privacy-policy-content.php b/src/wp-admin/includes/class-wp-privacy-policy-content.php
index bbe479172e..54e5326ccb 100644
--- a/src/wp-admin/includes/class-wp-privacy-policy-content.php
+++ b/src/wp-admin/includes/class-wp-privacy-policy-content.php
@@ -125,6 +125,8 @@ final class WP_Privacy_Policy_Content {
 	 * Output a warning when some privacy info has changed.
 	 *
 	 * @since 4.9.6
+	 *
+	 * @global WP_Post $post Global post object.
 	 */
 	public static function policy_text_changed_notice() {
 		global $post;
@@ -303,6 +305,8 @@ final class WP_Privacy_Policy_Content {
 	 * @since 4.9.6
 	 * @since 5.0.0 The `$post` parameter was made optional.
 	 *
+	 * @global WP_Post $post Global post object.
+	 *
 	 * @param WP_Post|null $post The currently edited post. Default null.
 	 */
 	public static function notice( $post = null ) {
diff --git a/src/wp-admin/includes/class-wp-privacy-requests-table.php b/src/wp-admin/includes/class-wp-privacy-requests-table.php
index 4b2332ff9a..05dbcbc031 100644
--- a/src/wp-admin/includes/class-wp-privacy-requests-table.php
+++ b/src/wp-admin/includes/class-wp-privacy-requests-table.php
@@ -102,6 +102,8 @@ abstract class WP_Privacy_Requests_Table extends WP_List_Table {
 	 *
 	 * @since 4.9.6
 	 *
+	 * @global wpdb $wpdb WordPress database abstraction object.
+	 *
 	 * @return object Number of posts for each status.
 	 */
 	protected function get_request_counts() {
diff --git a/src/wp-admin/includes/class-wp-screen.php b/src/wp-admin/includes/class-wp-screen.php
index c49de7dde9..fdc9c2a05f 100644
--- a/src/wp-admin/includes/class-wp-screen.php
+++ b/src/wp-admin/includes/class-wp-screen.php
@@ -1008,9 +1008,6 @@ final class WP_Screen {
 		/**
 		 * Filters the screen settings text displayed in the Screen Options tab.
 		 *
-		 * This filter is currently only used on the Widgets screen to enable
-		 * accessibility mode.
-		 *
 		 * @since 3.0.0
 		 *
 		 * @param string    $screen_settings Screen settings.
diff --git a/src/wp-admin/includes/class-wp-site-health.php b/src/wp-admin/includes/class-wp-site-health.php
index 20b2f0e469..cd72670ff7 100644
--- a/src/wp-admin/includes/class-wp-site-health.php
+++ b/src/wp-admin/includes/class-wp-site-health.php
@@ -634,7 +634,7 @@ class WP_Site_Health {
 						),
 						sprintf(
 							/* translators: 1: The currently active theme. 2: The active theme's parent theme. */
-							__( 'To enhance your site&#8217;s security, you should consider removing any themes you&#8217;re not using. You should keep your current theme, %1$s, and %2$s, its parent theme.' ),
+							__( 'To enhance your site&#8217;s security, you should consider removing any themes you&#8217;re not using. You should keep your active theme, %1$s, and %2$s, its parent theme.' ),
 							$active_theme->name,
 							$active_theme->parent()->name
 						)
@@ -653,7 +653,7 @@ class WP_Site_Health {
 						),
 						sprintf(
 							/* translators: 1: The default theme for WordPress. 2: The currently active theme. 3: The active theme's parent theme. */
-							__( 'To enhance your site&#8217;s security, you should consider removing any themes you&#8217;re not using. You should keep %1$s, the default WordPress theme, %2$s, your current theme, and %3$s, its parent theme.' ),
+							__( 'To enhance your site&#8217;s security, you should consider removing any themes you&#8217;re not using. You should keep %1$s, the default WordPress theme, %2$s, your active theme, and %3$s, its parent theme.' ),
 							$default_theme ? $default_theme->name : WP_DEFAULT_THEME,
 							$active_theme->name,
 							$active_theme->parent()->name
@@ -1882,196 +1882,6 @@ class WP_Site_Health {
 		return $result;
 	}
 
-	/**
-	 * Test available disk space for updates.
-	 *
-	 * @since 5.9.0
-	 *
-	 * @return array The test results.
-	 */
-	public function get_test_available_updates_disk_space() {
-		$available_space       = function_exists( 'disk_free_space' ) ? (int) @disk_free_space( WP_CONTENT_DIR . '/upgrade/' ) : 0;
-		$available_space_in_mb = $available_space / MB_IN_BYTES;
-
-		$result = array(
-			'label'       => __( 'Disk space available to safely perform updates' ),
-			'status'      => 'good',
-			'badge'       => array(
-				'label' => __( 'Security' ),
-				'color' => 'blue',
-			),
-			'description' => sprintf(
-				/* translators: %s: Available disk space in MB or GB. */
-				'<p>' . __( '%s available disk space was detected, update routines can be performed safely.' ),
-				size_format( $available_space )
-			),
-			'actions'     => '',
-			'test'        => 'available_updates_disk_space',
-		);
-
-		if ( $available_space_in_mb < 100 ) {
-			$result['description'] = __( 'Available disk space is low, less than 100 MB available.' );
-			$result['status']      = 'recommended';
-		}
-
-		if ( $available_space_in_mb < 20 ) {
-			$result['description'] = __( 'Available disk space is critically low, less than 20 MB available. Proceed with caution, updates may fail.' );
-			$result['status']      = 'critical';
-		}
-
-		if ( ! $available_space ) {
-			$result['description'] = __( 'Could not determine available disk space for updates.' );
-			$result['status']      = 'recommended';
-		}
-
-		return $result;
-	}
-
-	/**
-	 * Test if plugin and theme updates temp-backup directories are writable or can be created.
-	 *
-	 * @since 5.9.0
-	 *
-	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
-	 *
-	 * @return array The test results.
-	 */
-	public function get_test_update_temp_backup_writable() {
-		global $wp_filesystem;
-
-		$result = array(
-			'label'       => sprintf(
-				/* translators: %s: temp-backup */
-				__( 'Plugin and theme update %s directory is writable' ),
-				'temp-backup'
-			),
-			'status'      => 'good',
-			'badge'       => array(
-				'label' => __( 'Security' ),
-				'color' => 'blue',
-			),
-			'description' => sprintf(
-				/* translators: %s: wp-content/upgrade/temp-backup */
-				'<p>' . __( 'The %s directory used to improve the stability of plugin and theme updates is writable.' ),
-				'<code>wp-content/upgrade/temp-backup</code>'
-			),
-			'actions'     => '',
-			'test'        => 'update_temp_backup_writable',
-		);
-
-		if ( ! $wp_filesystem ) {
-			if ( ! function_exists( 'WP_Filesystem' ) ) {
-				require_once wp_normalize_path( ABSPATH . '/wp-admin/includes/file.php' );
-			}
-			WP_Filesystem();
-		}
-		$wp_content = $wp_filesystem->wp_content_dir();
-
-		$upgrade_dir_exists      = $wp_filesystem->is_dir( "$wp_content/upgrade" );
-		$upgrade_dir_is_writable = $wp_filesystem->is_writable( "$wp_content/upgrade" );
-		$backup_dir_exists       = $wp_filesystem->is_dir( "$wp_content/upgrade/temp-backup" );
-		$backup_dir_is_writable  = $wp_filesystem->is_writable( "$wp_content/upgrade/temp-backup" );
-
-		$plugins_dir_exists      = $wp_filesystem->is_dir( "$wp_content/upgrade/temp-backup/plugins" );
-		$plugins_dir_is_writable = $wp_filesystem->is_writable( "$wp_content/upgrade/temp-backup/plugins" );
-		$themes_dir_exists       = $wp_filesystem->is_dir( "$wp_content/upgrade/temp-backup/themes" );
-		$themes_dir_is_writable  = $wp_filesystem->is_writable( "$wp_content/upgrade/temp-backup/themes" );
-
-		if ( $plugins_dir_exists && ! $plugins_dir_is_writable && $themes_dir_exists && ! $themes_dir_is_writable ) {
-			$result['status'] = 'critical';
-			$result['label']  = sprintf(
-				/* translators: %s: temp-backup */
-				__( 'Plugins and themes %s directories exist but are not writable' ),
-				'temp-backup'
-			);
-			$result['description'] = sprintf(
-				/* translators: 1: wp-content/upgrade/temp-backup/plugins, 2: wp-content/upgrade/temp-backup/themes. */
-				'<p>' . __( 'The %1$s and %2$s directories exist but are not writable. These directories are used to improve the stability of plugin updates. Please make sure the server has write permissions to these directories.' ) . '</p>',
-				'<code>wp-content/upgrade/temp-backup/plugins</code>',
-				'<code>wp-content/upgrade/temp-backup/themes</code>'
-			);
-			return $result;
-		}
-
-		if ( $plugins_dir_exists && ! $plugins_dir_is_writable ) {
-			$result['status'] = 'critical';
-			$result['label']  = sprintf(
-				/* translators: %s: temp-backup */
-				__( 'Plugins %s directory exists but is not writable' ),
-				'temp-backup'
-			);
-			$result['description'] = sprintf(
-				/* translators: %s: wp-content/upgrade/temp-backup/plugins */
-				'<p>' . __( 'The %s directory exists but is not writable. This directory is used to improve the stability of plugin updates. Please make sure the server has write permissions to this directory.' ) . '</p>',
-				'<code>wp-content/upgrade/temp-backup/plugins</code>'
-			);
-			return $result;
-		}
-
-		if ( $themes_dir_exists && ! $themes_dir_is_writable ) {
-			$result['status'] = 'critical';
-			$result['label']  = sprintf(
-				/* translators: %s: temp-backup */
-				__( 'Themes %s directory exists but is not writable' ),
-				'temp-backup'
-			);
-			$result['description'] = sprintf(
-				/* translators: %s: wp-content/upgrade/temp-backup/themes */
-				'<p>' . __( 'The %s directory exists but is not writable. This directory is used to improve the stability of theme updates. Please make sure the server has write permissions to this directory.' ) . '</p>',
-				'<code>wp-content/upgrade/temp-backup/themes</code>'
-			);
-			return $result;
-		}
-
-		if ( ( ! $plugins_dir_exists || ! $themes_dir_exists ) && $backup_dir_exists && ! $backup_dir_is_writable ) {
-			$result['status'] = 'critical';
-			$result['label']  = sprintf(
-				/* translators: %s: temp-backup */
-				__( 'The %s directory exists but is not writable' ),
-				'temp-backup'
-			);
-			$result['description'] = sprintf(
-				/* translators: %s: wp-content/upgrade/temp-backup */
-				'<p>' . __( 'The %s directory exists but is not writable. This directory is used to improve the stability of plugin and theme updates. Please make sure the server has write permissions to this directory.' ) . '</p>',
-				'<code>wp-content/upgrade/temp-backup</code>'
-			);
-			return $result;
-		}
-
-		if ( ! $backup_dir_exists && $upgrade_dir_exists && ! $upgrade_dir_is_writable ) {
-			$result['status'] = 'critical';
-			$result['label']  = sprintf(
-				/* translators: %s: upgrade */
-				__( 'The %s directory exists but is not writable' ),
-				'upgrade'
-			);
-			$result['description'] = sprintf(
-				/* translators: %s: wp-content/upgrade */
-				'<p>' . __( 'The %s directory exists but is not writable. This directory is used for plugin and theme updates. Please make sure the server has write permissions to this directory.' ) . '</p>',
-				'<code>wp-content/upgrade</code>'
-			);
-			return $result;
-		}
-
-		if ( ! $upgrade_dir_exists && ! $wp_filesystem->is_writable( $wp_content ) ) {
-			$result['status'] = 'critical';
-			$result['label']  = sprintf(
-				/* translators: %s: upgrade */
-				__( 'The %s directory cannot be created' ),
-				'upgrade'
-			);
-			$result['description'] = sprintf(
-				/* translators: 1: wp-content/upgrade, 2: wp-content. */
-				'<p>' . __( 'The %1$s directory does not exist, and the server does not have write permissions in %2$s to create it. This directory is used for plugin and theme updates. Please make sure the server has write permissions in %2$s.' ) . '</p>',
-				'<code>wp-content/upgrade</code>',
-				'<code>wp-content</code>'
-			);
-			return $result;
-		}
-
-		return $result;
-	}
-
 	/**
 	 * Test if loopbacks work as expected.
 	 *
@@ -2456,80 +2266,71 @@ class WP_Site_Health {
 	public static function get_tests() {
 		$tests = array(
 			'direct' => array(
-				'wordpress_version'            => array(
+				'wordpress_version'         => array(
 					'label' => __( 'WordPress Version' ),
 					'test'  => 'wordpress_version',
 				),
-				'plugin_version'               => array(
+				'plugin_version'            => array(
 					'label' => __( 'Plugin Versions' ),
 					'test'  => 'plugin_version',
 				),
-				'theme_version'                => array(
+				'theme_version'             => array(
 					'label' => __( 'Theme Versions' ),
 					'test'  => 'theme_version',
 				),
-				'php_version'                  => array(
+				'php_version'               => array(
 					'label' => __( 'PHP Version' ),
 					'test'  => 'php_version',
 				),
-				'php_extensions'               => array(
+				'php_extensions'            => array(
 					'label' => __( 'PHP Extensions' ),
 					'test'  => 'php_extensions',
 				),
-				'php_default_timezone'         => array(
+				'php_default_timezone'      => array(
 					'label' => __( 'PHP Default Timezone' ),
 					'test'  => 'php_default_timezone',
 				),
-				'php_sessions'                 => array(
+				'php_sessions'              => array(
 					'label' => __( 'PHP Sessions' ),
 					'test'  => 'php_sessions',
 				),
-				'sql_server'                   => array(
+				'sql_server'                => array(
 					'label' => __( 'Database Server version' ),
 					'test'  => 'sql_server',
 				),
-				'utf8mb4_support'              => array(
+				'utf8mb4_support'           => array(
 					'label' => __( 'MySQL utf8mb4 support' ),
 					'test'  => 'utf8mb4_support',
 				),
-				'ssl_support'                  => array(
+				'ssl_support'               => array(
 					'label' => __( 'Secure communication' ),
 					'test'  => 'ssl_support',
 				),
-				'scheduled_events'             => array(
+				'scheduled_events'          => array(
 					'label' => __( 'Scheduled events' ),
 					'test'  => 'scheduled_events',
 				),
-				'http_requests'                => array(
+				'http_requests'             => array(
 					'label' => __( 'HTTP Requests' ),
 					'test'  => 'http_requests',
 				),
-				'rest_availability'            => array(
+				'rest_availability'         => array(
 					'label'     => __( 'REST API availability' ),
 					'test'      => 'rest_availability',
 					'skip_cron' => true,
 				),
-				'debug_enabled'                => array(
+				'debug_enabled'             => array(
 					'label' => __( 'Debugging enabled' ),
 					'test'  => 'is_in_debug_mode',
 				),
-				'file_uploads'                 => array(
+				'file_uploads'              => array(
 					'label' => __( 'File uploads' ),
 					'test'  => 'file_uploads',
 				),
-				'plugin_theme_auto_updates'    => array(
+				'plugin_theme_auto_updates' => array(
 					'label' => __( 'Plugin and theme auto-updates' ),
 					'test'  => 'plugin_theme_auto_updates',
 				),
-				'update_temp_backup_writable'  => array(
-					/* translators: %s: temp-backup */
-					'label' => sprintf( __( 'Updates %s directory access' ), 'temp-backup' ),
-					'test'  => 'update_temp_backup_writable',
-				),
-				'available_updates_disk_space' => array(
-					'label' => __( 'Available disk space' ),
-					'test'  => 'available_updates_disk_space',
-				),
 			),
 			'async'  => array(
 				'dotorg_communication' => array(
diff --git a/src/wp-admin/includes/class-wp-terms-list-table.php b/src/wp-admin/includes/class-wp-terms-list-table.php
index 4823d29c9d..8d0217d40f 100644
--- a/src/wp-admin/includes/class-wp-terms-list-table.php
+++ b/src/wp-admin/includes/class-wp-terms-list-table.php
@@ -397,7 +397,7 @@ class WP_Terms_List_Table extends WP_List_Table {
 
 		$uri = wp_doing_ajax() ? wp_get_referer() : $_SERVER['REQUEST_URI'];
 
-		$edit_link = get_edit_term_link( $tag->term_id, $taxonomy, $this->screen->post_type );
+		$edit_link = get_edit_term_link( $tag, $taxonomy, $this->screen->post_type );
 
 		if ( $edit_link ) {
 			$edit_link = add_query_arg(
@@ -466,7 +466,7 @@ class WP_Terms_List_Table extends WP_List_Table {
 		$edit_link = add_query_arg(
 			'wp_http_referer',
 			urlencode( wp_unslash( $uri ) ),
-			get_edit_term_link( $tag->term_id, $taxonomy, $this->screen->post_type )
+			get_edit_term_link( $tag, $taxonomy, $this->screen->post_type )
 		);
 
 		$actions = array();
diff --git a/src/wp-admin/includes/class-wp-theme-install-list-table.php b/src/wp-admin/includes/class-wp-theme-install-list-table.php
index d9d80b3aa1..eb0ae02f18 100644
--- a/src/wp-admin/includes/class-wp-theme-install-list-table.php
+++ b/src/wp-admin/includes/class-wp-theme-install-list-table.php
@@ -251,7 +251,7 @@ class WP_Theme_Install_List_Table extends WP_Themes_List_Table {
 	 *
 	 * @global array $themes_allowedtags
 	 *
-	 * @param object $theme {
+	 * @param stdClass $theme {
 	 *     An object that contains theme data returned by the WordPress.org API.
 	 *
 	 *     @type string $name           Theme name, e.g. 'Twenty Twenty-One'.
@@ -352,7 +352,8 @@ class WP_Theme_Install_List_Table extends WP_Themes_List_Table {
 		 *
 		 * @param string[] $actions An array of theme action links. Defaults are
 		 *                          links to Install Now, Preview, and Details.
-		 * @param WP_Theme $theme   Theme object.
+		 * @param stdClass $theme   An object that contains theme data returned by the
+		 *                          WordPress.org API.
 		 */
 		$actions = apply_filters( 'theme_install_actions', $actions, $theme );
 
@@ -412,7 +413,7 @@ class WP_Theme_Install_List_Table extends WP_Themes_List_Table {
 	 * Prints the wrapper for the theme installer with a provided theme's data.
 	 * Used to make the theme installer work for no-js.
 	 *
-	 * @param object $theme - A WordPress.org Theme API object.
+	 * @param stdClass $theme A WordPress.org Theme API object.
 	 */
 	public function theme_installer_single( $theme ) {
 		?>
@@ -432,7 +433,7 @@ class WP_Theme_Install_List_Table extends WP_Themes_List_Table {
 	 *
 	 * @global array $themes_allowedtags
 	 *
-	 * @param object $theme - A WordPress.org Theme API object.
+	 * @param stdClass $theme A WordPress.org Theme API object.
 	 */
 	public function install_theme_info( $theme ) {
 		global $themes_allowedtags;
@@ -546,7 +547,7 @@ class WP_Theme_Install_List_Table extends WP_Themes_List_Table {
 	 *
 	 * @since 3.4.0
 	 *
-	 * @param object $theme - A WordPress.org Theme API object.
+	 * @param stdClass $theme A WordPress.org Theme API object.
 	 * @return string Theme status.
 	 */
 	private function _get_theme_status( $theme ) {
diff --git a/src/wp-admin/includes/class-wp-themes-list-table.php b/src/wp-admin/includes/class-wp-themes-list-table.php
index 095267c06d..233dc8c6d5 100644
--- a/src/wp-admin/includes/class-wp-themes-list-table.php
+++ b/src/wp-admin/includes/class-wp-themes-list-table.php
@@ -129,7 +129,7 @@ class WP_Themes_List_Table extends WP_List_Table {
 		// Fallthrough.
 		printf(
 			/* translators: %s: Network title. */
-			__( 'Only the current theme is available to you. Contact the %s administrator for information about accessing additional themes.' ),
+			__( 'Only the active theme is available to you. Contact the %s administrator for information about accessing additional themes.' ),
 			get_site_option( 'site_name' )
 		);
 	}
diff --git a/src/wp-admin/includes/class-wp-upgrader.php b/src/wp-admin/includes/class-wp-upgrader.php
index 225a7d4c69..8684e46871 100644
--- a/src/wp-admin/includes/class-wp-upgrader.php
+++ b/src/wp-admin/includes/class-wp-upgrader.php
@@ -133,25 +133,11 @@ class WP_Upgrader {
 	 * This will set the relationship between the skin being used and this upgrader,
 	 * and also add the generic strings to `WP_Upgrader::$strings`.
 	 *
-	 * Additionally, it will schedule a weekly task to clean up the temp-backup directory.
-	 *
 	 * @since 2.8.0
-	 * @since 5.9.0 Added the `schedule_temp_backup_cleanup()` task.
 	 */
 	public function init() {
 		$this->skin->set_upgrader( $this );
 		$this->generic_strings();
-		$this->schedule_temp_backup_cleanup();
-	}
-
-	/**
-	 * Schedule cleanup of the temp-backup directory.
-	 *
-	 * @since 5.9.0
-	 */
-	protected function schedule_temp_backup_cleanup() {
-		wp_schedule_event( time(), 'weekly', 'delete_temp_updater_backups' );
-		add_action( 'delete_temp_updater_backups', array( $this, 'delete_all_temp_backups' ) );
 	}
 
 	/**
@@ -180,13 +166,6 @@ class WP_Upgrader {
 
 		$this->strings['maintenance_start'] = __( 'Enabling Maintenance mode&#8230;' );
 		$this->strings['maintenance_end']   = __( 'Disabling Maintenance mode&#8230;' );
-
-		/* translators: %s: temp-backup */
-		$this->strings['temp_backup_mkdir_failed'] = sprintf( __( 'Could not create the %s directory.' ), 'temp-backup' );
-		/* translators: %s: temp-backup */
-		$this->strings['temp_backup_move_failed']    = sprintf( __( 'Could not move old version to the %s directory.' ), 'temp-backup' );
-		$this->strings['temp_backup_restore_failed'] = __( 'Could not restore original version.' );
-
 	}
 
 	/**
@@ -334,9 +313,6 @@ class WP_Upgrader {
 		$upgrade_files = $wp_filesystem->dirlist( $upgrade_folder );
 		if ( ! empty( $upgrade_files ) ) {
 			foreach ( $upgrade_files as $file ) {
-				if ( 'temp-backup' === $file['name'] ) {
-					continue;
-				}
 				$wp_filesystem->delete( $upgrade_folder . $file['name'], true );
 			}
 		}
@@ -404,7 +380,7 @@ class WP_Upgrader {
 	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
 	 *
 	 * @param string $remote_destination The location on the remote filesystem to be cleared.
-	 * @return bool|WP_Error True upon success, WP_Error on failure.
+	 * @return true|WP_Error True upon success, WP_Error on failure.
 	 */
 	public function clear_destination( $remote_destination ) {
 		global $wp_filesystem;
@@ -517,13 +493,6 @@ class WP_Upgrader {
 			return $res;
 		}
 
-		if ( ! empty( $args['hook_extra']['temp_backup'] ) ) {
-			$temp_backup = $this->move_to_temp_backup_dir( $args['hook_extra']['temp_backup'] );
-			if ( is_wp_error( $temp_backup ) ) {
-				return $temp_backup;
-			}
-		}
-
 		// Retain the original source and destinations.
 		$remote_source     = $args['source'];
 		$local_destination = $destination;
@@ -623,8 +592,8 @@ class WP_Upgrader {
 			}
 		}
 
-		// Move new version of item into place.
-		$result = move_dir( $source, $remote_destination );
+		// Copy new version of item into place.
+		$result = copy_dir( $source, $remote_destination );
 		if ( is_wp_error( $result ) ) {
 			if ( $args['clear_working'] ) {
 				$wp_filesystem->delete( $remote_source, true );
@@ -842,20 +811,6 @@ class WP_Upgrader {
 
 		$this->skin->set_result( $result );
 		if ( is_wp_error( $result ) ) {
-			if ( ! empty( $options['hook_extra']['temp_backup'] ) ) {
-				/*
-				 * Restore the backup on shutdown.
-				 * Actions running on `shutdown` are immune to PHP timeouts,
-				 * so in case the failure was due to a PHP timeout,
-				 * we'll still be able to properly restore the previous version.
-				 */
-				add_action(
-					'shutdown',
-					function() use ( $options ) {
-						$this->restore_temp_backup( $options['hook_extra']['temp_backup'] );
-					}
-				);
-			}
 			$this->skin->error( $result );
 
 			if ( ! method_exists( $this->skin, 'hide_process_failed' ) || ! $this->skin->hide_process_failed( $result ) ) {
@@ -868,17 +823,6 @@ class WP_Upgrader {
 
 		$this->skin->after();
 
-		// Clean up the backup kept in the temp-backup directory.
-		if ( ! empty( $options['hook_extra']['temp_backup'] ) ) {
-			// Delete the backup on `shutdown` to avoid a PHP timeout.
-			add_action(
-				'shutdown',
-				function() use ( $options ) {
-					$this->delete_temp_backup( $options['hook_extra']['temp_backup'] );
-				}
-			);
-		}
-
 		if ( ! $options['is_multi'] ) {
 
 			/**
@@ -1003,155 +947,6 @@ class WP_Upgrader {
 	public static function release_lock( $lock_name ) {
 		return delete_option( $lock_name . '.lock' );
 	}
-
-	/**
-	 * Moves the plugin/theme being updated into a temp-backup directory.
-	 *
-	 * @since 5.9.0
-	 *
-	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
-	 *
-	 * @param array $args Array of data for the temp-backup. Must include a slug, the source, and directory.
-	 * @return bool|WP_Error
-	 */
-	public function move_to_temp_backup_dir( $args ) {
-		global $wp_filesystem;
-
-		if ( empty( $args['slug'] ) || empty( $args['src'] ) || empty( $args['dir'] ) ) {
-			return false;
-		}
-
-		$dest_dir = $wp_filesystem->wp_content_dir() . 'upgrade/temp-backup/';
-		// Create the temp-backup directory if it doesn't exist.
-		if ( (
-				! $wp_filesystem->is_dir( $dest_dir )
-				&& ! $wp_filesystem->mkdir( $dest_dir )
-			) || (
-				! $wp_filesystem->is_dir( $dest_dir . $args['dir'] . '/' )
-				&& ! $wp_filesystem->mkdir( $dest_dir . $args['dir'] . '/' )
-			)
-		) {
-			return new WP_Error( 'fs_temp_backup_mkdir', $this->strings['temp_backup_mkdir_failed'] );
-		}
-
-		$src  = trailingslashit( $args['src'] ) . $args['slug'];
-		$dest = $dest_dir . $args['dir'] . '/' . $args['slug'];
-
-		// Delete the temp-backup directory if it already exists.
-		if ( $wp_filesystem->is_dir( $dest ) ) {
-			$wp_filesystem->delete( $dest, true );
-		}
-
-		// Move to the temp-backup directory.
-		if ( ! $wp_filesystem->move( $src, $dest, true ) ) {
-			return new WP_Error( 'fs_temp_backup_move', $this->strings['temp_backup_move_failed'] );
-		}
-
-		return true;
-	}
-
-	/**
-	 * Restores the plugin/theme from the temp-backup directory.
-	 *
-	 * @since 5.9.0
-	 *
-	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
-	 *
-	 * @param array $args Array of data for the temp-backup. Must include a slug, the source, and directory.
-	 * @return bool|WP_Error
-	 */
-	public function restore_temp_backup( $args ) {
-		global $wp_filesystem;
-
-		if ( empty( $args['slug'] ) || empty( $args['src'] ) || empty( $args['dir'] ) ) {
-			return false;
-		}
-
-		$src  = $wp_filesystem->wp_content_dir() . 'upgrade/temp-backup/' . $args['dir'] . '/' . $args['slug'];
-		$dest = trailingslashit( $args['src'] ) . $args['slug'];
-
-		if ( $wp_filesystem->is_dir( $src ) ) {
-			// Cleanup.
-			if ( $wp_filesystem->is_dir( $dest ) && ! $wp_filesystem->delete( $dest, true ) ) {
-				return new WP_Error( 'fs_temp_backup_delete', $this->strings['temp_backup_restore_failed'] );
-			}
-
-			// Move it.
-			if ( ! $wp_filesystem->move( $src, $dest, true ) ) {
-				return new WP_Error( 'fs_temp_backup_delete', $this->strings['temp_backup_restore_failed'] );
-			}
-		}
-
-		return true;
-	}
-
-	/**
-	 * Deletes a temp-backup.
-	 *
-	 * @since 5.9.0
-	 *
-	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
-	 *
-	 * @param array $args Array of data for the temp-backup. Must include a slug, the source, and directory.
-	 * @return bool
-	 */
-	public function delete_temp_backup( $args ) {
-		global $wp_filesystem;
-
-		if ( empty( $args['slug'] ) || empty( $args['dir'] ) ) {
-			return false;
-		}
-
-		return $wp_filesystem->delete(
-			$wp_filesystem->wp_content_dir() . "upgrade/temp-backup/{$args['dir']}/{$args['slug']}",
-			true
-		);
-	}
-
-	/**
-	 * Deletes all contents of the temp-backup directory.
-	 *
-	 * @since 5.9.0
-	 *
-	 * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
-	 */
-	public function delete_all_temp_backups() {
-		/*
-		 * Check if there's a lock, or if currently performing an Ajax request,
-		 * in which case there's a chance we're doing an update.
-		 * Reschedule for an hour from now and exit early.
-		 */
-		if ( get_option( 'core_updater.lock' ) || get_option( 'auto_updater.lock' ) || wp_doing_ajax() ) {
-			wp_schedule_single_event( time() + HOUR_IN_SECONDS, 'delete_temp_updater_backups' );
-			return;
-		}
-
-		add_action(
-			'shutdown',
-			/*
-			 * This action runs on shutdown to make sure there's no plugin updates currently running.
-			 * Using a closure in this case is OK since the action can be removed by removing the parent hook.
-			 */
-			function() {
-				global $wp_filesystem;
-
-				if ( ! $wp_filesystem ) {
-					include_once ABSPATH . '/wp-admin/includes/file.php';
-					WP_Filesystem();
-				}
-
-				$dirlist = $wp_filesystem->dirlist( $wp_filesystem->wp_content_dir() . 'upgrade/temp-backup/' );
-
-				foreach ( array_keys( $dirlist ) as $dir ) {
-					if ( '.' === $dir || '..' === $dir ) {
-						continue;
-					}
-
-					$wp_filesystem->delete( $wp_filesystem->wp_content_dir() . 'upgrade/temp-backup/' . $dir, true );
-				}
-			}
-		);
-	}
 }
 
 /** Plugin_Upgrader class */
diff --git a/src/wp-admin/includes/class-wp-users-list-table.php b/src/wp-admin/includes/class-wp-users-list-table.php
index a0a989498c..c01945e2ea 100644
--- a/src/wp-admin/includes/class-wp-users-list-table.php
+++ b/src/wp-admin/includes/class-wp-users-list-table.php
@@ -362,7 +362,7 @@ class WP_Users_List_Table extends WP_List_Table {
 			'name'     => __( 'Name' ),
 			'email'    => __( 'Email' ),
 			'role'     => __( 'Role' ),
-			'posts'    => __( 'Posts' ),
+			'posts'    => _x( 'Posts', 'post type general name' ),
 		);
 
 		if ( $this->is_site_users ) {
@@ -447,7 +447,13 @@ class WP_Users_List_Table extends WP_List_Table {
 		// Check if the user for this row is editable.
 		if ( current_user_can( 'list_users' ) ) {
 			// Set up the user editing link.
-			$edit_link = esc_url( add_query_arg( 'wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), get_edit_user_link( $user_object->ID ) ) );
+			$edit_link = esc_url(
+				add_query_arg(
+					'wp_http_referer',
+					urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ),
+					get_edit_user_link( $user_object->ID )
+				)
+			);
 
 			if ( current_user_can( 'edit_user', $user_object->ID ) ) {
 				$edit            = "<strong><a href=\"{$edit_link}\">{$user_object->user_login}</a>{$super_admin}</strong><br />";
@@ -456,10 +462,16 @@ class WP_Users_List_Table extends WP_List_Table {
 				$edit = "<strong>{$user_object->user_login}{$super_admin}</strong><br />";
 			}
 
-			if ( ! is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'delete_user', $user_object->ID ) ) {
+			if ( ! is_multisite()
+				&& get_current_user_id() !== $user_object->ID
+				&& current_user_can( 'delete_user', $user_object->ID )
+			) {
 				$actions['delete'] = "<a class='submitdelete' href='" . wp_nonce_url( "users.php?action=delete&amp;user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Delete' ) . '</a>';
 			}
-			if ( is_multisite() && current_user_can( 'remove_user', $user_object->ID ) ) {
+
+			if ( is_multisite()
+				&& current_user_can( 'remove_user', $user_object->ID )
+			) {
 				$actions['remove'] = "<a class='submitdelete' href='" . wp_nonce_url( $url . "action=remove&amp;user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Remove' ) . '</a>';
 			}
 
@@ -476,7 +488,9 @@ class WP_Users_List_Table extends WP_List_Table {
 			}
 
 			// Add a link to send the user a reset password link by email.
-			if ( get_current_user_id() !== $user_object->ID && current_user_can( 'edit_user', $user_object->ID ) ) {
+			if ( get_current_user_id() !== $user_object->ID
+				&& current_user_can( 'edit_user', $user_object->ID )
+			) {
 				$actions['resetpassword'] = "<a class='resetpassword' href='" . wp_nonce_url( "users.php?action=resetpassword&amp;users=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Send password reset' ) . '</a>';
 			}
 
@@ -615,12 +629,12 @@ class WP_Users_List_Table extends WP_List_Table {
 	}
 
 	/**
-	 * Returns an array of user roles for a given user object.
+	 * Returns an array of translated user role names for a given user object.
 	 *
 	 * @since 4.4.0
 	 *
 	 * @param WP_User $user_object The WP_User object.
-	 * @return string[] An array of user roles.
+	 * @return string[] An array of user role names keyed by role.
 	 */
 	protected function get_role_list( $user_object ) {
 		$wp_roles = wp_roles();
@@ -638,11 +652,11 @@ class WP_Users_List_Table extends WP_List_Table {
 		}
 
 		/**
-		 * Filters the returned array of roles for a user.
+		 * Filters the returned array of translated role names for a user.
 		 *
 		 * @since 4.4.0
 		 *
-		 * @param string[] $role_list   An array of user roles.
+		 * @param string[] $role_list   An array of translated user role names keyed by role.
 		 * @param WP_User  $user_object A WP_User object.
 		 */
 		return apply_filters( 'get_role_list', $role_list, $user_object );
diff --git a/src/wp-admin/includes/dashboard.php b/src/wp-admin/includes/dashboard.php
index 1b70f65879..a823666d6d 100644
--- a/src/wp-admin/includes/dashboard.php
+++ b/src/wp-admin/includes/dashboard.php
@@ -1727,8 +1727,9 @@ function wp_dashboard_browser_nag() {
 	 *
 	 * @since 3.2.0
 	 *
-	 * @param string $notice   The notice content.
-	 * @param array  $response An array containing web browser information. See `wp_check_browser_version()`.
+	 * @param string      $notice   The notice content.
+	 * @param array|false $response An array containing web browser information, or
+	 *                              false on failure. See `wp_check_browser_version()`.
 	 */
 	echo apply_filters( 'browse-happy-notice', $notice, $response ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
 }
@@ -1986,62 +1987,64 @@ function wp_dashboard_empty() {}
  * Displays a welcome panel to introduce users to WordPress.
  *
  * @since 3.3.0
+ * @since 5.9.0 Send users to the Site Editor if the active theme is block-based.
  */
 function wp_welcome_panel() {
+	list( $display_version ) = explode( '-', get_bloginfo( 'version' ) );
+	$can_customize           = current_user_can( 'customize' );
+	$is_block_theme          = wp_is_block_theme();
 	?>
 	<div class="welcome-panel-content">
-	<h2><?php _e( 'Welcome to WordPress!' ); ?></h2>
-	<p class="about-description"><?php _e( 'We&#8217;ve assembled some links to get you started:' ); ?></p>
-	<div class="welcome-panel-column-container">
-	<div class="welcome-panel-column">
-		<?php if ( current_user_can( 'customize' ) ) : ?>
-			<h3><?php _e( 'Get Started' ); ?></h3>
-			<a class="button button-primary button-hero load-customize hide-if-no-customize" href="<?php echo wp_customize_url(); ?>"><?php _e( 'Customize Your Site' ); ?></a>
-		<?php endif; ?>
-		<a class="button button-primary button-hero hide-if-customize" href="<?php echo esc_url( admin_url( 'themes.php' ) ); ?>"><?php _e( 'Customize Your Site' ); ?></a>
-		<?php if ( current_user_can( 'install_themes' ) || ( current_user_can( 'switch_themes' ) && count( wp_get_themes( array( 'allowed' => true ) ) ) > 1 ) ) : ?>
-			<?php $themes_link = current_user_can( 'customize' ) ? add_query_arg( 'autofocus[panel]', 'themes', admin_url( 'customize.php' ) ) : admin_url( 'themes.php' ); ?>
-			<p class="hide-if-no-customize">
-				<?php
-					/* translators: %s: URL to Themes panel in Customizer or Themes screen. */
-					printf( __( 'or, <a href="%s">change your theme completely</a>' ), $themes_link );
-				?>
-			</p>
-		<?php endif; ?>
-	</div>
-	<div class="welcome-panel-column">
-		<h3><?php _e( 'Next Steps' ); ?></h3>
-		<ul>
-		<?php if ( 'page' === get_option( 'show_on_front' ) && ! get_option( 'page_for_posts' ) ) : ?>
-			<li><?php printf( '<a href="%s" class="welcome-icon welcome-edit-page">' . __( 'Edit your front page' ) . '</a>', get_edit_post_link( get_option( 'page_on_front' ) ) ); ?></li>
-			<li><?php printf( '<a href="%s" class="welcome-icon welcome-add-page">' . __( 'Add additional pages' ) . '</a>', admin_url( 'post-new.php?post_type=page' ) ); ?></li>
-		<?php elseif ( 'page' === get_option( 'show_on_front' ) ) : ?>
-			<li><?php printf( '<a href="%s" class="welcome-icon welcome-edit-page">' . __( 'Edit your front page' ) . '</a>', get_edit_post_link( get_option( 'page_on_front' ) ) ); ?></li>
-			<li><?php printf( '<a href="%s" class="welcome-icon welcome-add-page">' . __( 'Add additional pages' ) . '</a>', admin_url( 'post-new.php?post_type=page' ) ); ?></li>
-			<li><?php printf( '<a href="%s" class="welcome-icon welcome-write-blog">' . __( 'Add a blog post' ) . '</a>', admin_url( 'post-new.php' ) ); ?></li>
-		<?php else : ?>
-			<li><?php printf( '<a href="%s" class="welcome-icon welcome-write-blog">' . __( 'Write your first blog post' ) . '</a>', admin_url( 'post-new.php' ) ); ?></li>
-			<li><?php printf( '<a href="%s" class="welcome-icon welcome-add-page">' . __( 'Add an About page' ) . '</a>', admin_url( 'post-new.php?post_type=page' ) ); ?></li>
-			<li><?php printf( '<a href="%s" class="welcome-icon welcome-setup-home">' . __( 'Set up your homepage' ) . '</a>', current_user_can( 'customize' ) ? add_query_arg( 'autofocus[section]', 'static_front_page', admin_url( 'customize.php' ) ) : admin_url( 'options-reading.php' ) ); ?></li>
-		<?php endif; ?>
-			<li><?php printf( '<a href="%s" class="welcome-icon welcome-view-site">' . __( 'View your site' ) . '</a>', home_url( '/' ) ); ?></li>
-		</ul>
-	</div>
-	<div class="welcome-panel-column welcome-panel-last">
-		<h3><?php _e( 'More Actions' ); ?></h3>
-		<ul>
-		<?php if ( current_theme_supports( 'widgets' ) ) : ?>
-			<li><?php printf( '<a href="%s" class="welcome-icon welcome-widgets">' . __( 'Manage widgets' ) . '</a>', admin_url( 'widgets.php' ) ); ?></li>
-		<?php endif; ?>
-		<?php if ( current_theme_supports( 'menus' ) ) : ?>
-			<li><?php printf( '<a href="%s" class="welcome-icon welcome-menus">' . __( 'Manage menus' ) . '</a>', admin_url( 'nav-menus.php' ) ); ?></li>
-		<?php endif; ?>
-		<?php if ( current_user_can( 'manage_options' ) ) : ?>
-			<li><?php printf( '<a href="%s" class="welcome-icon welcome-comments">' . __( 'Turn comments on or off' ) . '</a>', admin_url( 'options-discussion.php' ) ); ?></li>
-		<?php endif; ?>
-			<li><?php printf( '<a href="%s" class="welcome-icon welcome-learn-more">' . __( 'Learn more about getting started' ) . '</a>', __( 'https://wordpress.org/support/article/first-steps-with-wordpress/' ) ); ?></li>
-		</ul>
+	<div class="welcome-panel-header">
+		<h2><?php _e( 'Welcome to WordPress!' ); ?></h2>
+		<p>
+			<a href="<?php echo esc_url( admin_url( 'about.php' ) ); ?>">
+			<?php
+				/* translators: %s: Current WordPress version. */
+				printf( __( 'Learn more about the %s version.' ), $display_version );
+			?>
+			</a>
+		</p>
 	</div>
+	<div class="welcome-panel-column-container">
+		<div class="welcome-panel-column">
+			<div class="welcome-panel-icon-pages"></div>
+			<div class="welcome-panel-column-content">
+				<h3><?php _e( 'Author rich content with blocks and patterns' ); ?></h3>
+				<p><?php _e( 'Block patterns are pre-configured block layouts. Use them to get inspired or create new pages in a flash.' ); ?></p>
+				<a href="<?php echo esc_url( admin_url( 'post-new.php?post_type=page' ) ); ?>"><?php _e( 'Add a new page' ); ?></a>
+			</div>
+		</div>
+		<div class="welcome-panel-column">
+			<div class="welcome-panel-icon-layout"></div>
+			<div class="welcome-panel-column-content">
+			<?php if ( $is_block_theme ) : ?>
+				<h3><?php _e( 'Customize your entire site with block themes' ); ?></h3>
+				<p><?php _e( 'Design everything on your site &#8212; from the header down to the footer, all using blocks and patterns.' ); ?></p>
+				<a href="<?php echo esc_url( admin_url( 'site-editor.php' ) ); ?>"><?php _e( 'Open site editor' ); ?></a>
+			<?php else : ?>
+				<h3><?php _e( 'Start Customizing' ); ?></h3>
+				<p><?php _e( 'Configure your site&#8217;s logo, header, menus, and more in the Customizer.' ); ?></p>
+				<?php if ( $can_customize ) : ?>
+					<a class="load-customize hide-if-no-customize" href="<?php echo wp_customize_url(); ?>"><?php _e( 'Open the Customizer' ); ?></a>
+				<?php endif; ?>
+			<?php endif; ?>
+			</div>
+		</div>
+		<div class="welcome-panel-column">
+			<div class="welcome-panel-icon-styles"></div>
+			<div class="welcome-panel-column-content">
+			<?php if ( $is_block_theme ) : ?>
+				<h3><?php _e( 'Switch up your site&#8217;s look & feel with Styles' ); ?></h3>
+				<p><?php _e( 'Tweak your site, or give it a whole new look! Get creative &#8212; how about a new color palette or font?' ); ?></p>
+				<a href="<?php echo esc_url( admin_url( 'site-editor.php?styles=open' ) ); ?>"><?php _e( 'Edit styles' ); ?></a>
+			<?php else : ?>
+				<h3><?php _e( 'Discover a new way to build your site.' ); ?></h3>
+				<p><?php _e( 'There&#8217;s a new kind of WordPress theme, called a block theme, that lets you build the site you&#8217;ve always wanted &#8212; with blocks and styles.' ); ?></p>
+				<a href="<?php echo esc_url( __( 'https://wordpress.org/support/article/block-themes/' ) ); ?>"><?php _e( 'Learn about block themes' ); ?></a>
+			<?php endif; ?>
+			</div>
+		</div>
 	</div>
 	</div>
 	<?php
diff --git a/src/wp-admin/includes/deprecated.php b/src/wp-admin/includes/deprecated.php
index e8ae4e945b..de541253bb 100644
--- a/src/wp-admin/includes/deprecated.php
+++ b/src/wp-admin/includes/deprecated.php
@@ -203,7 +203,7 @@ function codepress_get_lang( $filename ) {
 }
 
 /**
- * Adds JavaScript required to make CodePress work on the theme/plugin editors.
+ * Adds JavaScript required to make CodePress work on the theme/plugin file editors.
  *
  * @since 2.8.0
  * @deprecated 3.0.0
@@ -1507,7 +1507,7 @@ function post_form_autocomplete_off() {
 function options_permalink_add_js() {
 	?>
 	<script type="text/javascript">
-		jQuery(document).ready(function() {
+		jQuery( function() {
 			jQuery('.permalink-structure input:radio').change(function() {
 				if ( 'custom' == this.value )
 					return;
@@ -1516,7 +1516,7 @@ function options_permalink_add_js() {
 			jQuery( '#permalink_structure' ).on( 'click input', function() {
 				jQuery( '#custom_selection' ).prop( 'checked', true );
 			});
-		});
+		} );
 	</script>
 	<?php
 }
diff --git a/src/wp-admin/includes/edit-tag-messages.php b/src/wp-admin/includes/edit-tag-messages.php
index fa1e2ff054..10dd9b235d 100644
--- a/src/wp-admin/includes/edit-tag-messages.php
+++ b/src/wp-admin/includes/edit-tag-messages.php
@@ -44,7 +44,7 @@ $messages['post_tag'] = array(
  *
  * @since 3.7.0
  *
- * @param array $messages The messages to be displayed.
+ * @param array[] $messages Array of arrays of messages to be displayed, keyed by taxonomy name.
  */
 $messages = apply_filters( 'term_updated_messages', $messages );
 
diff --git a/src/wp-admin/includes/file.php b/src/wp-admin/includes/file.php
index 399fdcf629..46e9ecc6bb 100644
--- a/src/wp-admin/includes/file.php
+++ b/src/wp-admin/includes/file.php
@@ -223,7 +223,7 @@ function wp_get_plugin_file_editable_extensions( $plugin ) {
 	);
 
 	/**
-	 * Filters the list of file types allowed for editing in the plugin editor.
+	 * Filters the list of file types allowed for editing in the plugin file editor.
 	 *
 	 * @since 2.8.0
 	 * @since 4.9.0 Added the `$plugin` parameter.
@@ -282,12 +282,12 @@ function wp_get_theme_file_editable_extensions( $theme ) {
 	);
 
 	/**
-	 * Filters the list of file types allowed for editing in the theme editor.
+	 * Filters the list of file types allowed for editing in the theme file editor.
 	 *
 	 * @since 4.4.0
 	 *
 	 * @param string[] $default_types An array of editable theme file extensions.
-	 * @param WP_Theme $theme         The current theme object.
+	 * @param WP_Theme $theme         The active theme object.
 	 */
 	$file_types = apply_filters( 'wp_theme_editor_filetypes', $default_types, $theme );
 
@@ -1194,8 +1194,10 @@ function download_url( $url, $timeout = 300, $signature_verification = false ) {
 			$tmpfname_disposition = '';
 		}
 
-		// Potential file name must be valid string
-		if ( $tmpfname_disposition && is_string( $tmpfname_disposition ) && ( 0 === validate_file( $tmpfname_disposition ) ) ) {
+		// Potential file name must be valid string.
+		if ( $tmpfname_disposition && is_string( $tmpfname_disposition )
+			&& ( 0 === validate_file( $tmpfname_disposition ) )
+		) {
 			if ( rename( $tmpfname, $tmpfname_disposition ) ) {
 				$tmpfname = $tmpfname_disposition;
 			}
@@ -1382,7 +1384,6 @@ function verify_file_signature( $filename, $signatures, $filename_for_errors = f
 			),
 			array(
 				'php'    => phpversion(),
-				// phpcs:ignore PHPCompatibility.Constants.NewConstants.sodium_library_versionFound
 				'sodium' => defined( 'SODIUM_LIBRARY_VERSION' ) ? SODIUM_LIBRARY_VERSION : ( defined( 'ParagonIE_Sodium_Compat::VERSION_STRING' ) ? ParagonIE_Sodium_Compat::VERSION_STRING : false ),
 			)
 		);
@@ -1394,7 +1395,10 @@ function verify_file_signature( $filename, $signatures, $filename_for_errors = f
 
 		// Allow for an old version of Sodium_Compat being loaded before the bundled WordPress one.
 		if ( method_exists( 'ParagonIE_Sodium_Compat', 'runtime_speed_test' ) ) {
-			// Run `ParagonIE_Sodium_Compat::runtime_speed_test()` in optimized integer mode, as that's what WordPress utilises during signing verifications.
+			/*
+			 * Run `ParagonIE_Sodium_Compat::runtime_speed_test()` in optimized integer mode,
+			 * as that's what WordPress utilizes during signing verifications.
+			 */
 			// phpcs:disable WordPress.NamingConventions.ValidVariableName
 			$old_fastMult                      = ParagonIE_Sodium_Compat::$fastMult;
 			ParagonIE_Sodium_Compat::$fastMult = true;
@@ -1415,7 +1419,6 @@ function verify_file_signature( $filename, $signatures, $filename_for_errors = f
 				),
 				array(
 					'php'                => phpversion(),
-					// phpcs:ignore PHPCompatibility.Constants.NewConstants.sodium_library_versionFound
 					'sodium'             => defined( 'SODIUM_LIBRARY_VERSION' ) ? SODIUM_LIBRARY_VERSION : ( defined( 'ParagonIE_Sodium_Compat::VERSION_STRING' ) ? ParagonIE_Sodium_Compat::VERSION_STRING : false ),
 					'polyfill_is_fast'   => false,
 					'max_execution_time' => ini_get( 'max_execution_time' ),
@@ -1489,7 +1492,6 @@ function verify_file_signature( $filename, $signatures, $filename_for_errors = f
 			'skipped_key' => $skipped_key,
 			'skipped_sig' => $skipped_signature,
 			'php'         => phpversion(),
-			// phpcs:ignore PHPCompatibility.Constants.NewConstants.sodium_library_versionFound
 			'sodium'      => defined( 'SODIUM_LIBRARY_VERSION' ) ? SODIUM_LIBRARY_VERSION : ( defined( 'ParagonIE_Sodium_Compat::VERSION_STRING' ) ? ParagonIE_Sodium_Compat::VERSION_STRING : false ),
 		)
 	);
@@ -1662,7 +1664,7 @@ function _unzip_file_ziparchive( $file, $to, $needed_dirs = array() ) {
 	 * Require we have enough space to unzip the file and copy its contents, with a 10% buffer.
 	 */
 	if ( wp_doing_cron() ) {
-		$available_space = @disk_free_space( WP_CONTENT_DIR );
+		$available_space = function_exists( 'disk_free_space' ) ? @disk_free_space( WP_CONTENT_DIR ) : false;
 
 		if ( $available_space && ( $uncompressed_size * 2.1 ) > $available_space ) {
 			return new WP_Error(
@@ -1803,7 +1805,7 @@ function _unzip_file_pclzip( $file, $to, $needed_dirs = array() ) {
 	 * Require we have enough space to unzip the file and copy its contents, with a 10% buffer.
 	 */
 	if ( wp_doing_cron() ) {
-		$available_space = @disk_free_space( WP_CONTENT_DIR );
+		$available_space = function_exists( 'disk_free_space' ) ? @disk_free_space( WP_CONTENT_DIR ) : false;
 
 		if ( $available_space && ( $uncompressed_size * 2.1 ) > $available_space ) {
 			return new WP_Error(
@@ -1941,34 +1943,6 @@ function copy_dir( $from, $to, $skip_list = array() ) {
 	return true;
 }
 
-/**
- * Moves a directory from one location to another via the rename() PHP function.
- * If the renaming failed, falls back to copy_dir().
- *
- * Assumes that WP_Filesystem() has already been called and setup.
- *
- * @since 5.9.0
- *
- * @global WP_Filesystem_Base $wp_filesystem WordPress filesystem subclass.
- *
- * @param string $from Source directory.
- * @param string $to   Destination directory.
- * @return true|WP_Error True on success, WP_Error on failure.
- */
-function move_dir( $from, $to ) {
-	global $wp_filesystem;
-
-	$wp_filesystem->rmdir( $to );
-	if ( @rename( $from, $to ) ) {
-		return true;
-	}
-
-	$wp_filesystem->mkdir( $to );
-	$result = copy_dir( $from, $to );
-
-	return $result;
-}
-
 /**
  * Initializes and connects the WordPress Filesystem Abstraction classes.
  *
diff --git a/src/wp-admin/includes/image.php b/src/wp-admin/includes/image.php
index d8d5d5b34b..627fdfb4b5 100644
--- a/src/wp-admin/includes/image.php
+++ b/src/wp-admin/includes/image.php
@@ -75,7 +75,8 @@ function wp_crop_image( $src, $src_x, $src_y, $src_w, $src_h, $dst_w, $dst_h, $s
  * @since 5.3.0
  *
  * @param int $attachment_id The image attachment post ID.
- * @return array An array of the image sub-sizes that are currently defined but don't exist for this image.
+ * @return array[] Associative array of arrays of image sub-size information for
+ *                 missing image sizes, keyed by image size name.
  */
 function wp_get_missing_image_subsizes( $attachment_id ) {
 	if ( ! wp_attachment_is_image( $attachment_id ) ) {
@@ -131,9 +132,10 @@ function wp_get_missing_image_subsizes( $attachment_id ) {
 	 *
 	 * @since 5.3.0
 	 *
-	 * @param array $missing_sizes Array with the missing image sub-sizes.
-	 * @param array $image_meta    The image meta data.
-	 * @param int   $attachment_id The image attachment post ID.
+	 * @param array[] $missing_sizes Associative array of arrays of image sub-size information for
+	 *                               missing image sizes, keyed by image size name.
+	 * @param array   $image_meta    The image meta data.
+	 * @param int     $attachment_id The image attachment post ID.
 	 */
 	return apply_filters( 'wp_get_missing_image_subsizes', $missing_sizes, $image_meta, $attachment_id );
 }
@@ -220,7 +222,7 @@ function _wp_image_meta_replace_original( $saved_data, $original_file, $image_me
  * @since 5.3.0
  *
  * @param string $file          Full path to the image file.
- * @param int    $attachment_id Attachment Id to process.
+ * @param int    $attachment_id Attachment ID to process.
  * @return array The image attachment meta data.
  */
 function wp_create_image_subsizes( $file, $attachment_id ) {
@@ -378,7 +380,7 @@ function wp_create_image_subsizes( $file, $attachment_id ) {
  * @param array  $new_sizes     Array defining what sizes to create.
  * @param string $file          Full path to the image file.
  * @param array  $image_meta    The attachment meta data array.
- * @param int    $attachment_id Attachment Id to process.
+ * @param int    $attachment_id Attachment ID to process.
  * @return array The attachment meta data with updated `sizes` array. Includes an array of errors encountered while resizing.
  */
 function _wp_make_subsizes( $new_sizes, $file, $image_meta, $attachment_id ) {
@@ -468,8 +470,8 @@ function _wp_make_subsizes( $new_sizes, $file, $image_meta, $attachment_id ) {
  *
  * @since 2.1.0
  *
- * @param int    $attachment_id Attachment Id to process.
- * @param string $file          Filepath of the Attached image.
+ * @param int    $attachment_id Attachment ID to process.
+ * @param string $file          Filepath of the attached image.
  * @return array Metadata for attachment.
  */
 function wp_generate_attachment_metadata( $attachment_id, $file ) {
@@ -646,19 +648,40 @@ function wp_generate_attachment_metadata( $attachment_id, $file ) {
  *
  * @since 2.5.0
  *
- * @param string $str
- * @return int|float
+ * @param string $str Fraction string.
+ * @return int|float Returns calculated fraction or integer 0 on invalid input.
  */
 function wp_exif_frac2dec( $str ) {
-	if ( false === strpos( $str, '/' ) ) {
-		return $str;
+	if ( ! is_scalar( $str ) || is_bool( $str ) ) {
+		return 0;
+	}
+
+	if ( ! is_string( $str ) ) {
+		return $str; // This can only be an integer or float, so this is fine.
+	}
+
+	// Fractions passed as a string must contain a single `/`.
+	if ( substr_count( $str, '/' ) !== 1 ) {
+		if ( is_numeric( $str ) ) {
+			return (float) $str;
+		}
+
+		return 0;
 	}
 
 	list( $numerator, $denominator ) = explode( '/', $str );
-	if ( ! empty( $denominator ) ) {
-		return $numerator / $denominator;
+
+	// Both the numerator and the denominator must be numbers.
+	if ( ! is_numeric( $numerator ) || ! is_numeric( $denominator ) ) {
+		return 0;
+	}
+
+	// The denominator must not be zero.
+	if ( 0 == $denominator ) { // phpcs:ignore WordPress.PHP.StrictComparisons.LooseComparison -- Deliberate loose comparison.
+		return 0;
 	}
-	return $str;
+
+	return $numerator / $denominator;
 }
 
 /**
@@ -666,8 +689,8 @@ function wp_exif_frac2dec( $str ) {
  *
  * @since 2.5.0
  *
- * @param string $str
- * @return int
+ * @param string $str A date string expected to be in Exif format (Y:m:d H:i:s).
+ * @return int|false The unix timestamp, or false on failure.
  */
 function wp_exif_date2ts( $str ) {
 	list( $date, $time ) = explode( ' ', trim( $str ) );
@@ -793,7 +816,8 @@ function wp_read_image_metadata( $file ) {
 	 *
 	 * @since 2.5.0
 	 *
-	 * @param array $image_types Image types to check for exif data.
+	 * @param int[] $image_types Array of image types to check for exif data. Each value
+	 *                           is usually one of the `IMAGETYPE_*` constants.
 	 */
 	$exif_image_types = apply_filters( 'wp_read_image_metadata_types', array( IMAGETYPE_JPEG, IMAGETYPE_TIFF_II, IMAGETYPE_TIFF_MM ) );
 
@@ -840,7 +864,7 @@ function wp_read_image_metadata( $file ) {
 		if ( empty( $meta['copyright'] ) && ! empty( $exif['Copyright'] ) ) {
 			$meta['copyright'] = trim( $exif['Copyright'] );
 		}
-		if ( ! empty( $exif['FNumber'] ) ) {
+		if ( ! empty( $exif['FNumber'] ) && is_scalar( $exif['FNumber'] ) ) {
 			$meta['aperture'] = round( wp_exif_frac2dec( $exif['FNumber'] ), 2 );
 		}
 		if ( ! empty( $exif['Model'] ) ) {
@@ -850,14 +874,20 @@ function wp_read_image_metadata( $file ) {
 			$meta['created_timestamp'] = wp_exif_date2ts( $exif['DateTimeDigitized'] );
 		}
 		if ( ! empty( $exif['FocalLength'] ) ) {
-			$meta['focal_length'] = (string) wp_exif_frac2dec( $exif['FocalLength'] );
+			$meta['focal_length'] = (string) $exif['FocalLength'];
+			if ( is_scalar( $exif['FocalLength'] ) ) {
+				$meta['focal_length'] = (string) wp_exif_frac2dec( $exif['FocalLength'] );
+			}
 		}
 		if ( ! empty( $exif['ISOSpeedRatings'] ) ) {
 			$meta['iso'] = is_array( $exif['ISOSpeedRatings'] ) ? reset( $exif['ISOSpeedRatings'] ) : $exif['ISOSpeedRatings'];
 			$meta['iso'] = trim( $meta['iso'] );
 		}
 		if ( ! empty( $exif['ExposureTime'] ) ) {
-			$meta['shutter_speed'] = (string) wp_exif_frac2dec( $exif['ExposureTime'] );
+			$meta['shutter_speed'] = (string) $exif['ExposureTime'];
+			if ( is_scalar( $exif['ExposureTime'] ) ) {
+				$meta['shutter_speed'] = (string) wp_exif_frac2dec( $exif['ExposureTime'] );
+			}
 		}
 		if ( ! empty( $exif['Orientation'] ) ) {
 			$meta['orientation'] = $exif['Orientation'];
@@ -917,7 +947,7 @@ function file_is_valid_image( $path ) {
  * @return bool True if suitable, false if not suitable.
  */
 function file_is_displayable_image( $path ) {
-	$displayable_image_types = array( IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_BMP, IMAGETYPE_ICO, IMAGETYPE_WEBP ); // phpcs:ignore PHPCompatibility.Constants.NewConstants.imagetype_webpFound
+	$displayable_image_types = array( IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, IMAGETYPE_BMP, IMAGETYPE_ICO, IMAGETYPE_WEBP );
 
 	$info = wp_getimagesize( $path );
 	if ( empty( $info ) ) {
diff --git a/src/wp-admin/includes/media.php b/src/wp-admin/includes/media.php
index b015836a8b..d9dcbd5d7d 100644
--- a/src/wp-admin/includes/media.php
+++ b/src/wp-admin/includes/media.php
@@ -282,7 +282,7 @@ function media_send_to_editor( $html ) {
  *
  * @since 2.5.0
  *
- * @param string $file_id   Index of the `$_FILES` array that the file was sent. Required.
+ * @param string $file_id   Index of the `$_FILES` array that the file was sent.
  * @param int    $post_id   The post ID of a post to attach the media item to. Required, but can
  *                          be set to 0, creating a media item that has no relationship to a post.
  * @param array  $post_data Optional. Overwrite some of the attachment.
@@ -533,7 +533,7 @@ function wp_iframe( $content_func, ...$args ) {
 
 	?>
 	<script type="text/javascript">
-	addLoadEvent = function(func){if(typeof jQuery!=='undefined')jQuery(document).ready(func);else if(typeof wpOnload!=='function'){wpOnload=func;}else{var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}};
+	addLoadEvent = function(func){if(typeof jQuery!=='undefined')jQuery(function(){func();});else if(typeof wpOnload!=='function'){wpOnload=func;}else{var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}};
 	var ajaxurl = '<?php echo esc_js( admin_url( 'admin-ajax.php', 'relative' ) ); ?>', pagenow = 'media-upload-popup', adminpage = 'media-upload-popup',
 	isRtl = <?php echo (int) is_rtl(); ?>;
 	</script>
@@ -2501,11 +2501,11 @@ function media_upload_type_url_form( $type = null, $errors = null, $id = null )
 	}
 	};
 
-	jQuery(document).ready( function($) {
+	jQuery( function($) {
 		$('.media-types input').click( function() {
 			$('table.describe').toggleClass('not-image', $('#not-image').prop('checked') );
 		});
-	});
+	} );
 	</script>
 
 	<div id="media-items">
@@ -3558,7 +3558,10 @@ function wp_read_video_metadata( $file ) {
 		require ABSPATH . WPINC . '/ID3/getid3.php';
 	}
 
-	$id3  = new getID3();
+	$id3 = new getID3();
+	// Required to get the `created_timestamp` value.
+	$id3->options_audiovideo_quicktime_ReturnAtomData = true; // phpcs:ignore WordPress.NamingConventions.ValidVariableName
+
 	$data = $id3->analyze( $file );
 
 	if ( isset( $data['video']['lossless'] ) ) {
@@ -3641,7 +3644,7 @@ function wp_read_video_metadata( $file ) {
 	 * @param array  $metadata       Filtered Video metadata.
 	 * @param string $file           Path to video file.
 	 * @param string $file_format    File format of video, as analyzed by getID3.
-	 * @param string $data           Raw metadata from getID3.
+	 * @param array  $data           Raw metadata from getID3.
 	 */
 	return apply_filters( 'wp_read_video_metadata', $metadata, $file, $file_format, $data );
 }
@@ -3669,7 +3672,10 @@ function wp_read_audio_metadata( $file ) {
 		require ABSPATH . WPINC . '/ID3/getid3.php';
 	}
 
-	$id3  = new getID3();
+	$id3 = new getID3();
+	// Required to get the `created_timestamp` value.
+	$id3->options_audiovideo_quicktime_ReturnAtomData = true; // phpcs:ignore WordPress.NamingConventions.ValidVariableName
+
 	$data = $id3->analyze( $file );
 
 	if ( ! empty( $data['audio'] ) ) {
@@ -3740,17 +3746,17 @@ function wp_get_media_creation_timestamp( $metadata ) {
 
 		case 'matroska':
 		case 'webm':
-			if ( isset( $metadata['matroska']['comments']['creation_time']['0'] ) ) {
-				$creation_date = strtotime( $metadata['matroska']['comments']['creation_time']['0'] );
-			} elseif ( isset( $metadata['matroska']['info']['0']['DateUTC_unix'] ) ) {
-				$creation_date = (int) $metadata['matroska']['info']['0']['DateUTC_unix'];
+			if ( isset( $metadata['matroska']['comments']['creation_time'][0] ) ) {
+				$creation_date = strtotime( $metadata['matroska']['comments']['creation_time'][0] );
+			} elseif ( isset( $metadata['matroska']['info'][0]['DateUTC_unix'] ) ) {
+				$creation_date = (int) $metadata['matroska']['info'][0]['DateUTC_unix'];
 			}
 			break;
 
 		case 'quicktime':
 		case 'mp4':
-			if ( isset( $metadata['quicktime']['moov']['subatoms']['0']['creation_time_unix'] ) ) {
-				$creation_date = (int) $metadata['quicktime']['moov']['subatoms']['0']['creation_time_unix'];
+			if ( isset( $metadata['quicktime']['moov']['subatoms'][0]['creation_time_unix'] ) ) {
+				$creation_date = (int) $metadata['quicktime']['moov']['subatoms'][0]['creation_time_unix'];
 			}
 			break;
 	}
diff --git a/src/wp-admin/includes/meta-boxes.php b/src/wp-admin/includes/meta-boxes.php
index c14ae52ddc..6a4fc17d2f 100644
--- a/src/wp-admin/includes/meta-boxes.php
+++ b/src/wp-admin/includes/meta-boxes.php
@@ -485,7 +485,7 @@ function post_format_meta_box( $post, $box ) {
 			if ( ! $post_format ) {
 				$post_format = '0';
 			}
-			// Add in the current one if it isn't there yet, in case the current theme doesn't support it.
+			// Add in the current one if it isn't there yet, in case the active theme doesn't support it.
 			if ( $post_format && ! in_array( $post_format, $post_formats[0], true ) ) {
 				$post_formats[0][] = $post_format;
 			}
@@ -865,7 +865,7 @@ function post_comment_meta_box( $post ) {
 		$hidden = get_hidden_meta_boxes( get_current_screen() );
 		if ( ! in_array( 'commentsdiv', $hidden, true ) ) {
 			?>
-			<script type="text/javascript">jQuery(document).ready(function(){commentsBox.get(<?php echo $total; ?>, 10);});</script>
+			<script type="text/javascript">jQuery(function(){commentsBox.get(<?php echo $total; ?>, 10);});</script>
 			<?php
 		}
 
@@ -984,8 +984,8 @@ function page_attributes_meta_box( $post ) {
 		 *
 		 * @since 4.4.0
 		 *
-		 * @param string  $template The template used for the current post.
-		 * @param WP_Post $post     The current post.
+		 * @param string|false $template The template used for the current post.
+		 * @param WP_Post      $post     The current post.
 		 */
 		do_action( 'page_attributes_meta_box_template', $template, $post );
 		?>
@@ -1364,12 +1364,12 @@ function link_advanced_meta_box( $link ) {
 		<th scope="row"><label for="link_rating"><?php _e( 'Rating' ); ?></label></th>
 		<td><select name="link_rating" id="link_rating" size="1">
 		<?php
-		for ( $parsed_args = 0; $parsed_args <= 10; $parsed_args++ ) {
-			echo '<option value="' . $parsed_args . '"';
-			if ( isset( $link->link_rating ) && $link->link_rating == $parsed_args ) {
+		for ( $rating = 0; $rating <= 10; $rating++ ) {
+			echo '<option value="' . $rating . '"';
+			if ( isset( $link->link_rating ) && $link->link_rating == $rating ) {
 				echo ' selected="selected"';
 			}
-			echo( '>' . $parsed_args . '</option>' );
+			echo '>' . $rating . '</option>';
 		}
 		?>
 		</select>&nbsp;<?php _e( '(Leave at 0 for no rating.)' ); ?>
diff --git a/src/wp-admin/includes/misc.php b/src/wp-admin/includes/misc.php
index 70f6edde2b..6143b861fb 100644
--- a/src/wp-admin/includes/misc.php
+++ b/src/wp-admin/includes/misc.php
@@ -309,7 +309,7 @@ function iis7_save_url_rewrite_rules() {
 }
 
 /**
- * Update the "recently-edited" file for the plugin or theme editor.
+ * Update the "recently-edited" file for the plugin or theme file editor.
  *
  * @since 1.5.0
  *
@@ -332,7 +332,7 @@ function update_recently_edited( $file ) {
 }
 
 /**
- * Makes a tree structure for the theme editor's file list.
+ * Makes a tree structure for the theme file editor's file list.
  *
  * @since 4.9.0
  * @access private
@@ -354,7 +354,7 @@ function wp_make_theme_file_tree( $allowed_files ) {
 }
 
 /**
- * Outputs the formatted file list for the theme editor.
+ * Outputs the formatted file list for the theme file editor.
  *
  * @since 4.9.0
  * @access private
@@ -425,7 +425,7 @@ function wp_print_theme_file_tree( $tree, $level = 2, $size = 1, $index = 1 ) {
 }
 
 /**
- * Makes a tree structure for the plugin editor's file list.
+ * Makes a tree structure for the plugin file editor's file list.
  *
  * @since 4.9.0
  * @access private
@@ -447,7 +447,7 @@ function wp_make_plugin_file_tree( $plugin_editable_files ) {
 }
 
 /**
- * Outputs the formatted file list for the plugin editor.
+ * Outputs the formatted file list for the plugin file editor.
  *
  * @since 4.9.0
  * @access private
diff --git a/src/wp-admin/includes/ms.php b/src/wp-admin/includes/ms.php
index 76af47f8af..ad9dbec3b2 100644
--- a/src/wp-admin/includes/ms.php
+++ b/src/wp-admin/includes/ms.php
@@ -12,15 +12,15 @@
  *
  * @since 3.0.0
  *
- * @param array $file $_FILES array for a given file.
- * @return array $_FILES array with 'error' key set if file exceeds quota. 'error' is empty otherwise.
+ * @param array $file An element from the `$_FILES` array for a given file.
+ * @return array The `$_FILES` array element with 'error' key set if file exceeds quota. 'error' is empty otherwise.
  */
 function check_upload_size( $file ) {
 	if ( get_site_option( 'upload_space_check_disabled' ) ) {
 		return $file;
 	}
 
-	if ( '0' != $file['error'] ) { // There's already an error.
+	if ( $file['error'] > 0 ) { // There's already an error.
 		return $file;
 	}
 
@@ -45,7 +45,7 @@ function check_upload_size( $file ) {
 		$file['error'] = __( 'You have used your space quota. Please delete files before uploading.' );
 	}
 
-	if ( '0' != $file['error'] && ! isset( $_POST['html-upload'] ) && ! wp_doing_ajax() ) {
+	if ( $file['error'] > 0 && ! isset( $_POST['html-upload'] ) && ! wp_doing_ajax() ) {
 		wp_die( $file['error'] . ' <a href="javascript:history.go(-1)">' . __( 'Back' ) . '</a>' );
 	}
 
@@ -66,8 +66,10 @@ function check_upload_size( $file ) {
 function wpmu_delete_blog( $blog_id, $drop = false ) {
 	global $wpdb;
 
+	$blog_id = (int) $blog_id;
+
 	$switch = false;
-	if ( get_current_blog_id() != $blog_id ) {
+	if ( get_current_blog_id() !== $blog_id ) {
 		$switch = true;
 		switch_to_blog( $blog_id );
 	}
@@ -82,7 +84,10 @@ function wpmu_delete_blog( $blog_id, $drop = false ) {
 	}
 
 	// Don't destroy the initial, main, or root blog.
-	if ( $drop && ( 1 == $blog_id || is_main_site( $blog_id ) || ( $blog->path == $current_network->path && $blog->domain == $current_network->domain ) ) ) {
+	if ( $drop
+		&& ( 1 === $blog_id || is_main_site( $blog_id )
+			|| ( $blog->path === $current_network->path && $blog->domain === $current_network->domain ) )
+	) {
 		$drop = false;
 	}
 
@@ -702,7 +707,7 @@ function site_admin_notice() {
 		return;
 	}
 
-	if ( get_site_option( 'wpmu_upgrade_site' ) != $wp_db_version ) {
+	if ( (int) get_site_option( 'wpmu_upgrade_site' ) !== $wp_db_version ) {
 		echo "<div class='update-nag notice notice-warning inline'>" . sprintf(
 			/* translators: %s: URL to Upgrade Network screen. */
 			__( 'Thank you for Updating! Please visit the <a href="%s">Upgrade Network</a> page to update all your sites.' ),
@@ -742,13 +747,16 @@ function avoid_blog_page_permalink_collision( $data, $postarr ) {
 
 	$post_name = $data['post_name'];
 	$c         = 0;
+
 	while ( $c < 10 && get_id_from_blogname( $post_name ) ) {
 		$post_name .= mt_rand( 1, 10 );
-		$c ++;
+		$c++;
 	}
-	if ( $post_name != $data['post_name'] ) {
+
+	if ( $post_name !== $data['post_name'] ) {
 		$data['post_name'] = $post_name;
 	}
+
 	return $data;
 }
 
@@ -769,14 +777,14 @@ function choose_primary_blog() {
 		<td>
 		<?php
 		$all_blogs    = get_blogs_of_user( get_current_user_id() );
-		$primary_blog = get_user_meta( get_current_user_id(), 'primary_blog', true );
+		$primary_blog = (int) get_user_meta( get_current_user_id(), 'primary_blog', true );
 		if ( count( $all_blogs ) > 1 ) {
 			$found = false;
 			?>
 			<select name="primary_blog" id="primary_blog">
 				<?php
 				foreach ( (array) $all_blogs as $blog ) {
-					if ( $primary_blog == $blog->userblog_id ) {
+					if ( $blog->userblog_id === $primary_blog ) {
 						$found = true;
 					}
 					?>
@@ -790,10 +798,10 @@ function choose_primary_blog() {
 				$blog = reset( $all_blogs );
 				update_user_meta( get_current_user_id(), 'primary_blog', $blog->userblog_id );
 			}
-		} elseif ( count( $all_blogs ) == 1 ) {
+		} elseif ( 1 === count( $all_blogs ) ) {
 			$blog = reset( $all_blogs );
 			echo esc_url( get_home_url( $blog->userblog_id ) );
-			if ( $primary_blog != $blog->userblog_id ) { // Set the primary blog again if it's out of sync with blog list.
+			if ( $blog->userblog_id !== $primary_blog ) { // Set the primary blog again if it's out of sync with blog list.
 				update_user_meta( get_current_user_id(), 'primary_blog', $blog->userblog_id );
 			}
 		} else {
@@ -818,7 +826,7 @@ function choose_primary_blog() {
  * @return bool True if network can be edited, otherwise false.
  */
 function can_edit_network( $network_id ) {
-	if ( get_current_network_id() == $network_id ) {
+	if ( get_current_network_id() === (int) $network_id ) {
 		$result = true;
 	} else {
 		$result = false;
@@ -878,7 +886,7 @@ function confirm_delete_users( $users ) {
 	<?php
 	$allusers = (array) $_POST['allusers'];
 	foreach ( $allusers as $user_id ) {
-		if ( '' !== $user_id && '0' != $user_id ) {
+		if ( '' !== $user_id && '0' !== $user_id ) {
 			$delete_user = get_userdata( $user_id );
 
 			if ( ! current_user_can( 'delete_user', $delete_user->ID ) ) {
@@ -1002,7 +1010,7 @@ function confirm_delete_users( $users ) {
 function network_settings_add_js() {
 	?>
 <script type="text/javascript">
-jQuery(document).ready( function($) {
+jQuery( function($) {
 	var languageSelect = $( '#WPLANG' );
 	$( 'form' ).on( 'submit', function() {
 		// Don't show a spinner for English and installed languages,
@@ -1011,7 +1019,7 @@ jQuery(document).ready( function($) {
 			$( '#submit', this ).after( '<span class="spinner language-install-spinner is-active" />' );
 		}
 	});
-});
+} );
 </script>
 	<?php
 }
diff --git a/src/wp-admin/includes/options.php b/src/wp-admin/includes/options.php
index 1ae7b8c8dd..68e9138a2f 100644
--- a/src/wp-admin/includes/options.php
+++ b/src/wp-admin/includes/options.php
@@ -34,7 +34,7 @@ function options_discussion_add_js() {
 function options_general_add_js() {
 	?>
 <script type="text/javascript">
-	jQuery(document).ready(function($){
+	jQuery( function($) {
 		var $siteName = $( '#wp-admin-bar-site-name' ).children( 'a' ).first(),
 			homeURL = ( <?php echo wp_json_encode( get_home_url() ); ?> || '' ).replace( /^(https?:\/\/)?(www\.)?/, '' );
 
@@ -96,7 +96,7 @@ function options_general_add_js() {
 				$( '#submit', this ).after( '<span class="spinner language-install-spinner is-active" />' );
 			}
 		});
-	});
+	} );
 </script>
 	<?php
 }
@@ -109,7 +109,7 @@ function options_general_add_js() {
 function options_reading_add_js() {
 	?>
 <script type="text/javascript">
-	jQuery(document).ready(function($){
+	jQuery( function($) {
 		var section = $('#front-static-pages'),
 			staticPage = section.find('input:radio[value="page"]'),
 			selects = section.find('select'),
@@ -118,7 +118,7 @@ function options_reading_add_js() {
 			};
 		check_disabled();
 		section.find( 'input:radio' ).on( 'change', check_disabled );
-	});
+	} );
 </script>
 	<?php
 }
diff --git a/src/wp-admin/includes/plugin-install.php b/src/wp-admin/includes/plugin-install.php
index 6aaf71b9ab..747f461331 100644
--- a/src/wp-admin/includes/plugin-install.php
+++ b/src/wp-admin/includes/plugin-install.php
@@ -136,7 +136,7 @@ function plugins_api( $action, $args = array() ) {
 	/**
 	 * Filters the response for the current WordPress.org Plugin Installation API request.
 	 *
-	 * Passing a non-false value will effectively short-circuit the WordPress.org API request.
+	 * Returning a non-false value will effectively short-circuit the WordPress.org API request.
 	 *
 	 * If `$action` is 'query_plugins' or 'plugin_information', an object MUST be passed.
 	 * If `$action` is 'hot_tags' or 'hot_categories', an array should be passed.
@@ -697,7 +697,7 @@ function install_plugin_information() {
 				?>
 				</li>
 			<?php } if ( ! empty( $api->slug ) && empty( $api->external ) ) { ?>
-				<li><a target="_blank" href="<?php echo __( 'https://wordpress.org/plugins/' ) . $api->slug; ?>/"><?php _e( 'WordPress.org Plugin Page &#187;' ); ?></a></li>
+				<li><a target="_blank" href="<?php echo esc_url( __( 'https://wordpress.org/plugins/' ) . $api->slug ); ?>/"><?php _e( 'WordPress.org Plugin Page &#187;' ); ?></a></li>
 			<?php } if ( ! empty( $api->homepage ) ) { ?>
 				<li><a target="_blank" href="<?php echo esc_url( $api->homepage ); ?>"><?php _e( 'Plugin Homepage &#187;' ); ?></a></li>
 			<?php } if ( ! empty( $api->donate_link ) && empty( $api->contributors ) ) { ?>
diff --git a/src/wp-admin/includes/plugin.php b/src/wp-admin/includes/plugin.php
index faea96f43a..3850b41f3d 100644
--- a/src/wp-admin/includes/plugin.php
+++ b/src/wp-admin/includes/plugin.php
@@ -54,17 +54,19 @@
  *     Plugin data. Values will be empty if not supplied by the plugin.
  *
  *     @type string $Name        Name of the plugin. Should be unique.
- *     @type string $Title       Title of the plugin and link to the plugin's site (if set).
- *     @type string $Description Plugin description.
- *     @type string $Author      Author's name.
- *     @type string $AuthorURI   Author's website address (if set).
+ *     @type string $PluginURI   Plugin URI.
  *     @type string $Version     Plugin version.
+ *     @type string $Description Plugin description.
+ *     @type string $Author      Plugin author's name.
+ *     @type string $AuthorURI   Plugin author's website address (if set).
  *     @type string $TextDomain  Plugin textdomain.
- *     @type string $DomainPath  Plugins relative directory path to .mo files.
+ *     @type string $DomainPath  Plugin's relative directory path to .mo files.
  *     @type bool   $Network     Whether the plugin can only be activated network-wide.
  *     @type string $RequiresWP  Minimum required version of WordPress.
  *     @type string $RequiresPHP Minimum required version of PHP.
  *     @type string $UpdateURI   ID of the plugin for update purposes, should be a URI.
+ *     @type string $Title       Title of the plugin and link to the plugin's site (if set).
+ *     @type string $AuthorName  Plugin author's name.
  * }
  */
 function get_plugin_data( $plugin_file, $markup = true, $translate = true ) {
@@ -129,19 +131,8 @@ function get_plugin_data( $plugin_file, $markup = true, $translate = true ) {
  * @param bool   $markup      Optional. If the returned data should have HTML markup applied.
  *                            Default true.
  * @param bool   $translate   Optional. If the returned data should be translated. Default true.
- * @return array {
- *     Plugin data. Values will be empty if not supplied by the plugin.
- *
- *     @type string $Name        Name of the plugin. Should be unique.
- *     @type string $Title       Title of the plugin and link to the plugin's site (if set).
- *     @type string $Description Plugin description.
- *     @type string $Author      Author's name.
- *     @type string $AuthorURI   Author's website address (if set).
- *     @type string $Version     Plugin version.
- *     @type string $TextDomain  Plugin textdomain.
- *     @type string $DomainPath  Plugins relative directory path to .mo files.
- *     @type bool   $Network     Whether the plugin can only be activated network-wide.
- * }
+ * @return array Plugin data. Values will be empty if not supplied by the plugin.
+ *               See get_plugin_data() for the list of possible values.
  */
 function _get_plugin_data_markup_translate( $plugin_file, $plugin_data, $markup = true, $translate = true ) {
 
@@ -1338,6 +1329,21 @@ function add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $func
 		$position            = $position + substr( base_convert( md5( $menu_slug . $menu_title ), 16, 10 ), -5 ) * 0.00001;
 		$menu[ "$position" ] = $new_menu;
 	} else {
+		if ( ! is_int( $position ) ) {
+			_doing_it_wrong(
+				__FUNCTION__,
+				sprintf(
+					/* translators: %s: add_menu_page() */
+					__( 'The seventh parameter passed to %s should be an integer representing menu position.' ),
+					'<code>add_menu_page()</code>'
+				),
+				'6.0.0'
+			);
+			// If the position is not a string (i.e. float), convert it to string.
+			if ( ! is_string( $position ) ) {
+				$position = (string) $position;
+			}
+		}
 		$menu[ $position ] = $new_menu;
 	}
 
@@ -2532,7 +2538,7 @@ function deactivated_plugins_notice() {
 	foreach ( $deactivated_plugins as $plugin ) {
 		if ( ! empty( $plugin['version_compatible'] ) && ! empty( $plugin['version_deactivated'] ) ) {
 			$explanation = sprintf(
-				/* translators: 1: Name of deactivated plugin, 2: Plugin version deactivated, 3: Current WP version, 4: Compatible plugin version */
+				/* translators: 1: Name of deactivated plugin, 2: Plugin version deactivated, 3: Current WP version, 4: Compatible plugin version. */
 				__( '%1$s %2$s was deactivated due to incompatibility with WordPress %3$s, please upgrade to %1$s %4$s or later.' ),
 				$plugin['plugin_name'],
 				$plugin['version_deactivated'],
@@ -2541,7 +2547,7 @@ function deactivated_plugins_notice() {
 			);
 		} else {
 			$explanation = sprintf(
-				/* translators: 1: Name of deactivated plugin, 2: Plugin version deactivated, 3: Current WP version */
+				/* translators: 1: Name of deactivated plugin, 2: Plugin version deactivated, 3: Current WP version. */
 				__( '%1$s %2$s was deactivated due to incompatibility with WordPress %3$s.' ),
 				$plugin['plugin_name'],
 				! empty( $plugin['version_deactivated'] ) ? $plugin['version_deactivated'] : '',
@@ -2553,7 +2559,7 @@ function deactivated_plugins_notice() {
 		printf(
 			'<div class="notice notice-warning"><p><strong>%s</strong><br>%s</p><p><a href="%s">%s</a></p></div>',
 			sprintf(
-				/* translators: %s: Name of deactivated plugin */
+				/* translators: %s: Name of deactivated plugin. */
 				__( '%s plugin deactivated during WordPress upgrade.' ),
 				$plugin['plugin_name']
 			),
diff --git a/src/wp-admin/includes/post.php b/src/wp-admin/includes/post.php
index 718e18d1d5..c9b29b5df4 100644
--- a/src/wp-admin/includes/post.php
+++ b/src/wp-admin/includes/post.php
@@ -7,14 +7,15 @@
  */
 
 /**
- * Rename $_POST data from form names to DB post columns.
+ * Renames `$_POST` data from form names to DB post columns.
  *
- * Manipulates $_POST directly.
+ * Manipulates `$_POST` directly.
  *
  * @since 2.6.0
  *
- * @param bool  $update    Are we updating a pre-existing post?
- * @param array $post_data Array of post data. Defaults to the contents of $_POST.
+ * @param bool       $update    Whether the post already exists.
+ * @param array|null $post_data Optional. The array of post data to process.
+ *                              Defaults to the `$_POST` superglobal.
  * @return array|WP_Error Array of post data on success, WP_Error on failure.
  */
 function _wp_translate_postdata( $update = false, $post_data = null ) {
@@ -204,11 +205,12 @@ function _wp_translate_postdata( $update = false, $post_data = null ) {
 }
 
 /**
- * Returns only allowed post data fields
+ * Returns only allowed post data fields.
  *
  * @since 5.0.1
  *
- * @param array $post_data Array of post data. Defaults to the contents of $_POST.
+ * @param array|WP_Error|null $post_data The array of post data to process, or an error object.
+ *                                       Defaults to the `$_POST` superglobal.
  * @return array|WP_Error Array of post data on success, WP_Error on failure.
  */
 function _wp_get_allowed_postdata( $post_data = null ) {
@@ -225,18 +227,19 @@ function _wp_get_allowed_postdata( $post_data = null ) {
 }
 
 /**
- * Update an existing post with values provided in $_POST.
+ * Updates an existing post with values provided in `$_POST`.
  *
  * If post data is passed as an argument, it is treated as an array of data
  * keyed appropriately for turning into a post object.
  *
- * If post data is not passed, the $_POST global variable is used instead.
+ * If post data is not passed, the `$_POST` global variable is used instead.
  *
  * @since 1.5.0
  *
  * @global wpdb $wpdb WordPress database abstraction object.
  *
- * @param array $post_data Optional. Defaults to the $_POST global.
+ * @param array|null $post_data Optional. The array of post data to process.
+ *                              Defaults to the `$_POST` superglobal.
  * @return int Post ID.
  */
 function edit_post( $post_data = null ) {
@@ -452,7 +455,7 @@ function edit_post( $post_data = null ) {
 }
 
 /**
- * Process the post data for the bulk editing of posts.
+ * Processes the post data for the bulk editing of posts.
  *
  * Updates all bulk edited posts/pages, adding (but not removing) tags and
  * categories. Skips pages when they would be their own parent or child.
@@ -461,7 +464,8 @@ function edit_post( $post_data = null ) {
  *
  * @global wpdb $wpdb WordPress database abstraction object.
  *
- * @param array $post_data Optional, the array of post data to process if not provided will use $_POST superglobal.
+ * @param array|null $post_data Optional. The array of post data to process.
+ *                              Defaults to the `$_POST` superglobal.
  * @return array
  */
 function bulk_edit_posts( $post_data = null ) {
@@ -640,7 +644,9 @@ function bulk_edit_posts( $post_data = null ) {
 		// Prevent wp_insert_post() from overwriting post format with the old data.
 		unset( $post_data['tax_input']['post_format'] );
 
-		$updated[] = wp_update_post( $post_data );
+		$post_id = wp_update_post( $post_data );
+		update_post_meta( $post_id, '_edit_last', get_current_user_id() );
+		$updated[] = $post_id;
 
 		if ( isset( $post_data['sticky'] ) && current_user_can( $ptype->cap->edit_others_posts ) ) {
 			if ( 'sticky' === $post_data['sticky'] ) {
@@ -659,7 +665,7 @@ function bulk_edit_posts( $post_data = null ) {
 }
 
 /**
- * Default post information to use when populating the "Write Post" form.
+ * Returns default post information to use when populating the "Write Post" form.
  *
  * @since 2.0.0
  *
@@ -768,10 +774,10 @@ function get_default_post_to_edit( $post_type = 'post', $create_in_db = false )
  * @global wpdb $wpdb WordPress database abstraction object.
  *
  * @param string $title   Post title.
- * @param string $content Optional post content.
- * @param string $date    Optional post date.
- * @param string $type    Optional post type.
- * @param string $status  Optional post status.
+ * @param string $content Optional. Post content.
+ * @param string $date    Optional. Post date.
+ * @param string $type    Optional. Post type.
+ * @param string $status  Optional. Post status.
  * @return int Post ID if post exists, 0 otherwise.
  */
 function post_exists( $title, $content = '', $date = '', $type = '', $status = '' ) {
@@ -819,7 +825,7 @@ function post_exists( $title, $content = '', $date = '', $type = '', $status = '
 }
 
 /**
- * Creates a new post from the "Write Post" form using $_POST information.
+ * Creates a new post from the "Write Post" form using `$_POST` information.
  *
  * @since 2.1.0
  *
@@ -917,7 +923,7 @@ function write_post() {
 //
 
 /**
- * Add post meta data defined in $_POST superglobal for post with given ID.
+ * Adds post meta data defined in the `$_POST` superglobal for a post with given ID.
  *
  * @since 1.2.0
  *
@@ -960,7 +966,7 @@ function add_meta( $post_ID ) {
 }
 
 /**
- * Delete post meta data by meta ID.
+ * Deletes post meta data by meta ID.
  *
  * @since 1.2.0
  *
@@ -972,7 +978,7 @@ function delete_meta( $mid ) {
 }
 
 /**
- * Get a list of previously defined keys.
+ * Returns a list of previously defined keys.
  *
  * @since 1.2.0
  *
@@ -995,7 +1001,7 @@ function get_meta_keys() {
 }
 
 /**
- * Get post meta data by meta ID.
+ * Returns post meta data by meta ID.
  *
  * @since 2.1.0
  *
@@ -1007,14 +1013,14 @@ function get_post_meta_by_id( $mid ) {
 }
 
 /**
- * Get meta data for the given post ID.
+ * Returns meta data for the given post ID.
  *
  * @since 1.2.0
  *
  * @global wpdb $wpdb WordPress database abstraction object.
  *
  * @param int $postid A post ID.
- * @return array {
+ * @return array[] {
  *     Array of meta data arrays for the given post ID.
  *
  *     @type array ...$0 {
@@ -1042,13 +1048,13 @@ function has_meta( $postid ) {
 }
 
 /**
- * Update post meta data by meta ID.
+ * Updates post meta data by meta ID.
  *
  * @since 1.2.0
  *
- * @param int    $meta_id
- * @param string $meta_key Expect Slashed
- * @param string $meta_value Expect Slashed
+ * @param int    $meta_id    Meta ID.
+ * @param string $meta_key   Meta key. Expect slashed.
+ * @param string $meta_value Meta value. Expect slashed.
  * @return bool
  */
 function update_meta( $meta_id, $meta_key, $meta_value ) {
@@ -1120,7 +1126,7 @@ function _fix_attachment_links( $post ) {
 }
 
 /**
- * Get all the possible statuses for a post_type
+ * Returns all the possible statuses for a post type.
  *
  * @since 2.5.0
  *
@@ -1134,11 +1140,12 @@ function get_available_post_statuses( $type = 'post' ) {
 }
 
 /**
- * Run the wp query to fetch the posts for listing on the edit posts page
+ * Runs the query to fetch the posts for listing on the edit posts page.
  *
  * @since 2.5.0
  *
- * @param array|false $q Array of query variables to use to build the query or false to use $_GET superglobal.
+ * @param array|false $q Optional. Array of query variables to use to build the query.
+ *                       Defaults to the `$_GET` superglobal.
  * @return array
  */
 function wp_edit_posts_query( $q = false ) {
@@ -1235,12 +1242,12 @@ function wp_edit_posts_query( $q = false ) {
 }
 
 /**
- * Get the query variables for the current attachments request.
+ * Returns the query variables for the current attachments request.
  *
  * @since 4.2.0
  *
- * @param array|false $q Optional. Array of query variables to use to build the query or false
- *                       to use $_GET superglobal. Default false.
+ * @param array|false $q Optional. Array of query variables to use to build the query.
+ *                       Defaults to the `$_GET` superglobal.
  * @return array The parsed query vars.
  */
 function wp_edit_attachments_query_vars( $q = false ) {
@@ -1307,7 +1314,8 @@ function wp_edit_attachments_query_vars( $q = false ) {
  *
  * @since 2.5.0
  *
- * @param array|false $q Array of query variables to use to build the query or false to use $_GET superglobal.
+ * @param array|false $q Optional. Array of query variables to use to build the query.
+ *                       Defaults to the `$_GET` superglobal.
  * @return array
  */
 function wp_edit_attachments_query( $q = false ) {
@@ -1357,13 +1365,14 @@ function postbox_classes( $box_id, $screen_id ) {
 }
 
 /**
- * Get a sample permalink based off of the post name.
+ * Returns a sample permalink based on the post name.
  *
  * @since 2.5.0
  *
  * @param int|WP_Post $id    Post ID or post object.
- * @param string      $title Optional. Title to override the post's current title when generating the post name. Default null.
- * @param string      $name  Optional. Name to override the post name. Default null.
+ * @param string|null $title Optional. Title to override the post's current title
+ *                           when generating the post name. Default null.
+ * @param string|null $name  Optional. Name to override the post name. Default null.
  * @return array {
  *     Array containing the sample permalink with placeholder for the post name, and the post name.
  *
@@ -1439,10 +1448,10 @@ function get_sample_permalink( $id, $title = null, $name = null ) {
 	 *     @type string $0 The permalink with placeholder for the post name.
 	 *     @type string $1 The post name.
 	 * }
-	 * @param int     $post_id   Post ID.
-	 * @param string  $title     Post title.
-	 * @param string  $name      Post name (slug).
-	 * @param WP_Post $post      Post object.
+	 * @param int     $post_id Post ID.
+	 * @param string  $title   Post title.
+	 * @param string  $name    Post name (slug).
+	 * @param WP_Post $post    Post object.
 	 */
 	return apply_filters( 'get_sample_permalink', $permalink, $post->ID, $title, $name, $post );
 }
@@ -1452,9 +1461,9 @@ function get_sample_permalink( $id, $title = null, $name = null ) {
  *
  * @since 2.5.0
  *
- * @param int    $id        Post ID or post object.
- * @param string $new_title Optional. New title. Default null.
- * @param string $new_slug  Optional. New slug. Default null.
+ * @param int|WP_Post $id        Post ID or post object.
+ * @param string|null $new_title Optional. New title. Default null.
+ * @param string|null $new_slug  Optional. New slug. Default null.
  * @return string The HTML of the sample permalink slug editor.
  */
 function get_sample_permalink_html( $id, $new_title = null, $new_slug = null ) {
@@ -1538,8 +1547,9 @@ function get_sample_permalink_html( $id, $new_title = null, $new_slug = null ) {
  *
  * @since 2.9.0
  *
- * @param int         $thumbnail_id ID of the attachment used for thumbnail
- * @param int|WP_Post $post         Optional. The post ID or object associated with the thumbnail, defaults to global $post.
+ * @param int|null         $thumbnail_id Optional. Thumbnail attachment ID. Default null.
+ * @param int|WP_Post|null $post         Optional. The post ID or object associated
+ *                                       with the thumbnail. Defaults to global $post.
  * @return string The post thumbnail HTML.
  */
 function _wp_post_thumbnail_html( $thumbnail_id = null, $post = null ) {
@@ -1607,7 +1617,7 @@ function _wp_post_thumbnail_html( $thumbnail_id = null, $post = null ) {
 }
 
 /**
- * Check to see if the post is currently being edited by another user.
+ * Determines whether the post is currently being edited by another user.
  *
  * @since 2.5.0
  *
@@ -1645,7 +1655,7 @@ function wp_check_post_lock( $post_id ) {
 }
 
 /**
- * Mark the post as currently being edited by the current user
+ * Marks the post as currently being edited by the current user.
  *
  * @since 2.5.0
  *
@@ -1835,11 +1845,12 @@ function _admin_notice_post_locked() {
 }
 
 /**
- * Creates autosave data for the specified post from $_POST data.
+ * Creates autosave data for the specified post from `$_POST` data.
  *
  * @since 2.6.0
  *
- * @param array|int $post_data Associative array containing the post data or int post ID.
+ * @param array|int $post_data Associative array containing the post data, or integer post ID.
+ *                             If a numeric post ID is provided, will use the `$_POST` superglobal.
  * @return int|WP_Error The autosave revision ID. WP_Error or 0 on error.
  */
 function wp_create_post_autosave( $post_data ) {
@@ -1960,7 +1971,7 @@ function post_preview() {
 }
 
 /**
- * Save a post submitted with XHR
+ * Saves a post submitted with XHR.
  *
  * Intended for use with heartbeat and autosave.js
  *
@@ -2011,7 +2022,7 @@ function wp_autosave( $post_data ) {
 }
 
 /**
- * Redirect to previous page.
+ * Redirects to previous page.
  *
  * @since 2.7.0
  *
@@ -2125,7 +2136,7 @@ function taxonomy_meta_box_sanitize_cb_input( $taxonomy, $terms ) {
 }
 
 /**
- * Return whether the post can be edited in the block editor.
+ * Returns whether the post can be edited in the block editor.
  *
  * @since 5.0.0
  *
@@ -2159,7 +2170,7 @@ function use_block_editor_for_post( $post ) {
 }
 
 /**
- * Return whether a post type is compatible with the block editor.
+ * Returns whether a post type is compatible with the block editor.
  *
  * The block editor depends on the REST API, and if the post type is not shown in the
  * REST API, then it won't work with the block editor.
@@ -2434,7 +2445,7 @@ function the_block_editor_meta_box_post_form_hidden_fields( $post ) {
 	wp_nonce_field( 'samplepermalink', 'samplepermalinknonce', false );
 
 	/**
-	 * Add hidden input fields to the meta box save form.
+	 * Adds hidden input fields to the meta box save form.
 	 *
 	 * Hook into this action to print `<input type="hidden" ... />` fields, which will be POSTed back to
 	 * the server when meta boxes are saved.
@@ -2445,3 +2456,62 @@ function the_block_editor_meta_box_post_form_hidden_fields( $post ) {
 	 */
 	do_action( 'block_editor_meta_box_hidden_fields', $post );
 }
+
+/**
+ * Disables block editor for wp_navigation type posts so they can be managed via the UI.
+ *
+ * @since 5.9.0
+ * @access private
+ *
+ * @param bool   $value Whether the CPT supports block editor or not.
+ * @param string $post_type Post type.
+ * @return bool Whether the block editor should be disabled or not.
+ */
+function _disable_block_editor_for_navigation_post_type( $value, $post_type ) {
+	if ( 'wp_navigation' === $post_type ) {
+		return false;
+	}
+
+	return $value;
+}
+
+/**
+ * This callback disables the content editor for wp_navigation type posts.
+ * Content editor cannot handle wp_navigation type posts correctly.
+ * We cannot disable the "editor" feature in the wp_navigation's CPT definition
+ * because it disables the ability to save navigation blocks via REST API.
+ *
+ * @since 5.9.0
+ * @access private
+ *
+ * @param WP_Post $post An instance of WP_Post class.
+ */
+function _disable_content_editor_for_navigation_post_type( $post ) {
+	$post_type = get_post_type( $post );
+	if ( 'wp_navigation' !== $post_type ) {
+		return;
+	}
+
+	remove_post_type_support( $post_type, 'editor' );
+}
+
+/**
+ * This callback enables content editor for wp_navigation type posts.
+ * We need to enable it back because we disable it to hide
+ * the content editor for wp_navigation type posts.
+ *
+ * @since 5.9.0
+ * @access private
+ *
+ * @see _disable_content_editor_for_navigation_post_type
+ *
+ * @param WP_Post $post An instance of WP_Post class.
+ */
+function _enable_content_editor_for_navigation_post_type( $post ) {
+	$post_type = get_post_type( $post );
+	if ( 'wp_navigation' !== $post_type ) {
+		return;
+	}
+
+	add_post_type_support( $post_type, 'editor' );
+}
diff --git a/src/wp-admin/includes/revision.php b/src/wp-admin/includes/revision.php
index b9d73e5cc9..2eb83cb75c 100644
--- a/src/wp-admin/includes/revision.php
+++ b/src/wp-admin/includes/revision.php
@@ -16,7 +16,7 @@
  * @param int         $compare_from The revision ID to compare from.
  * @param int         $compare_to   The revision ID to come to.
  * @return array|false Associative array of a post's revisioned fields and their diffs.
- *                    Or, false on failure.
+ *                     Or, false on failure.
  */
 function wp_get_revision_ui_diff( $post, $compare_from, $compare_to ) {
 	$post = get_post( $post );
diff --git a/src/wp-admin/includes/schema.php b/src/wp-admin/includes/schema.php
index 1bb2c27c45..d7728e2dff 100644
--- a/src/wp-admin/includes/schema.php
+++ b/src/wp-admin/includes/schema.php
@@ -964,7 +964,7 @@ endif;
  * @global WP_Rewrite $wp_rewrite   WordPress rewrite component.
  *
  * @param int    $network_id        ID of network to populate.
- * @param string $domain            The domain name for the network (eg. "example.com").
+ * @param string $domain            The domain name for the network. Example: "example.com".
  * @param string $email             Email address for the network administrator.
  * @param string $site_name         The name of the network.
  * @param string $path              Optional. The path to append to the network's domain name. Default '/'.
diff --git a/src/wp-admin/includes/taxonomy.php b/src/wp-admin/includes/taxonomy.php
index b52533d30c..10b1057d6e 100644
--- a/src/wp-admin/includes/taxonomy.php
+++ b/src/wp-admin/includes/taxonomy.php
@@ -115,8 +115,8 @@ function wp_create_categories( $categories, $post_id = '' ) {
  *     @type int|string $category_parent      Category parent ID. Default empty.
  * }
  * @param bool  $wp_error Optional. Default false.
- * @return int|object The ID number of the new or updated Category on success. Zero or a WP_Error on failure,
- *                    depending on param $wp_error.
+ * @return int|WP_Error The ID number of the new or updated Category on success. Zero or a WP_Error on failure,
+ *                      depending on param `$wp_error`.
  */
 function wp_insert_category( $catarr, $wp_error = false ) {
 	$cat_defaults = array(
diff --git a/src/wp-admin/includes/template.php b/src/wp-admin/includes/template.php
index 4228d931ba..32e65f5d77 100644
--- a/src/wp-admin/includes/template.php
+++ b/src/wp-admin/includes/template.php
@@ -96,8 +96,8 @@ function wp_terms_checklist( $post_id = 0, $args = array() ) {
 	 *
 	 * @see wp_terms_checklist()
 	 *
-	 * @param array $args    An array of arguments.
-	 * @param int   $post_id The post ID.
+	 * @param array|string $args    An array or string of arguments.
+	 * @param int          $post_id The post ID.
 	 */
 	$params = apply_filters( 'wp_terms_checklist_args', $args, $post_id );
 
@@ -2031,7 +2031,7 @@ function iframe_header( $title = '', $deprecated = false ) {
 	wp_enqueue_style( 'colors' );
 	?>
 <script type="text/javascript">
-addLoadEvent = function(func){if(typeof jQuery!=='undefined')jQuery(document).ready(func);else if(typeof wpOnload!=='function'){wpOnload=func;}else{var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}};
+addLoadEvent = function(func){if(typeof jQuery!=='undefined')jQuery(function(){func();});else if(typeof wpOnload!=='function'){wpOnload=func;}else{var oldonload=wpOnload;wpOnload=function(){oldonload();func();}}};
 function tb_close(){var win=window.dialogArguments||opener||parent||top;win.tb_remove();}
 var ajaxurl = '<?php echo esc_js( admin_url( 'admin-ajax.php', 'relative' ) ); ?>',
 	pagenow = '<?php echo esc_js( $current_screen->id ); ?>',
diff --git a/src/wp-admin/includes/theme.php b/src/wp-admin/includes/theme.php
index 153c319656..1d32a62afb 100644
--- a/src/wp-admin/includes/theme.php
+++ b/src/wp-admin/includes/theme.php
@@ -146,7 +146,7 @@ function get_page_templates( $post = null, $post_type = 'page' ) {
 }
 
 /**
- * Tidies a filename for url display by the theme editor.
+ * Tidies a filename for url display by the theme file editor.
  *
  * @since 2.9.0
  * @access private
@@ -521,7 +521,7 @@ function themes_api( $action, $args = array() ) {
 	/**
 	 * Filters whether to override the WordPress.org Themes API.
 	 *
-	 * Passing a non-false value will effectively short-circuit the WordPress.org API request.
+	 * Returning a non-false value will effectively short-circuit the WordPress.org API request.
 	 *
 	 * If `$action` is 'query_themes', 'theme_information', or 'feature_list', an object MUST
 	 * be passed. If `$action` is 'hot_tags', an array should be passed.
@@ -622,10 +622,10 @@ function themes_api( $action, $args = array() ) {
 	 *
 	 * @since 2.8.0
 	 *
-	 * @param array|object|WP_Error $res    WordPress.org Themes API response.
-	 * @param string                $action Requested action. Likely values are 'theme_information',
-	 *                                      'feature_list', or 'query_themes'.
-	 * @param object                $args   Arguments used to query for installer pages from the WordPress.org Themes API.
+	 * @param array|stdClass|WP_Error $res    WordPress.org Themes API response.
+	 * @param string                  $action Requested action. Likely values are 'theme_information',
+	 *                                        'feature_list', or 'query_themes'.
+	 * @param stdClass                $args   Arguments used to query for installer pages from the WordPress.org Themes API.
 	 */
 	return apply_filters( 'themes_api_result', $res, $action, $args );
 }
@@ -653,7 +653,7 @@ function wp_prepare_themes_for_js( $themes = null ) {
 	 *
 	 * @param array           $prepared_themes An associative array of theme data. Default empty array.
 	 * @param WP_Theme[]|null $themes          An array of theme objects to prepare, if any.
-	 * @param string          $current_theme   The current theme slug.
+	 * @param string          $current_theme   The active theme slug.
 	 */
 	$prepared_themes = (array) apply_filters( 'pre_prepare_themes_for_js', array(), $themes, $current_theme );
 
@@ -661,7 +661,7 @@ function wp_prepare_themes_for_js( $themes = null ) {
 		return $prepared_themes;
 	}
 
-	// Make sure the current theme is listed first.
+	// Make sure the active theme is listed first.
 	$prepared_themes[ $current_theme ] = array();
 
 	if ( null === $themes ) {
@@ -701,7 +701,14 @@ function wp_prepare_themes_for_js( $themes = null ) {
 		}
 
 		$customize_action = null;
-		if ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {
+
+		$can_edit_theme_options = current_user_can( 'edit_theme_options' );
+		$can_customize          = current_user_can( 'customize' );
+		$is_block_theme         = $theme->is_block_theme();
+
+		if ( $is_block_theme && $can_edit_theme_options ) {
+			$customize_action = esc_url( admin_url( 'site-editor.php' ) );
+		} elseif ( ! $is_block_theme && $can_customize && $can_edit_theme_options ) {
 			$customize_action = esc_url(
 				add_query_arg(
 					array(
@@ -775,6 +782,7 @@ function wp_prepare_themes_for_js( $themes = null ) {
 					? wp_nonce_url( admin_url( 'themes.php?action=' . $auto_update_action . '&amp;stylesheet=' . $encoded_slug ), 'updates' )
 					: null,
 			),
+			'blockTheme'     => $theme->is_block_theme(),
 		);
 	}
 
@@ -823,7 +831,7 @@ function customize_themes_print_templates() {
 
 				<div class="theme-info">
 					<# if ( data.active ) { #>
-						<span class="current-label"><?php _e( 'Current Theme' ); ?></span>
+						<span class="current-label"><?php _e( 'Active Theme' ); ?></span>
 					<# } #>
 					<h2 class="theme-name">{{{ data.name }}}<span class="theme-version">
 						<?php
@@ -997,6 +1005,21 @@ function customize_themes_print_templates() {
 								?>
 							<# } #>
 						</p></div>
+					<# } else if ( ! data.active && data.blockTheme ) { #>
+						<div class="notice notice-error notice-alt notice-large"><p>
+						<?php
+							_e( 'This theme doesn\'t support Customizer.' );
+						?>
+						<# if ( data.actions.activate ) { #>
+							<?php
+							printf(
+								/* translators: %s: URL to the themes page (also it activates the theme). */
+								' ' . __( 'However, you can still <a href="%s">activate this theme</a>, and use the Site Editor to customize it.' ),
+								'{{{ data.actions.activate }}}'
+							);
+							?>
+						<# } #>
+						</p></div>
 					<# } #>
 
 					<p class="theme-description">{{{ data.description }}}</p>
@@ -1017,10 +1040,20 @@ function customize_themes_print_templates() {
 						<# } #>
 					<?php } ?>
 
-					<# if ( data.compatibleWP && data.compatiblePHP ) { #>
-						<button type="button" class="button button-primary preview-theme" data-slug="{{ data.id }}"><?php _e( 'Live Preview' ); ?></button>
+					<# if ( data.blockTheme ) { #>
+						<?php
+							/* translators: %s: Theme name. */
+							$aria_label = sprintf( _x( 'Activate %s', 'theme' ), '{{ data.name }}' );
+						?>
+						<# if ( data.compatibleWP && data.compatiblePHP && data.actions.activate ) { #>
+							<a href="{{{ data.actions.activate }}}" class="button button-primary activate" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Activate' ); ?></a>
+						<# } #>
 					<# } else { #>
-						<button class="button button-primary disabled"><?php _e( 'Live Preview' ); ?></button>
+						<# if ( data.compatibleWP && data.compatiblePHP ) { #>
+							<button type="button" class="button button-primary preview-theme" data-slug="{{ data.id }}"><?php _e( 'Live Preview' ); ?></button>
+						<# } else { #>
+							<button class="button button-primary disabled"><?php _e( 'Live Preview' ); ?></button>
+						<# } #>
 					<# } #>
 				<# } else { #>
 					<# if ( data.compatibleWP && data.compatiblePHP ) { #>
diff --git a/src/wp-admin/includes/translation-install.php b/src/wp-admin/includes/translation-install.php
index 74681fb314..dc7cb89a05 100644
--- a/src/wp-admin/includes/translation-install.php
+++ b/src/wp-admin/includes/translation-install.php
@@ -14,7 +14,7 @@
  *
  * @param string       $type Type of translations. Accepts 'plugins', 'themes', 'core'.
  * @param array|object $args Translation API arguments. Optional.
- * @return object|WP_Error On success an object of translations, WP_Error on failure.
+ * @return array|WP_Error On success an associative array of translations, WP_Error on failure.
  */
 function translations_api( $type, $args = null ) {
 	// Include an unmodified $wp_version.
@@ -29,9 +29,9 @@ function translations_api( $type, $args = null ) {
 	 *
 	 * @since 4.0.0
 	 *
-	 * @param false|object $result The result object. Default false.
-	 * @param string       $type   The type of translations being requested.
-	 * @param object       $args   Translation API arguments.
+	 * @param false|array $result The result array. Default false.
+	 * @param string      $type   The type of translations being requested.
+	 * @param object      $args   Translation API arguments.
 	 */
 	$res = apply_filters( 'translations_api', false, $type, $args );
 
@@ -102,9 +102,9 @@ function translations_api( $type, $args = null ) {
 	 *
 	 * @since 4.0.0
 	 *
-	 * @param object|WP_Error $res  Response object or WP_Error.
-	 * @param string          $type The type of translations being requested.
-	 * @param object          $args Translation API arguments.
+	 * @param array|WP_Error $res  Response as an associative array or WP_Error.
+	 * @param string         $type The type of translations being requested.
+	 * @param object         $args Translation API arguments.
 	 */
 	return apply_filters( 'translations_api_result', $res, $type, $args );
 }
diff --git a/src/wp-admin/includes/update-core.php b/src/wp-admin/includes/update-core.php
index 32664bf6ff..2326bb6547 100644
--- a/src/wp-admin/includes/update-core.php
+++ b/src/wp-admin/includes/update-core.php
@@ -826,6 +826,23 @@ $_old_files = array(
 	'wp-includes/css/dist/editor/editor-styles.min.css',
 	'wp-includes/css/dist/editor/editor-styles-rtl.css',
 	'wp-includes/css/dist/editor/editor-styles-rtl.min.css',
+	// 5.9
+	'wp-includes/blocks/heading/editor.css',
+	'wp-includes/blocks/heading/editor.min.css',
+	'wp-includes/blocks/heading/editor-rtl.css',
+	'wp-includes/blocks/heading/editor-rtl.min.css',
+	'wp-includes/blocks/post-content/editor.css',
+	'wp-includes/blocks/post-content/editor.min.css',
+	'wp-includes/blocks/post-content/editor-rtl.css',
+	'wp-includes/blocks/post-content/editor-rtl.min.css',
+	'wp-includes/blocks/query-title/editor.css',
+	'wp-includes/blocks/query-title/editor.min.css',
+	'wp-includes/blocks/query-title/editor-rtl.css',
+	'wp-includes/blocks/query-title/editor-rtl.min.css',
+	'wp-includes/blocks/tag-cloud/editor.css',
+	'wp-includes/blocks/tag-cloud/editor.min.css',
+	'wp-includes/blocks/tag-cloud/editor-rtl.css',
+	'wp-includes/blocks/tag-cloud/editor-rtl.min.css',
 );
 
 /**
@@ -864,6 +881,7 @@ $_new_bundled_files = array(
 	'themes/twentynineteen/'  => '5.0',
 	'themes/twentytwenty/'    => '5.3',
 	'themes/twentytwentyone/' => '5.6',
+	'themes/twentytwentytwo/' => '5.9',
 );
 
 /**
@@ -965,7 +983,7 @@ function update_core( $from, $to ) {
 
 	/*
 	 * Import $wp_version, $required_php_version, and $required_mysql_version from the new version.
-	 * DO NOT globalise any variables imported from `version-current.php` in this function.
+	 * DO NOT globalize any variables imported from `version-current.php` in this function.
 	 *
 	 * BC Note: $wp_filesystem->wp_content_dir() returned unslashed pre-2.8.
 	 */
@@ -1241,7 +1259,7 @@ function update_core( $from, $to ) {
 
 		// If we don't have enough free space, it isn't worth trying again.
 		// Unlikely to be hit due to the check in unzip_file().
-		$available_space = @disk_free_space( ABSPATH );
+		$available_space = function_exists( 'disk_free_space' ) ? @disk_free_space( ABSPATH ) : false;
 
 		if ( $available_space && $total_size >= $available_space ) {
 			$result = new WP_Error( 'disk_full', __( 'There is not enough free disk space to complete the update.' ) );
@@ -1397,8 +1415,8 @@ function update_core( $from, $to ) {
 	// Deactivate the REST API plugin if its version is 2.0 Beta 4 or lower.
 	_upgrade_440_force_deactivate_incompatible_plugins();
 
-	// Deactivate the Gutenberg plugin if its version is 10.7 or lower.
-	_upgrade_580_force_deactivate_incompatible_plugins();
+	// Deactivate the Gutenberg plugin if its version is 11.8 or lower.
+	_upgrade_590_force_deactivate_incompatible_plugins();
 
 	// Upgrade DB with separate request.
 	/** This filter is documented in wp-admin/includes/update-core.php */
@@ -1684,15 +1702,16 @@ function _upgrade_440_force_deactivate_incompatible_plugins() {
 }
 
 /**
+ * @access private
  * @ignore
- * @since 5.8.0
+ * @since 5.9.0
  */
-function _upgrade_580_force_deactivate_incompatible_plugins() {
-	if ( defined( 'GUTENBERG_VERSION' ) && version_compare( GUTENBERG_VERSION, '10.7', '<=' ) ) {
+function _upgrade_590_force_deactivate_incompatible_plugins() {
+	if ( defined( 'GUTENBERG_VERSION' ) && version_compare( GUTENBERG_VERSION, '11.9', '<' ) ) {
 		$deactivated_gutenberg['gutenberg'] = array(
 			'plugin_name'         => 'Gutenberg',
 			'version_deactivated' => GUTENBERG_VERSION,
-			'version_compatible'  => '10.8',
+			'version_compatible'  => '11.9',
 		);
 		if ( is_plugin_active_for_network( 'gutenberg/gutenberg.php' ) ) {
 			$deactivated_plugins = get_site_option( 'wp_force_deactivated_plugins', array() );
diff --git a/src/wp-admin/includes/update.php b/src/wp-admin/includes/update.php
index 03cd1f2bcd..24410cd29c 100644
--- a/src/wp-admin/includes/update.php
+++ b/src/wp-admin/includes/update.php
@@ -558,30 +558,24 @@ function wp_plugin_update_row( $file, $plugin_data ) {
 		 *
 		 * @since 2.8.0
 		 *
-		 * @param array  $plugin_data {
-		 *     An array of plugin metadata.
-		 *
-		 *     @type string $name        The human-readable name of the plugin.
-		 *     @type string $plugin_uri  Plugin URI.
-		 *     @type string $version     Plugin version.
-		 *     @type string $description Plugin description.
-		 *     @type string $author      Plugin author.
-		 *     @type string $author_uri  Plugin author URI.
-		 *     @type string $text_domain Plugin text domain.
-		 *     @type string $domain_path Relative path to the plugin's .mo file(s).
-		 *     @type bool   $network     Whether the plugin can only be activated network wide.
-		 *     @type string $title       The human-readable title of the plugin.
-		 *     @type string $author_name Plugin author's name.
-		 *     @type bool   $update      Whether there's an available update. Default null.
-		 * }
+		 * @param array  $plugin_data An array of plugin metadata. See get_plugin_data()
+		 *                            and the {@see 'plugin_row_meta'} filter for the list
+		 *                            of possible values.
 		 * @param object $response {
 		 *     An object of metadata about the available plugin update.
 		 *
-		 *     @type int    $id          Plugin ID.
-		 *     @type string $slug        Plugin slug.
-		 *     @type string $new_version New plugin version.
-		 *     @type string $url         Plugin URL.
-		 *     @type string $package     Plugin update package URL.
+		 *     @type string   $id           Plugin ID, e.g. `w.org/plugins/[plugin-name]`.
+		 *     @type string   $slug         Plugin slug.
+		 *     @type string   $plugin       Plugin basename.
+		 *     @type string   $new_version  New plugin version.
+		 *     @type string   $url          Plugin URL.
+		 *     @type string   $package      Plugin update package URL.
+		 *     @type string[] $icons        An array of plugin icon URLs.
+		 *     @type string[] $banners      An array of plugin banner URLs.
+		 *     @type string[] $banners_rtl  An array of plugin RTL banner URLs.
+		 *     @type string   $requires     The version of WordPress which the plugin requires.
+		 *     @type string   $tested       The version of WordPress the plugin is tested against.
+		 *     @type string   $requires_php The version of PHP which the plugin requires.
 		 * }
 		 */
 		do_action( "in_plugin_update_message-{$file}", $plugin_data, $response ); // phpcs:ignore WordPress.NamingConventions.ValidHookName.UseUnderscores
diff --git a/src/wp-admin/includes/upgrade.php b/src/wp-admin/includes/upgrade.php
index 3be073f7af..88900bc400 100644
--- a/src/wp-admin/includes/upgrade.php
+++ b/src/wp-admin/includes/upgrade.php
@@ -249,6 +249,11 @@ if ( ! function_exists( 'wp_install_defaults' ) ) :
 				'post_content_filtered' => '',
 			)
 		);
+
+		if ( is_multisite() ) {
+			update_posts_count();
+		}
+
 		$wpdb->insert(
 			$wpdb->term_relationships,
 			array(
@@ -267,11 +272,15 @@ if ( ! function_exists( 'wp_install_defaults' ) ) :
 
 		$first_comment_author = ! empty( $first_comment_author ) ? $first_comment_author : __( 'A WordPress Commenter' );
 		$first_comment_email  = ! empty( $first_comment_email ) ? $first_comment_email : 'wapuu@wordpress.example';
-		$first_comment_url    = ! empty( $first_comment_url ) ? $first_comment_url : 'https://wordpress.org/';
-		$first_comment        = ! empty( $first_comment ) ? $first_comment : __(
-			'Hi, this is a comment.
+		$first_comment_url    = ! empty( $first_comment_url ) ? $first_comment_url : esc_url( __( 'https://wordpress.org/' ) );
+		$first_comment        = ! empty( $first_comment ) ? $first_comment : sprintf(
+			/* translators: %s: Gravatar URL. */
+			__(
+				'Hi, this is a comment.
 To get started with moderating, editing, and deleting comments, please visit the Comments screen in the dashboard.
-Commenter avatars come from <a href="https://gravatar.com">Gravatar</a>.'
+Commenter avatars come from <a href="%s">Gravatar</a>.'
+			),
+			esc_url( __( 'https://en.gravatar.com/' ) )
 		);
 		$wpdb->insert(
 			$wpdb->comments,
@@ -1616,8 +1625,8 @@ function upgrade_280() {
 		$start = 0;
 		while ( $rows = $wpdb->get_results( "SELECT option_name, option_value FROM $wpdb->options ORDER BY option_id LIMIT $start, 20" ) ) {
 			foreach ( $rows as $row ) {
-				$value = $row->option_value;
-				if ( ! @unserialize( $value ) ) {
+				$value = maybe_unserialize( $row->option_value );
+				if ( $value === $row->option_value ) {
 					$value = stripslashes( $value );
 				}
 				if ( $value !== $row->option_value ) {
@@ -2256,15 +2265,20 @@ function upgrade_560() {
  *
  * @ignore
  * @since 5.9.0
+ *
+ * @global int $wp_current_db_version The old (current) database version.
  */
 function upgrade_590() {
 	global $wp_current_db_version;
 
 	if ( $wp_current_db_version < 51917 ) {
 		$crons = _get_cron_array();
-		// Remove errant `false` values, see #53950.
-		$crons = array_filter( $crons );
-		_set_cron_array( $crons );
+
+		if ( $crons && is_array( $crons ) ) {
+			// Remove errant `false` values, see #53950, #54906.
+			$crons = array_filter( $crons );
+			_set_cron_array( $crons );
+		}
 	}
 }
 
diff --git a/src/wp-admin/includes/user.php b/src/wp-admin/includes/user.php
index ab63f9e302..930a24da17 100644
--- a/src/wp-admin/includes/user.php
+++ b/src/wp-admin/includes/user.php
@@ -25,7 +25,7 @@ function add_user() {
  * @since 2.0.0
  *
  * @param int $user_id Optional. User ID.
- * @return int|WP_Error User ID of the updated user.
+ * @return int|WP_Error User ID of the updated user or WP_Error on failure.
  */
 function edit_user( $user_id = 0 ) {
 	$wp_roles = wp_roles();
@@ -234,9 +234,9 @@ function edit_user( $user_id = 0 ) {
 		 *
 		 * @since 4.4.0
 		 *
-		 * @param int    $user_id ID of the newly created user.
-		 * @param string $notify  Type of notification that should happen. See wp_send_new_user_notifications()
-		 *                        for more information on possible values.
+		 * @param int|WP_Error $user_id ID of the newly created user or WP_Error on failure.
+		 * @param string       $notify  Type of notification that should happen. See
+		 *                              wp_send_new_user_notifications() for more information.
 		 */
 		do_action( 'edit_user_created_user', $user_id, $notify );
 	}
@@ -536,7 +536,7 @@ function default_password_nag() {
 function delete_users_add_js() {
 	?>
 <script>
-jQuery(document).ready( function($) {
+jQuery( function($) {
 	var submit = $('#submit').prop('disabled', true);
 	$('input[name="delete_option"]').one('change', function() {
 		submit.prop('disabled', false);
@@ -544,7 +544,7 @@ jQuery(document).ready( function($) {
 	$('#reassign_user').focus( function() {
 		$('#delete_option1').prop('checked', true).trigger('change');
 	});
-});
+} );
 </script>
 	<?php
 }
diff --git a/src/wp-admin/includes/widgets.php b/src/wp-admin/includes/widgets.php
index af33787fa6..a5d65a7513 100644
--- a/src/wp-admin/includes/widgets.php
+++ b/src/wp-admin/includes/widgets.php
@@ -226,7 +226,7 @@ function wp_widget_control( $sidebar_args ) {
 	if ( isset( $sidebar_args['_display'] ) && 'template' === $sidebar_args['_display'] && $widget_number ) {
 		// number == -1 implies a template where id numbers are replaced by a generic '__i__'.
 		$control['params'][0]['number'] = -1;
-		// With id_base widget id's are constructed like {$id_base}-{$id_number}.
+		// With id_base widget ID's are constructed like {$id_base}-{$id_number}.
 		if ( isset( $control['id_base'] ) ) {
 			$id_format = $control['id_base'] . '-__i__';
 		}
diff --git a/src/wp-admin/index.php b/src/wp-admin/index.php
index 50b7f4046f..628096844c 100644
--- a/src/wp-admin/index.php
+++ b/src/wp-admin/index.php
@@ -1,6 +1,6 @@
 <?php
 
-/**
+/*
  * Note: this file exists only to remind developers to build the assets.
  * For the real wp-admin/index.php that gets built and boots WordPress,
  * please refer to wp-admin/_index.php.
diff --git a/src/wp-admin/load-scripts.php b/src/wp-admin/load-scripts.php
index a82088defe..5675b86570 100644
--- a/src/wp-admin/load-scripts.php
+++ b/src/wp-admin/load-scripts.php
@@ -1,13 +1,13 @@
 <?php
 
-/**
- * Disable error reporting
+/*
+ * Disable error reporting.
  *
  * Set this to error_reporting( -1 ) for debugging.
  */
 error_reporting( 0 );
 
-/** Set ABSPATH for execution */
+// Set ABSPATH for execution.
 if ( ! defined( 'ABSPATH' ) ) {
 	define( 'ABSPATH', dirname( __DIR__ ) . '/' );
 }
@@ -15,7 +15,7 @@ if ( ! defined( 'ABSPATH' ) ) {
 define( 'WPINC', 'wp-includes' );
 
 $protocol = $_SERVER['SERVER_PROTOCOL'];
-if ( ! in_array( $protocol, array( 'HTTP/1.1', 'HTTP/2', 'HTTP/2.0' ), true ) ) {
+if ( ! in_array( $protocol, array( 'HTTP/1.1', 'HTTP/2', 'HTTP/2.0', 'HTTP/3' ), true ) ) {
 	$protocol = 'HTTP/1.0';
 }
 
diff --git a/src/wp-admin/load-styles.php b/src/wp-admin/load-styles.php
index 18594fde68..ea3aab5b74 100644
--- a/src/wp-admin/load-styles.php
+++ b/src/wp-admin/load-styles.php
@@ -1,13 +1,13 @@
 <?php
 
-/**
- * Disable error reporting
+/*
+ * Disable error reporting.
  *
- * Set this to error_reporting( -1 ) for debugging
+ * Set this to error_reporting( -1 ) for debugging.
  */
 error_reporting( 0 );
 
-/** Set ABSPATH for execution */
+// Set ABSPATH for execution.
 if ( ! defined( 'ABSPATH' ) ) {
 	define( 'ABSPATH', dirname( __DIR__ ) . '/' );
 }
@@ -18,11 +18,12 @@ define( 'WP_CONTENT_DIR', ABSPATH . 'wp-content' );
 require ABSPATH . 'wp-admin/includes/noop.php';
 require ABSPATH . WPINC . '/theme.php';
 require ABSPATH . WPINC . '/class-wp-theme-json-resolver.php';
+require ABSPATH . WPINC . '/global-styles-and-settings.php';
 require ABSPATH . WPINC . '/script-loader.php';
 require ABSPATH . WPINC . '/version.php';
 
 $protocol = $_SERVER['SERVER_PROTOCOL'];
-if ( ! in_array( $protocol, array( 'HTTP/1.1', 'HTTP/2', 'HTTP/2.0' ), true ) ) {
+if ( ! in_array( $protocol, array( 'HTTP/1.1', 'HTTP/2', 'HTTP/2.0', 'HTTP/3' ), true ) ) {
 	$protocol = 'HTTP/1.0';
 }
 
diff --git a/src/wp-admin/menu.php b/src/wp-admin/menu.php
index 20a0a2f477..5d550fb55d 100644
--- a/src/wp-admin/menu.php
+++ b/src/wp-admin/menu.php
@@ -202,8 +202,27 @@ if ( ! is_multisite() && current_user_can( 'update_themes' ) ) {
 	/* translators: %s: Number of available theme updates. */
 	$submenu['themes.php'][5] = array( sprintf( __( 'Themes %s' ), $count ), $appearance_cap, 'themes.php' );
 
-	$customize_url            = add_query_arg( 'return', urlencode( remove_query_arg( wp_removable_query_args(), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ), 'customize.php' );
-	$submenu['themes.php'][6] = array( __( 'Customize' ), 'customize', esc_url( $customize_url ), '', 'hide-if-no-customize' );
+if ( wp_is_block_theme() ) {
+	$submenu['themes.php'][6] = array(
+		sprintf(
+			/* translators: %s: "beta" label */
+			__( 'Editor %s' ),
+			'<span class="awaiting-mod">' . __( 'beta' ) . '</span>'
+		),
+		'edit_theme_options',
+		'site-editor.php',
+	);
+}
+
+$customize_url = add_query_arg( 'return', urlencode( remove_query_arg( wp_removable_query_args(), wp_unslash( $_SERVER['REQUEST_URI'] ) ) ), 'customize.php' );
+
+// Hide Customize link on block themes unless a plugin or theme
+// is using 'customize_register' to add a setting.
+if ( ! wp_is_block_theme() || has_action( 'customize_register' ) ) {
+	$position = wp_is_block_theme() ? 7 : 6;
+
+	$submenu['themes.php'][ $position ] = array( __( 'Customize' ), 'customize', esc_url( $customize_url ), '', 'hide-if-no-customize' );
+}
 
 if ( current_theme_supports( 'menus' ) || current_theme_supports( 'widgets' ) ) {
 	$submenu['themes.php'][10] = array( __( 'Menus' ), 'edit_theme_options', 'nav-menus.php' );
@@ -219,23 +238,52 @@ if ( current_theme_supports( 'custom-background' ) && current_user_can( 'customi
 	$submenu['themes.php'][20] = array( __( 'Background' ), $appearance_cap, esc_url( $customize_background_url ), '', 'hide-if-no-customize' );
 }
 
-	unset( $customize_url );
+unset( $customize_url );
 
 unset( $appearance_cap );
 
-// Add 'Theme Editor' to the bottom of the Appearance menu.
+// Add 'Theme File Editor' to the bottom of the Appearance (non-block themes) or Tools (block themes) menu.
 if ( ! is_multisite() ) {
+	// Must use API on the admin_menu hook, direct modification is only possible on/before the _admin_menu hook.
 	add_action( 'admin_menu', '_add_themes_utility_last', 101 );
 }
 /**
- * Adds the 'Theme Editor' link to the bottom of the Appearance menu.
+ * Adds the 'Theme File Editor' menu item to the bottom of the Appearance (non-block themes)
+ * or Tools (block themes) menu.
  *
  * @access private
  * @since 3.0.0
+ * @since 5.9.0 Renamed 'Theme Editor' to 'Theme File Editor'.
+ *              Relocates to Tools for block themes.
  */
 function _add_themes_utility_last() {
-	// Must use API on the admin_menu hook, direct modification is only possible on/before the _admin_menu hook.
-	add_submenu_page( 'themes.php', __( 'Theme Editor' ), __( 'Theme Editor' ), 'edit_themes', 'theme-editor.php' );
+	add_submenu_page(
+		wp_is_block_theme() ? 'tools.php' : 'themes.php',
+		__( 'Theme File Editor' ),
+		__( 'Theme File Editor' ),
+		'edit_themes',
+		'theme-editor.php'
+	);
+}
+
+/**
+ * Adds the 'Plugin File Editor' menu item after the 'Themes File Editor' in Tools
+ * for block themes.
+ *
+ * @access private
+ * @since 5.9.0
+ */
+function _add_plugin_file_editor_to_tools() {
+	if ( ! wp_is_block_theme() ) {
+		return;
+	}
+	add_submenu_page(
+		'tools.php',
+		__( 'Plugin File Editor' ),
+		__( 'Plugin File Editor' ),
+		'edit_plugins',
+		'plugin-editor.php'
+	);
 }
 
 $count = '';
@@ -258,7 +306,12 @@ $submenu['plugins.php'][5] = array( __( 'Installed Plugins' ), 'activate_plugins
 if ( ! is_multisite() ) {
 	/* translators: Add new plugin. */
 	$submenu['plugins.php'][10] = array( _x( 'Add New', 'plugin' ), 'install_plugins', 'plugin-install.php' );
-	$submenu['plugins.php'][15] = array( __( 'Plugin Editor' ), 'edit_plugins', 'plugin-editor.php' );
+	if ( wp_is_block_theme() ) {
+		// Place the menu item below the Theme File Editor menu item.
+		add_action( 'admin_menu', '_add_plugin_file_editor_to_tools', 101 );
+	} else {
+		$submenu['plugins.php'][15] = array( __( 'Plugin File Editor' ), 'edit_plugins', 'plugin-editor.php' );
+	}
 }
 
 unset( $update_data );
diff --git a/src/wp-admin/nav-menus.php b/src/wp-admin/nav-menus.php
index d340fb6b67..b7ab1692cc 100644
--- a/src/wp-admin/nav-menus.php
+++ b/src/wp-admin/nav-menus.php
@@ -499,6 +499,13 @@ $nav_menus_l10n = array(
 	'menuItemDeletion'        => __( 'item %s' ),
 	/* translators: %s: Item name. */
 	'itemsDeleted'            => __( 'Deleted menu item: %s.' ),
+	'itemAdded'               => __( 'Menu item added' ),
+	'itemRemoved'             => __( 'Menu item removed' ),
+	'movedUp'                 => __( 'Menu item moved up' ),
+	'movedDown'               => __( 'Menu item moved down' ),
+	'movedTop'                => __( 'Menu item moved to the top' ),
+	'movedLeft'               => __( 'Menu item moved out of submenu' ),
+	'movedRight'              => __( 'Menu item is now a sub-item' ),
 );
 wp_localize_script( 'nav-menu', 'menus', $nav_menus_l10n );
 
diff --git a/src/wp-admin/network/menu.php b/src/wp-admin/network/menu.php
index 28509b1769..99cfb20e25 100644
--- a/src/wp-admin/network/menu.php
+++ b/src/wp-admin/network/menu.php
@@ -79,7 +79,7 @@ if ( current_user_can( 'update_themes' ) && $update_data['counts']['themes'] ) {
 }
 $submenu['themes.php'][5]  = array( __( 'Installed Themes' ), 'manage_network_themes', 'themes.php' );
 $submenu['themes.php'][10] = array( _x( 'Add New', 'theme' ), 'install_themes', 'theme-install.php' );
-$submenu['themes.php'][15] = array( __( 'Theme Editor' ), 'edit_themes', 'theme-editor.php' );
+$submenu['themes.php'][15] = array( __( 'Theme File Editor' ), 'edit_themes', 'theme-editor.php' );
 
 if ( current_user_can( 'update_plugins' ) && $update_data['counts']['plugins'] ) {
 	$menu[20] = array(
@@ -104,7 +104,7 @@ if ( current_user_can( 'update_plugins' ) && $update_data['counts']['plugins'] )
 }
 $submenu['plugins.php'][5]  = array( __( 'Installed Plugins' ), 'manage_network_plugins', 'plugins.php' );
 $submenu['plugins.php'][10] = array( _x( 'Add New', 'plugin' ), 'install_plugins', 'plugin-install.php' );
-$submenu['plugins.php'][15] = array( __( 'Plugin Editor' ), 'edit_plugins', 'plugin-editor.php' );
+$submenu['plugins.php'][15] = array( __( 'Plugin File Editor' ), 'edit_plugins', 'plugin-editor.php' );
 
 $menu[25] = array( __( 'Settings' ), 'manage_network_options', 'settings.php', '', 'menu-top menu-icon-settings', 'menu-settings', 'dashicons-admin-settings' );
 if ( defined( 'MULTISITE' ) && defined( 'WP_ALLOW_MULTISITE' ) && WP_ALLOW_MULTISITE ) {
diff --git a/src/wp-admin/network/plugin-editor.php b/src/wp-admin/network/plugin-editor.php
index e807caee4a..32cb1e7119 100644
--- a/src/wp-admin/network/plugin-editor.php
+++ b/src/wp-admin/network/plugin-editor.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Plugin editor network administration panel.
+ * Plugin file editor network administration panel.
  *
  * @package WordPress
  * @subpackage Multisite
diff --git a/src/wp-admin/network/sites.php b/src/wp-admin/network/sites.php
index e51c60f814..2aa2dbff55 100644
--- a/src/wp-admin/network/sites.php
+++ b/src/wp-admin/network/sites.php
@@ -261,7 +261,7 @@ if ( isset( $_GET['action'] ) ) {
 			 *
 			 * @since MU (3.0.0)
 			 *
-			 * @param string $id The ID of the activated site.
+			 * @param int $id The ID of the activated site.
 			 */
 			do_action( 'activate_blog', $id );
 			break;
@@ -272,7 +272,7 @@ if ( isset( $_GET['action'] ) ) {
 			 *
 			 * @since MU (3.0.0)
 			 *
-			 * @param string $id The ID of the site being deactivated.
+			 * @param int $id The ID of the site being deactivated.
 			 */
 			do_action( 'deactivate_blog', $id );
 
diff --git a/src/wp-admin/network/theme-editor.php b/src/wp-admin/network/theme-editor.php
index e503efa9d5..e8599f8b7a 100644
--- a/src/wp-admin/network/theme-editor.php
+++ b/src/wp-admin/network/theme-editor.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Theme editor network administration panel.
+ * Theme file editor network administration panel.
  *
  * @package WordPress
  * @subpackage Multisite
diff --git a/src/wp-admin/network/upgrade.php b/src/wp-admin/network/upgrade.php
index 12b88fbe92..4276a47db8 100644
--- a/src/wp-admin/network/upgrade.php
+++ b/src/wp-admin/network/upgrade.php
@@ -108,7 +108,7 @@ switch ( $action ) {
 			 *
 			 * @since MU (3.0.0)
 			 *
-			 * @param array|WP_Error $response The upgrade response array or WP_Error on failure.
+			 * @param array $response The upgrade response array.
 			 */
 			do_action( 'after_mu_upgrade', $response );
 
diff --git a/src/wp-admin/options-privacy.php b/src/wp-admin/options-privacy.php
index 0b0ca77ee9..fbd69f23a7 100644
--- a/src/wp-admin/options-privacy.php
+++ b/src/wp-admin/options-privacy.php
@@ -29,6 +29,21 @@ add_filter(
 
 $action = isset( $_POST['action'] ) ? $_POST['action'] : '';
 
+get_current_screen()->add_help_tab(
+	array(
+		'id'      => 'overview',
+		'title'   => __( 'Overview' ),
+		'content' =>
+				'<p>' . __( 'The Privacy screen lets you either build a new privacy-policy page or choose one you already have to show.' ) . '</p>' .
+				'<p>' . __( 'This screen includes suggestions to help you write your own privacy policy. However, it is your responsibility to use these resources correctly, to provide the information required by your privacy policy, and to keep this information current and accurate.' ) . '</p>',
+	)
+);
+
+get_current_screen()->set_help_sidebar(
+	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
+	'<p>' . __( '<a href="https://wordpress.org/support/article/settings-privacy-screen/">Documentation on Privacy Settings</a>' ) . '</p>'
+);
+
 if ( ! empty( $action ) ) {
 	check_admin_referer( $action );
 
diff --git a/src/wp-admin/options-reading.php b/src/wp-admin/options-reading.php
index 250000a3d7..2c89f14474 100644
--- a/src/wp-admin/options-reading.php
+++ b/src/wp-admin/options-reading.php
@@ -73,7 +73,7 @@ if ( ! in_array( get_option( 'blog_charset' ), array( 'utf8', 'utf-8', 'UTF8', '
 <input name="show_on_front" type="hidden" value="posts" />
 <table class="form-table" role="presentation">
 	<?php
-	if ( 'posts' != get_option( 'show_on_front' ) ) :
+	if ( 'posts' !== get_option( 'show_on_front' ) ) :
 		update_option( 'show_on_front', 'posts' );
 	endif;
 
@@ -191,6 +191,7 @@ else :
 	 *
 	 * By default the privacy options form displays a single checkbox to 'discourage' search
 	 * engines from indexing the site. Hooking to this action serves a dual purpose:
+	 *
 	 * 1. Disable the single checkbox in favor of a multiple-choice list of radio buttons.
 	 * 2. Open the door to adding additional radio button choices to the list.
 	 *
diff --git a/src/wp-admin/options.php b/src/wp-admin/options.php
index 019f9529c4..84ac775fd4 100644
--- a/src/wp-admin/options.php
+++ b/src/wp-admin/options.php
@@ -57,12 +57,17 @@ if ( ! current_user_can( $capability ) ) {
 if ( ! empty( $_GET['adminhash'] ) ) {
 	$new_admin_details = get_option( 'adminhash' );
 	$redirect          = 'options-general.php?updated=false';
-	if ( is_array( $new_admin_details ) && hash_equals( $new_admin_details['hash'], $_GET['adminhash'] ) && ! empty( $new_admin_details['newemail'] ) ) {
+
+	if ( is_array( $new_admin_details )
+		&& hash_equals( $new_admin_details['hash'], $_GET['adminhash'] )
+		&& ! empty( $new_admin_details['newemail'] )
+	) {
 		update_option( 'admin_email', $new_admin_details['newemail'] );
 		delete_option( 'adminhash' );
 		delete_option( 'new_admin_email' );
 		$redirect = 'options-general.php?updated=true';
 	}
+
 	wp_redirect( admin_url( $redirect ) );
 	exit;
 } elseif ( ! empty( $_GET['dismiss'] ) && 'new_admin_email' === $_GET['dismiss'] ) {
@@ -73,7 +78,7 @@ if ( ! empty( $_GET['adminhash'] ) ) {
 	exit;
 }
 
-if ( is_multisite() && ! current_user_can( 'manage_network_options' ) && 'update' != $action ) {
+if ( is_multisite() && ! current_user_can( 'manage_network_options' ) && 'update' !== $action ) {
 	wp_die(
 		'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
 		'<p>' . __( 'Sorry, you are not allowed to delete these items.' ) . '</p>',
@@ -183,7 +188,9 @@ if ( ! is_multisite() ) {
 	 * or upload_path is not the default ('wp-content/uploads' or empty),
 	 * they can be edited, otherwise they're locked.
 	 */
-	if ( get_option( 'upload_url_path' ) || ( get_option( 'upload_path' ) != 'wp-content/uploads' && get_option( 'upload_path' ) ) ) {
+	if ( get_option( 'upload_url_path' )
+		|| get_option( 'upload_path' ) && 'wp-content/uploads' !== get_option( 'upload_path' )
+	) {
 		$allowed_options['media'][] = 'upload_path';
 		$allowed_options['media'][] = 'upload_url_path';
 	}
diff --git a/src/wp-admin/plugin-editor.php b/src/wp-admin/plugin-editor.php
index 82d9cc5aff..016385a69a 100644
--- a/src/wp-admin/plugin-editor.php
+++ b/src/wp-admin/plugin-editor.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Edit plugin editor administration panel.
+ * Edit plugin file editor administration panel.
  *
  * @package WordPress
  * @subpackage Administration
@@ -124,7 +124,7 @@ get_current_screen()->add_help_tab(
 		'id'      => 'overview',
 		'title'   => __( 'Overview' ),
 		'content' =>
-				'<p>' . __( 'You can use the plugin editor to make changes to any of your plugins&#8217; individual PHP files. Be aware that if you make changes, plugins updates will overwrite your customizations.' ) . '</p>' .
+				'<p>' . __( 'You can use the plugin file editor to make changes to any of your plugins&#8217; individual PHP files. Be aware that if you make changes, plugins updates will overwrite your customizations.' ) . '</p>' .
 				'<p>' . __( 'Choose a plugin to edit from the dropdown menu and click the Select button. Click once on any file name to load it in the editor, and make your changes. Don&#8217;t forget to save your changes (Update File) when you&#8217;re finished.' ) . '</p>' .
 				'<p>' . __( 'The Documentation menu below the editor lists the PHP functions recognized in the plugin file. Clicking Look Up takes you to a web page about that particular function.' ) . '</p>' .
 				'<p id="editor-keyboard-trap-help-1">' . __( 'When using a keyboard to navigate:' ) . '</p>' .
diff --git a/src/wp-admin/plugin-install.php b/src/wp-admin/plugin-install.php
index a8b4e333ab..1f8b680740 100644
--- a/src/wp-admin/plugin-install.php
+++ b/src/wp-admin/plugin-install.php
@@ -52,7 +52,7 @@ $title       = __( 'Add Plugins' );
 $parent_file = 'plugins.php';
 
 wp_enqueue_script( 'plugin-install' );
-if ( 'plugin-information' != $tab ) {
+if ( 'plugin-information' !== $tab ) {
 	add_thickbox();
 }
 
diff --git a/src/wp-admin/revision.php b/src/wp-admin/revision.php
index 96268eaaa4..62ac5bbda3 100644
--- a/src/wp-admin/revision.php
+++ b/src/wp-admin/revision.php
@@ -126,7 +126,7 @@ if ( ! empty( $redirect ) ) {
 }
 
 // This is so that the correct "Edit" menu item is selected.
-if ( ! empty( $post->post_type ) && 'post' != $post->post_type ) {
+if ( ! empty( $post->post_type ) && 'post' !== $post->post_type ) {
 	$parent_file = 'edit.php?post_type=' . $post->post_type;
 } else {
 	$parent_file = 'edit.php';
diff --git a/src/wp-admin/site-editor.php b/src/wp-admin/site-editor.php
new file mode 100644
index 0000000000..cbbf38e7ea
--- /dev/null
+++ b/src/wp-admin/site-editor.php
@@ -0,0 +1,140 @@
+<?php
+/**
+ * Site Editor administration screen.
+ *
+ * @package WordPress
+ * @subpackage Administration
+ */
+
+global $post, $editor_styles;
+
+/** WordPress Administration Bootstrap */
+require_once __DIR__ . '/admin.php';
+
+if ( ! current_user_can( 'edit_theme_options' ) ) {
+	wp_die(
+		'<h1>' . __( 'You need a higher level of permission.' ) . '</h1>' .
+		'<p>' . __( 'Sorry, you are not allowed to edit theme options on this site.' ) . '</p>',
+		403
+	);
+}
+
+if ( ! wp_is_block_theme() ) {
+	wp_die( __( 'The theme you are currently using is not compatible with Full Site Editing.' ) );
+}
+
+// Used in the HTML title tag.
+$title       = __( 'Editor (beta)' );
+$parent_file = 'themes.php';
+
+// Flag that we're loading the block editor.
+$current_screen = get_current_screen();
+$current_screen->is_block_editor( true );
+
+// Load block patterns from w.org.
+_load_remote_block_patterns();
+_load_remote_featured_patterns();
+
+// Default to is-fullscreen-mode to avoid jumps in the UI.
+add_filter(
+	'admin_body_class',
+	static function( $classes ) {
+		return "$classes is-fullscreen-mode";
+	}
+);
+
+$indexed_template_types = array();
+foreach ( get_default_block_template_types() as $slug => $template_type ) {
+	$template_type['slug']    = (string) $slug;
+	$indexed_template_types[] = $template_type;
+}
+
+$block_editor_context = new WP_Block_Editor_Context();
+$custom_settings      = array(
+	'siteUrl'                              => site_url(),
+	'postsPerPage'                         => get_option( 'posts_per_page' ),
+	'styles'                               => get_block_editor_theme_styles(),
+	'defaultTemplateTypes'                 => $indexed_template_types,
+	'defaultTemplatePartAreas'             => get_allowed_block_template_part_areas(),
+	'__experimentalBlockPatterns'          => WP_Block_Patterns_Registry::get_instance()->get_all_registered(),
+	'__experimentalBlockPatternCategories' => WP_Block_Pattern_Categories_Registry::get_instance()->get_all_registered(),
+);
+$editor_settings      = get_block_editor_settings( $custom_settings, $block_editor_context );
+
+if ( isset( $_GET['postType'] ) && ! isset( $_GET['postId'] ) ) {
+	$post_type = get_post_type_object( $_GET['postType'] );
+	if ( ! $post_type ) {
+		wp_die( __( 'Invalid post type.' ) );
+	}
+}
+
+$active_global_styles_id = WP_Theme_JSON_Resolver::get_user_global_styles_post_id();
+$active_theme            = wp_get_theme()->get_stylesheet();
+$preload_paths           = array(
+	array( '/wp/v2/media', 'OPTIONS' ),
+	'/',
+	'/wp/v2/types?context=edit',
+	'/wp/v2/types/wp_template?context=edit',
+	'/wp/v2/types/wp_template-part?context=edit',
+	'/wp/v2/taxonomies?context=edit',
+	'/wp/v2/pages?context=edit',
+	'/wp/v2/categories?context=edit',
+	'/wp/v2/posts?context=edit',
+	'/wp/v2/tags?context=edit',
+	'/wp/v2/templates?context=edit&per_page=-1',
+	'/wp/v2/template-parts?context=edit&per_page=-1',
+	'/wp/v2/settings',
+	'/wp/v2/themes?context=edit&status=active',
+	'/wp/v2/global-styles/' . $active_global_styles_id . '?context=edit',
+	'/wp/v2/global-styles/' . $active_global_styles_id,
+	'/wp/v2/global-styles/themes/' . $active_theme,
+);
+
+block_editor_rest_api_preload( $preload_paths, $block_editor_context );
+
+wp_add_inline_script(
+	'wp-edit-site',
+	sprintf(
+		'wp.domReady( function() {
+			wp.editSite.initializeEditor( "site-editor", %s );
+		} );',
+		wp_json_encode( $editor_settings )
+	)
+);
+
+// Preload server-registered block schemas.
+wp_add_inline_script(
+	'wp-blocks',
+	'wp.blocks.unstable__bootstrapServerSideBlockDefinitions(' . wp_json_encode( get_block_editor_server_block_settings() ) . ');'
+);
+
+wp_add_inline_script(
+	'wp-blocks',
+	sprintf( 'wp.blocks.setCategories( %s );', wp_json_encode( get_block_categories( $post ) ) ),
+	'after'
+);
+
+wp_enqueue_script( 'wp-edit-site' );
+wp_enqueue_script( 'wp-format-library' );
+wp_enqueue_style( 'wp-edit-site' );
+wp_enqueue_style( 'wp-format-library' );
+wp_enqueue_media();
+
+if (
+	current_theme_supports( 'wp-block-styles' ) ||
+	( ! is_array( $editor_styles ) || count( $editor_styles ) === 0 )
+) {
+	wp_enqueue_style( 'wp-block-library-theme' );
+}
+
+/** This action is documented in wp-admin/edit-form-blocks.php */
+do_action( 'enqueue_block_editor_assets' );
+
+require_once ABSPATH . 'wp-admin/admin-header.php';
+?>
+
+<div id="site-editor" class="edit-site"></div>
+
+<?php
+
+require_once ABSPATH . 'wp-admin/admin-footer.php';
diff --git a/src/wp-admin/site-health.php b/src/wp-admin/site-health.php
index c31e4018eb..1b2d22aa30 100644
--- a/src/wp-admin/site-health.php
+++ b/src/wp-admin/site-health.php
@@ -19,14 +19,14 @@ $tabs = array(
 );
 
 /**
- * An associated array of extra tabs for the Site Health navigation bar.
+ * An associative array of extra tabs for the Site Health navigation bar.
  *
  * Add a custom page to the Site Health screen, based on a tab slug and label.
  * The label you provide will also be used as part of the site title.
  *
  * @since 5.8.0
  *
- * @param array $tabs An associated array of tab slugs and their label.
+ * @param string[] $tabs An associative array of tab labels keyed by their slug.
  */
 $tabs = apply_filters( 'site_health_navigation_tabs', $tabs );
 
@@ -74,6 +74,22 @@ if ( 'update_https' === $action ) {
 
 $health_check_site_status = WP_Site_Health::get_instance();
 
+get_current_screen()->add_help_tab(
+	array(
+		'id'      => 'overview',
+		'title'   => __( 'Overview' ),
+		'content' =>
+				'<p>' . __( 'This screen allows you to obtain a health diagnosis of your site, and displays an overall rating of the status of your installation.' ) . '</p>' .
+				'<p>' . __( 'In the Status tab, you can see critical information about your WordPress configuration, along with anything else that requires your attention.' ) . '</p>' .
+				'<p>' . __( 'In the Info tab, you will find all the details about the configuration of your WordPress site, server, and database. There is also an export feature that allows you to copy all of the information about your site to the clipboard, to help solve problems on your site when obtaining support.' ) . '</p>',
+	)
+);
+
+get_current_screen()->set_help_sidebar(
+	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
+	'<p>' . __( '<a href="https://wordpress.org/support/article/site-health-screen/">Documentation on Site Health tool</a>' ) . '</p>'
+);
+
 // Start by checking if this is a special request checking for the existence of certain filters.
 $health_check_site_status->check_wp_version_check_exists();
 
diff --git a/src/wp-admin/theme-editor.php b/src/wp-admin/theme-editor.php
index 68228edc40..090689d9b0 100644
--- a/src/wp-admin/theme-editor.php
+++ b/src/wp-admin/theme-editor.php
@@ -1,6 +1,6 @@
 <?php
 /**
- * Theme editor administration panel.
+ * Theme file editor administration panel.
  *
  * @package WordPress
  * @subpackage Administration
@@ -27,7 +27,7 @@ get_current_screen()->add_help_tab(
 		'id'      => 'overview',
 		'title'   => __( 'Overview' ),
 		'content' =>
-				'<p>' . __( 'You can use the theme editor to edit the individual CSS and PHP files which make up your theme.' ) . '</p>' .
+				'<p>' . __( 'You can use the theme file editor to edit the individual CSS and PHP files which make up your theme.' ) . '</p>' .
 				'<p>' . __( 'Begin by choosing a theme to edit from the dropdown menu and clicking the Select button. A list then appears of the theme&#8217;s template files. Clicking once on any file name causes the file to appear in the large Editor box.' ) . '</p>' .
 				'<p>' . __( 'For PHP files, you can use the Documentation dropdown to select from functions recognized in that file. Look Up takes you to a web page with reference material about that particular function.' ) . '</p>' .
 				'<p id="editor-keyboard-trap-help-1">' . __( 'When using a keyboard to navigate:' ) . '</p>' .
@@ -50,7 +50,7 @@ get_current_screen()->add_help_tab(
 get_current_screen()->set_help_sidebar(
 	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
 	'<p>' . __( '<a href="https://developer.wordpress.org/themes/">Documentation on Theme Development</a>' ) . '</p>' .
-	'<p>' . __( '<a href="https://wordpress.org/support/article/using-themes/">Documentation on Using Themes</a>' ) . '</p>' .
+	'<p>' . __( '<a href="https://wordpress.org/support/article/appearance-editor-screen/">Documentation on Editing Themes</a>' ) . '</p>' .
 	'<p>' . __( '<a href="https://wordpress.org/support/article/editing-files/">Documentation on Editing Files</a>' ) . '</p>' .
 	'<p>' . __( '<a href="https://developer.wordpress.org/themes/basics/template-tags/">Documentation on Template Tags</a>' ) . '</p>' .
 	'<p>' . __( '<a href="https://wordpress.org/support/">Support</a>' ) . '</p>'
@@ -196,7 +196,7 @@ if ( $file_description !== $file_show ) {
 	</div>
 <?php endif; ?>
 
-<?php if ( preg_match( '/\.css$/', $file ) ) : ?>
+<?php if ( preg_match( '/\.css$/', $file ) && ! wp_is_block_theme() && current_user_can( 'customize' ) ) : ?>
 	<div id="message" class="notice-info notice">
 		<p><strong><?php _e( 'Did you know?' ); ?></strong></p>
 		<p>
diff --git a/src/wp-admin/theme-install.php b/src/wp-admin/theme-install.php
index cd3a607ea9..71e95c987c 100644
--- a/src/wp-admin/theme-install.php
+++ b/src/wp-admin/theme-install.php
@@ -137,7 +137,7 @@ get_current_screen()->add_help_tab(
 
 get_current_screen()->set_help_sidebar(
 	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
-	'<p>' . __( '<a href="https://wordpress.org/support/article/using-themes/#adding-new-themes">Documentation on Adding New Themes</a>' ) . '</p>' .
+	'<p>' . __( '<a href="https://wordpress.org/support/article/appearance-themes-screen/#install-themes">Documentation on Adding New Themes</a>' ) . '</p>' .
 	'<p>' . __( '<a href="https://wordpress.org/support/">Support</a>' ) . '</p>'
 );
 
diff --git a/src/wp-admin/themes.php b/src/wp-admin/themes.php
index 9863aa68ae..09fb400912 100644
--- a/src/wp-admin/themes.php
+++ b/src/wp-admin/themes.php
@@ -74,7 +74,7 @@ if ( current_user_can( 'switch_themes' ) && isset( $_GET['action'] ) ) {
 		}
 
 		$active = wp_get_theme();
-		if ( $active->get( 'Template' ) == $_GET['stylesheet'] ) {
+		if ( $active->get( 'Template' ) === $_GET['stylesheet'] ) {
 			wp_redirect( admin_url( 'themes.php?delete-active-child=true' ) );
 		} else {
 			delete_theme( $_GET['stylesheet'] );
@@ -124,7 +124,7 @@ if ( current_user_can( 'switch_themes' ) && isset( $_GET['action'] ) ) {
 }
 
 // Used in the HTML title tag.
-$title       = __( 'Manage Themes' );
+$title       = __( 'Themes' );
 $parent_file = 'themes.php';
 
 // Help tab: Overview.
@@ -133,8 +133,8 @@ if ( current_user_can( 'switch_themes' ) ) {
 		'<p>' . __( 'From this screen you can:' ) . '</p>' .
 		'<ul><li>' . __( 'Hover or tap to see Activate and Live Preview buttons' ) . '</li>' .
 		'<li>' . __( 'Click on the theme to see the theme name, version, author, description, tags, and the Delete link' ) . '</li>' .
-		'<li>' . __( 'Click Customize for the current theme or Live Preview for any other theme to see a live preview' ) . '</li></ul>' .
-		'<p>' . __( 'The current theme is displayed highlighted as the first theme.' ) . '</p>' .
+		'<li>' . __( 'Click Customize for the active theme or Live Preview for any other theme to see a live preview' ) . '</li></ul>' .
+		'<p>' . __( 'The active theme is displayed highlighted as the first theme.' ) . '</p>' .
 		'<p>' . __( 'The search for installed themes will search for terms in their name, description, author, or tag.' ) . ' <span id="live-search-desc">' . __( 'The search results will be updated as you type.' ) . '</span></p>';
 
 	get_current_screen()->add_help_tab(
@@ -205,6 +205,7 @@ if ( current_user_can( 'update_themes' ) && wp_is_auto_update_enabled_for_type(
 get_current_screen()->set_help_sidebar(
 	'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
 	'<p>' . __( '<a href="https://wordpress.org/support/article/using-themes/">Documentation on Using Themes</a>' ) . '</p>' .
+	'<p>' . __( '<a href="https://wordpress.org/support/article/appearance-themes-screen/">Documentation on Managing Themes</a>' ) . '</p>' .
 	$help_sidebar_autoupdates .
 	'<p>' . __( '<a href="https://wordpress.org/support/">Support</a>' ) . '</p>'
 );
@@ -307,18 +308,31 @@ if ( $current_theme->errors() && ( ! is_multisite() || current_user_can( 'manage
 $current_theme_actions = array();
 
 if ( is_array( $submenu ) && isset( $submenu['themes.php'] ) ) {
+	$forbidden_paths = array(
+		'themes.php',
+		'theme-editor.php',
+		'site-editor.php',
+		'edit.php?post_type=wp_navigation',
+	);
+
 	foreach ( (array) $submenu['themes.php'] as $item ) {
 		$class = '';
-		if ( 'themes.php' === $item[2] || 'theme-editor.php' === $item[2] || 0 === strpos( $item[2], 'customize.php' ) ) {
+
+		if ( in_array( $item[2], $forbidden_paths, true ) || str_starts_with( $item[2], 'customize.php' ) ) {
 			continue;
 		}
+
 		// 0 = name, 1 = capability, 2 = file.
-		if ( ( strcmp( $self, $item[2] ) == 0 && empty( $parent_file ) ) || ( $parent_file && ( $item[2] == $parent_file ) ) ) {
+		if ( 0 === strcmp( $self, $item[2] ) && empty( $parent_file )
+			|| $parent_file && $item[2] === $parent_file
+		) {
 			$class = ' current';
 		}
+
 		if ( ! empty( $submenu[ $item[2] ] ) ) {
 			$submenu[ $item[2] ] = array_values( $submenu[ $item[2] ] ); // Re-index.
 			$menu_hook           = get_plugin_page_hook( $submenu[ $item[2] ][0][2], $item[2] );
+
 			if ( file_exists( WP_PLUGIN_DIR . "/{$submenu[$item[2]][0][2]}" ) || ! empty( $menu_hook ) ) {
 				$current_theme_actions[] = "<a class='button$class' href='admin.php?page={$submenu[$item[2]][0][2]}'>{$item[0]}</a>";
 			} else {
@@ -541,7 +555,7 @@ foreach ( $themes as $theme ) :
 			?>
 			<a class="button activate" href="<?php echo $theme['actions']['activate']; ?>" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Activate' ); ?></a>
 			<?php
-			if ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {
+			if ( ! $theme['blockTheme'] && current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) {
 				/* translators: %s: Theme name. */
 				$live_preview_aria_label = sprintf( _x( 'Live Preview %s', 'theme' ), '{{ data.name }}' );
 				?>
@@ -553,7 +567,7 @@ foreach ( $themes as $theme ) :
 			$aria_label = sprintf( _x( 'Cannot Activate %s', 'theme' ), '{{ data.name }}' );
 			?>
 			<a class="button disabled" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _ex( 'Cannot Activate', 'theme' ); ?></a>
-			<?php if ( current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) { ?>
+			<?php if ( ! $theme['blockTheme'] && current_user_can( 'edit_theme_options' ) && current_user_can( 'customize' ) ) { ?>
 				<a class="button button-primary hide-if-no-customize disabled"><?php _e( 'Live Preview' ); ?></a>
 			<?php } ?>
 		<?php } ?>
@@ -900,18 +914,22 @@ function wp_theme_auto_update_setting_template() {
 					$aria_label = sprintf( _x( 'Activate %s', 'theme' ), '{{ data.name }}' );
 					?>
 					<a class="button activate" href="{{{ data.actions.activate }}}" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Activate' ); ?></a>
-					<?php
-					/* translators: %s: Theme name. */
-					$live_preview_aria_label = sprintf( _x( 'Live Preview %s', 'theme' ), '{{ data.name }}' );
-					?>
-					<a aria-label="<?php echo esc_attr( $live_preview_aria_label ); ?>" class="button button-primary load-customize hide-if-no-customize" href="{{{ data.actions.customize }}}"><?php _e( 'Live Preview' ); ?></a>
+					<# if ( ! data.blockTheme ) { #>
+						<?php
+						/* translators: %s: Theme name. */
+						$live_preview_aria_label = sprintf( _x( 'Live Preview %s', 'theme' ), '{{ data.name }}' );
+						?>
+						<a aria-label="<?php echo esc_attr( $live_preview_aria_label ); ?>" class="button button-primary load-customize hide-if-no-customize" href="{{{ data.actions.customize }}}"><?php _e( 'Live Preview' ); ?></a>
+					<# } #>
 				<# } else { #>
 					<?php
 					/* translators: %s: Theme name. */
 					$aria_label = sprintf( _x( 'Cannot Activate %s', 'theme' ), '{{ data.name }}' );
 					?>
 					<a class="button disabled" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _ex( 'Cannot Activate', 'theme' ); ?></a>
-					<a class="button button-primary hide-if-no-customize disabled"><?php _e( 'Live Preview' ); ?></a>
+					<# if ( ! data.blockTheme ) { #>
+						<a class="button button-primary hide-if-no-customize disabled"><?php _e( 'Live Preview' ); ?></a>
+					<# } #>
 				<# } #>
 			<# } #>
 		</div>
@@ -937,7 +955,7 @@ function wp_theme_auto_update_setting_template() {
 
 			<div class="theme-info">
 				<# if ( data.active ) { #>
-					<span class="current-label"><?php _e( 'Current Theme' ); ?></span>
+					<span class="current-label"><?php _e( 'Active Theme' ); ?></span>
 				<# } #>
 				<h2 class="theme-name">{{{ data.name }}}<span class="theme-version">
 					<?php
@@ -1119,7 +1137,9 @@ function wp_theme_auto_update_setting_template() {
 					<# if ( data.actions.activate ) { #>
 						<a href="{{{ data.actions.activate }}}" class="button activate" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Activate' ); ?></a>
 					<# } #>
-					<a href="{{{ data.actions.customize }}}" class="button button-primary load-customize hide-if-no-customize"><?php _e( 'Live Preview' ); ?></a>
+					<# if ( ! data.blockTheme ) { #>
+						<a href="{{{ data.actions.customize }}}" class="button button-primary load-customize hide-if-no-customize"><?php _e( 'Live Preview' ); ?></a>
+					<# } #>
 				<# } else { #>
 					<?php
 					/* translators: %s: Theme name. */
@@ -1128,7 +1148,9 @@ function wp_theme_auto_update_setting_template() {
 					<# if ( data.actions.activate ) { #>
 						<a class="button disabled" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _ex( 'Cannot Activate', 'theme' ); ?></a>
 					<# } #>
-					<a class="button button-primary hide-if-no-customize disabled"><?php _e( 'Live Preview' ); ?></a>
+					<# if ( ! data.blockTheme ) { #>
+						<a class="button button-primary hide-if-no-customize disabled"><?php _e( 'Live Preview' ); ?></a>
+					<# } #>
 				<# } #>
 			</div>
 
diff --git a/src/wp-admin/update-core.php b/src/wp-admin/update-core.php
index a38e43c46f..783fc601ce 100644
--- a/src/wp-admin/update-core.php
+++ b/src/wp-admin/update-core.php
@@ -48,6 +48,8 @@ function list_core_update( $update ) {
 			// If the only available update is a partial builds, it doesn't need a language-specific version string.
 			$version_string = $update->current;
 		}
+	} elseif ( 'en_US' === $update->locale && 'en_US' !== get_locale() ) {
+		$version_string = sprintf( '%s&ndash;%s', $update->current, $update->locale );
 	}
 
 	$current = false;
@@ -204,18 +206,26 @@ function dismissed_updates() {
 			'available' => false,
 		)
 	);
-	if ( $dismissed ) {
 
+	if ( $dismissed ) {
 		$show_text = esc_js( __( 'Show hidden updates' ) );
 		$hide_text = esc_js( __( 'Hide hidden updates' ) );
 		?>
-	<script type="text/javascript">
-		jQuery(function( $ ) {
-			$( 'dismissed-updates' ).show();
-			$( '#show-dismissed' ).toggle( function() { $( this ).text( '<?php echo $hide_text; ?>' ).attr( 'aria-expanded', 'true' ); }, function() { $( this ).text( '<?php echo $show_text; ?>' ).attr( 'aria-expanded', 'false' ); } );
-			$( '#show-dismissed' ).click( function() { $( '#dismissed-updates' ).toggle( 'fast' ); } );
-		});
-	</script>
+		<script type="text/javascript">
+			jQuery( function( $ ) {
+				$( '#show-dismissed' ).on( 'click', function() {
+					var isExpanded = ( 'true' === $( this ).attr( 'aria-expanded' ) );
+
+					if ( isExpanded ) {
+						$( this ).text( '<?php echo $show_text; ?>' ).attr( 'aria-expanded', 'false' );
+					} else {
+						$( this ).text( '<?php echo $hide_text; ?>' ).attr( 'aria-expanded', 'true' );
+					}
+
+					$( '#dismissed-updates' ).toggle( 'fast' );
+				});
+			});
+		</script>
 		<?php
 		echo '<p class="hide-if-no-js"><button type="button" class="button" id="show-dismissed" aria-expanded="false">' . __( 'Show hidden updates' ) . '</button></p>';
 		echo '<ul id="dismissed-updates" class="core-updates dismissed">';
@@ -1044,7 +1054,7 @@ if ( 'upgrade-core' === $action ) {
 
 	echo '<p class="update-last-checked">';
 	/* translators: 1: Date, 2: Time. */
-	printf( __( 'Last checked on %1$s at %2$s.' ), date_i18n( __( 'F j, Y' ), $last_update_check ), date_i18n( __( 'g:i a' ), $last_update_check ) );
+	printf( __( 'Last checked on %1$s at %2$s.' ), date_i18n( __( 'F j, Y' ), $last_update_check ), date_i18n( __( 'g:i a T' ), $last_update_check ) );
 	echo ' <a href="' . esc_url( self_admin_url( 'update-core.php?force-check=1' ) ) . '">' . __( 'Check again.' ) . '</a>';
 	echo '</p>';
 
diff --git a/src/wp-admin/user-edit.php b/src/wp-admin/user-edit.php
index 813c5eb5cd..45fe5ecea3 100644
--- a/src/wp-admin/user-edit.php
+++ b/src/wp-admin/user-edit.php
@@ -13,8 +13,9 @@ wp_reset_vars( array( 'action', 'user_id', 'wp_http_referer' ) );
 
 $user_id      = (int) $user_id;
 $current_user = wp_get_current_user();
+
 if ( ! defined( 'IS_PROFILE_PAGE' ) ) {
-	define( 'IS_PROFILE_PAGE', ( $user_id == $current_user->ID ) );
+	define( 'IS_PROFILE_PAGE', ( $user_id === $current_user->ID ) );
 }
 
 if ( ! $user_id && IS_PROFILE_PAGE ) {
@@ -93,7 +94,7 @@ $user_can_edit = current_user_can( 'edit_posts' ) || current_user_can( 'edit_pag
  */
 if ( is_multisite()
 	&& ! current_user_can( 'manage_network_users' )
-	&& $user_id != $current_user->ID
+	&& $user_id !== $current_user->ID
 	&& ! apply_filters( 'enable_edit_any_user_configuration', true )
 ) {
 	wp_die( __( 'Sorry, you are not allowed to edit this user.' ) );
@@ -166,7 +167,10 @@ switch ( $action ) {
 		$errors = edit_user( $user_id );
 
 		// Grant or revoke super admin status if requested.
-		if ( is_multisite() && is_network_admin() && ! IS_PROFILE_PAGE && current_user_can( 'manage_network_options' ) && ! isset( $super_admins ) && empty( $_POST['super_admin'] ) == is_super_admin( $user_id ) ) {
+		if ( is_multisite() && is_network_admin()
+			&& ! IS_PROFILE_PAGE && current_user_can( 'manage_network_options' )
+			&& ! isset( $super_admins ) && empty( $_POST['super_admin'] ) === is_super_admin( $user_id )
+		) {
 			empty( $_POST['super_admin'] ) ? revoke_super_admin( $user_id ) : grant_super_admin( $user_id );
 		}
 
@@ -181,19 +185,19 @@ switch ( $action ) {
 
 		// Intentional fall-through to display $errors.
 	default:
-		$profileuser = get_user_to_edit( $user_id );
+		$profile_user = get_user_to_edit( $user_id );
 
 		if ( ! current_user_can( 'edit_user', $user_id ) ) {
 			wp_die( __( 'Sorry, you are not allowed to edit this user.' ) );
 		}
 
-		$title    = sprintf( $title, $profileuser->display_name );
-		$sessions = WP_Session_Tokens::get_instance( $profileuser->ID );
+		$title    = sprintf( $title, $profile_user->display_name );
+		$sessions = WP_Session_Tokens::get_instance( $profile_user->ID );
 
 		require_once ABSPATH . 'wp-admin/admin-header.php';
 		?>
 
-		<?php if ( ! IS_PROFILE_PAGE && is_super_admin( $profileuser->ID ) && current_user_can( 'manage_network_options' ) ) { ?>
+		<?php if ( ! IS_PROFILE_PAGE && is_super_admin( $profile_user->ID ) && current_user_can( 'manage_network_options' ) ) { ?>
 	<div class="notice notice-info"><p><strong><?php _e( 'Important:' ); ?></strong> <?php _e( 'This user has super admin privileges.' ); ?></p></div>
 <?php } ?>
 		<?php if ( isset( $_GET['updated'] ) ) : ?>
@@ -266,7 +270,7 @@ switch ( $action ) {
 	<tr class="user-rich-editing-wrap">
 		<th scope="row"><?php _e( 'Visual Editor' ); ?></th>
 		<td>
-			<label for="rich_editing"><input name="rich_editing" type="checkbox" id="rich_editing" value="false" <?php checked( 'false', $profileuser->rich_editing ); ?> />
+			<label for="rich_editing"><input name="rich_editing" type="checkbox" id="rich_editing" value="false" <?php checked( 'false', $profile_user->rich_editing ); ?> />
 				<?php _e( 'Disable the visual editor when writing' ); ?>
 			</label>
 		</td>
@@ -275,13 +279,13 @@ switch ( $action ) {
 		<?php
 		$show_syntax_highlighting_preference = (
 		// For Custom HTML widget and Additional CSS in Customizer.
-		user_can( $profileuser, 'edit_theme_options' )
+		user_can( $profile_user, 'edit_theme_options' )
 		||
 		// Edit plugins.
-		user_can( $profileuser, 'edit_plugins' )
+		user_can( $profile_user, 'edit_plugins' )
 		||
 		// Edit themes.
-		user_can( $profileuser, 'edit_themes' )
+		user_can( $profile_user, 'edit_themes' )
 		);
 		?>
 
@@ -289,7 +293,7 @@ switch ( $action ) {
 	<tr class="user-syntax-highlighting-wrap">
 		<th scope="row"><?php _e( 'Syntax Highlighting' ); ?></th>
 		<td>
-			<label for="syntax_highlighting"><input name="syntax_highlighting" type="checkbox" id="syntax_highlighting" value="false" <?php checked( 'false', $profileuser->syntax_highlighting ); ?> />
+			<label for="syntax_highlighting"><input name="syntax_highlighting" type="checkbox" id="syntax_highlighting" value="false" <?php checked( 'false', $profile_user->syntax_highlighting ); ?> />
 				<?php _e( 'Disable syntax highlighting when editing code' ); ?>
 			</label>
 		</td>
@@ -323,7 +327,7 @@ switch ( $action ) {
 		<th scope="row"><?php _e( 'Keyboard Shortcuts' ); ?></th>
 		<td>
 			<label for="comment_shortcuts">
-				<input type="checkbox" name="comment_shortcuts" id="comment_shortcuts" value="true" <?php checked( 'true', $profileuser->comment_shortcuts ); ?> />
+				<input type="checkbox" name="comment_shortcuts" id="comment_shortcuts" value="true" <?php checked( 'true', $profile_user->comment_shortcuts ); ?> />
 				<?php _e( 'Enable keyboard shortcuts for comment moderation.' ); ?>
 			</label>
 			<?php _e( '<a href="https://wordpress.org/support/article/keyboard-shortcuts/" target="_blank">More information</a>' ); ?>
@@ -335,7 +339,7 @@ switch ( $action ) {
 		<th scope="row"><?php _e( 'Toolbar' ); ?></th>
 		<td>
 			<label for="admin_bar_front">
-				<input name="admin_bar_front" type="checkbox" id="admin_bar_front" value="1"<?php checked( _get_admin_bar_pref( 'front', $profileuser->ID ) ); ?> />
+				<input name="admin_bar_front" type="checkbox" id="admin_bar_front" value="1"<?php checked( _get_admin_bar_pref( 'front', $profile_user->ID ) ); ?> />
 				<?php _e( 'Show Toolbar when viewing site' ); ?>
 			</label><br />
 		</td>
@@ -352,7 +356,7 @@ switch ( $action ) {
 		</th>
 		<td>
 			<?php
-				$user_locale = $profileuser->locale;
+				$user_locale = $profile_user->locale;
 
 			if ( 'en_US' === $user_locale ) {
 				$user_locale = '';
@@ -383,9 +387,9 @@ endif;
 		 *
 		 * @since 2.7.0
 		 *
-		 * @param WP_User $profileuser The current WP_User object.
+		 * @param WP_User $profile_user The current WP_User object.
 		 */
-		do_action( 'personal_options', $profileuser );
+		do_action( 'personal_options', $profile_user );
 		?>
 
 </table>
@@ -398,9 +402,9 @@ endif;
 			 *
 			 * @since 2.0.0
 			 *
-			 * @param WP_User $profileuser The current WP_User object.
+			 * @param WP_User $profile_user The current WP_User object.
 			 */
-			do_action( 'profile_personal_options', $profileuser );
+			do_action( 'profile_personal_options', $profile_user );
 		}
 		?>
 
@@ -409,15 +413,15 @@ endif;
 <table class="form-table" role="presentation">
 	<tr class="user-user-login-wrap">
 		<th><label for="user_login"><?php _e( 'Username' ); ?></label></th>
-		<td><input type="text" name="user_login" id="user_login" value="<?php echo esc_attr( $profileuser->user_login ); ?>" disabled="disabled" class="regular-text" /> <span class="description"><?php _e( 'Usernames cannot be changed.' ); ?></span></td>
+		<td><input type="text" name="user_login" id="user_login" value="<?php echo esc_attr( $profile_user->user_login ); ?>" disabled="disabled" class="regular-text" /> <span class="description"><?php _e( 'Usernames cannot be changed.' ); ?></span></td>
 	</tr>
 
-		<?php if ( ! IS_PROFILE_PAGE && ! is_network_admin() && current_user_can( 'promote_user', $profileuser->ID ) ) : ?>
+		<?php if ( ! IS_PROFILE_PAGE && ! is_network_admin() && current_user_can( 'promote_user', $profile_user->ID ) ) : ?>
 <tr class="user-role-wrap"><th><label for="role"><?php _e( 'Role' ); ?></label></th>
 <td><select name="role" id="role">
 			<?php
 			// Compare user role against currently editable roles.
-			$user_roles = array_intersect( array_values( $profileuser->roles ), array_keys( get_editable_roles() ) );
+			$user_roles = array_intersect( array_values( $profile_user->roles ), array_keys( get_editable_roles() ) );
 			$user_role  = reset( $user_roles );
 
 			// Print the full list of roles with the primary one selected.
@@ -438,8 +442,8 @@ endif;
 			?>
 <tr class="user-super-admin-wrap"><th><?php _e( 'Super Admin' ); ?></th>
 <td>
-			<?php if ( 0 !== strcasecmp( $profileuser->user_email, get_site_option( 'admin_email' ) ) || ! is_super_admin( $profileuser->ID ) ) : ?>
-<p><label><input type="checkbox" id="super_admin" name="super_admin"<?php checked( is_super_admin( $profileuser->ID ) ); ?> /> <?php _e( 'Grant this user super admin privileges for the Network.' ); ?></label></p>
+			<?php if ( 0 !== strcasecmp( $profile_user->user_email, get_site_option( 'admin_email' ) ) || ! is_super_admin( $profile_user->ID ) ) : ?>
+<p><label><input type="checkbox" id="super_admin" name="super_admin"<?php checked( is_super_admin( $profile_user->ID ) ); ?> /> <?php _e( 'Grant this user super admin privileges for the Network.' ); ?></label></p>
 <?php else : ?>
 <p><?php _e( 'Super admin privileges cannot be removed because this user has the network admin email.' ); ?></p>
 <?php endif; ?>
@@ -448,17 +452,17 @@ endif;
 
 <tr class="user-first-name-wrap">
 	<th><label for="first_name"><?php _e( 'First Name' ); ?></label></th>
-	<td><input type="text" name="first_name" id="first_name" value="<?php echo esc_attr( $profileuser->first_name ); ?>" class="regular-text" /></td>
+	<td><input type="text" name="first_name" id="first_name" value="<?php echo esc_attr( $profile_user->first_name ); ?>" class="regular-text" /></td>
 </tr>
 
 <tr class="user-last-name-wrap">
 	<th><label for="last_name"><?php _e( 'Last Name' ); ?></label></th>
-	<td><input type="text" name="last_name" id="last_name" value="<?php echo esc_attr( $profileuser->last_name ); ?>" class="regular-text" /></td>
+	<td><input type="text" name="last_name" id="last_name" value="<?php echo esc_attr( $profile_user->last_name ); ?>" class="regular-text" /></td>
 </tr>
 
 <tr class="user-nickname-wrap">
 	<th><label for="nickname"><?php _e( 'Nickname' ); ?> <span class="description"><?php _e( '(required)' ); ?></span></label></th>
-	<td><input type="text" name="nickname" id="nickname" value="<?php echo esc_attr( $profileuser->nickname ); ?>" class="regular-text" /></td>
+	<td><input type="text" name="nickname" id="nickname" value="<?php echo esc_attr( $profile_user->nickname ); ?>" class="regular-text" /></td>
 </tr>
 
 <tr class="user-display-name-wrap">
@@ -467,24 +471,24 @@ endif;
 		<select name="display_name" id="display_name">
 		<?php
 			$public_display                     = array();
-			$public_display['display_nickname'] = $profileuser->nickname;
-			$public_display['display_username'] = $profileuser->user_login;
+			$public_display['display_nickname'] = $profile_user->nickname;
+			$public_display['display_username'] = $profile_user->user_login;
 
-		if ( ! empty( $profileuser->first_name ) ) {
-			$public_display['display_firstname'] = $profileuser->first_name;
+		if ( ! empty( $profile_user->first_name ) ) {
+			$public_display['display_firstname'] = $profile_user->first_name;
 		}
 
-		if ( ! empty( $profileuser->last_name ) ) {
-			$public_display['display_lastname'] = $profileuser->last_name;
+		if ( ! empty( $profile_user->last_name ) ) {
+			$public_display['display_lastname'] = $profile_user->last_name;
 		}
 
-		if ( ! empty( $profileuser->first_name ) && ! empty( $profileuser->last_name ) ) {
-			$public_display['display_firstlast'] = $profileuser->first_name . ' ' . $profileuser->last_name;
-			$public_display['display_lastfirst'] = $profileuser->last_name . ' ' . $profileuser->first_name;
+		if ( ! empty( $profile_user->first_name ) && ! empty( $profile_user->last_name ) ) {
+			$public_display['display_firstlast'] = $profile_user->first_name . ' ' . $profile_user->last_name;
+			$public_display['display_lastfirst'] = $profile_user->last_name . ' ' . $profile_user->first_name;
 		}
 
-		if ( ! in_array( $profileuser->display_name, $public_display, true ) ) { // Only add this if it isn't duplicated elsewhere.
-			$public_display = array( 'display_displayname' => $profileuser->display_name ) + $public_display;
+		if ( ! in_array( $profile_user->display_name, $public_display, true ) ) { // Only add this if it isn't duplicated elsewhere.
+			$public_display = array( 'display_displayname' => $profile_user->display_name ) + $public_display;
 		}
 
 			$public_display = array_map( 'trim', $public_display );
@@ -492,7 +496,7 @@ endif;
 
 		foreach ( $public_display as $id => $item ) {
 			?>
-		<option <?php selected( $profileuser->display_name, $item ); ?>><?php echo $item; ?></option>
+		<option <?php selected( $profile_user->display_name, $item ); ?>><?php echo $item; ?></option>
 			<?php
 		}
 		?>
@@ -506,9 +510,9 @@ endif;
 	<table class="form-table" role="presentation">
 	<tr class="user-email-wrap">
 		<th><label for="email"><?php _e( 'Email' ); ?> <span class="description"><?php _e( '(required)' ); ?></span></label></th>
-		<td><input type="email" name="email" id="email" aria-describedby="email-description" value="<?php echo esc_attr( $profileuser->user_email ); ?>" class="regular-text ltr" />
+		<td><input type="email" name="email" id="email" aria-describedby="email-description" value="<?php echo esc_attr( $profile_user->user_email ); ?>" class="regular-text ltr" />
 		<?php
-		if ( $profileuser->ID == $current_user->ID ) :
+		if ( $profile_user->ID === $current_user->ID ) :
 			?>
 		<p class="description" id="email-description">
 			<?php _e( 'If you change this, we will send you an email at your new address to confirm it. <strong>The new address will not become active until confirmed.</strong>' ); ?>
@@ -517,7 +521,7 @@ endif;
 		endif;
 
 		$new_email = get_user_meta( $current_user->ID, '_new_email', true );
-		if ( $new_email && $new_email['newemail'] != $current_user->user_email && $profileuser->ID == $current_user->ID ) :
+		if ( $new_email && $new_email['newemail'] !== $current_user->user_email && $profile_user->ID === $current_user->ID ) :
 			?>
 		<div class="updated inline">
 		<p>
@@ -541,11 +545,11 @@ endif;
 
 	<tr class="user-url-wrap">
 	<th><label for="url"><?php _e( 'Website' ); ?></label></th>
-	<td><input type="url" name="url" id="url" value="<?php echo esc_attr( $profileuser->user_url ); ?>" class="regular-text code" /></td>
+	<td><input type="url" name="url" id="url" value="<?php echo esc_attr( $profile_user->user_url ); ?>" class="regular-text code" /></td>
 	</tr>
 
 		<?php
-		foreach ( wp_get_user_contact_methods( $profileuser ) as $name => $desc ) {
+		foreach ( wp_get_user_contact_methods( $profile_user ) as $name => $desc ) {
 			?>
 	<tr class="user-<?php echo $name; ?>-wrap">
 <th><label for="<?php echo $name; ?>">
@@ -563,7 +567,7 @@ endif;
 			echo apply_filters( "user_{$name}_label", $desc );
 			?>
 	</label></th>
-	<td><input type="text" name="<?php echo $name; ?>" id="<?php echo $name; ?>" value="<?php echo esc_attr( $profileuser->$name ); ?>" class="regular-text" /></td>
+	<td><input type="text" name="<?php echo $name; ?>" id="<?php echo $name; ?>" value="<?php echo esc_attr( $profile_user->$name ); ?>" class="regular-text" /></td>
 	</tr>
 			<?php
 		}
@@ -575,7 +579,7 @@ endif;
 <table class="form-table" role="presentation">
 <tr class="user-description-wrap">
 	<th><label for="description"><?php _e( 'Biographical Info' ); ?></label></th>
-	<td><textarea name="description" id="description" rows="5" cols="30"><?php echo $profileuser->description; // textarea_escaped ?></textarea>
+	<td><textarea name="description" id="description" rows="5" cols="30"><?php echo $profile_user->description; // textarea_escaped ?></textarea>
 	<p class="description"><?php _e( 'Share a little biographical information to fill out your profile. This may be shown publicly.' ); ?></p></td>
 </tr>
 
@@ -600,12 +604,12 @@ endif;
 			 * Filters the user profile picture description displayed under the Gravatar.
 			 *
 			 * @since 4.4.0
-			 * @since 4.7.0 Added the `$profileuser` parameter.
+			 * @since 4.7.0 Added the `$profile_user` parameter.
 			 *
-			 * @param string  $description The description that will be printed.
-			 * @param WP_User $profileuser The current WP_User object.
+			 * @param string  $description  The description that will be printed.
+			 * @param WP_User $profile_user The current WP_User object.
 			 */
-			echo apply_filters( 'user_profile_picture_description', $description, $profileuser );
+			echo apply_filters( 'user_profile_picture_description', $description, $profile_user );
 			?>
 		</p>
 	</td>
@@ -616,13 +620,13 @@ endif;
 		 * Filters the display of the password fields.
 		 *
 		 * @since 1.5.1
-		 * @since 2.8.0 Added the `$profileuser` parameter.
+		 * @since 2.8.0 Added the `$profile_user` parameter.
 		 * @since 4.4.0 Now evaluated only in user-edit.php.
 		 *
-		 * @param bool    $show        Whether to show the password fields. Default true.
-		 * @param WP_User $profileuser User object for the current user to edit.
+		 * @param bool    $show         Whether to show the password fields. Default true.
+		 * @param WP_User $profile_user User object for the current user to edit.
 		 */
-		$show_password_fields = apply_filters( 'show_password_fields', true, $profileuser );
+		$show_password_fields = apply_filters( 'show_password_fields', true, $profile_user );
 		if ( $show_password_fields ) :
 			?>
 	</table>
@@ -686,8 +690,11 @@ endif;
 			</div>
 			<p class="description">
 				<?php
-				/* translators: %s: User's display name. */
-				printf( __( 'Send %s a link to reset their password. This will not change their password, nor will it force a change.' ), esc_html( $profileuser->display_name ) );
+				printf(
+					/* translators: %s: User's display name. */
+					__( 'Send %s a link to reset their password. This will not change their password, nor will it force a change.' ),
+					esc_html( $profile_user->display_name )
+				);
 				?>
 			</p>
 		</td>
@@ -724,7 +731,7 @@ endif;
 			<p class="description">
 				<?php
 				/* translators: %s: User's display name. */
-				printf( __( 'Log %s out of all locations.' ), $profileuser->display_name );
+				printf( __( 'Log %s out of all locations.' ), $profile_user->display_name );
 				?>
 			</p>
 		</td>
@@ -733,6 +740,7 @@ endif;
 
 	</table>
 
+<?php if ( wp_is_application_passwords_available_for_user( $user_id ) || ! wp_is_application_passwords_supported() ) : // phpcs:disable Generic.WhiteSpace.ScopeIndent ?>
 	<div class="application-passwords hide-if-no-js" id="application-passwords-section">
 		<h2><?php _e( 'Application Passwords' ); ?></h2>
 		<p><?php _e( 'Application passwords allow authentication via non-interactive systems, such as XML-RPC or the REST API, without providing your actual password. Application passwords can be easily revoked. They cannot be used for traditional logins to your website.' ); ?></p>
@@ -776,9 +784,9 @@ endif;
 				 *
 				 * @since 5.6.0
 				 *
-				 * @param WP_User $profileuser The current WP_User object.
+				 * @param WP_User $profile_user The current WP_User object.
 				 */
-				do_action( 'wp_create_application_password_form', $profileuser );
+				do_action( 'wp_create_application_password_form', $profile_user );
 				?>
 
 				<button type="button" name="do_new_application_password" id="do_new_application_password" class="button button-secondary"><?php _e( 'Add New Application Password' ); ?></button>
@@ -796,7 +804,7 @@ endif;
 			$application_passwords_list_table->display();
 			?>
 		</div>
-		<?php else : ?>
+		<?php elseif ( ! wp_is_application_passwords_supported() ) : ?>
 			<p><?php _e( 'The application password feature requires HTTPS, which is not enabled on this site.' ); ?></p>
 			<p>
 				<?php
@@ -809,6 +817,7 @@ endif;
 			</p>
 		<?php endif; ?>
 	</div>
+<?php endif; // phpcs:enable Generic.WhiteSpace.ScopeIndent ?>
 
 		<?php
 		if ( IS_PROFILE_PAGE ) {
@@ -819,18 +828,18 @@ endif;
 			 *
 			 * @since 2.0.0
 			 *
-			 * @param WP_User $profileuser The current WP_User object.
+			 * @param WP_User $profile_user The current WP_User object.
 			 */
-			do_action( 'show_user_profile', $profileuser );
+			do_action( 'show_user_profile', $profile_user );
 		} else {
 			/**
 			 * Fires after the 'About the User' settings table on the 'Edit User' screen.
 			 *
 			 * @since 2.0.0
 			 *
-			 * @param WP_User $profileuser The current WP_User object.
+			 * @param WP_User $profile_user The current WP_User object.
 			 */
-			do_action( 'edit_user_profile', $profileuser );
+			do_action( 'edit_user_profile', $profile_user );
 		}
 		?>
 
@@ -844,11 +853,11 @@ endif;
 		 *
 		 * @since 2.8.0
 		 *
-		 * @param bool    $enable      Whether to display the capabilities. Default true.
-		 * @param WP_User $profileuser The current WP_User object.
+		 * @param bool    $enable       Whether to display the capabilities. Default true.
+		 * @param WP_User $profile_user The current WP_User object.
 		 */
-		if ( count( $profileuser->caps ) > count( $profileuser->roles )
-		&& apply_filters( 'additional_capabilities_display', true, $profileuser )
+		if ( count( $profile_user->caps ) > count( $profile_user->roles )
+			&& apply_filters( 'additional_capabilities_display', true, $profile_user )
 		) :
 			?>
 	<h2><?php _e( 'Additional Capabilities' ); ?></h2>
@@ -858,9 +867,9 @@ endif;
 	<td>
 			<?php
 			$output = '';
-			foreach ( $profileuser->caps as $cap => $value ) {
+			foreach ( $profile_user->caps as $cap => $value ) {
 				if ( ! $wp_roles->is_role( $cap ) ) {
-					if ( '' != $output ) {
+					if ( '' !== $output ) {
 						$output .= ', ';
 					}
 
diff --git a/src/wp-comments-post.php b/src/wp-comments-post.php
index 06cbd460f4..e9a758dcfd 100644
--- a/src/wp-comments-post.php
+++ b/src/wp-comments-post.php
@@ -7,7 +7,7 @@
 
 if ( 'POST' !== $_SERVER['REQUEST_METHOD'] ) {
 	$protocol = $_SERVER['SERVER_PROTOCOL'];
-	if ( ! in_array( $protocol, array( 'HTTP/1.1', 'HTTP/2', 'HTTP/2.0' ), true ) ) {
+	if ( ! in_array( $protocol, array( 'HTTP/1.1', 'HTTP/2', 'HTTP/2.0', 'HTTP/3' ), true ) ) {
 		$protocol = 'HTTP/1.0';
 	}
 
diff --git a/src/wp-content/themes/twentyeleven/inc/theme-options.js b/src/wp-content/themes/twentyeleven/inc/theme-options.js
index 4cfaec1512..dcbb072d4f 100644
--- a/src/wp-content/themes/twentyeleven/inc/theme-options.js
+++ b/src/wp-content/themes/twentyeleven/inc/theme-options.js
@@ -7,7 +7,7 @@ var farbtastic;
 		$('#link-color-example').css('background-color', a);
 	};
 
-	$(document).ready( function() {
+	$( function() {
 		$('#default-color').wrapInner('<a href="#" />');
 
 		farbtastic = $.farbtastic('#colorPickerDiv', pickColor);
@@ -48,5 +48,5 @@ var farbtastic;
 
 			currentDefault.text( newDefault );
 		});
-	});
-})(jQuery);
\ No newline at end of file
+	} );
+})(jQuery);
diff --git a/src/wp-content/themes/twentyeleven/js/showcase.js b/src/wp-content/themes/twentyeleven/js/showcase.js
index e1902e6b9c..91973f4854 100644
--- a/src/wp-content/themes/twentyeleven/js/showcase.js
+++ b/src/wp-content/themes/twentyeleven/js/showcase.js
@@ -1,5 +1,5 @@
 (function($) {
-	$(document).ready( function() {
+	$( function() {
 	    $('.feature-slider a').on( 'click', function(e) {
 	        $('.featured-posts section.featured-post').css({
 	            opacity: 0,
@@ -13,5 +13,5 @@
 	        $(this).addClass('active');
 	        e.preventDefault();
 	    });
-	});
+	} );
 })(jQuery);
diff --git a/src/wp-content/themes/twentyeleven/readme.txt b/src/wp-content/themes/twentyeleven/readme.txt
index 72dac3e21f..3dad441371 100644
--- a/src/wp-content/themes/twentyeleven/readme.txt
+++ b/src/wp-content/themes/twentyeleven/readme.txt
@@ -1,8 +1,8 @@
 === Twenty Eleven ===
 Contributors: wordpressdotorg
 Requires at least: WordPress 3.2
-Tested up to: 5.8
-Stable tag: 3.9
+Tested up to: 5.9
+Stable tag: 4.0
 License: GPLv2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
 Tags: blog, one-column, two-columns, left-sidebar, right-sidebar, custom-background, custom-colors, custom-header, custom-menu, editor-style, featured-image-header, featured-images, flexible-header, footer-widgets, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready, block-patterns
@@ -22,7 +22,7 @@ For more information about Twenty Eleven please go to https://codex.wordpress.or
 
 == Copyright ==
 
-Twenty Eleven WordPress Theme, Copyright 2011-2021 WordPress.org & Automattic.com
+Twenty Eleven WordPress Theme, Copyright 2011-2022 WordPress.org & Automattic.com
 Twenty Eleven is Distributed under the terms of the GNU GPL
 
 This program is free software: you can redistribute it and/or modify
@@ -47,6 +47,11 @@ Images
 
 == Changelog ==
 
+= 4.0 =
+* Released: January 25, 2022
+
+https://codex.wordpress.org/Twenty_Eleven_Theme_Changelog#Version_4.0
+
 = 3.9 =
 * Released: July 26, 2021
 
diff --git a/src/wp-content/themes/twentyeleven/rtl.css b/src/wp-content/themes/twentyeleven/rtl.css
index 2354d691c5..5241297fc6 100644
--- a/src/wp-content/themes/twentyeleven/rtl.css
+++ b/src/wp-content/themes/twentyeleven/rtl.css
@@ -444,10 +444,10 @@ section.recent-posts .other-recent-posts .comments-link > span {
 	-moz-box-shadow: -1px 2px 2px rgba(204,204,204,0.8);
 	box-shadow: -1px 2px 2px rgba(204,204,204,0.8);
 }
-#respond .comment-form-author .required,
-#respond .comment-form-email .required {
-	left: auto;
-	right: 75%;
+#respond .comment-form label .required {
+	float: left;
+	margin-left: 0;
+	margin-right: 4px;
 }
 #respond .form-submit {
 	float: left;
diff --git a/src/wp-content/themes/twentyeleven/style.css b/src/wp-content/themes/twentyeleven/style.css
index f63975c648..3a29877ace 100644
--- a/src/wp-content/themes/twentyeleven/style.css
+++ b/src/wp-content/themes/twentyeleven/style.css
@@ -4,7 +4,8 @@ Theme URI: https://wordpress.org/themes/twentyeleven/
 Author: the WordPress team
 Author URI: https://wordpress.org/
 Description: The 2011 theme for WordPress is sophisticated, lightweight, and adaptable. Make it yours with a custom menu, header image, and background -- then go further with available theme options for light or dark color scheme, custom link colors, and three layout choices. Twenty Eleven comes equipped with a Showcase page template that transforms your front page into a showcase to show off your best content, widget support galore (sidebar, three footer areas, and a Showcase page widget area), and a custom "Ephemera" widget to display your Aside, Link, Quote, or Status posts. Included are styles for print and for the admin editor, support for featured images (as custom header images on posts and pages and as large images on featured "sticky" posts), and special styles for six different post formats.
-Version: 3.9
+Version: 4.0
+Tested up to: 5.9
 Requires PHP: 5.2.4
 License: GNU General Public License v2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
@@ -2232,14 +2233,20 @@ a.comment-reply-link > span {
 	resize: vertical;
 	width: 95%;
 }
-#respond .comment-form-author .required,
-#respond .comment-form-email .required {
+#respond .comment-form label .required,
+#respond .comment-form .comment-notes .required,
+#respond .comment-form .logged-in-as .required {
 	color: #bd3500;
 	font-size: 22px;
 	font-weight: bold;
-	left: 75%;
-	position: absolute;
-	z-index: 1;
+}
+#respond .comment-form label .required {
+	float: right;
+	margin-left: 4px;
+}
+#respond .comment-form .comment-notes .required,
+#respond .comment-form .logged-in-as .required {
+	vertical-align: middle;
 }
 #respond .comment-notes,
 #respond .logged-in-as {
diff --git a/src/wp-content/themes/twentyfifteen/js/functions.js b/src/wp-content/themes/twentyfifteen/js/functions.js
index eaa3cac3b4..1124de0d4d 100644
--- a/src/wp-content/themes/twentyfifteen/js/functions.js
+++ b/src/wp-content/themes/twentyfifteen/js/functions.js
@@ -111,7 +111,7 @@
 		}
 	}
 
-	$( document ).ready( function() {
+	$( function() {
 		$body          = $( document.body );
 		$window        = $( window );
 		$sidebar       = $( '#sidebar' ).first();
diff --git a/src/wp-content/themes/twentyfifteen/readme.txt b/src/wp-content/themes/twentyfifteen/readme.txt
index 5893fbbc89..c16c4acf96 100644
--- a/src/wp-content/themes/twentyfifteen/readme.txt
+++ b/src/wp-content/themes/twentyfifteen/readme.txt
@@ -1,8 +1,8 @@
 === Twenty Fifteen ===
 Contributors: wordpressdotorg
 Requires at least: WordPress 4.1
-Tested up to: 5.8
-Version: 3.0
+Tested up to: 5.9
+Version: 3.1
 License: GPLv2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
 Tags: blog, two-columns, left-sidebar, accessibility-ready, custom-background, custom-colors, custom-header, custom-logo, custom-menu, editor-style, featured-images, microformats, post-formats, rtl-language-support, sticky-post, threaded-comments, translation-ready, block-patterns
@@ -30,7 +30,7 @@ For more information about Twenty Fifteen please go to https://wordpress.org/sup
 
 == Copyright ==
 
-Twenty Fifteen WordPress Theme, Copyright 2014-2021 WordPress.org & Automattic.com
+Twenty Fifteen WordPress Theme, Copyright 2014-2022 WordPress.org & Automattic.com
 Twenty Fifteen is distributed under the terms of the GNU GPL
 
 This program is free software: you can redistribute it and/or modify
@@ -61,6 +61,11 @@ Source: https://stocksnap.io/photo/purple-yellow-ACF0693B9C
 
 == Changelog ==
 
+= 3.1 =
+* Released: January 25, 2022
+
+https://codex.wordpress.org/Twenty_Fifteen_Theme_Changelog#Version_3.1
+
 = 3.0 =
 * Released: July 20, 2021
 
diff --git a/src/wp-content/themes/twentyfifteen/style.css b/src/wp-content/themes/twentyfifteen/style.css
index d71923045f..66ee45694f 100644
--- a/src/wp-content/themes/twentyfifteen/style.css
+++ b/src/wp-content/themes/twentyfifteen/style.css
@@ -4,7 +4,8 @@ Theme URI: https://wordpress.org/themes/twentyfifteen/
 Author: the WordPress team
 Author URI: https://wordpress.org/
 Description: Our 2015 default theme is clean, blog-focused, and designed for clarity. Twenty Fifteen's simple, straightforward typography is readable on a wide variety of screen sizes, and suitable for multiple languages. We designed it using a mobile-first approach, meaning your content takes center-stage, regardless of whether your visitors arrive by smartphone, tablet, laptop, or desktop computer.
-Version: 3.0
+Version: 3.1
+Tested up to: 5.9
 Requires PHP: 5.2.4
 License: GNU General Public License v2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
diff --git a/src/wp-content/themes/twentyfourteen/functions.php b/src/wp-content/themes/twentyfourteen/functions.php
index 892d6ac939..0695bcce6d 100644
--- a/src/wp-content/themes/twentyfourteen/functions.php
+++ b/src/wp-content/themes/twentyfourteen/functions.php
@@ -498,6 +498,12 @@ if ( ! function_exists( 'twentyfourteen_list_authors' ) ) :
 			'capability' => array( 'edit_posts' ),
 		);
 
+		// Capability queries were only introduced in WP 5.9.
+		if ( version_compare( $GLOBALS['wp_version'], '5.9-alpha', '<' ) ) {
+			$args['who'] = 'authors';
+			unset( $args['capability'] );
+		}
+
 		/**
 		 * Filters query arguments for listing authors.
 		 *
diff --git a/src/wp-content/themes/twentyfourteen/js/featured-content-admin.js b/src/wp-content/themes/twentyfourteen/js/featured-content-admin.js
index 66f4c0718d..3bbe2cc6fd 100644
--- a/src/wp-content/themes/twentyfourteen/js/featured-content-admin.js
+++ b/src/wp-content/themes/twentyfourteen/js/featured-content-admin.js
@@ -4,6 +4,6 @@
  */
 /* global ajaxurl:true */
 
-jQuery( document ).ready( function( $ ) {
+jQuery( function($) {
 	$( '#customize-control-featured-content-tag-name input' ).suggest( ajaxurl + '?action=ajax-tag-search&tax=post_tag', { delay: 500, minchars: 2 } );
-});
+} );
diff --git a/src/wp-content/themes/twentyfourteen/readme.txt b/src/wp-content/themes/twentyfourteen/readme.txt
index b4bc3c0a80..4225b761ab 100644
--- a/src/wp-content/themes/twentyfourteen/readme.txt
+++ b/src/wp-content/themes/twentyfourteen/readme.txt
@@ -1,8 +1,8 @@
 === Twenty Fourteen ===
 Contributors: wordpressdotorg
 Requires at least: WordPress 3.6
-Tested up to: 5.8
-Stable tag: 3.2
+Tested up to: 5.9
+Stable tag: 3.3
 License: GPLv2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
 Tags: blog, news, two-columns, three-columns, left-sidebar, right-sidebar, custom-background, custom-header, custom-menu, editor-style, featured-images, flexible-header, footer-widgets, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready, accessibility-ready, block-patterns
@@ -22,7 +22,7 @@ For more information about Twenty Fourteen please go to https://codex.wordpress.
 
 == Copyright ==
 
-Twenty Fourteen WordPress Theme, Copyright 2013-2021 WordPress.org & Automattic.com
+Twenty Fourteen WordPress Theme, Copyright 2013-2022 WordPress.org & Automattic.com
 Twenty Fourteen is Distributed under the terms of the GNU GPL
 
 This program is free software: you can redistribute it and/or modify
@@ -58,6 +58,11 @@ Source: https://stocksnap.io/photo/fog-mountain-ZKN6UKFKEO
 
 == Changelog ==
 
+= 3.3 =
+* Released: January 25, 2022
+
+https://codex.wordpress.org/Twenty_Fourteen_Theme_Changelog#Version_3.3
+
 = 3.2 =
 * Released: July 20, 2021
 
diff --git a/src/wp-content/themes/twentyfourteen/rtl.css b/src/wp-content/themes/twentyfourteen/rtl.css
index 128f64fc3d..aec0583086 100644
--- a/src/wp-content/themes/twentyfourteen/rtl.css
+++ b/src/wp-content/themes/twentyfourteen/rtl.css
@@ -166,10 +166,6 @@ td {
 	padding-left: 7px;
 }
 
-.entry-content p span[id^="more-"] {
-	float: right;
-}
-
 
 /**
  * 6.5 Galleries
diff --git a/src/wp-content/themes/twentyfourteen/style.css b/src/wp-content/themes/twentyfourteen/style.css
index b09102a3e5..10049af230 100644
--- a/src/wp-content/themes/twentyfourteen/style.css
+++ b/src/wp-content/themes/twentyfourteen/style.css
@@ -4,7 +4,8 @@ Theme URI: https://wordpress.org/themes/twentyfourteen/
 Author: the WordPress team
 Author URI: https://wordpress.org/
 Description: In 2014, our default theme lets you create a responsive magazine website with a sleek, modern design. Feature your favorite homepage content in either a grid or a slider. Use the three widget areas to customize your website, and change your content's layout with a full-width page template and a contributor page to show off your authors. Creating a magazine website with WordPress has never been easier.
-Version: 3.2
+Version: 3.3
+Tested up to: 5.9
 Requires PHP: 5.2.4
 License: GNU General Public License v2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
@@ -95,6 +96,7 @@ html {
 	overflow-y: scroll;
 	-webkit-text-size-adjust: 100%;
 	-ms-text-size-adjust:     100%;
+	scroll-padding-top: calc( var(--wp-admin--admin-bar--height, 0px) + 48px );
 }
 
 body,
@@ -1304,10 +1306,6 @@ a.post-thumbnail:hover {
 	padding: 12px 10px 0;
 }
 
-.site-content .entry-content {
-	padding-top: 22px;
-}
-
 .page .entry-content {
 	padding-top: 0;
 }
@@ -1392,34 +1390,6 @@ a.post-thumbnail:hover {
 	white-space: nowrap;
 }
 
-.entry-content span[id^="more-"] {
-	display: block;
-	padding-top: 52px;
-	margin-top: -76px;
-}
-
-.admin-bar .entry-content span[id^="more-"] {
-	padding-top: 84px;
-	margin-top: -108px;
-}
-
-.entry-content span[id^="more-"] + blockquote,
-.entry-content span[id^="more-"] + div,
-.entry-content span[id^="more-"] + figure,
-.entry-content span[id^="more-"] + hr,
-.entry-content span[id^="more-"] + ol,
-.entry-content span[id^="more-"] + ul,
-.entry-content span[id^="more-"] + p,
-.entry-content span[id^="more-"] + pre {
-	margin-top: 24px;
-}
-
-.entry-content p span[id^="more-"] {
-	width: 1px;
-	height: 24px;
-	float: left;
-}
-
 /* Mediaelements */
 
 .hentry .mejs-container,
diff --git a/src/wp-content/themes/twentynineteen/inc/template-tags.php b/src/wp-content/themes/twentynineteen/inc/template-tags.php
index 1a2df80f3d..f73586506e 100644
--- a/src/wp-content/themes/twentynineteen/inc/template-tags.php
+++ b/src/wp-content/themes/twentynineteen/inc/template-tags.php
@@ -208,8 +208,7 @@ if ( ! function_exists( 'twentynineteen_comment_form' ) ) :
 
 			comment_form(
 				array(
-					'logged_in_as' => null,
-					'title_reply'  => null,
+					'title_reply' => null,
 				)
 			);
 		}
diff --git a/src/wp-content/themes/twentynineteen/package-lock.json b/src/wp-content/themes/twentynineteen/package-lock.json
index d300ae3cb4..0d93510455 100644
--- a/src/wp-content/themes/twentynineteen/package-lock.json
+++ b/src/wp-content/themes/twentynineteen/package-lock.json
@@ -1,9 +1,35 @@
 {
   "name": "twentynineteen",
-  "version": "2.1.0",
+  "version": "2.2.0",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {
+    "@babel/code-frame": {
+      "version": "7.16.0",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz",
+      "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==",
+      "dev": true,
+      "requires": {
+        "@babel/highlight": "^7.16.0"
+      }
+    },
+    "@babel/helper-validator-identifier": {
+      "version": "7.15.7",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz",
+      "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==",
+      "dev": true
+    },
+    "@babel/highlight": {
+      "version": "7.16.0",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz",
+      "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==",
+      "dev": true,
+      "requires": {
+        "@babel/helper-validator-identifier": "^7.15.7",
+        "chalk": "^2.0.0",
+        "js-tokens": "^4.0.0"
+      }
+    },
     "@nodelib/fs.scandir": {
       "version": "2.1.4",
       "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz",
@@ -30,6 +56,18 @@
         "fastq": "^1.6.0"
       }
     },
+    "@types/minimist": {
+      "version": "1.2.2",
+      "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz",
+      "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==",
+      "dev": true
+    },
+    "@types/normalize-package-data": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz",
+      "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
+      "dev": true
+    },
     "@wordpress/browserslist-config": {
       "version": "4.0.1",
       "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-4.0.1.tgz",
@@ -61,9 +99,9 @@
       "dev": true
     },
     "ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
       "dev": true
     },
     "ansi-styles": {
@@ -92,9 +130,9 @@
       "dev": true
     },
     "are-we-there-yet": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz",
-      "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==",
+      "version": "1.1.7",
+      "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
+      "integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
       "dev": true,
       "requires": {
         "delegates": "^1.0.0",
@@ -116,12 +154,6 @@
       "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
       "dev": true
     },
-    "array-find-index": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz",
-      "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=",
-      "dev": true
-    },
     "array-map": {
       "version": "0.0.0",
       "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
@@ -140,10 +172,16 @@
       "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
       "dev": true
     },
+    "arrify": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+      "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=",
+      "dev": true
+    },
     "asn1": {
-      "version": "0.2.4",
-      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
-      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+      "version": "0.2.6",
+      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz",
+      "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==",
       "dev": true,
       "requires": {
         "safer-buffer": "~2.1.0"
@@ -174,16 +212,16 @@
       "dev": true
     },
     "autoprefixer": {
-      "version": "9.8.6",
-      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.6.tgz",
-      "integrity": "sha512-XrvP4VVHdRBCdX1S3WXVD8+RyG9qeb1D5Sn1DeLiG2xfSpzellk5k54xbUERJ3M5DggQxes39UGOTP8CFrEGbg==",
+      "version": "9.8.8",
+      "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz",
+      "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==",
       "dev": true,
       "requires": {
         "browserslist": "^4.12.0",
         "caniuse-lite": "^1.0.30001109",
-        "colorette": "^1.2.1",
         "normalize-range": "^0.1.2",
         "num2fraction": "^1.2.2",
+        "picocolors": "^0.2.1",
         "postcss": "^7.0.32",
         "postcss-value-parser": "^4.1.0"
       }
@@ -241,16 +279,24 @@
       }
     },
     "browserslist": {
-      "version": "4.16.6",
-      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.6.tgz",
-      "integrity": "sha512-Wspk/PqO+4W9qp5iUTJsa1B/QrYn1keNCcEP5OvP7WBwT4KaDly0uONYmC6Xa3Z5IqnUgS0KcgLYu1l74x0ZXQ==",
+      "version": "4.17.6",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz",
+      "integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==",
       "dev": true,
       "requires": {
-        "caniuse-lite": "^1.0.30001219",
-        "colorette": "^1.2.2",
-        "electron-to-chromium": "^1.3.723",
+        "caniuse-lite": "^1.0.30001274",
+        "electron-to-chromium": "^1.3.886",
         "escalade": "^3.1.1",
-        "node-releases": "^1.1.71"
+        "node-releases": "^2.0.1",
+        "picocolors": "^1.0.0"
+      },
+      "dependencies": {
+        "picocolors": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+          "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+          "dev": true
+        }
       }
     },
     "caller-callsite": {
@@ -284,27 +330,20 @@
       "dev": true
     },
     "camelcase-keys": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
-      "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
+      "version": "6.2.2",
+      "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
+      "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
       "dev": true,
       "requires": {
-        "camelcase": "^2.0.0",
-        "map-obj": "^1.0.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "2.1.1",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz",
-          "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=",
-          "dev": true
-        }
+        "camelcase": "^5.3.1",
+        "map-obj": "^4.0.0",
+        "quick-lru": "^4.0.1"
       }
     },
     "caniuse-lite": {
-      "version": "1.0.30001228",
-      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001228.tgz",
-      "integrity": "sha512-QQmLOGJ3DEgokHbMSA8cj2a+geXqmnpyOFT0lhQV6P3/YOJvGDEwoedcwxEQ30gJIwIIunHIicunJ2rzK5gB2A==",
+      "version": "1.0.30001278",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001278.tgz",
+      "integrity": "sha512-mpF9KeH8u5cMoEmIic/cr7PNS+F5LWBk0t2ekGT60lFf0Wq+n9LspAj0g3P+o7DQhD3sUdlMln4YFAWhFYn9jg==",
       "dev": true
     },
     "caseless": {
@@ -341,91 +380,65 @@
       }
     },
     "chokidar-cli": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/chokidar-cli/-/chokidar-cli-2.1.0.tgz",
-      "integrity": "sha512-6n21AVpW6ywuEPoxJcLXMA2p4T+SLjWsXKny/9yTWFz0kKxESI3eUylpeV97LylING/27T/RVTY0f2/0QaWq9Q==",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/chokidar-cli/-/chokidar-cli-3.0.0.tgz",
+      "integrity": "sha512-xVW+Qeh7z15uZRxHOkP93Ux8A0xbPzwK4GaqD8dQOYc34TlkqUhVSS59fK36DOp5WdJlrRzlYSy02Ht99FjZqQ==",
       "dev": true,
       "requires": {
-        "chokidar": "^3.2.3",
+        "chokidar": "^3.5.2",
         "lodash.debounce": "^4.0.8",
         "lodash.throttle": "^4.1.1",
         "yargs": "^13.3.0"
       },
       "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "cliui": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
-          "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+        "anymatch": {
+          "version": "3.1.2",
+          "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+          "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
           "dev": true,
           "requires": {
-            "string-width": "^3.1.0",
-            "strip-ansi": "^5.2.0",
-            "wrap-ansi": "^5.1.0"
+            "normalize-path": "^3.0.0",
+            "picomatch": "^2.0.4"
           }
         },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+        "chokidar": {
+          "version": "3.5.2",
+          "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
+          "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
           "dev": true,
           "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
+            "anymatch": "~3.1.2",
+            "braces": "~3.0.2",
+            "fsevents": "~2.3.2",
+            "glob-parent": "~5.1.2",
+            "is-binary-path": "~2.1.0",
+            "is-glob": "~4.0.1",
+            "normalize-path": "~3.0.0",
+            "readdirp": "~3.6.0"
           }
         },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+        "fsevents": {
+          "version": "2.3.2",
+          "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+          "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
           "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
+          "optional": true
         },
-        "wrap-ansi": {
-          "version": "5.1.0",
-          "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
-          "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+        "readdirp": {
+          "version": "3.6.0",
+          "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+          "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
           "dev": true,
           "requires": {
-            "ansi-styles": "^3.2.0",
-            "string-width": "^3.0.0",
-            "strip-ansi": "^5.0.0"
-          }
-        },
-        "yargs": {
-          "version": "13.3.2",
-          "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
-          "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
-          "dev": true,
-          "requires": {
-            "cliui": "^5.0.0",
-            "find-up": "^3.0.0",
-            "get-caller-file": "^2.0.1",
-            "require-directory": "^2.1.1",
-            "require-main-filename": "^2.0.0",
-            "set-blocking": "^2.0.0",
-            "string-width": "^3.0.0",
-            "which-module": "^2.0.0",
-            "y18n": "^4.0.0",
-            "yargs-parser": "^13.1.2"
-          }
-        },
-        "yargs-parser": {
-          "version": "13.1.2",
-          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
-          "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
-          "dev": true,
-          "requires": {
-            "camelcase": "^5.0.0",
-            "decamelize": "^1.2.0"
+            "picomatch": "^2.2.1"
+          },
+          "dependencies": {
+            "picomatch": {
+              "version": "2.3.0",
+              "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+              "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+              "dev": true
+            }
           }
         }
       }
@@ -445,34 +458,6 @@
         "string-width": "^3.1.0",
         "strip-ansi": "^5.2.0",
         "wrap-ansi": "^5.1.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
       }
     },
     "code-point-at": {
@@ -496,12 +481,6 @@
       "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
       "dev": true
     },
-    "colorette": {
-      "version": "1.2.2",
-      "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
-      "integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
-      "dev": true
-    },
     "combined-stream": {
       "version": "1.0.8",
       "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
@@ -524,9 +503,9 @@
       "dev": true
     },
     "core-util-is": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+      "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
       "dev": true
     },
     "cosmiconfig": {
@@ -566,15 +545,6 @@
         "which": "^1.2.9"
       }
     },
-    "currently-unhandled": {
-      "version": "0.4.1",
-      "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz",
-      "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=",
-      "dev": true,
-      "requires": {
-        "array-find-index": "^1.0.1"
-      }
-    },
     "dashdash": {
       "version": "1.14.1",
       "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
@@ -590,6 +560,24 @@
       "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
       "dev": true
     },
+    "decamelize-keys": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz",
+      "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=",
+      "dev": true,
+      "requires": {
+        "decamelize": "^1.1.0",
+        "map-obj": "^1.0.0"
+      },
+      "dependencies": {
+        "map-obj": {
+          "version": "1.0.1",
+          "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+          "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+          "dev": true
+        }
+      }
+    },
     "define-properties": {
       "version": "1.1.3",
       "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
@@ -645,9 +633,9 @@
       }
     },
     "electron-to-chromium": {
-      "version": "1.3.736",
-      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.736.tgz",
-      "integrity": "sha512-DY8dA7gR51MSo66DqitEQoUMQ0Z+A2DSXFi7tK304bdTVqczCAfUuyQw6Wdg8hIoo5zIxkU1L24RQtUce1Ioig==",
+      "version": "1.3.890",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.890.tgz",
+      "integrity": "sha512-VWlVXSkv0cA/OOehrEyqjUTHwV8YXCPTfPvbtoeU2aHR21vI4Ejh5aC4AxUwOmbLbBgb6Gd3URZahoCxtBqCYQ==",
       "dev": true
     },
     "emoji-regex": {
@@ -858,6 +846,43 @@
         "string-width": "^1.0.1",
         "strip-ansi": "^3.0.1",
         "wide-align": "^1.1.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
+        "is-fullwidth-code-point": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
+          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
+          "dev": true,
+          "requires": {
+            "number-is-nan": "^1.0.0"
+          }
+        },
+        "string-width": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
+          "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+          "dev": true,
+          "requires": {
+            "code-point-at": "^1.0.0",
+            "is-fullwidth-code-point": "^1.0.0",
+            "strip-ansi": "^3.0.0"
+          }
+        },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        }
       }
     },
     "gaze": {
@@ -891,9 +916,9 @@
       }
     },
     "glob": {
-      "version": "7.1.7",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
-      "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz",
+      "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==",
       "dev": true,
       "requires": {
         "fs.realpath": "^1.0.0",
@@ -928,14 +953,30 @@
       }
     },
     "globule": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz",
-      "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==",
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.3.tgz",
+      "integrity": "sha512-mb1aYtDbIjTu4ShMB85m3UzjX9BVKe9WCzsnfMSZk+K5GpIbBOexgg4PPCt5eHDEG5/ZQAUX2Kct02zfiPLsKg==",
       "dev": true,
       "requires": {
         "glob": "~7.1.1",
         "lodash": "~4.17.10",
         "minimatch": "~3.0.2"
+      },
+      "dependencies": {
+        "glob": {
+          "version": "7.1.7",
+          "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
+          "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+          "dev": true,
+          "requires": {
+            "fs.realpath": "^1.0.0",
+            "inflight": "^1.0.4",
+            "inherits": "2",
+            "minimatch": "^3.0.4",
+            "once": "^1.3.0",
+            "path-is-absolute": "^1.0.0"
+          }
+        }
       }
     },
     "graceful-fs": {
@@ -960,6 +1001,12 @@
         "har-schema": "^2.0.0"
       }
     },
+    "hard-rejection": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
+      "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
+      "dev": true
+    },
     "has": {
       "version": "1.0.3",
       "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
@@ -976,6 +1023,14 @@
       "dev": true,
       "requires": {
         "ansi-regex": "^2.0.0"
+      },
+      "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        }
       }
     },
     "has-flag": {
@@ -1048,13 +1103,10 @@
       }
     },
     "indent-string": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz",
-      "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=",
-      "dev": true,
-      "requires": {
-        "repeating": "^2.0.0"
-      }
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+      "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+      "dev": true
     },
     "inflight": {
       "version": "1.0.6",
@@ -1093,6 +1145,15 @@
       "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
       "dev": true
     },
+    "is-core-module": {
+      "version": "2.8.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
+      "integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
+      "dev": true,
+      "requires": {
+        "has": "^1.0.3"
+      }
+    },
     "is-date-object": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
@@ -1111,12 +1172,6 @@
       "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
       "dev": true
     },
-    "is-finite": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz",
-      "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==",
-      "dev": true
-    },
     "is-fullwidth-code-point": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
@@ -1138,6 +1193,12 @@
       "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
       "dev": true
     },
+    "is-plain-obj": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+      "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
+      "dev": true
+    },
     "is-regex": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
@@ -1162,12 +1223,6 @@
       "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
       "dev": true
     },
-    "is-utf8": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
-      "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
-      "dev": true
-    },
     "isarray": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
@@ -1192,6 +1247,12 @@
       "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==",
       "dev": true
     },
+    "js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+      "dev": true
+    },
     "js-yaml": {
       "version": "3.14.1",
       "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
@@ -1214,6 +1275,12 @@
       "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
       "dev": true
     },
+    "json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+      "dev": true
+    },
     "json-schema": {
       "version": "0.2.3",
       "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
@@ -1260,18 +1327,17 @@
         "verror": "1.10.0"
       }
     },
-    "load-json-file": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
-      "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "parse-json": "^2.2.0",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0",
-        "strip-bom": "^2.0.0"
-      }
+    "kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+      "dev": true
+    },
+    "lines-and-columns": {
+      "version": "1.1.6",
+      "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+      "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+      "dev": true
     },
     "locate-path": {
       "version": "3.0.0",
@@ -1310,16 +1376,6 @@
         "chalk": "^2.0.1"
       }
     },
-    "loud-rejection": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz",
-      "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=",
-      "dev": true,
-      "requires": {
-        "currently-unhandled": "^0.4.1",
-        "signal-exit": "^3.0.0"
-      }
-    },
     "lru-cache": {
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
@@ -1330,9 +1386,9 @@
       }
     },
     "map-obj": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
-      "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=",
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
+      "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
       "dev": true
     },
     "memorystream": {
@@ -1342,21 +1398,61 @@
       "dev": true
     },
     "meow": {
-      "version": "3.7.0",
-      "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
-      "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
-      "dev": true,
-      "requires": {
-        "camelcase-keys": "^2.0.0",
-        "decamelize": "^1.1.2",
-        "loud-rejection": "^1.0.0",
-        "map-obj": "^1.0.1",
-        "minimist": "^1.1.3",
-        "normalize-package-data": "^2.3.4",
-        "object-assign": "^4.0.1",
-        "read-pkg-up": "^1.0.1",
-        "redent": "^1.0.0",
-        "trim-newlines": "^1.0.0"
+      "version": "9.0.0",
+      "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
+      "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
+      "dev": true,
+      "requires": {
+        "@types/minimist": "^1.2.0",
+        "camelcase-keys": "^6.2.2",
+        "decamelize": "^1.2.0",
+        "decamelize-keys": "^1.1.0",
+        "hard-rejection": "^2.1.0",
+        "minimist-options": "4.1.0",
+        "normalize-package-data": "^3.0.0",
+        "read-pkg-up": "^7.0.1",
+        "redent": "^3.0.0",
+        "trim-newlines": "^3.0.0",
+        "type-fest": "^0.18.0",
+        "yargs-parser": "^20.2.3"
+      },
+      "dependencies": {
+        "hosted-git-info": {
+          "version": "4.0.2",
+          "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz",
+          "integrity": "sha512-c9OGXbZ3guC/xOlCg1Ci/VgWlwsqDv1yMQL1CWqXDL0hDjXuNcq0zuR4xqPSuasI3kqFDhqSyTjREz5gzq0fXg==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "normalize-package-data": {
+          "version": "3.0.3",
+          "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
+          "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
+          "dev": true,
+          "requires": {
+            "hosted-git-info": "^4.0.1",
+            "is-core-module": "^2.5.0",
+            "semver": "^7.3.4",
+            "validate-npm-package-license": "^3.0.1"
+          }
+        },
+        "semver": {
+          "version": "7.3.5",
+          "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
+          "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+          "dev": true,
+          "requires": {
+            "lru-cache": "^6.0.0"
+          }
+        },
+        "yargs-parser": {
+          "version": "20.2.9",
+          "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+          "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+          "dev": true
+        }
       }
     },
     "merge2": {
@@ -1384,20 +1480,26 @@
       }
     },
     "mime-db": {
-      "version": "1.47.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz",
-      "integrity": "sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==",
+      "version": "1.50.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz",
+      "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==",
       "dev": true
     },
     "mime-types": {
-      "version": "2.1.30",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz",
-      "integrity": "sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==",
+      "version": "2.1.33",
+      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz",
+      "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==",
       "dev": true,
       "requires": {
-        "mime-db": "1.47.0"
+        "mime-db": "1.50.0"
       }
     },
+    "min-indent": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+      "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+      "dev": true
+    },
     "minimatch": {
       "version": "3.0.4",
       "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
@@ -1407,16 +1509,21 @@
         "brace-expansion": "^1.1.7"
       }
     },
-    "minimist": {
-      "version": "1.2.5",
-      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
-      "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
-      "dev": true
+    "minimist-options": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+      "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+      "dev": true,
+      "requires": {
+        "arrify": "^1.0.1",
+        "is-plain-obj": "^1.1.0",
+        "kind-of": "^6.0.3"
+      }
     },
     "minipass": {
-      "version": "3.1.3",
-      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
-      "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
+      "version": "3.1.5",
+      "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.5.tgz",
+      "integrity": "sha512-+8NzxD82XQoNKNrl1d/FSi+X8wAEWR+sbYAfIvub4Nz0d22plFG72CEVVaufV8PNf4qSslFTD8VMOxNVhHCjTw==",
       "dev": true,
       "requires": {
         "yallist": "^4.0.0"
@@ -1433,24 +1540,21 @@
       }
     },
     "mkdirp": {
-      "version": "0.5.5",
-      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
-      "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
-      "dev": true,
-      "requires": {
-        "minimist": "^1.2.5"
-      }
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+      "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+      "dev": true
     },
     "nan": {
-      "version": "2.14.2",
-      "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz",
-      "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==",
+      "version": "2.15.0",
+      "resolved": "https://registry.npmjs.org/nan/-/nan-2.15.0.tgz",
+      "integrity": "sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==",
       "dev": true
     },
     "nanoid": {
-      "version": "3.1.23",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz",
-      "integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==",
+      "version": "3.1.30",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz",
+      "integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==",
       "dev": true
     },
     "nice-try": {
@@ -1478,9 +1582,9 @@
       },
       "dependencies": {
         "graceful-fs": {
-          "version": "4.2.6",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz",
-          "integrity": "sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==",
+          "version": "4.2.8",
+          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz",
+          "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==",
           "dev": true
         },
         "semver": {
@@ -1504,15 +1608,15 @@
       }
     },
     "node-releases": {
-      "version": "1.1.72",
-      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.72.tgz",
-      "integrity": "sha512-LLUo+PpH3dU6XizX3iVoubUNheF/owjXCZZ5yACDxNnPtgFuludV1ZL3ayK1kVep42Rmm0+R9/Y60NQbZ2bifw==",
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
+      "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
       "dev": true
     },
     "node-sass": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-6.0.0.tgz",
-      "integrity": "sha512-GDzDmNgWNc9GNzTcSLTi6DU6mzSPupVJoStIi7cF3GjwSE9q1cVakbvAAVSt59vzUjV9JJoSZFKoo9krbjKd2g==",
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-6.0.1.tgz",
+      "integrity": "sha512-f+Rbqt92Ful9gX0cGtdYwjTrWAaGURgaK5rZCWOgCNyGWusFYHhbqCCBoFBeat+HKETOU02AyTxNhJV0YZf2jQ==",
       "dev": true,
       "requires": {
         "async-foreach": "^0.1.3",
@@ -1522,8 +1626,7 @@
         "get-stdin": "^4.0.1",
         "glob": "^7.0.3",
         "lodash": "^4.17.15",
-        "meow": "^3.7.0",
-        "mkdirp": "^0.5.1",
+        "meow": "^9.0.0",
         "nan": "^2.13.2",
         "node-gyp": "^7.1.0",
         "npmlog": "^4.0.0",
@@ -1533,6 +1636,12 @@
         "true-case-path": "^1.0.2"
       },
       "dependencies": {
+        "ansi-regex": {
+          "version": "2.1.1",
+          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+          "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+          "dev": true
+        },
         "ansi-styles": {
           "version": "2.2.1",
           "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
@@ -1584,6 +1693,15 @@
           "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
           "dev": true
         },
+        "strip-ansi": {
+          "version": "3.0.1",
+          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
+          "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+          "dev": true,
+          "requires": {
+            "ansi-regex": "^2.0.0"
+          }
+        },
         "supports-color": {
           "version": "2.0.0",
           "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
@@ -1783,12 +1901,15 @@
       "dev": true
     },
     "parse-json": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
-      "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+      "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
       "dev": true,
       "requires": {
-        "error-ex": "^1.2.0"
+        "@babel/code-frame": "^7.0.0",
+        "error-ex": "^1.3.1",
+        "json-parse-even-better-errors": "^2.3.0",
+        "lines-and-columns": "^1.1.6"
       }
     },
     "path-exists": {
@@ -1810,28 +1931,23 @@
       "dev": true
     },
     "path-parse": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
       "dev": true
     },
-    "path-type": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz",
-      "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=",
-      "dev": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "pify": "^2.0.0",
-        "pinkie-promise": "^2.0.0"
-      }
-    },
     "performance-now": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
       "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
       "dev": true
     },
+    "picocolors": {
+      "version": "0.2.1",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+      "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+      "dev": true
+    },
     "picomatch": {
       "version": "2.0.7",
       "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.0.7.tgz",
@@ -1850,41 +1966,14 @@
       "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
       "dev": true
     },
-    "pinkie": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
-      "dev": true
-    },
-    "pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
-      "dev": true,
-      "requires": {
-        "pinkie": "^2.0.0"
-      }
-    },
     "postcss": {
-      "version": "7.0.35",
-      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-      "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+      "version": "7.0.39",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+      "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
       "dev": true,
       "requires": {
-        "chalk": "^2.4.2",
-        "source-map": "^0.6.1",
-        "supports-color": "^6.1.0"
-      },
-      "dependencies": {
-        "supports-color": {
-          "version": "6.1.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-          "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^3.0.0"
-          }
-        }
+        "picocolors": "^0.2.1",
+        "source-map": "^0.6.1"
       }
     },
     "postcss-cli": {
@@ -2160,6 +2249,12 @@
       "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
       "dev": true
     },
+    "quick-lru": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+      "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+      "dev": true
+    },
     "read-cache": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
@@ -2170,44 +2265,75 @@
       }
     },
     "read-pkg": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz",
-      "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=",
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+      "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
       "dev": true,
       "requires": {
-        "load-json-file": "^1.0.0",
-        "normalize-package-data": "^2.3.2",
-        "path-type": "^1.0.0"
+        "@types/normalize-package-data": "^2.4.0",
+        "normalize-package-data": "^2.5.0",
+        "parse-json": "^5.0.0",
+        "type-fest": "^0.6.0"
+      },
+      "dependencies": {
+        "type-fest": {
+          "version": "0.6.0",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+          "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+          "dev": true
+        }
       }
     },
     "read-pkg-up": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz",
-      "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=",
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+      "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
       "dev": true,
       "requires": {
-        "find-up": "^1.0.0",
-        "read-pkg": "^1.0.0"
+        "find-up": "^4.1.0",
+        "read-pkg": "^5.2.0",
+        "type-fest": "^0.8.1"
       },
       "dependencies": {
         "find-up": {
-          "version": "1.1.2",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz",
-          "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=",
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+          "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
           "dev": true,
           "requires": {
-            "path-exists": "^2.0.0",
-            "pinkie-promise": "^2.0.0"
+            "locate-path": "^5.0.0",
+            "path-exists": "^4.0.0"
           }
         },
-        "path-exists": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz",
-          "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=",
+        "locate-path": {
+          "version": "5.0.0",
+          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+          "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
           "dev": true,
           "requires": {
-            "pinkie-promise": "^2.0.0"
+            "p-locate": "^4.1.0"
           }
+        },
+        "p-locate": {
+          "version": "4.1.0",
+          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+          "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+          "dev": true,
+          "requires": {
+            "p-limit": "^2.2.0"
+          }
+        },
+        "path-exists": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+          "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+          "dev": true
+        },
+        "type-fest": {
+          "version": "0.8.1",
+          "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+          "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+          "dev": true
         }
       }
     },
@@ -2244,22 +2370,13 @@
       }
     },
     "redent": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz",
-      "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=",
-      "dev": true,
-      "requires": {
-        "indent-string": "^2.1.0",
-        "strip-indent": "^1.0.1"
-      }
-    },
-    "repeating": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz",
-      "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+      "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
       "dev": true,
       "requires": {
-        "is-finite": "^1.0.0"
+        "indent-string": "^4.0.0",
+        "strip-indent": "^3.0.0"
       }
     },
     "request": {
@@ -2333,52 +2450,17 @@
       }
     },
     "rtlcss": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.2.0.tgz",
-      "integrity": "sha512-nV3UmaTmA5TkP2dYOR16ULu6FkMOqZRbiXbFZnmWIN9coPfx3gin31VGOPV7vrVMPjNds7pCS2UYy0mwQUdFCQ==",
+      "version": "3.5.0",
+      "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz",
+      "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==",
       "dev": true,
       "requires": {
-        "chalk": "^4.1.0",
         "find-up": "^5.0.0",
-        "mkdirp": "^1.0.4",
-        "postcss": "^8.2.4",
+        "picocolors": "^1.0.0",
+        "postcss": "^8.3.11",
         "strip-json-comments": "^3.1.1"
       },
       "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
-          "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
-          "dev": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true
-        },
         "find-up": {
           "version": "5.0.0",
           "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -2389,12 +2471,6 @@
             "path-exists": "^4.0.0"
           }
         },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true
-        },
         "locate-path": {
           "version": "6.0.0",
           "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -2404,12 +2480,6 @@
             "p-locate": "^5.0.0"
           }
         },
-        "mkdirp": {
-          "version": "1.0.4",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-          "dev": true
-        },
         "p-limit": {
           "version": "3.1.0",
           "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
@@ -2434,25 +2504,22 @@
           "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
           "dev": true
         },
+        "picocolors": {
+          "version": "1.0.0",
+          "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+          "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+          "dev": true
+        },
         "postcss": {
-          "version": "8.3.0",
-          "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.0.tgz",
-          "integrity": "sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ==",
+          "version": "8.3.11",
+          "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.11.tgz",
+          "integrity": "sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA==",
           "dev": true,
           "requires": {
-            "colorette": "^1.2.2",
-            "nanoid": "^3.1.23",
+            "nanoid": "^3.1.30",
+            "picocolors": "^1.0.0",
             "source-map-js": "^0.6.2"
           }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
         }
       }
     },
@@ -2550,9 +2617,9 @@
       }
     },
     "signal-exit": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
-      "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
+      "version": "3.0.5",
+      "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz",
+      "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==",
       "dev": true
     },
     "slash": {
@@ -2638,25 +2705,14 @@
       }
     },
     "string-width": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
-      "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
       "dev": true,
       "requires": {
-        "code-point-at": "^1.0.0",
-        "is-fullwidth-code-point": "^1.0.0",
-        "strip-ansi": "^3.0.0"
-      },
-      "dependencies": {
-        "is-fullwidth-code-point": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
-          "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
-          "dev": true,
-          "requires": {
-            "number-is-nan": "^1.0.0"
-          }
-        }
+        "emoji-regex": "^7.0.1",
+        "is-fullwidth-code-point": "^2.0.0",
+        "strip-ansi": "^5.1.0"
       }
     },
     "string.prototype.padend": {
@@ -2680,30 +2736,21 @@
       }
     },
     "strip-ansi": {
-      "version": "3.0.1",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
+      "version": "5.2.0",
+      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
       "dev": true,
       "requires": {
-        "ansi-regex": "^2.0.0"
-      }
-    },
-    "strip-bom": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
-      "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
-      "dev": true,
-      "requires": {
-        "is-utf8": "^0.2.0"
+        "ansi-regex": "^4.1.0"
       }
     },
     "strip-indent": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz",
-      "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=",
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+      "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
       "dev": true,
       "requires": {
-        "get-stdin": "^4.0.1"
+        "min-indent": "^1.0.0"
       }
     },
     "strip-json-comments": {
@@ -2722,9 +2769,9 @@
       }
     },
     "tar": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz",
-      "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==",
+      "version": "6.1.11",
+      "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
+      "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
       "dev": true,
       "requires": {
         "chownr": "^2.0.0",
@@ -2733,14 +2780,6 @@
         "minizlib": "^2.1.1",
         "mkdirp": "^1.0.3",
         "yallist": "^4.0.0"
-      },
-      "dependencies": {
-        "mkdirp": {
-          "version": "1.0.4",
-          "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-          "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-          "dev": true
-        }
       }
     },
     "to-regex-range": {
@@ -2763,9 +2802,9 @@
       }
     },
     "trim-newlines": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz",
-      "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=",
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
+      "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
       "dev": true
     },
     "true-case-path": {
@@ -2792,6 +2831,12 @@
       "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
       "dev": true
     },
+    "type-fest": {
+      "version": "0.18.1",
+      "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+      "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+      "dev": true
+    },
     "universalify": {
       "version": "2.0.0",
       "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
@@ -2838,6 +2883,14 @@
         "assert-plus": "^1.0.0",
         "core-util-is": "1.0.2",
         "extsprintf": "^1.2.0"
+      },
+      "dependencies": {
+        "core-util-is": {
+          "version": "1.0.2",
+          "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+          "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
+          "dev": true
+        }
       }
     },
     "which": {
@@ -2856,12 +2909,12 @@
       "dev": true
     },
     "wide-align": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
-      "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
+      "version": "1.1.5",
+      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz",
+      "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==",
       "dev": true,
       "requires": {
-        "string-width": "^1.0.2 || 2"
+        "string-width": "^1.0.2 || 2 || 3 || 4"
       }
     },
     "wrap-ansi": {
@@ -2873,34 +2926,6 @@
         "ansi-styles": "^3.2.0",
         "string-width": "^3.0.0",
         "strip-ansi": "^5.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
       }
     },
     "wrappy": {
@@ -2937,34 +2962,6 @@
         "which-module": "^2.0.0",
         "y18n": "^4.0.0",
         "yargs-parser": "^13.1.2"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
       }
     },
     "yargs-parser": {
diff --git a/src/wp-content/themes/twentynineteen/package.json b/src/wp-content/themes/twentynineteen/package.json
index fcd720b24a..ff26c74e92 100644
--- a/src/wp-content/themes/twentynineteen/package.json
+++ b/src/wp-content/themes/twentynineteen/package.json
@@ -1,6 +1,6 @@
 {
   "name": "twentynineteen",
-  "version": "2.1.0",
+  "version": "2.2.0",
   "description": "Default WP Theme",
   "bugs": {
     "url": "https://core.trac.wordpress.org/"
@@ -8,13 +8,13 @@
   "homepage": "https://wordpress.org/themes/twentynineteen/",
   "devDependencies": {
     "@wordpress/browserslist-config": "^4.0.1",
-    "autoprefixer": "^9.8.6",
-    "chokidar-cli": "^2.1.0",
-    "node-sass": "^6.0.0",
+    "autoprefixer": "^9.8.8",
+    "chokidar-cli": "^3.0.0",
+    "node-sass": "^6.0.1",
     "npm-run-all": "^4.1.5",
     "postcss-cli": "^7.1.2",
     "postcss-focus-within": "^4.0.0",
-    "rtlcss": "^3.2.0"
+    "rtlcss": "^3.5.0"
   },
   "rtlcssConfig": {
     "options": {
diff --git a/src/wp-content/themes/twentynineteen/readme.txt b/src/wp-content/themes/twentynineteen/readme.txt
index 0a434720df..5161eb1ef2 100644
--- a/src/wp-content/themes/twentynineteen/readme.txt
+++ b/src/wp-content/themes/twentynineteen/readme.txt
@@ -2,8 +2,8 @@
 Contributors: wordpressdotorg
 Tags: one-column, flexible-header, accessibility-ready, custom-colors, custom-menu, custom-logo, editor-style, featured-images, footer-widgets, rtl-language-support, sticky-post, threaded-comments, translation-ready, block-patterns
 Requires at least: 4.9.6
-Tested up to: 5.8
-Stable tag: 2.1
+Tested up to: 5.9
+Stable tag: 2.2
 License: GPLv2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
 
@@ -24,7 +24,7 @@ For more information about Twenty Nineteen please go to https://wordpress.org/su
 
 == Copyright ==
 
-Twenty Nineteen WordPress Theme, Copyright 2018-2021 WordPress.org
+Twenty Nineteen WordPress Theme, Copyright 2018-2022 WordPress.org
 Twenty Nineteen is distributed under the terms of the GNU GPL
 
 This program is free software: you can redistribute it and/or modify
@@ -39,6 +39,11 @@ GNU General Public License for more details.
 
 == Changelog ==
 
+= 2.2 =
+* Released: January 25, 2022
+
+https://codex.wordpress.org/Twenty_Nineteen_Theme_Changelog#Version_2.2
+
 = 2.1 =
 * Released: July 20, 2021
 
@@ -101,7 +106,7 @@ Initial release
 
 == Resources ==
 * normalize.css, © 2012-2018 Nicolas Gallagher and Jonathan Neal, MIT
-* Underscores, © 2012-2021 Automattic, Inc., GNU GPL v2 or later
+* Underscores, © 2012-2022 Automattic, Inc., GNU GPL v2 or later
 * Bundled block pattern images:
 	* Abstract Background by HD Wallpapers, CC0. https://stocksnap.io/photo/abstract-background-0SRRVNMKBX
 	* Abstract Waves by HD Wallpapers, CC0. https://stocksnap.io/photo/abstract-waves-0KREGLTZQ3
diff --git a/src/wp-content/themes/twentynineteen/style-rtl.css b/src/wp-content/themes/twentynineteen/style-rtl.css
index 31bde4c26c..9382635db7 100644
--- a/src/wp-content/themes/twentynineteen/style-rtl.css
+++ b/src/wp-content/themes/twentynineteen/style-rtl.css
@@ -5,9 +5,10 @@ Theme URI: https://wordpress.org/themes/twentynineteen/
 Author: the WordPress team
 Author URI: https://wordpress.org/
 Description: Our 2019 default theme is designed to show off the power of the block editor. It features custom styles for all the default blocks, and is built so that what you see in the editor looks like what you'll see on your website. Twenty Nineteen is designed to be adaptable to a wide range of websites, whether you’re running a photo blog, launching a new business, or supporting a non-profit. Featuring ample whitespace and modern sans-serif headlines paired with classic serif body text, it's built to be beautiful on all screen sizes.
+Tested up to: 5.9
 Requires at least: 4.9.6
 Requires PHP: 5.2.4
-Version: 2.1
+Version: 2.2
 License: GNU General Public License v2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
 Text Domain: twentynineteen
diff --git a/src/wp-content/themes/twentynineteen/style.css b/src/wp-content/themes/twentynineteen/style.css
index 192a49eca3..dc2ea1ddb8 100644
--- a/src/wp-content/themes/twentynineteen/style.css
+++ b/src/wp-content/themes/twentynineteen/style.css
@@ -5,9 +5,10 @@ Theme URI: https://wordpress.org/themes/twentynineteen/
 Author: the WordPress team
 Author URI: https://wordpress.org/
 Description: Our 2019 default theme is designed to show off the power of the block editor. It features custom styles for all the default blocks, and is built so that what you see in the editor looks like what you'll see on your website. Twenty Nineteen is designed to be adaptable to a wide range of websites, whether you’re running a photo blog, launching a new business, or supporting a non-profit. Featuring ample whitespace and modern sans-serif headlines paired with classic serif body text, it's built to be beautiful on all screen sizes.
+Tested up to: 5.9
 Requires at least: 4.9.6
 Requires PHP: 5.2.4
-Version: 2.1
+Version: 2.2
 License: GNU General Public License v2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
 Text Domain: twentynineteen
diff --git a/src/wp-content/themes/twentynineteen/style.scss b/src/wp-content/themes/twentynineteen/style.scss
index 668f4c6a74..ed0e3cf8cf 100644
--- a/src/wp-content/themes/twentynineteen/style.scss
+++ b/src/wp-content/themes/twentynineteen/style.scss
@@ -4,9 +4,10 @@ Theme URI: https://wordpress.org/themes/twentynineteen/
 Author: the WordPress team
 Author URI: https://wordpress.org/
 Description: Our 2019 default theme is designed to show off the power of the block editor. It features custom styles for all the default blocks, and is built so that what you see in the editor looks like what you'll see on your website. Twenty Nineteen is designed to be adaptable to a wide range of websites, whether you’re running a photo blog, launching a new business, or supporting a non-profit. Featuring ample whitespace and modern sans-serif headlines paired with classic serif body text, it's built to be beautiful on all screen sizes.
+Tested up to: 5.9
 Requires at least: 4.9.6
 Requires PHP: 5.2.4
-Version: 2.1
+Version: 2.2
 License: GNU General Public License v2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
 Text Domain: twentynineteen
diff --git a/src/wp-content/themes/twentyseventeen/assets/js/global.js b/src/wp-content/themes/twentyseventeen/assets/js/global.js
index 966889233c..cb9bc36624 100644
--- a/src/wp-content/themes/twentyseventeen/assets/js/global.js
+++ b/src/wp-content/themes/twentyseventeen/assets/js/global.js
@@ -178,7 +178,7 @@
 	}
 
 	// Fire on document ready.
-	$( document ).ready( function() {
+	$( function() {
 
 		// If navigation menu is present on page, setNavProps and adjustScrollClass.
 		if ( $navigation.length ) {
@@ -218,7 +218,7 @@
 		if ( true === supportsFixedBackground() ) {
 			document.documentElement.className += ' background-fixed';
 		}
-	});
+	} );
 
 	// If navigation menu is present on page, adjust it on scroll and screen resize.
 	if ( $navigation.length ) {
diff --git a/src/wp-content/themes/twentyseventeen/readme.txt b/src/wp-content/themes/twentyseventeen/readme.txt
index 12c4d3fb59..8e6a41c735 100644
--- a/src/wp-content/themes/twentyseventeen/readme.txt
+++ b/src/wp-content/themes/twentyseventeen/readme.txt
@@ -1,7 +1,7 @@
 === Twenty Seventeen ===
 Contributors: wordpressdotorg
-Tested up to: 5.8
-Version: 2.8
+Tested up to: 5.9
+Version: 2.9
 License: GPLv2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
 Tags: one-column, two-columns, right-sidebar, flexible-header, accessibility-ready, custom-colors, custom-header, custom-menu, custom-logo, editor-style, featured-images, footer-widgets, post-formats, rtl-language-support, sticky-post, theme-options, threaded-comments, translation-ready, block-patterns
@@ -22,7 +22,7 @@ For more information about Twenty Seventeen please go to https://wordpress.org/s
 
 == Copyright ==
 
-Twenty Seventeen WordPress Theme, Copyright 2016-2021 WordPress.org
+Twenty Seventeen WordPress Theme, Copyright 2016-2022 WordPress.org
 Twenty Seventeen is distributed under the terms of the GNU GPL
 
 This program is free software: you can redistribute it and/or modify
@@ -68,6 +68,11 @@ Source: https://stocksnap.io/photo/striped-fabric-9CBVWF2CDU
 
 == Changelog ==
 
+= 2.9 =
+* Released: January 25, 2022
+
+https://codex.wordpress.org/Twenty_Seventeen_Theme_Changelog#Version_2.9
+
 = 2.8 =
 * Released: July 20, 2021
 
diff --git a/src/wp-content/themes/twentyseventeen/style.css b/src/wp-content/themes/twentyseventeen/style.css
index be1c214696..f02339b716 100644
--- a/src/wp-content/themes/twentyseventeen/style.css
+++ b/src/wp-content/themes/twentyseventeen/style.css
@@ -4,7 +4,8 @@ Theme URI: https://wordpress.org/themes/twentyseventeen/
 Author: the WordPress team
 Author URI: https://wordpress.org/
 Description: Twenty Seventeen brings your site to life with header video and immersive featured images. With a focus on business sites, it features multiple sections on the front page as well as widgets, navigation and social menus, a logo, and more. Personalize its asymmetrical grid with a custom color scheme and showcase your multimedia content with post formats. Our default theme for 2017 works great in many languages, for any abilities, and on any device.
-Version: 2.8
+Version: 2.9
+Tested up to: 5.9
 Requires at least: 4.7
 Requires PHP: 5.2.4
 License: GNU General Public License v2 or later
@@ -3382,6 +3383,9 @@ p > object:only-child {
 }
 
 @media screen and (min-width: 48em) {
+	html {
+		scroll-padding-top: calc( var(--wp-admin--admin-bar--height, 0px) + 72px );
+	}
 
 	/* Typography */
 
diff --git a/src/wp-content/themes/twentysixteen/css/blocks.css b/src/wp-content/themes/twentysixteen/css/blocks.css
index 4898e2d446..9026293a12 100644
--- a/src/wp-content/themes/twentysixteen/css/blocks.css
+++ b/src/wp-content/themes/twentysixteen/css/blocks.css
@@ -212,7 +212,6 @@ p.has-drop-cap:not(:focus)::first-letter {
 .wp-block-table td {
 	font-weight: normal;
 	padding: 0.4375em;
-	text-align: left;
 }
 
 .wp-block-table th {
@@ -224,11 +223,6 @@ p.has-drop-cap:not(:focus)::first-letter {
 	border-width: 0 1px 1px 0;
 }
 
-.rtl .wp-block-table th,
-.rtl .wp-block-table td {
-	text-align: right;
-}
-
 /*--------------------------------------------------------------
 4.0 Blocks - Layout Elements
 --------------------------------------------------------------*/
diff --git a/src/wp-content/themes/twentysixteen/js/functions.js b/src/wp-content/themes/twentysixteen/js/functions.js
index d7aed1bde9..4c3b97d032 100644
--- a/src/wp-content/themes/twentysixteen/js/functions.js
+++ b/src/wp-content/themes/twentysixteen/js/functions.js
@@ -191,7 +191,7 @@
 		} );
 	}
 
-	$( document ).ready( function() {
+	$( function() {
 		body = $( document.body );
 
 		$( window )
diff --git a/src/wp-content/themes/twentysixteen/readme.txt b/src/wp-content/themes/twentysixteen/readme.txt
index 61bbd5f139..6ded87f73f 100644
--- a/src/wp-content/themes/twentysixteen/readme.txt
+++ b/src/wp-content/themes/twentysixteen/readme.txt
@@ -1,7 +1,7 @@
 === Twenty Sixteen ===
 Contributors: wordpressdotorg
-Tested up to: 5.8
-Version: 2.5
+Tested up to: 5.9
+Version: 2.6
 License: GPLv2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
 Tags: one-column, two-columns, right-sidebar, accessibility-ready, custom-background, custom-colors, custom-header, custom-menu, editor-style, featured-images, flexible-header, microformats, post-formats, rtl-language-support, sticky-post, threaded-comments, translation-ready, blog, block-patterns
@@ -28,7 +28,7 @@ For more information about Twenty Sixteen please go to https://wordpress.org/sup
 
 == Copyright ==
 
-Twenty Sixteen WordPress Theme, Copyright 2014-2021 WordPress.org
+Twenty Sixteen WordPress Theme, Copyright 2014-2022 WordPress.org
 Twenty Sixteen is distributed under the terms of the GNU GPL
 
 This program is free software: you can redistribute it and/or modify
@@ -55,6 +55,11 @@ Image used in screenshot.png: A photo by Austin Schmid (https://unsplash.com/sch
 
 == Changelog ==
 
+= 2.6 =
+* Released: January 25, 2022
+
+https://codex.wordpress.org/Twenty_Sixteen_Theme_Changelog#Version_2.6
+
 = 2.5 =
 * Released: July 20, 2021
 
diff --git a/src/wp-content/themes/twentysixteen/style.css b/src/wp-content/themes/twentysixteen/style.css
index a34e74d6cd..269457f27d 100644
--- a/src/wp-content/themes/twentysixteen/style.css
+++ b/src/wp-content/themes/twentysixteen/style.css
@@ -4,7 +4,8 @@ Theme URI: https://wordpress.org/themes/twentysixteen/
 Author: the WordPress team
 Author URI: https://wordpress.org/
 Description: Twenty Sixteen is a modernized take on an ever-popular WordPress layout — the horizontal masthead with an optional right sidebar that works perfectly for blogs and websites. It has custom color options with beautiful default color schemes, a harmonious fluid grid using a mobile-first approach, and impeccable polish in every detail. Twenty Sixteen will make your WordPress look beautiful everywhere.
-Version: 2.5
+Version: 2.6
+Tested up to: 5.9
 Requires at least: 4.4
 Requires PHP: 5.2.4
 License: GNU General Public License v2 or later
@@ -2774,6 +2775,10 @@ p > video {
  */
 
 @media screen and (min-width: 44.375em) {
+	html {
+		scroll-padding-top: calc( var(--wp-admin--admin-bar--height, 0px) + 21px );
+	}
+
 	body:not(.custom-background-image):before,
 	body:not(.custom-background-image):after {
 		background: inherit;
diff --git a/src/wp-content/themes/twentyten/readme.txt b/src/wp-content/themes/twentyten/readme.txt
index 862b680eeb..0ed204bf63 100644
--- a/src/wp-content/themes/twentyten/readme.txt
+++ b/src/wp-content/themes/twentyten/readme.txt
@@ -1,7 +1,7 @@
 === Twenty Ten ===
 Contributors: wordpressdotorg
-Tested up to: 5.8
-Stable tag: 3.5
+Tested up to: 5.9
+Stable tag: 3.6
 License: GPLv2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
 Tags: blog, two-columns, custom-header, custom-background, threaded-comments, sticky-post, translation-ready, microformats, rtl-language-support, editor-style, custom-menu, flexible-header, featured-images, footer-widgets, featured-image-header, block-patterns
@@ -21,7 +21,7 @@ For more information about Twenty Ten theme please go to https://codex.wordpress
 
 == Copyright ==
 
-Twenty Ten WordPress Theme, Copyright 2010-2021 WordPress.org & Automattic.com
+Twenty Ten WordPress Theme, Copyright 2010-2022 WordPress.org & Automattic.com
 Twenty Ten is Distributed under the terms of the GNU GPL
 
 This program is free software: you can redistribute it and/or modify
@@ -42,6 +42,11 @@ Images
 
 == Changelog ==
 
+= 3.6 =
+* Released: January 25, 2022
+
+https://codex.wordpress.org/Twenty_Ten_Theme_Changelog#Version_3.6
+
 = 3.5 =
 * Released: July 26, 2021
 
diff --git a/src/wp-content/themes/twentyten/style.css b/src/wp-content/themes/twentyten/style.css
index 4bd8fdfaa3..4d29b88657 100644
--- a/src/wp-content/themes/twentyten/style.css
+++ b/src/wp-content/themes/twentyten/style.css
@@ -4,7 +4,8 @@ Theme URI: https://wordpress.org/themes/twentyten/
 Description: The 2010 theme for WordPress is stylish, customizable, simple, and readable -- make it yours with a custom menu, header image, and background. Twenty Ten supports six widgetized areas (two in the sidebar, four in the footer) and featured images (thumbnails for gallery posts and custom header images for posts and pages). It includes stylesheets for print and the admin Visual Editor, special styles for posts in the "Asides" and "Gallery" categories, and has an optional one-column page template that removes the sidebar.
 Author: the WordPress team
 Author URI: https://wordpress.org/
-Version: 3.5
+Version: 3.6
+Tested up to: 5.9
 Requires at least: 3.0
 Requires PHP: 5.2.4
 License: GNU General Public License v2 or later
diff --git a/src/wp-content/themes/twentythirteen/readme.txt b/src/wp-content/themes/twentythirteen/readme.txt
index 292f5b5523..cf8c990801 100644
--- a/src/wp-content/themes/twentythirteen/readme.txt
+++ b/src/wp-content/themes/twentythirteen/readme.txt
@@ -1,6 +1,6 @@
 === Twenty Thirteen ===
 Contributors: wordpressdotorg
-Tested up to: 5.8
+Tested up to: 5.9
 Stable tag: 3.4
 License: GPLv2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
@@ -21,7 +21,7 @@ For more information about Twenty Thirteen please go to https://codex.wordpress.
 
 == Copyright ==
 
-Twenty Thirteen WordPress Theme, Copyright 2013-2021 WordPress.org & Automattic.com
+Twenty Thirteen WordPress Theme, Copyright 2013-2022 WordPress.org & Automattic.com
 Twenty Thirteen is Distributed under the terms of the GNU GPL
 
 This program is free software: you can redistribute it and/or modify
@@ -52,6 +52,11 @@ Toroidal Colony: https://www.flickr.com/photos/nasacommons/13889485757/in/album-
 
 == Changelog ==
 
+= 3.5 =
+* Released: January 25, 2022
+
+https://codex.wordpress.org/Twenty_Thirteen_Theme_Changelog#Version_3.5
+
 = 3.4 =
 * Released: July 20, 2021
 
diff --git a/src/wp-content/themes/twentythirteen/style.css b/src/wp-content/themes/twentythirteen/style.css
index 3f1efb4f60..730176c764 100644
--- a/src/wp-content/themes/twentythirteen/style.css
+++ b/src/wp-content/themes/twentythirteen/style.css
@@ -4,7 +4,8 @@ Theme URI: https://wordpress.org/themes/twentythirteen/
 Author: the WordPress team
 Author URI: https://wordpress.org/
 Description: The 2013 theme for WordPress takes us back to the blog, featuring a full range of post formats, each displayed beautifully in their own unique way. Design details abound, starting with a vibrant color scheme and matching header images, beautiful typography and icons, and a flexible layout that looks great on any device, big or small.
-Version: 3.4
+Version: 3.5
+Tested up to: 5.9
 Requires at least: 3.6
 Requires PHP: 5.2.4
 License: GNU General Public License v2 or later
diff --git a/src/wp-content/themes/twentytwelve/inc/block-patterns.php b/src/wp-content/themes/twentytwelve/inc/block-patterns.php
index 653983fe66..be038d9dfd 100644
--- a/src/wp-content/themes/twentytwelve/inc/block-patterns.php
+++ b/src/wp-content/themes/twentytwelve/inc/block-patterns.php
@@ -75,7 +75,7 @@ if ( function_exists( 'register_block_pattern' ) ) {
 			'categories'    => array( 'twentytwelve' ),
 			'viewportWidth' => 700,
 			'content'       => '<!-- wp:paragraph {"style":{"typography":{"fontSize":"40px","lineHeight":1.5}}} -->
-				<p style="font-size:40px;line-height:1.5"><strong><em>' . esc_html__( '"Few people are capable of expressing with equanimity opinions which differ from the prejudices of their social eznvironment. Most people are even incapable of forming such opinions."', 'twentytwelve' ) . '</em></strong></p>
+				<p style="font-size:40px;line-height:1.5"><strong><em>' . esc_html__( '"Few people are capable of expressing with equanimity opinions which differ from the prejudices of their social environment. Most people are even incapable of forming such opinions."', 'twentytwelve' ) . '</em></strong></p>
 				<!-- /wp:paragraph --><!-- wp:paragraph -->
 				<p><em>' . esc_html__( '—  Albert Einstein', 'twentytwelve' ) . '</em></p>
 				<!-- /wp:paragraph -->',
diff --git a/src/wp-content/themes/twentytwelve/readme.txt b/src/wp-content/themes/twentytwelve/readme.txt
index d0ab68cb18..e6dba1a221 100644
--- a/src/wp-content/themes/twentytwelve/readme.txt
+++ b/src/wp-content/themes/twentytwelve/readme.txt
@@ -1,7 +1,7 @@
 === Twenty Twelve ===
 Contributors: wordpressdotorg
-Tested up to: 5.8
-Stable tag: 3.5
+Tested up to: 5.9
+Stable tag: 3.6
 License: GPLv2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
 Tags: blog, one-column, two-columns, right-sidebar, custom-background, custom-header, custom-menu, editor-style, featured-images, flexible-header, footer-widgets, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready, block-patterns
@@ -21,7 +21,7 @@ For more information about Twenty Twelve please go to https://codex.wordpress.or
 
 == Copyright ==
 
-Twenty Twelve WordPress Theme, Copyright 2012-2021 WordPress.org & Automattic.com
+Twenty Twelve WordPress Theme, Copyright 2012-2022 WordPress.org & Automattic.com
 Twenty Twelve is Distributed under the terms of the GNU GPL
 
 This program is free software: you can redistribute it and/or modify
@@ -46,10 +46,15 @@ Source: https://github.com/aFarkas/html5shiv
 
 == Changelog ==
 
+= 3.6 =
+* Released: January 25, 2022
+
+https://codex.wordpress.org/Twenty_Twelve_Theme_Changelog#Version_3.6
+
 = 3.5 =
 * Released: July 26, 2021
 
-https://codex.wordpress.org/Twenty_Twelve_Theme_Changelog#Version_3.4
+https://codex.wordpress.org/Twenty_Twelve_Theme_Changelog#Version_3.5
 
 = 3.4 =
 * Released: July 20, 2021
diff --git a/src/wp-content/themes/twentytwelve/style.css b/src/wp-content/themes/twentytwelve/style.css
index abbd5361de..b3989fc47d 100644
--- a/src/wp-content/themes/twentytwelve/style.css
+++ b/src/wp-content/themes/twentytwelve/style.css
@@ -4,7 +4,8 @@ Theme URI: https://wordpress.org/themes/twentytwelve/
 Author: the WordPress team
 Author URI: https://wordpress.org/
 Description: The 2012 theme for WordPress is a fully responsive theme that looks great on any device. Features include a front page template with its own widgets, an optional display font, styling for post formats on both index and single views, and an optional no-sidebar page template. Make it yours with a custom menu, header image, and background.
-Version: 3.5
+Version: 3.6
+Tested up to: 5.9
 Requires at least: 3.5
 Requires PHP: 5.2.4
 License: GNU General Public License v2 or later
diff --git a/src/wp-content/themes/twentytwenty/assets/css/editor-style-block-rtl.css b/src/wp-content/themes/twentytwenty/assets/css/editor-style-block-rtl.css
index fe56bd3389..c3261fd203 100644
--- a/src/wp-content/themes/twentytwenty/assets/css/editor-style-block-rtl.css
+++ b/src/wp-content/themes/twentytwenty/assets/css/editor-style-block-rtl.css
@@ -115,11 +115,12 @@ Inter variable font. Usage:
 .editor-styles-wrapper ul,
 .editor-styles-wrapper dl,
 .editor-styles-wrapper dt {
-	font-family: NonBreakingSpaceOverride, "Hoefler Text", Garamond, "Times New Roman", serif;
+	font-family: NonBreakingSpaceOverride, "Hoefler Text", "Noto Serif", Garamond, "Times New Roman", serif;
 	letter-spacing: normal;
 }
 
 .editor-post-title__block .editor-post-title__input,
+.editor-styles-wrapper .wp-block-post-title,
 .editor-styles-wrapper .wp-block h1,
 .editor-styles-wrapper .wp-block h2,
 .editor-styles-wrapper .wp-block h3,
@@ -136,6 +137,7 @@ Inter variable font. Usage:
 @supports ( font-variation-settings: normal ) {
 
 	.editor-post-title__block .editor-post-title__input,
+	.editor-styles-wrapper .wp-block-post-title,
 	.editor-styles-wrapper .wp-block h1,
 	.editor-styles-wrapper .wp-block h2,
 	.editor-styles-wrapper .wp-block h3,
@@ -235,6 +237,7 @@ Inter variable font. Usage:
 }
 
 .editor-post-title__block .editor-post-title__input,
+.editor-styles-wrapper .wp-block-post-title,
 .editor-styles-wrapper .wp-block h1,
 .editor-styles-wrapper .wp-block h2,
 .editor-styles-wrapper .wp-block h3,
@@ -251,6 +254,7 @@ Inter variable font. Usage:
 }
 
 .editor-post-title__block .editor-post-title__input,
+.editor-styles-wrapper .wp-block-post-title,
 .editor-styles-wrapper .wp-block h1 {
 	font-size: 36px;
 	font-weight: 800;
@@ -287,6 +291,12 @@ Inter variable font. Usage:
 
 /* POST TITLE */
 
+.editor-styles-wrapper .wp-block-post-title {
+	max-width: 1000px;
+	margin: 0 auto;
+	text-align: center;
+}
+
 .wp-block.editor-post-title__block {
 	max-width: 1000px;
 }
@@ -1217,6 +1227,7 @@ hr.wp-block-separator.is-style-dots::before {
 	/* TYPOGRAPHY */
 
 	.editor-post-title__block .editor-post-title__input,
+	.editor-styles-wrapper .wp-block-post-title,
 	.editor-styles-wrapper .wp-block h1 {
 		font-size: 64px;
 	}
@@ -1395,6 +1406,7 @@ hr.wp-block-separator.is-style-dots::before {
 	/* TYPOGRAPHY */
 
 	.editor-post-title__block .editor-post-title__input,
+	.editor-styles-wrapper .wp-block-post-title,
 	.editor-styles-wrapper .wp-block h1 {
 		font-size: 84px;
 	}
diff --git a/src/wp-content/themes/twentytwenty/assets/css/editor-style-block.css b/src/wp-content/themes/twentytwenty/assets/css/editor-style-block.css
index 1fac49c182..11a3a33f50 100644
--- a/src/wp-content/themes/twentytwenty/assets/css/editor-style-block.css
+++ b/src/wp-content/themes/twentytwenty/assets/css/editor-style-block.css
@@ -115,11 +115,12 @@ Inter variable font. Usage:
 .editor-styles-wrapper ul,
 .editor-styles-wrapper dl,
 .editor-styles-wrapper dt {
-	font-family: NonBreakingSpaceOverride, "Hoefler Text", Garamond, "Times New Roman", serif;
+	font-family: NonBreakingSpaceOverride, "Hoefler Text", "Noto Serif", Garamond, "Times New Roman", serif;
 	letter-spacing: normal;
 }
 
 .editor-post-title__block .editor-post-title__input,
+.editor-styles-wrapper .wp-block-post-title,
 .editor-styles-wrapper .wp-block h1,
 .editor-styles-wrapper .wp-block h2,
 .editor-styles-wrapper .wp-block h3,
@@ -136,6 +137,7 @@ Inter variable font. Usage:
 @supports ( font-variation-settings: normal ) {
 
 	.editor-post-title__block .editor-post-title__input,
+	.editor-styles-wrapper .wp-block-post-title,
 	.editor-styles-wrapper .wp-block h1,
 	.editor-styles-wrapper .wp-block h2,
 	.editor-styles-wrapper .wp-block h3,
@@ -235,6 +237,7 @@ Inter variable font. Usage:
 }
 
 .editor-post-title__block .editor-post-title__input,
+.editor-styles-wrapper .wp-block-post-title,
 .editor-styles-wrapper .wp-block h1,
 .editor-styles-wrapper .wp-block h2,
 .editor-styles-wrapper .wp-block h3,
@@ -251,6 +254,7 @@ Inter variable font. Usage:
 }
 
 .editor-post-title__block .editor-post-title__input,
+.editor-styles-wrapper .wp-block-post-title,
 .editor-styles-wrapper .wp-block h1 {
 	font-size: 36px;
 	font-weight: 800;
@@ -287,6 +291,12 @@ Inter variable font. Usage:
 
 /* POST TITLE */
 
+.editor-styles-wrapper .wp-block-post-title {
+	max-width: 1000px;
+	margin: 0 auto;
+	text-align: center;
+}
+
 .wp-block.editor-post-title__block {
 	max-width: 1000px;
 }
@@ -1217,6 +1227,7 @@ hr.wp-block-separator.is-style-dots::before {
 	/* TYPOGRAPHY */
 
 	.editor-post-title__block .editor-post-title__input,
+	.editor-styles-wrapper .wp-block-post-title,
 	.editor-styles-wrapper .wp-block h1 {
 		font-size: 64px;
 	}
@@ -1395,6 +1406,7 @@ hr.wp-block-separator.is-style-dots::before {
 	/* TYPOGRAPHY */
 
 	.editor-post-title__block .editor-post-title__input,
+	.editor-styles-wrapper .wp-block-post-title,
 	.editor-styles-wrapper .wp-block h1 {
 		font-size: 84px;
 	}
diff --git a/src/wp-content/themes/twentytwenty/assets/css/editor-style-classic-rtl.css b/src/wp-content/themes/twentytwenty/assets/css/editor-style-classic-rtl.css
index 7cac2383bb..89ec55a63a 100644
--- a/src/wp-content/themes/twentytwenty/assets/css/editor-style-classic-rtl.css
+++ b/src/wp-content/themes/twentytwenty/assets/css/editor-style-classic-rtl.css
@@ -74,7 +74,7 @@ body#tinymce.wp-editor.content ol,
 body#tinymce.wp-editor.content ul,
 body#tinymce.wp-editor.content dl,
 body#tinymce.wp-editor.content dt {
-	font-family: NonBreakingSpaceOverride, "Hoefler Text", Garamond, "Times New Roman", serif;
+	font-family: NonBreakingSpaceOverride, "Hoefler Text", "Noto Serif", Garamond, "Times New Roman", serif;
 	letter-spacing: normal;
 }
 
diff --git a/src/wp-content/themes/twentytwenty/assets/css/editor-style-classic.css b/src/wp-content/themes/twentytwenty/assets/css/editor-style-classic.css
index f3382c5c23..4a4a00e967 100644
--- a/src/wp-content/themes/twentytwenty/assets/css/editor-style-classic.css
+++ b/src/wp-content/themes/twentytwenty/assets/css/editor-style-classic.css
@@ -74,7 +74,7 @@ body#tinymce.wp-editor.content ol,
 body#tinymce.wp-editor.content ul,
 body#tinymce.wp-editor.content dl,
 body#tinymce.wp-editor.content dt {
-	font-family: NonBreakingSpaceOverride, "Hoefler Text", Garamond, "Times New Roman", serif;
+	font-family: NonBreakingSpaceOverride, "Hoefler Text", "Noto Serif", Garamond, "Times New Roman", serif;
 	letter-spacing: normal;
 }
 
diff --git a/src/wp-content/themes/twentytwenty/assets/js/customize-preview.js b/src/wp-content/themes/twentytwenty/assets/js/customize-preview.js
index fb76429ffe..36608f724a 100644
--- a/src/wp-content/themes/twentytwenty/assets/js/customize-preview.js
+++ b/src/wp-content/themes/twentytwenty/assets/js/customize-preview.js
@@ -186,7 +186,7 @@
 		stylesheet.html( styles );
 	}
 	// Generate styles on load. Handles page-changes on the preview pane.
-	$( document ).ready( function() {
+	$( function() {
 		twentyTwentyGenerateColorA11yPreviewStyles( 'content' );
 		twentyTwentyGenerateColorA11yPreviewStyles( 'header-footer' );
 	} );
diff --git a/src/wp-content/themes/twentytwenty/assets/js/customize.js b/src/wp-content/themes/twentytwenty/assets/js/customize.js
index 2a38ace1d8..944aae95bf 100644
--- a/src/wp-content/themes/twentytwenty/assets/js/customize.js
+++ b/src/wp-content/themes/twentytwenty/assets/js/customize.js
@@ -1,7 +1,7 @@
 /* global wp, jQuery */
 
 ( function( $, api ) {
-	$( document ).ready( function() {
+	$( function() {
 		// Make it possible to reset the color based on a radio input's value.
 		// `active` can be either `custom` or `default`.
 		api.control( 'accent_hue_active' ).setting.bind( function( active ) {
diff --git a/src/wp-content/themes/twentytwenty/classes/class-twentytwenty-non-latin-languages.php b/src/wp-content/themes/twentytwenty/classes/class-twentytwenty-non-latin-languages.php
index 0c4951ef48..731064eda3 100644
--- a/src/wp-content/themes/twentytwenty/classes/class-twentytwenty-non-latin-languages.php
+++ b/src/wp-content/themes/twentytwenty/classes/class-twentytwenty-non-latin-languages.php
@@ -119,7 +119,7 @@ if ( ! class_exists( 'TwentyTwenty_Non_Latin_Languages' ) ) {
 				'twentytwenty_get_localized_font_family_elements',
 				array(
 					'front-end'      => array( 'body', 'input', 'textarea', 'button', '.button', '.faux-button', '.wp-block-button__link', '.wp-block-file__button', '.has-drop-cap:not(:focus)::first-letter', '.entry-content .wp-block-archives', '.entry-content .wp-block-categories', '.entry-content .wp-block-cover-image', '.entry-content .wp-block-latest-comments', '.entry-content .wp-block-latest-posts', '.entry-content .wp-block-pullquote', '.entry-content .wp-block-quote.is-large', '.entry-content .wp-block-quote.is-style-large', '.entry-content .wp-block-archives *', '.entry-content .wp-block-categories *', '.entry-content .wp-block-latest-posts *', '.entry-content .wp-block-latest-comments *', '.entry-content p', '.entry-content ol', '.entry-content ul', '.entry-content dl', '.entry-content dt', '.entry-content cite', '.entry-content figcaption', '.entry-content .wp-caption-text', '.comment-content p', '.comment-content ol', '.comment-content ul', '.comment-content dl', '.comment-content dt', '.comment-content cite', '.comment-content figcaption', '.comment-content .wp-caption-text', '.widget_text p', '.widget_text ol', '.widget_text ul', '.widget_text dl', '.widget_text dt', '.widget-content .rssSummary', '.widget-content cite', '.widget-content figcaption', '.widget-content .wp-caption-text' ),
-					'block-editor'   => array( '.editor-styles-wrapper > *', '.editor-styles-wrapper p', '.editor-styles-wrapper ol', '.editor-styles-wrapper ul', '.editor-styles-wrapper dl', '.editor-styles-wrapper dt', '.editor-post-title__block .editor-post-title__input', '.editor-styles-wrapper .wp-block h1', '.editor-styles-wrapper .wp-block h2', '.editor-styles-wrapper .wp-block h3', '.editor-styles-wrapper .wp-block h4', '.editor-styles-wrapper .wp-block h5', '.editor-styles-wrapper .wp-block h6', '.editor-styles-wrapper .has-drop-cap:not(:focus)::first-letter', '.editor-styles-wrapper cite', '.editor-styles-wrapper figcaption', '.editor-styles-wrapper .wp-caption-text' ),
+					'block-editor'   => array( '.editor-styles-wrapper > *', '.editor-styles-wrapper p', '.editor-styles-wrapper ol', '.editor-styles-wrapper ul', '.editor-styles-wrapper dl', '.editor-styles-wrapper dt', '.editor-post-title__block .editor-post-title__input', '.editor-styles-wrapper .wp-block-post-title', '.editor-styles-wrapper .wp-block h1', '.editor-styles-wrapper .wp-block h2', '.editor-styles-wrapper .wp-block h3', '.editor-styles-wrapper .wp-block h4', '.editor-styles-wrapper .wp-block h5', '.editor-styles-wrapper .wp-block h6', '.editor-styles-wrapper .has-drop-cap:not(:focus)::first-letter', '.editor-styles-wrapper cite', '.editor-styles-wrapper figcaption', '.editor-styles-wrapper .wp-caption-text' ),
 					'classic-editor' => array( 'body#tinymce.wp-editor', 'body#tinymce.wp-editor p', 'body#tinymce.wp-editor ol', 'body#tinymce.wp-editor ul', 'body#tinymce.wp-editor dl', 'body#tinymce.wp-editor dt', 'body#tinymce.wp-editor figcaption', 'body#tinymce.wp-editor .wp-caption-text', 'body#tinymce.wp-editor .wp-caption-dd', 'body#tinymce.wp-editor cite', 'body#tinymce.wp-editor table' ),
 				)
 			);
diff --git a/src/wp-content/themes/twentytwenty/package-lock.json b/src/wp-content/themes/twentytwenty/package-lock.json
index 1e78a230bd..9a8150e9cd 100644
--- a/src/wp-content/themes/twentytwenty/package-lock.json
+++ b/src/wp-content/themes/twentytwenty/package-lock.json
@@ -1,6 +1,6 @@
 {
 	"name": "twentytwenty",
-	"version": "1.8.0",
+	"version": "1.9.0",
 	"lockfileVersion": 1,
 	"requires": true,
 	"dependencies": {
@@ -2544,6 +2544,12 @@
 					"requires": {
 						"type-fest": "^0.8.1"
 					}
+				},
+				"prettier": {
+					"version": "npm:wp-prettier@2.2.1-beta-1",
+					"resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-2.2.1-beta-1.tgz",
+					"integrity": "sha512-+JHkqs9LC/JPp51yy1hzs3lQ7qeuWCwOcSzpQNeeY/G7oSpnF61vxt7hRh87zNRTr6ob2ndy0W8rVzhgrcA+Gw==",
+					"dev": true
 				}
 			}
 		},
@@ -2651,6 +2657,14 @@
 				"webpack-cli": "^3.3.11",
 				"webpack-livereload-plugin": "^2.3.0",
 				"webpack-sources": "^2.2.0"
+			},
+			"dependencies": {
+				"prettier": {
+					"version": "npm:wp-prettier@2.2.1-beta-1",
+					"resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-2.2.1-beta-1.tgz",
+					"integrity": "sha512-+JHkqs9LC/JPp51yy1hzs3lQ7qeuWCwOcSzpQNeeY/G7oSpnF61vxt7hRh87zNRTr6ob2ndy0W8rVzhgrcA+Gw==",
+					"dev": true
+				}
 			}
 		},
 		"@wordpress/stylelint-config": {
@@ -2800,9 +2814,9 @@
 			}
 		},
 		"ansi-regex": {
-			"version": "5.0.0",
-			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-			"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+			"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 			"dev": true
 		},
 		"ansi-styles": {
@@ -3052,12 +3066,6 @@
 			"integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
 			"dev": true
 		},
-		"at-least-node": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
-			"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
-			"dev": true
-		},
 		"atob": {
 			"version": "2.1.2",
 			"resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
@@ -3065,23 +3073,48 @@
 			"dev": true
 		},
 		"autoprefixer": {
-			"version": "10.2.6",
-			"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.2.6.tgz",
-			"integrity": "sha512-8lChSmdU6dCNMCQopIf4Pe5kipkAGj/fvTMslCsih0uHpOrXOPUEVOmYMMqmw3cekQkSD7EhIeuYl5y0BLdKqg==",
+			"version": "10.4.0",
+			"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.0.tgz",
+			"integrity": "sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA==",
 			"dev": true,
 			"requires": {
-				"browserslist": "^4.16.6",
-				"caniuse-lite": "^1.0.30001230",
-				"colorette": "^1.2.2",
+				"browserslist": "^4.17.5",
+				"caniuse-lite": "^1.0.30001272",
 				"fraction.js": "^4.1.1",
 				"normalize-range": "^0.1.2",
+				"picocolors": "^1.0.0",
 				"postcss-value-parser": "^4.1.0"
 			},
 			"dependencies": {
-				"colorette": {
-					"version": "1.2.2",
-					"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
-					"integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
+				"browserslist": {
+					"version": "4.17.6",
+					"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz",
+					"integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==",
+					"dev": true,
+					"requires": {
+						"caniuse-lite": "^1.0.30001274",
+						"electron-to-chromium": "^1.3.886",
+						"escalade": "^3.1.1",
+						"node-releases": "^2.0.1",
+						"picocolors": "^1.0.0"
+					}
+				},
+				"caniuse-lite": {
+					"version": "1.0.30001278",
+					"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001278.tgz",
+					"integrity": "sha512-mpF9KeH8u5cMoEmIic/cr7PNS+F5LWBk0t2ekGT60lFf0Wq+n9LspAj0g3P+o7DQhD3sUdlMln4YFAWhFYn9jg==",
+					"dev": true
+				},
+				"electron-to-chromium": {
+					"version": "1.3.890",
+					"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.890.tgz",
+					"integrity": "sha512-VWlVXSkv0cA/OOehrEyqjUTHwV8YXCPTfPvbtoeU2aHR21vI4Ejh5aC4AxUwOmbLbBgb6Gd3URZahoCxtBqCYQ==",
+					"dev": true
+				},
+				"node-releases": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
+					"integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
 					"dev": true
 				}
 			}
@@ -3980,9 +4013,9 @@
 					}
 				},
 				"nth-check": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.0.tgz",
-					"integrity": "sha512-i4sc/Kj8htBrAiH1viZ0TgU8Y5XqCaV/FziYK6TBczxmeKm3AEFWqqF3195yKudrarqy7Zu80Ra5dobFjn9X/Q==",
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz",
+					"integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==",
 					"dev": true,
 					"requires": {
 						"boolbase": "^1.0.0"
@@ -4274,15 +4307,14 @@
 			}
 		},
 		"concurrently": {
-			"version": "6.2.0",
-			"resolved": "https://registry.npmjs.org/concurrently/-/concurrently-6.2.0.tgz",
-			"integrity": "sha512-v9I4Y3wFoXCSY2L73yYgwA9ESrQMpRn80jMcqMgHx720Hecz2GZAvTI6bREVST6lkddNypDKRN22qhK0X8Y00g==",
+			"version": "6.3.0",
+			"resolved": "https://registry.npmjs.org/concurrently/-/concurrently-6.3.0.tgz",
+			"integrity": "sha512-k4k1jQGHHKsfbqzkUszVf29qECBrkvBKkcPJEUDTyVR7tZd1G/JOfnst4g1sYbFvJ4UjHZisj1aWQR8yLKpGPw==",
 			"dev": true,
 			"requires": {
 				"chalk": "^4.1.0",
 				"date-fns": "^2.16.1",
 				"lodash": "^4.17.21",
-				"read-pkg": "^5.2.0",
 				"rxjs": "^6.6.3",
 				"spawn-command": "^0.0.2-1",
 				"supports-color": "^8.1.0",
@@ -4331,18 +4363,6 @@
 					"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
 					"dev": true
 				},
-				"read-pkg": {
-					"version": "5.2.0",
-					"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
-					"integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
-					"dev": true,
-					"requires": {
-						"@types/normalize-package-data": "^2.4.0",
-						"normalize-package-data": "^2.5.0",
-						"parse-json": "^5.0.0",
-						"type-fest": "^0.6.0"
-					}
-				},
 				"supports-color": {
 					"version": "8.1.1",
 					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
@@ -4352,12 +4372,6 @@
 						"has-flag": "^4.0.0"
 					}
 				},
-				"type-fest": {
-					"version": "0.6.0",
-					"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
-					"integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
-					"dev": true
-				},
 				"wrap-ansi": {
 					"version": "7.0.0",
 					"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
@@ -4391,9 +4405,9 @@
 					}
 				},
 				"yargs-parser": {
-					"version": "20.2.7",
-					"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz",
-					"integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==",
+					"version": "20.2.9",
+					"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+					"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
 					"dev": true
 				}
 			}
@@ -4780,9 +4794,9 @@
 			}
 		},
 		"date-fns": {
-			"version": "2.21.3",
-			"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.21.3.tgz",
-			"integrity": "sha512-HeYdzCaFflc1i4tGbj7JKMjM4cKGYoyxwcIIkHzNgCkX8xXDNJDZXgDDVchIWpN4eQc3lH37WarduXFZJOtxfw==",
+			"version": "2.25.0",
+			"resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.25.0.tgz",
+			"integrity": "sha512-ovYRFnTrbGPD4nqaEqescPEv1mNwvt+UTqI3Ay9SzNtey9NZnYu6E2qCcBBgJ6/2VF1zGGygpyTDITqpQQ5e+w==",
 			"dev": true
 		},
 		"debug": {
@@ -4964,9 +4978,9 @@
 			"dev": true
 		},
 		"dependency-graph": {
-			"version": "0.9.0",
-			"resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.9.0.tgz",
-			"integrity": "sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w==",
+			"version": "0.11.0",
+			"resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz",
+			"integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==",
 			"dev": true
 		},
 		"des.js": {
@@ -6904,12 +6918,11 @@
 			"dev": true
 		},
 		"fs-extra": {
-			"version": "9.1.0",
-			"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
-			"integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+			"version": "10.0.0",
+			"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
+			"integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
 			"dev": true,
 			"requires": {
-				"at-least-node": "^1.0.0",
 				"graceful-fs": "^4.2.0",
 				"jsonfile": "^6.0.1",
 				"universalify": "^2.0.0"
@@ -7514,6 +7527,15 @@
 			"integrity": "sha512-/zC18RWCC2wz4ZwnS4UoujGWzvSKy28DLjtE+jrGBOXej6YdmityhBDzE8E0NlktEqi4tgdNbydX8B6G4haHSQ==",
 			"dev": true
 		},
+		"import-cwd": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz",
+			"integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==",
+			"dev": true,
+			"requires": {
+				"import-from": "^3.0.0"
+			}
+		},
 		"import-fresh": {
 			"version": "3.3.0",
 			"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
@@ -7524,6 +7546,23 @@
 				"resolve-from": "^4.0.0"
 			}
 		},
+		"import-from": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz",
+			"integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==",
+			"dev": true,
+			"requires": {
+				"resolve-from": "^5.0.0"
+			},
+			"dependencies": {
+				"resolve-from": {
+					"version": "5.0.0",
+					"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+					"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+					"dev": true
+				}
+			}
+		},
 		"import-lazy": {
 			"version": "4.0.0",
 			"resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz",
@@ -9066,6 +9105,12 @@
 				"type-check": "~0.4.0"
 			}
 		},
+		"lilconfig": {
+			"version": "2.0.4",
+			"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz",
+			"integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==",
+			"dev": true
+		},
 		"lines-and-columns": {
 			"version": "1.1.6",
 			"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
@@ -10002,9 +10047,9 @@
 			"optional": true
 		},
 		"nanoid": {
-			"version": "3.1.23",
-			"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz",
-			"integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==",
+			"version": "3.1.30",
+			"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz",
+			"integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==",
 			"dev": true
 		},
 		"nanomatch": {
@@ -10708,9 +10753,9 @@
 			"dev": true
 		},
 		"path-parse": {
-			"version": "1.0.6",
-			"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-			"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+			"version": "1.0.7",
+			"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+			"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
 			"dev": true
 		},
 		"path-type": {
@@ -10744,6 +10789,12 @@
 			"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
 			"dev": true
 		},
+		"picocolors": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+			"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+			"dev": true
+		},
 		"picomatch": {
 			"version": "2.2.2",
 			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
@@ -10836,42 +10887,34 @@
 			"dev": true
 		},
 		"postcss": {
-			"version": "8.3.0",
-			"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.0.tgz",
-			"integrity": "sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ==",
+			"version": "8.3.11",
+			"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.11.tgz",
+			"integrity": "sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA==",
 			"dev": true,
 			"requires": {
-				"colorette": "^1.2.2",
-				"nanoid": "^3.1.23",
+				"nanoid": "^3.1.30",
+				"picocolors": "^1.0.0",
 				"source-map-js": "^0.6.2"
-			},
-			"dependencies": {
-				"colorette": {
-					"version": "1.2.2",
-					"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
-					"integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
-					"dev": true
-				}
 			}
 		},
 		"postcss-cli": {
-			"version": "8.3.1",
-			"resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-8.3.1.tgz",
-			"integrity": "sha512-leHXsQRq89S3JC9zw/tKyiVV2jAhnfQe0J8VI4eQQbUjwIe0XxVqLrR+7UsahF1s9wi4GlqP6SJ8ydf44cgF2Q==",
+			"version": "9.0.2",
+			"resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-9.0.2.tgz",
+			"integrity": "sha512-08Wujoy7YGhKCFrGsT9OXqWjtHlGQ+JmyaD/4McjCiwor2IUTRVzXiJd+xmLTGdSWjceS6/TePaJQwBlkVWHiw==",
 			"dev": true,
 			"requires": {
-				"chalk": "^4.0.0",
 				"chokidar": "^3.3.0",
-				"dependency-graph": "^0.9.0",
-				"fs-extra": "^9.0.0",
-				"get-stdin": "^8.0.0",
-				"globby": "^11.0.0",
+				"dependency-graph": "^0.11.0",
+				"fs-extra": "^10.0.0",
+				"get-stdin": "^9.0.0",
+				"globby": "^12.0.0",
+				"picocolors": "^1.0.0",
 				"postcss-load-config": "^3.0.0",
 				"postcss-reporter": "^7.0.0",
 				"pretty-hrtime": "^1.0.3",
 				"read-cache": "^1.0.0",
-				"slash": "^3.0.0",
-				"yargs": "^16.0.0"
+				"slash": "^4.0.0",
+				"yargs": "^17.0.0"
 			},
 			"dependencies": {
 				"ansi-styles": {
@@ -10883,6 +10926,12 @@
 						"color-convert": "^2.0.1"
 					}
 				},
+				"array-union": {
+					"version": "3.0.1",
+					"resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz",
+					"integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==",
+					"dev": true
+				},
 				"cliui": {
 					"version": "7.0.4",
 					"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
@@ -10909,44 +10958,59 @@
 					"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
 					"dev": true
 				},
-				"get-stdin": {
-					"version": "8.0.0",
-					"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz",
-					"integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
-					"dev": true
-				},
-				"import-cwd": {
-					"version": "3.0.0",
-					"resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-3.0.0.tgz",
-					"integrity": "sha512-4pnzH16plW+hgvRECbDWpQl3cqtvSofHWh44met7ESfZ8UZOWWddm8hEyDTqREJ9RbYHY8gi8DqmaelApoOGMg==",
+				"fast-glob": {
+					"version": "3.2.7",
+					"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
+					"integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
 					"dev": true,
 					"requires": {
-						"import-from": "^3.0.0"
+						"@nodelib/fs.stat": "^2.0.2",
+						"@nodelib/fs.walk": "^1.2.3",
+						"glob-parent": "^5.1.2",
+						"merge2": "^1.3.0",
+						"micromatch": "^4.0.4"
 					}
 				},
-				"import-from": {
-					"version": "3.0.0",
-					"resolved": "https://registry.npmjs.org/import-from/-/import-from-3.0.0.tgz",
-					"integrity": "sha512-CiuXOFFSzkU5x/CR0+z7T91Iht4CXgfCxVOFRhh2Zyhg5wOpWvvDLQUsWl+gcN+QscYBjez8hDCt85O7RLDttQ==",
+				"get-stdin": {
+					"version": "9.0.0",
+					"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz",
+					"integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==",
+					"dev": true
+				},
+				"globby": {
+					"version": "12.0.2",
+					"resolved": "https://registry.npmjs.org/globby/-/globby-12.0.2.tgz",
+					"integrity": "sha512-lAsmb/5Lww4r7MM9nCCliDZVIKbZTavrsunAsHLr9oHthrZP1qi7/gAnHOsUs9bLvEt2vKVJhHmxuL7QbDuPdQ==",
 					"dev": true,
 					"requires": {
-						"resolve-from": "^5.0.0"
+						"array-union": "^3.0.1",
+						"dir-glob": "^3.0.1",
+						"fast-glob": "^3.2.7",
+						"ignore": "^5.1.8",
+						"merge2": "^1.4.1",
+						"slash": "^4.0.0"
 					}
 				},
-				"postcss-load-config": {
-					"version": "3.0.1",
-					"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.0.1.tgz",
-					"integrity": "sha512-/pDHe30UYZUD11IeG8GWx9lNtu1ToyTsZHnyy45B4Mrwr/Kb6NgYl7k753+05CJNKnjbwh4975amoPJ+TEjHNQ==",
+				"micromatch": {
+					"version": "4.0.4",
+					"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
+					"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
 					"dev": true,
 					"requires": {
-						"cosmiconfig": "^7.0.0",
-						"import-cwd": "^3.0.0"
+						"braces": "^3.0.1",
+						"picomatch": "^2.2.3"
 					}
 				},
-				"resolve-from": {
-					"version": "5.0.0",
-					"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
-					"integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+				"picomatch": {
+					"version": "2.3.0",
+					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+					"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+					"dev": true
+				},
+				"slash": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+					"integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
 					"dev": true
 				},
 				"wrap-ansi": {
@@ -10961,15 +11025,15 @@
 					}
 				},
 				"y18n": {
-					"version": "5.0.6",
-					"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.6.tgz",
-					"integrity": "sha512-PlVX4Y0lDTN6E2V4ES2tEdyvXkeKzxa8c/vo0pxPr/TqbztddTP0yn7zZylIyiAuxerqj0Q5GhpJ1YJCP8LaZQ==",
+					"version": "5.0.8",
+					"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+					"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
 					"dev": true
 				},
 				"yargs": {
-					"version": "16.2.0",
-					"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
-					"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+					"version": "17.2.1",
+					"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz",
+					"integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==",
 					"dev": true,
 					"requires": {
 						"cliui": "^7.0.2",
@@ -10982,9 +11046,9 @@
 					}
 				},
 				"yargs-parser": {
-					"version": "20.2.7",
-					"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz",
-					"integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==",
+					"version": "20.2.9",
+					"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+					"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
 					"dev": true
 				}
 			}
@@ -11038,37 +11102,20 @@
 				"postcss": "^7.0.14"
 			},
 			"dependencies": {
-				"chalk": {
-					"version": "2.4.2",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-					"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-					"dev": true,
-					"requires": {
-						"ansi-styles": "^3.2.1",
-						"escape-string-regexp": "^1.0.5",
-						"supports-color": "^5.3.0"
-					},
-					"dependencies": {
-						"supports-color": {
-							"version": "5.5.0",
-							"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-							"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-							"dev": true,
-							"requires": {
-								"has-flag": "^3.0.0"
-							}
-						}
-					}
+				"picocolors": {
+					"version": "0.2.1",
+					"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+					"integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+					"dev": true
 				},
 				"postcss": {
-					"version": "7.0.35",
-					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-					"integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+					"version": "7.0.39",
+					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+					"integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
 					"dev": true,
 					"requires": {
-						"chalk": "^2.4.2",
-						"source-map": "^0.6.1",
-						"supports-color": "^6.1.0"
+						"picocolors": "^0.2.1",
+						"source-map": "^0.6.1"
 					}
 				},
 				"source-map": {
@@ -11076,18 +11123,20 @@
 					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 					"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
 					"dev": true
-				},
-				"supports-color": {
-					"version": "6.1.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-					"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^3.0.0"
-					}
 				}
 			}
 		},
+		"postcss-load-config": {
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.0.tgz",
+			"integrity": "sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==",
+			"dev": true,
+			"requires": {
+				"import-cwd": "^3.0.0",
+				"lilconfig": "^2.0.3",
+				"yaml": "^1.10.2"
+			}
+		},
 		"postcss-loader": {
 			"version": "4.3.0",
 			"resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-4.3.0.tgz",
@@ -11165,17 +11214,17 @@
 			}
 		},
 		"postcss-reporter": {
-			"version": "7.0.2",
-			"resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.2.tgz",
-			"integrity": "sha512-JyQ96NTQQsso42y6L1H1RqHfWH1C3Jr0pt91mVv5IdYddZAE9DUZxuferNgk6q0o6vBVOrfVJb10X1FgDzjmDw==",
+			"version": "7.0.4",
+			"resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.4.tgz",
+			"integrity": "sha512-jY/fnpGSin7kwJeunXbY35STp5O3VIxSFdjee5JkoPQ+FfGH5JW3N+Xe9oAPcL9UkjWjkK+JC72o8XH4XXKdhw==",
 			"dev": true,
 			"requires": {
-				"colorette": "^1.2.1",
 				"lodash.difference": "^4.5.0",
 				"lodash.forown": "^4.4.0",
 				"lodash.get": "^4.4.2",
 				"lodash.groupby": "^4.6.0",
-				"lodash.sortby": "^4.7.0"
+				"lodash.sortby": "^4.7.0",
+				"picocolors": "^1.0.0"
 			}
 		},
 		"postcss-resolve-nested-selector": {
@@ -11193,37 +11242,20 @@
 				"postcss": "^7.0.26"
 			},
 			"dependencies": {
-				"chalk": {
-					"version": "2.4.2",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-					"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-					"dev": true,
-					"requires": {
-						"ansi-styles": "^3.2.1",
-						"escape-string-regexp": "^1.0.5",
-						"supports-color": "^5.3.0"
-					},
-					"dependencies": {
-						"supports-color": {
-							"version": "5.5.0",
-							"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-							"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-							"dev": true,
-							"requires": {
-								"has-flag": "^3.0.0"
-							}
-						}
-					}
+				"picocolors": {
+					"version": "0.2.1",
+					"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+					"integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+					"dev": true
 				},
 				"postcss": {
-					"version": "7.0.35",
-					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-					"integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+					"version": "7.0.39",
+					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+					"integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
 					"dev": true,
 					"requires": {
-						"chalk": "^2.4.2",
-						"source-map": "^0.6.1",
-						"supports-color": "^6.1.0"
+						"picocolors": "^0.2.1",
+						"source-map": "^0.6.1"
 					}
 				},
 				"source-map": {
@@ -11231,15 +11263,6 @@
 					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 					"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
 					"dev": true
-				},
-				"supports-color": {
-					"version": "6.1.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-					"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^3.0.0"
-					}
 				}
 			}
 		},
@@ -11253,37 +11276,20 @@
 				"postcss": "^7.0.21"
 			},
 			"dependencies": {
-				"chalk": {
-					"version": "2.4.2",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-					"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-					"dev": true,
-					"requires": {
-						"ansi-styles": "^3.2.1",
-						"escape-string-regexp": "^1.0.5",
-						"supports-color": "^5.3.0"
-					},
-					"dependencies": {
-						"supports-color": {
-							"version": "5.5.0",
-							"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-							"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-							"dev": true,
-							"requires": {
-								"has-flag": "^3.0.0"
-							}
-						}
-					}
+				"picocolors": {
+					"version": "0.2.1",
+					"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+					"integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+					"dev": true
 				},
 				"postcss": {
-					"version": "7.0.35",
-					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-					"integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+					"version": "7.0.39",
+					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+					"integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
 					"dev": true,
 					"requires": {
-						"chalk": "^2.4.2",
-						"source-map": "^0.6.1",
-						"supports-color": "^6.1.0"
+						"picocolors": "^0.2.1",
+						"source-map": "^0.6.1"
 					}
 				},
 				"source-map": {
@@ -11291,15 +11297,6 @@
 					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 					"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
 					"dev": true
-				},
-				"supports-color": {
-					"version": "6.1.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-					"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^3.0.0"
-					}
 				}
 			}
 		},
@@ -11312,37 +11309,20 @@
 				"postcss": "^7.0.6"
 			},
 			"dependencies": {
-				"chalk": {
-					"version": "2.4.2",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-					"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-					"dev": true,
-					"requires": {
-						"ansi-styles": "^3.2.1",
-						"escape-string-regexp": "^1.0.5",
-						"supports-color": "^5.3.0"
-					},
-					"dependencies": {
-						"supports-color": {
-							"version": "5.5.0",
-							"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-							"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-							"dev": true,
-							"requires": {
-								"has-flag": "^3.0.0"
-							}
-						}
-					}
+				"picocolors": {
+					"version": "0.2.1",
+					"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+					"integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+					"dev": true
 				},
 				"postcss": {
-					"version": "7.0.35",
-					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-					"integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+					"version": "7.0.39",
+					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+					"integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
 					"dev": true,
 					"requires": {
-						"chalk": "^2.4.2",
-						"source-map": "^0.6.1",
-						"supports-color": "^6.1.0"
+						"picocolors": "^0.2.1",
+						"source-map": "^0.6.1"
 					}
 				},
 				"source-map": {
@@ -11350,15 +11330,6 @@
 					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 					"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
 					"dev": true
-				},
-				"supports-color": {
-					"version": "6.1.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-					"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^3.0.0"
-					}
 				}
 			}
 		},
@@ -11390,12 +11361,6 @@
 			"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
 			"dev": true
 		},
-		"prettier": {
-			"version": "npm:wp-prettier@2.2.1-beta-1",
-			"resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-2.2.1-beta-1.tgz",
-			"integrity": "sha512-+JHkqs9LC/JPp51yy1hzs3lQ7qeuWCwOcSzpQNeeY/G7oSpnF61vxt7hRh87zNRTr6ob2ndy0W8rVzhgrcA+Gw==",
-			"dev": true
-		},
 		"prettier-linter-helpers": {
 			"version": "1.0.0",
 			"resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
@@ -12428,15 +12393,14 @@
 			"dev": true
 		},
 		"rtlcss": {
-			"version": "3.2.0",
-			"resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.2.0.tgz",
-			"integrity": "sha512-nV3UmaTmA5TkP2dYOR16ULu6FkMOqZRbiXbFZnmWIN9coPfx3gin31VGOPV7vrVMPjNds7pCS2UYy0mwQUdFCQ==",
+			"version": "3.5.0",
+			"resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz",
+			"integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==",
 			"dev": true,
 			"requires": {
-				"chalk": "^4.1.0",
 				"find-up": "^5.0.0",
-				"mkdirp": "^1.0.4",
-				"postcss": "^8.2.4",
+				"picocolors": "^1.0.0",
+				"postcss": "^8.3.11",
 				"strip-json-comments": "^3.1.1"
 			},
 			"dependencies": {
@@ -12459,12 +12423,6 @@
 						"p-locate": "^5.0.0"
 					}
 				},
-				"mkdirp": {
-					"version": "1.0.4",
-					"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-					"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-					"dev": true
-				},
 				"p-limit": {
 					"version": "3.1.0",
 					"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
@@ -13817,6 +13775,12 @@
 					"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
 					"dev": true
 				},
+				"picocolors": {
+					"version": "0.2.1",
+					"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+					"integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+					"dev": true
+				},
 				"picomatch": {
 					"version": "2.3.0",
 					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
@@ -13824,38 +13788,13 @@
 					"dev": true
 				},
 				"postcss": {
-					"version": "7.0.35",
-					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-					"integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+					"version": "7.0.39",
+					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+					"integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
 					"dev": true,
 					"requires": {
-						"chalk": "^2.4.2",
-						"source-map": "^0.6.1",
-						"supports-color": "^6.1.0"
-					},
-					"dependencies": {
-						"chalk": {
-							"version": "2.4.2",
-							"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-							"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-							"dev": true,
-							"requires": {
-								"ansi-styles": "^3.2.1",
-								"escape-string-regexp": "^1.0.5",
-								"supports-color": "^5.3.0"
-							},
-							"dependencies": {
-								"supports-color": {
-									"version": "5.5.0",
-									"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-									"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-									"dev": true,
-									"requires": {
-										"has-flag": "^3.0.0"
-									}
-								}
-							}
-						}
+						"picocolors": "^0.2.1",
+						"source-map": "^0.6.1"
 					}
 				},
 				"read-pkg": {
@@ -13942,15 +13881,6 @@
 					"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
 					"dev": true
 				},
-				"supports-color": {
-					"version": "6.1.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-					"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^3.0.0"
-					}
-				},
 				"type-fest": {
 					"version": "0.18.1",
 					"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
@@ -14008,37 +13938,20 @@
 				"postcss": "^7.0.2"
 			},
 			"dependencies": {
-				"chalk": {
-					"version": "2.4.2",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-					"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-					"dev": true,
-					"requires": {
-						"ansi-styles": "^3.2.1",
-						"escape-string-regexp": "^1.0.5",
-						"supports-color": "^5.3.0"
-					},
-					"dependencies": {
-						"supports-color": {
-							"version": "5.5.0",
-							"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-							"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-							"dev": true,
-							"requires": {
-								"has-flag": "^3.0.0"
-							}
-						}
-					}
+				"picocolors": {
+					"version": "0.2.1",
+					"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+					"integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+					"dev": true
 				},
 				"postcss": {
-					"version": "7.0.35",
-					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-					"integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+					"version": "7.0.39",
+					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+					"integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
 					"dev": true,
 					"requires": {
-						"chalk": "^2.4.2",
-						"source-map": "^0.6.1",
-						"supports-color": "^6.1.0"
+						"picocolors": "^0.2.1",
+						"source-map": "^0.6.1"
 					}
 				},
 				"source-map": {
@@ -14046,15 +13959,6 @@
 					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 					"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
 					"dev": true
-				},
-				"supports-color": {
-					"version": "6.1.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-					"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^3.0.0"
-					}
 				}
 			}
 		},
@@ -14187,9 +14091,9 @@
 			"dev": true
 		},
 		"tar": {
-			"version": "6.1.0",
-			"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz",
-			"integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==",
+			"version": "6.1.11",
+			"resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz",
+			"integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==",
 			"dev": true,
 			"requires": {
 				"chownr": "^2.0.0",
@@ -14438,9 +14342,9 @@
 			}
 		},
 		"tmpl": {
-			"version": "1.0.4",
-			"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz",
-			"integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=",
+			"version": "1.0.5",
+			"resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+			"integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
 			"dev": true
 		},
 		"to-arraybuffer": {
diff --git a/src/wp-content/themes/twentytwenty/package.json b/src/wp-content/themes/twentytwenty/package.json
index 50448a29c9..18b98886d9 100644
--- a/src/wp-content/themes/twentytwenty/package.json
+++ b/src/wp-content/themes/twentytwenty/package.json
@@ -1,6 +1,6 @@
 {
 	"name": "twentytwenty",
-	"version": "1.8.0",
+	"version": "1.9.0",
 	"description": "Default WP Theme",
 	"author": "The WordPress Contributors",
 	"license": "GPL-2.0-or-later",
@@ -16,11 +16,11 @@
 	"devDependencies": {
 		"@wordpress/browserslist-config": "^4.0.1",
 		"@wordpress/scripts": "^16.1.2",
-		"autoprefixer": "^10.2.6",
-		"concurrently": "^6.2.0",
-		"postcss-cli": "^8.3.1",
-		"postcss": "^8.3.0",
-		"rtlcss": "^3.2.0",
+		"autoprefixer": "^10.4.0",
+		"concurrently": "^6.3.0",
+		"postcss-cli": "^9.0.2",
+		"postcss": "^8.3.11",
+		"rtlcss": "^3.5.0",
 		"stylelint-a11y": "^1.2.3"
 	},
 	"browserslist": [
diff --git a/src/wp-content/themes/twentytwenty/readme.txt b/src/wp-content/themes/twentytwenty/readme.txt
index 9d7ad469bc..5ce24c1388 100644
--- a/src/wp-content/themes/twentytwenty/readme.txt
+++ b/src/wp-content/themes/twentytwenty/readme.txt
@@ -1,7 +1,7 @@
 === Twenty Twenty ===
 Contributors: the WordPress team
-Tested up to: 5.8
-Stable tag: 1.8
+Tested up to: 5.9
+Stable tag: 1.9
 License: GPLv2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
 
@@ -22,6 +22,11 @@ you pick, ensuring a high, accessible color contrast for your visitors.
 
 == Changelog ==
 
+= 1.9 =
+* Released: January 25, 2022
+
+https://wordpress.org/support/article/twenty-twenty-changelog/#Version_1.9
+
 = 1.8 =
 * Released: July 20, 2021
 
@@ -69,7 +74,7 @@ Initial release
 
 == Copyright ==
 
-Twenty Twenty WordPress Theme, Copyright 2019-2021 WordPress.org
+Twenty Twenty WordPress Theme, Copyright 2019-2022 WordPress.org
 Twenty Twenty is distributed under the terms of the GNU GPL.
 
 This program is free software: you can redistribute it and/or modify
@@ -118,7 +123,7 @@ License URI: http://www.gnu.org/licenses/gpl-2.0.html
 Source: WordPress Social Link Block (See wp-includes\blocks\social-link.php)
 
 Code from Twenty Nineteen
-Copyright (c) 2018-2021 WordPress.org
+Copyright (c) 2018-2022 WordPress.org
 License: GPLv2
 Source: https://wordpress.org/themes/twentynineteen/
 Included as part of the following classes and functions:
@@ -128,11 +133,11 @@ Included as part of the following classes and functions:
 - twentytwenty_nav_menu_social_icons()
 
 Code from Twenty Seventeen
-Copyright (c) 2016-2021 WordPress.org
+Copyright (c) 2016-2022 WordPress.org
 License: GPLv2
 Source: https://wordpress.org/themes/twentyseventeen/
 Included as part of the following classes and functions:
 - twentytwenty_unique_id()
 
 Underscores
-https://underscores.me/, (C) 2012-2021 Automattic, Inc., [GPLv2 or later](https://www.gnu.org/licenses/gpl-2.0.html)
+https://underscores.me/, (C) 2012-2022 Automattic, Inc., [GPLv2 or later](https://www.gnu.org/licenses/gpl-2.0.html)
diff --git a/src/wp-content/themes/twentytwenty/style-rtl.css b/src/wp-content/themes/twentytwenty/style-rtl.css
index aa87bedf03..0e5191d247 100644
--- a/src/wp-content/themes/twentytwenty/style-rtl.css
+++ b/src/wp-content/themes/twentytwenty/style-rtl.css
@@ -1,7 +1,8 @@
 /*
 Theme Name: Twenty Twenty
 Text Domain: twentytwenty
-Version: 1.8
+Version: 1.9
+Tested up to: 5.9
 Requires at least: 4.7
 Requires PHP: 5.2.4
 Description: Our default theme for 2020 is designed to take full advantage of the flexibility of the block editor. Organizations and businesses have the ability to create dynamic landing pages with endless layouts using the group and column blocks. The centered content column and fine-tuned typography also makes it perfect for traditional blogs. Complete editor styles give you a good idea of what your content will look like, even before you publish. You can give your site a personal touch by changing the background colors and the accent color in the Customizer. The colors of all elements on your site are automatically calculated based on the colors you pick, ensuring a high, accessible color contrast for your visitors.
@@ -3524,7 +3525,7 @@ figure.wp-block-table.is-style-stripes {
 /* Font Families ----------------------------- */
 
 .entry-content {
-	font-family: NonBreakingSpaceOverride, "Hoefler Text", Garamond, "Times New Roman", serif;
+	font-family: NonBreakingSpaceOverride, "Hoefler Text", "Noto Serif", Garamond, "Times New Roman", serif;
 	letter-spacing: normal;
 }
 
@@ -4119,7 +4120,7 @@ div.comment:first-of-type {
 .widget_text dl,
 .widget_text dt,
 .widget-content .rssSummary {
-	font-family: NonBreakingSpaceOverride, "Hoefler Text", Garamond, "Times New Roman", serif;
+	font-family: NonBreakingSpaceOverride, "Hoefler Text", "Noto Serif", Garamond, "Times New Roman", serif;
 	letter-spacing: normal;
 }
 
diff --git a/src/wp-content/themes/twentytwenty/style.css b/src/wp-content/themes/twentytwenty/style.css
index b5a99f90f5..27053cc3e0 100644
--- a/src/wp-content/themes/twentytwenty/style.css
+++ b/src/wp-content/themes/twentytwenty/style.css
@@ -1,7 +1,8 @@
 /*
 Theme Name: Twenty Twenty
 Text Domain: twentytwenty
-Version: 1.8
+Version: 1.9
+Tested up to: 5.9
 Requires at least: 4.7
 Requires PHP: 5.2.4
 Description: Our default theme for 2020 is designed to take full advantage of the flexibility of the block editor. Organizations and businesses have the ability to create dynamic landing pages with endless layouts using the group and column blocks. The centered content column and fine-tuned typography also makes it perfect for traditional blogs. Complete editor styles give you a good idea of what your content will look like, even before you publish. You can give your site a personal touch by changing the background colors and the accent color in the Customizer. The colors of all elements on your site are automatically calculated based on the colors you pick, ensuring a high, accessible color contrast for your visitors.
@@ -3546,7 +3547,7 @@ figure.wp-block-table.is-style-stripes {
 /* Font Families ----------------------------- */
 
 .entry-content {
-	font-family: NonBreakingSpaceOverride, "Hoefler Text", Garamond, "Times New Roman", serif;
+	font-family: NonBreakingSpaceOverride, "Hoefler Text", "Noto Serif", Garamond, "Times New Roman", serif;
 	letter-spacing: normal;
 }
 
@@ -4153,7 +4154,7 @@ div.comment:first-of-type {
 .widget_text dl,
 .widget_text dt,
 .widget-content .rssSummary {
-	font-family: NonBreakingSpaceOverride, "Hoefler Text", Garamond, "Times New Roman", serif;
+	font-family: NonBreakingSpaceOverride, "Hoefler Text", "Noto Serif", Garamond, "Times New Roman", serif;
 	letter-spacing: normal;
 }
 
diff --git a/src/wp-content/themes/twentytwentyone/assets/css/ie-editor.css b/src/wp-content/themes/twentytwentyone/assets/css/ie-editor.css
index 9665360514..5afd750a7a 100644
--- a/src/wp-content/themes/twentytwentyone/assets/css/ie-editor.css
+++ b/src/wp-content/themes/twentytwentyone/assets/css/ie-editor.css
@@ -147,11 +147,7 @@ blockquote p {
 	line-height: 1.7;
 }
 
-blockquote cite {
-	font-weight: normal;
-	letter-spacing: normal;
-}
-
+blockquote cite,
 blockquote footer {
 	font-weight: normal;
 	letter-spacing: normal;
@@ -162,33 +158,16 @@ blockquote.alignright {
 	padding-left: inherit;
 }
 
-blockquote.alignleft p {
-	font-size: 1.125rem;
-	max-width: inherit;
-	width: inherit;
-}
-
+blockquote.alignleft p,
 blockquote.alignright p {
 	font-size: 1.125rem;
 	max-width: inherit;
 	width: inherit;
 }
 
-blockquote.alignleft cite {
-	font-size: 1rem;
-	letter-spacing: normal;
-}
-
-blockquote.alignleft footer {
-	font-size: 1rem;
-	letter-spacing: normal;
-}
-
-blockquote.alignright cite {
-	font-size: 1rem;
-	letter-spacing: normal;
-}
-
+blockquote.alignleft cite,
+blockquote.alignleft footer,
+blockquote.alignright cite,
 blockquote.alignright footer {
 	font-size: 1rem;
 	letter-spacing: normal;
@@ -206,18 +185,8 @@ blockquote:before {
 	left: -12px;
 }
 
-blockquote .wp-block-quote__citation {
-	color: #28303d;
-	font-size: 1rem;
-	font-style: normal;
-}
-
-blockquote cite {
-	color: #28303d;
-	font-size: 1rem;
-	font-style: normal;
-}
-
+blockquote .wp-block-quote__citation,
+blockquote cite,
 blockquote footer {
 	color: #28303d;
 	font-size: 1rem;
@@ -236,16 +205,14 @@ blockquote footer {
 
 img {
 	height: auto;
-	max-width: 100%;
 	vertical-align: middle;
 }
 
 /* Classic editor images */
-.entry-content img {
-	max-width: 100%;
-}
 
 /* Make sure embeds and iframes fit their containers. */
+img,
+.entry-content img,
 embed,
 iframe,
 object,
@@ -254,33 +221,9 @@ video {
 }
 
 /* Media captions */
-figcaption {
-	color: currentColor;
-	font-size: 1rem;
-	line-height: 1.7;
-	margin-top: 10px;
-	margin-bottom: 20px;
-	text-align: center;
-}
-
-.wp-caption {
-	color: currentColor;
-	font-size: 1rem;
-	line-height: 1.7;
-	margin-top: 10px;
-	margin-bottom: 20px;
-	text-align: center;
-}
-
-.wp-caption-text {
-	color: currentColor;
-	font-size: 1rem;
-	line-height: 1.7;
-	margin-top: 10px;
-	margin-bottom: 20px;
-	text-align: center;
-}
-
+figcaption,
+.wp-caption,
+.wp-caption-text,
 .wp-block-embed figcaption {
 	color: currentColor;
 	font-size: 1rem;
@@ -580,13 +523,7 @@ a:hover {
 	color: currentColor;
 }
 
-.wp-block-cover {
-	background-color: #000;
-	min-height: 450px;
-	margin-top: inherit;
-	margin-bottom: inherit;
-}
-
+.wp-block-cover,
 .wp-block-cover-image {
 	background-color: #000;
 	min-height: 450px;
@@ -629,10 +566,7 @@ a:hover {
 .wp-block-cover-image .wp-block-cover__inner-container,
 .wp-block-cover-image .wp-block-cover-image-text,
 .wp-block-cover-image .wp-block-cover-text,
-.wp-block-cover-image .block-editor-block-list__block {
-	color: currentColor;
-}
-
+.wp-block-cover-image .block-editor-block-list__block,
 .wp-block-cover .wp-block-cover__inner-container a,
 .wp-block-cover .wp-block-cover-image-text a,
 .wp-block-cover .wp-block-cover-text a,
@@ -644,34 +578,13 @@ a:hover {
 	color: currentColor;
 }
 
-.wp-block-cover .wp-block-cover__inner-container .has-link-color a {
-	color: #28303d;
-}
-
-.wp-block-cover .wp-block-cover-image-text .has-link-color a {
-	color: #28303d;
-}
-
-.wp-block-cover .wp-block-cover-text .has-link-color a {
-	color: #28303d;
-}
-
-.wp-block-cover .block-editor-block-list__block .has-link-color a {
-	color: #28303d;
-}
-
-.wp-block-cover-image .wp-block-cover__inner-container .has-link-color a {
-	color: #28303d;
-}
-
-.wp-block-cover-image .wp-block-cover-image-text .has-link-color a {
-	color: #28303d;
-}
-
-.wp-block-cover-image .wp-block-cover-text .has-link-color a {
-	color: #28303d;
-}
-
+.wp-block-cover .wp-block-cover__inner-container .has-link-color a,
+.wp-block-cover .wp-block-cover-image-text .has-link-color a,
+.wp-block-cover .wp-block-cover-text .has-link-color a,
+.wp-block-cover .block-editor-block-list__block .has-link-color a,
+.wp-block-cover-image .wp-block-cover__inner-container .has-link-color a,
+.wp-block-cover-image .wp-block-cover-image-text .has-link-color a,
+.wp-block-cover-image .wp-block-cover-text .has-link-color a,
 .wp-block-cover-image .block-editor-block-list__block .has-link-color a {
 	color: #28303d;
 }
@@ -753,10 +666,7 @@ a:hover {
 	text-align: right;
 }
 
-.wp-block-cover.is-style-twentytwentyone-border {
-	border: 3px solid #28303d;
-}
-
+.wp-block-cover.is-style-twentytwentyone-border,
 .wp-block-cover-image.is-style-twentytwentyone-border {
 	border: 3px solid #28303d;
 }
@@ -1019,182 +929,46 @@ a:hover {
 	width: 100%;
 }
 
-.wp-block-heading h1 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-h1 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-.h1 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-.wp-block-heading h2 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-h2 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-.h2 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-.wp-block-heading h3 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-h3 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-.h3 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-.wp-block-heading h4 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-h4 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-.h4 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-.wp-block-heading h5 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-h5 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-.h5 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-.wp-block-heading h6 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-h6 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
+.wp-block-heading h1,
+h1,
+.h1,
+.wp-block-heading h2,
+h2,
+.h2,
+.wp-block-heading h3,
+h3,
+.h3,
+.wp-block-heading h4,
+h4,
+.h4,
+.wp-block-heading h5,
+h5,
+.h5,
+.wp-block-heading h6,
+h6,
 .h6 {
 	clear: both;
 	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
 	font-weight: normal;
 }
 
-.wp-block-heading h1 strong {
-	font-weight: 600;
-}
-
-h1 strong {
-	font-weight: 600;
-}
-
-.h1 strong {
-	font-weight: 600;
-}
-
-.wp-block-heading h2 strong {
-	font-weight: 600;
-}
-
-h2 strong {
-	font-weight: 600;
-}
-
-.h2 strong {
-	font-weight: 600;
-}
-
-.wp-block-heading h3 strong {
-	font-weight: 600;
-}
-
-h3 strong {
-	font-weight: 600;
-}
-
-.h3 strong {
-	font-weight: 600;
-}
-
-.wp-block-heading h4 strong {
-	font-weight: 600;
-}
-
-h4 strong {
-	font-weight: 600;
-}
-
-.h4 strong {
-	font-weight: 600;
-}
-
-.wp-block-heading h5 strong {
-	font-weight: 600;
-}
-
-h5 strong {
-	font-weight: 600;
-}
-
-.h5 strong {
-	font-weight: 600;
-}
-
-.wp-block-heading h6 strong {
-	font-weight: 600;
-}
-
-h6 strong {
-	font-weight: 600;
-}
-
+.wp-block-heading h1 strong,
+h1 strong,
+.h1 strong,
+.wp-block-heading h2 strong,
+h2 strong,
+.h2 strong,
+.wp-block-heading h3 strong,
+h3 strong,
+.h3 strong,
+.wp-block-heading h4 strong,
+h4 strong,
+.h4 strong,
+.wp-block-heading h5 strong,
+h5 strong,
+.h5 strong,
+.wp-block-heading h6 strong,
+h6 strong,
 .h6 strong {
 	font-weight: 600;
 }
@@ -1388,20 +1162,8 @@ h3 {
 	}
 }
 
-.wp-block-heading h4 {
-	font-size: 1.5rem;
-	font-weight: 600;
-	letter-spacing: normal;
-	line-height: 1.3;
-}
-
-h4 {
-	font-size: 1.5rem;
-	font-weight: 600;
-	letter-spacing: normal;
-	line-height: 1.3;
-}
-
+.wp-block-heading h4,
+h4,
 .h4 {
 	font-size: 1.5rem;
 	font-weight: 600;
@@ -1409,20 +1171,8 @@ h4 {
 	line-height: 1.3;
 }
 
-.wp-block-heading h5 {
-	font-size: 1.125rem;
-	font-weight: 600;
-	letter-spacing: 0.05em;
-	line-height: 1.3;
-}
-
-h5 {
-	font-size: 1.125rem;
-	font-weight: 600;
-	letter-spacing: 0.05em;
-	line-height: 1.3;
-}
-
+.wp-block-heading h5,
+h5,
 .h5 {
 	font-size: 1.125rem;
 	font-weight: 600;
@@ -1430,20 +1180,8 @@ h5 {
 	line-height: 1.3;
 }
 
-.wp-block-heading h6 {
-	font-size: 1rem;
-	font-weight: 600;
-	letter-spacing: 0.05em;
-	line-height: 1.3;
-}
-
-h6 {
-	font-size: 1rem;
-	font-weight: 600;
-	letter-spacing: 0.05em;
-	line-height: 1.3;
-}
-
+.wp-block-heading h6,
+h6,
 .h6 {
 	font-size: 1rem;
 	font-weight: 600;
@@ -1458,7 +1196,8 @@ h6 {
 }
 
 /* Center image block by default in the editor */
-.wp-block-image > div {
+.wp-block-image,
+.wp-block-image > div:not(.components-placeholder) {
 	text-align: center;
 }
 
@@ -1467,10 +1206,7 @@ h6 {
 }
 
 /* Block Styles */
-.wp-block-image.is-style-twentytwentyone-border img {
-	border: 3px solid #28303d;
-}
-
+.wp-block-image.is-style-twentytwentyone-border img,
 .wp-block-image.is-style-twentytwentyone-image-frame img {
 	border: 3px solid #28303d;
 }
@@ -1479,10 +1215,7 @@ h6 {
 	padding: 20px;
 }
 
-.wp-block-latest-comments {
-	padding-left: 0;
-}
-
+.wp-block-latest-comments,
 .wp-block-latest-posts {
 	padding-left: 0;
 }
@@ -1558,13 +1291,7 @@ h6 {
 	color: currentColor;
 }
 
-.wp-block-latest-posts .wp-block-latest-posts__post-excerpt {
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-size: 1.125rem;
-	line-height: 1.7;
-	margin-top: 20px;
-}
-
+.wp-block-latest-posts .wp-block-latest-posts__post-excerpt,
 .wp-block-latest-posts .wp-block-latest-posts__post-full-content {
 	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
 	font-size: 1.125rem;
@@ -1692,12 +1419,7 @@ h6 {
 	display: block;
 }
 
-ul {
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	margin: 30px 0;
-	padding-left: 50px;
-}
-
+ul,
 ol {
 	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
 	margin: 30px 0;
@@ -1841,18 +1563,8 @@ pre.wp-block-preformatted {
 	color: currentColor;
 }
 
-.wp-block-pullquote .wp-block-pullquote__citation {
-	font-size: 1rem;
-	font-style: normal;
-	text-transform: none;
-}
-
-.wp-block-pullquote cite {
-	font-size: 1rem;
-	font-style: normal;
-	text-transform: none;
-}
-
+.wp-block-pullquote .wp-block-pullquote__citation,
+.wp-block-pullquote cite,
 .wp-block-pullquote footer {
 	font-size: 1rem;
 	font-style: normal;
@@ -1882,12 +1594,7 @@ pre.wp-block-preformatted {
 	text-align: left;
 }
 
-.wp-block-pullquote.is-style-solid-color.alignleft blockquote {
-	padding-left: 20px;
-	padding-right: 20px;
-	max-width: inherit;
-}
-
+.wp-block-pullquote.is-style-solid-color.alignleft blockquote,
 .wp-block-pullquote.is-style-solid-color.alignright blockquote {
 	padding-left: 20px;
 	padding-right: 20px;
@@ -2001,14 +1708,7 @@ pre.wp-block-preformatted {
 	display: none;
 }
 
-.wp-block-quote.is-large {
-	padding-left: 0;
-
-	/* Resetting margins to match _block-container.scss */
-	margin-top: 30px;
-	margin-bottom: 30px;
-}
-
+.wp-block-quote.is-large,
 .wp-block-quote.is-style-large {
 	padding-left: 0;
 
@@ -2099,10 +1799,7 @@ pre.wp-block-preformatted {
 }
 @media only screen and (max-width: 481px) {
 
-	.wp-block-quote.is-large {
-		padding-left: 25px;
-	}
-
+	.wp-block-quote.is-large,
 	.wp-block-quote.is-style-large {
 		padding-left: 25px;
 	}
@@ -2112,11 +1809,7 @@ pre.wp-block-preformatted {
 		left: 0;
 	}
 
-	.wp-block-quote.is-large.has-text-align-right {
-		padding-left: 0;
-		padding-right: 25px;
-	}
-
+	.wp-block-quote.is-large.has-text-align-right,
 	.wp-block-quote.is-style-large.has-text-align-right {
 		padding-left: 0;
 		padding-right: 25px;
@@ -2249,13 +1942,7 @@ pre.wp-block-preformatted {
 	color: currentColor;
 }
 
-.wp-block-rss .wp-block-rss__item-excerpt {
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-size: 1.125rem;
-	line-height: 1.7;
-	margin-top: 20px;
-}
-
+.wp-block-rss .wp-block-rss__item-excerpt,
 .wp-block-rss .wp-block-rss__item-full-content {
 	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
 	font-size: 1.125rem;
@@ -2298,17 +1985,7 @@ pre.wp-block-preformatted {
 	margin-bottom: 10px;
 }
 
-.wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper {
-	border: 3px solid #39414d;
-	border-radius: 0;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-size: 1.125rem;
-	line-height: 1.7;
-	max-width: inherit;
-	margin-right: -3px;
-	padding: 10px;
-}
-
+.wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper,
 .wp-block-search .wp-block-search__input {
 	border: 3px solid #39414d;
 	border-radius: 0;
@@ -2320,18 +1997,12 @@ pre.wp-block-preformatted {
 	padding: 10px;
 }
 
-.is-dark-theme .wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper {
-	background: rgba(255, 255, 255, 0.9);
-}
-
+.is-dark-theme .wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper,
 .is-dark-theme .wp-block-search .wp-block-search__input {
 	background: rgba(255, 255, 255, 0.9);
 }
 
-.has-background .wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper {
-	border-color: #28303d !important;
-}
-
+.has-background .wp-block-search.wp-block-search__button-inside .wp-block-search__inside-wrapper,
 .has-background .wp-block-search .wp-block-search__input {
 	border-color: #28303d !important;
 }
@@ -2437,10 +2108,7 @@ pre.wp-block-preformatted {
 	color: #28303d;
 }
 
-.is-dark-theme .wp-block-search.wp-block-search__button-inside.wp-block-search__text-button .wp-block-search__button {
-	color: #28303d;
-}
-
+.is-dark-theme .wp-block-search.wp-block-search__button-inside.wp-block-search__text-button .wp-block-search__button,
 .is-dark-theme .wp-block-search.wp-block-search__button-inside.wp-block-search__icon-button .wp-block-search__button {
 	color: #28303d;
 }
@@ -2467,12 +2135,7 @@ pre.wp-block-preformatted {
 	justify-content: center;
 }
 
-.wp-block-separator {
-	border-bottom: 1px solid #28303d;
-	clear: both;
-	opacity: 1;
-}
-
+.wp-block-separator,
 hr {
 	border-bottom: 1px solid #28303d;
 	clear: both;
@@ -2534,10 +2197,7 @@ hr:not(.is-style-dots) {
 	max-width: inherit;
 }
 
-.wp-block-separator.is-style-twentytwentyone-separator-thick {
-	border-bottom-width: 3px;
-}
-
+.wp-block-separator.is-style-twentytwentyone-separator-thick,
 hr.is-style-twentytwentyone-separator-thick {
 	border-bottom-width: 3px;
 }
@@ -2600,74 +2260,32 @@ table tfoot,
 	text-align: center;
 }
 
-table th {
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-}
-
+table th,
 .wp-block-table th {
 	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
 }
 
-table td {
-	padding: 10px;
-}
-
-table th {
-	padding: 10px;
-}
-
-.wp-block-table td {
-	padding: 10px;
-}
-
+table td,
+table th,
+.wp-block-table td,
 .wp-block-table th {
 	padding: 10px;
 }
 
-table.is-style-regular .has-background {
-	color: #28303d;
-}
-
-table.is-style-stripes .has-background {
-	color: #28303d;
-}
-
-table.is-style-stripes .has-background thead tr {
-	color: #28303d;
-}
-
-table.is-style-stripes .has-background tfoot tr {
-	color: #28303d;
-}
-
-table.is-style-stripes .has-background tbody tr {
-	color: #28303d;
-}
-
-.wp-block-table.is-style-regular .has-background {
-	color: #28303d;
-}
-
-.wp-block-table.is-style-stripes .has-background {
-	color: #28303d;
-}
-
-.wp-block-table.is-style-stripes .has-background thead tr {
-	color: #28303d;
-}
-
-.wp-block-table.is-style-stripes .has-background tfoot tr {
-	color: #28303d;
-}
-
+table.is-style-regular .has-background,
+table.is-style-stripes .has-background,
+table.is-style-stripes .has-background thead tr,
+table.is-style-stripes .has-background tfoot tr,
+table.is-style-stripes .has-background tbody tr,
+.wp-block-table.is-style-regular .has-background,
+.wp-block-table.is-style-stripes .has-background,
+.wp-block-table.is-style-stripes .has-background thead tr,
+.wp-block-table.is-style-stripes .has-background tfoot tr,
 .wp-block-table.is-style-stripes .has-background tbody tr {
 	color: #28303d;
 }
 
-table.is-style-stripes {
-	border-color: #f0f0f0;
-}
-
+table.is-style-stripes,
 .wp-block-table.is-style-stripes {
 	border-color: #f0f0f0;
 }
@@ -3064,20 +2682,23 @@ pre.wp-block-verse {
 }
 
 html {
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
 	line-height: 1.7;
 }
 
+html,
 body {
-	color: #28303d;
-	background-color: #d1e4dd;
 	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
+}
+
+body {
+	background-color: #d1e4dd;
 	font-size: 1.25rem;
 	font-weight: normal;
 	-moz-osx-font-smoothing: grayscale;
 	-webkit-font-smoothing: antialiased;
 }
 
+body,
 .wp-block a {
 	color: #28303d;
 }
@@ -3091,10 +2712,7 @@ body {
 	text-decoration: none;
 }
 
-.has-background .has-link-color a {
-	color: #28303d;
-}
-
+.has-background .has-link-color a,
 .has-background.has-link-color a {
 	color: #28303d;
 }
diff --git a/src/wp-content/themes/twentytwentyone/assets/css/ie-editor.css.map b/src/wp-content/themes/twentytwentyone/assets/css/ie-editor.css.map
index b61cebedcd..24926990c8 100644
--- a/src/wp-content/themes/twentytwentyone/assets/css/ie-editor.css.map
+++ b/src/wp-content/themes/twentytwentyone/assets/css/ie-editor.css.map
@@ -1 +1 @@
-{"version":3,"sources":["style-editor.css","../sass/style-editor.scss","../sass/01-settings/global.scss","../sass/03-generic/breakpoints.scss","../sass/04-elements/blockquote.scss","../sass/04-elements/media.scss","../sass/04-elements/forms-editor.scss","../sass/04-elements/links.scss","../sass/05-blocks/button/_editor.scss","../sass/02-tools/mixins.scss","../sass/05-blocks/code/_editor.scss","../sass/05-blocks/cover/_editor.scss","../sass/05-blocks/columns/_editor.scss","../sass/05-blocks/file/_editor.scss","../sass/05-blocks/gallery/_editor.scss","../sass/05-blocks/group/_editor.scss","../sass/05-blocks/heading/_editor.scss","../sass/05-blocks/html/_editor.scss","../sass/05-blocks/image/_editor.scss","../sass/05-blocks/latest-comments/_editor.scss","../sass/05-blocks/latest-posts/_editor.scss","../sass/05-blocks/legacy/_editor.scss","../sass/05-blocks/list/_editor.scss","../sass/05-blocks/media-text/_editor.scss","../sass/05-blocks/navigation/_editor.scss","../sass/05-blocks/paragraph/_editor.scss","../sass/05-blocks/preformatted/_editor.scss","../sass/05-blocks/pullquote/_editor.scss","../sass/05-blocks/query-loop/_editor.scss","../sass/05-blocks/quote/_editor.scss","../sass/05-blocks/rss/_editor.scss","../sass/05-blocks/search/_editor.scss","../sass/05-blocks/separator/_editor.scss","../sass/05-blocks/social-icons/_editor.scss","../sass/05-blocks/table/_editor.scss","../sass/05-blocks/tag-clould/_editor.scss","../sass/05-blocks/verse/_editor.scss","../sass/05-blocks/utilities/_font-sizes.scss","../sass/05-blocks/utilities/_editor.scss","../sass/06-components/editor.scss","../sass/07-utilities/color-palette.scss"],"names":[],"mappings":"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AhBg2BD;;AgBp3BA;EAkBC,WAAA;EACA,gIAAA;EACA,mBAAA;AhBg2BD;;AgBp3BA;EAkBC,WAAA;EACA,gIAAA;EACA,mBAAA;AhBg2BD;;AgBp3BA;EAkBC,WAAA;EACA,gIAAA;EACA,mBAAA;AhBg2BD;;AgBp3BA;EAkBC,WAAA;EACA,gIAAA;EACA,mBAAA;AhBg2BD;;AgBp3BA;EAkBC,WAAA;EACA,gIAAA;EACA,mBAAA;AhBg2BD;AgB91BC;EACC,gBAAA;AhBi3BF;AgBl3BC;EACC,gBAAA;AhBi3BF;AgBl3BC;EACC,gBAAA;AhBi3BF;AgBl3BC;EACC,gBAAA;AhBi3BF;AgBl3BC;EACC,gBAAA;AhBi3BF;AgBl3BC;EACC,gBAAA;AhBi3BF;AgBl3BC;EACC,gBAAA;AhBi3BF;AgBl3BC;EACC,gBAAA;AhBi3BF;AgBl3BC;EACC,gBAAA;AhBi3BF;AgBl3BC;EACC,gBAAA;AhBi3BF;AgBl3BC;EACC,gBAAA;AhBi3BF;AgBl3BC;EACC,gBAAA;AhBi3BF;AgBl3BC;EACC,gBAAA;AhBi3BF;AgBl3BC;EACC,gBAAA;AhBi3BF;AgBl3BC;EACC,gBAAA;AhBi3BF;AgBl3BC;EACC,gBAAA;AhBi3BF;AgBl3BC;EACC,gBAAA;AhBi3BF;AgBl3BC;EACC,gBAAA;AhBi3BF;AgB92BC;EACC,gBAAA;AhBi4BF;AgBl4BC;EACC,gBAAA;AhBi4BF;AgBl4BC;EACC,gBAAA;AhBi4BF;AgBl4BC;EACC,gBAAA;AhBi4BF;AgBl4BC;EACC,gBAAA;AhBi4BF;AgBl4BC;EACC,gBAAA;AhBi4BF;AgBl4BC;EACC,gBAAA;AhBi4BF;AgBl4BC;EACC,gBAAA;AhBi4BF;AgBl4BC;EACC,gBAAA;AhBi4BF;AgBl4BC;EACC,gBAAA;AhBi4BF;AgBl4BC;EACC,gBAAA;AhBi4BF;AgBl4BC;EACC,gBAAA;AhBi4BF;AgBl4BC;EACC,gBAAA;AhBi4BF;AgBl4BC;EACC,gBAAA;AhBi4BF;AgBl4BC;EACC,gBAAA;AhBi4BF;AgBl4BC;EACC,gBAAA;AhBi4BF;AgBl4BC;EACC,gBAAA;AhBi4BF;AgBl4BC;EACC,gBAAA;AhBi4BF;;AgB73BA;EAGC,eAAA;EACA,sBAAA;EACA,gBAAA;AhBg4BD;;AEprBA;EcjNA;EAGC;EhBk4BD;AAxsBA;;AgB7LA;EAGC,eAAA;EACA,sBAAA;EACA,gBAAA;AhBg4BD;;AEprBA;EcjNA;EAGC;EhBk4BD;AAxsBA;;AgB7LA;EAGC,eAAA;EACA,sBAAA;EACA,gBAAA;AhBg4BD;;AEprBA;EcjNA;EAGC;EhBk4BD;AAxsBA;;AgBrLA;EAGC,kBAAA;EACA,sBAAA;EACA,gBAAA;AhBg4BD;;AE5rBA;EczMA;EAGC;EhBk4BD;AAhtBA;;AgBrLA;EAGC,kBAAA;EACA,sBAAA;EACA,gBAAA;AhBg4BD;;AE5rBA;EczMA;EAGC;EhBk4BD;AAhtBA;;AgBrLA;EAGC,kBAAA;EACA,sBAAA;EACA,gBAAA;AhBg4BD;;AE5rBA;EczMA;EAGC;EhBk4BD;AAhtBA;;AgB7KA;EAGC,eAAA;EACA,sBAAA;EACA,gBAAA;AhBg4BD;;AEpsBA;EcjMA;EAGC;EhBk4BD;AAxtBA;;AgB7KA;EAGC,eAAA;EACA,sBAAA;EACA,gBAAA;AhBg4BD;;AEpsBA;EcjMA;EAGC;EhBk4BD;AAxtBA;;AgB7KA;EAGC,eAAA;EACA,sBAAA;EACA,gBAAA;AhBg4BD;;AEpsBA;EcjMA;EAGC;EhBk4BD;AAxtBA;;AgBrKA;EAGC,iBAAA;EACA,gBAAA;EACA,sBAAA;EACA,gBAAA;AhBg4BD;;AgBt4BA;EAGC,iBAAA;EACA,gBAAA;EACA,sBAAA;EACA,gBAAA;AhBg4BD;;AgBt4BA;EAGC,iBAAA;EACA,gBAAA;EACA,sBAAA;EACA,gBAAA;AhBg4BD;;AgB73BA;EAGC,mBAAA;EACA,gBAAA;EACA,sBAAA;EACA,gBAAA;AhBg4BD;;AgBt4BA;EAGC,mBAAA;EACA,gBAAA;EACA,sBAAA;EACA,gBAAA;AhBg4BD;;AgBt4BA;EAGC,mBAAA;EACA,gBAAA;EACA,sBAAA;EACA,gBAAA;AhBg4BD;;AgB73BA;EAGC,eAAA;EACA,gBAAA;EACA,sBAAA;EACA,gBAAA;AhBg4BD;;AgBt4BA;EAGC,eAAA;EACA,gBAAA;EACA,sBAAA;EACA,gBAAA;AhBg4BD;;AgBt4BA;EAGC,eAAA;EACA,gBAAA;EACA,sBAAA;EACA,gBAAA;AhBg4BD;;AiB/8BA;EAEC,cAAA;EACA,gBAAA;EACA,aAAA;AjBi9BD;;AkBr9BA,gDAAA;AAEA;EACC,kBAAA;AlBu9BD;;AkBp9BA;EACC,cAAA;AlBu9BD;;AkBp9BA,iBAAA;AAEA;EAEC,yBAAA;AlBs9BD;AkBx9BA;EAEC,yBAAA;AlBs9BD;;AkBn9BA;EACC,aAAA;AlBs9BD;;AmBx+BA;EACC,eAAA;AnB2+BD;;AoB5+BA;EACC,eAAA;ApB++BD;AoB5+BC;EACC,gBAAA;EACA,mBAAA;ApB8+BF;AoB5+BE;EACC,aAAA;ApB8+BH;AoB3+BE;EACC,gBAAA;ApB6+BH;AoBz+BC;EACC,qBAAA;EACA,sBAAA;ApB2+BF;AoBz+BE;EACC,mBAAA;ApB2+BH;AoBz+BG;EACC,gBAAA;ApB2+BJ;AoBt+BC;EACC,gBAAA;EACA,mBAAA;ApBw+BF;AoBt+BE;EACC,aAAA;ApBw+BH;AoBr+BE;EACC,gBAAA;ApBu+BH;AoBl+BC;EACC,qBAAA;EACA,gIAAA;EACA,eAAA;EACA,mBAAA;EACA,gBAAA;EACA,mBAAA;ApBo+BF;AEtyBA;EkBpMC;EAGC;EpBu+BF;AA1zBA;AoBtKC;EACC,cAAA;EACA,kBAAA;EACA,gBAAA;ApBk+BF;AoB99BC;EACC,cAAA;EACA,eAAA;EACA,gBAAA;ApBg+BF;AoB99BE;EAEC,mBAAA;ApB+9BH;AoB19BC;EAEC,gIAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;ApB49BF;AoBj+BC;EAEC,gIAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;ApB49BF;AoBx9BC;EACC,6BAAA;EACA,gCAAA;ApB09BF;AoBx9BE;EAEC,oBAAA;EACA,gCAAA;EACA,gBAAA;EACA,mBAAA;ApB09BH;AoB/9BE;EAEC,oBAAA;EACA,gCAAA;EACA,gBAAA;EACA,mBAAA;ApB09BH;AoBx9BG;;EACC,iBAAA;EACA,mBAAA;ApB29BJ;AoBv9BE;EAEC,oCAAA;EACA,gCAAA;ApBw9BH;AoBt9BG;EACC,SAAA;EACA,iBAAA;EACA,mBAAA;ApBw9BJ;AoBt9BI;EACC,oBAAA;ApBw9BL;AoBl9BG;EAEE;IACC,UAAA;EpBm9BJ;EoBp9BG;IACC,UAAA;EpBs9BJ;EoBv9BG;IACC,UAAA;EpBy9BJ;EoB19BG;IACC,UAAA;EpB49BJ;EoB79BG;IACC,UAAA;EpB+9BJ;AACF;AoBv9BE;EACC,yBAAA;EACA,kBAAA;ApBy9BH;AoBv9BG;EACC,oBAAA;EACA,mBAAA;ApBy9BJ;AoBr9BE;EACC,gBAAA;EACA,mBAAA;ApBu9BH;;AqBnmCA;EACC,qBAAA;EACA,kBAAA;EACA,mBAAA;EACA,WAAA;ArBsmCD;AqBpmCC;EACC,cAAA;ArBsmCF;AqBnmCC;EACC,iBAAA;ArBqmCF;AqBlmCC;EACC,cAAA;ArBomCF;AqBjmCC;EACC,cAAA;ArBmmCF;AqBhmCC;EACC,iBAAA;ArBkmCF;AqB/lCC;EACC,iBAAA;ArBimCF;AqB9lCC;EACC,gBAAA;ArBgmCF;AqB7lCC;EACC,iBAAA;ArB+lCF;;AqB3lCA;EACC,cAAA;ArB8lCD;;AsBtoCA;EAEC,gIAAA;EACA,cAAA;EACA,kBAAA;AtByoCD;;AsB7oCA;EAEC,gIAAA;EACA,cAAA;EACA,kBAAA;AtByoCD;AsBtoCC;;EACC,2BAAA;EACA,UAAA;EACA,kBAAA;AtByoCF;AsBtoCC;;EACC,2BAAA;EACA,UAAA;EACA,iBAAA;AtByoCF;;AsBnoCC;;EAEC,SAAA;AtBsoCF;;AsBloCA;EACC,gIAAA;EACA,iBAAA;AtBqoCD;;AuBjqCC;EACC,aAAA;EACA,gBAAA;AvBoqCF;ASnlCC;EACC,aAAA;ATqlCF;ASjlCC;EACC,gBAAA;ATmlCF;AS/kCC;EAEC,gBAAA;ATglCF;AuBxqCC;EACC,aAAA;AvB0qCF;AuBtqCC;EACC,yBAAA;AvBwqCF;;AwBrrCC;EACC,mBAAA;EACA,UAAA;AxBwrCF;AwBnrCE;EACC,aAAA;AxBqrCH;AwBlrCE;EACC,gIAAA;EACA,kBAAA;EACA,mBAAA;AxBorCH;AwB9qCE;EACC,4CAAA;AxBgrCH;AwBtqCI;EAEC,cAAA;AxBuqCL;AwBzqCI;EAEC,cAAA;AxBuqCL;AwBlqCE;EACC,mBAAA;AxBoqCH;;AyB7sCA;EACC,gBAAA;AzBgtCD;AyB9sCC;EACC,aAAA;AzBgtCF;;A0BptCA;EACC,gBAAA;EACA,2BAAA;EACA,eAAA;A1ButCD;;A2B1tCA;EACC,eAAA;EACA,kBAAA;EACA,iBAAA;EACA,0BAAA;EACA,uBAAA;EACA,mBAAA;EACA,0BAAA;EACA,kBAAA;A3B6tCD;A2B3tCC;EACC,mBAAA;EACA,YAAA;EACA,cAAA;EACA,kBAAA;EACA,OAAA;EACA,eAAA;EACA,gBAAA;EACA,cAAA;A3B6tCF;A2B1tCC;EACC,gIAAA;EACA,eAAA;EACA,kBAAA;EACA,gBAAA;EACA,sBAAA;EACA,gBAAA;EACA,SAAA;A3B4tCF;AExgCA;EyB3NC;EAEC;E3BiuCF;AA5hCA;A2B7LC;EACC,mBAAA;A3B2tCF;A2BxtCC;EAGC,eAAA;EACA,kBAAA;EACA,oBAAA;A3B0tCF;A2B/tCC;EAGC,eAAA;EACA,kBAAA;EACA,oBAAA;A3B0tCF;A2B/tCC;EAGC,eAAA;EACA,kBAAA;EACA,oBAAA;A3B0tCF;A2BttCC;EACC,gBAAA;A3BwtCF;A2BrtCC;EACC,iBAAA;EACA,kBAAA;EACA,aAAA;EACA,iBAAA;EACA,mBAAA;EACA,qBAAA;A3ButCF;A2BrtCE;EARD;IASE,cAAA;E3BwtCD;AACF;A2BttCE;EACC,gBAAA;A3BwtCH;A2BrtCE;EAEC,kBAAA;EACA,mBAAA;EACA,kBAAA;A3BstCH;A2B1tCE;EAEC,kBAAA;EACA,mBAAA;EACA,kBAAA;A3BstCH;A2BntCE;EACC,SAAA;EACA,eAAA;A3BqtCH;A2BntCG;EACC,eAAA;A3BqtCJ;AEjjCA;EyBrKG;EACC;E3BqtCJ;AArkCA;A2B5IE;;;EAGC,mBAAA;A3BmtCH;;A2BzsCE;EACC,eAAA;A3B4sCH;;A2BpsCC;EACC,aAAA;A3BwsCF;;A2BzsCC;EACC,aAAA;A3BwsCF;;A4B7yCC;EACC,aAAA;A5BgzCF;AGzxCE;EyBxBD;IAIE,aAAA;E5BizCD;AACF;;A6BxzCA;EACC,kBAAA;EACA,iBAAA;EACA,2BAAA;A7B2zCD;A6BzzCC;EACC,gIAAA;EACA,kBAAA;EACA,kBAAA;EACA,gBAAA;EACA,gBAAA;A7B2zCF;A6BxzCC;EACC,mBAAA;A7B0zCF;A6BvzCC;EACC,YAAA;EACA,kBAAA;EACA,gBAAA;EACA,WAAA;A7ByzCF;A6BtzCC;EACC,cAAA;EACA,eAAA;EACA,kBAAA;A7BwzCF;A6BtzCE;EAIC,mBAAA;A7BqzCH;A6BjzCC;EACC,2BAAA;EACA,gBAAA;EACA,kBAAA;A7BmzCF;A6BhzCE;EACC,aAAA;A7BkzCH;A6B9yCE;EACC,YAAA;EACA,kBAAA;EACA,mBAAA;EACA,gBAAA;EACA,iBAAA;A7BgzCH;A6B5yCC;EACC,iBAAA;A7B8yCF;A6B5yCE;EACC,aAAA;A7B8yCH;A6B1yCC;EAEC,eAAA;EAEA,qDAAA;EACA,gBAAA;EACA,mBAAA;A7B0yCF;A6BhzCC;EAEC,eAAA;EAEA,qDAAA;EACA,gBAAA;EACA,mBAAA;A7B0yCF;A6BxyCE;EACC,kBAAA;EACA,kBAAA;EACA,iBAAA;A7B0yCH;AEtoCA;E2BvKE;EACC;E7B4yCH;AA1pCA;A6BnJE;EACC,kBAAA;EACA,kBAAA;EACA,iBAAA;A7B0yCH;AEtoCA;E2BvKE;EACC;E7B4yCH;AA1pCA;A6B7IE;EACC,kBAAA;EACA,iBAAA;EACA,WAAA;A7ByyCH;AE3oCA;E2BjKE;EACC;E7B2yCH;AA/pCA;A6B7IE;EACC,kBAAA;EACA,iBAAA;EACA,WAAA;A7ByyCH;AE3oCA;E2BjKE;EACC;E7B2yCH;AA/pCA;A6BpIG;EACC,aAAA;A7BqyCJ;A6BjyCG;EACC,YAAA;EACA,kBAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;A7BmyCJ;AErpCA;E2BnJG;EAEC;E7BsyCJ;AAzqCA;A6B/HG;EACC,YAAA;EACA,kBAAA;EACA,mBAAA;EACA,iBAAA;EACA,kBAAA;A7BmyCJ;AErpCA;E2BnJG;EAEC;E7BsyCJ;AAzqCA;AGxME;E0B6CD;IAsCE,kBAAA;E7BkyCD;E6Bx0CD;IAsCE,kBAAA;E7BkyCD;E6BhyCC;IACC,OAAA;E7BkyCF;E6B/xCC;IACC,eAAA;IACA,mBAAA;E7BiyCF;E6BnyCC;IACC,eAAA;IACA,mBAAA;E7BiyCF;E6B/xCE;IACC,QAAA;E7BiyCH;AACF;AGh4CE;E0BpBF;IAyHE,kBAAA;E7B+xCA;E6B7xCA;IACC,OAAA;E7B+xCD;E6B5xCA;IACC,eAAA;IACA,mBAAA;E7B8xCD;E6B5xCC;IACC,QAAA;E7B8xCF;E6B1xCA;IACC,eAAA;IACA,gBAAA;E7B4xCD;AACF;AG74CE;E0B1BF;IA+IE,iBAAA;E7B4xCA;E6B1xCA;IACC,kBAAA;E7B4xCD;AACF;;A8B/6CA;EACC,eAAA;A9Bk7CD;A8Bh7CC;EACC,gBAAA;A9Bk7CF;A8B96CC;EACC,gBAAA;EACA,mBAAA;A9Bg7CF;A8B96CE;EACC,aAAA;A9Bg7CH;A8B76CE;EACC,gBAAA;A9B+6CH;A8Bz6CE;EACC,mBAAA;A9B26CH;A8Bz6CG;EACC,gBAAA;A9B26CJ;A8Bt6CE;EAUC,gBAAA;A9B+5CH;A8B35CC;EACC,gBAAA;EACA,mBAAA;A9B65CF;A8B35CE;EACC,aAAA;A9B65CH;A8B15CE;EACC,gBAAA;A9B45CH;A8Bv5CC;EACC,qBAAA;EACA,gIAAA;EACA,eAAA;EACA,mBAAA;EACA,gBAAA;EACA,mBAAA;A9By5CF;AE3uCA;E4BpLC;EAGC;E9B45CF;AA/vCA;A8BtJC;EACC,cAAA;EACA,kBAAA;EACA,gBAAA;A9Bu5CF;A8Bn5CC;EACC,cAAA;EACA,eAAA;EACA,gBAAA;A9Bq5CF;A8Bn5CE;EAEC,mBAAA;A9Bo5CH;A8B/4CC;EAEC,gIAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;A9Bi5CF;A8Bt5CC;EAEC,gIAAA;EACA,mBAAA;EACA,gBAAA;EACA,gBAAA;A9Bi5CF;A8B74CC;EACC,kBAAA;EACA,mBAAA;A9B+4CF;A8B74CE;EAEC,eAAA;EACA,gBAAA;A9B84CH;;A+Bv/CA;EACC,6BAAA;A/B0/CD;;AGj+CE;E4B1BF;EACC;E/B0/CD;AArwCA;;AGxLE;E4B9DF;EACC;E/B0/CD;AA/vCA;A+BzPC;EACC,mBAAA;EACA,gBAAA;EACA,mBAAA;A/B0/CF;A+Bv/CC;EAEC,yBAAA;EACA,gBAAA;EACA,gIAAA;EACA,mBAAA;EACA,gBAAA;EACA,kBAAA;EACA,kBAAA;EACA,aAAA;A/By/CF;A+BlgDC;EAEC,yBAAA;EACA,gBAAA;EACA,gIAAA;EACA,mBAAA;EACA,gBAAA;EACA,kBAAA;EACA,kBAAA;EACA,aAAA;A/By/CF;A+Bv/CE;EACC,oCAAA;A/B0/CH;A+B3/CE;EACC,oCAAA;A/B0/CH;A+Bv/CE;EACC,gCAAA;A/B0/CH;A+B3/CE;EACC,gCAAA;A/B0/CH;A+Bt/CC;EtBPA,6BAAA;EACA,gBAAA;EACA,eAAA;EACA,gBAAA;EACA,gIAAA;EACA,kBAAA;EACA,gBAAA;EACA,kBAAA;EACA,qBAAA;EsBCC,gBAAA;EACA,cAAA;A/BggDF;AS5/CE;EACC,cAAA;AT8/CH;AS3/CG;EACC,cAAA;AT6/CJ;AS3/CI;EACC,cAAA;AT6/CL;ASv/CE;EACC,yBAAA;ATy/CH;ASt/CG;EACC,yBAAA;ATw/CJ;ASl/CC;EAEC,6BAAA;EACA,0BAAA;EACA,cAAA;ATm/CF;AS/+CC;EACC,oBAAA;EACA,gCAAA;ATi/CF;AS7+CC;EACC,0CAAA;EACA,sCAAA;EACA,cAAA;AT++CF;A+B3hDE;EACC,iBAAA;EACA,gBAAA;A/B6hDH;A+B3hDG;EACC,WAAA;EACA,YAAA;A/B6hDJ;A+BthDG;EACC,oCAAA;EACA,yBAAA;A/BwhDJ;A+B1hDG;EACC,oCAAA;EACA,yBAAA;A/BwhDJ;A+BrhDG;EACC,yBAAA;A/BuhDJ;A+BxhDG;EACC,yBAAA;A/BuhDJ;A+BlhDE;EACC,uBAAA;EACA,gBAAA;A/BohDH;A+B9gDE;EACC,YAAA;A/BghDH;A+B7gDE;EACC,YAAA;A/B+gDH;A+BvgDI;EACC,cAAA;A/BygDL;A+B1gDI;EACC,cAAA;A/BygDL;A+BtgDI;EACC,cAAA;A/BwgDL;A+BzgDI;EACC,cAAA;A/BwgDL;A+BtgDK;EACC,yBAAA;EACA,WAAA;A/BwgDN;A+B1gDK;EACC,yBAAA;EACA,WAAA;A/BwgDN;A+BlgDE;EAEC,kBAAA;A/BmgDH;;A+B9/CA;EACC,kBAAA;A/BigDD;;A+B1/CE;EACC,uBAAA;A/B6/CH;;AgC3mDA;EAEC,gCAAA;EACA,WAAA;EACA,UAAA;AhC8mDD;;AgClnDA;EAEC,gCAAA;EACA,WAAA;EACA,UAAA;AhC8mDD;AgC5mDC;EAEC,2BAAA;AhC+mDF;AgCjnDC;EAEC,2BAAA;AhC+mDF;AgCjnDC;EAEC,2BAAA;AhC+mDF;AgCjnDC;EAEC,2BAAA;AhC+mDF;AgC5mDC;EACC,6BAAA;AhC+mDF;AGjmDE;E6BfD;EACC;EhC+mDF;AAr4CA;AGxLE;E6BnDD;EACC;EhC+mDF;AA/3CA;AgCjPC;EACC,6BAAA;AhC+mDF;AGjmDE;E6BfD;EACC;EhC+mDF;AAr4CA;AGxLE;E6BnDD;EACC;EhC+mDF;AA/3CA;AgC7OC;;;EAEC,kBAAA;AhC+mDF;AgC5mDC;EACC,wBAAA;AhC+mDF;AgChnDC;EACC,wBAAA;AhC+mDF;AgC5mDC;;EACC,mBAAA;AhC+mDF;AgC7mDE;;;EAEC,wCAAA;AhCgnDH;AgC9mDG;;;EACC,8BAAA;AhCknDJ;AgC9mDE;EACC,cAAA;AhCinDH;AgClnDE;EACC,cAAA;AhCinDH;AgC7mDC;;;;;EAIC,0BAAA;AhCgnDF;;AiC1pDC;EACC,aAAA;EACA,gBAAA;AjC6pDF;AiCxpDE;EACC,cAAA;AjC0pDH;AiCvpDE;EACC,gBAAA;AjCypDH;;AkCrqDC;;;;EAEC,kBAAA;AlC0qDF;AkCvqDC;EACC,gIAAA;AlC0qDF;AkC3qDC;EACC,gIAAA;AlC0qDF;AkCvqDC;EAEC,aAAA;AlC2qDF;AkC7qDC;EAEC,aAAA;AlC2qDF;AkC7qDC;EAEC,aAAA;AlC2qDF;AkC7qDC;EAEC,aAAA;AlC2qDF;AkCxqDC;EAKC,cAAA;AlC2qDF;AkChrDC;EAKC,cAAA;AlC2qDF;AkChrDC;EAKC,cAAA;AlC2qDF;AkChrDC;EAKC,cAAA;AlC2qDF;AkChrDC;EAKC,cAAA;AlC2qDF;AkChrDC;EAKC,cAAA;AlC2qDF;AkChrDC;EAKC,cAAA;AlC2qDF;AkChrDC;EAKC,cAAA;AlC2qDF;AkChrDC;EAKC,cAAA;AlC2qDF;AkChrDC;EAKC,cAAA;AlC2qDF;AkCxqDC;EACC,qBAAA;AlC2qDF;AkC5qDC;EACC,qBAAA;AlC2qDF;AkCzqDE;;;;EAEC,eAAA;AlC6qDH;AkC1qDE;EACC,yBAAA;AlC6qDH;AkC9qDE;EACC,yBAAA;AlC6qDH;AkC1qDE;EACC,0CAAA;AlC6qDH;AkC9qDE;EACC,0CAAA;AlC6qDH;;AkCtqDC;;EAEC,uBAAA;EACA,SAAA;EACA,kBAAA;EACA,cAAA;EACA,sBAAA;AlCyqDF;AkCtqDC;EACC,iBAAA;AlCwqDF;AkCrqDC;;EAEC,mBAAA;EACA,iBAAA;AlCuqDF;AkCpqDC;EACC,iBAAA;EACA,gBAAA;EACA,mBAAA;EACA,mBAAA;AlCsqDF;;AkClqDA;EACC,gBAAA;EACA,gBAAA;AlCqqDD;AkCnqDC;EACC,WAAA;EACA,sBAAA;AlCqqDF;AkCnqDE;EACC,kBAAA;AlCqqDH;AkCjqDC;EACC,YAAA;AlCmqDF;;AmCvvDC;EACC,kBAAA;AnC0vDF;;AoC7vDA;EACC,UAAA;EACA,mBAAA;ApCgwDD;;AqC/vDC;EAEC,eAAA;ArCkwDF;;AqCpwDC;EAEC,eAAA;ArCkwDF;AqC/vDC;EAEC,mBAAA;ArCiwDF;AqCnwDC;EAEC,mBAAA;ArCiwDF;AqC9vDC;EAKC,kBAAA;ArCgwDF;AqCrwDC;EAKC,kBAAA;ArCgwDF;AqCrwDC;EAKC,kBAAA;ArCgwDF;AqCrwDC;EAKC,kBAAA;ArCgwDF;AqCrwDC;EAKC,kBAAA;ArCgwDF;AqC7vDC;EAEC,iBAAA;EACA,gBAAA;ArC+vDF;AqClwDC;EAEC,iBAAA;EACA,gBAAA;ArC+vDF;AqC5vDC;EAIC,iBAAA;EACA,gBAAA;ArC8vDF;AE9iDA;EmCrNC;EAIC;ErC+vDF;AAlkDA;AqCjMC;EAIC,iBAAA;EACA,gBAAA;ArC8vDF;AE9iDA;EmCrNC;EAIC;ErC+vDF;AAlkDA;AqCjMC;EAIC,iBAAA;EACA,gBAAA;ArC8vDF;AE9iDA;EmCrNC;EAIC;ErC+vDF;AAlkDA;AqCjMC;EAIC,iBAAA;EACA,gBAAA;ArC8vDF;AE9iDA;EmCrNC;EAIC;ErC+vDF;AAlkDA;AqCzLC;EAEC,eAAA;EACA,gBAAA;EAGA,gBAAA;ArC2vDF;AEpjDA;EmC7MC;EAEC;ErC+vDF;AAxkDA;AqCzLC;EAEC,eAAA;EACA,gBAAA;EAGA,gBAAA;ArC2vDF;AEpjDA;EmC7MC;EAEC;ErC+vDF;AAxkDA;AqChLC;EAEC,eAAA;EACA,gBAAA;EAGA,gBAAA;ArCwvDF;AE1jDA;EmCpMC;EAEC;ErC4vDF;AA9kDA;AqChLC;EAEC,eAAA;EACA,gBAAA;EAGA,gBAAA;ArCwvDF;AE1jDA;EmCpMC;EAEC;ErC4vDF;AA9kDA;;AsC5NA;;;CAAA;AAMA;EACC,gCAAA;EACA,oBAAA;EACA,mBAAA;EACA,6BAAA;AtC2yDD;AG3xDE;EmCpBF;EAIC;EtC2yDD;AA/jDA;AGxLE;EmCxDF;EAIC;EtC2yDD;AAzjDA;AsChPC;EACC,cAAA;EACA,gIAAA;EACA,eAAA;EACA,gBAAA;EACA,gBAAA;AtC2yDF;AE5kDA;EoCpOC;EAGC;EtC6yDF;AAhmDA;;AsCtMA;EACC,gIAAA;EACA,kBAAA;AtCyyDD;;AsCryDA;EACC,cAAA;AtCwyDD;;AsCryDA;EACC,cAAA;AtCwyDD;;AsCtxDA;EACC,yBAAA;EACA,cAAA;AtCoyDD;;AsCjyDA;EACC,yBAAA;EACA,cAAA;AtCoyDD;;AsCjyDA;EAEC,cAAA;AtCoyDD;;AsCjyDA;EAEC,cAAA;AtCoyDD;;AsChyDA;EACC,gBAAA;EACA,mBAAA;AtCmyDD;;AsC/xDA;EAIC,6BAAA;AtC+xDD;;AGv1DE;EmCoDF;EAIC;EtC+xDD;AA3nDA;;AGxLE;EmCgBF;EAIC;EtC+xDD;AArnDA;AsCvKC;EAEC,6BAAA;AtC6xDF;AG11DE;EmC2DD;EAEC;EtC6xDF;AA9nDA;AGxLE;EmCuBD;EAEC;EtC6xDF;AAxnDA;AsCvKC;EAEC,6BAAA;AtC6xDF;AG11DE;EmC2DD;EAEC;EtC6xDF;AA9nDA;AGxLE;EmCuBD;EAEC;EtC6xDF;AAxnDA;AsClKC;EAEC,eAAA;AtC2xDF;;AsCvxDA;EACC,SAAA;EACA,kBAAA;AtC0xDD;;AsCvxDA;EACC,SAAA;EACA,iBAAA;AtC0xDD;;AsCtxDA;EACC,gIAAA;EACA,mBAAA;EACA,iBAAA;EACA,yBAAA;EACA,kBAAA;EACA,WAAA;EACA,uBAAA;EACA,eAAA;AtCyxDD;;AE5pDA;EoCrIA;EAQC;EtCyxDD;AAhrDA;;AsCtGA;EAEC;IACC,gBAAA;IACA,kBAAA;EtCwxDA;;EsCrxDD;IACC,gBAAA;IACA,iBAAA;EtCwxDA;AACF;AsCpxDA;EACC,YAAA;AtCsxDD;;AsClxDA;EACC,SAAA;AtCqxDD;;AuC/5DA;EACC,gIAAA;EACA,gBAAA;AvCk6DD;;AuC/5DA;EAEC,cAAA;EACA,yBAAA;EACA,gIAAA;EACA,kBAAA;EACA,mBAAA;EACA,kCAAA;EACA,mCAAA;AvCk6DD;;AuC95DA;EACC,cAAA;AvCi6DD;AuC/5DC;EACC,6BAAA;AvCi6DF;AuC95DC;EACC,0BAAA;EACA,qBAAA;AvCg6DF;;AuCx5DC;EAEC,cAAA;AvC05DF;;AuC55DC;EAEC,cAAA;AvC05DF;;AuCt5DA;;EAEC,eAAA;AvCy5DD;;AwCj8DA;EAMC,WAAA;AxC+7DD;AwCn8DC;EAEC,WAAA;AxCq8DF;;AwCh8DA;EAMC,cAAA;AxC87DD;AwCl8DC;EAEC,cAAA;AxCo8DF;;AwC/7DA;EAMC,cAAA;AxC67DD;AwCj8DC;EAEC,cAAA;AxCm8DF;;AwC97DA;EAMC,cAAA;AxC47DD;AwCh8DC;EAEC,cAAA;AxCk8DF;;AwC77DA;EAMC,cAAA;AxC27DD;AwC/7DC;EAEC,cAAA;AxCi8DF;;AwC57DA;EAMC,cAAA;AxC07DD;AwC97DC;EAEC,cAAA;AxCg8DF;;AwC37DA;EAMC,cAAA;AxCy7DD;AwC77DC;EAEC,cAAA;AxC+7DF;;AwC17DA;EAMC,cAAA;AxCw7DD;AwC57DC;EAEC,cAAA;AxC87DF;;AwCz7DA;EAMC,cAAA;AxCu7DD;AwC37DC;EAEC,cAAA;AxC67DF;;AwCx7DA;EAMC,WAAA;AxCs7DD;AwC17DC;EAEC,WAAA;AxC47DF;;AwCp7DC;;;;;;;;EAQC,mBAAA;AxCu7DF;;AwCn7DA;EAMC,sBAAA;AxCi7DD;AwCr7DC;EAEC,sBAAA;AxCu7DF;;AwCl7DA;EAMC,yBAAA;AxCg7DD;AwCp7DC;EAEC,yBAAA;AxCs7DF;;AwCj7DA;EAMC,yBAAA;AxC+6DD;AwCn7DC;EAEC,yBAAA;AxCq7DF;;AwCh7DA;EAMC,yBAAA;AxC86DD;AwCl7DC;EAEC,yBAAA;AxCo7DF;;AwC/6DA;EAMC,yBAAA;AxC66DD;AwCj7DC;EAEC,yBAAA;AxCm7DF;;AwC96DA;EAMC,yBAAA;AxC46DD;AwCh7DC;EAEC,yBAAA;AxCk7DF;;AwC76DA;EAMC,yBAAA;AxC26DD;AwC/6DC;EAEC,yBAAA;AxCi7DF;;AwC56DA;EAMC,yBAAA;AxC06DD;AwC96DC;EAEC,yBAAA;AxCg7DF;;AwC36DA;EAMC,yBAAA;AxCy6DD;AwC76DC;EAEC,yBAAA;AxC+6DF;;AwC16DA;EAMC,yBAAA;AxCw6DD;AwC56DC;EAEC,yBAAA;AxC86DF;;AwCz6DA;EAMC,sBAAA;AxCu6DD;AwC36DC;EAEC,sBAAA;AxC66DF;;AwCt6DC;EAGG,WAAA;AxCu6DJ;;AwC16DC;EAGG,WAAA;AxCu6DJ;;AwC16DC;EAGG,WAAA;AxCu6DJ;AwCp6DE;EAMC;AxCk6DH;AwCx6DE;EAMC;AxCk6DH;AwCx6DE;EAMC;AxCk6DH;AwC95DC;EAOG,cAAA;AxC65DJ;AwCp6DC;EAOG,cAAA;AxC65DJ;AwCp6DC;EAOG,cAAA;AxC65DJ;AwCp6DC;EAOG,cAAA;AxC65DJ;AwCp6DC;EAOG,cAAA;AxC65DJ;AwCp6DC;EAOG,cAAA;AxC65DJ;AwCp6DC;EAOG,cAAA;AxC65DJ;AwC15DE;EAMC;AxCw5DH;AwC95DE;EAMC;AxCw5DH;AwC95DE;EAMC;AxCw5DH;AwC95DE;EAMC;AxCw5DH;AwC95DE;EAMC;AxCw5DH;AwC95DE;EAMC;AxCw5DH;AwC95DE;EAMC;AxCw5DH;;AwCl5DA;EACC,qDAAA;AxCw5DD;;AwCr5DA;EACC,qDAAA;AxCw5DD;;AwCr5DA;EACC,qDAAA;AxCw5DD;;AwCr5DA;EACC,qDAAA;AxCw5DD;;AwCr5DA;EACC,qDAAA;AxCw5DD;;AwCr5DA;EACC,qDAAA;AxCw5DD;;AwCr5DA;EACC,qDAAA;AxCw5DD;;AwCr5DA;EACC,qDAAA;AxCw5DD","file":"ie-editor.css"}
\ No newline at end of file
+{"version":3,"sources":["style-editor.css","../sass/style-editor.scss","../sass/01-settings/global.scss","../sass/03-generic/breakpoints.scss","../sass/04-elements/blockquote.scss","../sass/04-elements/media.scss","../sass/04-elements/forms-editor.scss","../sass/04-elements/links.scss","../sass/05-blocks/button/_editor.scss","../sass/02-tools/mixins.scss","../sass/05-blocks/code/_editor.scss","../sass/05-blocks/cover/_editor.scss","../sass/05-blocks/columns/_editor.scss","../sass/05-blocks/file/_editor.scss","../sass/05-blocks/gallery/_editor.scss","../sass/05-blocks/group/_editor.scss","../sass/05-blocks/heading/_editor.scss","../sass/05-blocks/html/_editor.scss","../sass/05-blocks/image/_editor.scss","../sass/05-blocks/latest-posts/_editor.scss","../sass/05-blocks/legacy/_editor.scss","../sass/05-blocks/list/_editor.scss","../sass/05-blocks/media-text/_editor.scss","../sass/05-blocks/navigation/_editor.scss","../sass/05-blocks/paragraph/_editor.scss","../sass/05-blocks/preformatted/_editor.scss","../sass/05-blocks/pullquote/_editor.scss","../sass/05-blocks/query-loop/_editor.scss","../sass/05-blocks/quote/_editor.scss","../sass/05-blocks/rss/_editor.scss","../sass/05-blocks/search/_editor.scss","../sass/05-blocks/separator/_editor.scss","../sass/05-blocks/social-icons/_editor.scss","../sass/05-blocks/table/_editor.scss","../sass/05-blocks/tag-clould/_editor.scss","../sass/05-blocks/verse/_editor.scss","../sass/05-blocks/utilities/_font-sizes.scss","../sass/05-blocks/utilities/_editor.scss","../sass/06-components/editor.scss","../sass/07-utilities/color-palette.scss"],"names":[],"mappings":"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;;AuCz7DA;EAMC,WAAA;AvCu7DD;AuC37DC;EAEC,WAAA;AvC67DF;;AuCr7DC;;;;;;;;EAQC,mBAAA;AvCw7DF;;AuCp7DA;EAMC,sBAAA;AvCk7DD;AuCt7DC;EAEC,sBAAA;AvCw7DF;;AuCn7DA;EAMC,yBAAA;AvCi7DD;AuCr7DC;EAEC,yBAAA;AvCu7DF;;AuCl7DA;EAMC,yBAAA;AvCg7DD;AuCp7DC;EAEC,yBAAA;AvCs7DF;;AuCj7DA;EAMC,yBAAA;AvC+6DD;AuCn7DC;EAEC,yBAAA;AvCq7DF;;AuCh7DA;EAMC,yBAAA;AvC86DD;AuCl7DC;EAEC,yBAAA;AvCo7DF;;AuC/6DA;EAMC,yBAAA;AvC66DD;AuCj7DC;EAEC,yBAAA;AvCm7DF;;AuC96DA;EAMC,yBAAA;AvC46DD;AuCh7DC;EAEC,yBAAA;AvCk7DF;;AuC76DA;EAMC,yBAAA;AvC26DD;AuC/6DC;EAEC,yBAAA;AvCi7DF;;AuC56DA;EAMC,yBAAA;AvC06DD;AuC96DC;EAEC,yBAAA;AvCg7DF;;AuC36DA;EAMC,yBAAA;AvCy6DD;AuC76DC;EAEC,yBAAA;AvC+6DF;;AuC16DA;EAMC,sBAAA;AvCw6DD;AuC56DC;EAEC,sBAAA;AvC86DF;;AuCv6DC;EAGG,WAAA;AvCw6DJ;;AuC36DC;EAGG,WAAA;AvCw6DJ;;AuC36DC;EAGG,WAAA;AvCw6DJ;AuCr6DE;EAMC;AvCm6DH;AuCz6DE;EAMC;AvCm6DH;AuCz6DE;EAMC;AvCm6DH;AuC/5DC;EAOG,cAAA;AvC85DJ;AuCr6DC;EAOG,cAAA;AvC85DJ;AuCr6DC;EAOG,cAAA;AvC85DJ;AuCr6DC;EAOG,cAAA;AvC85DJ;AuCr6DC;EAOG,cAAA;AvC85DJ;AuCr6DC;EAOG,cAAA;AvC85DJ;AuCr6DC;EAOG,cAAA;AvC85DJ;AuC35DE;EAMC;AvCy5DH;AuC/5DE;EAMC;AvCy5DH;AuC/5DE;EAMC;AvCy5DH;AuC/5DE;EAMC;AvCy5DH;AuC/5DE;EAMC;AvCy5DH;AuC/5DE;EAMC;AvCy5DH;AuC/5DE;EAMC;AvCy5DH;;AuCn5DA;EACC,qDAAA;AvCy5DD;;AuCt5DA;EACC,qDAAA;AvCy5DD;;AuCt5DA;EACC,qDAAA;AvCy5DD;;AuCt5DA;EACC,qDAAA;AvCy5DD;;AuCt5DA;EACC,qDAAA;AvCy5DD;;AuCt5DA;EACC,qDAAA;AvCy5DD;;AuCt5DA;EACC,qDAAA;AvCy5DD;;AuCt5DA;EACC,qDAAA;AvCy5DD","file":"ie-editor.css"}
\ No newline at end of file
diff --git a/src/wp-content/themes/twentytwentyone/assets/css/ie.css b/src/wp-content/themes/twentytwentyone/assets/css/ie.css
index 02af1e03c8..d2a042d4cf 100644
--- a/src/wp-content/themes/twentytwentyone/assets/css/ie.css
+++ b/src/wp-content/themes/twentytwentyone/assets/css/ie.css
@@ -7,9 +7,9 @@ Author: the WordPress team
 Author URI: https://wordpress.org/
 Description: Twenty Twenty-One is a blank canvas for your ideas and it makes the block editor your best brush. With new block patterns, which allow you to create a beautiful layout in a matter of seconds, this theme’s soft colors and eye-catching — yet timeless — design will let your work shine. Take it for a spin! See how Twenty Twenty-One elevates your portfolio, business website, or personal blog.
 Requires at least: 5.3
-Tested up to: 5.8
+Tested up to: 5.9
 Requires PHP: 5.6
-Version: 1.4
+Version: 1.5
 License: GNU General Public License v2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
 Text Domain: twentytwentyone
@@ -808,13 +808,7 @@ template {
 
 @media only screen and (min-width: 482px) {
 
-	.alignfull {
-		max-width: 100%;
-		width: auto;
-		margin-left: auto;
-		margin-right: auto;
-	}
-
+	.alignfull,
 	.full-max-width {
 		max-width: 100%;
 		width: auto;
@@ -959,27 +953,9 @@ template {
  * Top Level Wrappers (header, main, footer)
  * - Set vertical padding and horizontal margins
  */
-.site-header {
-	padding-top: 30px;
-	padding-bottom: 30px;
-	margin-left: auto;
-	margin-right: auto;
-}
-
-.site-main {
-	padding-top: 30px;
-	padding-bottom: 30px;
-	margin-left: auto;
-	margin-right: auto;
-}
-
-.widget-area {
-	padding-top: 30px;
-	padding-bottom: 30px;
-	margin-left: auto;
-	margin-right: auto;
-}
-
+.site-header,
+.site-main,
+.widget-area,
 .site-footer {
 	padding-top: 30px;
 	padding-bottom: 30px;
@@ -1031,34 +1007,10 @@ template {
  * Block & non-gutenberg content wrappers
  * - Set margins
  */
-.entry-header {
-	margin-top: 30px;
-	margin-right: auto;
-	margin-bottom: 30px;
-	margin-left: auto;
-}
-
-.post-thumbnail {
-	margin-top: 30px;
-	margin-right: auto;
-	margin-bottom: 30px;
-	margin-left: auto;
-}
-
-.entry-content {
-	margin-top: 30px;
-	margin-right: auto;
-	margin-bottom: 30px;
-	margin-left: auto;
-}
-
-.entry-footer {
-	margin-top: 30px;
-	margin-right: auto;
-	margin-bottom: 30px;
-	margin-left: auto;
-}
-
+.entry-header,
+.post-thumbnail,
+.entry-content,
+.entry-footer,
 .author-bio {
 	margin-top: 30px;
 	margin-right: auto;
@@ -1365,11 +1317,7 @@ blockquote p {
 	line-height: 1.7;
 }
 
-blockquote cite {
-	font-weight: normal;
-	letter-spacing: normal;
-}
-
+blockquote cite,
 blockquote footer {
 	font-weight: normal;
 	letter-spacing: normal;
@@ -1380,33 +1328,16 @@ blockquote.alignright {
 	padding-left: inherit;
 }
 
-blockquote.alignleft p {
-	font-size: 1.125rem;
-	max-width: inherit;
-	width: inherit;
-}
-
+blockquote.alignleft p,
 blockquote.alignright p {
 	font-size: 1.125rem;
 	max-width: inherit;
 	width: inherit;
 }
 
-blockquote.alignleft cite {
-	font-size: 1rem;
-	letter-spacing: normal;
-}
-
-blockquote.alignleft footer {
-	font-size: 1rem;
-	letter-spacing: normal;
-}
-
-blockquote.alignright cite {
-	font-size: 1rem;
-	letter-spacing: normal;
-}
-
+blockquote.alignleft cite,
+blockquote.alignleft footer,
+blockquote.alignright cite,
 blockquote.alignright footer {
 	font-size: 1rem;
 	letter-spacing: normal;
@@ -1424,18 +1355,8 @@ blockquote:before {
 	left: -12px;
 }
 
-blockquote .wp-block-quote__citation {
-	color: #28303d;
-	font-size: 1rem;
-	font-style: normal;
-}
-
-blockquote cite {
-	color: #28303d;
-	font-size: 1rem;
-	font-style: normal;
-}
-
+blockquote .wp-block-quote__citation,
+blockquote cite,
 blockquote footer {
 	color: #28303d;
 	font-size: 1rem;
@@ -2084,16 +2005,14 @@ fieldset input[type=checkbox] + label {
 
 img {
 	height: auto;
-	max-width: 100%;
 	vertical-align: middle;
 }
 
 /* Classic editor images */
-.entry-content img {
-	max-width: 100%;
-}
 
 /* Make sure embeds and iframes fit their containers. */
+img,
+.entry-content img,
 embed,
 iframe,
 object,
@@ -2102,33 +2021,9 @@ video {
 }
 
 /* Media captions */
-figcaption {
-	color: currentColor;
-	font-size: 1rem;
-	line-height: 1.7;
-	margin-top: 10px;
-	margin-bottom: 20px;
-	text-align: center;
-}
-
-.wp-caption {
-	color: currentColor;
-	font-size: 1rem;
-	line-height: 1.7;
-	margin-top: 10px;
-	margin-bottom: 20px;
-	text-align: center;
-}
-
-.wp-caption-text {
-	color: currentColor;
-	font-size: 1rem;
-	line-height: 1.7;
-	margin-top: 10px;
-	margin-bottom: 20px;
-	text-align: center;
-}
-
+figcaption,
+.wp-caption,
+.wp-caption-text,
 .wp-block-embed figcaption {
 	color: currentColor;
 	font-size: 1rem;
@@ -2242,10 +2137,7 @@ a:hover {
 	outline: 2px dotted #28303d;
 }
 
-.has-background .has-link-color a {
-	color: #28303d;
-}
-
+.has-background .has-link-color a,
 .has-background.has-link-color a {
 	color: #28303d;
 }
@@ -2259,18 +2151,7 @@ a:hover {
 /**
  * Button
  */
-.site .button {
-	border: 3px solid transparent;
-	border-radius: 0;
-	cursor: pointer;
-	font-weight: 500;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-size: 1.25rem;
-	line-height: 1.5;
-	padding: 15px 30px;
-	text-decoration: none;
-}
-
+.site .button,
 button {
 	border: 3px solid transparent;
 	border-radius: 0;
@@ -2307,30 +2188,8 @@ input[type=reset] {
 	text-decoration: none;
 }
 
-.wp-block-search .wp-block-search__button {
-	border: 3px solid transparent;
-	border-radius: 0;
-	cursor: pointer;
-	font-weight: 500;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-size: 1.25rem;
-	line-height: 1.5;
-	padding: 15px 30px;
-	text-decoration: none;
-}
-
-.wp-block-button .wp-block-button__link {
-	border: 3px solid transparent;
-	border-radius: 0;
-	cursor: pointer;
-	font-weight: 500;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-size: 1.25rem;
-	line-height: 1.5;
-	padding: 15px 30px;
-	text-decoration: none;
-}
-
+.wp-block-search .wp-block-search__button,
+.wp-block-button .wp-block-button__link,
 .wp-block-file a.wp-block-file__button {
 	border: 3px solid transparent;
 	border-radius: 0;
@@ -2819,21 +2678,7 @@ input[type=reset]:disabled {
 	padding-right: 20px;
 }
 
-.wp-block-cover {
-	background-color: #000;
-	min-height: 450px;
-	margin-top: inherit;
-	margin-bottom: inherit;
-
-	/* default & custom background-color */
-
-	/* Treating H2 separately to account for legacy /core styles */
-
-	/* Block Styles */
-
-	/* The background color class is used just for the overlay, and does not need to be applied to the inner container. */
-}
-
+.wp-block-cover,
 .wp-block-cover-image {
 	background-color: #000;
 	min-height: 450px;
@@ -2860,36 +2705,11 @@ input[type=reset]:disabled {
 	margin-bottom: 0;
 }
 
-.wp-block-cover .wp-block-cover__inner-container {
-	color: currentColor;
-	margin-top: 30px;
-	margin-bottom: 30px;
-}
-
-.wp-block-cover .wp-block-cover-image-text {
-	color: currentColor;
-	margin-top: 30px;
-	margin-bottom: 30px;
-}
-
-.wp-block-cover .wp-block-cover-text {
-	color: currentColor;
-	margin-top: 30px;
-	margin-bottom: 30px;
-}
-
-.wp-block-cover-image .wp-block-cover__inner-container {
-	color: currentColor;
-	margin-top: 30px;
-	margin-bottom: 30px;
-}
-
-.wp-block-cover-image .wp-block-cover-image-text {
-	color: currentColor;
-	margin-top: 30px;
-	margin-bottom: 30px;
-}
-
+.wp-block-cover .wp-block-cover__inner-container,
+.wp-block-cover .wp-block-cover-image-text,
+.wp-block-cover .wp-block-cover-text,
+.wp-block-cover-image .wp-block-cover__inner-container,
+.wp-block-cover-image .wp-block-cover-image-text,
 .wp-block-cover-image .wp-block-cover-text {
 	color: currentColor;
 	margin-top: 30px;
@@ -2905,26 +2725,11 @@ input[type=reset]:disabled {
 	color: currentColor;
 }
 
-.wp-block-cover .wp-block-cover__inner-container .has-link-color a {
-	color: #28303d;
-}
-
-.wp-block-cover .wp-block-cover-image-text .has-link-color a {
-	color: #28303d;
-}
-
-.wp-block-cover .wp-block-cover-text .has-link-color a {
-	color: #28303d;
-}
-
-.wp-block-cover-image .wp-block-cover__inner-container .has-link-color a {
-	color: #28303d;
-}
-
-.wp-block-cover-image .wp-block-cover-image-text .has-link-color a {
-	color: #28303d;
-}
-
+.wp-block-cover .wp-block-cover__inner-container .has-link-color a,
+.wp-block-cover .wp-block-cover-image-text .has-link-color a,
+.wp-block-cover .wp-block-cover-text .has-link-color a,
+.wp-block-cover-image .wp-block-cover__inner-container .has-link-color a,
+.wp-block-cover-image .wp-block-cover-image-text .has-link-color a,
 .wp-block-cover-image .wp-block-cover-text .has-link-color a {
 	color: #28303d;
 }
@@ -2998,10 +2803,7 @@ input[type=reset]:disabled {
 	text-align: right;
 }
 
-.wp-block-cover .wp-block-cover__inner-container {
-	width: calc(100% - 60px);
-}
-
+.wp-block-cover .wp-block-cover__inner-container,
 .wp-block-cover-image .wp-block-cover__inner-container {
 	width: calc(100% - 60px);
 }
@@ -3084,10 +2886,7 @@ input[type=reset]:disabled {
 	justify-content: center;
 }
 
-.wp-block-cover.is-style-twentytwentyone-border {
-	border: 3px solid #28303d;
-}
-
+.wp-block-cover.is-style-twentytwentyone-border,
 .wp-block-cover-image.is-style-twentytwentyone-border {
 	border: 3px solid #28303d;
 }
@@ -3111,30 +2910,19 @@ input[type=reset]:disabled {
 	margin: 0 auto;
 }
 
-.wp-block-gallery .blocks-gallery-image {
-	width: calc(50% - 10px);
-}
-
+.wp-block-gallery .blocks-gallery-image,
 .wp-block-gallery .blocks-gallery-item {
 	width: calc(50% - 10px);
 }
 
-.wp-block-gallery .blocks-gallery-image figcaption {
-	margin: 0;
-	color: #fff;
-	font-size: 1rem;
-}
-
+.wp-block-gallery .blocks-gallery-image figcaption,
 .wp-block-gallery .blocks-gallery-item figcaption {
 	margin: 0;
 	color: #fff;
 	font-size: 1rem;
 }
 
-.wp-block-gallery .blocks-gallery-image figcaption a {
-	color: #fff;
-}
-
+.wp-block-gallery .blocks-gallery-image figcaption a,
 .wp-block-gallery .blocks-gallery-item figcaption a {
 	color: #fff;
 }
@@ -3233,122 +3021,34 @@ input[type=reset]:disabled {
 	margin-left: -30px;
 }
 
-h1 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-.h1 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-h2 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-.h2 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-h3 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-.h3 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-h4 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-.h4 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-h5 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-.h5 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
-h6 {
-	clear: both;
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-weight: normal;
-}
-
+h1,
+.h1,
+h2,
+.h2,
+h3,
+.h3,
+h4,
+.h4,
+h5,
+.h5,
+h6,
 .h6 {
 	clear: both;
 	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
 	font-weight: normal;
 }
 
-h1 strong {
-	font-weight: 600;
-}
-
-.h1 strong {
-	font-weight: 600;
-}
-
-h2 strong {
-	font-weight: 600;
-}
-
-.h2 strong {
-	font-weight: 600;
-}
-
-h3 strong {
-	font-weight: 600;
-}
-
-.h3 strong {
-	font-weight: 600;
-}
-
-h4 strong {
-	font-weight: 600;
-}
-
-.h4 strong {
-	font-weight: 600;
-}
-
-h5 strong {
-	font-weight: 600;
-}
-
-.h5 strong {
-	font-weight: 600;
-}
-
-h6 strong {
-	font-weight: 600;
-}
-
+h1 strong,
+.h1 strong,
+h2 strong,
+.h2 strong,
+h3 strong,
+.h3 strong,
+h4 strong,
+.h4 strong,
+h5 strong,
+.h5 strong,
+h6 strong,
 .h6 strong {
 	font-weight: 600;
 }
@@ -3431,13 +3131,7 @@ h3 {
 	}
 }
 
-h4 {
-	font-size: 1.5rem;
-	font-weight: 600;
-	letter-spacing: normal;
-	line-height: 1.3;
-}
-
+h4,
 .h4 {
 	font-size: 1.5rem;
 	font-weight: 600;
@@ -3445,13 +3139,7 @@ h4 {
 	line-height: 1.3;
 }
 
-h5 {
-	font-size: 1.125rem;
-	font-weight: 600;
-	letter-spacing: 0.05em;
-	line-height: 1.3;
-}
-
+h5,
 .h5 {
 	font-size: 1.125rem;
 	font-weight: 600;
@@ -3459,13 +3147,7 @@ h5 {
 	line-height: 1.3;
 }
 
-h6 {
-	font-size: 1rem;
-	font-weight: 600;
-	letter-spacing: 0.05em;
-	line-height: 1.3;
-}
-
+h6,
 .h6 {
 	font-size: 1rem;
 	font-weight: 600;
@@ -3509,10 +3191,7 @@ h6 {
 	margin-top: 0;
 }
 
-.wp-block-image.is-style-twentytwentyone-border img {
-	border: 3px solid #28303d;
-}
-
+.wp-block-image.is-style-twentytwentyone-border img,
 .wp-block-image.is-style-twentytwentyone-image-frame img {
 	border: 3px solid #28303d;
 }
@@ -3671,13 +3350,7 @@ h6 {
 	color: currentColor;
 }
 
-.wp-block-latest-posts .wp-block-latest-posts__post-excerpt {
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-size: 1.125rem;
-	line-height: 1.7;
-	margin-top: 20px;
-}
-
+.wp-block-latest-posts .wp-block-latest-posts__post-excerpt,
 .wp-block-latest-posts .wp-block-latest-posts__post-full-content {
 	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
 	font-size: 1.125rem;
@@ -3827,12 +3500,7 @@ figure.wp-caption a:focus img {
 	outline-offset: 2px;
 }
 
-ul {
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	margin: 0;
-	padding-left: 50px;
-}
-
+ul,
 ol {
 	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
 	margin: 0;
@@ -3840,16 +3508,16 @@ ol {
 }
 
 ul.aligncenter,
-ol.aligncenter {
+ol.aligncenter,
+ul.alignright,
+ol.alignright {
 	list-style-position: inside;
 	padding: 0;
 }
 
 ul.alignright,
 ol.alignright {
-	list-style-position: inside;
 	text-align: right;
-	padding: 0;
 }
 
 ul {
@@ -4110,22 +3778,8 @@ pre.wp-block-preformatted {
 	color: currentColor;
 }
 
-.wp-block-pullquote .wp-block-pullquote__citation {
-	color: currentColor;
-	display: block;
-	font-size: 1rem;
-	font-style: normal;
-	text-transform: none;
-}
-
-.wp-block-pullquote cite {
-	color: currentColor;
-	display: block;
-	font-size: 1rem;
-	font-style: normal;
-	text-transform: none;
-}
-
+.wp-block-pullquote .wp-block-pullquote__citation,
+.wp-block-pullquote cite,
 .wp-block-pullquote footer {
 	color: currentColor;
 	display: block;
@@ -4222,10 +3876,7 @@ pre.wp-block-preformatted {
 	color: currentColor;
 }
 
-.wp-block-pullquote.is-style-solid-color.alignleft {
-	padding: 20px;
-}
-
+.wp-block-pullquote.is-style-solid-color.alignleft,
 .wp-block-pullquote.is-style-solid-color.alignright {
 	padding: 20px;
 }
@@ -4301,15 +3952,7 @@ pre.wp-block-preformatted {
 	display: none;
 }
 
-.wp-block-quote.is-large {
-	padding-left: 0;
-	padding-right: 0;
-
-	/* Resetting margins to match _block-container.scss */
-	margin-top: 30px;
-	margin-bottom: 30px;
-}
-
+.wp-block-quote.is-large,
 .wp-block-quote.is-style-large {
 	padding-left: 0;
 	padding-right: 0;
@@ -4400,41 +4043,18 @@ pre.wp-block-preformatted {
 	}
 }
 
-.wp-block-quote.is-large .wp-block-quote__citation {
-	color: #28303d;
-	font-size: 1.125rem;
-}
-
-.wp-block-quote.is-large cite {
-	color: #28303d;
-	font-size: 1.125rem;
-}
-
-.wp-block-quote.is-large footer {
-	color: #28303d;
-	font-size: 1.125rem;
-}
-
-.wp-block-quote.is-style-large .wp-block-quote__citation {
-	color: #28303d;
-	font-size: 1.125rem;
-}
-
-.wp-block-quote.is-style-large cite {
-	color: #28303d;
-	font-size: 1.125rem;
-}
-
+.wp-block-quote.is-large .wp-block-quote__citation,
+.wp-block-quote.is-large cite,
+.wp-block-quote.is-large footer,
+.wp-block-quote.is-style-large .wp-block-quote__citation,
+.wp-block-quote.is-style-large cite,
 .wp-block-quote.is-style-large footer {
 	color: #28303d;
 	font-size: 1.125rem;
 }
 @media only screen and (max-width: 481px) {
 
-	.wp-block-quote.is-large {
-		padding-left: 25px;
-	}
-
+	.wp-block-quote.is-large,
 	.wp-block-quote.is-style-large {
 		padding-left: 25px;
 	}
@@ -4444,11 +4064,7 @@ pre.wp-block-preformatted {
 		left: 0;
 	}
 
-	.wp-block-quote.is-large.has-text-align-right {
-		padding-left: 0;
-		padding-right: 25px;
-	}
-
+	.wp-block-quote.is-large.has-text-align-right,
 	.wp-block-quote.is-style-large.has-text-align-right {
 		padding-left: 0;
 		padding-right: 25px;
@@ -4464,13 +4080,13 @@ pre.wp-block-preformatted {
 		padding-left: 0;
 		padding-right: 0;
 	}
-}
-@media only screen and (max-width: 481px) {
 
 	.wp-block-quote.has-text-align-right {
 		padding-left: 0;
 		padding-right: 13px;
 	}
+}
+@media only screen and (max-width: 481px) {
 
 	.wp-block-quote.has-text-align-right:before {
 		right: 0;
@@ -4564,18 +4180,12 @@ pre.wp-block-preformatted {
 	line-height: 1.7;
 }
 
-[class*=inner-container] .wp-block-rss .wp-block-rss__item-publish-date,
-.has-background .wp-block-rss .wp-block-rss__item-publish-date {
-	color: currentColor;
-}
-
-.wp-block-rss .wp-block-rss__item-excerpt {
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-	font-size: 1.125rem;
-	line-height: 1.7;
-	margin-top: 20px;
+[class*=inner-container] .wp-block-rss .wp-block-rss__item-publish-date,
+.has-background .wp-block-rss .wp-block-rss__item-publish-date {
+	color: currentColor;
 }
 
+.wp-block-rss .wp-block-rss__item-excerpt,
 .wp-block-rss .wp-block-rss__item-full-content {
 	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
 	font-size: 1.125rem;
@@ -4724,14 +4334,17 @@ pre.wp-block-preformatted {
 
 hr {
 	border-style: none;
-	border-bottom: 1px solid #28303d;
 	clear: both;
 	margin-left: auto;
 	margin-right: auto;
 }
 
+hr,
 hr.wp-block-separator {
 	border-bottom: 1px solid #28303d;
+}
+
+hr.wp-block-separator {
 	opacity: 1;
 
 	/**
@@ -4848,88 +4461,39 @@ table tfoot,
 	text-align: center;
 }
 
-table th {
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-}
-
+table th,
 .wp-block-table th {
 	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
 }
 
-table td {
-	padding: 10px;
-	border: 1px solid;
-}
-
-table th {
-	padding: 10px;
-	border: 1px solid;
-}
-
-.wp-block-table td {
-	padding: 10px;
-	border: 1px solid;
-}
-
+table td,
+table th,
+.wp-block-table td,
 .wp-block-table th {
 	padding: 10px;
 	border: 1px solid;
 }
 
-table figcaption {
-	color: #28303d;
-	font-size: 1rem;
-}
-
+table figcaption,
 .wp-block-table figcaption {
 	color: #28303d;
 	font-size: 1rem;
 }
 
-table.is-style-regular .has-background {
-	color: #28303d;
-}
-
-table.is-style-stripes .has-background {
-	color: #28303d;
-}
-
-table.is-style-stripes .has-background thead tr {
-	color: #28303d;
-}
-
-table.is-style-stripes .has-background tfoot tr {
-	color: #28303d;
-}
-
-table.is-style-stripes .has-background tbody tr {
-	color: #28303d;
-}
-
-.wp-block-table.is-style-regular .has-background {
-	color: #28303d;
-}
-
-.wp-block-table.is-style-stripes .has-background {
-	color: #28303d;
-}
-
-.wp-block-table.is-style-stripes .has-background thead tr {
-	color: #28303d;
-}
-
-.wp-block-table.is-style-stripes .has-background tfoot tr {
-	color: #28303d;
-}
-
+table.is-style-regular .has-background,
+table.is-style-stripes .has-background,
+table.is-style-stripes .has-background thead tr,
+table.is-style-stripes .has-background tfoot tr,
+table.is-style-stripes .has-background tbody tr,
+.wp-block-table.is-style-regular .has-background,
+.wp-block-table.is-style-stripes .has-background,
+.wp-block-table.is-style-stripes .has-background thead tr,
+.wp-block-table.is-style-stripes .has-background tfoot tr,
 .wp-block-table.is-style-stripes .has-background tbody tr {
 	color: #28303d;
 }
 
-table.is-style-stripes {
-	border-color: #f0f0f0;
-}
-
+table.is-style-stripes,
 .wp-block-table.is-style-stripes {
 	border-color: #f0f0f0;
 }
@@ -5304,13 +4868,11 @@ table.wp-calendar-table caption {
 /**
  * .alignwide
  */
-.alignwide {
-	clear: both;
-}
 
 /**
  * .alignfull
  */
+.alignwide,
 .alignfull {
 	clear: both;
 }
@@ -5573,6 +5135,10 @@ table.wp-calendar-table caption {
 	font-size: 1.5rem;
 }
 
+.site-footer > .site-info .privacy-policy {
+	margin-top: 15px;
+}
+
 .site-footer > .site-info .powered-by {
 	margin-top: 15px;
 }
@@ -5583,10 +5149,19 @@ table.wp-calendar-table caption {
 		align-items: center;
 	}
 
+	.site-footer > .site-info .site-name {
+		margin-right: 15px;
+	}
+
+	.site-footer > .site-info .privacy-policy,
 	.site-footer > .site-info .powered-by {
 		margin-top: initial;
 		margin-left: auto;
 	}
+
+	.site-footer > .site-info .privacy-policy + .powered-by {
+		margin-left: 15px;
+	}
 }
 
 .site-footer > .site-info a {
@@ -5710,10 +5285,7 @@ h1.entry-title {
 /**
  * Entry Content
  */
-.entry-content {
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-}
-
+.entry-content,
 .entry-summary {
 	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
 }
@@ -5898,10 +5470,7 @@ body:not(.single) .site-main > article:last-of-type .entry-footer {
 	}
 }
 
-h1.page-title {
-	font-weight: 300;
-}
-
+h1.page-title,
 h2.page-title {
 	font-weight: 300;
 }
@@ -5915,74 +5484,26 @@ h1.page-title {
 	padding-bottom: 60px;
 }
 
-.archive .content-area .format-aside .entry-content {
-	font-size: 1.5rem;
-}
-
-.archive .content-area .format-status .entry-content {
-	font-size: 1.5rem;
-}
-
-.archive .content-area .format-link .entry-content {
-	font-size: 1.5rem;
-}
-
-.search .content-area .format-aside .entry-content {
-	font-size: 1.5rem;
-}
-
-.search .content-area .format-status .entry-content {
-	font-size: 1.5rem;
-}
-
-.search .content-area .format-link .entry-content {
-	font-size: 1.5rem;
-}
-
-.blog .content-area .format-aside .entry-content {
-	font-size: 1.5rem;
-}
-
-.blog .content-area .format-status .entry-content {
-	font-size: 1.5rem;
-}
-
+.archive .content-area .format-aside .entry-content,
+.archive .content-area .format-status .entry-content,
+.archive .content-area .format-link .entry-content,
+.search .content-area .format-aside .entry-content,
+.search .content-area .format-status .entry-content,
+.search .content-area .format-link .entry-content,
+.blog .content-area .format-aside .entry-content,
+.blog .content-area .format-status .entry-content,
 .blog .content-area .format-link .entry-content {
 	font-size: 1.5rem;
 }
 
-.archive .format-image .entry-content {
-	margin-top: 60px;
-}
-
-.archive .format-gallery .entry-content {
-	margin-top: 60px;
-}
-
-.archive .format-video .entry-content {
-	margin-top: 60px;
-}
-
-.search .format-image .entry-content {
-	margin-top: 60px;
-}
-
-.search .format-gallery .entry-content {
-	margin-top: 60px;
-}
-
-.search .format-video .entry-content {
-	margin-top: 60px;
-}
-
-.blog .format-image .entry-content {
-	margin-top: 60px;
-}
-
-.blog .format-gallery .entry-content {
-	margin-top: 60px;
-}
-
+.archive .format-image .entry-content,
+.archive .format-gallery .entry-content,
+.archive .format-video .entry-content,
+.search .format-image .entry-content,
+.search .format-gallery .entry-content,
+.search .format-video .entry-content,
+.blog .format-image .entry-content,
+.blog .format-gallery .entry-content,
 .blog .format-video .entry-content {
 	margin-top: 60px;
 }
@@ -5996,14 +5517,8 @@ h1.page-title {
 	display: block;
 }
 
-.archive.logged-in .entry-footer .posted-on {
-	margin-right: 10px;
-}
-
-.search.logged-in .entry-footer .posted-on {
-	margin-right: 10px;
-}
-
+.archive.logged-in .entry-footer .posted-on,
+.search.logged-in .entry-footer .posted-on,
 .blog.logged-in .entry-footer .posted-on {
 	margin-right: 10px;
 }
@@ -6129,10 +5644,7 @@ h1.page-title {
 
 @media only screen and (min-width: 482px) {
 
-	.comment-list .depth-2 {
-		padding-left: 100px;
-	}
-
+	.comment-list .depth-2,
 	.comment-list .depth-3 {
 		padding-left: 100px;
 	}
@@ -6195,10 +5707,7 @@ h1.page-title {
 	display: none;
 }
 
-.pingback .url {
-	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
-}
-
+.pingback .url,
 .trackback .url {
 	font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
 }
@@ -6221,11 +5730,7 @@ h1.page-title {
 	word-wrap: break-word;
 }
 
-.pingback .comment-body {
-	margin-top: 30px;
-	margin-bottom: 30px;
-}
-
+.pingback .comment-body,
 .trackback .comment-body {
 	margin-top: 30px;
 	margin-bottom: 30px;
@@ -6979,12 +6484,12 @@ h1.page-title {
 }
 
 /* Next/Previous navigation */
-.navigation {
+.navigation,
+.navigation a {
 	color: #28303d;
 }
 
 .navigation a {
-	color: #28303d;
 	text-decoration: none;
 }
 
@@ -7024,13 +6529,7 @@ h1.page-title {
 		flex-wrap: wrap;
 	}
 
-	.navigation .nav-links .nav-next {
-		flex: 0 1 auto;
-		margin-bottom: inherit;
-		margin-top: inherit;
-		max-width: calc(50% - 10px);
-	}
-
+	.navigation .nav-links .nav-next,
 	.navigation .nav-links .nav-previous {
 		flex: 0 1 auto;
 		margin-bottom: inherit;
@@ -7050,21 +6549,13 @@ h1.page-title {
 	position: relative;
 }
 
-.navigation .nav-previous .svg-icon {
-	top: -2px;
-	margin-right: 5px;
-}
-
+.navigation .nav-previous .svg-icon,
 .navigation .prev .svg-icon {
 	top: -2px;
 	margin-right: 5px;
 }
 
-.navigation .nav-next .svg-icon {
-	top: -1px;
-	margin-left: 5px;
-}
-
+.navigation .nav-next .svg-icon,
 .navigation .next .svg-icon {
 	top: -1px;
 	margin-left: 5px;
@@ -7105,11 +6596,7 @@ h1.page-title {
 	}
 }
 
-.post-navigation .nav-next {
-	margin-top: 30px;
-	margin-bottom: 30px;
-}
-
+.post-navigation .nav-next,
 .post-navigation .nav-previous {
 	margin-top: 30px;
 	margin-bottom: 30px;
@@ -7125,12 +6612,7 @@ h1.page-title {
 	margin-bottom: 0;
 }
 
-.pagination {
-	border-top: 3px solid #28303d;
-	padding-top: 30px;
-	margin: 30px auto;
-}
-
+.pagination,
 .comments-pagination {
 	border-top: 3px solid #28303d;
 	padding-top: 30px;
@@ -7138,19 +6620,13 @@ h1.page-title {
 }
 @media only screen and (min-width: 822px) {
 
-	.pagination {
-		margin: 30px auto;
-	}
-
+	.pagination,
 	.comments-pagination {
 		margin: 30px auto;
 	}
 }
 
-.pagination .nav-links {
-	margin-top: -30px;
-}
-
+.pagination .nav-links,
 .comments-pagination .nav-links {
 	margin-top: -30px;
 }
@@ -7332,51 +6808,6 @@ h1.page-title {
 	}
 }
 
-.widget-area ul {
-	list-style-type: none;
-	padding: 0;
-}
-
-.widget-area ul li {
-	line-height: 1.9;
-}
-
-.widget-area ul.sub-menu {
-	margin-left: 13px;
-}
-
-.widget-area ul.children {
-	margin-left: 13px;
-}
-
-.widget-area ul .sub-menu-toggle {
-	display: none;
-}
-
-.widget-area a {
-	color: #28303d;
-	text-decoration: underline;
-	text-decoration-style: solid;
-	text-decoration-color: currentColor;
-}
-
-.widget-area a:link {
-	color: #28303d;
-}
-
-.widget-area a:visited {
-	color: #28303d;
-}
-
-.widget-area a:active {
-	color: #28303d;
-}
-
-.widget-area a:hover {
-	color: #28303d;
-	text-decoration-style: dotted;
-}
-
 .widget-area .wp-block-social-links.alignright {
 	margin-top: 30px;
 	justify-content: flex-end;
@@ -7392,58 +6823,71 @@ h1.page-title {
 	clear: both;
 }
 
-.widget h1 {
+.widget h1,
+.widget h2,
+.widget h3,
+.widget h4,
+.widget h5,
+.widget h6 {
 	font-weight: 700;
 	line-height: 1.4;
 }
 
+.widget h1 {
+	font-size: 1.25rem;
+}
+
 .widget h2 {
-	font-weight: 700;
-	line-height: 1.4;
+	font-size: 1.125rem;
 }
 
-.widget h3 {
-	font-weight: 700;
-	line-height: 1.4;
+.widget h3,
+.widget h4,
+.widget h5,
+.widget h6 {
+	font-size: 1rem;
 }
 
-.widget h4 {
-	font-weight: 700;
-	line-height: 1.4;
+.widget ul {
+	list-style-type: none;
+	padding: 0;
 }
 
-.widget h5 {
-	font-weight: 700;
-	line-height: 1.4;
+.widget ul li {
+	line-height: 1.9;
 }
 
-.widget h6 {
-	font-weight: 700;
-	line-height: 1.4;
+.widget ul.sub-menu,
+.widget ul.children {
+	margin-left: 13px;
 }
 
-.widget h1 {
-	font-size: 1.25rem;
+.widget ul .sub-menu-toggle {
+	display: none;
 }
 
-.widget h2 {
-	font-size: 1.125rem;
+.widget a {
+	color: #28303d;
+	text-decoration: underline;
+	text-decoration-style: solid;
+	text-decoration-color: currentColor;
 }
 
-.widget h3 {
-	font-size: 1rem;
+.widget a:link {
+	color: #28303d;
 }
 
-.widget h4 {
-	font-size: 1rem;
+.widget a:visited {
+	color: #28303d;
 }
 
-.widget h5 {
-	font-size: 1rem;
+.widget a:active {
+	color: #28303d;
 }
 
-.widget h6 {
-	font-size: 1rem;
+.widget a:hover {
+	color: #28303d;
+	text-decoration-style: dotted;
 }
 
 .search-form {
@@ -7841,14 +7285,8 @@ h1.page-title {
 	background: linear-gradient(160deg, #e4d1d1, #d1d1e4);
 }
 
-header * {
-	max-width: unset;
-}
-
-main * {
-	max-width: unset;
-}
-
+header *,
+main *,
 footer * {
 	max-width: unset;
 }
diff --git a/src/wp-content/themes/twentytwentyone/assets/css/ie.css.map b/src/wp-content/themes/twentytwentyone/assets/css/ie.css.map
index 3ff269338b..6b3e130734 100644
--- a/src/wp-content/themes/twentytwentyone/assets/css/ie.css.map
+++ b/src/wp-content/themes/twentytwentyone/assets/css/ie.css.map
@@ -1 +1 @@
-{"version":3,"sources":["../../style.css","../../assets/sass/01-settings/file-header.scss","../../assets/sass/style.scss","../../assets/sass/01-settings/global.scss","../../assets/sass/03-generic/normalize.scss","../../assets/sass/03-generic/breakpoints.scss","../../assets/sass/03-generic/vertical-margins.scss","../../assets/sass/03-generic/reset.scss","../../assets/sass/03-generic/clearings.scss","../../assets/sass/04-elements/blockquote.scss","../../assets/sass/04-elements/forms.scss","../../assets/sass/04-elements/media.scss","../../assets/sass/04-elements/misc.scss","../../assets/sass/04-elements/links.scss","../../assets/sass/05-blocks/audio/_style.scss","../../assets/sass/05-blocks/button/_style.scss","../../assets/sass/02-tools/mixins.scss","../../assets/sass/05-blocks/code/_style.scss","../../assets/sass/05-blocks/columns/_style.scss","../../assets/sass/05-blocks/cover/_style.scss","../../assets/sass/05-blocks/file/_style.scss","../../assets/sass/05-blocks/gallery/_style.scss","../../assets/sass/05-blocks/group/_style.scss","../../assets/sass/05-blocks/heading/_style.scss","../../assets/sass/05-blocks/image/_style.scss","../../assets/sass/05-blocks/latest-comments/_style.scss","../../assets/sass/05-blocks/latest-posts/_style.scss","../../assets/sass/05-blocks/legacy/_style.scss","../../assets/sass/05-blocks/list/_style.scss","../../assets/sass/05-blocks/media-text/_style.scss","../../assets/sass/05-blocks/navigation/_style.scss","../../assets/sass/05-blocks/paragraph/_style.scss","../../assets/sass/05-blocks/preformatted/_style.scss","../../assets/sass/05-blocks/pullquote/_style.scss","../../assets/sass/05-blocks/query-loop/_style.scss","../../assets/sass/05-blocks/quote/_style.scss","../../assets/sass/05-blocks/rss/_style.scss","../../assets/sass/05-blocks/search/_style.scss","../../assets/sass/05-blocks/separator/_style.scss","../../assets/sass/05-blocks/social-icons/_style.scss","../../assets/sass/05-blocks/spacer/_style.scss","../../assets/sass/05-blocks/table/_style.scss","../../assets/sass/05-blocks/tag-clould/_style.scss","../../assets/sass/05-blocks/verse/_style.scss","../../assets/sass/05-blocks/video/_style.scss","../../assets/sass/05-blocks/utilities/_font-sizes.scss","../../assets/sass/05-blocks/utilities/_style.scss","../../assets/sass/06-components/header.scss","../../assets/sass/06-components/footer.scss","../../assets/sass/06-components/single.scss","../../assets/sass/06-components/posts-and-pages.scss","../../assets/sass/06-components/entry.scss","../../assets/sass/06-components/archives.scss","../../assets/sass/06-components/404.scss","../../assets/sass/06-components/search.scss","../../assets/sass/06-components/comments.scss","../../assets/sass/06-components/navigation.scss","../../assets/sass/06-components/footer-navigation.scss","../../assets/sass/06-components/pagination.scss","../../assets/sass/06-components/widgets.scss","../../assets/sass/07-utilities/a11y.scss","../../assets/sass/07-utilities/color-palette.scss","../../assets/sass/07-utilities/measure.scss","../../assets/sass/07-utilities/ie.scss"],"names":[],"mappings":"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DwrJD;A6D5rJC;EAEC,yBAAA;A7D8rJF;;A6DzrJA;EAMC,yBAAA;A7DurJD;A6D3rJC;EAEC,yBAAA;A7D6rJF;;A6DxrJA;EAMC,yBAAA;A7DsrJD;A6D1rJC;EAEC,yBAAA;A7D4rJF;;A6DvrJA;EAMC,yBAAA;A7DqrJD;A6DzrJC;EAEC,yBAAA;A7D2rJF;;A6DtrJA;EAMC,yBAAA;A7DorJD;A6DxrJC;EAEC,yBAAA;A7D0rJF;;A6DrrJA;EAMC,yBAAA;A7DmrJD;A6DvrJC;EAEC,yBAAA;A7DyrJF;;A6DprJA;EAMC,yBAAA;A7DkrJD;A6DtrJC;EAEC,yBAAA;A7DwrJF;;A6DnrJA;EAMC,yBAAA;A7DirJD;A6DrrJC;EAEC,yBAAA;A7DurJF;;A6DlrJA;EAMC,yBAAA;A7DgrJD;A6DprJC;EAEC,yBAAA;A7DsrJF;;A6DjrJA;EAMC,sBAAA;A7D+qJD;A6DnrJC;EAEC,sBAAA;A7DqrJF;;A6D9qJC;EAGG,WAAA;A7D+qJJ;;A6DlrJC;EAGG,WAAA;A7D+qJJ;;A6DlrJC;EAGG,WAAA;A7D+qJJ;A6D5qJE;EAMC;A7D0qJH;A6DhrJE;EAMC;A7D0qJH;A6DhrJE;EAMC;A7D0qJH;A6DtqJC;EAOG,cAAA;A7DqqJJ;A6D5qJC;EAOG,cAAA;A7DqqJJ;A6D5qJC;EAOG,cAAA;A7DqqJJ;A6D5qJC;EAOG,cAAA;A7DqqJJ;A6D5qJC;EAOG,cAAA;A7DqqJJ;A6D5qJC;EAOG,cAAA;A7DqqJJ;A6D5qJC;EAOG,cAAA;A7DqqJJ;A6DlqJE;EAMC;A7DgqJH;A6DtqJE;EAMC;A7DgqJH;A6DtqJE;EAMC;A7DgqJH;A6DtqJE;EAMC;A7DgqJH;A6DtqJE;EAMC;A7DgqJH;A6DtqJE;EAMC;A7DgqJH;A6DtqJE;EAMC;A7DgqJH;;A6D1pJA;EACC,qDAAA;A7DgqJD;;A6D7pJA;EACC,qDAAA;A7DgqJD;;A6D7pJA;EACC,qDAAA;A7DgqJD;;A6D7pJA;EACC,qDAAA;A7DgqJD;;A6D7pJA;EACC,qDAAA;A7DgqJD;;A6D7pJA;EACC,qDAAA;A7DgqJD;;A6D7pJA;EACC,qDAAA;A7DgqJD;;A6D7pJA;EACC,qDAAA;A7DgqJD;;A8Dh7JA;EAGC,gBAAA;A9Dm7JD;;A8Dt7JA;EAGC,gBAAA;A9Dm7JD;;A8Dt7JA;EAGC,gBAAA;A9Dm7JD;;A8Dh7JA;;;;;;;;;;;EAWC,eAAA;A9Dm7JD;;A+Dr8JC;EACC,WAAA;A/Dw8JF;A+Dt8JE;;;;;;;;;;;EAWC,WAAA;A/Dw8JH;A+Dr8JE;;;;EAIC,UAAA;A/Du8JH;A+Dp8JE;EACC,gBAAA;A/Ds8JH;AK78JE;E0DaE;;IAEC,sBAAA;E/Dm8JH;AACF;A+D/7JE;EACC,cAAA;A/Di8JH;A+D77JC;EACC,cAAA;A/D+7JF;A+D57JC;EACC,eAAA;A/D87JF","file":"ie.css"}
\ No newline at end of file
+{"version":3,"sources":["../../style.css","../../assets/sass/01-settings/file-header.scss","../../assets/sass/style.scss","../../assets/sass/01-settings/global.scss","../../assets/sass/03-generic/normalize.scss","../../assets/sass/03-generic/breakpoints.scss","../../assets/sass/03-generic/vertical-margins.scss","../../assets/sass/03-generic/reset.scss","../../assets/sass/03-generic/clearings.scss","../../assets/sass/04-elements/blockquote.scss","../../assets/sass/04-elements/forms.scss","../../assets/sass/04-elements/media.scss","../../assets/sass/04-elements/misc.scss","../../assets/sass/04-elements/links.scss","../../assets/sass/05-blocks/audio/_style.scss","../../assets/sass/05-blocks/button/_style.scss","../../assets/sass/02-tools/mixins.scss","../../assets/sass/05-blocks/code/_style.scss","../../assets/sass/05-blocks/columns/_style.scss","../../assets/sass/05-blocks/cover/_style.scss","../../assets/sass/05-blocks/file/_style.scss","../../assets/sass/05-blocks/gallery/_style.scss","../../assets/sass/05-blocks/group/_style.scss","../../assets/sass/05-blocks/heading/_style.scss","../../assets/sass/05-blocks/image/_style.scss","../../assets/sass/05-blocks/latest-comments/_style.scss","../../assets/sass/05-blocks/latest-posts/_style.scss","../../assets/sass/05-blocks/legacy/_style.scss","../../assets/sass/05-blocks/list/_style.scss","../../assets/sass/05-blocks/media-text/_style.scss","../../assets/sass/05-blocks/navigation/_style.scss","../../assets/sass/05-blocks/paragraph/_style.scss","../../assets/sass/05-blocks/preformatted/_style.scss","../../assets/sass/05-blocks/pullquote/_style.scss","../../assets/sass/05-blocks/query-loop/_style.scss","../../assets/sass/05-blocks/quote/_style.scss","../../assets/sass/05-blocks/rss/_style.scss","../../assets/sass/05-blocks/search/_style.scss","../../assets/sass/05-blocks/separator/_style.scss","../../assets/sass/05-blocks/social-icons/_style.scss","../../assets/sass/05-blocks/spacer/_style.scss","../../assets/sass/05-blocks/table/_style.scss","../../assets/sass/05-blocks/tag-clould/_style.scss","../../assets/sass/05-blocks/verse/_style.scss","../../assets/sass/05-blocks/video/_style.scss","../../assets/sass/05-blocks/utilities/_font-sizes.scss","../../assets/sass/05-blocks/utilities/_style.scss","../../assets/sass/06-components/header.scss","../../assets/sass/06-components/footer.scss","../../assets/sass/06-components/single.scss","../../assets/sass/06-components/posts-and-pages.scss","../../assets/sass/06-components/entry.scss","../../assets/sass/06-components/archives.scss","../../assets/sass/06-components/404.scss","../../assets/sass/06-components/search.scss","../../assets/sass/06-components/comments.scss","../../assets/sass/06-components/navigation.scss","../../assets/sass/06-components/footer-navigation.scss","../../assets/sass/06-components/pagination.scss","../../assets/sass/06-components/widgets.scss","../../assets/sass/07-utilities/a11y.scss","../../assets/sass/07-utilities/color-palette.scss","../../assets/sass/07-utilities/measure.scss","../../assets/sass/07-utilities/ie.scss"],"names":[],"mappings":"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A;IACA,kCAAA;E5DsqJA;AACF;A6DltJA;EAMC,WAAA;A7D+sJD;A6DntJC;EAEC,WAAA;A7DqtJF;;A6DhtJA;EAMC,cAAA;A7D8sJD;A6DltJC;EAEC,cAAA;A7DotJF;;A6D/sJA;EAMC,cAAA;A7D6sJD;A6DjtJC;EAEC,cAAA;A7DmtJF;;A6D9sJA;EAMC,cAAA;A7D4sJD;A6DhtJC;EAEC,cAAA;A7DktJF;;A6D7sJA;EAMC,cAAA;A7D2sJD;A6D/sJC;EAEC,cAAA;A7DitJF;;A6D5sJA;EAMC,cAAA;A7D0sJD;A6D9sJC;EAEC,cAAA;A7DgtJF;;A6D3sJA;EAMC,cAAA;A7DysJD;A6D7sJC;EAEC,cAAA;A7D+sJF;;A6D1sJA;EAMC,cAAA;A7DwsJD;A6D5sJC;EAEC,cAAA;A7D8sJF;;A6DzsJA;EAMC,cAAA;A7DusJD;A6D3sJC;EAEC,cAAA;A7D6sJF;;A6DxsJA;EAMC,WAAA;A7DssJD;A6D1sJC;EAEC,WAAA;A7D4sJF;;A6DpsJC;;;;;;;;EAQC,mBAAA;A7DusJF;;A6DnsJA;EAMC,sBAAA;A7DisJD;A6DrsJC;EAEC,sBAAA;A7DusJF;;A6DlsJA;EAMC,yBAAA;A7DgsJD;A6DpsJC;EAEC,yBAAA;A7DssJF;;A6DjsJA;EAMC,yBAAA;A7D+rJD;A6DnsJC;EAEC,yBAAA;A7DqsJF;;A6DhsJA;EAMC,yBAAA;A7D8rJD;A6DlsJC;EAEC,yBAAA;A7DosJF;;A6D/rJA;EAMC,yBAAA;A7D6rJD;A6DjsJC;EAEC,yBAAA;A7DmsJF;;A6D9rJA;EAMC,yBAAA;A7D4rJD;A6DhsJC;EAEC,yBAAA;A7DksJF;;A6D7rJA;EAMC,yBAAA;A7D2rJD;A6D/rJC;EAEC,yBAAA;A7DisJF;;A6D5rJA;EAMC,yBAAA;A7D0rJD;A6D9rJC;EAEC,yBAAA;A7DgsJF;;A6D3rJA;EAMC,yBAAA;A7DyrJD;A6D7rJC;EAEC,yBAAA;A7D+rJF;;A6D1rJA;EAMC,yBAAA;A7DwrJD;A6D5rJC;EAEC,yBAAA;A7D8rJF;;A6DzrJA;EAMC,sBAAA;A7DurJD;A6D3rJC;EAEC,sBAAA;A7D6rJF;;A6DtrJC;EAGG,WAAA;A7DurJJ;;A6D1rJC;EAGG,WAAA;A7DurJJ;;A6D1rJC;EAGG,WAAA;A7DurJJ;A6DprJE;EAMC;A7DkrJH;A6DxrJE;EAMC;A7DkrJH;A6DxrJE;EAMC;A7DkrJH;A6D9qJC;EAOG,cAAA;A7D6qJJ;A6DprJC;EAOG,cAAA;A7D6qJJ;A6DprJC;EAOG,cAAA;A7D6qJJ;A6DprJC;EAOG,cAAA;A7D6qJJ;A6DprJC;EAOG,cAAA;A7D6qJJ;A6DprJC;EAOG,cAAA;A7D6qJJ;A6DprJC;EAOG,cAAA;A7D6qJJ;A6D1qJE;EAMC;A7DwqJH;A6D9qJE;EAMC;A7DwqJH;A6D9qJE;EAMC;A7DwqJH;A6D9qJE;EAMC;A7DwqJH;A6D9qJE;EAMC;A7DwqJH;A6D9qJE;EAMC;A7DwqJH;A6D9qJE;EAMC;A7DwqJH;;A6DlqJA;EACC,qDAAA;A7DwqJD;;A6DrqJA;EACC,qDAAA;A7DwqJD;;A6DrqJA;EACC,qDAAA;A7DwqJD;;A6DrqJA;EACC,qDAAA;A7DwqJD;;A6DrqJA;EACC,qDAAA;A7DwqJD;;A6DrqJA;EACC,qDAAA;A7DwqJD;;A6DrqJA;EACC,qDAAA;A7DwqJD;;A6DrqJA;EACC,qDAAA;A7DwqJD;;A8Dx7JA;EAGC,gBAAA;A9D27JD;;A8Dx7JA;;;;;;;;;;;EAWC,eAAA;A9D27JD;;A+D78JC;EACC,WAAA;A/Dg9JF;A+D98JE;;;;;;;;;;;EAWC,WAAA;A/Dg9JH;A+D78JE;;;;EAIC,UAAA;A/D+8JH;A+D58JE;EACC,gBAAA;A/D88JH;AKr9JE;E0DaE;;IAEC,sBAAA;E/D28JH;AACF;A+Dv8JE;EACC,cAAA;A/Dy8JH;A+Dr8JC;EACC,cAAA;A/Du8JF;A+Dp8JC;EACC,eAAA;A/Ds8JF","file":"ie.css"}
\ No newline at end of file
diff --git a/src/wp-content/themes/twentytwentyone/assets/css/style-dark-mode-rtl.css b/src/wp-content/themes/twentytwentyone/assets/css/style-dark-mode-rtl.css
index a5daf1bfd1..8037e922f9 100644
--- a/src/wp-content/themes/twentytwentyone/assets/css/style-dark-mode-rtl.css
+++ b/src/wp-content/themes/twentytwentyone/assets/css/style-dark-mode-rtl.css
@@ -82,7 +82,7 @@
 @media only screen and (max-width: 481px) {
 
 	body:not(.primary-navigation-open) #dark-mode-toggler.relative ~ nav {
-		top: calc(44px + 44px);
+		top: 88px;
 	}
 }
 @media only screen {
diff --git a/src/wp-content/themes/twentytwentyone/assets/css/style-dark-mode.css b/src/wp-content/themes/twentytwentyone/assets/css/style-dark-mode.css
index 679d1c6b4d..12290f0b0c 100644
--- a/src/wp-content/themes/twentytwentyone/assets/css/style-dark-mode.css
+++ b/src/wp-content/themes/twentytwentyone/assets/css/style-dark-mode.css
@@ -82,7 +82,7 @@
 @media only screen and (max-width: 481px) {
 
 	body:not(.primary-navigation-open) #dark-mode-toggler.relative ~ nav {
-		top: calc(44px + 44px);
+		top: 88px;
 	}
 }
 @media only screen {
diff --git a/src/wp-content/themes/twentytwentyone/assets/css/style-editor.css b/src/wp-content/themes/twentytwentyone/assets/css/style-editor.css
index 8a9413982b..d6019c45bb 100644
--- a/src/wp-content/themes/twentytwentyone/assets/css/style-editor.css
+++ b/src/wp-content/themes/twentytwentyone/assets/css/style-editor.css
@@ -981,8 +981,8 @@ a:hover {
 }
 
 .wp-block-group.is-style-twentytwentyone-border .wp-block-group__inner-container > [data-align=full] {
-	max-width: calc(var(--responsive--alignfull-width) + (2 * var(--global--spacing-vertical)));
-	width: calc(var(--responsive--alignfull-width) + (2 * var(--global--spacing-vertical)));
+	max-width: calc(var(--responsive--alignfull-width) + 2 * var(--global--spacing-vertical));
+	width: calc(var(--responsive--alignfull-width) + 2 * var(--global--spacing-vertical));
 	margin-left: calc(-1 * var(--global--spacing-vertical));
 }
 
@@ -1127,7 +1127,8 @@ h6,
 }
 
 /* Center image block by default in the editor */
-.wp-block-image > div {
+.wp-block-image,
+.wp-block-image > div:not(.components-placeholder) {
 	text-align: center;
 }
 
@@ -1262,23 +1263,23 @@ h6,
 @media screen and (min-width: 600px) {
 
 	.wp-block-latest-posts.is-style-twentytwentyone-latest-posts-dividers.is-grid.columns-2 li {
-		width: calc((100% / 2));
+		width: calc(100% / 2);
 	}
 
 	.wp-block-latest-posts.is-style-twentytwentyone-latest-posts-dividers.is-grid.columns-3 li {
-		width: calc((100% / 3));
+		width: calc(100% / 3);
 	}
 
 	.wp-block-latest-posts.is-style-twentytwentyone-latest-posts-dividers.is-grid.columns-4 li {
-		width: calc((100% / 4));
+		width: calc(100% / 4);
 	}
 
 	.wp-block-latest-posts.is-style-twentytwentyone-latest-posts-dividers.is-grid.columns-5 li {
-		width: calc((100% / 5));
+		width: calc(100% / 5);
 	}
 
 	.wp-block-latest-posts.is-style-twentytwentyone-latest-posts-dividers.is-grid.columns-6 li {
-		width: calc((100% / 6));
+		width: calc(100% / 6);
 	}
 }
 
diff --git a/src/wp-content/themes/twentytwentyone/assets/css/style-editor.css.map b/src/wp-content/themes/twentytwentyone/assets/css/style-editor.css.map
index adfdea746e..8006c92667 100644
--- a/src/wp-content/themes/twentytwentyone/assets/css/style-editor.css.map
+++ b/src/wp-content/themes/twentytwentyone/assets/css/style-editor.css.map
@@ -1 +1 @@
-{"version":3,"sourceRoot":"","sources":["../sass/style-editor.scss","../sass/01-settings/global.scss","../sass/03-generic/breakpoints.scss","../sass/04-elements/blockquote.scss","../sass/04-elements/media.scss","../sass/04-elements/forms-editor.scss","../sass/04-elements/links.scss","../sass/05-blocks/button/_editor.scss","../sass/02-tools/mixins.scss","../sass/05-blocks/code/_editor.scss","../sass/05-blocks/cover/_editor.scss","../sass/05-blocks/columns/_editor.scss","../sass/05-blocks/file/_editor.scss","../sass/05-blocks/gallery/_editor.scss","../sass/05-blocks/group/_editor.scss","../sass/05-blocks/heading/_editor.scss","../sass/05-blocks/html/_editor.scss","../sass/05-blocks/image/_editor.scss","../sass/05-blocks/latest-comments/_editor.scss","../sass/05-blocks/latest-posts/_editor.scss","../sass/05-blocks/legacy/_editor.scss","../sass/05-blocks/list/_editor.scss","../sass/05-blocks/media-text/_editor.scss","../sass/05-blocks/navigation/_editor.scss","../sass/05-blocks/paragraph/_editor.scss","../sass/05-blocks/preformatted/_editor.scss","../sass/05-blocks/pullquote/_editor.scss","../sass/05-blocks/query-loop/_editor.scss","../sass/05-blocks/quote/_editor.scss","../sass/05-blocks/rss/_editor.scss","../sass/05-blocks/search/_editor.scss","../sass/05-blocks/separator/_editor.scss","../sass/05-blocks/social-icons/_editor.scss","../sass/05-blocks/table/_editor.scss","../sass/05-blocks/tag-clould/_editor.scss","../sass/05-blocks/verse/_editor.scss","../sass/05-blocks/utilities/_font-sizes.scss","../sass/05-blocks/utilities/_editor.scss","../sass/06-components/editor.scss","../sass/07-utilities/color-palette.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;ACAA;AAKA;AAEC;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;AAEA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EAEA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;AAAyD;EACzD;AAAsD;EACtD;EACA;AAAwD;EACxD;AAAsD;AAEtD;EACA;EACA;EACA;EACA;AAEA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;AAEA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;AAEA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;AAEA;EACA;;;AAGD;EACC;;AAEA;EAHD;IAIE;;;;AAIF;EACC;IACC;IACA;IACA;IACA;IACA;;;ACtPF;AAAA;AAAA;AAIA;AAAA;AAAA;AA4EA;AAAA;AAAA;AAGA;EACC;EACA;EACA;EACA;EACA;EACA;;;AA/DC;EAoED;IACC;IACA;IACA;IACA;;;AApCA;EA0CD;IACC;IACA;;;AAIF;AAAA;AAAA;AAGA;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAhGC;EA2GD;IACC;IACA;IACA;IACA;;;ACzIF;EACC;EACA;EACA;;AAEA;EACC;EACA;;AAEA;EACC;;AAGD;EACC;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;;AAGD;AAAA;EAEC;EACA;EACA;EACA;;AAGD;EAGC;;AAEA;EACC;EACA;EACA;;AAGD;AAAA;AAAA;EAEC;EACA;;AAIF;EACC;;AAGD;EACC;EACA;EACA;EACA;EACA;;AAGD;AAAA;AAAA;EAGC;EACA;EACA;;ADlDA;ECpBF;IA0EE;;EAEA;IACC;;;;AC7EH;EACC;EACA;EACA;;;AAGD;AACA;EACC;;;AAGD;AACA;AAAA;AAAA;AAAA;EAIC;;;AAGD;AACA;AAAA;AAAA;AAAA;EAIC;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEC;;;AAIF;AACA;AAAA;AAAA;EAGC;EACA;EACA;EACA;;;AC5CD;AAAA;EAEC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACXD;AAAA;AAAA;AAAA;AAAA;AAKA;EACC;EACA;EACA;EACA;;;AAGD;EACC;EACA;;;AAGD;AAEC;EACA;EAEA;EACA;EACA;;AAGA;EACC;EACA;EACA;;AAEA;EACC;;AAKF;EACC;EACA;;AAEA;EACC;;AAIF;AAEC;EACA;EACA;;AAEA;EACC;EACA;;AAIF;EACC;;AAGD;EACC;;;AAQD;EAEC;;;AC1EF;ECsBC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAMC;EACC;;AAGA;EACC;;AAEA;EACC;;AAMH;EACC;;AAGA;EACC;;AAMH;EAEC;EACA;EACA;;AAID;EACC;EACA;;AAID;EACC;EACA;EACA;;;ADzEF;AAAA;AAAA;AAMA;EACC;EACA;;AAEA;EACC;;AAGD;EACC;;;AAYC;EACC;;AAGA;EACC;;AAEA;EACC;;AAMH;EACC;;AAGA;EACC;;AAMH;AAAA;EAEC;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CA;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;;AAIF;EACC;;;ACxCD;AAAA;EAEC;EACA;EACA;;AAGA;AAAA;EACC;EACA;EACA;;AAGD;AAAA;EACC;EACA;EACA;;;AAMD;AAAA;EAEC;;;AAIF;EACC;EACA;;;AC5BA;EACC;EACA;;AdiFD;EACC;;AAID;EACC;;AAID;EAEC;;AcxFD;EACC;;AAID;EACC;;;ACbD;EACC;EACA;;AAKA;EACC;;AAGD;EACC;EACA;EACA;;AAMD;EACC;;AAUC;EAEC;;AAKH;EACC;;;ACzCH;EACC;;AAEA;EACC;;;ACJF;EACC;EACA;EACA;;;ACHD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;;AAGD;AAAA;AAAA;EAGC;EACA;EACA;;AAID;EACC;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;;AAEA;EARD;IASE;;;AAGD;EACC;;AAGD;EAEC;EACA;EACA;;AAGD;EACC;EACA;;AAEA;EACC;;AAIF;AAAA;AAAA;EAGC;;;AAUD;EACC;;;AAQF;AAAA;EACC;;;ACrGD;EACC;;AzBuBA;EyBxBD;IAIE;;;;ACNH;EACC;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;EACA;;AAGD;EACC;;AAGD;EACC;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;;AAEA;EAIC;;AAIF;EACC;EACA;EACA;;AAGA;EACC;;AAID;EACC;EACA;EACA;EACA;EACA;;AAIF;EACC;;AAEA;EACC;;AAIF;EAEC;AAEA;EACA;EACA;;AAEA;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;;AAMA;EACC;;AAID;EACC;EACA;EACA;EACA;EACA;;A1B9EF;E0B6CD;IAsCE;;EAEA;IACC;;EAGD;IACC;IACA;;EAEA;IACC;;;A1B9FH;E0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","file":"style-editor.css"}
\ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["../sass/style-editor.scss","../sass/01-settings/global.scss","../sass/03-generic/breakpoints.scss","../sass/04-elements/blockquote.scss","../sass/04-elements/media.scss","../sass/04-elements/forms-editor.scss","../sass/04-elements/links.scss","../sass/05-blocks/button/_editor.scss","../sass/02-tools/mixins.scss","../sass/05-blocks/code/_editor.scss","../sass/05-blocks/cover/_editor.scss","../sass/05-blocks/columns/_editor.scss","../sass/05-blocks/file/_editor.scss","../sass/05-blocks/gallery/_editor.scss","../sass/05-blocks/group/_editor.scss","../sass/05-blocks/heading/_editor.scss","../sass/05-blocks/html/_editor.scss","../sass/05-blocks/image/_editor.scss","../sass/05-blocks/latest-comments/_editor.scss","../sass/05-blocks/latest-posts/_editor.scss","../sass/05-blocks/legacy/_editor.scss","../sass/05-blocks/list/_editor.scss","../sass/05-blocks/media-text/_editor.scss","../sass/05-blocks/navigation/_editor.scss","../sass/05-blocks/paragraph/_editor.scss","../sass/05-blocks/preformatted/_editor.scss","../sass/05-blocks/pullquote/_editor.scss","../sass/05-blocks/query-loop/_editor.scss","../sass/05-blocks/quote/_editor.scss","../sass/05-blocks/rss/_editor.scss","../sass/05-blocks/search/_editor.scss","../sass/05-blocks/separator/_editor.scss","../sass/05-blocks/social-icons/_editor.scss","../sass/05-blocks/table/_editor.scss","../sass/05-blocks/tag-clould/_editor.scss","../sass/05-blocks/verse/_editor.scss","../sass/05-blocks/utilities/_font-sizes.scss","../sass/05-blocks/utilities/_editor.scss","../sass/06-components/editor.scss","../sass/07-utilities/color-palette.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;ACAA;AAKA;AAEC;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;AAEA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EAEA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;AAAyD;EACzD;AAAsD;EACtD;EACA;AAAwD;EACxD;AAAsD;AAEtD;EACA;EACA;EACA;EACA;AAEA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;AAEA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;AAEA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;AAEA;EACA;;;AAGD;EACC;;AAEA;EAHD;IAIE;;;;AAIF;EACC;IACC;IACA;IACA;IACA;IACA;;;ACtPF;AAAA;AAAA;AAIA;AAAA;AAAA;AA4EA;AAAA;AAAA;AAGA;EACC;EACA;EACA;EACA;EACA;EACA;;;AA/DC;EAoED;IACC;IACA;IACA;IACA;;;AApCA;EA0CD;IACC;IACA;;;AAIF;AAAA;AAAA;AAGA;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAhGC;EA2GD;IACC;IACA;IACA;IACA;;;ACzIF;EACC;EACA;EACA;;AAEA;EACC;EACA;;AAEA;EACC;;AAGD;EACC;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;;AAGD;AAAA;EAEC;EACA;EACA;EACA;;AAGD;EAGC;;AAEA;EACC;EACA;EACA;;AAGD;AAAA;AAAA;EAEC;EACA;;AAIF;EACC;;AAGD;EACC;EACA;EACA;EACA;EACA;;AAGD;AAAA;AAAA;EAGC;EACA;EACA;;ADlDA;ECpBF;IA0EE;;EAEA;IACC;;;;AC7EH;EACC;EACA;EACA;;;AAGD;AACA;EACC;;;AAGD;AACA;AAAA;AAAA;AAAA;EAIC;;;AAGD;AACA;AAAA;AAAA;AAAA;EAIC;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAEC;;;AAIF;AACA;AAAA;AAAA;EAGC;EACA;EACA;EACA;;;AC5CD;AAAA;EAEC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACXD;AAAA;AAAA;AAAA;AAAA;AAKA;EACC;EACA;EACA;EACA;;;AAGD;EACC;EACA;;;AAGD;AAEC;EACA;EAEA;EACA;EACA;;AAGA;EACC;EACA;EACA;;AAEA;EACC;;AAKF;EACC;EACA;;AAEA;EACC;;AAIF;AAEC;EACA;EACA;;AAEA;EACC;EACA;;AAIF;EACC;;AAGD;EACC;;;AAQD;EAEC;;;AC1EF;ECsBC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAMC;EACC;;AAGA;EACC;;AAEA;EACC;;AAMH;EACC;;AAGA;EACC;;AAMH;EAEC;EACA;EACA;;AAID;EACC;EACA;;AAID;EACC;EACA;EACA;;;ADzEF;AAAA;AAAA;AAMA;EACC;EACA;;AAEA;EACC;;AAGD;EACC;;;AAYC;EACC;;AAGA;EACC;;AAEA;EACC;;AAMH;EACC;;AAGA;EACC;;AAMH;AAAA;EAEC;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CC;EACA;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;;AAIF;EACC;;;ACxCD;AAAA;EAEC;EACA;EACA;;AAGA;AAAA;EACC;EACA;EACA;;AAGD;AAAA;EACC;EACA;EACA;;;AAMD;AAAA;EAEC;;;AAIF;EACC;EACA;;;AC5BA;EACC;EACA;;AdiFD;EACC;;AAID;EACC;;AAID;EAEC;;AcxFD;EACC;;AAID;EACC;;;ACbD;EACC;EACA;;AAKA;EACC;;AAGD;EACC;EACA;EACA;;AAMD;EACC;;AAUC;EAEC;;AAKH;EACC;;;ACzCH;EACC;;AAEA;EACC;;;ACJF;EACC;EACA;EACA;;;ACHD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;;AAGD;AAAA;AAAA;EAGC;EACA;EACA;;AAID;EACC;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;;AAEA;EARD;IASE;;;AAGD;EACC;;AAGD;EAEC;EACA;EACA;;AAGD;EACC;EACA;;AAEA;EACC;;AAIF;AAAA;AAAA;EAGC;;;AAUD;EACC;;;AAQF;AAAA;EACC;;;ACrGD;EACC;;AzBuBA;EyBxBD;IAIE;;;;ACNH;EACC;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;EACA;;AAGD;EACC;;AAGD;EACC;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;;AAEA;EAIC;;AAIF;EACC;EACA;EACA;;AAGA;EACC;;AAID;EACC;EACA;EACA;EACA;EACA;;AAIF;EACC;;AAEA;EACC;;AAIF;EAEC;AAEA;EACA;EACA;;AAEA;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;;AAMA;EACC;;AAID;EACC;EACA;EACA;EACA;EACA;;A1B9EF;E0B6CD;IAsCE;;EAEA;IACC;;EAGD;IACC;IACA;;EAEA;IACC;;;A1B9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","file":"style-editor.css"}
\ No newline at end of file
diff --git a/src/wp-content/themes/twentytwentyone/assets/js/primary-navigation.js b/src/wp-content/themes/twentytwentyone/assets/js/primary-navigation.js
index 4c88190f12..ec15e106dc 100644
--- a/src/wp-content/themes/twentytwentyone/assets/js/primary-navigation.js
+++ b/src/wp-content/themes/twentytwentyone/assets/js/primary-navigation.js
@@ -180,7 +180,9 @@ function twentytwentyoneExpandSubMenu( el ) { // jshint ignore:line
 				// Wait 550 and scroll to the anchor.
 				setTimeout(function () {
 					var anchor = document.getElementById(event.target.hash.slice(1));
-					anchor.scrollIntoView();
+					if ( anchor ) {
+						anchor.scrollIntoView();
+					}
 				}, 550);
 			}
 		} );
diff --git a/src/wp-content/themes/twentytwentyone/assets/sass/01-settings/file-header.scss b/src/wp-content/themes/twentytwentyone/assets/sass/01-settings/file-header.scss
index 43a6960b32..dd3693f65a 100644
--- a/src/wp-content/themes/twentytwentyone/assets/sass/01-settings/file-header.scss
+++ b/src/wp-content/themes/twentytwentyone/assets/sass/01-settings/file-header.scss
@@ -5,9 +5,9 @@ Author: the WordPress team
 Author URI: https://wordpress.org/
 Description: Twenty Twenty-One is a blank canvas for your ideas and it makes the block editor your best brush. With new block patterns, which allow you to create a beautiful layout in a matter of seconds, this theme’s soft colors and eye-catching — yet timeless — design will let your work shine. Take it for a spin! See how Twenty Twenty-One elevates your portfolio, business website, or personal blog.
 Requires at least: 5.3
-Tested up to: 5.8
+Tested up to: 5.9
 Requires PHP: 5.6
-Version: 1.4
+Version: 1.5
 License: GNU General Public License v2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
 Text Domain: twentytwentyone
diff --git a/src/wp-content/themes/twentytwentyone/assets/sass/05-blocks/image/_editor.scss b/src/wp-content/themes/twentytwentyone/assets/sass/05-blocks/image/_editor.scss
index e4ed9d7a01..c108a60f9a 100644
--- a/src/wp-content/themes/twentytwentyone/assets/sass/05-blocks/image/_editor.scss
+++ b/src/wp-content/themes/twentytwentyone/assets/sass/05-blocks/image/_editor.scss
@@ -1,6 +1,7 @@
 /* Center image block by default in the editor */
 
-.wp-block-image > div {
+.wp-block-image,
+.wp-block-image > div:not(.components-placeholder) {
 	text-align: center;
 }
 
diff --git a/src/wp-content/themes/twentytwentyone/assets/sass/06-components/footer.scss b/src/wp-content/themes/twentytwentyone/assets/sass/06-components/footer.scss
index 6223c3446a..0707f3c1ca 100644
--- a/src/wp-content/themes/twentytwentyone/assets/sass/06-components/footer.scss
+++ b/src/wp-content/themes/twentytwentyone/assets/sass/06-components/footer.scss
@@ -31,6 +31,7 @@
 		font-size: var(--branding--title--font-size);
 	}
 
+	.privacy-policy,
 	.powered-by {
 		margin-top: calc(0.5 * var(--global--spacing-vertical));
 	}
@@ -39,10 +40,19 @@
 		display: flex;
 		align-items: center;
 
+		.site-name {
+			margin-right: calc(0.5 * var(--global--spacing-vertical));
+		}
+
+		.privacy-policy,
 		.powered-by {
 			margin-top: initial;
 			margin-left: auto;
 		}
+
+		.privacy-policy + .powered-by {
+			margin-left: calc(0.5 * var(--global--spacing-vertical));
+		}
 	}
 
 	a {
diff --git a/src/wp-content/themes/twentytwentyone/assets/sass/06-components/widgets.scss b/src/wp-content/themes/twentytwentyone/assets/sass/06-components/widgets.scss
index 5fb85df9fd..b896c6bf62 100755
--- a/src/wp-content/themes/twentytwentyone/assets/sass/06-components/widgets.scss
+++ b/src/wp-content/themes/twentytwentyone/assets/sass/06-components/widgets.scss
@@ -20,42 +20,6 @@
 		margin-top: calc(3 * var(--global--spacing-vertical));
 	}
 
-	ul {
-		list-style-type: none;
-		padding: 0;
-
-		li {
-			line-height: var(--widget--line-height-list);
-		}
-
-		&.sub-menu,
-		&.children {
-			margin-left: var(--widget--spacing-menu);
-		}
-
-		.sub-menu-toggle {
-			display: none;
-		}
-	}
-
-	a {
-		color: var(--footer--color-link);
-		text-decoration: underline;
-		text-decoration-style: solid;
-		text-decoration-color: currentColor;
-
-		&:link,
-		&:visited,
-		&:active {
-			color: var(--footer--color-link);
-		}
-
-		&:hover {
-			color: var(--footer--color-link-hover);
-			text-decoration-style: dotted;
-		}
-	}
-
 	.wp-block-social-links {
 
 		&.alignright {
@@ -110,6 +74,42 @@
 	h6 {
 		font-size: var(--global--font-size-xs);
 	}
+
+	ul {
+		list-style-type: none;
+		padding: 0;
+
+		li {
+			line-height: var(--widget--line-height-list);
+		}
+
+		&.sub-menu,
+		&.children {
+			margin-left: var(--widget--spacing-menu);
+		}
+
+		.sub-menu-toggle {
+			display: none;
+		}
+	}
+
+	a {
+		color: var(--footer--color-link);
+		text-decoration: underline;
+		text-decoration-style: solid;
+		text-decoration-color: currentColor;
+
+		&:link,
+		&:visited,
+		&:active {
+			color: var(--footer--color-link);
+		}
+
+		&:hover {
+			color: var(--footer--color-link-hover);
+			text-decoration-style: dotted;
+		}
+	}
 }
 
 // Search widget styles
diff --git a/src/wp-content/themes/twentytwentyone/classes/class-twenty-twenty-one-dark-mode.php b/src/wp-content/themes/twentytwentyone/classes/class-twenty-twenty-one-dark-mode.php
index 4de201c1b9..854cb2e0cf 100644
--- a/src/wp-content/themes/twentytwentyone/classes/class-twenty-twenty-one-dark-mode.php
+++ b/src/wp-content/themes/twentytwentyone/classes/class-twenty-twenty-one-dark-mode.php
@@ -178,7 +178,7 @@ class Twenty_Twenty_One_Dark_Mode {
 			esc_url( __( 'https://wordpress.org/support/article/twenty-twenty-one/#dark-mode-support', 'twentytwentyone' ) )
 		);
 		$description .= '</p>';
-		$description .= '<p>' . __( 'Dark Mode can also be turned on and off with a button that you can find in the bottom right corner of the page.', 'twentytwentyone' ) . '</p>';
+		$description .= '<p>' . __( 'Dark Mode can also be turned on and off with a button that you can find in the bottom corner of the page.', 'twentytwentyone' ) . '</p>';
 
 		$wp_customize->add_control(
 			'respect_user_color_preference',
diff --git a/src/wp-content/themes/twentytwentyone/comments.php b/src/wp-content/themes/twentytwentyone/comments.php
index cb86fef26e..06e3d029d0 100644
--- a/src/wp-content/themes/twentytwentyone/comments.php
+++ b/src/wp-content/themes/twentytwentyone/comments.php
@@ -82,7 +82,6 @@ $twenty_twenty_one_comment_count = get_comments_number();
 	<?php
 	comment_form(
 		array(
-			'logged_in_as'       => null,
 			'title_reply'        => esc_html__( 'Leave a comment', 'twentytwentyone' ),
 			'title_reply_before' => '<h2 id="reply-title" class="comment-reply-title">',
 			'title_reply_after'  => '</h2>',
diff --git a/src/wp-content/themes/twentytwentyone/footer.php b/src/wp-content/themes/twentytwentyone/footer.php
index eac1082932..4fc472d9cf 100644
--- a/src/wp-content/themes/twentytwentyone/footer.php
+++ b/src/wp-content/themes/twentytwentyone/footer.php
@@ -53,6 +53,13 @@
 					<?php endif; ?>
 				<?php endif; ?>
 			</div><!-- .site-name -->
+
+			<?php
+			if ( function_exists( 'the_privacy_policy_link' ) ) {
+				the_privacy_policy_link( '<div class="privacy-policy">', '</div>' );
+			}
+			?>
+
 			<div class="powered-by">
 				<?php
 				printf(
diff --git a/src/wp-content/themes/twentytwentyone/functions.php b/src/wp-content/themes/twentytwentyone/functions.php
index 74d1d339f5..452b5b3d22 100644
--- a/src/wp-content/themes/twentytwentyone/functions.php
+++ b/src/wp-content/themes/twentytwentyone/functions.php
@@ -338,6 +338,9 @@ if ( ! function_exists( 'twenty_twenty_one_setup' ) ) {
 		// Add support for custom units.
 		// This was removed in WordPress 5.6 but is still required to properly support WP 5.5.
 		add_theme_support( 'custom-units' );
+
+		// Remove feed icon link from legacy RSS widget.
+		add_filter( 'rss_widget_feed_link', '__return_false' );
 	}
 }
 add_action( 'after_setup_theme', 'twenty_twenty_one_setup' );
@@ -496,14 +499,14 @@ function twenty_twenty_one_skip_link_focus_fix() {
 		echo '<script>';
 		include get_template_directory() . '/assets/js/skip-link-focus-fix.js';
 		echo '</script>';
+	} else {
+		// The following is minified via `npx terser --compress --mangle -- assets/js/skip-link-focus-fix.js`.
+		?>
+		<script>
+		/(trident|msie)/i.test(navigator.userAgent)&&document.getElementById&&window.addEventListener&&window.addEventListener("hashchange",(function(){var t,e=location.hash.substring(1);/^[A-z0-9_-]+$/.test(e)&&(t=document.getElementById(e))&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())}),!1);
+		</script>
+		<?php
 	}
-
-	// The following is minified via `npx terser --compress --mangle -- assets/js/skip-link-focus-fix.js`.
-	?>
-	<script>
-	/(trident|msie)/i.test(navigator.userAgent)&&document.getElementById&&window.addEventListener&&window.addEventListener("hashchange",(function(){var t,e=location.hash.substring(1);/^[A-z0-9_-]+$/.test(e)&&(t=document.getElementById(e))&&(/^(?:a|select|input|button|textarea)$/i.test(t.tagName)||(t.tabIndex=-1),t.focus())}),!1);
-	</script>
-	<?php
 }
 add_action( 'wp_print_footer_scripts', 'twenty_twenty_one_skip_link_focus_fix' );
 
diff --git a/src/wp-content/themes/twentytwentyone/inc/template-functions.php b/src/wp-content/themes/twentytwentyone/inc/template-functions.php
index 2bee7d6f95..6498c7dfa9 100644
--- a/src/wp-content/themes/twentytwentyone/inc/template-functions.php
+++ b/src/wp-content/themes/twentytwentyone/inc/template-functions.php
@@ -457,7 +457,7 @@ function twenty_twenty_one_get_attachment_image_attributes( $attr, $attachment,
 		$height = (int) $size[1];
 	} elseif ( $attachment && is_object( $attachment ) && $attachment->ID ) {
 		$meta = wp_get_attachment_metadata( $attachment->ID );
-		if ( $meta['width'] && $meta['height'] ) {
+		if ( isset( $meta['width'] ) && isset( $meta['height'] ) ) {
 			$width  = (int) $meta['width'];
 			$height = (int) $meta['height'];
 		}
diff --git a/src/wp-content/themes/twentytwentyone/package-lock.json b/src/wp-content/themes/twentytwentyone/package-lock.json
index 060fcbd18f..e2e41e99b7 100644
--- a/src/wp-content/themes/twentytwentyone/package-lock.json
+++ b/src/wp-content/themes/twentytwentyone/package-lock.json
@@ -1,6 +1,6 @@
 {
 	"name": "twentytwentyone",
-	"version": "1.4.0",
+	"version": "1.5.0",
 	"lockfileVersion": 1,
 	"requires": true,
 	"dependencies": {
@@ -232,21 +232,21 @@
 			"dev": true
 		},
 		"@babel/runtime": {
-			"version": "7.14.0",
-			"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz",
-			"integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==",
+			"version": "7.16.0",
+			"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.0.tgz",
+			"integrity": "sha512-Nht8L0O8YCktmsDV6FqFue7vQLRx3Hb0B37lS5y0jDRqRxlBG4wIJHnf9/bgSE2UyipKFA01YtS+npRdTWBUyw==",
 			"dev": true,
 			"requires": {
 				"regenerator-runtime": "^0.13.4"
 			}
 		},
 		"@babel/runtime-corejs3": {
-			"version": "7.14.0",
-			"resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.14.0.tgz",
-			"integrity": "sha512-0R0HTZWHLk6G8jIk0FtoX+AatCtKnswS98VhXwGImFc759PJRp4Tru0PQYZofyijTFUr+gT8Mu7sgXVJLQ0ceg==",
+			"version": "7.16.0",
+			"resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.16.0.tgz",
+			"integrity": "sha512-Oi2qwQ21X7/d9gn3WiwkDTJmq3TQtYNz89lRnoFy8VeZpWlsyXvzSwiRrRZ8cXluvSwqKxqHJ6dBd9Rv+p0ZGQ==",
 			"dev": true,
 			"requires": {
-				"core-js-pure": "^3.0.0",
+				"core-js-pure": "^3.19.0",
 				"regenerator-runtime": "^0.13.4"
 			}
 		},
@@ -303,27 +303,55 @@
 				}
 			}
 		},
+		"@es-joy/jsdoccomment": {
+			"version": "0.10.8",
+			"resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.10.8.tgz",
+			"integrity": "sha512-3P1JiGL4xaR9PoTKUHa2N/LKwa2/eUdRqGwijMWWgBqbFEqJUVpmaOi2TcjcemrsRMgFLBzQCK4ToPhrSVDiFQ==",
+			"dev": true,
+			"requires": {
+				"comment-parser": "1.2.4",
+				"esquery": "^1.4.0",
+				"jsdoc-type-pratt-parser": "1.1.1"
+			},
+			"dependencies": {
+				"jsdoc-type-pratt-parser": {
+					"version": "1.1.1",
+					"resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.1.1.tgz",
+					"integrity": "sha512-uelRmpghNwPBuZScwgBG/OzodaFk5RbO5xaivBdsAY70icWfShwZ7PCMO0x1zSkOa8T1FzHThmrdoyg/0AwV5g==",
+					"dev": true
+				}
+			}
+		},
 		"@eslint/eslintrc": {
-			"version": "0.4.2",
-			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.2.tgz",
-			"integrity": "sha512-8nmGq/4ycLpIwzvhI4tNDmQztZ8sp+hI7cyG8i1nQDhkAbRzHpXPidRAHlNvCZQpJTKw5ItIpMw9RSToGF00mg==",
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.4.tgz",
+			"integrity": "sha512-h8Vx6MdxwWI2WM8/zREHMoqdgLNXEL4QX3MWSVMdyNJGvXVOs+6lp+m2hc3FnuMHDc4poxFNI20vCk0OmI4G0Q==",
 			"dev": true,
 			"requires": {
 				"ajv": "^6.12.4",
-				"debug": "^4.1.1",
-				"espree": "^7.3.0",
+				"debug": "^4.3.2",
+				"espree": "^9.0.0",
 				"globals": "^13.9.0",
 				"ignore": "^4.0.6",
 				"import-fresh": "^3.2.1",
-				"js-yaml": "^3.13.1",
+				"js-yaml": "^4.1.0",
 				"minimatch": "^3.0.4",
 				"strip-json-comments": "^3.1.1"
 			},
 			"dependencies": {
+				"debug": {
+					"version": "4.3.2",
+					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+					"integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+					"dev": true,
+					"requires": {
+						"ms": "2.1.2"
+					}
+				},
 				"globals": {
-					"version": "13.9.0",
-					"resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz",
-					"integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==",
+					"version": "13.12.0",
+					"resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
+					"integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
 					"dev": true,
 					"requires": {
 						"type-fest": "^0.20.2"
@@ -343,6 +371,23 @@
 				}
 			}
 		},
+		"@humanwhocodes/config-array": {
+			"version": "0.6.0",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.6.0.tgz",
+			"integrity": "sha512-JQlEKbcgEUjBFhLIF4iqM7u/9lwgHRBcpHrmUNCALK0Q3amXN6lxdoXLnF0sm11E9VqTmBALR87IlUg1bZ8A9A==",
+			"dev": true,
+			"requires": {
+				"@humanwhocodes/object-schema": "^1.2.0",
+				"debug": "^4.1.1",
+				"minimatch": "^3.0.4"
+			}
+		},
+		"@humanwhocodes/object-schema": {
+			"version": "1.2.1",
+			"resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz",
+			"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
+			"dev": true
+		},
 		"@nodelib/fs.scandir": {
 			"version": "2.1.4",
 			"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz",
@@ -389,9 +434,9 @@
 			}
 		},
 		"@types/json-schema": {
-			"version": "7.0.7",
-			"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz",
-			"integrity": "sha512-cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==",
+			"version": "7.0.9",
+			"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
+			"integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==",
 			"dev": true
 		},
 		"@types/json5": {
@@ -434,71 +479,71 @@
 			"dev": true
 		},
 		"@typescript-eslint/eslint-plugin": {
-			"version": "4.26.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.26.1.tgz",
-			"integrity": "sha512-aoIusj/8CR+xDWmZxARivZjbMBQTT9dImUtdZ8tVCVRXgBUuuZyM5Of5A9D9arQPxbi/0rlJLcuArclz/rCMJw==",
+			"version": "4.33.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz",
+			"integrity": "sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/experimental-utils": "4.26.1",
-				"@typescript-eslint/scope-manager": "4.26.1",
+				"@typescript-eslint/experimental-utils": "4.33.0",
+				"@typescript-eslint/scope-manager": "4.33.0",
 				"debug": "^4.3.1",
 				"functional-red-black-tree": "^1.0.1",
-				"lodash": "^4.17.21",
+				"ignore": "^5.1.8",
 				"regexpp": "^3.1.0",
 				"semver": "^7.3.5",
 				"tsutils": "^3.21.0"
 			}
 		},
 		"@typescript-eslint/experimental-utils": {
-			"version": "4.26.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.26.1.tgz",
-			"integrity": "sha512-sQHBugRhrXzRCs9PaGg6rowie4i8s/iD/DpTB+EXte8OMDfdCG5TvO73XlO9Wc/zi0uyN4qOmX9hIjQEyhnbmQ==",
+			"version": "4.33.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz",
+			"integrity": "sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==",
 			"dev": true,
 			"requires": {
 				"@types/json-schema": "^7.0.7",
-				"@typescript-eslint/scope-manager": "4.26.1",
-				"@typescript-eslint/types": "4.26.1",
-				"@typescript-eslint/typescript-estree": "4.26.1",
+				"@typescript-eslint/scope-manager": "4.33.0",
+				"@typescript-eslint/types": "4.33.0",
+				"@typescript-eslint/typescript-estree": "4.33.0",
 				"eslint-scope": "^5.1.1",
 				"eslint-utils": "^3.0.0"
 			}
 		},
 		"@typescript-eslint/parser": {
-			"version": "4.26.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.26.1.tgz",
-			"integrity": "sha512-q7F3zSo/nU6YJpPJvQveVlIIzx9/wu75lr6oDbDzoeIRWxpoc/HQ43G4rmMoCc5my/3uSj2VEpg/D83LYZF5HQ==",
+			"version": "4.33.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.33.0.tgz",
+			"integrity": "sha512-ZohdsbXadjGBSK0/r+d87X0SBmKzOq4/S5nzK6SBgJspFo9/CUDJ7hjayuze+JK7CZQLDMroqytp7pOcFKTxZA==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/scope-manager": "4.26.1",
-				"@typescript-eslint/types": "4.26.1",
-				"@typescript-eslint/typescript-estree": "4.26.1",
+				"@typescript-eslint/scope-manager": "4.33.0",
+				"@typescript-eslint/types": "4.33.0",
+				"@typescript-eslint/typescript-estree": "4.33.0",
 				"debug": "^4.3.1"
 			}
 		},
 		"@typescript-eslint/scope-manager": {
-			"version": "4.26.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.26.1.tgz",
-			"integrity": "sha512-TW1X2p62FQ8Rlne+WEShyd7ac2LA6o27S9i131W4NwDSfyeVlQWhw8ylldNNS8JG6oJB9Ha9Xyc+IUcqipvheQ==",
+			"version": "4.33.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz",
+			"integrity": "sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/types": "4.26.1",
-				"@typescript-eslint/visitor-keys": "4.26.1"
+				"@typescript-eslint/types": "4.33.0",
+				"@typescript-eslint/visitor-keys": "4.33.0"
 			}
 		},
 		"@typescript-eslint/types": {
-			"version": "4.26.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.26.1.tgz",
-			"integrity": "sha512-STyMPxR3cS+LaNvS8yK15rb8Y0iL0tFXq0uyl6gY45glyI7w0CsyqyEXl/Fa0JlQy+pVANeK3sbwPneCbWE7yg==",
+			"version": "4.33.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.33.0.tgz",
+			"integrity": "sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==",
 			"dev": true
 		},
 		"@typescript-eslint/typescript-estree": {
-			"version": "4.26.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.26.1.tgz",
-			"integrity": "sha512-l3ZXob+h0NQzz80lBGaykdScYaiEbFqznEs99uwzm8fPHhDjwaBFfQkjUC/slw6Sm7npFL8qrGEAMxcfBsBJUg==",
+			"version": "4.33.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz",
+			"integrity": "sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/types": "4.26.1",
-				"@typescript-eslint/visitor-keys": "4.26.1",
+				"@typescript-eslint/types": "4.33.0",
+				"@typescript-eslint/visitor-keys": "4.33.0",
 				"debug": "^4.3.1",
 				"globby": "^11.0.3",
 				"is-glob": "^4.0.1",
@@ -507,12 +552,12 @@
 			}
 		},
 		"@typescript-eslint/visitor-keys": {
-			"version": "4.26.1",
-			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.26.1.tgz",
-			"integrity": "sha512-IGouNSSd+6x/fHtYRyLOM6/C+QxMDzWlDtN41ea+flWuSF9g02iqcIlX8wM53JkfljoIjP0U+yp7SiTS1onEkw==",
+			"version": "4.33.0",
+			"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz",
+			"integrity": "sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/types": "4.26.1",
+				"@typescript-eslint/types": "4.33.0",
 				"eslint-visitor-keys": "^2.0.0"
 			}
 		},
@@ -523,20 +568,20 @@
 			"dev": true
 		},
 		"@wordpress/eslint-plugin": {
-			"version": "9.0.6",
-			"resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-9.0.6.tgz",
-			"integrity": "sha512-ytkG93uzlHlItPR2MDkhUXtnnyw80rwSFZDovsHvMKrB9JjDem2pZnnUjwIOl+zb/9nittUJw6HA5AwCBDw+MQ==",
+			"version": "9.2.0",
+			"resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-9.2.0.tgz",
+			"integrity": "sha512-x0vI4EWeG20TyewXdiyUhGSJRqXR8vw47WZjzdmL8iuitDCoyWkKe73wtEs/mWLDrSNms8S0bTnp0dK6UAMXJw==",
 			"dev": true,
 			"requires": {
-				"@typescript-eslint/eslint-plugin": "^4.15.0",
-				"@typescript-eslint/parser": "^4.15.0",
-				"@wordpress/prettier-config": "^1.0.5",
+				"@typescript-eslint/eslint-plugin": "^4.31.0",
+				"@typescript-eslint/parser": "^4.31.0",
+				"@wordpress/prettier-config": "^1.1.1",
 				"babel-eslint": "^10.1.0",
 				"cosmiconfig": "^7.0.0",
 				"eslint-config-prettier": "^7.1.0",
-				"eslint-plugin-import": "^2.22.1",
+				"eslint-plugin-import": "^2.23.4",
 				"eslint-plugin-jest": "^24.1.3",
-				"eslint-plugin-jsdoc": "^30.7.13",
+				"eslint-plugin-jsdoc": "^36.0.8",
 				"eslint-plugin-jsx-a11y": "^6.4.1",
 				"eslint-plugin-prettier": "^3.3.0",
 				"eslint-plugin-react": "^7.22.0",
@@ -544,35 +589,62 @@
 				"globals": "^12.0.0",
 				"prettier": "npm:wp-prettier@2.2.1-beta-1",
 				"requireindex": "^1.2.0"
+			},
+			"dependencies": {
+				"prettier": {
+					"version": "npm:wp-prettier@2.2.1-beta-1",
+					"resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-2.2.1-beta-1.tgz",
+					"integrity": "sha512-+JHkqs9LC/JPp51yy1hzs3lQ7qeuWCwOcSzpQNeeY/G7oSpnF61vxt7hRh87zNRTr6ob2ndy0W8rVzhgrcA+Gw==",
+					"dev": true
+				}
 			}
 		},
 		"@wordpress/prettier-config": {
-			"version": "1.0.5",
-			"resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-1.0.5.tgz",
-			"integrity": "sha512-kZ1EzXmDKOe+QxSJJSu70zx+x2g1awqYJjX7Z947K0affv4l8/oPA+k3SgNi3U9Q5Sbwtb5xLgDr9k0HGJSw7g==",
+			"version": "1.1.1",
+			"resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-1.1.1.tgz",
+			"integrity": "sha512-qjpBK5KB2ieCLv+1fGNKRW4urf5tFN1eUn3Qy+JINxNwAx6Jj9uhfXA4AldCSnD+WkzsN2UgBvgAj5/SWwzRZQ==",
 			"dev": true
 		},
 		"@wordpress/stylelint-config": {
-			"version": "19.0.5",
-			"resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-19.0.5.tgz",
-			"integrity": "sha512-VI89jNS4wqr6Bd2PklGiTlrzrTH2RLQe2mHkWsYABVcFBFlsv6bTDQbO2c4xX1jd/9yYH7lEyvuzb3sHnyxMSA==",
+			"version": "19.1.0",
+			"resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-19.1.0.tgz",
+			"integrity": "sha512-K/wB9rhB+pH5WvDh3fV3DN5C3Bud+jPGXmnPY8fOXKMYI3twCFozK/j6sVuaJHqGp/0kKEF0hkkGh+HhD30KGQ==",
 			"dev": true,
 			"requires": {
 				"stylelint-config-recommended": "^3.0.0",
 				"stylelint-config-recommended-scss": "^4.2.0",
 				"stylelint-scss": "^3.17.2"
+			},
+			"dependencies": {
+				"stylelint-config-recommended-scss": {
+					"version": "4.3.0",
+					"resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-4.3.0.tgz",
+					"integrity": "sha512-/noGjXlO8pJTr/Z3qGMoaRFK8n1BFfOqmAbX1RjTIcl4Yalr+LUb1zb9iQ7pRx1GsEBXOAm4g2z5/jou/pfMPg==",
+					"dev": true,
+					"requires": {
+						"stylelint-config-recommended": "^5.0.0"
+					},
+					"dependencies": {
+						"stylelint-config-recommended": {
+							"version": "5.0.0",
+							"resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-5.0.0.tgz",
+							"integrity": "sha512-c8aubuARSu5A3vEHLBeOSJt1udOdS+1iue7BmJDTSXoCBmfEQmmWX+59vYIj3NQdJBY6a/QRv1ozVFpaB9jaqA==",
+							"dev": true
+						}
+					}
+				}
 			}
 		},
 		"acorn": {
-			"version": "7.4.1",
-			"resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
-			"integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+			"version": "8.5.0",
+			"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.5.0.tgz",
+			"integrity": "sha512-yXbYeFy+jUuYd3/CDcg2NkIYE991XYX/bje7LmjJigUciaeO1JR4XxXgCIV1/Zc/dRuFEyw1L0pbA+qynJkW5Q==",
 			"dev": true
 		},
 		"acorn-jsx": {
-			"version": "5.3.1",
-			"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
-			"integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+			"version": "5.3.2",
+			"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+			"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
 			"dev": true
 		},
 		"ajv": {
@@ -609,9 +681,9 @@
 			}
 		},
 		"anymatch": {
-			"version": "3.1.1",
-			"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
-			"integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+			"version": "3.1.2",
+			"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
+			"integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
 			"dev": true,
 			"requires": {
 				"normalize-path": "^3.0.0",
@@ -619,13 +691,10 @@
 			}
 		},
 		"argparse": {
-			"version": "1.0.10",
-			"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-			"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-			"dev": true,
-			"requires": {
-				"sprintf-js": "~1.0.2"
-			}
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+			"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+			"dev": true
 		},
 		"aria-query": {
 			"version": "4.2.2",
@@ -638,16 +707,16 @@
 			}
 		},
 		"array-includes": {
-			"version": "3.1.3",
-			"resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz",
-			"integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==",
+			"version": "3.1.4",
+			"resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.4.tgz",
+			"integrity": "sha512-ZTNSQkmWumEbiHO2GF4GmWxYVTiQyJy2XOTa15sdQSrvKn7l+180egQMqlrMOUMCyLMD7pmyQe4mMDUT6Behrw==",
 			"dev": true,
 			"requires": {
 				"call-bind": "^1.0.2",
 				"define-properties": "^1.1.3",
-				"es-abstract": "^1.18.0-next.2",
+				"es-abstract": "^1.19.1",
 				"get-intrinsic": "^1.1.1",
-				"is-string": "^1.0.5"
+				"is-string": "^1.0.7"
 			},
 			"dependencies": {
 				"call-bind": {
@@ -661,22 +730,26 @@
 					}
 				},
 				"es-abstract": {
-					"version": "1.18.3",
-					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz",
-					"integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==",
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
 					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
 						"es-to-primitive": "^1.2.1",
 						"function-bind": "^1.1.1",
 						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
 						"has": "^1.0.3",
 						"has-symbols": "^1.0.2",
-						"is-callable": "^1.2.3",
+						"internal-slot": "^1.0.3",
+						"is-callable": "^1.2.4",
 						"is-negative-zero": "^2.0.1",
-						"is-regex": "^1.1.3",
-						"is-string": "^1.0.6",
-						"object-inspect": "^1.10.3",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
+						"object-inspect": "^1.11.0",
 						"object-keys": "^1.1.1",
 						"object.assign": "^4.1.2",
 						"string.prototype.trimend": "^1.0.4",
@@ -704,9 +777,9 @@
 					}
 				},
 				"is-callable": {
-					"version": "1.2.3",
-					"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
-					"integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==",
+					"version": "1.2.4",
+					"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
+					"integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
 					"dev": true
 				},
 				"is-negative-zero": {
@@ -716,27 +789,19 @@
 					"dev": true
 				},
 				"is-regex": {
-					"version": "1.1.3",
-					"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz",
-					"integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==",
+					"version": "1.1.4",
+					"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+					"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
 					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
-						"has-symbols": "^1.0.2"
-					},
-					"dependencies": {
-						"has-symbols": {
-							"version": "1.0.2",
-							"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
-							"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
-							"dev": true
-						}
+						"has-tostringtag": "^1.0.0"
 					}
 				},
 				"object-inspect": {
-					"version": "1.10.3",
-					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz",
-					"integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==",
+					"version": "1.11.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
+					"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
 					"dev": true
 				},
 				"string.prototype.trimend": {
@@ -768,26 +833,275 @@
 			"dev": true
 		},
 		"array.prototype.flat": {
-			"version": "1.2.4",
-			"resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz",
-			"integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==",
+			"version": "1.2.5",
+			"resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.5.tgz",
+			"integrity": "sha512-KaYU+S+ndVqyUnignHftkwc58o3uVU1jzczILJ1tN2YaIZpFIKBiP/x/j97E5MVPsaCloPbqWLB/8qCTVvT2qg==",
 			"dev": true,
 			"requires": {
-				"call-bind": "^1.0.0",
+				"call-bind": "^1.0.2",
 				"define-properties": "^1.1.3",
-				"es-abstract": "^1.18.0-next.1"
+				"es-abstract": "^1.19.0"
+			},
+			"dependencies": {
+				"call-bind": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+					"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+					"dev": true,
+					"requires": {
+						"function-bind": "^1.1.1",
+						"get-intrinsic": "^1.0.2"
+					}
+				},
+				"es-abstract": {
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
+					"dev": true,
+					"requires": {
+						"call-bind": "^1.0.2",
+						"es-to-primitive": "^1.2.1",
+						"function-bind": "^1.1.1",
+						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
+						"has": "^1.0.3",
+						"has-symbols": "^1.0.2",
+						"internal-slot": "^1.0.3",
+						"is-callable": "^1.2.4",
+						"is-negative-zero": "^2.0.1",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
+						"object-inspect": "^1.11.0",
+						"object-keys": "^1.1.1",
+						"object.assign": "^4.1.2",
+						"string.prototype.trimend": "^1.0.4",
+						"string.prototype.trimstart": "^1.0.4",
+						"unbox-primitive": "^1.0.1"
+					},
+					"dependencies": {
+						"has-symbols": {
+							"version": "1.0.2",
+							"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+							"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+							"dev": true
+						}
+					}
+				},
+				"get-intrinsic": {
+					"version": "1.1.1",
+					"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+					"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+					"dev": true,
+					"requires": {
+						"function-bind": "^1.1.1",
+						"has": "^1.0.3",
+						"has-symbols": "^1.0.1"
+					}
+				},
+				"is-callable": {
+					"version": "1.2.4",
+					"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
+					"integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
+					"dev": true
+				},
+				"is-negative-zero": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
+					"integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
+					"dev": true
+				},
+				"is-regex": {
+					"version": "1.1.4",
+					"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+					"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+					"dev": true,
+					"requires": {
+						"call-bind": "^1.0.2",
+						"has-tostringtag": "^1.0.0"
+					}
+				},
+				"object-inspect": {
+					"version": "1.11.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
+					"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
+					"dev": true
+				},
+				"string.prototype.trimend": {
+					"version": "1.0.4",
+					"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
+					"integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
+					"dev": true,
+					"requires": {
+						"call-bind": "^1.0.2",
+						"define-properties": "^1.1.3"
+					}
+				},
+				"string.prototype.trimstart": {
+					"version": "1.0.4",
+					"resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
+					"integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
+					"dev": true,
+					"requires": {
+						"call-bind": "^1.0.2",
+						"define-properties": "^1.1.3"
+					}
+				}
 			}
 		},
 		"array.prototype.flatmap": {
-			"version": "1.2.4",
-			"resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.4.tgz",
-			"integrity": "sha512-r9Z0zYoxqHz60vvQbWEdXIEtCwHF0yxaWfno9qzXeNHvfyl3BZqygmGzb84dsubyaXLH4husF+NFgMSdpZhk2Q==",
+			"version": "1.2.5",
+			"resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.2.5.tgz",
+			"integrity": "sha512-08u6rVyi1Lj7oqWbS9nUxliETrtIROT4XGTA4D/LWGten6E3ocm7cy9SIrmNHOL5XVbVuckUp3X6Xyg8/zpvHA==",
 			"dev": true,
 			"requires": {
 				"call-bind": "^1.0.0",
 				"define-properties": "^1.1.3",
-				"es-abstract": "^1.18.0-next.1",
-				"function-bind": "^1.1.1"
+				"es-abstract": "^1.19.0"
+			},
+			"dependencies": {
+				"es-abstract": {
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
+					"dev": true,
+					"requires": {
+						"call-bind": "^1.0.2",
+						"es-to-primitive": "^1.2.1",
+						"function-bind": "^1.1.1",
+						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
+						"has": "^1.0.3",
+						"has-symbols": "^1.0.2",
+						"internal-slot": "^1.0.3",
+						"is-callable": "^1.2.4",
+						"is-negative-zero": "^2.0.1",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
+						"object-inspect": "^1.11.0",
+						"object-keys": "^1.1.1",
+						"object.assign": "^4.1.2",
+						"string.prototype.trimend": "^1.0.4",
+						"string.prototype.trimstart": "^1.0.4",
+						"unbox-primitive": "^1.0.1"
+					},
+					"dependencies": {
+						"call-bind": {
+							"version": "1.0.2",
+							"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+							"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+							"dev": true,
+							"requires": {
+								"function-bind": "^1.1.1",
+								"get-intrinsic": "^1.0.2"
+							}
+						}
+					}
+				},
+				"get-intrinsic": {
+					"version": "1.1.1",
+					"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+					"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+					"dev": true,
+					"requires": {
+						"function-bind": "^1.1.1",
+						"has": "^1.0.3",
+						"has-symbols": "^1.0.1"
+					}
+				},
+				"has-symbols": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+					"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+					"dev": true
+				},
+				"is-callable": {
+					"version": "1.2.4",
+					"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
+					"integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
+					"dev": true
+				},
+				"is-negative-zero": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
+					"integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
+					"dev": true
+				},
+				"is-regex": {
+					"version": "1.1.4",
+					"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+					"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+					"dev": true,
+					"requires": {
+						"call-bind": "^1.0.2",
+						"has-tostringtag": "^1.0.0"
+					},
+					"dependencies": {
+						"call-bind": {
+							"version": "1.0.2",
+							"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+							"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+							"dev": true,
+							"requires": {
+								"function-bind": "^1.1.1",
+								"get-intrinsic": "^1.0.2"
+							}
+						}
+					}
+				},
+				"object-inspect": {
+					"version": "1.11.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
+					"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
+					"dev": true
+				},
+				"string.prototype.trimend": {
+					"version": "1.0.4",
+					"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
+					"integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
+					"dev": true,
+					"requires": {
+						"call-bind": "^1.0.2",
+						"define-properties": "^1.1.3"
+					},
+					"dependencies": {
+						"call-bind": {
+							"version": "1.0.2",
+							"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+							"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+							"dev": true,
+							"requires": {
+								"function-bind": "^1.1.1",
+								"get-intrinsic": "^1.0.2"
+							}
+						}
+					}
+				},
+				"string.prototype.trimstart": {
+					"version": "1.0.4",
+					"resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
+					"integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
+					"dev": true,
+					"requires": {
+						"call-bind": "^1.0.2",
+						"define-properties": "^1.1.3"
+					},
+					"dependencies": {
+						"call-bind": {
+							"version": "1.0.2",
+							"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+							"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+							"dev": true,
+							"requires": {
+								"function-bind": "^1.1.1",
+								"get-intrinsic": "^1.0.2"
+							}
+						}
+					}
+				}
 			}
 		},
 		"arrify": {
@@ -808,44 +1122,57 @@
 			"integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
 			"dev": true
 		},
-		"at-least-node": {
-			"version": "1.0.0",
-			"resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
-			"integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
-			"dev": true
-		},
 		"autoprefixer": {
-			"version": "10.2.6",
-			"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.2.6.tgz",
-			"integrity": "sha512-8lChSmdU6dCNMCQopIf4Pe5kipkAGj/fvTMslCsih0uHpOrXOPUEVOmYMMqmw3cekQkSD7EhIeuYl5y0BLdKqg==",
+			"version": "10.4.0",
+			"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.0.tgz",
+			"integrity": "sha512-7FdJ1ONtwzV1G43GDD0kpVMn/qbiNqyOPMFTX5nRffI+7vgWoFEc6DcXOxHJxrWNDXrZh18eDsZjvZGUljSRGA==",
 			"dev": true,
 			"requires": {
-				"browserslist": "^4.16.6",
-				"caniuse-lite": "^1.0.30001230",
-				"colorette": "^1.2.2",
+				"browserslist": "^4.17.5",
+				"caniuse-lite": "^1.0.30001272",
 				"fraction.js": "^4.1.1",
 				"normalize-range": "^0.1.2",
+				"picocolors": "^1.0.0",
 				"postcss-value-parser": "^4.1.0"
 			},
 			"dependencies": {
+				"browserslist": {
+					"version": "4.17.6",
+					"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.6.tgz",
+					"integrity": "sha512-uPgz3vyRTlEiCv4ee9KlsKgo2V6qPk7Jsn0KAn2OBqbqKo3iNcPEC1Ti6J4dwnz+aIRfEEEuOzC9IBk8tXUomw==",
+					"dev": true,
+					"requires": {
+						"caniuse-lite": "^1.0.30001274",
+						"electron-to-chromium": "^1.3.886",
+						"escalade": "^3.1.1",
+						"node-releases": "^2.0.1",
+						"picocolors": "^1.0.0"
+					}
+				},
 				"caniuse-lite": {
-					"version": "1.0.30001235",
-					"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001235.tgz",
-					"integrity": "sha512-zWEwIVqnzPkSAXOUlQnPW2oKoYb2aLQ4Q5ejdjBcnH63rfypaW34CxaeBn1VMya2XaEU3P/R2qHpWyj+l0BT1A==",
+					"version": "1.0.30001278",
+					"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001278.tgz",
+					"integrity": "sha512-mpF9KeH8u5cMoEmIic/cr7PNS+F5LWBk0t2ekGT60lFf0Wq+n9LspAj0g3P+o7DQhD3sUdlMln4YFAWhFYn9jg==",
 					"dev": true
 				},
-				"colorette": {
-					"version": "1.2.2",
-					"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
-					"integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
+				"electron-to-chromium": {
+					"version": "1.3.890",
+					"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.890.tgz",
+					"integrity": "sha512-VWlVXSkv0cA/OOehrEyqjUTHwV8YXCPTfPvbtoeU2aHR21vI4Ejh5aC4AxUwOmbLbBgb6Gd3URZahoCxtBqCYQ==",
+					"dev": true
+				},
+				"node-releases": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz",
+					"integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==",
 					"dev": true
 				}
 			}
 		},
 		"axe-core": {
-			"version": "4.2.2",
-			"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.2.2.tgz",
-			"integrity": "sha512-OKRkKM4ojMEZRJ5UNJHmq9tht7cEnRnqKG6KyB/trYws00Xtkv12mHtlJ0SK7cmuNbrU8dPUova3ELTuilfBbw==",
+			"version": "4.3.5",
+			"resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.3.5.tgz",
+			"integrity": "sha512-WKTW1+xAzhMS5dJsxWkliixlO/PqC4VhmO9T4juNYcaTg9jzWiJsou6m5pxWYGfigWbwzJWeFY6z47a+4neRXA==",
 			"dev": true
 		},
 		"axobject-query": {
@@ -889,9 +1216,9 @@
 			"dev": true
 		},
 		"binary-extensions": {
-			"version": "2.1.0",
-			"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
-			"integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
+			"version": "2.2.0",
+			"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+			"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
 			"dev": true
 		},
 		"brace-expansion": {
@@ -973,6 +1300,18 @@
 				"quick-lru": "^4.0.1"
 			}
 		},
+		"caniuse-api": {
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+			"integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+			"dev": true,
+			"requires": {
+				"browserslist": "^4.0.0",
+				"caniuse-lite": "^1.0.0",
+				"lodash.memoize": "^4.1.2",
+				"lodash.uniq": "^4.5.0"
+			}
+		},
 		"caniuse-lite": {
 			"version": "1.0.30001164",
 			"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001164.tgz",
@@ -1009,28 +1348,28 @@
 			"dev": true
 		},
 		"chokidar": {
-			"version": "3.4.3",
-			"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz",
-			"integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==",
+			"version": "3.5.2",
+			"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz",
+			"integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==",
 			"dev": true,
 			"requires": {
-				"anymatch": "~3.1.1",
+				"anymatch": "~3.1.2",
 				"braces": "~3.0.2",
-				"fsevents": "~2.1.2",
-				"glob-parent": "~5.1.0",
+				"fsevents": "~2.3.2",
+				"glob-parent": "~5.1.2",
 				"is-binary-path": "~2.1.0",
 				"is-glob": "~4.0.1",
 				"normalize-path": "~3.0.0",
-				"readdirp": "~3.5.0"
+				"readdirp": "~3.6.0"
 			}
 		},
 		"chokidar-cli": {
-			"version": "2.1.0",
-			"resolved": "https://registry.npmjs.org/chokidar-cli/-/chokidar-cli-2.1.0.tgz",
-			"integrity": "sha512-6n21AVpW6ywuEPoxJcLXMA2p4T+SLjWsXKny/9yTWFz0kKxESI3eUylpeV97LylING/27T/RVTY0f2/0QaWq9Q==",
+			"version": "3.0.0",
+			"resolved": "https://registry.npmjs.org/chokidar-cli/-/chokidar-cli-3.0.0.tgz",
+			"integrity": "sha512-xVW+Qeh7z15uZRxHOkP93Ux8A0xbPzwK4GaqD8dQOYc34TlkqUhVSS59fK36DOp5WdJlrRzlYSy02Ht99FjZqQ==",
 			"dev": true,
 			"requires": {
-				"chokidar": "^3.2.3",
+				"chokidar": "^3.5.2",
 				"lodash.debounce": "^4.0.8",
 				"lodash.throttle": "^4.1.1",
 				"yargs": "^13.3.0"
@@ -1078,9 +1417,9 @@
 			"dev": true
 		},
 		"comment-parser": {
-			"version": "0.7.6",
-			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-0.7.6.tgz",
-			"integrity": "sha512-GKNxVA7/iuTnAqGADlTWX4tkhzxZKXp5fLJqKTlQLHkE65XDUKutZ3BHaJC5IGcper2tT3QRD1xr4o3jNpgXXg==",
+			"version": "1.2.4",
+			"resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.2.4.tgz",
+			"integrity": "sha512-pm0b+qv+CkWNriSTMsfnjChF9kH0kxz55y44Wo5le9qLxMj5xDQAaEd9ZN1ovSuk9CsrncWaFwgpOMg7ClJwkw==",
 			"dev": true
 		},
 		"concat-map": {
@@ -1099,9 +1438,9 @@
 			}
 		},
 		"core-js-pure": {
-			"version": "3.14.0",
-			"resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.14.0.tgz",
-			"integrity": "sha512-YVh+LN2FgNU0odThzm61BsdkwrbrchumFq3oztnE9vTKC4KS2fvnPmcx8t6jnqAyOTCTF4ZSiuK8Qhh7SNcL4g==",
+			"version": "3.19.1",
+			"resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.19.1.tgz",
+			"integrity": "sha512-Q0Knr8Es84vtv62ei6/6jXH/7izKmOrtrxH9WJTHLCMAVeU+8TF8z8Nr08CsH4Ot0oJKzBzJJL9SJBYIv7WlfQ==",
 			"dev": true
 		},
 		"cosmiconfig": {
@@ -1134,6 +1473,12 @@
 			"integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
 			"dev": true
 		},
+		"cssnano-utils": {
+			"version": "2.0.1",
+			"resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-2.0.1.tgz",
+			"integrity": "sha512-i8vLRZTnEH9ubIyfdZCAdIdgnHAUeQeByEeQ2I7oTilvP9oHO6RScpeq3GsFUVqeB8uZgOQ9pw8utofNn32hhQ==",
+			"dev": true
+		},
 		"damerau-levenshtein": {
 			"version": "1.0.7",
 			"resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.7.tgz",
@@ -1174,9 +1519,9 @@
 			}
 		},
 		"deep-is": {
-			"version": "0.1.3",
-			"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
-			"integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+			"version": "0.1.4",
+			"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+			"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
 			"dev": true
 		},
 		"define-properties": {
@@ -1189,9 +1534,9 @@
 			}
 		},
 		"dependency-graph": {
-			"version": "0.9.0",
-			"resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.9.0.tgz",
-			"integrity": "sha512-9YLIBURXj4DJMFALxXw9K3Y3rwb5Fk0X5/8ipCzaN84+gKxoHK43tVKRNakCQbiEx07E8Uwhuq21BpUagFhZ8w==",
+			"version": "0.11.0",
+			"resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz",
+			"integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==",
 			"dev": true
 		},
 		"dir-glob": {
@@ -1341,36 +1686,36 @@
 			"dev": true
 		},
 		"eslint": {
-			"version": "7.28.0",
-			"resolved": "https://registry.npmjs.org/eslint/-/eslint-7.28.0.tgz",
-			"integrity": "sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g==",
+			"version": "8.2.0",
+			"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.2.0.tgz",
+			"integrity": "sha512-erw7XmM+CLxTOickrimJ1SiF55jiNlVSp2qqm0NuBWPtHYQCegD5ZMaW0c3i5ytPqL+SSLaCxdvQXFPLJn+ABw==",
 			"dev": true,
 			"requires": {
-				"@babel/code-frame": "7.12.11",
-				"@eslint/eslintrc": "^0.4.2",
+				"@eslint/eslintrc": "^1.0.4",
+				"@humanwhocodes/config-array": "^0.6.0",
 				"ajv": "^6.10.0",
 				"chalk": "^4.0.0",
 				"cross-spawn": "^7.0.2",
-				"debug": "^4.0.1",
+				"debug": "^4.3.2",
 				"doctrine": "^3.0.0",
 				"enquirer": "^2.3.5",
 				"escape-string-regexp": "^4.0.0",
-				"eslint-scope": "^5.1.1",
-				"eslint-utils": "^2.1.0",
-				"eslint-visitor-keys": "^2.0.0",
-				"espree": "^7.3.1",
+				"eslint-scope": "^6.0.0",
+				"eslint-utils": "^3.0.0",
+				"eslint-visitor-keys": "^3.0.0",
+				"espree": "^9.0.0",
 				"esquery": "^1.4.0",
 				"esutils": "^2.0.2",
 				"fast-deep-equal": "^3.1.3",
 				"file-entry-cache": "^6.0.1",
 				"functional-red-black-tree": "^1.0.1",
-				"glob-parent": "^5.1.2",
+				"glob-parent": "^6.0.1",
 				"globals": "^13.6.0",
 				"ignore": "^4.0.6",
 				"import-fresh": "^3.0.0",
 				"imurmurhash": "^0.1.4",
 				"is-glob": "^4.0.0",
-				"js-yaml": "^3.13.1",
+				"js-yaml": "^4.1.0",
 				"json-stable-stringify-without-jsonify": "^1.0.1",
 				"levn": "^0.4.1",
 				"lodash.merge": "^4.6.2",
@@ -1378,28 +1723,18 @@
 				"natural-compare": "^1.4.0",
 				"optionator": "^0.9.1",
 				"progress": "^2.0.0",
-				"regexpp": "^3.1.0",
+				"regexpp": "^3.2.0",
 				"semver": "^7.2.1",
-				"strip-ansi": "^6.0.0",
+				"strip-ansi": "^6.0.1",
 				"strip-json-comments": "^3.1.0",
-				"table": "^6.0.9",
 				"text-table": "^0.2.0",
 				"v8-compile-cache": "^2.0.3"
 			},
 			"dependencies": {
-				"@babel/code-frame": {
-					"version": "7.12.11",
-					"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
-					"integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
-					"dev": true,
-					"requires": {
-						"@babel/highlight": "^7.10.4"
-					}
-				},
 				"ansi-regex": {
-					"version": "5.0.0",
-					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-					"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+					"version": "5.0.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+					"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 					"dev": true
 				},
 				"ansi-styles": {
@@ -1412,9 +1747,9 @@
 					}
 				},
 				"chalk": {
-					"version": "4.1.1",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
-					"integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
+					"version": "4.1.2",
+					"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+					"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
 					"dev": true,
 					"requires": {
 						"ansi-styles": "^4.1.0",
@@ -1436,6 +1771,15 @@
 					"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
 					"dev": true
 				},
+				"debug": {
+					"version": "4.3.2",
+					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+					"integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+					"dev": true,
+					"requires": {
+						"ms": "2.1.2"
+					}
+				},
 				"doctrine": {
 					"version": "3.0.0",
 					"resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
@@ -1451,27 +1795,52 @@
 					"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
 					"dev": true
 				},
-				"eslint-utils": {
-					"version": "2.1.0",
-					"resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
-					"integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+				"eslint-scope": {
+					"version": "6.0.0",
+					"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-6.0.0.tgz",
+					"integrity": "sha512-uRDL9MWmQCkaFus8RF5K9/L/2fn+80yoW3jkD53l4shjCh26fCtvJGasxjUqP5OT87SYTxCVA3BwTUzuELx9kA==",
+					"dev": true,
+					"requires": {
+						"esrecurse": "^4.3.0",
+						"estraverse": "^5.2.0"
+					}
+				},
+				"eslint-visitor-keys": {
+					"version": "3.1.0",
+					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz",
+					"integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==",
+					"dev": true
+				},
+				"estraverse": {
+					"version": "5.3.0",
+					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+					"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+					"dev": true
+				},
+				"glob-parent": {
+					"version": "6.0.2",
+					"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+					"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
 					"dev": true,
 					"requires": {
-						"eslint-visitor-keys": "^1.1.0"
+						"is-glob": "^4.0.3"
 					},
 					"dependencies": {
-						"eslint-visitor-keys": {
-							"version": "1.3.0",
-							"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-							"integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
-							"dev": true
+						"is-glob": {
+							"version": "4.0.3",
+							"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+							"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+							"dev": true,
+							"requires": {
+								"is-extglob": "^2.1.1"
+							}
 						}
 					}
 				},
 				"globals": {
-					"version": "13.9.0",
-					"resolved": "https://registry.npmjs.org/globals/-/globals-13.9.0.tgz",
-					"integrity": "sha512-74/FduwI/JaIrr1H8e71UbDE+5x7pIPs1C2rrwC52SszOo043CsWOZEMW7o2Y58xwm9b+0RBKDxY5n2sUpEFxA==",
+					"version": "13.12.0",
+					"resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz",
+					"integrity": "sha512-uS8X6lSKN2JumVoXrbUz+uG4BYG+eiawqm3qFcT7ammfbUHeCBoJMlHcec/S3krSk73/AE/f0szYFmgAA3kYZg==",
 					"dev": true,
 					"requires": {
 						"type-fest": "^0.20.2"
@@ -1490,12 +1859,12 @@
 					"dev": true
 				},
 				"strip-ansi": {
-					"version": "6.0.0",
-					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-					"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+					"version": "6.0.1",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+					"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 					"dev": true,
 					"requires": {
-						"ansi-regex": "^5.0.0"
+						"ansi-regex": "^5.0.1"
 					}
 				},
 				"supports-color": {
@@ -1522,39 +1891,44 @@
 			"dev": true
 		},
 		"eslint-import-resolver-node": {
-			"version": "0.3.4",
-			"resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
-			"integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==",
+			"version": "0.3.6",
+			"resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz",
+			"integrity": "sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==",
 			"dev": true,
 			"requires": {
-				"debug": "^2.6.9",
-				"resolve": "^1.13.1"
+				"debug": "^3.2.7",
+				"resolve": "^1.20.0"
 			},
 			"dependencies": {
 				"debug": {
-					"version": "2.6.9",
-					"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-					"integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+					"version": "3.2.7",
+					"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+					"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
 					"dev": true,
 					"requires": {
-						"ms": "2.0.0"
+						"ms": "^2.1.1"
+					}
+				},
+				"resolve": {
+					"version": "1.20.0",
+					"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
+					"integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
+					"dev": true,
+					"requires": {
+						"is-core-module": "^2.2.0",
+						"path-parse": "^1.0.6"
 					}
-				},
-				"ms": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-					"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
-					"dev": true
 				}
 			}
 		},
 		"eslint-module-utils": {
-			"version": "2.6.1",
-			"resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.1.tgz",
-			"integrity": "sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A==",
+			"version": "2.7.1",
+			"resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.1.tgz",
+			"integrity": "sha512-fjoetBXQZq2tSTWZ9yWVl2KuFrTZZH3V+9iD1V1RfpDgxzJR+mPd/KZmMiA8gbPqdBzpNiEHOuT7IYEWxrH0zQ==",
 			"dev": true,
 			"requires": {
 				"debug": "^3.2.7",
+				"find-up": "^2.1.0",
 				"pkg-dir": "^2.0.0"
 			},
 			"dependencies": {
@@ -1570,26 +1944,24 @@
 			}
 		},
 		"eslint-plugin-import": {
-			"version": "2.23.4",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.23.4.tgz",
-			"integrity": "sha512-6/wP8zZRsnQFiR3iaPFgh5ImVRM1WN5NUWfTIRqwOdeiGJlBcSk82o1FEVq8yXmy4lkIzTo7YhHCIxlU/2HyEQ==",
+			"version": "2.25.2",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.25.2.tgz",
+			"integrity": "sha512-qCwQr9TYfoBHOFcVGKY9C9unq05uOxxdklmBXLVvcwo68y5Hta6/GzCZEMx2zQiu0woKNEER0LE7ZgaOfBU14g==",
 			"dev": true,
 			"requires": {
-				"array-includes": "^3.1.3",
-				"array.prototype.flat": "^1.2.4",
+				"array-includes": "^3.1.4",
+				"array.prototype.flat": "^1.2.5",
 				"debug": "^2.6.9",
 				"doctrine": "^2.1.0",
-				"eslint-import-resolver-node": "^0.3.4",
-				"eslint-module-utils": "^2.6.1",
-				"find-up": "^2.0.0",
+				"eslint-import-resolver-node": "^0.3.6",
+				"eslint-module-utils": "^2.7.0",
 				"has": "^1.0.3",
-				"is-core-module": "^2.4.0",
+				"is-core-module": "^2.7.0",
+				"is-glob": "^4.0.3",
 				"minimatch": "^3.0.4",
-				"object.values": "^1.1.3",
-				"pkg-up": "^2.0.0",
-				"read-pkg-up": "^3.0.0",
+				"object.values": "^1.1.5",
 				"resolve": "^1.20.0",
-				"tsconfig-paths": "^3.9.0"
+				"tsconfig-paths": "^3.11.0"
 			},
 			"dependencies": {
 				"debug": {
@@ -1601,32 +1973,22 @@
 						"ms": "2.0.0"
 					}
 				},
-				"find-up": {
-					"version": "2.1.0",
-					"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-					"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-					"dev": true,
-					"requires": {
-						"locate-path": "^2.0.0"
-					}
-				},
 				"is-core-module": {
-					"version": "2.4.0",
-					"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.4.0.tgz",
-					"integrity": "sha512-6A2fkfq1rfeQZjxrZJGerpLCTHRNEBiSgnu0+obeJpEPZRUooHgsizvzv0ZjJwOz3iWIHdJtVWJ/tmPr3D21/A==",
+					"version": "2.8.0",
+					"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz",
+					"integrity": "sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==",
 					"dev": true,
 					"requires": {
 						"has": "^1.0.3"
 					}
 				},
-				"locate-path": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-					"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
+				"is-glob": {
+					"version": "4.0.3",
+					"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+					"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
 					"dev": true,
 					"requires": {
-						"p-locate": "^2.0.0",
-						"path-exists": "^3.0.0"
+						"is-extglob": "^2.1.1"
 					}
 				},
 				"ms": {
@@ -1635,30 +1997,6 @@
 					"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
 					"dev": true
 				},
-				"p-limit": {
-					"version": "1.3.0",
-					"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-					"integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-					"dev": true,
-					"requires": {
-						"p-try": "^1.0.0"
-					}
-				},
-				"p-locate": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-					"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-					"dev": true,
-					"requires": {
-						"p-limit": "^1.1.0"
-					}
-				},
-				"p-try": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-					"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
-					"dev": true
-				},
 				"resolve": {
 					"version": "1.20.0",
 					"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
@@ -1672,27 +2010,40 @@
 			}
 		},
 		"eslint-plugin-jest": {
-			"version": "24.3.6",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.3.6.tgz",
-			"integrity": "sha512-WOVH4TIaBLIeCX576rLcOgjNXqP+jNlCiEmRgFTfQtJ52DpwnIQKAVGlGPAN7CZ33bW6eNfHD6s8ZbEUTQubJg==",
+			"version": "24.7.0",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-24.7.0.tgz",
+			"integrity": "sha512-wUxdF2bAZiYSKBclsUMrYHH6WxiBreNjyDxbRv345TIvPeoCEgPNEn3Sa+ZrSqsf1Dl9SqqSREXMHExlMMu1DA==",
 			"dev": true,
 			"requires": {
 				"@typescript-eslint/experimental-utils": "^4.0.1"
 			}
 		},
 		"eslint-plugin-jsdoc": {
-			"version": "30.7.13",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-30.7.13.tgz",
-			"integrity": "sha512-YM4WIsmurrp0rHX6XiXQppqKB8Ne5ATiZLJe2+/fkp9l9ExXFr43BbAbjZaVrpCT+tuPYOZ8k1MICARHnURUNQ==",
+			"version": "36.1.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-36.1.1.tgz",
+			"integrity": "sha512-nuLDvH1EJaKx0PCa9oeQIxH6pACIhZd1gkalTUxZbaxxwokjs7TplqY0Q8Ew3CoZaf5aowm0g/Z3JGHCatt+gQ==",
 			"dev": true,
 			"requires": {
-				"comment-parser": "^0.7.6",
-				"debug": "^4.3.1",
-				"jsdoctypeparser": "^9.0.0",
-				"lodash": "^4.17.20",
-				"regextras": "^0.7.1",
-				"semver": "^7.3.4",
+				"@es-joy/jsdoccomment": "0.10.8",
+				"comment-parser": "1.2.4",
+				"debug": "^4.3.2",
+				"esquery": "^1.4.0",
+				"jsdoc-type-pratt-parser": "^1.1.1",
+				"lodash": "^4.17.21",
+				"regextras": "^0.8.0",
+				"semver": "^7.3.5",
 				"spdx-expression-parse": "^3.0.1"
+			},
+			"dependencies": {
+				"debug": {
+					"version": "4.3.2",
+					"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz",
+					"integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==",
+					"dev": true,
+					"requires": {
+						"ms": "2.1.2"
+					}
+				}
 			}
 		},
 		"eslint-plugin-jsx-a11y": {
@@ -1715,34 +2066,42 @@
 			}
 		},
 		"eslint-plugin-prettier": {
-			"version": "3.4.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz",
-			"integrity": "sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw==",
+			"version": "3.4.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz",
+			"integrity": "sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g==",
 			"dev": true,
 			"requires": {
 				"prettier-linter-helpers": "^1.0.0"
 			}
 		},
 		"eslint-plugin-react": {
-			"version": "7.24.0",
-			"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.24.0.tgz",
-			"integrity": "sha512-KJJIx2SYx7PBx3ONe/mEeMz4YE0Lcr7feJTCMyyKb/341NcjuAgim3Acgan89GfPv7nxXK2+0slu0CWXYM4x+Q==",
+			"version": "7.26.1",
+			"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.26.1.tgz",
+			"integrity": "sha512-Lug0+NOFXeOE+ORZ5pbsh6mSKjBKXDXItUD2sQoT+5Yl0eoT82DqnXeTMfUare4QVCn9QwXbfzO/dBLjLXwVjQ==",
 			"dev": true,
 			"requires": {
 				"array-includes": "^3.1.3",
 				"array.prototype.flatmap": "^1.2.4",
 				"doctrine": "^2.1.0",
-				"has": "^1.0.3",
+				"estraverse": "^5.2.0",
 				"jsx-ast-utils": "^2.4.1 || ^3.0.0",
 				"minimatch": "^3.0.4",
 				"object.entries": "^1.1.4",
 				"object.fromentries": "^2.0.4",
+				"object.hasown": "^1.0.0",
 				"object.values": "^1.1.4",
 				"prop-types": "^15.7.2",
 				"resolve": "^2.0.0-next.3",
+				"semver": "^6.3.0",
 				"string.prototype.matchall": "^4.0.5"
 			},
 			"dependencies": {
+				"estraverse": {
+					"version": "5.3.0",
+					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+					"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+					"dev": true
+				},
 				"resolve": {
 					"version": "2.0.0-next.3",
 					"resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.3.tgz",
@@ -1752,6 +2111,12 @@
 						"is-core-module": "^2.2.0",
 						"path-parse": "^1.0.6"
 					}
+				},
+				"semver": {
+					"version": "6.3.0",
+					"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+					"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+					"dev": true
 				}
 			}
 		},
@@ -1787,30 +2152,24 @@
 			"dev": true
 		},
 		"espree": {
-			"version": "7.3.1",
-			"resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
-			"integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
+			"version": "9.0.0",
+			"resolved": "https://registry.npmjs.org/espree/-/espree-9.0.0.tgz",
+			"integrity": "sha512-r5EQJcYZ2oaGbeR0jR0fFVijGOcwai07/690YRXLINuhmVeRY4UKSAsQPe/0BNuDgwP7Ophoc1PRsr2E3tkbdQ==",
 			"dev": true,
 			"requires": {
-				"acorn": "^7.4.0",
+				"acorn": "^8.5.0",
 				"acorn-jsx": "^5.3.1",
-				"eslint-visitor-keys": "^1.3.0"
+				"eslint-visitor-keys": "^3.0.0"
 			},
 			"dependencies": {
 				"eslint-visitor-keys": {
-					"version": "1.3.0",
-					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
-					"integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+					"version": "3.1.0",
+					"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.1.0.tgz",
+					"integrity": "sha512-yWJFpu4DtjsWKkt5GeNBBuZMlNcYVs6vRCLoCVEJrTjaSB6LC98gFipNK/erM2Heg/E8mIK+hXG/pJMLK+eRZA==",
 					"dev": true
 				}
 			}
 		},
-		"esprima": {
-			"version": "4.0.1",
-			"resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-			"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-			"dev": true
-		},
 		"esquery": {
 			"version": "1.4.0",
 			"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
@@ -1821,9 +2180,9 @@
 			},
 			"dependencies": {
 				"estraverse": {
-					"version": "5.2.0",
-					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-					"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+					"version": "5.3.0",
+					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+					"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
 					"dev": true
 				}
 			}
@@ -1838,9 +2197,9 @@
 			},
 			"dependencies": {
 				"estraverse": {
-					"version": "5.2.0",
-					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
-					"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+					"version": "5.3.0",
+					"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+					"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
 					"dev": true
 				}
 			}
@@ -1944,12 +2303,12 @@
 			}
 		},
 		"find-up": {
-			"version": "3.0.0",
-			"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-			"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+			"version": "2.1.0",
+			"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
+			"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
 			"dev": true,
 			"requires": {
-				"locate-path": "^3.0.0"
+				"locate-path": "^2.0.0"
 			}
 		},
 		"flat-cache": {
@@ -1975,12 +2334,11 @@
 			"dev": true
 		},
 		"fs-extra": {
-			"version": "9.1.0",
-			"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz",
-			"integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==",
+			"version": "10.0.0",
+			"resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.0.tgz",
+			"integrity": "sha512-C5owb14u9eJwizKGdchcDUQeFtlSHHthBk8pbX9Vc1PFZrLombudjDnNns88aYslCyF6IY5SUw3Roz6xShcEIQ==",
 			"dev": true,
 			"requires": {
-				"at-least-node": "^1.0.0",
 				"graceful-fs": "^4.2.0",
 				"jsonfile": "^6.0.1",
 				"universalify": "^2.0.0"
@@ -1993,9 +2351,9 @@
 			"dev": true
 		},
 		"fsevents": {
-			"version": "2.1.3",
-			"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
-			"integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+			"version": "2.3.2",
+			"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+			"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
 			"dev": true,
 			"optional": true
 		},
@@ -2040,6 +2398,39 @@
 			"integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==",
 			"dev": true
 		},
+		"get-symbol-description": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz",
+			"integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==",
+			"dev": true,
+			"requires": {
+				"call-bind": "^1.0.2",
+				"get-intrinsic": "^1.1.1"
+			},
+			"dependencies": {
+				"call-bind": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+					"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+					"dev": true,
+					"requires": {
+						"function-bind": "^1.1.1",
+						"get-intrinsic": "^1.0.2"
+					}
+				},
+				"get-intrinsic": {
+					"version": "1.1.1",
+					"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+					"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+					"dev": true,
+					"requires": {
+						"function-bind": "^1.1.1",
+						"has": "^1.0.3",
+						"has-symbols": "^1.0.1"
+					}
+				}
+			}
+		},
 		"glob": {
 			"version": "7.1.7",
 			"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
@@ -2171,6 +2562,23 @@
 			"integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
 			"dev": true
 		},
+		"has-tostringtag": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz",
+			"integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==",
+			"dev": true,
+			"requires": {
+				"has-symbols": "^1.0.2"
+			},
+			"dependencies": {
+				"has-symbols": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+					"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+					"dev": true
+				}
+			}
+		},
 		"hosted-git-info": {
 			"version": "2.8.9",
 			"resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
@@ -2332,10 +2740,13 @@
 			"dev": true
 		},
 		"is-bigint": {
-			"version": "1.0.2",
-			"resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz",
-			"integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==",
-			"dev": true
+			"version": "1.0.4",
+			"resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+			"integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+			"dev": true,
+			"requires": {
+				"has-bigints": "^1.0.1"
+			}
 		},
 		"is-binary-path": {
 			"version": "2.1.0",
@@ -2347,12 +2758,13 @@
 			}
 		},
 		"is-boolean-object": {
-			"version": "1.1.1",
-			"resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz",
-			"integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==",
+			"version": "1.1.2",
+			"resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+			"integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
 			"dev": true,
 			"requires": {
-				"call-bind": "^1.0.2"
+				"call-bind": "^1.0.2",
+				"has-tostringtag": "^1.0.0"
 			},
 			"dependencies": {
 				"call-bind": {
@@ -2451,10 +2863,13 @@
 			"dev": true
 		},
 		"is-number-object": {
-			"version": "1.0.5",
-			"resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz",
-			"integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==",
-			"dev": true
+			"version": "1.0.6",
+			"resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.6.tgz",
+			"integrity": "sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==",
+			"dev": true,
+			"requires": {
+				"has-tostringtag": "^1.0.0"
+			}
 		},
 		"is-plain-obj": {
 			"version": "2.1.0",
@@ -2477,12 +2892,21 @@
 			"integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==",
 			"dev": true
 		},
-		"is-string": {
-			"version": "1.0.6",
-			"resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz",
-			"integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==",
+		"is-shared-array-buffer": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz",
+			"integrity": "sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==",
 			"dev": true
 		},
+		"is-string": {
+			"version": "1.0.7",
+			"resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+			"integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+			"dev": true,
+			"requires": {
+				"has-tostringtag": "^1.0.0"
+			}
+		},
 		"is-symbol": {
 			"version": "1.0.3",
 			"resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
@@ -2504,6 +2928,15 @@
 			"integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
 			"dev": true
 		},
+		"is-weakref": {
+			"version": "1.0.1",
+			"resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.1.tgz",
+			"integrity": "sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==",
+			"dev": true,
+			"requires": {
+				"call-bind": "^1.0.0"
+			}
+		},
 		"isexe": {
 			"version": "2.0.0",
 			"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
@@ -2517,19 +2950,18 @@
 			"dev": true
 		},
 		"js-yaml": {
-			"version": "3.14.1",
-			"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
-			"integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+			"version": "4.1.0",
+			"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+			"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
 			"dev": true,
 			"requires": {
-				"argparse": "^1.0.7",
-				"esprima": "^4.0.0"
+				"argparse": "^2.0.1"
 			}
 		},
-		"jsdoctypeparser": {
-			"version": "9.0.0",
-			"resolved": "https://registry.npmjs.org/jsdoctypeparser/-/jsdoctypeparser-9.0.0.tgz",
-			"integrity": "sha512-jrTA2jJIL6/DAEILBEh2/w9QxCuwmvNXIry39Ay/HVfhE3o2yVV0U44blYkqdHA/OKloJEqvJy0xU+GSdE2SIw==",
+		"jsdoc-type-pratt-parser": {
+			"version": "1.2.0",
+			"resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-1.2.0.tgz",
+			"integrity": "sha512-4STjeF14jp4bqha44nKMY1OUI6d2/g6uclHWUCZ7B4DoLzaB5bmpTkQrpqU+vSVzMD0LsKAOskcnI3I3VfIpmg==",
 			"dev": true
 		},
 		"jsesc": {
@@ -2582,12 +3014,12 @@
 			}
 		},
 		"jsx-ast-utils": {
-			"version": "3.2.0",
-			"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.0.tgz",
-			"integrity": "sha512-EIsmt3O3ljsU6sot/J4E1zDRxfBNrhjyf/OKjlydwgEimQuznlM4Wv7U+ueONJMyEn1WRE0K8dhi3dVAXYT24Q==",
+			"version": "3.2.1",
+			"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.2.1.tgz",
+			"integrity": "sha512-uP5vu8xfy2F9A6LGC22KO7e2/vGTS1MhP+18f++ZNlf0Ohaxbc9nIEwHAsejlJKyzfZzU5UIhe5ItYkitcZnZA==",
 			"dev": true,
 			"requires": {
-				"array-includes": "^3.1.2",
+				"array-includes": "^3.1.3",
 				"object.assign": "^4.1.2"
 			}
 		},
@@ -2628,6 +3060,12 @@
 				"type-check": "~0.4.0"
 			}
 		},
+		"lilconfig": {
+			"version": "2.0.4",
+			"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.0.4.tgz",
+			"integrity": "sha512-bfTIN7lEsiooCocSISTWXkiWJkRqtL9wYtYy+8EK3Y41qh3mpwPU0ycTOgjdY9ErwXCc8QyrQp82bdL0Xkm9yA==",
+			"dev": true
+		},
 		"lines-and-columns": {
 			"version": "1.1.6",
 			"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
@@ -2659,12 +3097,12 @@
 			}
 		},
 		"locate-path": {
-			"version": "3.0.0",
-			"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-			"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
+			"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
 			"dev": true,
 			"requires": {
-				"p-locate": "^3.0.0",
+				"p-locate": "^2.0.0",
 				"path-exists": "^3.0.0"
 			}
 		},
@@ -2710,6 +3148,12 @@
 			"integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=",
 			"dev": true
 		},
+		"lodash.memoize": {
+			"version": "4.1.2",
+			"resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+			"integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
+			"dev": true
+		},
 		"lodash.merge": {
 			"version": "4.6.2",
 			"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
@@ -2734,6 +3178,12 @@
 			"integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
 			"dev": true
 		},
+		"lodash.uniq": {
+			"version": "4.5.0",
+			"resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+			"integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
+			"dev": true
+		},
 		"log-symbols": {
 			"version": "4.1.0",
 			"resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
@@ -3098,12 +3548,6 @@
 				}
 			}
 		},
-		"mkdirp": {
-			"version": "1.0.4",
-			"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
-			"integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
-			"dev": true
-		},
 		"ms": {
 			"version": "2.1.2",
 			"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
@@ -3111,9 +3555,9 @@
 			"dev": true
 		},
 		"nanoid": {
-			"version": "3.1.23",
-			"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.23.tgz",
-			"integrity": "sha512-FiB0kzdP0FFVGDKlRLEQ1BgDzU87dy5NnzjeW9YZNt+/c3+q82EQDUwniSAUxp/F0gFNI1ZhKU1FqYsMuqZVnw==",
+			"version": "3.1.30",
+			"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.30.tgz",
+			"integrity": "sha512-zJpuPDwOv8D2zq2WRoMe1HsfZthVewpel9CAvTfc/2mBD1uUT/agc5f7GHGWXlYkFvi1mVxe4IjvP2HNrop7nQ==",
 			"dev": true
 		},
 		"natural-compare": {
@@ -3276,15 +3720,133 @@
 				"object-keys": "^1.1.1"
 			}
 		},
-		"object.entries": {
-			"version": "1.1.4",
-			"resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.4.tgz",
-			"integrity": "sha512-h4LWKWE+wKQGhtMjZEBud7uLGhqyLwj8fpHOarZhD2uY3C9cRtk57VQ89ke3moByLXMedqs3XCHzyb4AmA2DjA==",
+		"object.entries": {
+			"version": "1.1.5",
+			"resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.5.tgz",
+			"integrity": "sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==",
+			"dev": true,
+			"requires": {
+				"call-bind": "^1.0.2",
+				"define-properties": "^1.1.3",
+				"es-abstract": "^1.19.1"
+			},
+			"dependencies": {
+				"call-bind": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+					"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+					"dev": true,
+					"requires": {
+						"function-bind": "^1.1.1",
+						"get-intrinsic": "^1.0.2"
+					}
+				},
+				"es-abstract": {
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
+					"dev": true,
+					"requires": {
+						"call-bind": "^1.0.2",
+						"es-to-primitive": "^1.2.1",
+						"function-bind": "^1.1.1",
+						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
+						"has": "^1.0.3",
+						"has-symbols": "^1.0.2",
+						"internal-slot": "^1.0.3",
+						"is-callable": "^1.2.4",
+						"is-negative-zero": "^2.0.1",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
+						"object-inspect": "^1.11.0",
+						"object-keys": "^1.1.1",
+						"object.assign": "^4.1.2",
+						"string.prototype.trimend": "^1.0.4",
+						"string.prototype.trimstart": "^1.0.4",
+						"unbox-primitive": "^1.0.1"
+					},
+					"dependencies": {
+						"has-symbols": {
+							"version": "1.0.2",
+							"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+							"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+							"dev": true
+						}
+					}
+				},
+				"get-intrinsic": {
+					"version": "1.1.1",
+					"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
+					"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
+					"dev": true,
+					"requires": {
+						"function-bind": "^1.1.1",
+						"has": "^1.0.3",
+						"has-symbols": "^1.0.1"
+					}
+				},
+				"is-callable": {
+					"version": "1.2.4",
+					"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
+					"integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
+					"dev": true
+				},
+				"is-negative-zero": {
+					"version": "2.0.1",
+					"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
+					"integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
+					"dev": true
+				},
+				"is-regex": {
+					"version": "1.1.4",
+					"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+					"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+					"dev": true,
+					"requires": {
+						"call-bind": "^1.0.2",
+						"has-tostringtag": "^1.0.0"
+					}
+				},
+				"object-inspect": {
+					"version": "1.11.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
+					"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
+					"dev": true
+				},
+				"string.prototype.trimend": {
+					"version": "1.0.4",
+					"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
+					"integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
+					"dev": true,
+					"requires": {
+						"call-bind": "^1.0.2",
+						"define-properties": "^1.1.3"
+					}
+				},
+				"string.prototype.trimstart": {
+					"version": "1.0.4",
+					"resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
+					"integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
+					"dev": true,
+					"requires": {
+						"call-bind": "^1.0.2",
+						"define-properties": "^1.1.3"
+					}
+				}
+			}
+		},
+		"object.fromentries": {
+			"version": "2.0.5",
+			"resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.5.tgz",
+			"integrity": "sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==",
 			"dev": true,
 			"requires": {
 				"call-bind": "^1.0.2",
 				"define-properties": "^1.1.3",
-				"es-abstract": "^1.18.2"
+				"es-abstract": "^1.19.1"
 			},
 			"dependencies": {
 				"call-bind": {
@@ -3298,22 +3860,26 @@
 					}
 				},
 				"es-abstract": {
-					"version": "1.18.3",
-					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz",
-					"integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==",
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
 					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
 						"es-to-primitive": "^1.2.1",
 						"function-bind": "^1.1.1",
 						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
 						"has": "^1.0.3",
 						"has-symbols": "^1.0.2",
-						"is-callable": "^1.2.3",
+						"internal-slot": "^1.0.3",
+						"is-callable": "^1.2.4",
 						"is-negative-zero": "^2.0.1",
-						"is-regex": "^1.1.3",
-						"is-string": "^1.0.6",
-						"object-inspect": "^1.10.3",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
+						"object-inspect": "^1.11.0",
 						"object-keys": "^1.1.1",
 						"object.assign": "^4.1.2",
 						"string.prototype.trimend": "^1.0.4",
@@ -3341,9 +3907,9 @@
 					}
 				},
 				"is-callable": {
-					"version": "1.2.3",
-					"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
-					"integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==",
+					"version": "1.2.4",
+					"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
+					"integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
 					"dev": true
 				},
 				"is-negative-zero": {
@@ -3353,27 +3919,19 @@
 					"dev": true
 				},
 				"is-regex": {
-					"version": "1.1.3",
-					"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz",
-					"integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==",
+					"version": "1.1.4",
+					"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+					"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
 					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
-						"has-symbols": "^1.0.2"
-					},
-					"dependencies": {
-						"has-symbols": {
-							"version": "1.0.2",
-							"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
-							"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
-							"dev": true
-						}
+						"has-tostringtag": "^1.0.0"
 					}
 				},
 				"object-inspect": {
-					"version": "1.10.3",
-					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz",
-					"integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==",
+					"version": "1.11.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
+					"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
 					"dev": true
 				},
 				"string.prototype.trimend": {
@@ -3398,16 +3956,14 @@
 				}
 			}
 		},
-		"object.fromentries": {
-			"version": "2.0.4",
-			"resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.4.tgz",
-			"integrity": "sha512-EsFBshs5RUUpQEY1D4q/m59kMfz4YJvxuNCJcv/jWwOJr34EaVnG11ZrZa0UHB3wnzV1wx8m58T4hQL8IuNXlQ==",
+		"object.hasown": {
+			"version": "1.1.0",
+			"resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.0.tgz",
+			"integrity": "sha512-MhjYRfj3GBlhSkDHo6QmvgjRLXQ2zndabdf3nX0yTyZK9rPfxb6uRpAac8HXNLy1GpqWtZ81Qh4v3uOls2sRAg==",
 			"dev": true,
 			"requires": {
-				"call-bind": "^1.0.2",
 				"define-properties": "^1.1.3",
-				"es-abstract": "^1.18.0-next.2",
-				"has": "^1.0.3"
+				"es-abstract": "^1.19.1"
 			},
 			"dependencies": {
 				"call-bind": {
@@ -3421,35 +3977,31 @@
 					}
 				},
 				"es-abstract": {
-					"version": "1.18.3",
-					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz",
-					"integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==",
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
 					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
 						"es-to-primitive": "^1.2.1",
 						"function-bind": "^1.1.1",
 						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
 						"has": "^1.0.3",
 						"has-symbols": "^1.0.2",
-						"is-callable": "^1.2.3",
+						"internal-slot": "^1.0.3",
+						"is-callable": "^1.2.4",
 						"is-negative-zero": "^2.0.1",
-						"is-regex": "^1.1.3",
-						"is-string": "^1.0.6",
-						"object-inspect": "^1.10.3",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
+						"object-inspect": "^1.11.0",
 						"object-keys": "^1.1.1",
 						"object.assign": "^4.1.2",
 						"string.prototype.trimend": "^1.0.4",
 						"string.prototype.trimstart": "^1.0.4",
 						"unbox-primitive": "^1.0.1"
-					},
-					"dependencies": {
-						"has-symbols": {
-							"version": "1.0.2",
-							"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
-							"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
-							"dev": true
-						}
 					}
 				},
 				"get-intrinsic": {
@@ -3463,10 +4015,16 @@
 						"has-symbols": "^1.0.1"
 					}
 				},
+				"has-symbols": {
+					"version": "1.0.2",
+					"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
+					"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
+					"dev": true
+				},
 				"is-callable": {
-					"version": "1.2.3",
-					"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
-					"integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==",
+					"version": "1.2.4",
+					"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
+					"integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
 					"dev": true
 				},
 				"is-negative-zero": {
@@ -3476,27 +4034,19 @@
 					"dev": true
 				},
 				"is-regex": {
-					"version": "1.1.3",
-					"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz",
-					"integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==",
+					"version": "1.1.4",
+					"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+					"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
 					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
-						"has-symbols": "^1.0.2"
-					},
-					"dependencies": {
-						"has-symbols": {
-							"version": "1.0.2",
-							"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
-							"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
-							"dev": true
-						}
+						"has-tostringtag": "^1.0.0"
 					}
 				},
 				"object-inspect": {
-					"version": "1.10.3",
-					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz",
-					"integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==",
+					"version": "1.11.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
+					"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
 					"dev": true
 				},
 				"string.prototype.trimend": {
@@ -3522,14 +4072,14 @@
 			}
 		},
 		"object.values": {
-			"version": "1.1.4",
-			"resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.4.tgz",
-			"integrity": "sha512-TnGo7j4XSnKQoK3MfvkzqKCi0nVe/D9I9IjwTNYdb/fxYHpjrluHVOgw0AF6jrRFGMPHdfuidR09tIDiIvnaSg==",
+			"version": "1.1.5",
+			"resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz",
+			"integrity": "sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==",
 			"dev": true,
 			"requires": {
 				"call-bind": "^1.0.2",
 				"define-properties": "^1.1.3",
-				"es-abstract": "^1.18.2"
+				"es-abstract": "^1.19.1"
 			},
 			"dependencies": {
 				"call-bind": {
@@ -3543,22 +4093,26 @@
 					}
 				},
 				"es-abstract": {
-					"version": "1.18.3",
-					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz",
-					"integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==",
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
 					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
 						"es-to-primitive": "^1.2.1",
 						"function-bind": "^1.1.1",
 						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
 						"has": "^1.0.3",
 						"has-symbols": "^1.0.2",
-						"is-callable": "^1.2.3",
+						"internal-slot": "^1.0.3",
+						"is-callable": "^1.2.4",
 						"is-negative-zero": "^2.0.1",
-						"is-regex": "^1.1.3",
-						"is-string": "^1.0.6",
-						"object-inspect": "^1.10.3",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
+						"object-inspect": "^1.11.0",
 						"object-keys": "^1.1.1",
 						"object.assign": "^4.1.2",
 						"string.prototype.trimend": "^1.0.4",
@@ -3586,9 +4140,9 @@
 					}
 				},
 				"is-callable": {
-					"version": "1.2.3",
-					"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
-					"integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==",
+					"version": "1.2.4",
+					"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
+					"integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
 					"dev": true
 				},
 				"is-negative-zero": {
@@ -3598,27 +4152,19 @@
 					"dev": true
 				},
 				"is-regex": {
-					"version": "1.1.3",
-					"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz",
-					"integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==",
+					"version": "1.1.4",
+					"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+					"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
 					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
-						"has-symbols": "^1.0.2"
-					},
-					"dependencies": {
-						"has-symbols": {
-							"version": "1.0.2",
-							"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
-							"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
-							"dev": true
-						}
+						"has-tostringtag": "^1.0.0"
 					}
 				},
 				"object-inspect": {
-					"version": "1.10.3",
-					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz",
-					"integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==",
+					"version": "1.11.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
+					"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
 					"dev": true
 				},
 				"string.prototype.trimend": {
@@ -3676,12 +4222,29 @@
 			}
 		},
 		"p-locate": {
-			"version": "3.0.0",
-			"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-			"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+			"version": "2.0.0",
+			"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
+			"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
 			"dev": true,
 			"requires": {
-				"p-limit": "^2.0.0"
+				"p-limit": "^1.1.0"
+			},
+			"dependencies": {
+				"p-limit": {
+					"version": "1.3.0",
+					"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
+					"integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
+					"dev": true,
+					"requires": {
+						"p-try": "^1.0.0"
+					}
+				},
+				"p-try": {
+					"version": "1.0.0",
+					"resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
+					"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
+					"dev": true
+				}
 			}
 		},
 		"p-try": {
@@ -3744,9 +4307,9 @@
 			"dev": true
 		},
 		"path-parse": {
-			"version": "1.0.6",
-			"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-			"integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
+			"version": "1.0.7",
+			"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+			"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
 			"dev": true
 		},
 		"path-type": {
@@ -3755,6 +4318,12 @@
 			"integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
 			"dev": true
 		},
+		"picocolors": {
+			"version": "1.0.0",
+			"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+			"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==",
+			"dev": true
+		},
 		"picomatch": {
 			"version": "2.2.2",
 			"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
@@ -3780,124 +4349,17 @@
 			"dev": true,
 			"requires": {
 				"find-up": "^2.1.0"
-			},
-			"dependencies": {
-				"find-up": {
-					"version": "2.1.0",
-					"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-					"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-					"dev": true,
-					"requires": {
-						"locate-path": "^2.0.0"
-					}
-				},
-				"locate-path": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-					"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
-					"dev": true,
-					"requires": {
-						"p-locate": "^2.0.0",
-						"path-exists": "^3.0.0"
-					}
-				},
-				"p-limit": {
-					"version": "1.3.0",
-					"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-					"integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-					"dev": true,
-					"requires": {
-						"p-try": "^1.0.0"
-					}
-				},
-				"p-locate": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-					"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-					"dev": true,
-					"requires": {
-						"p-limit": "^1.1.0"
-					}
-				},
-				"p-try": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-					"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
-					"dev": true
-				}
-			}
-		},
-		"pkg-up": {
-			"version": "2.0.0",
-			"resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
-			"integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
-			"dev": true,
-			"requires": {
-				"find-up": "^2.1.0"
-			},
-			"dependencies": {
-				"find-up": {
-					"version": "2.1.0",
-					"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-					"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-					"dev": true,
-					"requires": {
-						"locate-path": "^2.0.0"
-					}
-				},
-				"locate-path": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-					"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
-					"dev": true,
-					"requires": {
-						"p-locate": "^2.0.0",
-						"path-exists": "^3.0.0"
-					}
-				},
-				"p-limit": {
-					"version": "1.3.0",
-					"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-					"integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-					"dev": true,
-					"requires": {
-						"p-try": "^1.0.0"
-					}
-				},
-				"p-locate": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-					"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-					"dev": true,
-					"requires": {
-						"p-limit": "^1.1.0"
-					}
-				},
-				"p-try": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-					"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
-					"dev": true
-				}
 			}
 		},
 		"postcss": {
-			"version": "8.3.0",
-			"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.0.tgz",
-			"integrity": "sha512-+ogXpdAjWGa+fdYY5BQ96V/6tAo+TdSSIMP5huJBIygdWwKtVoB5JWZ7yUd4xZ8r+8Kvvx4nyg/PQ071H4UtcQ==",
+			"version": "8.3.11",
+			"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.3.11.tgz",
+			"integrity": "sha512-hCmlUAIlUiav8Xdqw3Io4LcpA1DOt7h3LSTAC4G6JGHFFaWzI6qvFt9oilvl8BmkbBRX1IhM90ZAmpk68zccQA==",
 			"dev": true,
 			"requires": {
-				"colorette": "^1.2.2",
-				"nanoid": "^3.1.23",
+				"nanoid": "^3.1.30",
+				"picocolors": "^1.0.0",
 				"source-map-js": "^0.6.2"
-			},
-			"dependencies": {
-				"colorette": {
-					"version": "1.2.2",
-					"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
-					"integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
-					"dev": true
-				}
 			}
 		},
 		"postcss-calc": {
@@ -3911,29 +4373,29 @@
 			}
 		},
 		"postcss-cli": {
-			"version": "8.3.1",
-			"resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-8.3.1.tgz",
-			"integrity": "sha512-leHXsQRq89S3JC9zw/tKyiVV2jAhnfQe0J8VI4eQQbUjwIe0XxVqLrR+7UsahF1s9wi4GlqP6SJ8ydf44cgF2Q==",
+			"version": "9.0.2",
+			"resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-9.0.2.tgz",
+			"integrity": "sha512-08Wujoy7YGhKCFrGsT9OXqWjtHlGQ+JmyaD/4McjCiwor2IUTRVzXiJd+xmLTGdSWjceS6/TePaJQwBlkVWHiw==",
 			"dev": true,
 			"requires": {
-				"chalk": "^4.0.0",
 				"chokidar": "^3.3.0",
-				"dependency-graph": "^0.9.0",
-				"fs-extra": "^9.0.0",
-				"get-stdin": "^8.0.0",
-				"globby": "^11.0.0",
+				"dependency-graph": "^0.11.0",
+				"fs-extra": "^10.0.0",
+				"get-stdin": "^9.0.0",
+				"globby": "^12.0.0",
+				"picocolors": "^1.0.0",
 				"postcss-load-config": "^3.0.0",
 				"postcss-reporter": "^7.0.0",
 				"pretty-hrtime": "^1.0.3",
 				"read-cache": "^1.0.0",
-				"slash": "^3.0.0",
-				"yargs": "^16.0.0"
+				"slash": "^4.0.0",
+				"yargs": "^17.0.0"
 			},
 			"dependencies": {
 				"ansi-regex": {
-					"version": "5.0.0",
-					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-					"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+					"version": "5.0.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+					"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 					"dev": true
 				},
 				"ansi-styles": {
@@ -3945,15 +4407,11 @@
 						"color-convert": "^2.0.1"
 					}
 				},
-				"chalk": {
-					"version": "4.1.0",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-					"integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-					"dev": true,
-					"requires": {
-						"ansi-styles": "^4.1.0",
-						"supports-color": "^7.1.0"
-					}
+				"array-union": {
+					"version": "3.0.1",
+					"resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz",
+					"integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==",
+					"dev": true
 				},
 				"cliui": {
 					"version": "7.0.4",
@@ -3987,45 +4445,85 @@
 					"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
 					"dev": true
 				},
-				"has-flag": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-					"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+				"fast-glob": {
+					"version": "3.2.7",
+					"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz",
+					"integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==",
+					"dev": true,
+					"requires": {
+						"@nodelib/fs.stat": "^2.0.2",
+						"@nodelib/fs.walk": "^1.2.3",
+						"glob-parent": "^5.1.2",
+						"merge2": "^1.3.0",
+						"micromatch": "^4.0.4"
+					}
+				},
+				"get-stdin": {
+					"version": "9.0.0",
+					"resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz",
+					"integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==",
 					"dev": true
 				},
+				"globby": {
+					"version": "12.0.2",
+					"resolved": "https://registry.npmjs.org/globby/-/globby-12.0.2.tgz",
+					"integrity": "sha512-lAsmb/5Lww4r7MM9nCCliDZVIKbZTavrsunAsHLr9oHthrZP1qi7/gAnHOsUs9bLvEt2vKVJhHmxuL7QbDuPdQ==",
+					"dev": true,
+					"requires": {
+						"array-union": "^3.0.1",
+						"dir-glob": "^3.0.1",
+						"fast-glob": "^3.2.7",
+						"ignore": "^5.1.8",
+						"merge2": "^1.4.1",
+						"slash": "^4.0.0"
+					}
+				},
 				"is-fullwidth-code-point": {
 					"version": "3.0.0",
 					"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
 					"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
 					"dev": true
 				},
-				"string-width": {
-					"version": "4.2.2",
-					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz",
-					"integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==",
+				"micromatch": {
+					"version": "4.0.4",
+					"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
+					"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
 					"dev": true,
 					"requires": {
-						"emoji-regex": "^8.0.0",
-						"is-fullwidth-code-point": "^3.0.0",
-						"strip-ansi": "^6.0.0"
+						"braces": "^3.0.1",
+						"picomatch": "^2.2.3"
 					}
 				},
-				"strip-ansi": {
-					"version": "6.0.0",
-					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
-					"integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+				"picomatch": {
+					"version": "2.3.0",
+					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
+					"integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==",
+					"dev": true
+				},
+				"slash": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+					"integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+					"dev": true
+				},
+				"string-width": {
+					"version": "4.2.3",
+					"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+					"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
 					"dev": true,
 					"requires": {
-						"ansi-regex": "^5.0.0"
+						"emoji-regex": "^8.0.0",
+						"is-fullwidth-code-point": "^3.0.0",
+						"strip-ansi": "^6.0.1"
 					}
 				},
-				"supports-color": {
-					"version": "7.2.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-					"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+				"strip-ansi": {
+					"version": "6.0.1",
+					"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+					"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
 					"dev": true,
 					"requires": {
-						"has-flag": "^4.0.0"
+						"ansi-regex": "^5.0.1"
 					}
 				},
 				"wrap-ansi": {
@@ -4040,15 +4538,15 @@
 					}
 				},
 				"y18n": {
-					"version": "5.0.6",
-					"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.6.tgz",
-					"integrity": "sha512-PlVX4Y0lDTN6E2V4ES2tEdyvXkeKzxa8c/vo0pxPr/TqbztddTP0yn7zZylIyiAuxerqj0Q5GhpJ1YJCP8LaZQ==",
+					"version": "5.0.8",
+					"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+					"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
 					"dev": true
 				},
 				"yargs": {
-					"version": "16.2.0",
-					"resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz",
-					"integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==",
+					"version": "17.2.1",
+					"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz",
+					"integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==",
 					"dev": true,
 					"requires": {
 						"cliui": "^7.0.2",
@@ -4061,9 +4559,9 @@
 					}
 				},
 				"yargs-parser": {
-					"version": "20.2.7",
-					"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.7.tgz",
-					"integrity": "sha512-FiNkvbeHzB/syOjIUxFDCnhSfzAL8R5vs40MgLFBorXACCOAEaWu0gRZl14vG8MR9AOJIZbmkjhusqBYZ3HTHw==",
+					"version": "20.2.9",
+					"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+					"integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
 					"dev": true
 				}
 			}
@@ -4082,51 +4580,20 @@
 		"postcss-custom-media": {
 			"version": "8.0.0",
 			"resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz",
-			"integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==",
-			"dev": true
-		},
-		"postcss-discard-duplicates": {
-			"version": "5.0.1",
-			"resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz",
-			"integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==",
-			"dev": true
-		},
-		"postcss-focus-within": {
-			"version": "4.0.0",
-			"resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-4.0.0.tgz",
-			"integrity": "sha512-fO+5/StoHEswmdDQ7V3rhlx4i1cUOjQItae3scu8Nki5h35/fvr8J1vakFnSN4gZ7zzthflpedVsMZPDXNzxaA==",
-			"dev": true,
-			"requires": {
-				"postcss": "^7.0.27"
-			},
-			"dependencies": {
-				"postcss": {
-					"version": "7.0.35",
-					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-					"integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
-					"dev": true,
-					"requires": {
-						"chalk": "^2.4.2",
-						"source-map": "^0.6.1",
-						"supports-color": "^6.1.0"
-					}
-				},
-				"source-map": {
-					"version": "0.6.1",
-					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-					"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-					"dev": true
-				},
-				"supports-color": {
-					"version": "6.1.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-					"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^3.0.0"
-					}
-				}
-			}
+			"integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==",
+			"dev": true
+		},
+		"postcss-discard-duplicates": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.0.1.tgz",
+			"integrity": "sha512-svx747PWHKOGpAXXQkCc4k/DsWo+6bc5LsVrAsw+OU+Ibi7klFZCyX54gjYzX4TH+f2uzXjRviLARxkMurA2bA==",
+			"dev": true
+		},
+		"postcss-focus-within": {
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.1.tgz",
+			"integrity": "sha512-50v1AZVlFSVzLTNdBQG521Aa54VABf/X1RkhR8Fm/9dDQby0W0XdwOnuo8Juvf0ZZXbKkxyTkyyQD0QaNVZVGg==",
+			"dev": true
 		},
 		"postcss-html": {
 			"version": "0.36.0",
@@ -4146,15 +4613,20 @@
 				"postcss": "^7.0.14"
 			},
 			"dependencies": {
+				"picocolors": {
+					"version": "0.2.1",
+					"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+					"integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+					"dev": true
+				},
 				"postcss": {
-					"version": "7.0.35",
-					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-					"integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+					"version": "7.0.39",
+					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+					"integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
 					"dev": true,
 					"requires": {
-						"chalk": "^2.4.2",
-						"source-map": "^0.6.1",
-						"supports-color": "^6.1.0"
+						"picocolors": "^0.2.1",
+						"source-map": "^0.6.1"
 					}
 				},
 				"source-map": {
@@ -4162,26 +4634,18 @@
 					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 					"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
 					"dev": true
-				},
-				"supports-color": {
-					"version": "6.1.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-					"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^3.0.0"
-					}
 				}
 			}
 		},
 		"postcss-load-config": {
-			"version": "3.0.1",
-			"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.0.1.tgz",
-			"integrity": "sha512-/pDHe30UYZUD11IeG8GWx9lNtu1ToyTsZHnyy45B4Mrwr/Kb6NgYl7k753+05CJNKnjbwh4975amoPJ+TEjHNQ==",
+			"version": "3.1.0",
+			"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.0.tgz",
+			"integrity": "sha512-ipM8Ds01ZUophjDTQYSVP70slFSYg3T0/zyfII5vzhN6V57YSxMgG5syXuwi5VtS8wSf3iL30v0uBdoIVx4Q0g==",
 			"dev": true,
 			"requires": {
-				"cosmiconfig": "^7.0.0",
-				"import-cwd": "^3.0.0"
+				"import-cwd": "^3.0.0",
+				"lilconfig": "^2.0.3",
+				"yaml": "^1.10.2"
 			}
 		},
 		"postcss-media-query-parser": {
@@ -4190,27 +4654,63 @@
 			"integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=",
 			"dev": true
 		},
+		"postcss-merge-rules": {
+			"version": "5.0.3",
+			"resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.0.3.tgz",
+			"integrity": "sha512-cEKTMEbWazVa5NXd8deLdCnXl+6cYG7m2am+1HzqH0EnTdy8fRysatkaXb2dEnR+fdaDxTvuZ5zoBdv6efF6hg==",
+			"dev": true,
+			"requires": {
+				"browserslist": "^4.16.6",
+				"caniuse-api": "^3.0.0",
+				"cssnano-utils": "^2.0.1",
+				"postcss-selector-parser": "^6.0.5"
+			},
+			"dependencies": {
+				"postcss-selector-parser": {
+					"version": "6.0.6",
+					"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz",
+					"integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==",
+					"dev": true,
+					"requires": {
+						"cssesc": "^3.0.0",
+						"util-deprecate": "^1.0.2"
+					}
+				}
+			}
+		},
 		"postcss-nested": {
-			"version": "5.0.5",
-			"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.5.tgz",
-			"integrity": "sha512-GSRXYz5bccobpTzLQZXOnSOfKl6TwVr5CyAQJUPub4nuRJSOECK5AqurxVgmtxP48p0Kc/ndY/YyS1yqldX0Ew==",
+			"version": "5.0.6",
+			"resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-5.0.6.tgz",
+			"integrity": "sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==",
 			"dev": true,
 			"requires": {
-				"postcss-selector-parser": "^6.0.4"
+				"postcss-selector-parser": "^6.0.6"
+			},
+			"dependencies": {
+				"postcss-selector-parser": {
+					"version": "6.0.6",
+					"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz",
+					"integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==",
+					"dev": true,
+					"requires": {
+						"cssesc": "^3.0.0",
+						"util-deprecate": "^1.0.2"
+					}
+				}
 			}
 		},
 		"postcss-reporter": {
-			"version": "7.0.2",
-			"resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.2.tgz",
-			"integrity": "sha512-JyQ96NTQQsso42y6L1H1RqHfWH1C3Jr0pt91mVv5IdYddZAE9DUZxuferNgk6q0o6vBVOrfVJb10X1FgDzjmDw==",
+			"version": "7.0.4",
+			"resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-7.0.4.tgz",
+			"integrity": "sha512-jY/fnpGSin7kwJeunXbY35STp5O3VIxSFdjee5JkoPQ+FfGH5JW3N+Xe9oAPcL9UkjWjkK+JC72o8XH4XXKdhw==",
 			"dev": true,
 			"requires": {
-				"colorette": "^1.2.1",
 				"lodash.difference": "^4.5.0",
 				"lodash.forown": "^4.4.0",
 				"lodash.get": "^4.4.2",
 				"lodash.groupby": "^4.6.0",
-				"lodash.sortby": "^4.7.0"
+				"lodash.sortby": "^4.7.0",
+				"picocolors": "^1.0.0"
 			}
 		},
 		"postcss-resolve-nested-selector": {
@@ -4228,15 +4728,20 @@
 				"postcss": "^7.0.26"
 			},
 			"dependencies": {
+				"picocolors": {
+					"version": "0.2.1",
+					"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+					"integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+					"dev": true
+				},
 				"postcss": {
-					"version": "7.0.35",
-					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-					"integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+					"version": "7.0.39",
+					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+					"integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
 					"dev": true,
 					"requires": {
-						"chalk": "^2.4.2",
-						"source-map": "^0.6.1",
-						"supports-color": "^6.1.0"
+						"picocolors": "^0.2.1",
+						"source-map": "^0.6.1"
 					}
 				},
 				"source-map": {
@@ -4244,15 +4749,6 @@
 					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 					"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
 					"dev": true
-				},
-				"supports-color": {
-					"version": "6.1.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-					"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^3.0.0"
-					}
 				}
 			}
 		},
@@ -4266,15 +4762,20 @@
 				"postcss": "^7.0.21"
 			},
 			"dependencies": {
+				"picocolors": {
+					"version": "0.2.1",
+					"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+					"integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+					"dev": true
+				},
 				"postcss": {
-					"version": "7.0.35",
-					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-					"integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+					"version": "7.0.39",
+					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+					"integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
 					"dev": true,
 					"requires": {
-						"chalk": "^2.4.2",
-						"source-map": "^0.6.1",
-						"supports-color": "^6.1.0"
+						"picocolors": "^0.2.1",
+						"source-map": "^0.6.1"
 					}
 				},
 				"source-map": {
@@ -4282,15 +4783,6 @@
 					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 					"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
 					"dev": true
-				},
-				"supports-color": {
-					"version": "6.1.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-					"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^3.0.0"
-					}
 				}
 			}
 		},
@@ -4303,15 +4795,20 @@
 				"postcss": "^7.0.6"
 			},
 			"dependencies": {
+				"picocolors": {
+					"version": "0.2.1",
+					"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+					"integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+					"dev": true
+				},
 				"postcss": {
-					"version": "7.0.35",
-					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-					"integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+					"version": "7.0.39",
+					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+					"integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
 					"dev": true,
 					"requires": {
-						"chalk": "^2.4.2",
-						"source-map": "^0.6.1",
-						"supports-color": "^6.1.0"
+						"picocolors": "^0.2.1",
+						"source-map": "^0.6.1"
 					}
 				},
 				"source-map": {
@@ -4319,15 +4816,6 @@
 					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 					"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
 					"dev": true
-				},
-				"supports-color": {
-					"version": "6.1.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-					"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^3.0.0"
-					}
 				}
 			}
 		},
@@ -4361,12 +4849,6 @@
 			"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
 			"dev": true
 		},
-		"prettier": {
-			"version": "npm:wp-prettier@2.2.1-beta-1",
-			"resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-2.2.1-beta-1.tgz",
-			"integrity": "sha512-+JHkqs9LC/JPp51yy1hzs3lQ7qeuWCwOcSzpQNeeY/G7oSpnF61vxt7hRh87zNRTr6ob2ndy0W8rVzhgrcA+Gw==",
-			"dev": true
-		},
 		"prettier-linter-helpers": {
 			"version": "1.0.0",
 			"resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
@@ -4462,61 +4944,6 @@
 				}
 			}
 		},
-		"read-pkg-up": {
-			"version": "3.0.0",
-			"resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz",
-			"integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=",
-			"dev": true,
-			"requires": {
-				"find-up": "^2.0.0",
-				"read-pkg": "^3.0.0"
-			},
-			"dependencies": {
-				"find-up": {
-					"version": "2.1.0",
-					"resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
-					"integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
-					"dev": true,
-					"requires": {
-						"locate-path": "^2.0.0"
-					}
-				},
-				"locate-path": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
-					"integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
-					"dev": true,
-					"requires": {
-						"p-locate": "^2.0.0",
-						"path-exists": "^3.0.0"
-					}
-				},
-				"p-limit": {
-					"version": "1.3.0",
-					"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
-					"integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
-					"dev": true,
-					"requires": {
-						"p-try": "^1.0.0"
-					}
-				},
-				"p-locate": {
-					"version": "2.0.0",
-					"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
-					"integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
-					"dev": true,
-					"requires": {
-						"p-limit": "^1.1.0"
-					}
-				},
-				"p-try": {
-					"version": "1.0.0",
-					"resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
-					"integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
-					"dev": true
-				}
-			}
-		},
 		"readable-stream": {
 			"version": "3.6.0",
 			"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
@@ -4529,9 +4956,9 @@
 			}
 		},
 		"readdirp": {
-			"version": "3.5.0",
-			"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
-			"integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
+			"version": "3.6.0",
+			"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+			"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
 			"dev": true,
 			"requires": {
 				"picomatch": "^2.2.1"
@@ -4548,9 +4975,9 @@
 			}
 		},
 		"regenerator-runtime": {
-			"version": "0.13.7",
-			"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
-			"integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==",
+			"version": "0.13.9",
+			"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz",
+			"integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==",
 			"dev": true
 		},
 		"regexp.prototype.flags": {
@@ -4587,15 +5014,15 @@
 			}
 		},
 		"regexpp": {
-			"version": "3.1.0",
-			"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
-			"integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+			"version": "3.2.0",
+			"resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz",
+			"integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
 			"dev": true
 		},
 		"regextras": {
-			"version": "0.7.1",
-			"resolved": "https://registry.npmjs.org/regextras/-/regextras-0.7.1.tgz",
-			"integrity": "sha512-9YXf6xtW+qzQ+hcMQXx95MOvfqXFgsKDZodX3qZB0x2n5Z94ioetIITsBtvJbiOyxa/6s9AtyweBLCdPmPko/w==",
+			"version": "0.8.0",
+			"resolved": "https://registry.npmjs.org/regextras/-/regextras-0.8.0.tgz",
+			"integrity": "sha512-k519uI04Z3SaY0fLX843MRXnDeG2+vHOFsyhiPZvNLe7r8rD2YNRjq4BQLZZ0oAr2NrtvZlICsXysGNFPGa3CQ==",
 			"dev": true
 		},
 		"remark": {
@@ -4689,52 +5116,17 @@
 			}
 		},
 		"rtlcss": {
-			"version": "3.2.0",
-			"resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.2.0.tgz",
-			"integrity": "sha512-nV3UmaTmA5TkP2dYOR16ULu6FkMOqZRbiXbFZnmWIN9coPfx3gin31VGOPV7vrVMPjNds7pCS2UYy0mwQUdFCQ==",
+			"version": "3.5.0",
+			"resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz",
+			"integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==",
 			"dev": true,
 			"requires": {
-				"chalk": "^4.1.0",
 				"find-up": "^5.0.0",
-				"mkdirp": "^1.0.4",
-				"postcss": "^8.2.4",
+				"picocolors": "^1.0.0",
+				"postcss": "^8.3.11",
 				"strip-json-comments": "^3.1.1"
 			},
 			"dependencies": {
-				"ansi-styles": {
-					"version": "4.3.0",
-					"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-					"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-					"dev": true,
-					"requires": {
-						"color-convert": "^2.0.1"
-					}
-				},
-				"chalk": {
-					"version": "4.1.1",
-					"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
-					"integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
-					"dev": true,
-					"requires": {
-						"ansi-styles": "^4.1.0",
-						"supports-color": "^7.1.0"
-					}
-				},
-				"color-convert": {
-					"version": "2.0.1",
-					"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-					"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-					"dev": true,
-					"requires": {
-						"color-name": "~1.1.4"
-					}
-				},
-				"color-name": {
-					"version": "1.1.4",
-					"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-					"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-					"dev": true
-				},
 				"find-up": {
 					"version": "5.0.0",
 					"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
@@ -4745,12 +5137,6 @@
 						"path-exists": "^4.0.0"
 					}
 				},
-				"has-flag": {
-					"version": "4.0.0",
-					"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-					"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-					"dev": true
-				},
 				"locate-path": {
 					"version": "6.0.0",
 					"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
@@ -4783,15 +5169,6 @@
 					"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
 					"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
 					"dev": true
-				},
-				"supports-color": {
-					"version": "7.2.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-					"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^4.0.0"
-					}
 				}
 			}
 		},
@@ -4811,9 +5188,9 @@
 			"dev": true
 		},
 		"sass": {
-			"version": "1.34.1",
-			"resolved": "https://registry.npmjs.org/sass/-/sass-1.34.1.tgz",
-			"integrity": "sha512-scLA7EIZM+MmYlej6sdVr0HRbZX5caX5ofDT9asWnUJj21oqgsC+1LuNfm0eg+vM0fCTZHhwImTiCU0sx9h9CQ==",
+			"version": "1.43.4",
+			"resolved": "https://registry.npmjs.org/sass/-/sass-1.43.4.tgz",
+			"integrity": "sha512-/ptG7KE9lxpGSYiXn7Ar+lKOv37xfWsZRtFYal2QHNigyVQDx685VFT/h7ejVr+R8w7H4tmUgtulsKl5YpveOg==",
 			"dev": true,
 			"requires": {
 				"chokidar": ">=3.0.0 <4.0.0"
@@ -4984,12 +5361,6 @@
 			"integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==",
 			"dev": true
 		},
-		"sprintf-js": {
-			"version": "1.0.3",
-			"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-			"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
-			"dev": true
-		},
 		"string-width": {
 			"version": "3.1.0",
 			"resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
@@ -5010,14 +5381,14 @@
 			}
 		},
 		"string.prototype.matchall": {
-			"version": "4.0.5",
-			"resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.5.tgz",
-			"integrity": "sha512-Z5ZaXO0svs0M2xd/6By3qpeKpLKd9mO4v4q3oMEQrk8Ck4xOD5d5XeBOOjGrmVZZ/AHB1S0CgG4N5r1G9N3E2Q==",
+			"version": "4.0.6",
+			"resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz",
+			"integrity": "sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==",
 			"dev": true,
 			"requires": {
 				"call-bind": "^1.0.2",
 				"define-properties": "^1.1.3",
-				"es-abstract": "^1.18.2",
+				"es-abstract": "^1.19.1",
 				"get-intrinsic": "^1.1.1",
 				"has-symbols": "^1.0.2",
 				"internal-slot": "^1.0.3",
@@ -5036,22 +5407,26 @@
 					}
 				},
 				"es-abstract": {
-					"version": "1.18.3",
-					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.3.tgz",
-					"integrity": "sha512-nQIr12dxV7SSxE6r6f1l3DtAeEYdsGpps13dR0TwJg1S8gyp4ZPgy3FZcHBgbiQqnoqSTb+oC+kO4UQ0C/J8vw==",
+					"version": "1.19.1",
+					"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.19.1.tgz",
+					"integrity": "sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==",
 					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
 						"es-to-primitive": "^1.2.1",
 						"function-bind": "^1.1.1",
 						"get-intrinsic": "^1.1.1",
+						"get-symbol-description": "^1.0.0",
 						"has": "^1.0.3",
 						"has-symbols": "^1.0.2",
-						"is-callable": "^1.2.3",
+						"internal-slot": "^1.0.3",
+						"is-callable": "^1.2.4",
 						"is-negative-zero": "^2.0.1",
-						"is-regex": "^1.1.3",
-						"is-string": "^1.0.6",
-						"object-inspect": "^1.10.3",
+						"is-regex": "^1.1.4",
+						"is-shared-array-buffer": "^1.0.1",
+						"is-string": "^1.0.7",
+						"is-weakref": "^1.0.1",
+						"object-inspect": "^1.11.0",
 						"object-keys": "^1.1.1",
 						"object.assign": "^4.1.2",
 						"string.prototype.trimend": "^1.0.4",
@@ -5077,9 +5452,9 @@
 					"dev": true
 				},
 				"is-callable": {
-					"version": "1.2.3",
-					"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
-					"integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==",
+					"version": "1.2.4",
+					"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.4.tgz",
+					"integrity": "sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==",
 					"dev": true
 				},
 				"is-negative-zero": {
@@ -5089,19 +5464,19 @@
 					"dev": true
 				},
 				"is-regex": {
-					"version": "1.1.3",
-					"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz",
-					"integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==",
+					"version": "1.1.4",
+					"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+					"integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
 					"dev": true,
 					"requires": {
 						"call-bind": "^1.0.2",
-						"has-symbols": "^1.0.2"
+						"has-tostringtag": "^1.0.0"
 					}
 				},
 				"object-inspect": {
-					"version": "1.10.3",
-					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz",
-					"integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==",
+					"version": "1.11.0",
+					"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.11.0.tgz",
+					"integrity": "sha512-jp7ikS6Sd3GxQfZJPyH3cjcbJF6GZPClgdV+EFygjFLQ5FmW/dRUnTd9PQ9k0JhoNDabWFbpF1yCdSWCC6gexg==",
 					"dev": true
 				},
 				"string.prototype.trimend": {
@@ -5267,9 +5642,9 @@
 			},
 			"dependencies": {
 				"ansi-regex": {
-					"version": "5.0.0",
-					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-					"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+					"version": "5.0.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+					"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 					"dev": true
 				},
 				"ansi-styles": {
@@ -5361,6 +5736,12 @@
 						"picomatch": "^2.2.3"
 					}
 				},
+				"picocolors": {
+					"version": "0.2.1",
+					"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+					"integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+					"dev": true
+				},
 				"picomatch": {
 					"version": "2.3.0",
 					"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
@@ -5368,77 +5749,13 @@
 					"dev": true
 				},
 				"postcss": {
-					"version": "7.0.35",
-					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-					"integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+					"version": "7.0.39",
+					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+					"integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
 					"dev": true,
 					"requires": {
-						"chalk": "^2.4.2",
-						"source-map": "^0.6.1",
-						"supports-color": "^6.1.0"
-					},
-					"dependencies": {
-						"ansi-styles": {
-							"version": "3.2.1",
-							"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-							"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-							"dev": true,
-							"requires": {
-								"color-convert": "^1.9.0"
-							}
-						},
-						"chalk": {
-							"version": "2.4.2",
-							"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-							"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
-							"dev": true,
-							"requires": {
-								"ansi-styles": "^3.2.1",
-								"escape-string-regexp": "^1.0.5",
-								"supports-color": "^5.3.0"
-							},
-							"dependencies": {
-								"supports-color": {
-									"version": "5.5.0",
-									"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
-									"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
-									"dev": true,
-									"requires": {
-										"has-flag": "^3.0.0"
-									}
-								}
-							}
-						},
-						"color-convert": {
-							"version": "1.9.3",
-							"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-							"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-							"dev": true,
-							"requires": {
-								"color-name": "1.1.3"
-							}
-						},
-						"color-name": {
-							"version": "1.1.3",
-							"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-							"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-							"dev": true
-						},
-						"has-flag": {
-							"version": "3.0.0",
-							"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
-							"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
-							"dev": true
-						},
-						"supports-color": {
-							"version": "6.1.0",
-							"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-							"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-							"dev": true,
-							"requires": {
-								"has-flag": "^3.0.0"
-							}
-						}
+						"picocolors": "^0.2.1",
+						"source-map": "^0.6.1"
 					}
 				},
 				"postcss-selector-parser": {
@@ -5501,18 +5818,57 @@
 			"dev": true
 		},
 		"stylelint-config-recommended-scss": {
-			"version": "4.2.0",
-			"resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-4.2.0.tgz",
-			"integrity": "sha512-4bI5BYbabo/GCQ6LbRZx/ZlVkK65a1jivNNsD+ix/Lw0U3iAch+jQcvliGnnAX8SUPaZ0UqzNVNNAF3urswa7g==",
+			"version": "5.0.1",
+			"resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-5.0.1.tgz",
+			"integrity": "sha512-kVI5lX8jtaw9uNnnxxziw+LhW59m0x/JzGj8zVepeFQJ56eM4HazN4gMyCRQQSLr/8CXlIHGOW34CV5hIMr3FQ==",
 			"dev": true,
 			"requires": {
-				"stylelint-config-recommended": "^3.0.0"
+				"postcss-scss": "^4.0.1",
+				"stylelint-config-recommended": "^6.0.0",
+				"stylelint-scss": "^4.0.0"
+			},
+			"dependencies": {
+				"postcss-scss": {
+					"version": "4.0.2",
+					"resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.2.tgz",
+					"integrity": "sha512-xfdkU128CkKKKVAwkyt0M8OdnelJ3MRcIRAPPQkRpoPeuzWY3RIeg7piRCpZ79MK7Q16diLXMMAD9dN5mauPlQ==",
+					"dev": true
+				},
+				"postcss-selector-parser": {
+					"version": "6.0.6",
+					"resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.6.tgz",
+					"integrity": "sha512-9LXrvaaX3+mcv5xkg5kFwqSzSH1JIObIx51PrndZwlmznwXRfxMddDvo9gve3gVR8ZTKgoFDdWkbRFmEhT4PMg==",
+					"dev": true,
+					"requires": {
+						"cssesc": "^3.0.0",
+						"util-deprecate": "^1.0.2"
+					}
+				},
+				"stylelint-config-recommended": {
+					"version": "6.0.0",
+					"resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-6.0.0.tgz",
+					"integrity": "sha512-ZorSSdyMcxWpROYUvLEMm0vSZud2uB7tX1hzBZwvVY9SV/uly4AvvJPPhCcymZL3fcQhEQG5AELmrxWqtmzacw==",
+					"dev": true
+				},
+				"stylelint-scss": {
+					"version": "4.0.0",
+					"resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.0.0.tgz",
+					"integrity": "sha512-lIRhPqtI6I065EJ6aI4mWKsmQt8Krnu6aF9XSL9s8Nd2f/cDKImST0T9TfjnUul3ReKYWozkG9dlpNTZH2FB9w==",
+					"dev": true,
+					"requires": {
+						"lodash": "^4.17.15",
+						"postcss-media-query-parser": "^0.2.3",
+						"postcss-resolve-nested-selector": "^0.1.1",
+						"postcss-selector-parser": "^6.0.6",
+						"postcss-value-parser": "^4.1.0"
+					}
+				}
 			}
 		},
 		"stylelint-scss": {
-			"version": "3.19.0",
-			"resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.19.0.tgz",
-			"integrity": "sha512-Ic5bsmpS4wVucOw44doC1Yi9f5qbeVL4wPFiEOaUElgsOuLEN6Ofn/krKI8BeNL2gAn53Zu+IcVV4E345r6rBw==",
+			"version": "3.21.0",
+			"resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-3.21.0.tgz",
+			"integrity": "sha512-CMI2wSHL+XVlNExpauy/+DbUcB/oUZLARDtMIXkpV/5yd8nthzylYd1cdHeDMJVBXeYHldsnebUX6MoV5zPW4A==",
 			"dev": true,
 			"requires": {
 				"lodash": "^4.17.15",
@@ -5531,15 +5887,20 @@
 				"postcss": "^7.0.2"
 			},
 			"dependencies": {
+				"picocolors": {
+					"version": "0.2.1",
+					"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz",
+					"integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==",
+					"dev": true
+				},
 				"postcss": {
-					"version": "7.0.35",
-					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
-					"integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+					"version": "7.0.39",
+					"resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz",
+					"integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==",
 					"dev": true,
 					"requires": {
-						"chalk": "^2.4.2",
-						"source-map": "^0.6.1",
-						"supports-color": "^6.1.0"
+						"picocolors": "^0.2.1",
+						"source-map": "^0.6.1"
 					}
 				},
 				"source-map": {
@@ -5547,15 +5908,6 @@
 					"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
 					"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
 					"dev": true
-				},
-				"supports-color": {
-					"version": "6.1.0",
-					"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
-					"integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
-					"dev": true,
-					"requires": {
-						"has-flag": "^3.0.0"
-					}
 				}
 			}
 		},
@@ -5601,9 +5953,9 @@
 					}
 				},
 				"ansi-regex": {
-					"version": "5.0.0",
-					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
-					"integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+					"version": "5.0.1",
+					"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+					"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
 					"dev": true
 				},
 				"emoji-regex": {
@@ -5680,9 +6032,9 @@
 			"dev": true
 		},
 		"tsconfig-paths": {
-			"version": "3.9.0",
-			"resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz",
-			"integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==",
+			"version": "3.11.0",
+			"resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.11.0.tgz",
+			"integrity": "sha512-7ecdYDnIdmv639mmDwslG6KQg1Z9STTz1j7Gcz0xa+nshh/gKDAHcPxRbWOsA3SPp0tXP2leTcY9Kw+NAkfZzA==",
 			"dev": true,
 			"requires": {
 				"@types/json5": "^0.0.29",
@@ -5917,9 +6269,9 @@
 			}
 		},
 		"y18n": {
-			"version": "4.0.1",
-			"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
-			"integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==",
+			"version": "4.0.3",
+			"resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+			"integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
 			"dev": true
 		},
 		"yallist": {
@@ -5950,6 +6302,36 @@
 				"which-module": "^2.0.0",
 				"y18n": "^4.0.0",
 				"yargs-parser": "^13.1.2"
+			},
+			"dependencies": {
+				"find-up": {
+					"version": "3.0.0",
+					"resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+					"integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+					"dev": true,
+					"requires": {
+						"locate-path": "^3.0.0"
+					}
+				},
+				"locate-path": {
+					"version": "3.0.0",
+					"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+					"integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+					"dev": true,
+					"requires": {
+						"p-locate": "^3.0.0",
+						"path-exists": "^3.0.0"
+					}
+				},
+				"p-locate": {
+					"version": "3.0.0",
+					"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+					"integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+					"dev": true,
+					"requires": {
+						"p-limit": "^2.0.0"
+					}
+				}
 			}
 		},
 		"yargs-parser": {
diff --git a/src/wp-content/themes/twentytwentyone/package.json b/src/wp-content/themes/twentytwentyone/package.json
index 558a4fdb04..405262b4de 100644
--- a/src/wp-content/themes/twentytwentyone/package.json
+++ b/src/wp-content/themes/twentytwentyone/package.json
@@ -1,6 +1,6 @@
 {
 	"name": "twentytwentyone",
-	"version": "1.4.0",
+	"version": "1.5.0",
 	"description": "Default WP Theme",
 	"author": "The WordPress Contributors",
 	"license": "GPL-2.0-or-later",
@@ -14,25 +14,26 @@
 	"homepage": "https://wordpress.org/themes/twentytwentyone/",
 	"devDependencies": {
 		"@wordpress/browserslist-config": "^4.0.1",
-		"@wordpress/eslint-plugin": "^9.0.6",
-		"@wordpress/stylelint-config": "^19.0.5",
-		"autoprefixer": "^10.2.6",
-		"chokidar-cli": "^2.1.0",
-		"eslint": "^7.28.0",
+		"@wordpress/eslint-plugin": "^9.2.0",
+		"@wordpress/stylelint-config": "^19.1.0",
+		"autoprefixer": "^10.4.0",
+		"chokidar-cli": "^3.0.0",
+		"eslint": "^8.2.0",
 		"minimist": "^1.2.2",
 		"npm-run-all": "^4.1.5",
 		"postcss-calc": "^8.0.0",
-		"postcss-cli": "^8.3.1",
-		"postcss": "^8.3.0",
+		"postcss-cli": "^9.0.2",
+		"postcss": "^8.3.11",
 		"postcss-css-variables": "^0.18.0",
 		"postcss-custom-media": "^8.0.0",
 		"postcss-discard-duplicates": "^5.0.1",
-		"postcss-focus-within": "^4.0.0",
-		"postcss-nested": "^5.0.5",
-		"rtlcss": "^3.2.0",
-		"sass": "^1.34.1",
+		"postcss-focus-within": "^5.0.1",
+		"postcss-merge-rules": "^5.0.3",
+		"postcss-nested": "^5.0.6",
+		"rtlcss": "^3.5.0",
+		"sass": "^1.43.4",
 		"stylelint": "^13.13.1",
-		"stylelint-config-recommended-scss": "^4.2.0"
+		"stylelint-config-recommended-scss": "^5.0.1"
 	},
 	"rtlcssConfig": {
 		"options": {
diff --git a/src/wp-content/themes/twentytwentyone/postcss.config.js b/src/wp-content/themes/twentytwentyone/postcss.config.js
index c291aae9e6..d889f314ba 100644
--- a/src/wp-content/themes/twentytwentyone/postcss.config.js
+++ b/src/wp-content/themes/twentytwentyone/postcss.config.js
@@ -8,6 +8,7 @@ module.exports = {
 		require('postcss-calc')({
 			precision: 0
 		}),
-		require('postcss-discard-duplicates')
+		require('postcss-discard-duplicates'),
+		require('postcss-merge-rules')
 	]
 };
diff --git a/src/wp-content/themes/twentytwentyone/readme.txt b/src/wp-content/themes/twentytwentyone/readme.txt
index 29dc5b8dff..23b782b6bf 100644
--- a/src/wp-content/themes/twentytwentyone/readme.txt
+++ b/src/wp-content/themes/twentytwentyone/readme.txt
@@ -1,9 +1,9 @@
 === Twenty Twenty-One ===
 Contributors: wordpressdotorg
 Requires at least: 5.3
-Tested up to: 5.8
+Tested up to: 5.9
 Requires PHP: 5.6
-Stable tag: 1.4
+Stable tag: 1.5
 License: GPLv2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
 
@@ -30,6 +30,11 @@ No data is saved in the database or transferred.
 
 == Changelog ==
 
+= 1.5 =
+* Released: January 25, 2022
+
+https://wordpress.org/support/article/twenty-twenty-one-changelog#Version_1.5
+
 = 1.4 =
 * Released: July 20, 2021
 
@@ -57,7 +62,7 @@ https://wordpress.org/support/article/twenty-twenty-one-changelog#Version_1.0
 
 == Copyright ==
 
-Twenty Twenty-One WordPress Theme, 2020-2021 WordPress.org
+Twenty Twenty-One WordPress Theme, 2020-2022 WordPress.org
 Twenty Twenty-One is distributed under the terms of the GNU GPL.
 
 This program is free software: you can redistribute it and/or modify
@@ -75,19 +80,19 @@ Twenty Twenty-One is derived from Seedlet, (C) 2020 Automattic, Inc.
 
 Twenty Twenty-One is also based on:
 
-Twenty Nineteen. 2018-2021 WordPress.org
+Twenty Nineteen. 2018-2022 WordPress.org
 Twenty Nineteen is distributed under the terms of the GNU GPL v2 or later.
 
-Twenty Seventeen. Copyright (C) 2016-2021 WordPress.org
+Twenty Seventeen. Copyright (C) 2016-2022 WordPress.org
 Twenty Seventeen is distributed under the terms of the GNU GPL v2 or later.
 
-Twenty Sixteen. Copyright (C) 2015-2021 WordPress.org
+Twenty Sixteen. Copyright (C) 2015-2022 WordPress.org
 Twenty Sixteen is distributed under the terms of the GNU GPL v2 or later.
 
-Twenty Twenty. Copyright (C) 2020-2021 WordPress.org
+Twenty Twenty. Copyright (C) 2020-2022 WordPress.org
 Twenty Twenty is distributed under the terms of the GNU GPL v2 or later.
 
-Underscores https://underscores.me/, Copyright (C) 2012-2021 Automattic, Inc.
+Underscores https://underscores.me/, Copyright (C) 2012-2022 Automattic, Inc.
 Underscores is distributed under the terms of the GNU GPL v2 or later.
 
 Normalizing styles have been helped along thanks to the fine work of
diff --git a/src/wp-content/themes/twentytwentyone/style-rtl.css b/src/wp-content/themes/twentytwentyone/style-rtl.css
index 9ef3535644..4da41840a0 100644
--- a/src/wp-content/themes/twentytwentyone/style-rtl.css
+++ b/src/wp-content/themes/twentytwentyone/style-rtl.css
@@ -7,9 +7,9 @@ Author: the WordPress team
 Author URI: https://wordpress.org/
 Description: Twenty Twenty-One is a blank canvas for your ideas and it makes the block editor your best brush. With new block patterns, which allow you to create a beautiful layout in a matter of seconds, this theme’s soft colors and eye-catching — yet timeless — design will let your work shine. Take it for a spin! See how Twenty Twenty-One elevates your portfolio, business website, or personal blog.
 Requires at least: 5.3
-Tested up to: 5.8
+Tested up to: 5.9
 Requires PHP: 5.6
-Version: 1.4
+Version: 1.5
 License: GNU General Public License v2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
 Text Domain: twentytwentyone
@@ -2104,7 +2104,7 @@ input[type=reset]:disabled,
 
 .wp-block-cover .wp-block-cover__inner-container,
 .wp-block-cover-image .wp-block-cover__inner-container {
-	width: calc(100% - calc(2 * var(--global--spacing-vertical)));
+	width: calc(100% - 2 * var(--global--spacing-vertical));
 }
 
 .wp-block-cover .wp-block-cover__inner-container > *,
@@ -2266,8 +2266,8 @@ input[type=reset]:disabled,
 .wp-block-group.has-background .wp-block-group__inner-container > hr.wp-block-separator:not(.is-style-dots):not(.alignwide).alignfull,
 .wp-block-group.is-style-twentytwentyone-border .wp-block-group__inner-container > .alignfull,
 .wp-block-group.is-style-twentytwentyone-border .wp-block-group__inner-container > hr.wp-block-separator:not(.is-style-dots):not(.alignwide).alignfull {
-	max-width: calc(var(--responsive--alignfull-width) + (2 * var(--global--spacing-vertical)));
-	width: calc(var(--responsive--alignfull-width) + (2 * var(--global--spacing-vertical)));
+	max-width: calc(var(--responsive--alignfull-width) + 2 * var(--global--spacing-vertical));
+	width: calc(var(--responsive--alignfull-width) + 2 * var(--global--spacing-vertical));
 	margin-right: calc(-1 * var(--global--spacing-vertical));
 }
 
@@ -2592,23 +2592,23 @@ h6,
 @media screen and (min-width: 600px) {
 
 	.wp-block-latest-posts.is-style-twentytwentyone-latest-posts-dividers.is-grid.columns-2 li {
-		width: calc((100% / 2));
+		width: calc(100% / 2);
 	}
 
 	.wp-block-latest-posts.is-style-twentytwentyone-latest-posts-dividers.is-grid.columns-3 li {
-		width: calc((100% / 3));
+		width: calc(100% / 3);
 	}
 
 	.wp-block-latest-posts.is-style-twentytwentyone-latest-posts-dividers.is-grid.columns-4 li {
-		width: calc((100% / 4));
+		width: calc(100% / 4);
 	}
 
 	.wp-block-latest-posts.is-style-twentytwentyone-latest-posts-dividers.is-grid.columns-5 li {
-		width: calc((100% / 5));
+		width: calc(100% / 5);
 	}
 
 	.wp-block-latest-posts.is-style-twentytwentyone-latest-posts-dividers.is-grid.columns-6 li {
-		width: calc((100% / 6));
+		width: calc(100% / 6);
 	}
 }
 
@@ -3896,7 +3896,7 @@ table.wp-calendar-table caption {
 	}
 
 	.site-header.has-logo:not(.has-title-and-tagline).has-menu .site-logo img {
-		max-height: calc(var(--button--padding-vertical) - (0.25 * var(--global--spacing-unit)) + 1.7em);
+		max-height: calc(var(--button--padding-vertical) - 0.25 * var(--global--spacing-unit) + 1.7em);
 	}
 
 	.site-header.has-logo.has-title-and-tagline {
@@ -3927,7 +3927,7 @@ table.wp-calendar-table caption {
 	body:not(.primary-navigation-open) .site-header.has-logo.has-title-and-tagline .menu-button-container {
 		position: relative;
 		padding-top: 0;
-		margin-top: calc(0px - var(--button--padding-vertical) + (0.25 * var(--global--spacing-unit)));
+		margin-top: calc(0px - var(--button--padding-vertical) + 0.25 * var(--global--spacing-unit));
 	}
 
 	body:not(.primary-navigation-open) .site-header.has-logo.has-title-and-tagline .menu-button-container #primary-mobile-menu {
@@ -3975,6 +3975,7 @@ table.wp-calendar-table caption {
 	font-size: var(--branding--title--font-size);
 }
 
+.site-footer > .site-info .privacy-policy,
 .site-footer > .site-info .powered-by {
 	margin-top: calc(0.5 * var(--global--spacing-vertical));
 }
@@ -3985,10 +3986,19 @@ table.wp-calendar-table caption {
 		align-items: center;
 	}
 
+	.site-footer > .site-info .site-name {
+		margin-left: calc(0.5 * var(--global--spacing-vertical));
+	}
+
+	.site-footer > .site-info .privacy-policy,
 	.site-footer > .site-info .powered-by {
 		margin-top: initial;
 		margin-right: auto;
 	}
+
+	.site-footer > .site-info .privacy-policy + .powered-by {
+		margin-right: calc(0.5 * var(--global--spacing-vertical));
+	}
 }
 
 .site-footer > .site-info a {
@@ -4571,7 +4581,7 @@ h1.page-title {
 .comment-form > p textarea {
 	display: block;
 	font-size: var(--global--font-size-sm);
-	margin-bottom: calc(.5 * var(--global--spacing-unit));
+	margin-bottom: calc(0.5 * var(--global--spacing-unit));
 	width: 100%;
 	font-weight: var(--form--label-weight);
 }
@@ -4609,7 +4619,7 @@ h1.page-title {
 .menu-button-container #primary-mobile-menu {
 	display: flex;
 	margin-right: auto;
-	padding: calc(var(--button--padding-vertical) - (0.25 * var(--global--spacing-unit))) calc(0.5 * var(--button--padding-horizontal));
+	padding: calc(var(--button--padding-vertical) - 0.25 * var(--global--spacing-unit)) calc(0.5 * var(--button--padding-horizontal));
 	font-size: var(--primary-nav--font-size-button);
 	font-weight: var(--primary-nav--font-weight-button);
 	background-color: transparent;
@@ -5185,7 +5195,7 @@ h1.page-title {
 		flex: 0 1 auto;
 		margin-bottom: inherit;
 		margin-top: inherit;
-		max-width: calc(50% - (0.5 * var(--global--spacing-unit)));
+		max-width: calc(50% - 0.5 * var(--global--spacing-unit));
 	}
 
 	.navigation .nav-links .nav-next {
@@ -5237,7 +5247,7 @@ h1.page-title {
 @media only screen and (min-width: 822px) {
 
 	.post-navigation .post-title {
-		margin: 5px calc(24px + (0.25 * var(--global--spacing-unit))) 0;
+		margin: 5px calc(24px + 0.25 * var(--global--spacing-unit)) 0;
 	}
 }
 @media only screen and (min-width: 482px) {
@@ -5417,42 +5427,6 @@ h1.page-title {
 	}
 }
 
-.widget-area ul {
-	list-style-type: none;
-	padding: 0;
-}
-
-.widget-area ul li {
-	line-height: var(--widget--line-height-list);
-}
-
-.widget-area ul.sub-menu,
-.widget-area ul.children {
-	margin-right: var(--widget--spacing-menu);
-}
-
-.widget-area ul .sub-menu-toggle {
-	display: none;
-}
-
-.widget-area a {
-	color: var(--footer--color-link);
-	text-decoration: underline;
-	text-decoration-style: solid;
-	text-decoration-color: currentColor;
-}
-
-.widget-area a:link,
-.widget-area a:visited,
-.widget-area a:active {
-	color: var(--footer--color-link);
-}
-
-.widget-area a:hover {
-	color: var(--footer--color-link-hover);
-	text-decoration-style: dotted;
-}
-
 .widget-area .wp-block-social-links.alignright {
 	margin-top: var(--global--spacing-vertical);
 	justify-content: flex-end;
@@ -5502,6 +5476,42 @@ h1.page-title {
 	font-size: var(--global--font-size-xs);
 }
 
+.widget ul {
+	list-style-type: none;
+	padding: 0;
+}
+
+.widget ul li {
+	line-height: var(--widget--line-height-list);
+}
+
+.widget ul.sub-menu,
+.widget ul.children {
+	margin-right: var(--widget--spacing-menu);
+}
+
+.widget ul .sub-menu-toggle {
+	display: none;
+}
+
+.widget a {
+	color: var(--footer--color-link);
+	text-decoration: underline;
+	text-decoration-style: solid;
+	text-decoration-color: currentColor;
+}
+
+.widget a:link,
+.widget a:visited,
+.widget a:active {
+	color: var(--footer--color-link);
+}
+
+.widget a:hover {
+	color: var(--footer--color-link-hover);
+	text-decoration-style: dotted;
+}
+
 .search-form {
 	display: flex;
 	flex-wrap: wrap;
diff --git a/src/wp-content/themes/twentytwentyone/style.css b/src/wp-content/themes/twentytwentyone/style.css
index b7035bd304..fed5ec25cd 100644
--- a/src/wp-content/themes/twentytwentyone/style.css
+++ b/src/wp-content/themes/twentytwentyone/style.css
@@ -7,9 +7,9 @@ Author: the WordPress team
 Author URI: https://wordpress.org/
 Description: Twenty Twenty-One is a blank canvas for your ideas and it makes the block editor your best brush. With new block patterns, which allow you to create a beautiful layout in a matter of seconds, this theme’s soft colors and eye-catching — yet timeless — design will let your work shine. Take it for a spin! See how Twenty Twenty-One elevates your portfolio, business website, or personal blog.
 Requires at least: 5.3
-Tested up to: 5.8
+Tested up to: 5.9
 Requires PHP: 5.6
-Version: 1.4
+Version: 1.5
 License: GNU General Public License v2 or later
 License URI: http://www.gnu.org/licenses/gpl-2.0.html
 Text Domain: twentytwentyone
@@ -2114,7 +2114,7 @@ input[type=reset]:disabled,
 
 .wp-block-cover .wp-block-cover__inner-container,
 .wp-block-cover-image .wp-block-cover__inner-container {
-	width: calc(100% - calc(2 * var(--global--spacing-vertical)));
+	width: calc(100% - 2 * var(--global--spacing-vertical));
 }
 
 .wp-block-cover .wp-block-cover__inner-container > *,
@@ -2276,8 +2276,8 @@ input[type=reset]:disabled,
 .wp-block-group.has-background .wp-block-group__inner-container > hr.wp-block-separator:not(.is-style-dots):not(.alignwide).alignfull,
 .wp-block-group.is-style-twentytwentyone-border .wp-block-group__inner-container > .alignfull,
 .wp-block-group.is-style-twentytwentyone-border .wp-block-group__inner-container > hr.wp-block-separator:not(.is-style-dots):not(.alignwide).alignfull {
-	max-width: calc(var(--responsive--alignfull-width) + (2 * var(--global--spacing-vertical)));
-	width: calc(var(--responsive--alignfull-width) + (2 * var(--global--spacing-vertical)));
+	max-width: calc(var(--responsive--alignfull-width) + 2 * var(--global--spacing-vertical));
+	width: calc(var(--responsive--alignfull-width) + 2 * var(--global--spacing-vertical));
 	margin-left: calc(-1 * var(--global--spacing-vertical));
 }
 
@@ -2602,23 +2602,23 @@ h6,
 @media screen and (min-width: 600px) {
 
 	.wp-block-latest-posts.is-style-twentytwentyone-latest-posts-dividers.is-grid.columns-2 li {
-		width: calc((100% / 2));
+		width: calc(100% / 2);
 	}
 
 	.wp-block-latest-posts.is-style-twentytwentyone-latest-posts-dividers.is-grid.columns-3 li {
-		width: calc((100% / 3));
+		width: calc(100% / 3);
 	}
 
 	.wp-block-latest-posts.is-style-twentytwentyone-latest-posts-dividers.is-grid.columns-4 li {
-		width: calc((100% / 4));
+		width: calc(100% / 4);
 	}
 
 	.wp-block-latest-posts.is-style-twentytwentyone-latest-posts-dividers.is-grid.columns-5 li {
-		width: calc((100% / 5));
+		width: calc(100% / 5);
 	}
 
 	.wp-block-latest-posts.is-style-twentytwentyone-latest-posts-dividers.is-grid.columns-6 li {
-		width: calc((100% / 6));
+		width: calc(100% / 6);
 	}
 }
 
@@ -3916,7 +3916,7 @@ table.wp-calendar-table caption {
 	}
 
 	.site-header.has-logo:not(.has-title-and-tagline).has-menu .site-logo img {
-		max-height: calc(var(--button--padding-vertical) - (0.25 * var(--global--spacing-unit)) + 1.7em);
+		max-height: calc(var(--button--padding-vertical) - 0.25 * var(--global--spacing-unit) + 1.7em);
 	}
 
 	.site-header.has-logo.has-title-and-tagline {
@@ -3947,7 +3947,7 @@ table.wp-calendar-table caption {
 	body:not(.primary-navigation-open) .site-header.has-logo.has-title-and-tagline .menu-button-container {
 		position: relative;
 		padding-top: 0;
-		margin-top: calc(0px - var(--button--padding-vertical) + (0.25 * var(--global--spacing-unit)));
+		margin-top: calc(0px - var(--button--padding-vertical) + 0.25 * var(--global--spacing-unit));
 	}
 
 	body:not(.primary-navigation-open) .site-header.has-logo.has-title-and-tagline .menu-button-container #primary-mobile-menu {
@@ -3995,6 +3995,7 @@ table.wp-calendar-table caption {
 	font-size: var(--branding--title--font-size);
 }
 
+.site-footer > .site-info .privacy-policy,
 .site-footer > .site-info .powered-by {
 	margin-top: calc(0.5 * var(--global--spacing-vertical));
 }
@@ -4005,10 +4006,19 @@ table.wp-calendar-table caption {
 		align-items: center;
 	}
 
+	.site-footer > .site-info .site-name {
+		margin-right: calc(0.5 * var(--global--spacing-vertical));
+	}
+
+	.site-footer > .site-info .privacy-policy,
 	.site-footer > .site-info .powered-by {
 		margin-top: initial;
 		margin-left: auto;
 	}
+
+	.site-footer > .site-info .privacy-policy + .powered-by {
+		margin-left: calc(0.5 * var(--global--spacing-vertical));
+	}
 }
 
 .site-footer > .site-info a {
@@ -4591,7 +4601,7 @@ h1.page-title {
 .comment-form > p textarea {
 	display: block;
 	font-size: var(--global--font-size-sm);
-	margin-bottom: calc(.5 * var(--global--spacing-unit));
+	margin-bottom: calc(0.5 * var(--global--spacing-unit));
 	width: 100%;
 	font-weight: var(--form--label-weight);
 }
@@ -4629,7 +4639,7 @@ h1.page-title {
 .menu-button-container #primary-mobile-menu {
 	display: flex;
 	margin-left: auto;
-	padding: calc(var(--button--padding-vertical) - (0.25 * var(--global--spacing-unit))) calc(0.5 * var(--button--padding-horizontal));
+	padding: calc(var(--button--padding-vertical) - 0.25 * var(--global--spacing-unit)) calc(0.5 * var(--button--padding-horizontal));
 	font-size: var(--primary-nav--font-size-button);
 	font-weight: var(--primary-nav--font-weight-button);
 	background-color: transparent;
@@ -5221,7 +5231,7 @@ h1.page-title {
 		flex: 0 1 auto;
 		margin-bottom: inherit;
 		margin-top: inherit;
-		max-width: calc(50% - (0.5 * var(--global--spacing-unit)));
+		max-width: calc(50% - 0.5 * var(--global--spacing-unit));
 	}
 
 	.navigation .nav-links .nav-next {
@@ -5273,7 +5283,7 @@ h1.page-title {
 @media only screen and (min-width: 822px) {
 
 	.post-navigation .post-title {
-		margin: 5px calc(24px + (0.25 * var(--global--spacing-unit))) 0;
+		margin: 5px calc(24px + 0.25 * var(--global--spacing-unit)) 0;
 	}
 }
 @media only screen and (min-width: 482px) {
@@ -5453,42 +5463,6 @@ h1.page-title {
 	}
 }
 
-.widget-area ul {
-	list-style-type: none;
-	padding: 0;
-}
-
-.widget-area ul li {
-	line-height: var(--widget--line-height-list);
-}
-
-.widget-area ul.sub-menu,
-.widget-area ul.children {
-	margin-left: var(--widget--spacing-menu);
-}
-
-.widget-area ul .sub-menu-toggle {
-	display: none;
-}
-
-.widget-area a {
-	color: var(--footer--color-link);
-	text-decoration: underline;
-	text-decoration-style: solid;
-	text-decoration-color: currentColor;
-}
-
-.widget-area a:link,
-.widget-area a:visited,
-.widget-area a:active {
-	color: var(--footer--color-link);
-}
-
-.widget-area a:hover {
-	color: var(--footer--color-link-hover);
-	text-decoration-style: dotted;
-}
-
 .widget-area .wp-block-social-links.alignright {
 	margin-top: var(--global--spacing-vertical);
 	justify-content: flex-end;
@@ -5538,6 +5512,42 @@ h1.page-title {
 	font-size: var(--global--font-size-xs);
 }
 
+.widget ul {
+	list-style-type: none;
+	padding: 0;
+}
+
+.widget ul li {
+	line-height: var(--widget--line-height-list);
+}
+
+.widget ul.sub-menu,
+.widget ul.children {
+	margin-left: var(--widget--spacing-menu);
+}
+
+.widget ul .sub-menu-toggle {
+	display: none;
+}
+
+.widget a {
+	color: var(--footer--color-link);
+	text-decoration: underline;
+	text-decoration-style: solid;
+	text-decoration-color: currentColor;
+}
+
+.widget a:link,
+.widget a:visited,
+.widget a:active {
+	color: var(--footer--color-link);
+}
+
+.widget a:hover {
+	color: var(--footer--color-link-hover);
+	text-decoration-style: dotted;
+}
+
 .search-form {
 	display: flex;
 	flex-wrap: wrap;
diff --git a/src/wp-content/themes/twentytwentyone/style.css.map b/src/wp-content/themes/twentytwentyone/style.css.map
index c95bf3b77d..e5c24fd062 100644
--- a/src/wp-content/themes/twentytwentyone/style.css.map
+++ b/src/wp-content/themes/twentytwentyone/style.css.map
@@ -1 +1 @@
-{"version":3,"sourceRoot":"","sources":["assets/sass/01-settings/file-header.scss","assets/sass/style.scss","assets/sass/01-settings/global.scss","assets/sass/03-generic/normalize.scss","assets/sass/03-generic/breakpoints.scss","assets/sass/03-generic/vertical-margins.scss","assets/sass/03-generic/reset.scss","assets/sass/03-generic/clearings.scss","assets/sass/04-elements/blockquote.scss","assets/sass/04-elements/forms.scss","assets/sass/04-elements/media.scss","assets/sass/04-elements/misc.scss","assets/sass/04-elements/links.scss","assets/sass/05-blocks/audio/_style.scss","assets/sass/05-blocks/button/_style.scss","assets/sass/02-tools/mixins.scss","assets/sass/05-blocks/code/_style.scss","assets/sass/05-blocks/columns/_style.scss","assets/sass/05-blocks/cover/_style.scss","assets/sass/05-blocks/file/_style.scss","assets/sass/05-blocks/gallery/_style.scss","assets/sass/05-blocks/group/_style.scss","assets/sass/05-blocks/heading/_style.scss","assets/sass/05-blocks/image/_style.scss","assets/sass/05-blocks/latest-comments/_style.scss","assets/sass/05-blocks/latest-posts/_style.scss","assets/sass/05-blocks/legacy/_style.scss","assets/sass/05-blocks/list/_style.scss","assets/sass/05-blocks/media-text/_style.scss","assets/sass/05-blocks/navigation/_style.scss","assets/sass/05-blocks/paragraph/_style.scss","assets/sass/05-blocks/preformatted/_style.scss","assets/sass/05-blocks/pullquote/_style.scss","assets/sass/05-blocks/query-loop/_style.scss","assets/sass/05-blocks/quote/_style.scss","assets/sass/05-blocks/rss/_style.scss","assets/sass/05-blocks/search/_style.scss","assets/sass/05-blocks/separator/_style.scss","assets/sass/05-blocks/social-icons/_style.scss","assets/sass/05-blocks/spacer/_style.scss","assets/sass/05-blocks/table/_style.scss","assets/sass/05-blocks/tag-clould/_style.scss","assets/sass/05-blocks/verse/_style.scss","assets/sass/05-blocks/video/_style.scss","assets/sass/05-blocks/utilities/_font-sizes.scss","assets/sass/05-blocks/utilities/_style.scss","assets/sass/06-components/header.scss","assets/sass/06-components/footer.scss","assets/sass/06-components/single.scss","assets/sass/06-components/posts-and-pages.scss","assets/sass/06-components/entry.scss","assets/sass/06-components/archives.scss","assets/sass/06-components/404.scss","assets/sass/06-components/search.scss","assets/sass/06-components/comments.scss","assets/sass/06-components/navigation.scss","assets/sass/06-components/footer-navigation.scss","assets/sass/06-components/pagination.scss","assets/sass/06-components/widgets.scss","assets/sass/07-utilities/a11y.scss","assets/sass/07-utilities/color-palette.scss","assets/sass/07-utilities/measure.scss","assets/sass/07-utilities/ie.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;ACEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6EA;AC/EA;AAKA;AAEC;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;AAEA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EAEA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;AAAyD;EACzD;AAAsD;EACtD;EACA;AAAwD;EACxD;AAAsD;AAEtD;EACA;EACA;EACA;EACA;AAEA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;AAEA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAC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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAeC;EACA;EACA;EACA;EACA;EAEA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACC;EACA;EACA;;AAGD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACC;;AAGD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACC;;;AAOD;EACC;;AAEA;EACC;;;AAKH;EACC;EACA;;;AAGD;AAAA;AAGC;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;;AAGD;EACC;EACA;;;AAIF;EACC;;;AAGD;EACC;EACA;EACA;;;AAGD;AAAA;AAAA;AAAA;AAAA;AAKA;EAEC;AAAA;IAEC;IACA;IACA;IACA;IACA;IACA;IACA;;EAEA;AAAA;IACC;;EAGD;AAAA;IACC;;;EAMD;IACC;IACA;;EAGD;IACC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAGD;IACC;;EAEA;IACC;;;EAKH;IACC;;EAEA;IACC;IACA;;EAGD;IACC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAGD;IACC;;EAEA;IACC;;EAID;IACC;IACA;;;AAMJ;AAAA;EAEC;EACA;EACA;EACA;;;AAGD;AAAA;AAAA;AAGA;EAEC;IACC;AAA0B;IAC1B;AAAa;IACb;IACA;IACA;IACA;;EAEA;IACC;;;EAIF;IACC;IACA;IACA;IACA;IACA;IACA;IACA;;;EAGD;IACC;IACA;IACA;IACA;IACA;IACA;IACA;;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;;;AAGD;EACC;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EA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EAEC;;AAKF;AAAA;EAEC;EACA;EACA;EACA;;AAID;EACC;EACA;;AAEA;EAEC;EACA;;AAKF;EACC;EACA;;AAEA;AAAA;EAEC;EACA;EACA;EACA;;AAEA;AAAA;EACC;EACA;;AAIF;EAEC;EACA;;AAEA;EACC;EACA;EACA;;AAEA;EACC;;AAMF;EAEE;IACC;;EADD;IACC;;EADD;IACC;;EADD;IACC;;EADD;IACC;;;AASJ;EACC;EACA;;AAEA;EACC;;AAIF;EACC;EACA;;;AC/KH;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;;AAIF;EACC;;;AAID;EACC;;;ACrDD;AAAA;EAEC;EACA;EACA;;AAGA;AAAA;EACC;EACA;;AAGD;AAAA;EACC;EACA;EACA;;;AAIF;EACC;;AAEA;EACC;;;AAIF;EACC;;AAEA;EACC;;;AAIF;EACC;EACA;;;AAGD;EACC;EACA;;;AC1CD;AAqCC;AAAA;AAAA;;AAnCA;EACC;EACA;;AAGD;EACC;;AAGD;EACC;;AxB0BA;EwB3BD;IAIE;;;AAGD;EACC;EACA;;AxBMD;EwBRA;IAKE;IACA;;;AAGD;EACC;;AAGD;EACC;;AxBNF;EwBeD;IAEE;IACA;;;AAKF;EACC;;;AChDD;EACC;;AAEA;EACC;;AAGD;EACC;EACA;EACA;;AAIF;EACC;;AAQC;EACC;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIC;EACC;EACA;;AAIF;EACC;;AAOD;EACC;EACA;EACA;;AAOF;EACC;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;;AAQH;EACC;;AAEA;EACC;;AAWA;EAEC;;AAGD;EACC;EACA;;AAKH;EACC;;;AC5HH;EAEC;;AAGA;EACC;;AAID;EACC;;;ACXF;EACC;EACA;;;ACFD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAqCA;AAAA;AAAA;;AAnCA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;;AAGD;AAAA;AAAA;EAGC;EACA;EACA;EACA;EACA;;AAMD;EACC;;AAKA;AAAA;EAEC;;AAIF;EAEC;;AAGD;EAEC;;AAGD;EACC;EACA;EACA;EACA;EACA;;AAEA;EAPD;IAQE;;;AAGD;EACC;;AAGD;EACC;EACA;;AAEA;EACC;;AAIF;AAAA;AAAA;EAGC;;AAGD;EAEC;;AAEA;EACC;;;ACvGH;EACC;;A7BuBA;E6BxBD;IAIE;;;;ACNH;EACC;AAqBA;AAAA;AAAA;;AAnBA;EACC;EACA;EACA;EACA;;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIC;;AAOF;EACC;EACA;EACA;;AAGA;EACC;;AAID;EACC;EACA;EACA;EACA;EACA;;AAIF;EACC;;AAEA;EACC;;AAIF;EAEC;EACA;AAEA;EACA;EACA;;AAEA;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;;AAMA;EACC;;AAID;EACC;EACA;EACA;EACA;EACA;;AAIF;AAAA;AAAA;AAAA;AAAA;EAGC;EACA;;A9B3ED;E8BiCD;IA8CE;;EAEA;IACC;;EAGD;IACC;IACA;;EAEA;IACC;;EAIF;IACC;IACA;;;A9BhGF;E8BuGA;IACC;IACA;;EAEA;IACC;;EAIF;IACC;IACA;;;;ACtIH;EACC;;AAEA;EACC;;AAID;EACC;EACA;;AAEA;EACC;;AAGD;EACC;;AAMD;EACC;;AAEA;EACC;;AAKF;EAUC;;AAIF;EACC;EACA;;AAEA;EACC;;AAGD;EACC;;AAKF;EACC;EACA;EACA;EACA;EACA;EACA;;AAID;EACC;EACA;EACA;;AAID;EACC;EACA;EACA;;AAEA;EAEC;;AAKF;AAAA;EAEC;EACA;EACA;EACA;;AAID;EACC;EACA;;AAEA;EAEC;EACA;;;ACzGH;EACC;;AAIC;EACC;;AAIF;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;;AAGD;EACC;;AAIF;EACC;EACA;;AAEA;EACC;;AAEA;EACC;EACA;EACA;;AAOD;EACC;EACA;;AAGD;EACC;;AAOF;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAGD;EACC;EACA;EACA;;AAGA;EACC;EACA;EACA;;AAIF;EACC;;AAGA;EACC;;AAGD;EACC;;AAEA;EACC;EACA;;AAIF;EACC;;;AAOL;EACC;;;AClHD;EACC;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;AAiBA;AAAA;AAAA;;AAfA;EACC;;AAKA;EACC;;AAGD;EACC;;AAOF;EACC;;AAKA;EAEC;;AAEA;EACC;;AAIF;EACC;EACA;EACA;EACA;;AAIF;EAIC;;;ACtDF;EACC;;AAKA;EACC;;AAGD;EAEC;;;ACdH;EACC;EAEA;EACA;;AnCgBC;EmCZA;IACC;;;;ACTH;AAAA;EAEC;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;EAEC;;AAGD;AAAA;EACC;;AAGD;AAAA;AAAA;AAAA;EAEC;EACA;;AAGD;AAAA;EACC;EACA;;AAGD;AAAA;AAAA;AAAA;AAAA;AAAA;EAKC;;AAGD;AAAA;EACC;;AAEA;AAAA;AAAA;AAAA;EAEC;;AAGD;AAAA;EACC;;AAGD;AAAA;EACC;;;AAOF;AAAA;EAEC;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;;AAGD;AAAA;EAEC;EACA;;AAGD;EACC;EACA;EACA;EACA;;;AAIF;EACC;EACA;;AAEA;EACC;EACA;;AAEA;EACC;;AAIF;EACC;;;AC9FD;EACC;EACA;;;ACJF;EACC;;;ACCA;EACC;EACA;EACA;EACA;EACA;;;AAIF;EACC;EACA;EACA;;;ACXA;AAAA;EAEC;;AAGD;AAAA;EAEC;;AAGD;AAAA;AAAA;AAAA;AAAA;EAKC;;AAGD;AAAA;EAEC;EACA;;AAGD;AAAA;AAAA;AAAA;EAIC;EACA;;AAGD;AAAA;EAEC;EACA;EAGA;;AAGD;AAAA;EAEC;EACA;EAGA;;;AClDF;AAEA;AAAA;AAAA;AAQA;AAAA;AAAA;AAGA;AAEC;EACA;EAEA;;;AAKD;EACC;;;AzCEC;EyCID;AAEC;IACA;AAEA;IACA;IACA;;;EAGD;IACC;;;AAIF;AAAA;AAAA;AAGA;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;AAAA;AAAA;AAGA;EAEC;EACA;;;AAKD;EACC;;;AzC3CC;EyCiDD;AAEC;IACA;AAEA;IACA;;;EAGD;IACC;;;AAKF;AAAA;EAEC;;;AAGD;AAAA;AAAA;AAGA;EACC;;;AAQD;AAAA;AAAA;AAGA;EACC;;;AAUD;EACC;;;AAGD;EACC;;;AAID;EACC;;;AAID;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;EACC;;AzChIC;EyC+HF;IAIE;;;;A5CvDF;A6CrGA;EAEC;EACA;EACA;EACA;;AAEA;EACC;;A1CiBA;E0CzBF;IAYE;;;A1CiDA;E0C7DF;IAgBE;;;;AAKF;EACC;EACA;;AAEA;EACC;EACA;EACA;;A1CHA;E0CJF;IAWE;IACA;;;;AAKF;EAEC;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;;AAEA;EAGC;;AAGD;EAEC;;A1CnCD;E0CaF;IA4BE;;;;AAKF;EACC;EACA;EACA;EACA;;;AAGD;EACC;;;AAID;EAEC;;AAEA;EACC;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;A1C5EA;E0CiFA;IACC;IACA;IACA;IACA;;;;A1C3FD;E0C0GG;IACC;IACA;IACA;IACA;;EAEA;IACC;;EAGD;IACC;;EAMJ;IACC;;EAEA;IACC;;EAEA;IACC;;EAIF;IACC;;EAKA;IACC;;EAGD;IACC;IACA;;EAGD;IACC;IACA;IACA;;EAEA;IAGC;IACA;IACA;;EAWH;IACC;IACA;;EAKH;IACC;;;ACrMH;EACC;EACA;;AAIA;EACC;;A3CYA;E2CPA;IACC;;;;AAMH;EACC;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;;AAGD;EACC;;A3C4BA;E2C1CF;IAkBE;IACA;;EAEA;IACC;IACA;;;AAIF;EACC;;AAEA;EAGC;;AAGD;EACC;;AAGD;EACC;;AAEA;EACC;;AAID;EACC;;;ACrEJ;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;ACXD;EACC;;;AAID;EACC;;AAEA;EACC;EACA;EACA;EACA;EACA;;AAEA;EACC;;;ACpBH;EAEC;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;;AAEA;EACC;;AAGD;EACC;;AAGD;EACC;;;AAKH;EACC;;;AAGD;EACC;EACA;;;AAGD;AAAA;AAAA;AAIA;AAAA;EAEC;;;AAKA;EACC;;AAID;EAEC;EACA;;AASF;EAEC;EACA;EACA;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;AAEA;EAEC;;AAGD;EACC;;;AAMH;EACC;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EAEC;EACA;;AAGD;EACC;;AAGD;AAAA;AAAA;AAAA;EAIC;;A9C1GA;E8CiFF;IA6BE;;EAEA;IACC;;EAGD;AAAA;IAEC;;;;AAKH;AAAA;AAAA;AAIA;EAEC;;AAOA;EACC;EACA;EACA;EACA;EACA;EACA;;;AAIF;AAAA;AAAA;AAIA;EACC;EACA;EACA;;AAEA;EACC;;AAMA;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;;AAMD;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;;;AC9MH;EACC;;;AAGD;AAAA;EAEC;;;AAGD;EACC;;;AAGD;EACC;EACA;;;AAaE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACC;;AAUF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACC;;AAMD;AAAA;AAAA;AAAA;AAAA;AAAA;EAEC;;AAQA;AAAA;AAAA;EACC;;;AAMJ;EACC;EACA;EACA;;;AClED;EACC;EACA;;;ACFD;EACC;;;ACDD;AAAA;AAAA;AAKC;EACC;EACA;;AAEA;EACC;;AAGD;EACC;;AAMD;EACC;EACA;EACA;;AAGD;EACC;EACA;;AAGD;EACC;;;AAMH;AAAA;AAAA;AAIA;AAAA;EAEC;EACA;;;AAGD;EACC;EACA;;AAIC;EACC;EACA;EACA;EACA;EACA;;;AAKH;AACA;EACC;;;AAGD;AAAA;AAAA;AAGA;EACC;EACA;;AAEA;EACC;EACA;;;AAKF;EACC;EACA;;AAEA;EACC;EACA;;;AlD/DA;EkDoEF;AAAA;IAGE;;;;AAIF;AAAA;AAAA;AAKC;EACC;EACA;;AlDlFA;EkDgFD;IAKE;IACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;;AAKF;EACC;EACA;EACA;;AAEA;EACC;;AlD1GD;EkD8EF;IAkCE;;EAEA;IACC;;;;AAKH;EACC;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;AAAA;EAEC;;;AAID;EACC;EACA;;AAEA;EACC;EACA;;AAGD;EACC;;;AAIF;EACC;;;AAID;AAAA;EAEC;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;;AAEA;EACC;;AAGD;EACC;;AAEA;EACC;;;AAKH;EACC;;AAEA;EACC;;;AAIF;EACC;EACA;;AAEA;EACC;;AAGD;EACC;;AAGD;AAAA;EAEC;;AAGD;AAAA;EAEC;EACA;;AlD3NA;EkDwND;AAAA;IAME;;;AAIF;AAAA;EAEC;EACA;;;AAIF;EACC;;AAEA;EACC;;AAGD;EACC;;AAGD;AAAA;AAAA;AAAA;AAAA;EAKC;EACA;EACA;EACA;EACA;;AAGD;EACC;;AlD3PA;EkDgQA;IACC;;EAGD;IAEC;;;;AC5RH;EACC;EACA;EACA;EACA;EACA;EACA;;AnDUC;EmDhBF;IASE;;;AAID;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;;AAEA;EACC;;AAID;EACC;EACA;;AAGD;EACC;;AAQA;EACC;;AAGD;EACC;;AAEA;EACC;EACA;;AAQL;EACC;EACA;EACA;;AAEA;EACC;;;AAKH;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;;AnDpFA;EmDqED;IAkBE;IACA;IACA;IACA;IACA;;EAEA;IACC;IACA;;EAGD;IACC;;EAGD;IACC;;EAGD;IACC;;;AnD3GF;EmDiHD;IAGE;IACA;IACA;;;AAGD;EACC;EACA;EACA;EACA;;AnD7HD;EmDoIC;IACC;;;AnD/HF;EmDoDF;IAiFE;IACA;;EAGA;IACC;IACA;IACA;IACA;IACA;IACA;IACA;;EAID;IACC;;EAID;IACC;;EAID;IACC;;EAEA;IACC;;;AAMH;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AnDtLA;EmD8KD;IAWE;;EAEA;IACC;;;AAIF;EACC;EACA;EACA;;AnD7LD;EmD0LA;IAME;IACA;;EAEA;IACC;;;AAMH;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;;AnD5NF;EmDgNA;IAgBE;;;AAGD;AAAA;EAEC;EACA;EACA;;AAEA;AAAA;EACC;;AAIF;EACC;;AAMA;EACC;;AAGD;EACC;;AAMH;EAEC;;AnD5PD;EmD0PA;IAKE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEA;IAEC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAGD;IACC;IACA;;EAGD;IACC;;EAGD;AAEC;IACA;AAEA;IACA;;EAEA;AAGC;IACA;AAEA;IACA;;EAIF;AAEC;IACA;AAEA;IACA;;EAEA;AAGC;IACA;AAEA;IACA;;;AAQL;EACC;;AnDzUA;EmD4UD;IAGE;IACA;;EAGA;IACC;;EAEA;IACC;IACA;;EAEA;IACC;;;AAQL;EACC;EACA;EACA;EACA;EACA;EACA;;AnDzWA;EmDmWD;IASE;IACA;IACA;IACA;;;AAGD;EACC;;AAGD;EAGC;;AAGD;EACC;EACA;;AAGD;EACC;EACA;EACA;EACA;;AAIF;AAAA;EAEC;EACA;;AAEA;AAAA;EACC;EACA;;AAKF;EACC;EACA;EACA;EACA;EACA;;AAEA;EACC;;AnD7ZD;EmDoaC;IACC;;;AnD3aF;EmDmbE;IACC;;;AAKF;EACC;EACA;EACA;EACA;;AnDvbF;EmDmbC;IAOE;IACA;;;AASH;EACC;;AnDrcD;EmD0cC;IACC;IACA;;EAGD;IACC;;;AAMH;EACC;EACA;EACA;EACA;EACA;;AAEA;EACC;;;AnDpeD;EmD4eD;IACC;IACA;IACA;;;AAKF;EAEC;IACC;;EAGD;IACC;;;AC9gBF;EACC;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;;AAEA;EACC;EAEA;;AAEA;EACC;EACA;EACA;;AAEA;EAGC;;AAGD;EACC;EACA;EACA;EACA;;AAOC;EACC;;AAOD;EACC;;AAMJ;EACC;EACA;;AAEA;EACC;;AAKH;AAAA;EAEC;;;ACtEF;AAGA;EACC;;AAEA;EACC;EACA;;AAEA;EACC;EACA;EACA;;AAGD;EACC;;AAGD;EACC;;AAMD;EACC;EACA;;AAGD;AAAA;EAEC;EACA;;AAGD;EACC;;ArDDD;EqDbD;IAkBE;IACA;IACA;;EAEA;AAAA;IAEC;IACA;IACA;IACA;;EAGD;IACC;;;AAKH;EACC;EACA;EACA;EACA;;AAGD;AAAA;EAEC;EACA;;AAGD;AAAA;EAEC;EACA;;;AAKF;EAEC;;ArDtBC;EqDoBF;IAKE;;;AAKD;EACC;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;;ArDxCA;EqDmCD;IAOE;;;ArD9ED;EqDkFD;IAEE;;;AAIF;AAAA;EAEC;EACA;;AAEA;AAAA;EACC;;AAGD;AAAA;EACC;;;AAMH;AAAA;EAGC;EACA;EACA;;ArDzEC;EqDoEF;AAAA;IAQE;;;AAMD;AAAA;EACC;;AAEA;AAAA;EACC;;AAKA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGC;;AAMD;AAAA;AAAA;AAAA;AAAA;AAAA;EAGC;;AAKH;AAAA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACC;;AAGD;AAAA;EACC;;AAGD;AAAA;EACC;;AAGD;AAAA;EACC;;AAGD;AAAA;EACC;;AAGD;AAAA;EACC;;ArDhJD;EqDsJA;AAAA;IACC;IACA;;EAGD;AAAA;IACC;;EAEA;AAAA;AAAA;IAEC;IACA;;;ArDrMF;EqD4MA;AAAA;IACC;;;;AAMH;EACC;EACA;;ArD3KC;EqDyKF;IAKE;;;AAGD;EACC;;;AChPF;EAEC;EACA;EACA;EACA;EACA;;AtD4CC;EsDlDF;IASE;IACA;IACA;;;AtD+DA;EsD1EF;IAeE;;;AtDKA;EsDpBF;IAmBE;;;AAGD;EACC;EACA;;AAEA;EACC;;AAGD;EAEC;;AAGD;EACC;;AAIF;EACC;EACA;EACA;EACA;;AAEA;EAGC;;AAGD;EACC;EACA;;AAMD;EACC;EACA;;AAGD;EACC;;AAIF;EACC;EACA;EACA;;;AAMD;AAAA;AAAA;AAAA;AAAA;AAAA;EAMC;EACA;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;;AAKF;EACC;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;;AAGD;EACC;EACA;;;AAMD;EACC;EACA;EACA;;AAGD;EACC;EACA;;;AAIF;EACC;;;AzDtCD;A0DrHA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;AACA;EACC;;;AAGD;EAEC;IACC;IACA;;;AC3CF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAQD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAQC;;;AAIF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAOD;EAGG;;AAGF;EACC;EAKA;;AAHA;EACC;;AAMH;EAOG;;AAGF;EACC;EAKA;;AAHA;EACC;;;AAQJ;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AChRD;AAAA;AAAA;EAGC;;;AAGD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWC;;;AClBA;EACC;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWC;;AAGD;AAAA;AAAA;AAAA;EAIC;;AAGD;EACC;;A1DPD;E0DaE;AAAA;IAEC;;;AAKH;EACC;;AAIF;EACC;;AAGD;EACC","file":"style.css"}
\ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["assets/sass/01-settings/file-header.scss","assets/sass/style.scss","assets/sass/01-settings/global.scss","assets/sass/03-generic/normalize.scss","assets/sass/03-generic/breakpoints.scss","assets/sass/03-generic/vertical-margins.scss","assets/sass/03-generic/reset.scss","assets/sass/03-generic/clearings.scss","assets/sass/04-elements/blockquote.scss","assets/sass/04-elements/forms.scss","assets/sass/04-elements/media.scss","assets/sass/04-elements/misc.scss","assets/sass/04-elements/links.scss","assets/sass/05-blocks/audio/_style.scss","assets/sass/05-blocks/button/_style.scss","assets/sass/02-tools/mixins.scss","assets/sass/05-blocks/code/_style.scss","assets/sass/05-blocks/columns/_style.scss","assets/sass/05-blocks/cover/_style.scss","assets/sass/05-blocks/file/_style.scss","assets/sass/05-blocks/gallery/_style.scss","assets/sass/05-blocks/group/_style.scss","assets/sass/05-blocks/heading/_style.scss","assets/sass/05-blocks/image/_style.scss","assets/sass/05-blocks/latest-comments/_style.scss","assets/sass/05-blocks/latest-posts/_style.scss","assets/sass/05-blocks/legacy/_style.scss","assets/sass/05-blocks/list/_style.scss","assets/sass/05-blocks/media-text/_style.scss","assets/sass/05-blocks/navigation/_style.scss","assets/sass/05-blocks/paragraph/_style.scss","assets/sass/05-blocks/preformatted/_style.scss","assets/sass/05-blocks/pullquote/_style.scss","assets/sass/05-blocks/query-loop/_style.scss","assets/sass/05-blocks/quote/_style.scss","assets/sass/05-blocks/rss/_style.scss","assets/sass/05-blocks/search/_style.scss","assets/sass/05-blocks/separator/_style.scss","assets/sass/05-blocks/social-icons/_style.scss","assets/sass/05-blocks/spacer/_style.scss","assets/sass/05-blocks/table/_style.scss","assets/sass/05-blocks/tag-clould/_style.scss","assets/sass/05-blocks/verse/_style.scss","assets/sass/05-blocks/video/_style.scss","assets/sass/05-blocks/utilities/_font-sizes.scss","assets/sass/05-blocks/utilities/_style.scss","assets/sass/06-components/header.scss","assets/sass/06-components/footer.scss","assets/sass/06-components/single.scss","assets/sass/06-components/posts-and-pages.scss","assets/sass/06-components/entry.scss","assets/sass/06-components/archives.scss","assets/sass/06-components/404.scss","assets/sass/06-components/search.scss","assets/sass/06-components/comments.scss","assets/sass/06-components/navigation.scss","assets/sass/06-components/footer-navigation.scss","assets/sass/06-components/pagination.scss","assets/sass/06-components/widgets.scss","assets/sass/07-utilities/a11y.scss","assets/sass/07-utilities/color-palette.scss","assets/sass/07-utilities/measure.scss","assets/sass/07-utilities/ie.scss"],"names":[],"mappings":";AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;ACEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA6EA;AC/EA;AAKA;AAEC;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;AAEA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EAEA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;AAAyD;EACzD;AAAsD;EACtD;EACA;AAAwD;EACxD;AAAsD;AAEtD;EACA;EACA;EACA;EACA;AAEA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;AAEA;EAEA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EAEA;EACA;EAEA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAC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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAeC;EACA;EACA;EACA;EACA;EAEA;EACA;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACC;EACA;EACA;;AAGD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACC;;AAGD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACC;;;AAOD;EACC;;AAEA;EACC;;;AAKH;EACC;EACA;;;AAGD;AAAA;AAGC;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;;AAGD;EACC;EACA;;;AAIF;EACC;;;AAGD;EACC;EACA;EACA;;;AAGD;AAAA;AAAA;AAAA;AAAA;AAKA;EAEC;AAAA;IAEC;IACA;IACA;IACA;IACA;IACA;IACA;;EAEA;AAAA;IACC;;EAGD;AAAA;IACC;;;EAMD;IACC;IACA;;EAGD;IACC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAGD;IACC;;EAEA;IACC;;;EAKH;IACC;;EAEA;IACC;IACA;;EAGD;IACC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAGD;IACC;;EAEA;IACC;;EAID;IACC;IACA;;;AAMJ;AAAA;EAEC;EACA;EACA;EACA;;;AAGD;AAAA;AAAA;AAGA;EAEC;IACC;AAA0B;IAC1B;AAAa;IACb;IACA;IACA;IACA;;EAEA;IACC;;;EAIF;IACC;IACA;IACA;IACA;IACA;IACA;IACA;;;EAGD;IACC;IACA;IACA;IACA;IACA;IACA;IACA;;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;;;AAGD;EACC;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EA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EAEC;;AAKF;AAAA;EAEC;EACA;EACA;EACA;;AAID;EACC;EACA;;AAEA;EAEC;EACA;;AAKF;EACC;EACA;;AAEA;AAAA;EAEC;EACA;EACA;EACA;;AAEA;AAAA;EACC;EACA;;AAIF;EAEC;EACA;;AAEA;EACC;EACA;EACA;;AAEA;EACC;;AAMF;EAEE;IACC;;EADD;IACC;;EADD;IACC;;EADD;IACC;;EADD;IACC;;;AASJ;EACC;EACA;;AAEA;EACC;;AAIF;EACC;EACA;;;AC/KH;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;;AAIF;EACC;;;AAID;EACC;;;ACrDD;AAAA;EAEC;EACA;EACA;;AAGA;AAAA;EACC;EACA;;AAGD;AAAA;EACC;EACA;EACA;;;AAIF;EACC;;AAEA;EACC;;;AAIF;EACC;;AAEA;EACC;;;AAIF;EACC;EACA;;;AAGD;EACC;EACA;;;AC1CD;AAqCC;AAAA;AAAA;;AAnCA;EACC;EACA;;AAGD;EACC;;AAGD;EACC;;AxB0BA;EwB3BD;IAIE;;;AAGD;EACC;EACA;;AxBMD;EwBRA;IAKE;IACA;;;AAGD;EACC;;AAGD;EACC;;AxBNF;EwBeD;IAEE;IACA;;;AAKF;EACC;;;AChDD;EACC;;AAEA;EACC;;AAGD;EACC;EACA;EACA;;AAIF;EACC;;AAQC;EACC;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIC;EACC;EACA;;AAIF;EACC;;AAOD;EACC;EACA;EACA;;AAOF;EACC;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;;AAQH;EACC;;AAEA;EACC;;AAWA;EAEC;;AAGD;EACC;EACA;;AAKH;EACC;;;AC5HH;EAEC;;AAGA;EACC;;AAID;EACC;;;ACXF;EACC;EACA;;;ACFD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAqCA;AAAA;AAAA;;AAnCA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;;AAGD;AAAA;AAAA;EAGC;EACA;EACA;EACA;EACA;;AAMD;EACC;;AAKA;AAAA;EAEC;;AAIF;EAEC;;AAGD;EAEC;;AAGD;EACC;EACA;EACA;EACA;EACA;;AAEA;EAPD;IAQE;;;AAGD;EACC;;AAGD;EACC;EACA;;AAEA;EACC;;AAIF;AAAA;AAAA;EAGC;;AAGD;EAEC;;AAEA;EACC;;;ACvGH;EACC;;A7BuBA;E6BxBD;IAIE;;;;ACNH;EACC;AAqBA;AAAA;AAAA;;AAnBA;EACC;EACA;EACA;EACA;;AAOA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAIC;;AAOF;EACC;EACA;EACA;;AAGA;EACC;;AAID;EACC;EACA;EACA;EACA;EACA;;AAIF;EACC;;AAEA;EACC;;AAIF;EAEC;EACA;AAEA;EACA;EACA;;AAEA;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;;AAMA;EACC;;AAID;EACC;EACA;EACA;EACA;EACA;;AAIF;AAAA;AAAA;AAAA;AAAA;EAGC;EACA;;A9B3ED;E8BiCD;IA8CE;;EAEA;IACC;;EAGD;IACC;IACA;;EAEA;IACC;;EAIF;IACC;IACA;;;A9BhGF;E8BuGA;IACC;IACA;;EAEA;IACC;;EAIF;IACC;IACA;;;;ACtIH;EACC;;AAEA;EACC;;AAID;EACC;EACA;;AAEA;EACC;;AAGD;EACC;;AAMD;EACC;;AAEA;EACC;;AAKF;EAUC;;AAIF;EACC;EACA;;AAEA;EACC;;AAGD;EACC;;AAKF;EACC;EACA;EACA;EACA;EACA;EACA;;AAID;EACC;EACA;EACA;;AAID;EACC;EACA;EACA;;AAEA;EAEC;;AAKF;AAAA;EAEC;EACA;EACA;EACA;;AAID;EACC;EACA;;AAEA;EAEC;EACA;;;ACzGH;EACC;;AAIC;EACC;;AAIF;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;;AAGD;EACC;;AAIF;EACC;EACA;;AAEA;EACC;;AAEA;EACC;EACA;EACA;;AAOD;EACC;EACA;;AAGD;EACC;;AAOF;EACC;EACA;EACA;EACA;;AAEA;EACC;;AAGD;EACC;EACA;EACA;;AAGA;EACC;EACA;EACA;;AAIF;EACC;;AAGA;EACC;;AAGD;EACC;;AAEA;EACC;EACA;;AAIF;EACC;;;AAOL;EACC;;;AClHD;EACC;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;AAiBA;AAAA;AAAA;;AAfA;EACC;;AAKA;EACC;;AAGD;EACC;;AAOF;EACC;;AAKA;EAEC;;AAEA;EACC;;AAIF;EACC;EACA;EACA;EACA;;AAIF;EAIC;;;ACtDF;EACC;;AAKA;EACC;;AAGD;EAEC;;;ACdH;EACC;EAEA;EACA;;AnCgBC;EmCZA;IACC;;;;ACTH;AAAA;EAEC;EACA;EACA;;AAEA;AAAA;AAAA;AAAA;EAEC;;AAGD;AAAA;EACC;;AAGD;AAAA;AAAA;AAAA;EAEC;EACA;;AAGD;AAAA;EACC;EACA;;AAGD;AAAA;AAAA;AAAA;AAAA;AAAA;EAKC;;AAGD;AAAA;EACC;;AAEA;AAAA;AAAA;AAAA;EAEC;;AAGD;AAAA;EACC;;AAGD;AAAA;EACC;;;AAOF;AAAA;EAEC;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;;AAGD;AAAA;EAEC;EACA;;AAGD;EACC;EACA;EACA;EACA;;;AAIF;EACC;EACA;;AAEA;EACC;EACA;;AAEA;EACC;;AAIF;EACC;;;AC9FD;EACC;EACA;;;ACJF;EACC;;;ACCA;EACC;EACA;EACA;EACA;EACA;;;AAIF;EACC;EACA;EACA;;;ACXA;AAAA;EAEC;;AAGD;AAAA;EAEC;;AAGD;AAAA;AAAA;AAAA;AAAA;EAKC;;AAGD;AAAA;EAEC;EACA;;AAGD;AAAA;AAAA;AAAA;EAIC;EACA;;AAGD;AAAA;EAEC;EACA;EAGA;;AAGD;AAAA;EAEC;EACA;EAGA;;;AClDF;AAEA;AAAA;AAAA;AAQA;AAAA;AAAA;AAGA;AAEC;EACA;EAEA;;;AAKD;EACC;;;AzCEC;EyCID;AAEC;IACA;AAEA;IACA;IACA;;;EAGD;IACC;;;AAIF;AAAA;AAAA;AAGA;EACC;EACA;EACA;EACA;EACA;EACA;;;AAGD;AAAA;AAAA;AAGA;EAEC;EACA;;;AAKD;EACC;;;AzC3CC;EyCiDD;AAEC;IACA;AAEA;IACA;;;EAGD;IACC;;;AAKF;AAAA;EAEC;;;AAGD;AAAA;AAAA;AAGA;EACC;;;AAQD;AAAA;AAAA;AAGA;EACC;;;AAUD;EACC;;;AAGD;EACC;;;AAID;EACC;;;AAID;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;;;AAGD;EACC;;AzChIC;EyC+HF;IAIE;;;;A5CvDF;A6CrGA;EAEC;EACA;EACA;EACA;;AAEA;EACC;;A1CiBA;E0CzBF;IAYE;;;A1CiDA;E0C7DF;IAgBE;;;;AAKF;EACC;EACA;;AAEA;EACC;EACA;EACA;;A1CHA;E0CJF;IAWE;IACA;;;;AAKF;EAEC;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;;AAEA;EAGC;;AAGD;EAEC;;A1CnCD;E0CaF;IA4BE;;;;AAKF;EACC;EACA;EACA;EACA;;;AAGD;EACC;;;AAID;EAEC;;AAEA;EACC;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;A1C5EA;E0CiFA;IACC;IACA;IACA;IACA;;;;A1C3FD;E0C0GG;IACC;IACA;IACA;IACA;;EAEA;IACC;;EAGD;IACC;;EAMJ;IACC;;EAEA;IACC;;EAEA;IACC;;EAIF;IACC;;EAKA;IACC;;EAGD;IACC;IACA;;EAGD;IACC;IACA;IACA;;EAEA;IAGC;IACA;IACA;;EAWH;IACC;IACA;;EAKH;IACC;;;ACrMH;EACC;EACA;;AAIA;EACC;;A3CYA;E2CPA;IACC;;;;AAMH;EACC;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;;AAGD;AAAA;EAEC;;A3C2BA;E2C1CF;IAmBE;IACA;;EAEA;IACC;;EAGD;AAAA;IAEC;IACA;;EAGD;IACC;;;AAIF;EACC;;AAEA;EAGC;;AAGD;EACC;;AAGD;EACC;;AAEA;EACC;;AAID;EACC;;;AC/EJ;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;AAGD;EACC;EACA;EACA;;;ACXD;EACC;;;AAID;EACC;;AAEA;EACC;EACA;EACA;EACA;EACA;;AAEA;EACC;;;ACpBH;EAEC;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;;AAEA;EACC;;AAGD;EACC;;AAGD;EACC;;;AAKH;EACC;;;AAGD;EACC;EACA;;;AAGD;AAAA;AAAA;AAIA;AAAA;EAEC;;;AAKA;EACC;;AAID;EAEC;EACA;;AASF;EAEC;EACA;EACA;EACA;EACA;;AAEA;EACC;;AAGD;EACC;;AAEA;EAEC;;AAGD;EACC;;;AAMH;EACC;EACA;EACA;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EAEC;EACA;;AAGD;EACC;;AAGD;AAAA;AAAA;AAAA;EAIC;;A9C1GA;E8CiFF;IA6BE;;EAEA;IACC;;EAGD;AAAA;IAEC;;;;AAKH;AAAA;AAAA;AAIA;EAEC;;AAOA;EACC;EACA;EACA;EACA;EACA;EACA;;;AAIF;AAAA;AAAA;AAIA;EACC;EACA;EACA;;AAEA;EACC;;AAMA;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;;AAMD;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;;;AC9MH;EACC;;;AAGD;AAAA;EAEC;;;AAGD;EACC;;;AAGD;EACC;EACA;;;AAaE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACC;;AAUF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EACC;;AAMD;AAAA;AAAA;AAAA;AAAA;AAAA;EAEC;;AAQA;AAAA;AAAA;EACC;;;AAMJ;EACC;EACA;EACA;;;AClED;EACC;EACA;;;ACFD;EACC;;;ACDD;AAAA;AAAA;AAKC;EACC;EACA;;AAEA;EACC;;AAGD;EACC;;AAMD;EACC;EACA;EACA;;AAGD;EACC;EACA;;AAGD;EACC;;;AAMH;AAAA;AAAA;AAIA;AAAA;EAEC;EACA;;;AAGD;EACC;EACA;;AAIC;EACC;EACA;EACA;EACA;EACA;;;AAKH;AACA;EACC;;;AAGD;AAAA;AAAA;AAGA;EACC;EACA;;AAEA;EACC;EACA;;;AAKF;EACC;EACA;;AAEA;EACC;EACA;;;AlD/DA;EkDoEF;AAAA;IAGE;;;;AAIF;AAAA;AAAA;AAKC;EACC;EACA;;AlDlFA;EkDgFD;IAKE;IACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;;AAKF;EACC;EACA;EACA;;AAEA;EACC;;AlD1GD;EkD8EF;IAkCE;;EAEA;IACC;;;;AAKH;EACC;EACA;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;AAAA;EAEC;;;AAID;EACC;EACA;;AAEA;EACC;EACA;;AAGD;EACC;;;AAIF;EACC;;;AAID;AAAA;EAEC;EACA;;;AAGD;EACC;;;AAGD;EACC;EACA;;AAEA;EACC;;AAGD;EACC;;AAEA;EACC;;;AAKH;EACC;;AAEA;EACC;;;AAIF;EACC;EACA;;AAEA;EACC;;AAGD;EACC;;AAGD;AAAA;EAEC;;AAGD;AAAA;EAEC;EACA;;AlD3NA;EkDwND;AAAA;IAME;;;AAIF;AAAA;EAEC;EACA;;;AAIF;EACC;;AAEA;EACC;;AAGD;EACC;;AAGD;AAAA;AAAA;AAAA;AAAA;EAKC;EACA;EACA;EACA;EACA;;AAGD;EACC;;AlD3PA;EkDgQA;IACC;;EAGD;IAEC;;;;AC5RH;EACC;EACA;EACA;EACA;EACA;EACA;;AnDUC;EmDhBF;IASE;;;AAID;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;;AAEA;EACC;;AAID;EACC;EACA;;AAGD;EACC;;AAQA;EACC;;AAGD;EACC;;AAEA;EACC;EACA;;AAQL;EACC;EACA;EACA;;AAEA;EACC;;;AAKH;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;;AnDpFA;EmDqED;IAkBE;IACA;IACA;IACA;IACA;;EAEA;IACC;IACA;;EAGD;IACC;;EAGD;IACC;;EAGD;IACC;;;AnD3GF;EmDiHD;IAGE;IACA;IACA;;;AAGD;EACC;EACA;EACA;EACA;;AnD7HD;EmDoIC;IACC;;;AnD/HF;EmDoDF;IAiFE;IACA;;EAGA;IACC;IACA;IACA;IACA;IACA;IACA;IACA;;EAID;IACC;;EAID;IACC;;EAID;IACC;;EAEA;IACC;;;AAMH;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AnDtLA;EmD8KD;IAWE;;EAEA;IACC;;;AAIF;EACC;EACA;EACA;;AnD7LD;EmD0LA;IAME;IACA;;EAEA;IACC;;;AAMH;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;;AnD5NF;EmDgNA;IAgBE;;;AAGD;AAAA;EAEC;EACA;EACA;;AAEA;AAAA;EACC;;AAIF;EACC;;AAMA;EACC;;AAGD;EACC;;AAMH;EAEC;;AnD5PD;EmD0PA;IAKE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAEA;IAEC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAGD;IACC;IACA;;EAGD;IACC;;EAGD;AAEC;IACA;AAEA;IACA;;EAEA;AAGC;IACA;AAEA;IACA;;EAIF;AAEC;IACA;AAEA;IACA;;EAEA;AAGC;IACA;AAEA;IACA;;;AAQL;EACC;;AnDzUA;EmD4UD;IAGE;IACA;;EAGA;IACC;;EAEA;IACC;IACA;;EAEA;IACC;;;AAQL;EACC;EACA;EACA;EACA;EACA;EACA;;AnDzWA;EmDmWD;IASE;IACA;IACA;IACA;;;AAGD;EACC;;AAGD;EAGC;;AAGD;EACC;EACA;;AAGD;EACC;EACA;EACA;EACA;;AAIF;AAAA;EAEC;EACA;;AAEA;AAAA;EACC;EACA;;AAKF;EACC;EACA;EACA;EACA;EACA;;AAEA;EACC;;AnD7ZD;EmDoaC;IACC;;;AnD3aF;EmDmbE;IACC;;;AAKF;EACC;EACA;EACA;EACA;;AnDvbF;EmDmbC;IAOE;IACA;;;AASH;EACC;;AnDrcD;EmD0cC;IACC;IACA;;EAGD;IACC;;;AAMH;EACC;EACA;EACA;EACA;EACA;;AAEA;EACC;;;AnDpeD;EmD4eD;IACC;IACA;IACA;;;AAKF;EAEC;IACC;;EAGD;IACC;;;AC9gBF;EACC;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;;AAEA;EACC;EAEA;;AAEA;EACC;EACA;EACA;;AAEA;EAGC;;AAGD;EACC;EACA;EACA;EACA;;AAOC;EACC;;AAOD;EACC;;AAMJ;EACC;EACA;;AAEA;EACC;;AAKH;AAAA;EAEC;;;ACtEF;AAGA;EACC;;AAEA;EACC;EACA;;AAEA;EACC;EACA;EACA;;AAGD;EACC;;AAGD;EACC;;AAMD;EACC;EACA;;AAGD;AAAA;EAEC;EACA;;AAGD;EACC;;ArDDD;EqDbD;IAkBE;IACA;IACA;;EAEA;AAAA;IAEC;IACA;IACA;IACA;;EAGD;IACC;;;AAKH;EACC;EACA;EACA;EACA;;AAGD;AAAA;EAEC;EACA;;AAGD;AAAA;EAEC;EACA;;;AAKF;EAEC;;ArDtBC;EqDoBF;IAKE;;;AAKD;EACC;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;;ArDxCA;EqDmCD;IAOE;;;ArD9ED;EqDkFD;IAEE;;;AAIF;AAAA;EAEC;EACA;;AAEA;AAAA;EACC;;AAGD;AAAA;EACC;;;AAMH;AAAA;EAGC;EACA;EACA;;ArDzEC;EqDoEF;AAAA;IAQE;;;AAMD;AAAA;EACC;;AAEA;AAAA;EACC;;AAKA;AAAA;AAAA;AAAA;AAAA;AAAA;EAGC;;AAMD;AAAA;AAAA;AAAA;AAAA;AAAA;EAGC;;AAKH;AAAA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;AAAA;EACC;;AAGD;AAAA;EACC;;AAGD;AAAA;EACC;;AAGD;AAAA;EACC;;AAGD;AAAA;EACC;;AAGD;AAAA;EACC;;ArDhJD;EqDsJA;AAAA;IACC;IACA;;EAGD;AAAA;IACC;;EAEA;AAAA;AAAA;IAEC;IACA;;;ArDrMF;EqD4MA;AAAA;IACC;;;;AAMH;EACC;EACA;;ArD3KC;EqDyKF;IAKE;;;AAGD;EACC;;;AChPF;EAEC;EACA;EACA;EACA;EACA;;AtD4CC;EsDlDF;IASE;IACA;IACA;;;AtD+DA;EsD1EF;IAeE;;;AtDKA;EsDpBF;IAmBE;;;AAKA;EACC;EACA;;AAGD;EACC;;AAIF;EACC;EACA;EACA;;;AAMD;AAAA;AAAA;AAAA;AAAA;AAAA;EAMC;EACA;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;;AAGD;EACC;EACA;;AAEA;EACC;;AAGD;EAEC;;AAGD;EACC;;AAIF;EACC;EACA;EACA;EACA;;AAEA;EAGC;;AAGD;EACC;EACA;;;AAMH;EACC;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;;AAGD;EACC;EACA;;;AAMD;EACC;EACA;EACA;;AAGD;EACC;EACA;;;AAIF;EACC;;;AzDtCD;A0DrHA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGD;AACA;EACC;;;AAGD;EAEC;IACC;IACA;;;AC3CF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAQD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAQC;;;AAIF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAKF;EAMC;;AAJA;EACC;EACA;;;AAOD;EAGG;;AAGF;EACC;EAKA;;AAHA;EACC;;AAMH;EAOG;;AAGF;EACC;EAKA;;AAHA;EACC;;;AAQJ;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AAGD;EACC;;;AChRD;AAAA;AAAA;EAGC;;;AAGD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWC;;;AClBA;EACC;;AAEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAWC;;AAGD;AAAA;AAAA;AAAA;EAIC;;AAGD;EACC;;A1DPD;E0DaE;AAAA;IAEC;;;AAKH;EACC;;AAIF;EACC;;AAGD;EACC","file":"style.css"}
\ No newline at end of file
diff --git a/src/wp-content/themes/twentytwentytwo/assets/fonts/LICENSE.md b/src/wp-content/themes/twentytwentytwo/assets/fonts/LICENSE.md
new file mode 100644
index 0000000000..7cd3e749de
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/assets/fonts/LICENSE.md
@@ -0,0 +1,93 @@
+Copyright 2014 - 2021 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries.
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+
+This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+   in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+   redistributed and/or sold with any software, provided that each copy
+   contains the above copyright notice and this license. These can be
+   included either as stand-alone text files, human-readable headers or
+   in the appropriate machine-readable metadata fields within text or
+   binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+   Name(s) unless explicit written permission is granted by the corresponding
+   Copyright Holder. This restriction only applies to the primary font name as
+   presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+   Software shall not be used to promote, endorse or advertise any
+   Modified Version, except to acknowledge the contribution(s) of the
+   Copyright Holder(s) and the Author(s) or with their explicit written
+   permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+   must be distributed entirely under this license, and must not be
+   distributed under any other license. The requirement for fonts to
+   remain under this license does not apply to any document created
+   using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/src/wp-content/themes/twentytwentytwo/assets/fonts/SourceSerif4Variable-Italic.otf.woff2 b/src/wp-content/themes/twentytwentytwo/assets/fonts/SourceSerif4Variable-Italic.otf.woff2
new file mode 100644
index 0000000000..2387849154
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/fonts/SourceSerif4Variable-Italic.otf.woff2 differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/fonts/SourceSerif4Variable-Italic.ttf.woff2 b/src/wp-content/themes/twentytwentytwo/assets/fonts/SourceSerif4Variable-Italic.ttf.woff2
new file mode 100644
index 0000000000..4cbd4c351f
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/fonts/SourceSerif4Variable-Italic.ttf.woff2 differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/fonts/SourceSerif4Variable-Roman.otf.woff2 b/src/wp-content/themes/twentytwentytwo/assets/fonts/SourceSerif4Variable-Roman.otf.woff2
new file mode 100644
index 0000000000..28701e6842
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/fonts/SourceSerif4Variable-Roman.otf.woff2 differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/fonts/SourceSerif4Variable-Roman.ttf.woff2 b/src/wp-content/themes/twentytwentytwo/assets/fonts/SourceSerif4Variable-Roman.ttf.woff2
new file mode 100644
index 0000000000..3b74d300ad
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/fonts/SourceSerif4Variable-Roman.ttf.woff2 differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/images/bird-on-black.jpg b/src/wp-content/themes/twentytwentytwo/assets/images/bird-on-black.jpg
new file mode 100644
index 0000000000..684affb490
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/images/bird-on-black.jpg differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/images/bird-on-gray.jpg b/src/wp-content/themes/twentytwentytwo/assets/images/bird-on-gray.jpg
new file mode 100644
index 0000000000..4fde7652c3
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/images/bird-on-gray.jpg differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/images/bird-on-green.jpg b/src/wp-content/themes/twentytwentytwo/assets/images/bird-on-green.jpg
new file mode 100644
index 0000000000..f1b5505478
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/images/bird-on-green.jpg differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/images/bird-on-salmon.jpg b/src/wp-content/themes/twentytwentytwo/assets/images/bird-on-salmon.jpg
new file mode 100644
index 0000000000..727c70ea6b
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/images/bird-on-salmon.jpg differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/images/divider-black.png b/src/wp-content/themes/twentytwentytwo/assets/images/divider-black.png
new file mode 100644
index 0000000000..bfaafd737d
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/images/divider-black.png differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/images/divider-white.png b/src/wp-content/themes/twentytwentytwo/assets/images/divider-white.png
new file mode 100644
index 0000000000..0c045e5db2
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/images/divider-white.png differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/images/ducks.jpg b/src/wp-content/themes/twentytwentytwo/assets/images/ducks.jpg
new file mode 100644
index 0000000000..6c65eb4313
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/images/ducks.jpg differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-gray-a.jpg b/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-gray-a.jpg
new file mode 100644
index 0000000000..b533d0f140
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-gray-a.jpg differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-gray-b.jpg b/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-gray-b.jpg
new file mode 100644
index 0000000000..9314e9fa2f
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-gray-b.jpg differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-gray-c.jpg b/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-gray-c.jpg
new file mode 100644
index 0000000000..3797692068
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-gray-c.jpg differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-salmon.jpg b/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-salmon.jpg
new file mode 100644
index 0000000000..86731b9037
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-salmon.jpg differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-transparent-a.png b/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-transparent-a.png
new file mode 100644
index 0000000000..e89c08688f
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-transparent-a.png differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-transparent-b.png b/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-transparent-b.png
new file mode 100644
index 0000000000..417fed1d13
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-transparent-b.png differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-transparent-c.png b/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-transparent-c.png
new file mode 100644
index 0000000000..4f6c2e36d3
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-transparent-c.png differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-transparent-d.png b/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-transparent-d.png
new file mode 100644
index 0000000000..88892ea7c5
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/images/flight-path-on-transparent-d.png differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/images/icon-binoculars.png b/src/wp-content/themes/twentytwentytwo/assets/images/icon-binoculars.png
new file mode 100644
index 0000000000..283c38c925
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/images/icon-binoculars.png differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/images/icon-bird.jpg b/src/wp-content/themes/twentytwentytwo/assets/images/icon-bird.jpg
new file mode 100644
index 0000000000..dbfa90e40a
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/images/icon-bird.jpg differ
diff --git a/src/wp-content/themes/twentytwentytwo/assets/videos/birds.mp4 b/src/wp-content/themes/twentytwentytwo/assets/videos/birds.mp4
new file mode 100644
index 0000000000..2872b527bd
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/assets/videos/birds.mp4 differ
diff --git a/src/wp-content/themes/twentytwentytwo/functions.php b/src/wp-content/themes/twentytwentytwo/functions.php
new file mode 100644
index 0000000000..f15e42d2d9
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/functions.php
@@ -0,0 +1,151 @@
+<?php
+/**
+ * Twenty Twenty-Two functions and definitions
+ *
+ * @link https://developer.wordpress.org/themes/basics/theme-functions/
+ *
+ * @package WordPress
+ * @subpackage Twenty_Twenty_Two
+ * @since Twenty Twenty-Two 1.0
+ */
+
+
+if ( ! function_exists( 'twentytwentytwo_support' ) ) :
+
+	/**
+	 * Sets up theme defaults and registers support for various WordPress features.
+	 *
+	 * @since Twenty Twenty-Two 1.0
+	 *
+	 * @return void
+	 */
+	function twentytwentytwo_support() {
+
+		// Add support for block styles.
+		add_theme_support( 'wp-block-styles' );
+
+		// Enqueue editor styles.
+		add_editor_style( 'style.css' );
+
+	}
+
+endif;
+
+add_action( 'after_setup_theme', 'twentytwentytwo_support' );
+
+if ( ! function_exists( 'twentytwentytwo_styles' ) ) :
+
+	/**
+	 * Enqueue styles.
+	 *
+	 * @since Twenty Twenty-Two 1.0
+	 *
+	 * @return void
+	 */
+	function twentytwentytwo_styles() {
+		// Register theme stylesheet.
+		$theme_version = wp_get_theme()->get( 'Version' );
+
+		$version_string = is_string( $theme_version ) ? $theme_version : false;
+		wp_register_style(
+			'twentytwentytwo-style',
+			get_template_directory_uri() . '/style.css',
+			array(),
+			$version_string
+		);
+
+		// Add styles inline.
+		wp_add_inline_style( 'twentytwentytwo-style', twentytwentytwo_get_font_face_styles() );
+
+		// Enqueue theme stylesheet.
+		wp_enqueue_style( 'twentytwentytwo-style' );
+
+	}
+
+endif;
+
+add_action( 'wp_enqueue_scripts', 'twentytwentytwo_styles' );
+
+if ( ! function_exists( 'twentytwentytwo_editor_styles' ) ) :
+
+	/**
+	 * Enqueue editor styles.
+	 *
+	 * @since Twenty Twenty-Two 1.0
+	 *
+	 * @return void
+	 */
+	function twentytwentytwo_editor_styles() {
+
+		// Add styles inline.
+		wp_add_inline_style( 'wp-block-library', twentytwentytwo_get_font_face_styles() );
+
+	}
+
+endif;
+
+add_action( 'admin_init', 'twentytwentytwo_editor_styles' );
+
+
+if ( ! function_exists( 'twentytwentytwo_get_font_face_styles' ) ) :
+
+	/**
+	 * Get font face styles.
+	 * Called by functions twentytwentytwo_styles() and twentytwentytwo_editor_styles() above.
+	 *
+	 * @since Twenty Twenty-Two 1.0
+	 *
+	 * @return string
+	 */
+	function twentytwentytwo_get_font_face_styles() {
+
+		return "
+		@font-face{
+			font-family: 'Source Serif Pro';
+			font-weight: 200 900;
+			font-style: normal;
+			font-stretch: normal;
+			font-display: swap;
+			src: url('" . get_theme_file_uri( 'assets/fonts/SourceSerif4Variable-Roman.ttf.woff2' ) . "') format('woff2');
+		}
+
+		@font-face{
+			font-family: 'Source Serif Pro';
+			font-weight: 200 900;
+			font-style: italic;
+			font-stretch: normal;
+			font-display: swap;
+			src: url('" . get_theme_file_uri( 'assets/fonts/SourceSerif4Variable-Italic.ttf.woff2' ) . "') format('woff2');
+		}
+		";
+
+	}
+
+endif;
+
+if ( ! function_exists( 'twentytwentytwo_preload_webfonts' ) ) :
+
+	/**
+	 * Preloads the main web font to improve performance.
+	 *
+	 * Only the main web font (font-style: normal) is preloaded here since that font is always relevant (it is used
+	 * on every heading, for example). The other font is only needed if there is any applicable content in italic style,
+	 * and therefore preloading it would in most cases regress performance when that font would otherwise not be loaded
+	 * at all.
+	 *
+	 * @since Twenty Twenty-Two 1.0
+	 *
+	 * @return void
+	 */
+	function twentytwentytwo_preload_webfonts() {
+		?>
+		<link rel="preload" href="<?php echo esc_url( get_theme_file_uri( 'assets/fonts/SourceSerif4Variable-Roman.ttf.woff2' ) ); ?>" as="font" type="font/woff2" crossorigin>
+		<?php
+	}
+
+endif;
+
+add_action( 'wp_head', 'twentytwentytwo_preload_webfonts' );
+
+// Add block patterns
+require get_template_directory() . '/inc/block-patterns.php';
diff --git a/src/wp-content/themes/twentytwentytwo/inc/block-patterns.php b/src/wp-content/themes/twentytwentytwo/inc/block-patterns.php
new file mode 100644
index 0000000000..ce5e331798
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/block-patterns.php
@@ -0,0 +1,135 @@
+<?php
+/**
+ * Twenty Twenty-Two: Block Patterns
+ *
+ * @since Twenty Twenty-Two 1.0
+ */
+
+/**
+ * Registers block patterns and categories.
+ *
+ * @since Twenty Twenty-Two 1.0
+ *
+ * @return void
+ */
+function twentytwentytwo_register_block_patterns() {
+	$block_pattern_categories = array(
+		'featured' => array( 'label' => __( 'Featured', 'twentytwentytwo' ) ),
+		'footer'   => array( 'label' => __( 'Footers', 'twentytwentytwo' ) ),
+		'header'   => array( 'label' => __( 'Headers', 'twentytwentytwo' ) ),
+		'query'    => array( 'label' => __( 'Query', 'twentytwentytwo' ) ),
+		'pages'    => array( 'label' => __( 'Pages', 'twentytwentytwo' ) ),
+	);
+
+	/**
+	 * Filters the theme block pattern categories.
+	 *
+	 * @since Twenty Twenty-Two 1.0
+	 *
+	 * @param array[] $block_pattern_categories {
+	 *     An associative array of block pattern categories, keyed by category name.
+	 *
+	 *     @type array[] $properties {
+	 *         An array of block category properties.
+	 *
+	 *         @type string $label A human-readable label for the pattern category.
+	 *     }
+	 * }
+	 */
+	$block_pattern_categories = apply_filters( 'twentytwentytwo_block_pattern_categories', $block_pattern_categories );
+
+	foreach ( $block_pattern_categories as $name => $properties ) {
+		if ( ! WP_Block_Pattern_Categories_Registry::get_instance()->is_registered( $name ) ) {
+			register_block_pattern_category( $name, $properties );
+		}
+	}
+
+	$block_patterns = array(
+		'footer-default',
+		'footer-dark',
+		'footer-logo',
+		'footer-navigation',
+		'footer-title-tagline-social',
+		'footer-social-copyright',
+		'footer-navigation-copyright',
+		'footer-about-title-logo',
+		'footer-query-title-citation',
+		'footer-query-images-title-citation',
+		'footer-blog',
+		'general-subscribe',
+		'general-featured-posts',
+		'general-layered-images-with-duotone',
+		'general-wide-image-intro-buttons',
+		'general-large-list-names',
+		'general-video-header-details',
+		'general-list-events',
+		'general-two-images-text',
+		'general-image-with-caption',
+		'general-video-trailer',
+		'general-pricing-table',
+		'general-divider-light',
+		'general-divider-dark',
+		'header-default',
+		'header-large-dark',
+		'header-small-dark',
+		'header-image-background',
+		'header-image-background-overlay',
+		'header-with-tagline',
+		'header-text-only-green-background',
+		'header-text-only-salmon-background',
+		'header-title-and-button',
+		'header-text-only-with-tagline-black-background',
+		'header-logo-navigation-gray-background',
+		'header-logo-navigation-social-black-background',
+		'header-title-navigation-social',
+		'header-logo-navigation-offset-tagline',
+		'header-stacked',
+		'header-centered-logo',
+		'header-centered-logo-black-background',
+		'header-centered-title-navigation-social',
+		'header-title-and-button',
+		'hidden-404',
+		'hidden-bird',
+		'hidden-heading-and-bird',
+		'page-about-media-left',
+		'page-about-simple-dark',
+		'page-about-media-right',
+		'page-about-solid-color',
+		'page-about-links',
+		'page-about-links-dark',
+		'page-about-large-image-and-buttons',
+		'page-layout-image-and-text',
+		'page-layout-image-text-and-video',
+		'page-layout-two-columns',
+		'page-sidebar-poster',
+		'page-sidebar-grid-posts',
+		'page-sidebar-blog-posts',
+		'page-sidebar-blog-posts-right',
+		'query-default',
+		'query-simple-blog',
+		'query-grid',
+		'query-text-grid',
+		'query-image-grid',
+		'query-large-titles',
+		'query-irregular-grid',
+	);
+
+	/**
+	 * Filters the theme block patterns.
+	 *
+	 * @since Twenty Twenty-Two 1.0
+	 *
+	 * @param array $block_patterns List of block patterns by name.
+	 */
+	$block_patterns = apply_filters( 'twentytwentytwo_block_patterns', $block_patterns );
+
+	foreach ( $block_patterns as $block_pattern ) {
+		$pattern_file = get_theme_file_path( '/inc/patterns/' . $block_pattern . '.php' );
+
+		register_block_pattern(
+			'twentytwentytwo/' . $block_pattern,
+			require $pattern_file
+		);
+	}
+}
+add_action( 'init', 'twentytwentytwo_register_block_patterns', 9 );
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-about-title-logo.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-about-title-logo.php
new file mode 100644
index 0000000000..dab9b04a86
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-about-title-logo.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Footer with text, title, and logo
+ */
+return array(
+	'title'      => __( 'Footer with text, title, and logo', 'twentytwentytwo' ),
+	'categories' => array( 'footer' ),
+	'blockTypes' => array( 'core/template-part/footer' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var(--wp--custom--spacing--large, 8rem)","bottom":"6rem"}}},"backgroundColor":"secondary","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull has-secondary-background-color has-background" style="padding-top:var(--wp--custom--spacing--large, 8rem);padding-bottom:6rem"><!-- wp:columns {"align":"wide"} -->
+					<div class="wp-block-columns alignwide"><!-- wp:column {"width":"33%"} -->
+					<div class="wp-block-column" style="flex-basis:33%"><!-- wp:paragraph {"style":{"typography":{"textTransform":"uppercase"}}} -->
+					<p style="text-transform:uppercase">' . esc_html__( 'About us', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph -->
+
+					<!-- wp:paragraph {"style":{"fontSize":"small"} -->
+					<p class="has-small-font-size">' . esc_html__( 'We are a rogue collective of bird watchers. We’ve been known to sneak through fences, climb perimeter walls, and generally trespass in order to observe the rarest of birds.', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph -->
+
+					<!-- wp:spacer {"height":180} -->
+					<div style="height:180px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:site-title {"level":0} /--></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"verticalAlignment":"bottom"} -->
+					<div class="wp-block-column is-vertically-aligned-bottom"><!-- wp:site-logo {"align":"right","width":60} /--></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-blog.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-blog.php
new file mode 100644
index 0000000000..c1306cbb83
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-blog.php
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Blog footer
+ */
+return array(
+	'title'      => __( 'Blog footer', 'twentytwentytwo' ),
+	'categories' => array( 'footer' ),
+	'blockTypes' => array( 'core/template-part/footer' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var(--wp--custom--spacing--large, 8rem)","bottom":"var(--wp--custom--spacing--large, 8rem)"}}},"layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull" style="padding-top:var(--wp--custom--spacing--large, 8rem);padding-bottom:var(--wp--custom--spacing--large, 8rem)"><!-- wp:columns {"align":"wide"} -->
+					<div class="wp-block-columns alignwide"><!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:paragraph {"style":{"typography":{"textTransform":"uppercase"}}} -->
+					<p style="text-transform:uppercase">' . esc_html__( 'About us', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph -->
+
+					<!-- wp:paragraph -->
+					<p>' . esc_html__( 'We are a rogue collective of bird watchers. We’ve been known to sneak through fences, climb perimeter walls, and generally trespass in order to observe the rarest of birds.', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:paragraph {"style":{"typography":{"textTransform":"uppercase"}}} -->
+					<p style="text-transform:uppercase">' . esc_html__( 'Latest posts', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph -->
+
+					<!-- wp:latest-posts /--></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:paragraph {"style":{"typography":{"textTransform":"uppercase"}}} -->
+					<p style="text-transform:uppercase">' . esc_html__( 'Categories', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph -->
+
+					<!-- wp:categories /--></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns -->
+
+					<!-- wp:spacer {"height":50} -->
+					<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"4rem","bottom":"4rem"}}},"layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide" style="padding-top:4rem;padding-bottom:4rem"><!-- wp:site-title {"level":0} /-->
+
+					<!-- wp:paragraph {"align":"right"} -->
+					<p class="has-text-align-right">' .
+					sprintf(
+						/* Translators: WordPress link. */
+						esc_html__( 'Proudly powered by %s', 'twentytwentytwo' ),
+						'<a href="' . esc_url( __( 'https://wordpress.org', 'twentytwentytwo' ) ) . '" rel="nofollow">WordPress</a>'
+					) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-dark.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-dark.php
new file mode 100644
index 0000000000..50259ebe3f
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-dark.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Dark footer wtih title and citation
+ */
+return array(
+	'title'      => __( 'Dark footer with title and citation', 'twentytwentytwo' ),
+	'categories' => array( 'footer' ),
+	'blockTypes' => array( 'core/template-part/footer' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"elements":{"link":{"color":{"text":"var:preset|color|background"}}},"spacing":{"padding":{"top":"var(--wp--custom--spacing--small, 1.25rem)","bottom":"var(--wp--custom--spacing--small, 1.25rem)"}}},"backgroundColor":"foreground","textColor":"background","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull has-background-color has-foreground-background-color has-text-color has-background has-link-color" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--small, 1.25rem)"><!-- wp:group {"align":"wide","layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide"><!-- wp:site-title {"level":0} /-->
+
+					<!-- wp:paragraph {"align":"right"} -->
+					<p class="has-text-align-right">' .
+					sprintf(
+						/* Translators: WordPress link. */
+						esc_html__( 'Proudly powered by %s', 'twentytwentytwo' ),
+						'<a href="' . esc_url( __( 'https://wordpress.org', 'twentytwentytwo' ) ) . '" rel="nofollow">WordPress</a>'
+					) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-default.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-default.php
new file mode 100644
index 0000000000..3682643084
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-default.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Default footer
+ */
+return array(
+	'title'      => __( 'Default footer', 'twentytwentytwo' ),
+	'categories' => array( 'footer' ),
+	'blockTypes' => array( 'core/template-part/footer' ),
+	'content'    => '<!-- wp:group {"align":"full","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"4rem","bottom":"4rem"}}},"layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide" style="padding-top:4rem;padding-bottom:4rem"><!-- wp:site-title {"level":0} /-->
+
+					<!-- wp:paragraph {"align":"right"} -->
+					<p class="has-text-align-right">' .
+					sprintf(
+						/* Translators: WordPress link. */
+						esc_html__( 'Proudly powered by %s', 'twentytwentytwo' ),
+						'<a href="' . esc_url( __( 'https://wordpress.org', 'twentytwentytwo' ) ) . '" rel="nofollow">WordPress</a>'
+					) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-logo.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-logo.php
new file mode 100644
index 0000000000..caa44e8c34
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-logo.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Default footer with logo
+ */
+return array(
+	'title'      => __( 'Footer with logo and citation', 'twentytwentytwo' ),
+	'categories' => array( 'footer' ),
+	'blockTypes' => array( 'core/template-part/footer' ),
+	'content'    => '<!-- wp:group {"align":"full","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"4rem","bottom":"4rem"}}},"layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide" style="padding-top:4rem;padding-bottom:4rem"><!-- wp:site-logo {"width":60} /-->
+
+					<!-- wp:paragraph {"align":"right"} -->
+					<p class="has-text-align-right">' .
+					sprintf(
+						/* Translators: WordPress link. */
+						esc_html__( 'Proudly powered by %s', 'twentytwentytwo' ),
+						'<a href="' . esc_url( __( 'https://wordpress.org', 'twentytwentytwo' ) ) . '" rel="nofollow">WordPress</a>'
+					) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-navigation-copyright.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-navigation-copyright.php
new file mode 100644
index 0000000000..d0b554249d
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-navigation-copyright.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Footer with navigation and copyright
+ */
+return array(
+	'title'      => __( 'Footer with navigation and copyright', 'twentytwentytwo' ),
+	'categories' => array( 'footer' ),
+	'blockTypes' => array( 'core/template-part/footer' ),
+	'content'    => '<!-- wp:group {"align":"full","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"4rem","bottom":"4rem"}}}} -->
+					<div class="wp-block-group alignwide" style="padding-top:4rem;padding-bottom:4rem"><!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"center"}} -->
+					<!-- wp:page-list {"isNavigationChild":true,"showSubmenuIcon":true,"openSubmenusOnClick":false} /-->
+					<!-- /wp:navigation -->
+
+					<!-- wp:spacer {"height":50} -->
+					<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:paragraph {"align":"center","style":{"typography":{"fontSize":"16px"}}} -->
+					<p class="has-text-align-center" style="font-size:16px">' . esc_html__( '© Site Title', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-navigation.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-navigation.php
new file mode 100644
index 0000000000..79792c730d
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-navigation.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Footer with navigation and citation
+ */
+return array(
+	'title'      => __( 'Footer with navigation and citation', 'twentytwentytwo' ),
+	'categories' => array( 'footer' ),
+	'blockTypes' => array( 'core/template-part/footer' ),
+	'content'    => '<!-- wp:group {"align":"full","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"4rem","bottom":"4rem"}}},"layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide" style="padding-top:4rem;padding-bottom:4rem"><!-- wp:navigation -->
+					<!-- wp:page-list {"isNavigationChild":true,"showSubmenuIcon":true,"openSubmenusOnClick":false} /-->
+					<!-- /wp:navigation -->
+
+					<!-- wp:paragraph {"align":"right"} -->
+					<p class="has-text-align-right">' .
+					sprintf(
+						/* Translators: WordPress link. */
+						esc_html__( 'Proudly powered by %s', 'twentytwentytwo' ),
+						'<a href="' . esc_url( __( 'https://wordpress.org', 'twentytwentytwo' ) ) . '" rel="nofollow">WordPress</a>'
+					) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-query-images-title-citation.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-query-images-title-citation.php
new file mode 100644
index 0000000000..a79c1d44cd
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-query-images-title-citation.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Footer with query, featured images, title, and citation
+ */
+return array(
+	'title'      => __( 'Footer with query, featured images, title, and citation', 'twentytwentytwo' ),
+	'categories' => array( 'footer' ),
+	'blockTypes' => array( 'core/template-part/footer' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"4rem","bottom":"4rem"}},"elements":{"link":{"color":{"text":"var:preset|color|background"}}}},"backgroundColor":"foreground","textColor":"background","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull has-background-color has-foreground-background-color has-text-color has-background has-link-color" style="padding-top:4rem;padding-bottom:4rem"><!-- wp:query {"query":{"perPage":3,"pages":0,"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"exclude","inherit":false},"displayLayout":{"type":"flex","columns":3},"align":"wide"} -->
+					<div class="wp-block-query alignwide"><!-- wp:post-template -->
+					<!-- wp:post-featured-image {"isLink":true,"width":"100%","height":"318px"} /-->
+
+					<!-- wp:post-title {"isLink":true,"fontSize":"x-large"} /-->
+
+					<!-- wp:post-excerpt /-->
+
+					<!-- wp:post-date {"format":"F j, Y","isLink":true,"fontSize":"small"} /-->
+					<!-- /wp:post-template --></div>
+					<!-- /wp:query -->
+
+					<!-- wp:spacer -->
+					<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"4rem","bottom":"4rem"}}},"layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide" style="padding-top:4rem;padding-bottom:4rem"><!-- wp:site-title {"level":0} /-->
+					<!-- wp:group {"layout":{"type":"flex","justifyContent":"right"}} -->
+					<div class="wp-block-group">
+					<!-- wp:paragraph -->
+					<p>' .
+					sprintf(
+						/* Translators: WordPress link. */
+						esc_html__( 'Proudly powered by %s', 'twentytwentytwo' ),
+						'<a href="' . esc_url( __( 'https://wordpress.org', 'twentytwentytwo' ) ) . '" rel="nofollow">WordPress</a>'
+					) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-query-title-citation.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-query-title-citation.php
new file mode 100644
index 0000000000..13bb43df5c
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-query-title-citation.php
@@ -0,0 +1,39 @@
+<?php
+/**
+ * Footer with query, title, and citation
+ */
+return array(
+	'title'      => __( 'Footer with query, title, and citation', 'twentytwentytwo' ),
+	'categories' => array( 'footer' ),
+	'blockTypes' => array( 'core/template-part/footer' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"4rem","bottom":"4rem"}},"elements":{"link":{"color":{"text":"var:preset|color|background"}}}},"backgroundColor":"primary","textColor":"background","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull has-background-color has-primary-background-color has-text-color has-background has-link-color" style="padding-top:4rem;padding-bottom:4rem"><!-- wp:query {"query":{"perPage":3,"pages":0,"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"exclude","inherit":false},"displayLayout":{"type":"flex","columns":3},"align":"wide"} -->
+					<div class="wp-block-query alignwide"><!-- wp:post-template -->
+					<!-- wp:post-title {"isLink":true,"fontSize":"x-large"} /-->
+
+					<!-- wp:post-excerpt /-->
+
+					<!-- wp:post-date {"isLink":true} /-->
+					<!-- /wp:post-template --></div>
+					<!-- /wp:query -->
+
+					<!-- wp:spacer -->
+					<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"4rem","bottom":"4rem"}}},"layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide" style="padding-top:4rem;padding-bottom:4rem"><!-- wp:site-title {"level":0} /-->
+					<!-- wp:group {"layout":{"type":"flex","justifyContent":"right"}} -->
+					<div class="wp-block-group">
+					<!-- wp:paragraph -->
+					<p>' .
+					sprintf(
+						/* Translators: WordPress link. */
+						esc_html__( 'Proudly powered by %s', 'twentytwentytwo' ),
+						'<a href="' . esc_url( __( 'https://wordpress.org', 'twentytwentytwo' ) ) . '" rel="nofollow">WordPress</a>'
+					) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-social-copyright.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-social-copyright.php
new file mode 100644
index 0000000000..0c7e4ae517
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-social-copyright.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Footer with social links and copyright
+ */
+return array(
+	'title'      => __( 'Footer with social links and copyright', 'twentytwentytwo' ),
+	'categories' => array( 'footer' ),
+	'blockTypes' => array( 'core/template-part/footer' ),
+	'content'    => '<!-- wp:group {"align":"full","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"4rem","bottom":"4rem"}}}} -->
+					<div class="wp-block-group alignwide" style="padding-top:4rem;padding-bottom:4rem"><!-- wp:social-links {"iconColor":"foreground","iconColorValue":"var(--wp--preset--color--foreground)","iconBackgroundColor":"background","iconBackgroundColorValue":"var(--wp--preset--color--background)","layout":{"type":"flex","justifyContent":"center"}} -->
+					<ul class="wp-block-social-links has-icon-color has-icon-background-color"><!-- wp:social-link {"url":"#","service":"facebook"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"twitter"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"instagram"} /--></ul>
+					<!-- /wp:social-links -->
+
+					<!-- wp:spacer {"height":50} -->
+					<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:paragraph {"align":"center","style":{"typography":{"fontSize":"16px"}}} -->
+					<p class="has-text-align-center" style="font-size:16px">' . esc_html__( '© Site Title', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-title-tagline-social.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-title-tagline-social.php
new file mode 100644
index 0000000000..84d888b22d
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/footer-title-tagline-social.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Footer with title, tagline, and social links on a dark background
+ */
+return array(
+	'title'      => __( 'Footer with title, tagline, and social links on a dark background', 'twentytwentytwo' ),
+	'categories' => array( 'footer' ),
+	'blockTypes' => array( 'core/template-part/footer' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"elements":{"link":{"color":{"text":"var:preset|color|background"}}}},"backgroundColor":"foreground","textColor":"background","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull has-background-color has-foreground-background-color has-text-color has-background has-link-color"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"4rem","bottom":"4rem"}}},"layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide" style="padding-top:4rem;padding-bottom:4rem"><!-- wp:group -->
+					<div class="wp-block-group"><!-- wp:site-title {"style":{"spacing":{"margin":{"top":"0px","bottom":"0px"}},"typography":{"textTransform":"uppercase"}}} /-->
+
+					<!-- wp:site-tagline {"style":{"spacing":{"margin":{"top":"0.25em","bottom":"0px"}},"typography":{"fontStyle":"italic","fontWeight":"400"}},"fontSize":"small"} /--></div>
+					<!-- /wp:group -->
+
+					<!-- wp:social-links {"iconBackgroundColor":"foreground","iconBackgroundColorValue":"var(--wp--preset--color--foreground)","layout":{"type":"flex","justifyContent":"right"}} -->
+					<ul class="wp-block-social-links has-icon-background-color"><!-- wp:social-link {"url":"#","service":"facebook"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"twitter"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"instagram"} /--></ul>
+					<!-- /wp:social-links --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/general-divider-dark.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-divider-dark.php
new file mode 100644
index 0000000000..e13422c865
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-divider-dark.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * Divider with image and color (dark) block pattern
+ */
+return array(
+	'title'      => __( 'Divider with image and color (dark)', 'twentytwentytwo' ),
+	'categories' => array( 'featured' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"1rem","right":"0px","bottom":"1rem","left":"0px"}}},"backgroundColor":"primary"} -->
+					<div class="wp-block-group alignfull has-primary-background-color has-background" style="padding-top:1rem;padding-right:0px;padding-bottom:1rem;padding-left:0px"><!-- wp:image {"id":473,"sizeSlug":"full","linkDestination":"none"} -->
+					<figure class="wp-block-image size-full"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/divider-white.png" alt="" class="wp-image-473"/></figure>
+					<!-- /wp:image --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/general-divider-light.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-divider-light.php
new file mode 100644
index 0000000000..5df910ea8e
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-divider-light.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * Divider with image and color (light) block pattern
+ */
+return array(
+	'title'      => __( 'Divider with image and color (light)', 'twentytwentytwo' ),
+	'categories' => array( 'featured' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"1rem","right":"0px","bottom":"1rem","left":"0px"}}},"backgroundColor":"secondary"} -->
+					<div class="wp-block-group alignfull has-secondary-background-color has-background" style="padding-top:1rem;padding-right:0px;padding-bottom:1rem;padding-left:0px"><!-- wp:image {"id":473,"sizeSlug":"full","linkDestination":"none"} -->
+					<figure class="wp-block-image size-full"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/divider-black.png" alt="" class="wp-image-473"/></figure>
+					<!-- /wp:image --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/general-featured-posts.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-featured-posts.php
new file mode 100644
index 0000000000..55cbdfd92d
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-featured-posts.php
@@ -0,0 +1,25 @@
+<?php
+/**
+ * Featured posts block pattern
+ */
+return array(
+	'title'      => __( 'Featured posts', 'twentytwentytwo' ),
+	'categories' => array( 'featured', 'query' ),
+	'content'    => '<!-- wp:group {"align":"wide","layout":{"inherit":false}} -->
+					<div class="wp-block-group alignwide"><!-- wp:paragraph {"style":{"typography":{"textTransform":"uppercase"}}} -->
+					<p style="text-transform:uppercase">' . esc_html__( 'Latest posts', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph -->
+
+					<!-- wp:query {"query":{"perPage":3,"pages":0,"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false},"displayLayout":{"type":"flex","columns":3}} -->
+					<div class="wp-block-query"><!-- wp:post-template -->
+					<!-- wp:post-featured-image {"isLink":true,"width":"","height":"310px"} /-->
+
+					<!-- wp:post-title {"isLink":true,"fontSize":"large"} /-->
+
+					<!-- wp:post-excerpt /-->
+
+					<!-- wp:post-date {"fontSize":"small"} /-->
+					<!-- /wp:post-template --></div>
+					<!-- /wp:query --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/general-image-with-caption.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-image-with-caption.php
new file mode 100644
index 0000000000..0870da3951
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-image-with-caption.php
@@ -0,0 +1,19 @@
+<?php
+/**
+ * Image with caption block pattern
+ */
+return array(
+	'title'      => __( 'Image with caption', 'twentytwentytwo' ),
+	'categories' => array( 'featured', 'columns', 'gallery' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"6rem","bottom":"6rem"}},"elements":{"link":{"color":{"text":"var:preset|color|background"}}}},"backgroundColor":"primary","textColor":"background","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull has-background-color has-primary-background-color has-text-color has-background has-link-color" style="padding-top:6rem;padding-bottom:6rem"><!-- wp:media-text {"mediaId":202,"mediaLink":"' . esc_url( get_template_directory_uri() ) . '/assets/images/bird-on-gray.jpg","mediaType":"image","verticalAlignment":"bottom","imageFill":false} -->
+					<div class="wp-block-media-text alignwide is-stacked-on-mobile is-vertically-aligned-bottom"><figure class="wp-block-media-text__media"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/bird-on-gray.jpg" alt="' . esc_attr__( 'Hummingbird illustration', 'twentytwentytwo' ) . '" class="wp-image-202 size-full"/></figure><div class="wp-block-media-text__content"><!-- wp:paragraph -->
+					<p><strong>' . esc_html__( 'Hummingbird', 'twentytwentytwo' ) . '</strong></p>
+					<!-- /wp:paragraph -->
+
+					<!-- wp:paragraph -->
+					<p>' . esc_html__( 'A beautiful bird featuring a surprising set of color feathers.', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph --></div></div>
+					<!-- /wp:media-text --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/general-large-list-names.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-large-list-names.php
new file mode 100644
index 0000000000..d7bd8168fa
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-large-list-names.php
@@ -0,0 +1,35 @@
+<?php
+/**
+ * Large list of names block pattern
+ */
+return array(
+	'title'      => __( 'Large list of names', 'twentytwentytwo' ),
+	'categories' => array( 'featured', 'text' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"6rem","bottom":"6rem"}},"elements":{"link":{"color":{"text":"var:preset|color|primary"}}}},"backgroundColor":"tertiary","textColor":"primary","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull has-primary-color has-tertiary-background-color has-text-color has-background has-link-color" style="padding-top:6rem;padding-bottom:6rem"><!-- wp:group {"align":"wide"} -->
+					<div class="wp-block-group alignwide"><!-- wp:image {"width":175,"height":82,"sizeSlug":"full","linkDestination":"none"} -->
+					<figure class="wp-block-image size-full is-resized"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/icon-binoculars.png" alt="' . esc_attr__( 'An icon representing binoculars.', 'twentytwentytwo' ) . '" width="175" height="82"/></figure>
+					<!-- /wp:image --></div>
+					<!-- /wp:group -->
+
+					<!-- wp:group {"align":"wide"} -->
+					<div class="wp-block-group alignwide"><!-- wp:spacer {"height":32} -->
+					<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:paragraph {"style":{"typography":{"fontWeight":"300"}},"fontSize":"x-large"} -->
+					<p class="has-x-large-font-size" style="font-weight:300">' . esc_html__( 'Jesús Rodriguez, Doug Stilton, Emery Driscoll, Megan Perry, Rowan Price, Angelo Tso, Edward Stilton, Amy Jensen, Boston Bell, Shay Ford, Lee Cunningham, Evelynn Ray, Landen Reese, Ewan Hart, Jenna Chan, Phoenix Murray, Mel Saunders, Aldo Davidson, Zain Hall.', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph -->
+
+					<!-- wp:spacer {"height":32} -->
+					<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:buttons -->
+					<div class="wp-block-buttons"><!-- wp:button {"backgroundColor":"primary","textColor":"background"} -->
+					<div class="wp-block-button"><a class="wp-block-button__link has-background-color has-primary-background-color has-text-color has-background">' . esc_html__( 'Read more', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button --></div>
+					<!-- /wp:buttons --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/general-layered-images-with-duotone.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-layered-images-with-duotone.php
new file mode 100644
index 0000000000..629a0a2a12
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-layered-images-with-duotone.php
@@ -0,0 +1,13 @@
+<?php
+/**
+ * Layered images with duotone block pattern
+ */
+return array(
+	'title'      => __( 'Layered images with duotone', 'twentytwentytwo' ),
+	'categories' => array( 'featured', 'gallery' ),
+	'content'    => '<!-- wp:cover {"url":"' . esc_url( get_template_directory_uri() ) . '/assets/images/ducks.jpg","dimRatio":0,"minHeight":666,"contentPosition":"center center","isDark":false,"align":"wide","style":{"spacing":{"padding":{"top":"1em","right":"1em","bottom":"1em","left":"1em"}},"color":{"duotone":["#000000","#FFFFFF"]}}} -->
+					<div class="wp-block-cover alignwide is-light" style="padding-top:1em;padding-right:1em;padding-bottom:1em;padding-left:1em;min-height:666px"><span aria-hidden="true" class="has-background-dim-0 wp-block-cover__gradient-background has-background-dim"></span><img class="wp-block-cover__image-background" alt="' . esc_attr__( 'Painting of ducks in the water.', 'twentytwentytwo' ) . '" src="' . esc_url( get_template_directory_uri() ) . '/assets/images/ducks.jpg" data-object-fit="cover"/><div class="wp-block-cover__inner-container"><!-- wp:image {"align":"center","width":384,"height":580,"sizeSlug":"large"} -->
+					<div class="wp-block-image"><figure class="aligncenter size-large is-resized"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/flight-path-on-salmon.jpg" alt="' . esc_attr__( 'Illustration of a flying bird.', 'twentytwentytwo' ) . '" width="384" height="580"/></figure></div>
+					<!-- /wp:image --></div></div>
+					<!-- /wp:cover -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/general-list-events.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-list-events.php
new file mode 100644
index 0000000000..af680dc2cd
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-list-events.php
@@ -0,0 +1,133 @@
+<?php
+/**
+ * List of events block pattern
+ */
+return array(
+	'title'      => __( 'List of events', 'twentytwentytwo' ),
+	'categories' => array( 'featured', 'text' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var(--wp--custom--spacing--large, 8rem)","bottom":"var(--wp--custom--spacing--large, 8rem)"}},"elements":{"link":{"color":{"text":"var:preset|color|background"}}}},"backgroundColor":"primary","textColor":"background"} -->
+					<div class="wp-block-group alignfull has-background-color has-primary-background-color has-text-color has-background has-link-color" style="padding-top:var(--wp--custom--spacing--large, 8rem);padding-bottom:var(--wp--custom--spacing--large, 8rem)"><!-- wp:group {"align":"full","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull"><!-- wp:heading {"align":"wide","style":{"typography":{"fontSize":"clamp(3.25rem, 8vw, 6.25rem)","lineHeight":"1.15"},"spacing":{"margin":{"bottom":"2rem"}}}} -->
+					<h2 class="alignwide" style="font-size:clamp(3.25rem, 8vw, 6.25rem);line-height:1.15;margin-bottom:2rem"><em>' . esc_html__( 'Speaker Series', 'twentytwentytwo' ) . '</em></h2>
+					<!-- /wp:heading -->
+
+					<!-- wp:spacer {"height":32} -->
+					<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:separator {"color":"background","align":"wide","className":"is-style-wide"} -->
+					<hr class="wp-block-separator alignwide has-text-color has-background has-background-background-color has-background-color is-style-wide"/>
+					<!-- /wp:separator -->
+
+					<!-- wp:columns {"verticalAlignment":"center","align":"wide"} -->
+					<div class="wp-block-columns alignwide are-vertically-aligned-center"><!-- wp:column {"verticalAlignment":"center","width":"210px"} -->
+					<div class="wp-block-column is-vertically-aligned-center" style="flex-basis:210px"><!-- wp:paragraph -->
+					<p>' . esc_html__( 'May 14th, 2022, 6 PM', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"verticalAlignment":"center"} -->
+					<div class="wp-block-column is-vertically-aligned-center"><!-- wp:heading {"fontSize":"x-large"} -->
+					<h2 class="has-x-large-font-size" id="jesus-rodriguez">' . esc_html__( 'Jesús Rodriguez', 'twentytwentytwo' ) . '</h2>
+					<!-- /wp:heading --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"verticalAlignment":"center"} -->
+					<div class="wp-block-column is-vertically-aligned-center"><!-- wp:paragraph -->
+					<p>' . wp_kses_post( __( 'The Vintagé Theater<br>245 Arden Rd.<br>Gardenville, NH', 'twentytwentytwo' ) ) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns -->
+
+					<!-- wp:separator {"color":"background","align":"wide","className":"is-style-wide"} -->
+					<hr class="wp-block-separator alignwide has-text-color has-background has-background-background-color has-background-color is-style-wide"/>
+					<!-- /wp:separator -->
+
+					<!-- wp:columns {"verticalAlignment":"center","align":"wide"} -->
+					<div class="wp-block-columns alignwide are-vertically-aligned-center"><!-- wp:column {"verticalAlignment":"center","width":"210px"} -->
+					<div class="wp-block-column is-vertically-aligned-center" style="flex-basis:210px"><!-- wp:paragraph -->
+					<p>' . esc_html__( 'May 16th, 2022, 6 PM', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"verticalAlignment":"center"} -->
+					<div class="wp-block-column is-vertically-aligned-center"><!-- wp:heading {"fontSize":"x-large"} -->
+					<h2 class="has-x-large-font-size" id="jesus-rodriguez">' . esc_html__( 'Doug Stilton', 'twentytwentytwo' ) . '</h2>
+					<!-- /wp:heading --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"verticalAlignment":"center"} -->
+					<div class="wp-block-column is-vertically-aligned-center"><!-- wp:paragraph -->
+					<p>' . wp_kses_post( __( 'The Swell Theater<br>120 River Rd.<br>Rainfall, NH', 'twentytwentytwo' ) ) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns -->
+
+					<!-- wp:separator {"color":"background","align":"wide","className":"is-style-wide"} -->
+					<hr class="wp-block-separator alignwide has-text-color has-background has-background-background-color has-background-color is-style-wide"/>
+					<!-- /wp:separator -->
+
+					<!-- wp:columns {"verticalAlignment":"center","align":"wide"} -->
+					<div class="wp-block-columns alignwide are-vertically-aligned-center"><!-- wp:column {"verticalAlignment":"center","width":"210px"} -->
+					<div class="wp-block-column is-vertically-aligned-center" style="flex-basis:210px"><!-- wp:paragraph -->
+					<p>' . esc_html__( 'May 18th, 2022, 7 PM', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"verticalAlignment":"center"} -->
+					<div class="wp-block-column is-vertically-aligned-center"><!-- wp:heading {"fontSize":"x-large"} -->
+					<h2 class="has-x-large-font-size" id="jesus-rodriguez">' . esc_html__( 'Amy Jensen', 'twentytwentytwo' ) . '</h2>
+					<!-- /wp:heading --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"verticalAlignment":"center"} -->
+					<div class="wp-block-column is-vertically-aligned-center"><!-- wp:paragraph -->
+					<p>' . wp_kses_post( __( 'The Vintagé Theater<br>245 Arden Rd.<br>Gardenville, NH', 'twentytwentytwo' ) ) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns -->
+
+					<!-- wp:separator {"color":"background","align":"wide","className":"is-style-wide"} -->
+					<hr class="wp-block-separator alignwide has-text-color has-background has-background-background-color has-background-color is-style-wide"/>
+					<!-- /wp:separator -->
+
+					<!-- wp:columns {"verticalAlignment":"center","align":"wide"} -->
+					<div class="wp-block-columns alignwide are-vertically-aligned-center"><!-- wp:column {"verticalAlignment":"center","width":"210px"} -->
+					<div class="wp-block-column is-vertically-aligned-center" style="flex-basis:210px"><!-- wp:paragraph -->
+					<p>' . esc_html__( 'May 20th, 2022, 6 PM', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"verticalAlignment":"center"} -->
+					<div class="wp-block-column is-vertically-aligned-center"><!-- wp:heading {"fontSize":"x-large"} -->
+					<h2 class="has-x-large-font-size" id="jesus-rodriguez">' . esc_html__( 'Emery Driscoll', 'twentytwentytwo' ) . '</h2>
+					<!-- /wp:heading --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"verticalAlignment":"center"} -->
+					<div class="wp-block-column is-vertically-aligned-center"><!-- wp:paragraph -->
+					<p>' . wp_kses_post( __( 'The Swell Theater<br>120 River Rd.<br>Rainfall, NH', 'twentytwentytwo' ) ) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns -->
+
+					<!-- wp:separator {"color":"background","align":"wide","className":"is-style-wide"} -->
+					<hr class="wp-block-separator alignwide has-text-color has-background has-background-background-color has-background-color is-style-wide"/>
+					<!-- /wp:separator -->
+
+					<!-- wp:spacer {"height":32} -->
+					<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:group {"align":"wide"} -->
+					<div class="wp-block-group alignwide"><!-- wp:social-links {"iconColor":"background","iconColorValue":"var(--wp--preset--color--background)","className":"is-style-logos-only","layout":{"type":"flex","justifyContent":"right"}} -->
+					<ul class="wp-block-social-links has-icon-color is-style-logos-only"><!-- wp:social-link {"url":"#","service":"wordpress"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"instagram"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"twitter"} /--></ul>
+					<!-- /wp:social-links --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/general-pricing-table.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-pricing-table.php
new file mode 100644
index 0000000000..b385eddf25
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-pricing-table.php
@@ -0,0 +1,93 @@
+<?php
+/**
+ * Pricing table block pattern
+ */
+return array(
+	'title'      => __( 'Pricing table', 'twentytwentytwo' ),
+	'categories' => array( 'featured', 'columns', 'buttons' ),
+	'content'    => '<!-- wp:columns {"align":"wide"} -->
+					<div class="wp-block-columns alignwide"><!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:separator {"className":"is-style-wide"} -->
+					<hr class="wp-block-separator is-style-wide"/>
+					<!-- /wp:separator -->
+
+					<!-- wp:heading {"style":{"typography":{"fontSize":"var(--wp--custom--typography--font-size--gigantic, clamp(2.75rem, 6vw, 3.25rem))","lineHeight":"0.5"}}} -->
+					<h2 id="1" style="font-size:var(--wp--custom--typography--font-size--gigantic, clamp(2.75rem, 6vw, 3.25rem));line-height:0.5">' . esc_html( _x( '1', 'First item in a numbered list.', 'twentytwentytwo' ) ) . '</h2>
+					<!-- /wp:heading -->
+
+					<!-- wp:heading {"level":3,"fontSize":"x-large"} -->
+					<h3 class="has-x-large-font-size" id="pigeon"><em>' . esc_html__( 'Pigeon', 'twentytwentytwo' ) . '</em></h3>
+					<!-- /wp:heading -->
+
+					<!-- wp:paragraph -->
+					<p>' . esc_html__( 'Help support our growing community by joining at the Pigeon level. Your support will help pay our writers, and you’ll get access to our exclusive newsletter.', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph -->
+
+					<!-- wp:buttons -->
+					<div class="wp-block-buttons"><!-- wp:button {"backgroundColor":"foreground","width":100} -->
+					<div class="wp-block-button has-custom-width wp-block-button__width-100"><a class="wp-block-button__link has-foreground-background-color has-background">' . esc_html__( '$25', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button --></div>
+					<!-- /wp:buttons -->
+
+					<!-- wp:spacer {"height":16} -->
+					<div style="height:16px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:separator {"className":"is-style-wide"} -->
+					<hr class="wp-block-separator is-style-wide"/>
+					<!-- /wp:separator -->
+
+					<!-- wp:heading {"style":{"typography":{"fontSize":"clamp(2.75rem, 6vw, 3.25rem)","lineHeight":"0.5"}}} -->
+					<h2 id="2" style="font-size:clamp(2.75rem, 6vw, 3.25rem);line-height:0.5">' . esc_html( _x( '2', 'Second item in a numbered list.', 'twentytwentytwo' ) ) . '</h2>
+					<!-- /wp:heading -->
+
+					<!-- wp:heading {"level":3,"fontSize":"x-large"} -->
+					<h3 class="has-x-large-font-size" id="sparrow"><meta charset="utf-8"><em>' . esc_html__( 'Sparrow', 'twentytwentytwo' ) . '</em></h3>
+					<!-- /wp:heading -->
+
+					<!-- wp:paragraph -->
+					<p>' . esc_html__( 'Join at the Sparrow level and become a member of our flock! You’ll receive our newsletter, plus a bird pin that you can wear with pride when you’re out in nature.', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph -->
+
+					<!-- wp:buttons -->
+					<div class="wp-block-buttons"><!-- wp:button {"backgroundColor":"foreground","width":100} -->
+					<div class="wp-block-button has-custom-width wp-block-button__width-100"><a class="wp-block-button__link has-foreground-background-color has-background">' . esc_html__( '$75', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button --></div>
+					<!-- /wp:buttons -->
+
+					<!-- wp:spacer {"height":16} -->
+					<div style="height:16px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:separator {"className":"is-style-wide"} -->
+					<hr class="wp-block-separator is-style-wide"/>
+					<!-- /wp:separator -->
+
+					<!-- wp:heading {"style":{"typography":{"fontSize":"clamp(2.75rem, 6vw, 3.25rem)","lineHeight":"0.5"}}} -->
+					<h2 id="3" style="font-size:clamp(2.75rem, 6vw, 3.25rem);line-height:0.5">' . esc_html( _x( '3', 'Third item in a numbered list.', 'twentytwentytwo' ) ) . '</h2>
+					<!-- /wp:heading -->
+
+					<!-- wp:heading {"level":3,"fontSize":"x-large"} -->
+					<h3 class="has-x-large-font-size" id="falcon"><meta charset="utf-8"><em>' . esc_html__( 'Falcon', 'twentytwentytwo' ) . '</em></h3>
+					<!-- /wp:heading -->
+
+					<!-- wp:paragraph -->
+					<p>' . esc_html__( 'Play a leading role for our community by joining at the Falcon level. This level earns you a seat on our board, where you can help plan future birdwatching expeditions.', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph -->
+
+					<!-- wp:buttons -->
+					<div class="wp-block-buttons"><!-- wp:button {"backgroundColor":"foreground","width":100} -->
+					<div class="wp-block-button has-custom-width wp-block-button__width-100"><a class="wp-block-button__link has-foreground-background-color has-background">' . esc_html__( '$150', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button --></div>
+					<!-- /wp:buttons -->
+
+					<!-- wp:spacer {"height":16} -->
+					<div style="height:16px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/general-subscribe.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-subscribe.php
new file mode 100644
index 0000000000..34137cd20a
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-subscribe.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Subscribe callout block pattern
+ */
+return array(
+	'title'      => __( 'Subscribe callout', 'twentytwentytwo' ),
+	'categories' => array( 'featured', 'buttons' ),
+	'content'    => '<!-- wp:columns {"verticalAlignment":"center","align":"wide"} -->
+					<div class="wp-block-columns alignwide are-vertically-aligned-center"><!-- wp:column {"verticalAlignment":"center"} -->
+					<div class="wp-block-column is-vertically-aligned-center"><!-- wp:heading -->
+					<h2>' . wp_kses_post( __( 'Watch birds<br>from your inbox', 'twentytwentytwo' ) ) . '</h2>
+					<!-- /wp:heading -->
+
+					<!-- wp:buttons -->
+					<div class="wp-block-buttons"><!-- wp:button {"fontSize":"medium"} -->
+					<div class="wp-block-button has-custom-font-size has-medium-font-size"><a class="wp-block-button__link">' . esc_html__( 'Join our mailing list', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button --></div>
+					<!-- /wp:buttons --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"verticalAlignment":"center","style":{"spacing":{"padding":{"top":"2rem","bottom":"2rem"}}}} -->
+					<div class="wp-block-column is-vertically-aligned-center" style="padding-top:2rem;padding-bottom:2rem"><!-- wp:separator {"color":"primary","className":"is-style-wide"} -->
+					<hr class="wp-block-separator has-text-color has-background has-primary-background-color has-primary-color is-style-wide"/>
+					<!-- /wp:separator --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/general-two-images-text.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-two-images-text.php
new file mode 100644
index 0000000000..593d2b93bb
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-two-images-text.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * Two images with text block pattern
+ */
+return array(
+	'title'      => __( 'Two images with text', 'twentytwentytwo' ),
+	'categories' => array( 'featured', 'columns', 'gallery' ),
+	'content'    => '<!-- wp:columns {"align":"wide"} -->
+					<div class="wp-block-columns alignwide"><!-- wp:column {"style":{"spacing":{"padding":{"top":"0rem","right":"0rem","bottom":"0rem","left":"0rem"}}}} -->
+					<div class="wp-block-column" style="padding-top:0rem;padding-right:0rem;padding-bottom:0rem;padding-left:0rem"><!-- wp:image {"sizeSlug":"large"} -->
+					<figure class="wp-block-image size-large"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/bird-on-salmon.jpg" alt="' . esc_attr__( 'Illustration of a bird sitting on a branch.', 'twentytwentytwo' ) . '"/></figure>
+					<!-- /wp:image --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"style":{"spacing":{"padding":{"top":"0rem","right":"0rem","bottom":"0rem","left":"0rem"}}}} -->
+					<div class="wp-block-column" style="padding-top:0rem;padding-right:0rem;padding-bottom:0rem;padding-left:0rem"><!-- wp:image {"sizeSlug":"large"} -->
+					<figure class="wp-block-image size-large"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/bird-on-green.jpg" alt="' . esc_attr__( 'Illustration of a bird flying.', 'twentytwentytwo' ) . '"/></figure>
+					<!-- /wp:image -->
+
+					<!-- wp:spacer {"height":30} -->
+					<div style="height:30px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:heading {"fontSize":"x-large"} -->
+					<h2 class="has-x-large-font-size" id="screening">' . esc_html__( 'SCREENING', 'twentytwentytwo' ) . '</h2>
+					<!-- /wp:heading -->
+
+					<!-- wp:paragraph -->
+					<p>' . wp_kses_post( __( 'May 14th, 2022 @ 7:00PM<br>The Vintagé Theater,<br>245 Arden Rd.<br>Gardenville, NH', 'twentytwentytwo' ) ) . '</p>
+					<!-- /wp:paragraph -->
+
+					<!-- wp:spacer {"height":8} -->
+					<div style="height:8px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:spacer {"height":10} -->
+					<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:buttons -->
+					<div class="wp-block-buttons"><!-- wp:button {"backgroundColor":"foreground"} -->
+					<div class="wp-block-button"><a class="wp-block-button__link has-foreground-background-color has-background">' . esc_html__( 'Buy Tickets', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button --></div>
+					<!-- /wp:buttons --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/general-video-header-details.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-video-header-details.php
new file mode 100644
index 0000000000..3b15a52066
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-video-header-details.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * Video with header and details block pattern
+ */
+return array(
+	'title'      => __( 'Video with header and details', 'twentytwentytwo' ),
+	'categories' => array( 'featured', 'columns' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var(--wp--custom--spacing--large, 8rem)","bottom":"var(--wp--custom--spacing--large, 8rem)"}},"elements":{"link":{"color":{"text":"var:preset|color|secondary"}}}},"backgroundColor":"foreground","textColor":"secondary"} -->
+					<div class="wp-block-group alignfull has-secondary-color has-foreground-background-color has-text-color has-background has-link-color" style="padding-top:var(--wp--custom--spacing--large, 8rem);padding-bottom:var(--wp--custom--spacing--large, 8rem)"><!-- wp:group {"align":"full","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull"><!-- wp:heading {"level":1,"align":"wide","style":{"typography":{"fontSize":"clamp(3rem, 6vw, 4.5rem)"}}} -->
+					<h1 class="alignwide" id="warble-a-film-about-hobbyist-bird-watchers-1" style="font-size:clamp(3rem, 6vw, 4.5rem)">' . wp_kses_post( __( '<em>Warble</em>, a film about <br>hobbyist bird watchers.', 'twentytwentytwo' ) ) . '</h1>
+					<!-- /wp:heading -->
+
+					<!-- wp:spacer {"height":32} -->
+					<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:video {"align":"wide"} -->
+					<figure class="wp-block-video alignwide"><video controls src="' . esc_url( get_template_directory_uri() ) . '/assets/videos/birds.mp4"></video></figure>
+					<!-- /wp:video -->
+
+					<!-- wp:spacer {"height":32} -->
+					<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:columns {"align":"wide"} -->
+					<div class="wp-block-columns alignwide"><!-- wp:column {"width":"50%"} -->
+					<div class="wp-block-column" style="flex-basis:50%"><!-- wp:paragraph -->
+					<p><strong>' . esc_html__( 'Featuring', 'twentytwentytwo' ) . '</strong></p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:paragraph -->
+					<p>' . wp_kses_post( __( 'Jesús Rodriguez<br>Doug Stilton<br>Emery Driscoll<br>Megan Perry<br>Rowan Price', 'twentytwentytwo' ) ) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:paragraph -->
+					<p>' . wp_kses_post( __( 'Angelo Tso<br>Edward Stilton<br>Amy Jensen<br>Boston Bell<br>Shay Ford', 'twentytwentytwo' ) ) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/general-video-trailer.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-video-trailer.php
new file mode 100644
index 0000000000..22ed24860b
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-video-trailer.php
@@ -0,0 +1,27 @@
+<?php
+/**
+ * Video trailer block pattern
+ */
+return array(
+	'title'      => __( 'Video trailer', 'twentytwentytwo' ),
+	'categories' => array( 'featured', 'columns' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"elements":{"link":{"color":{"text":"var:preset|color|foreground"}}},"spacing":{"padding":{"top":"6rem","bottom":"4rem"}}},"backgroundColor":"secondary","textColor":"foreground","layout":{"inherit":true}} -->
+				<div class="wp-block-group alignfull has-foreground-color has-secondary-background-color has-text-color has-background has-link-color" style="padding-top:6rem;padding-bottom:4rem"><!-- wp:columns {"align":"wide"} -->
+				<div class="wp-block-columns alignwide"><!-- wp:column {"width":"33.33%"} -->
+				<div class="wp-block-column" style="flex-basis:33.33%"><!-- wp:heading {"fontSize":"x-large"} -->
+				<h2 class="has-x-large-font-size" id="extended-trailer">' . esc_html__( 'Extended Trailer', 'twentytwentytwo' ) . '</h2>
+				<!-- /wp:heading -->
+
+				<!-- wp:paragraph -->
+				<p>' . esc_html__( 'A film about hobbyist bird watchers, a catalog of different birds, paired with the noises they make. Each bird is listed by their scientific name so things seem more official.', 'twentytwentytwo' ) . '</p>
+				<!-- /wp:paragraph --></div>
+				<!-- /wp:column -->
+
+				<!-- wp:column {"width":"66.66%"} -->
+				<div class="wp-block-column" style="flex-basis:66.66%"><!-- wp:video -->
+				<figure class="wp-block-video"><video controls src="' . esc_url( get_template_directory_uri() ) . '/assets/videos/birds.mp4"></video></figure>
+				<!-- /wp:video --></div>
+				<!-- /wp:column --></div>
+				<!-- /wp:columns --></div>
+				<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/general-wide-image-intro-buttons.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-wide-image-intro-buttons.php
new file mode 100644
index 0000000000..ea9ecf2911
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/general-wide-image-intro-buttons.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Wide image with introduction and buttons block pattern
+ */
+return array(
+	'title'      => __( 'Wide image with introduction and buttons', 'twentytwentytwo' ),
+	'categories' => array( 'featured', 'columns' ),
+	'content'    => '<!-- wp:group {"align":"wide"} -->
+				<div class="wp-block-group alignwide"><!-- wp:image {"sizeSlug":"large"} -->
+				<figure class="wp-block-image size-large"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/flight-path-on-gray-a.jpg" alt="' . esc_attr__( 'Illustration of a bird flying.', 'twentytwentytwo' ) . '"/></figure>
+				<!-- /wp:image -->
+
+				<!-- wp:columns {"verticalAlignment":null} -->
+				<div class="wp-block-columns"><!-- wp:column {"verticalAlignment":"bottom"} -->
+				<div class="wp-block-column is-vertically-aligned-bottom"><!-- wp:heading {"style":{"typography":{"fontSize":"clamp(3.25rem, 8vw, 6.25rem)","lineHeight":"1.15"}}} -->
+				<h2 style="font-size:clamp(3.25rem, 8vw, 6.25rem);line-height:1.15"><em>' . wp_kses_post( __( 'Welcome to<br>the Aviary', 'twentytwentytwo' ) ) . '</em></h2>
+				<!-- /wp:heading --></div>
+				<!-- /wp:column -->
+
+				<!-- wp:column {"verticalAlignment":"bottom","style":{"spacing":{"padding":{"bottom":"6rem"}}}} -->
+				<div class="wp-block-column is-vertically-aligned-bottom" style="padding-bottom:6rem"><!-- wp:paragraph -->
+				<p>' . esc_html__( 'A film about hobbyist bird watchers, a catalog of different birds, paired with the noises they make. Each bird is listed by their scientific name so things seem more official.', 'twentytwentytwo' ) . '</p>
+				<!-- /wp:paragraph -->
+
+				<!-- wp:spacer {"height":20} -->
+				<div style="height:20px" aria-hidden="true" class="wp-block-spacer"></div>
+				<!-- /wp:spacer -->
+
+				<!-- wp:buttons -->
+				<div class="wp-block-buttons"><!-- wp:button {"className":"is-style-outline"} -->
+				<div class="wp-block-button is-style-outline"><a class="wp-block-button__link">' . esc_html__( 'Learn More', 'twentytwentytwo' ) . '</a></div>
+				<!-- /wp:button -->
+
+				<!-- wp:button {"className":"is-style-outline"} -->
+				<div class="wp-block-button is-style-outline"><a class="wp-block-button__link">' . esc_html__( 'Buy Tickets', 'twentytwentytwo' ) . '</a></div>
+				<!-- /wp:button --></div>
+				<!-- /wp:buttons --></div>
+				<!-- /wp:column --></div>
+				<!-- /wp:columns --></div>
+				<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/header-centered-logo-black-background.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-centered-logo-black-background.php
new file mode 100644
index 0000000000..c2cac8dcef
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-centered-logo-black-background.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Header with centered logo and black background
+ */
+return array(
+	'title'      => __( 'Header with centered logo and black background', 'twentytwentytwo' ),
+	'categories' => array( 'header' ),
+	'blockTypes' => array( 'core/template-part/header' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"bottom":"var(--wp--custom--spacing--small, 1.25rem)","top":"var(--wp--custom--spacing--small, 1.25rem)"}},"elements":{"link":{"color":{"text":"var:preset|color|background"}}}},"backgroundColor":"foreground","textColor":"background","layout":{"type":"flex","justifyContent":"center"}} -->
+					<div class="wp-block-group alignfull has-background-color has-foreground-background-color has-text-color has-background has-link-color" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--small, 1.25rem)"><!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"}} -->
+					<!-- wp:navigation-link {"isTopLevelLink":true} /-->
+
+					<!-- wp:navigation-link {"isTopLevelLink":true} /-->
+
+					<!-- wp:site-logo {"width":90} /-->
+
+					<!-- wp:navigation-link {"isTopLevelLink":true} /-->
+
+					<!-- wp:navigation-link {"isTopLevelLink":true} /-->
+					<!-- /wp:navigation --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/header-centered-logo.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-centered-logo.php
new file mode 100644
index 0000000000..a116c39086
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-centered-logo.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Header with centered logo block pattern
+ */
+return array(
+	'title'      => __( 'Header with centered logo', 'twentytwentytwo' ),
+	'categories' => array( 'header' ),
+	'blockTypes' => array( 'core/template-part/header' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"elements":{"link":{"color":{"text":"var:preset|color|background"}}},"spacing":{"padding":{"top":"var(--wp--custom--spacing--small, 1.25rem)","bottom":"var(--wp--custom--spacing--small, 1.25rem)"}}},"backgroundColor":"primary","textColor":"background","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull has-background-color has-primary-background-color has-text-color has-background has-link-color" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--small, 1.25rem);"><!-- wp:columns {"verticalAlignment":"center","align":"wide"} -->
+					<div class="wp-block-columns alignwide are-vertically-aligned-center"><!-- wp:column {"verticalAlignment":"center"} -->
+					<div class="wp-block-column is-vertically-aligned-center"><!-- wp:site-title {"style":{"typography":{"fontStyle":"normal","fontWeight":"400","textTransform":"uppercase"}}} /--></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"width":"64px"} -->
+					<div class="wp-block-column" style="flex-basis:64px"><!-- wp:site-logo {"width":64} /--></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"verticalAlignment":"center"} -->
+					<div class="wp-block-column is-vertically-aligned-center"><!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"}} -->
+					<!-- wp:page-list {"isNavigationChild":true,"showSubmenuIcon":true,"openSubmenusOnClick":false} /-->
+					<!-- /wp:navigation --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/header-centered-title-navigation-social.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-centered-title-navigation-social.php
new file mode 100644
index 0000000000..2e4dc451d1
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-centered-title-navigation-social.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Centered header with navigation, social links, and salmon background block pattern
+ */
+return array(
+	'title'      => __( 'Centered header with navigation, social links, and salmon background', 'twentytwentytwo' ),
+	'categories' => array( 'header' ),
+	'blockTypes' => array( 'core/template-part/header' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"elements":{"link":{"color":{"text":"var:preset|color|primary"}}},"spacing":{"padding":{"top":"var(--wp--custom--spacing--small, 1.25rem)","bottom":"var(--wp--custom--spacing--small, 1.25rem)"}}},"backgroundColor":"secondary","textColor":"primary","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull has-primary-color has-secondary-background-color has-text-color has-background has-link-color" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--small, 1.25rem);"><!-- wp:columns {"verticalAlignment":"center","align":"wide"} -->
+					<div class="wp-block-columns alignwide are-vertically-aligned-center"><!-- wp:column {"verticalAlignment":"center"} -->
+					<div class="wp-block-column is-vertically-aligned-center"><!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"left"}} -->
+					<!-- wp:page-list /-->
+					<!-- /wp:navigation --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"width":""} -->
+					<div class="wp-block-column"><!-- wp:site-title {"textAlign":"center","style":{"typography":{"textTransform":"uppercase","fontStyle":"normal","fontWeight":"700"}}} /--></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"verticalAlignment":"center"} -->
+					<div class="wp-block-column is-vertically-aligned-center"><!-- wp:social-links {"iconColor":"primary","iconColorValue":"var(--wp--custom--color--primary)","className":"is-style-logos-only","layout":{"type":"flex","justifyContent":"right"}} -->
+					<ul class="wp-block-social-links has-icon-color is-style-logos-only"><!-- wp:social-link {"url":"#","service":"twitter"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"instagram"} /--></ul>
+					<!-- /wp:social-links --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/header-default.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-default.php
new file mode 100644
index 0000000000..ff25793275
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-default.php
@@ -0,0 +1,23 @@
+<?php
+/**
+ * Default header block pattern
+ */
+return array(
+	'title'      => __( 'Default header', 'twentytwentytwo' ),
+	'categories' => array( 'header' ),
+	'blockTypes' => array( 'core/template-part/header' ),
+	'content'    => '<!-- wp:group {"align":"full","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"bottom":"var(--wp--custom--spacing--large, 8rem)","top":"var(--wp--custom--spacing--small, 1.25rem)"}}},"layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--large, 8rem)"><!-- wp:group {"layout":{"type":"flex"}} -->
+					<div class="wp-block-group">
+					<!-- wp:site-logo {"width":64} /-->
+
+					<!-- wp:site-title {"style":{"typography":{"fontStyle":"italic","fontWeight":"400"}}} /--></div>
+					<!-- /wp:group -->
+
+					<!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"}} -->
+					<!-- wp:page-list {"isNavigationChild":true,"showSubmenuIcon":true,"openSubmenusOnClick":false} /-->
+					<!-- /wp:navigation --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/header-image-background-overlay.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-image-background-overlay.php
new file mode 100644
index 0000000000..55422aa41b
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-image-background-overlay.php
@@ -0,0 +1,20 @@
+<?php
+/**
+ * Header with image background and overlay block pattern
+ */
+return array(
+	'title'      => __( 'Header with image background and overlay', 'twentytwentytwo' ),
+	'categories' => array( 'header' ),
+	'blockTypes' => array( 'core/template-part/header' ),
+	'content'    => '<!-- wp:group {"align":"full","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull"><!-- wp:cover {"url":"' . esc_url( get_template_directory_uri() ) . '/assets/images/ducks.jpg","dimRatio":90,"overlayColor":"primary","focalPoint":{"x":"0.26","y":"0.34"},"minHeight":100,"minHeightUnit":"px","contentPosition":"center center","align":"full","style":{"spacing":{"padding":{"top":"var(--wp--custom--spacing--small, 1.25rem)","bottom":"var(--wp--custom--spacing--small, 1.25rem)"}},"color":{"duotone":["#000000","#ffffff"]}}} -->
+					<div class="wp-block-cover alignfull" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--small, 1.25rem);min-height:100px"><span aria-hidden="true" class="has-primary-background-color has-background-dim-90 wp-block-cover__gradient-background has-background-dim"></span><img class="wp-block-cover__image-background" alt="' . esc_attr__( 'Painting of ducks in the water.', 'twentytwentytwo' ) . '" src="' . esc_url( get_template_directory_uri() ) . '/assets/images/ducks.jpg" style="object-position:26% 34%" data-object-fit="cover" data-object-position="26% 34%"/><div class="wp-block-cover__inner-container"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"bottom":"0rem","top":"0px","right":"0px","left":"0px"}},"elements":{"link":{"color":{"text":"var:preset|color|background"}}}},"textColor":"background","layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide has-background-color has-text-color has-link-color" style="padding-top:0px;padding-right:0px;padding-bottom:0rem;padding-left:0px"><!-- wp:site-title {"style":{"typography":{"fontStyle":"normal","fontWeight":"700"}}} /-->
+
+					<!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"}} -->
+					<!-- wp:page-list {"isNavigationChild":true,"showSubmenuIcon":true,"openSubmenusOnClick":false} /-->
+					<!-- /wp:navigation --></div>
+					<!-- /wp:group --></div></div>
+					<!-- /wp:cover --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/header-image-background.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-image-background.php
new file mode 100644
index 0000000000..4afd36c551
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-image-background.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Header with image background block pattern
+ */
+return array(
+	'title'      => __( 'Header with image background', 'twentytwentytwo' ),
+	'categories' => array( 'header' ),
+	'blockTypes' => array( 'core/template-part/header' ),
+	'content'    => '<!-- wp:group {"align":"full","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull"><!-- wp:cover {"url":"' . esc_url( get_template_directory_uri() ) . '/assets/images/flight-path-on-gray-c.jpg","dimRatio":0,"focalPoint":{"x":"0.58","y":"0.58"},"minHeight":400,"contentPosition":"center center","align":"full","style":{"spacing":{"padding":{"top":"var(--wp--custom--spacing--small, 1.25rem)","bottom":"var(--wp--custom--spacing--large, 8rem)"}},"color":{}}} -->
+					<div class="wp-block-cover alignfull" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--large, 8rem);min-height:400px"><span aria-hidden="true" class="has-background-dim-0 wp-block-cover__gradient-background has-background-dim"></span><img class="wp-block-cover__image-background" alt="' . esc_attr__( 'Illustration of a flying bird', 'twentytwentytwo' ) . '" src="' . esc_url( get_template_directory_uri() ) . '/assets/images/flight-path-on-gray-c.jpg" style="object-position:58% 58%" data-object-fit="cover" data-object-position="58% 58%"/><div class="wp-block-cover__inner-container"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"bottom":"0rem","top":"0px","right":"0px","left":"0px"}},"elements":{"link":{"color":{"text":"var:preset|color|foreground"}}}},"textColor":"foreground","layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide has-foreground-color has-text-color has-link-color" style="padding-top:0px;padding-right:0px;padding-bottom:0rem;padding-left:0px"><!-- wp:site-title {"style":{"typography":{"fontStyle":"normal","fontWeight":"700"}}} /-->
+
+					<!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"}} -->
+					<!-- wp:page-list {"isNavigationChild":true,"showSubmenuIcon":true,"openSubmenusOnClick":false} /-->
+					<!-- /wp:navigation --></div>
+					<!-- /wp:group -->
+
+					<!-- wp:spacer {"height":500} -->
+					<div style="height:500px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer --></div></div>
+					<!-- /wp:cover --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/header-large-dark.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-large-dark.php
new file mode 100644
index 0000000000..dfb8c6f371
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-large-dark.php
@@ -0,0 +1,34 @@
+<?php
+/**
+ * Large header with dark background block pattern
+ */
+return array(
+	'title'      => __( 'Large header with dark background', 'twentytwentytwo' ),
+	'categories' => array( 'header' ),
+	'blockTypes' => array( 'core/template-part/header' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"elements":{"link":{"color":{"text":"var:preset|color|background"}}},"spacing":{"padding":{"top":"0px","bottom":"var(--wp--custom--spacing--large, 8rem)"}}},"backgroundColor":"foreground","textColor":"background","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull has-background-color has-foreground-background-color has-text-color has-background has-link-color" style="padding-top:0px;padding-bottom:var(--wp--custom--spacing--large, 8rem);"><!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"0px","bottom":"0px"}}},"layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull" style="padding-top:0px;padding-bottom:0px;"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"var(--wp--custom--spacing--small, 1.25rem)","bottom":"var(--wp--custom--spacing--large, 8rem)"}}},"layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--large, 8rem)"><!-- wp:group {"layout":{"type":"flex"}} -->
+					<div class="wp-block-group"><!-- wp:site-logo {"width":64} /-->
+
+					<!-- wp:site-title {"style":{"typography":{"fontStyle":"italic","fontWeight":"400"}}} /--></div>
+					<!-- /wp:group -->
+
+					<!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"}} -->
+					<!-- wp:page-list /-->
+					<!-- /wp:navigation --></div>
+					<!-- /wp:group -->
+
+					<!-- wp:heading {"align":"wide","style":{"typography":{"fontSize":"clamp(3.25rem, 8vw, 6.25rem)","lineHeight":"1.15"}}} -->
+					<h2 class="alignwide" style="font-size:clamp(3.25rem, 8vw, 6.25rem);line-height:1.15">' . wp_kses_post( __( '<em>The Hatchery</em>: a blog about my adventures in bird watching', 'twentytwentytwo' ) ) . '</h2>
+					<!-- /wp:heading --></div>
+					<!-- /wp:group -->
+
+					<!-- wp:image {"align":"full","sizeSlug":"full","linkDestination":"none"} -->
+					<figure class="wp-block-image alignfull size-full"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/flight-path-on-transparent-c.png" alt="' . esc_attr__( 'Illustration of a bird flying.', 'twentytwentytwo' ) . '"/></figure>
+					<!-- /wp:image --></div>
+					<!-- /wp:group --><!-- wp:spacer {"height":66} -->
+					<div style="height:66px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/header-logo-navigation-gray-background.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-logo-navigation-gray-background.php
new file mode 100644
index 0000000000..dbe8de9fe4
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-logo-navigation-gray-background.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * Logo and navigation header with gray background
+ */
+return array(
+	'title'      => __( 'Logo and navigation header with gray background', 'twentytwentytwo' ),
+	'categories' => array( 'header' ),
+	'blockTypes' => array( 'core/template-part/header' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"elements":{"link":{"color":{"text":"var:preset|color|foreground"}}},"spacing":{"padding":{"top":"var(--wp--custom--spacing--small, 1.25rem)","bottom":"var(--wp--custom--spacing--small, 1.25rem)"}}},"backgroundColor":"tertiary","textColor":"foreground","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull has-foreground-color has-tertiary-background-color has-text-color has-background has-link-color" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--small, 1.25rem)"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"bottom":"0rem","top":"0px","right":"0px","left":"0px"}}},"layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide" style="padding-top:0px;padding-right:0px;padding-bottom:0rem;padding-left:0px"><!-- wp:site-logo {"width":64} /-->
+
+					<!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"}} -->
+					<!-- wp:page-list /-->
+					<!-- /wp:navigation --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/header-logo-navigation-offset-tagline.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-logo-navigation-offset-tagline.php
new file mode 100644
index 0000000000..299586f0ec
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-logo-navigation-offset-tagline.php
@@ -0,0 +1,30 @@
+<?php
+/**
+ * Logo, navigation, and offset tagline Header block pattern
+ */
+return array(
+	'title'      => __( 'Logo, navigation, and offset tagline Header', 'twentytwentytwo' ),
+	'categories' => array( 'header' ),
+	'blockTypes' => array( 'core/template-part/header' ),
+	'content'    => '<!-- wp:group {"align":"full","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"bottom":"var(--wp--custom--spacing--large, 8rem)"}}}} -->
+					<div class="wp-block-group alignwide" style="padding-bottom:var(--wp--custom--spacing--large, 8rem)"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"var(--wp--custom--spacing--small, 1.25rem)"}}},"layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide" style="padding-top:var(--wp--custom--spacing--small, 1.25rem)"><!-- wp:site-logo {"width":64} /-->
+
+					<!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"}} -->
+					<!-- wp:page-list {"isNavigationChild":true,"showSubmenuIcon":true,"openSubmenusOnClick":false} /-->
+					<!-- /wp:navigation --></div>
+					<!-- /wp:group -->
+
+					<!-- wp:columns {"isStackedOnMobile":false,"align":"wide"} -->
+					<div class="wp-block-columns alignwide is-not-stacked-on-mobile"><!-- wp:column {"width":"64px"} -->
+					<div class="wp-block-column" style="flex-basis:64px"></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"width":"380px"} -->
+					<div class="wp-block-column" style="flex-basis:380px"><!-- wp:site-tagline {"fontSize":"small"} /--></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/header-logo-navigation-social-black-background.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-logo-navigation-social-black-background.php
new file mode 100644
index 0000000000..f881b41d81
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-logo-navigation-social-black-background.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Logo, navigation, and social links header with black background block pattern
+ */
+return array(
+	'title'      => __( 'Logo, navigation, and social links header with black background', 'twentytwentytwo' ),
+	'categories' => array( 'header' ),
+	'blockTypes' => array( 'core/template-part/header' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"elements":{"link":{"color":{"text":"var:preset|color|background"}}},"spacing":{"padding":{"top":"var(--wp--custom--spacing--small, 1.25rem)","bottom":"var(--wp--custom--spacing--small, 1.25rem)"}}},"backgroundColor":"foreground","textColor":"background","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull has-background-color has-foreground-background-color has-text-color has-background has-link-color" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--small, 1.25rem)"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"bottom":"0rem","top":"0px","right":"0px","left":"0px"}}},"layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide" style="padding-top:0px;padding-right:0px;padding-bottom:0rem;padding-left:0px"><!-- wp:site-logo {"width":64} /-->
+
+					<!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"}} -->
+					<!-- wp:page-list {"isNavigationChild":true,"showSubmenuIcon":true,"openSubmenusOnClick":false} /-->
+
+					<!-- wp:social-links {"iconColor":"background","iconColorValue":"var(--wp--preset--color--background)","className":"is-style-logos-only"} -->
+					<ul class="wp-block-social-links has-icon-color is-style-logos-only"><!-- wp:social-link {"url":"#","service":"instagram"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"twitter"} /--></ul>
+					<!-- /wp:social-links -->
+					<!-- /wp:navigation --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/header-small-dark.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-small-dark.php
new file mode 100644
index 0000000000..7c26516fe6
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-small-dark.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Small header with dark background block pattern
+ */
+return array(
+	'title'      => __( 'Small header with dark background', 'twentytwentytwo' ),
+	'categories' => array( 'header' ),
+	'blockTypes' => array( 'core/template-part/header' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"elements":{"link":{"color":{"text":"var:preset|color|background"}}},"spacing":{"padding":{"top":"0px","bottom":"0px"}}},"backgroundColor":"foreground","textColor":"background","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull has-background-color has-foreground-background-color has-text-color has-background has-link-color" style="padding-top:0px;padding-bottom:0px;"><!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"0px","bottom":"0px"}}},"layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull" style="padding-top:0px;padding-bottom:0px;"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"top":"var(--wp--custom--spacing--small, 1.25rem)","bottom":"var(--wp--custom--spacing--large, 8rem)"}}},"layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--large, 8rem)"><!-- wp:group {"layout":{"type":"flex"}} -->
+					<div class="wp-block-group"><!-- wp:site-logo {"width":64} /-->
+
+					<!-- wp:site-title {"style":{"typography":{"fontStyle":"italic","fontWeight":"400"}}} /--></div>
+					<!-- /wp:group -->
+
+					<!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"}} -->
+					<!-- wp:page-list /-->
+					<!-- /wp:navigation --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->
+
+					<!-- wp:image {"align":"wide","sizeSlug":"full","linkDestination":"none"} -->
+					<figure class="wp-block-image alignwide size-full"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/flight-path-on-transparent-d.png" alt="' . esc_attr__( 'Illustration of a bird flying.', 'twentytwentytwo' ) . '"/></figure>
+					<!-- /wp:image --></div>
+					<!-- /wp:group -->
+					<!-- wp:spacer {"height":66} -->
+					<div style="height:66px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/header-stacked.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-stacked.php
new file mode 100644
index 0000000000..bd36bbf4b9
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-stacked.php
@@ -0,0 +1,28 @@
+<?php
+/**
+ * Logo and navigation header block pattern
+ */
+return array(
+	'title'      => __( 'Logo and navigation header', 'twentytwentytwo' ),
+	'categories' => array( 'header' ),
+	'blockTypes' => array( 'core/template-part/header' ),
+	'content'    => '<!-- wp:group {"align":"full","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"bottom":"var(--wp--custom--spacing--large, 8rem)","top":"var(--wp--custom--spacing--small, 1.25rem)"}}}} -->
+					<div class="wp-block-group alignwide" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--large, 8rem)"><!-- wp:site-logo {"align":"center","width":128} /-->
+
+					<!-- wp:spacer {"height":10} -->
+					<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:site-title {"textAlign":"center","style":{"typography":{"fontStyle":"normal","fontWeight":"400","textTransform":"uppercase"}}} /-->
+
+					<!-- wp:spacer {"height":10} -->
+					<div style="height:10px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"center"}} -->
+					<!-- wp:page-list {"isNavigationChild":true,"showSubmenuIcon":true,"openSubmenusOnClick":false} /-->
+					<!-- /wp:navigation --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/header-text-only-green-background.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-text-only-green-background.php
new file mode 100644
index 0000000000..0e11c13607
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-text-only-green-background.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Text-only header with green background block pattern
+ */
+return array(
+	'title'      => __( 'Text-only header with green background', 'twentytwentytwo' ),
+	'categories' => array( 'header' ),
+	'blockTypes' => array( 'core/template-part/header' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"elements":{"link":{"color":{"text":"var:preset|color|background"}}},"spacing":{"padding":{"top":"var(--wp--custom--spacing--small, 1.25rem)","bottom":"var(--wp--custom--spacing--small, 1.25rem)"}}},"backgroundColor":"primary","textColor":"background","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull has-background-color has-primary-background-color has-text-color has-background has-link-color" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--small, 1.25rem)"><!-- wp:group {"align":"wide","layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide"><!-- wp:group -->
+					<div class="wp-block-group"><!-- wp:site-title {"style":{"spacing":{"margin":{"top":"0px","bottom":"0px"}},"typography":{"fontStyle":"normal","fontWeight":"700"}}} /-->
+
+					<!-- wp:site-tagline {"style":{"spacing":{"margin":{"top":"0.25em","bottom":"0px"}},"typography":{"fontStyle":"italic","fontWeight":"400"}},"fontSize":"small"} /--></div>
+					<!-- /wp:group -->
+
+					<!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"}} -->
+					<!-- wp:page-list /-->
+					<!-- /wp:navigation --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/header-text-only-salmon-background.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-text-only-salmon-background.php
new file mode 100644
index 0000000000..b03e528a48
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-text-only-salmon-background.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * Text-only header with salmon background block pattern
+ */
+return array(
+	'title'      => __( 'Text-only header with salmon background', 'twentytwentytwo' ),
+	'categories' => array( 'header' ),
+	'blockTypes' => array( 'core/template-part/header' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"elements":{"link":{"color":{"text":"var:preset|color|foreground"}}},"spacing":{"padding":{"top":"var(--wp--custom--spacing--small, 1.25rem)","bottom":"var(--wp--custom--spacing--small, 1.25rem)"}}},"backgroundColor":"secondary","textColor":"foreground","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull has-foreground-color has-secondary-background-color has-text-color has-background has-link-color" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--small, 1.25rem)"><!-- wp:group {"align":"wide","layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide"><!-- wp:site-title {"style":{"spacing":{"margin":{"top":"0px","bottom":"0px"}},"typography":{"fontStyle":"normal","fontWeight":"700"}}} /-->
+
+					<!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"}} -->
+					<!-- wp:page-list {"isNavigationChild":true,"showSubmenuIcon":true,"openSubmenusOnClick":false} /-->
+					<!-- /wp:navigation --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/header-text-only-with-tagline-black-background.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-text-only-with-tagline-black-background.php
new file mode 100644
index 0000000000..4c2a4864f0
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-text-only-with-tagline-black-background.php
@@ -0,0 +1,22 @@
+<?php
+/**
+ * Text-only header with tagline and black background block pattern
+ */
+return array(
+	'title'      => __( 'Text-only header with tagline and black background', 'twentytwentytwo' ),
+	'categories' => array( 'header' ),
+	'blockTypes' => array( 'core/template-part/header' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"elements":{"link":{"color":{"text":"var:preset|color|secondary"}}},"spacing":{"padding":{"top":"var(--wp--custom--spacing--small, 1.25rem)","bottom":"var(--wp--custom--spacing--small, 1.25rem)"}}},"backgroundColor":"foreground","textColor":"secondary","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull has-secondary-color has-foreground-background-color has-text-color has-background has-link-color" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--small, 1.25rem)"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"bottom":"0rem","top":"0px","right":"0px","left":"0px"}}},"layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide" style="padding-top:0px;padding-right:0px;padding-bottom:0rem;padding-left:0px"><!-- wp:group {"layout":{"type":"flex","justifyContent":"left"}} -->
+					<div class="wp-block-group"><!-- wp:site-title {"style":{"typography":{"fontStyle":"normal","fontWeight":"700"}}} /-->
+
+					<!-- wp:site-tagline {"style":{"typography":{"fontStyle":"italic","fontWeight":"400"}},"fontSize":"small"} /--></div>
+					<!-- /wp:group -->
+
+					<!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"}} -->
+					<!-- wp:page-list /-->
+					<!-- /wp:navigation --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/header-title-and-button.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-title-and-button.php
new file mode 100644
index 0000000000..5c780697da
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-title-and-button.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * Title and button header block pattern
+ */
+return array(
+	'title'      => __( 'Title and button header', 'twentytwentytwo' ),
+	'categories' => array( 'header' ),
+	'blockTypes' => array( 'core/template-part/header' ),
+	'content'    => '<!-- wp:group {"align":"full","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"bottom":"var(--wp--custom--spacing--large, 8rem)","top":"var(--wp--custom--spacing--small, 1.25rem)"}}},"layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--large, 8rem)"><!-- wp:site-title {"style":{"spacing":{"margin":{"top":"0px","bottom":"0px"}},"typography":{"fontStyle":"normal","fontWeight":"700"}}} /-->
+
+					<!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"},"overlayMenu":"always"} -->
+					<!-- wp:page-list {"isNavigationChild":true,"showSubmenuIcon":true,"openSubmenusOnClick":false} /-->
+					<!-- /wp:navigation --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/header-title-navigation-social.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-title-navigation-social.php
new file mode 100644
index 0000000000..384cda5368
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-title-navigation-social.php
@@ -0,0 +1,24 @@
+<?php
+/**
+ * Title, navigation, and social links header block pattern
+ */
+return array(
+	'title'      => __( 'Title, navigation, and social links header', 'twentytwentytwo' ),
+	'categories' => array( 'header' ),
+	'blockTypes' => array( 'core/template-part/header' ),
+	'content'    => '<!-- wp:group {"align":"full","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"bottom":"var(--wp--custom--spacing--large, 8rem)","top":"var(--wp--custom--spacing--small, 1.25rem)"}}},"layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--large, 8rem)"><!-- wp:site-title {"style":{"typography":{"fontStyle":"italic","fontWeight":"400"}}} /-->
+
+					<!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"}} -->
+					<!-- wp:page-list {"isNavigationChild":true,"showSubmenuIcon":true,"openSubmenusOnClick":false} /-->
+
+					<!-- wp:social-links {"iconColor":"foreground","iconColorValue":"var(--wp--preset--color--foreground)","className":"is-style-logos-only"} -->
+					<ul class="wp-block-social-links has-icon-color is-style-logos-only"><!-- wp:social-link {"url":"#","service":"instagram"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"twitter"} /--></ul>
+					<!-- /wp:social-links -->
+					<!-- /wp:navigation --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/header-with-tagline.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-with-tagline.php
new file mode 100644
index 0000000000..40e633a268
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/header-with-tagline.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Header with tagline block pattern
+ */
+return array(
+	'title'      => __( 'Header with tagline', 'twentytwentytwo' ),
+	'categories' => array( 'header' ),
+	'blockTypes' => array( 'core/template-part/header' ),
+	'content'    => '<!-- wp:group {"align":"full","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"bottom":"var(--wp--custom--spacing--large, 8rem)","top":"var(--wp--custom--spacing--small, 1.25rem)"}}},"layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--large, 8rem)"><!-- wp:group {"layout":{"type":"flex"}} -->
+					<div class="wp-block-group"><!-- wp:site-logo {"width":64} /-->
+
+					<!-- wp:group -->
+					<div class="wp-block-group"><!-- wp:site-title {"style":{"spacing":{"margin":{"top":"0px","bottom":"0px"}},"typography":{"fontStyle":"normal","fontWeight":"700"}}} /-->
+
+					<!-- wp:site-tagline {"style":{"spacing":{"margin":{"top":"0.25em","bottom":"0px"}},"typography":{"fontStyle":"italic","fontWeight":"400"}},"fontSize":"small"} /--></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->
+
+					<!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"}} -->
+					<!-- wp:page-list {"isNavigationChild":true,"showSubmenuIcon":true,"openSubmenusOnClick":false} /-->
+					<!-- /wp:navigation --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/hidden-404.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/hidden-404.php
new file mode 100644
index 0000000000..9cfd50d56e
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/hidden-404.php
@@ -0,0 +1,15 @@
+<?php
+/**
+ * 404 content.
+ */
+return array(
+	'title'    => __( '404 content', 'twentytwentytwo' ),
+	'inserter' => false,
+	'content'  => '<!-- wp:heading {"style":{"typography":{"fontSize":"clamp(4rem, 40vw, 20rem)","fontWeight":"200","lineHeight":"1"}},"className":"has-text-align-center"} -->
+					<h2 class="has-text-align-center" style="font-size:clamp(4rem, 40vw, 20rem);font-weight:200;line-height:1">' . esc_html( _x( '404', 'Error code for a webpage that is not found.', 'twentytwentytwo' ) ) . '</h2>
+					<!-- /wp:heading -->
+					<!-- wp:paragraph {"align":"center"} -->
+					<p class="has-text-align-center">' . esc_html__( 'This page could not be found. Maybe try a search?', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph -->
+					<!-- wp:search {"label":"' . esc_html_x( 'Search', 'label', 'twentytwentytwo' ) . '","showLabel":false,"width":50,"widthUnit":"%","buttonText":"' . esc_html__( 'Search', 'twentytwentytwo' ) . '","buttonUseIcon":true,"align":"center"} /-->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/hidden-bird.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/hidden-bird.php
new file mode 100644
index 0000000000..c29d3d440a
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/hidden-bird.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Bird image
+ *
+ * This pattern is used only to reference a dynamic image URL.
+ * It does not appear in the inserter.
+ */
+return array(
+	'title'    => __( 'Heading and bird image', 'twentytwentytwo' ),
+	'inserter' => false,
+	'content'  => '<!-- wp:image {"align":"wide","sizeSlug":"full","linkDestination":"none"} -->
+					<figure class="wp-block-image alignwide size-full"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/flight-path-on-transparent-d.png" alt="' . esc_attr__( 'Illustration of a bird flying.', 'twentytwentytwo' ) . '"/></figure>
+					<!-- /wp:image -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/hidden-heading-and-bird.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/hidden-heading-and-bird.php
new file mode 100644
index 0000000000..28f3d6c5de
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/hidden-heading-and-bird.php
@@ -0,0 +1,21 @@
+<?php
+/**
+ * Heading and bird image
+ *
+ * This pattern is used only for translation
+ * and to reference a dynamic image URL. It does
+ * not appear in the inserter.
+ */
+return array(
+	'title'    => __( 'Heading and bird image', 'twentytwentytwo' ),
+	'inserter' => false,
+	'content'  => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"0px","bottom":"0px"}}},"layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull" style="padding-top:0px;padding-bottom:0px;"><!-- wp:heading {"align":"wide","style":{"typography":{"fontSize":"var(--wp--custom--typography--font-size--colossal, clamp(3.25rem, 8vw, 6.25rem))","lineHeight":"1.15"}}} -->
+					<h2 class="alignwide" style="font-size:var(--wp--custom--typography--font-size--colossal, clamp(3.25rem, 8vw, 6.25rem));line-height:1.15">' . wp_kses_post( __( '<em>The Hatchery</em>: a blog about my adventures in bird watching', 'twentytwentytwo' ) ) . '</h2>
+					<!-- /wp:heading --></div>
+					<!-- /wp:group -->
+
+					<!-- wp:image {"align":"full","sizeSlug":"full","linkDestination":"none"} -->
+					<figure class="wp-block-image alignfull size-full"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/flight-path-on-transparent-c.png" alt="' . esc_attr__( 'Illustration of a bird flying.', 'twentytwentytwo' ) . '"/></figure>
+					<!-- /wp:image -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-large-image-and-buttons.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-large-image-and-buttons.php
new file mode 100644
index 0000000000..7e03ed41e2
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-large-image-and-buttons.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * About page with large image and buttons
+ */
+return array(
+	'title'      => __( 'About page with large image and buttons', 'twentytwentytwo' ),
+	'categories' => array( 'pages', 'buttons' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var(--wp--custom--spacing--small, 1.25rem)","bottom":"var(--wp--custom--spacing--small, 1.25rem)"}}},"layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--small, 1.25rem)"><!-- wp:image {"align":"wide","sizeSlug":"full","linkDestination":"none"} -->
+					<figure class="wp-block-image alignwide size-full"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/flight-path-on-gray-b.jpg" alt=""/></figure>
+					<!-- /wp:image -->
+
+					<!-- wp:columns {"align":"wide"} -->
+					<div class="wp-block-columns alignwide"><!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:buttons -->
+					<div class="wp-block-buttons"><!-- wp:button {"width":100} -->
+					<div class="wp-block-button has-custom-width wp-block-button__width-100"><a class="wp-block-button__link">' . esc_html__( 'Purchase my work', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button --></div>
+					<!-- /wp:buttons --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:buttons -->
+					<div class="wp-block-buttons"><!-- wp:button {"width":100} -->
+					<div class="wp-block-button has-custom-width wp-block-button__width-100"><a class="wp-block-button__link">' . esc_html__( 'Support my studio', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button --></div>
+					<!-- /wp:buttons --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:buttons -->
+					<div class="wp-block-buttons"><!-- wp:button {"width":100} -->
+					<div class="wp-block-button has-custom-width wp-block-button__width-100"><a class="wp-block-button__link">' . esc_html__( 'Take a class', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button --></div>
+					<!-- /wp:buttons --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns -->
+
+					<!-- wp:columns {"align":"wide"} -->
+					<div class="wp-block-columns alignwide"><!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:buttons -->
+					<div class="wp-block-buttons"><!-- wp:button {"width":100} -->
+					<div class="wp-block-button has-custom-width wp-block-button__width-100"><a class="wp-block-button__link">' . esc_html__( 'Read about me', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button --></div>
+					<!-- /wp:buttons --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:buttons -->
+					<div class="wp-block-buttons"><!-- wp:button {"width":100} -->
+					<div class="wp-block-button has-custom-width wp-block-button__width-100"><a class="wp-block-button__link">' . esc_html__( 'Learn about my process', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button --></div>
+					<!-- /wp:buttons --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:buttons -->
+					<div class="wp-block-buttons"><!-- wp:button {"width":100} -->
+					<div class="wp-block-button has-custom-width wp-block-button__width-100"><a class="wp-block-button__link">' . esc_html__( 'Join my mailing list', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button --></div>
+					<!-- /wp:buttons --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns -->
+
+					<!-- wp:spacer {"height":50} -->
+					<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:social-links {"iconColor":"primary","iconColorValue":"var(--wp--preset--color--primary)","className":"is-style-logos-only","layout":{"type":"flex","justifyContent":"center"}} -->
+					<ul class="wp-block-social-links has-icon-color is-style-logos-only"><!-- wp:social-link {"url":"#","service":"wordpress"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"facebook"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"twitter"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"instagram"} /--></ul>
+					<!-- /wp:social-links --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-links-dark.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-links-dark.php
new file mode 100644
index 0000000000..ccb0ec2005
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-links-dark.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * About page links (dark)
+ */
+return array(
+	'title'      => __( 'About page links (dark)', 'twentytwentytwo' ),
+	'categories' => array( 'pages', 'buttons' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"elements":{"link":{"color":{"text":"var:preset|color|background"}}},"spacing":{"padding":{"top":"10rem","bottom":"10rem"}}},"backgroundColor":"primary","textColor":"background","layout":{"inherit":false,"contentSize":"400px"}} -->
+					<div class="wp-block-group alignfull has-background-color has-primary-background-color has-text-color has-background has-link-color" style="padding-top:10rem;padding-bottom:10rem;"><!-- wp:group -->
+					<div class="wp-block-group">
+
+					<!-- wp:image {"width":100,"height":100,"sizeSlug":"full","linkDestination":"none","className":"is-style-rounded"} -->
+					<figure class="wp-block-image size-full is-resized is-style-rounded"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/icon-bird.jpg" alt="' . esc_attr__( 'Logo featuring a flying bird', 'twentytwentytwo' ) . '" width="100" height="100"/></figure>
+					<!-- /wp:image -->
+
+					<!-- wp:heading {"textAlign":"left","style":{"typography":{"fontSize":"var(--wp--custom--typography--font-size--huge, clamp(2.25rem, 4vw, 2.75rem))"}}} -->
+					<h2 class="has-text-align-left" style="font-size:var(--wp--custom--typography--font-size--huge, clamp(2.25rem, 4vw, 2.75rem))">' . esc_html__( 'A trouble of hummingbirds', 'twentytwentytwo' ) . '</h2>
+					<!-- /wp:heading -->
+
+					<!-- wp:spacer {"height":40} -->
+					<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:buttons {"contentJustification":"left"} -->
+					<div class="wp-block-buttons is-content-justification-left"><!-- wp:button {"width":100,"style":{"border":{"radius":"6px"}},"className":"is-style-outline"} -->
+					<div class="wp-block-button has-custom-width wp-block-button__width-100 is-style-outline"><a class="wp-block-button__link" style="border-radius:6px">' . esc_html__( 'Watch our videos', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button -->
+
+					<!-- wp:button {"width":100,"style":{"border":{"radius":"6px"}},"className":"is-style-outline"} -->
+					<div class="wp-block-button has-custom-width wp-block-button__width-100 is-style-outline"><a class="wp-block-button__link" style="border-radius:6px">' . esc_html__( 'Listen on iTunes Podcasts', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button -->
+
+					<!-- wp:button {"width":100,"style":{"border":{"radius":"6px"}},"className":"is-style-outline"} -->
+					<div class="wp-block-button has-custom-width wp-block-button__width-100 is-style-outline"><a class="wp-block-button__link" style="border-radius:6px">' . esc_html__( 'Listen on Spotify', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button -->
+
+					<!-- wp:button {"width":100,"style":{"border":{"radius":"6px"}},"className":"is-style-outline"} -->
+					<div class="wp-block-button has-custom-width wp-block-button__width-100 is-style-outline"><a class="wp-block-button__link" style="border-radius:6px">' . esc_html__( 'Support the show', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button -->
+
+					<!-- wp:button {"width":100,"style":{"border":{"radius":"6px"}},"className":"is-style-outline"} -->
+					<div class="wp-block-button has-custom-width wp-block-button__width-100 is-style-outline"><a class="wp-block-button__link" style="border-radius:6px">' . esc_html__( 'About the hosts', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button --></div>
+					<!-- /wp:buttons --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-links.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-links.php
new file mode 100644
index 0000000000..997cf03869
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-links.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * About page links
+ */
+return array(
+	'title'      => __( 'About page links', 'twentytwentytwo' ),
+	'categories' => array( 'pages', 'buttons' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"10rem","bottom":"10rem"}}},"layout":{"inherit":false,"contentSize":"400px"}} -->
+					<div class="wp-block-group alignfull" style="padding-top:10rem;padding-bottom:10rem;"><!-- wp:image {"align":"center","width":100,"height":100,"sizeSlug":"full","linkDestination":"none","className":"is-style-rounded"} -->
+					<div class="wp-block-image is-style-rounded"><figure class="aligncenter size-full is-resized"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/icon-bird.jpg" alt="' . esc_attr__( 'Logo featuring a flying bird', 'twentytwentytwo' ) . '" width="100" height="100"/></figure></div>
+					<!-- /wp:image -->
+
+					<!-- wp:group -->
+					<div class="wp-block-group">
+
+					<!-- wp:heading {"textAlign":"center","style":{"typography":{"fontSize":"var(--wp--custom--typography--font-size--huge, clamp(2.25rem, 4vw, 2.75rem))"}}} -->
+					<h2 class="has-text-align-center" style="font-size:var(--wp--custom--typography--font-size--huge, clamp(2.25rem, 4vw, 2.75rem))">' . esc_html__( 'Swoop', 'twentytwentytwo' ) . '</h2>
+					<!-- /wp:heading -->
+
+					<!-- wp:paragraph {"align":"center"} -->
+					<p class="has-text-align-center">' . esc_html__( 'A podcast about birds', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph -->
+
+					<!-- wp:spacer {"height":40} -->
+					<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:buttons {"contentJustification":"left"} -->
+					<div class="wp-block-buttons is-content-justification-left"><!-- wp:button {"width":100,"style":{"border":{"radius":"6px"}},"className":"is-style-fill"} -->
+					<div class="wp-block-button has-custom-width wp-block-button__width-100 is-style-fill"><a class="wp-block-button__link" style="border-radius:6px">' . esc_html__( 'Watch our videos', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button -->
+
+					<!-- wp:button {"width":100,"style":{"border":{"radius":"6px"}},"className":"is-style-fill"} -->
+					<div class="wp-block-button has-custom-width wp-block-button__width-100 is-style-fill"><a class="wp-block-button__link" style="border-radius:6px">' . esc_html__( 'Listen on iTunes Podcasts', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button -->
+
+					<!-- wp:button {"width":100,"style":{"border":{"radius":"6px"}},"className":"is-style-fill"} -->
+					<div class="wp-block-button has-custom-width wp-block-button__width-100 is-style-fill"><a class="wp-block-button__link" style="border-radius:6px">' . esc_html__( 'Listen on Spotify', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button -->
+
+					<!-- wp:button {"width":100,"style":{"border":{"radius":"6px"}},"className":"is-style-fill"} -->
+					<div class="wp-block-button has-custom-width wp-block-button__width-100 is-style-fill"><a class="wp-block-button__link" style="border-radius:6px">' . esc_html__( 'Support the show', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button -->
+
+					<!-- wp:button {"width":100,"style":{"border":{"radius":"6px"}},"className":"is-style-fill"} -->
+					<div class="wp-block-button has-custom-width wp-block-button__width-100 is-style-fill"><a class="wp-block-button__link" style="border-radius:6px">' . esc_html__( 'About the hosts', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button --></div>
+					<!-- /wp:buttons --></div>
+					<!-- /wp:group -->
+
+					<!-- wp:spacer {"height":40} -->
+					<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:social-links {"iconColor":"primary","iconColorValue":"var(--wp--preset--color--primary)","className":"is-style-logos-only","layout":{"type":"flex","justifyContent":"center"}} -->
+					<ul class="wp-block-social-links has-icon-color is-style-logos-only"><!-- wp:social-link {"url":"#","service":"wordpress"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"facebook"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"twitter"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"instagram"} /--></ul>
+					<!-- /wp:social-links --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-media-left.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-media-left.php
new file mode 100644
index 0000000000..ea805944db
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-media-left.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * About page with media on the left
+ */
+return array(
+	'title'      => __( 'About page with media on the left', 'twentytwentytwo' ),
+	'categories' => array( 'pages' ),
+	'content'    => '<!-- wp:media-text {"align":"full","mediaType":"image","imageFill":true,"focalPoint":{"x":"0.63","y":"0.16"},"backgroundColor":"foreground","className":"alignfull is-image-fill has-background-color has-text-color has-background has-link-color"} -->
+					<div class="wp-block-media-text alignfull is-stacked-on-mobile is-image-fill has-background-color has-text-color has-background has-link-color has-foreground-background-color has-background"><figure class="wp-block-media-text__media" style="background-image:url(' . esc_url( get_template_directory_uri() ) . '/assets/images/bird-on-salmon.jpg);background-position:63% 16%"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/bird-on-salmon.jpg" alt="' . esc_attr__( 'Image of a bird on a branch', 'twentytwentytwo' ) . '"/></figure><div class="wp-block-media-text__content"><!-- wp:spacer {"height":32} -->
+					<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:site-logo {"width":60} /-->
+
+					<!-- wp:group {"style":{"spacing":{"padding":{"right":"min(8rem, 5vw)","top":"min(28rem, 28vw)"}}}} -->
+					<div class="wp-block-group" style="padding-top:min(28rem, 28vw);padding-right:min(8rem, 5vw)"><!-- wp:heading {"style":{"typography":{"fontWeight":"300","lineHeight":"1.115","fontSize":"clamp(3rem, 6vw, 4.5rem)"}}} -->
+					<h2 style="font-size:clamp(3rem, 6vw, 4.5rem);font-weight:300;line-height:1.115"><em>' . esc_html__( 'Doug', 'twentytwentytwo' ) . '<br>' . esc_html__( 'Stilton', 'twentytwentytwo' ) . '</em></h2>
+					<!-- /wp:heading -->
+
+					<!-- wp:paragraph {"style":{"typography":{"lineHeight":"1.6"}}} -->
+					<p style="line-height:1.6">' . esc_html__( 'Oh hello. My name’s Doug, and you’ve found your way to my website. I’m an avid bird watcher, and I also broadcast my own radio show on Tuesday evenings at 11PM EDT.', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph -->
+
+					<!-- wp:spacer {"height":40} -->
+					<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:social-links {"iconColor":"background","iconColorValue":"var(--wp--preset--color--background)","iconBackgroundColor":"foreground","iconBackgroundColorValue":"var(--wp--preset--color--foreground)"} -->
+					<ul class="wp-block-social-links has-icon-color has-icon-background-color"><!-- wp:social-link {"url":"#","service":"wordpress"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"twitter"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"instagram"} /--></ul>
+					<!-- /wp:social-links --></div>
+					<!-- /wp:group -->
+
+					<!-- wp:spacer {"height":32} -->
+					<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer --></div></div>
+					<!-- /wp:media-text -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-media-right.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-media-right.php
new file mode 100644
index 0000000000..2493d5d4aa
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-media-right.php
@@ -0,0 +1,40 @@
+<?php
+/**
+ * About page with media on the right
+ */
+return array(
+	'title'      => __( 'About page with media on the right', 'twentytwentytwo' ),
+	'categories' => array( 'pages' ),
+	'content'    => '<!-- wp:media-text {"align":"full","mediaPosition":"right","mediaLink":"' . esc_url( get_template_directory_uri() ) . '/assets/images/bird-on-black.jpg","mediaType":"image","style":{"elements":{"link":{"color":{"text":"var:preset|color|background"}}}},"backgroundColor":"foreground","textColor":"background"} -->
+				<div class="wp-block-media-text alignfull has-media-on-the-right is-stacked-on-mobile has-background-color has-foreground-background-color has-text-color has-background has-link-color"><figure class="wp-block-media-text__media"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/bird-on-black.jpg" alt="' . esc_attr__( 'An image of a bird flying', 'twentytwentytwo' ) . '"/></figure><div class="wp-block-media-text__content"><!-- wp:spacer {"height":32} -->
+					<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+					<!-- wp:site-logo {"width":60} /-->
+
+					<!-- wp:group {"style":{"spacing":{"padding":{"right":"min(8rem, 5vw)","top":"min(20rem, 20vw)"}}}} -->
+					<div class="wp-block-group" style="padding-top:min(20rem, 20vw);padding-right:min(8rem, 5vw)"><!-- wp:heading {"style":{"typography":{"fontWeight":"300","lineHeight":"1.115","fontSize":"clamp(3rem, 6vw, 4.5rem)"}}} -->
+					<h2 style="font-size:clamp(3rem, 6vw, 4.5rem);font-weight:300;line-height:1.115"><em>' . wp_kses_post( __( 'Emery<br>Driscoll', 'twentytwentytwo' ) ) . '</em></h2>
+					<!-- /wp:heading -->
+
+					<!-- wp:paragraph {"style":{"typography":{"lineHeight":"1.6"}}} -->
+					<p style="line-height:1.6">' . esc_html__( 'Oh hello. My name’s Emery, and you’ve found your way to my website. I’m an avid bird watcher, and I also broadcast my own radio show on Tuesday evenings at 11PM EDT.', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph -->
+
+					<!-- wp:spacer {"height":40} -->
+					<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:social-links {"iconColor":"background","iconColorValue":"var(--wp--preset--color--foreground)","iconBackgroundColor":"foreground","iconBackgroundColorValue":"var(--wp--preset--color--background)"} -->
+					<ul class="wp-block-social-links has-icon-color has-icon-background-color"><!-- wp:social-link {"url":"#","service":"wordpress"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"twitter"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"instagram"} /--></ul>
+					<!-- /wp:social-links --></div>
+					<!-- /wp:group --></div>
+
+					<!-- wp:spacer {"height":32} -->
+					<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer --></div>
+					<!-- /wp:media-text -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-simple-dark.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-simple-dark.php
new file mode 100644
index 0000000000..131a48b45c
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-simple-dark.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Simple dark about page
+ */
+return array(
+	'title'      => __( 'Simple dark about page', 'twentytwentytwo' ),
+	'categories' => array( 'pages' ),
+	'content'    => '<!-- wp:cover {"overlayColor":"foreground","minHeight":100,"minHeightUnit":"vh","contentPosition":"center center","align":"full","style":{"spacing":{"padding":{"top":"max(1.25rem, 8vw)","right":"max(1.25rem, 8vw)","bottom":"max(1.25rem, 8vw)","left":"max(1.25rem, 8vw)"}}}} -->
+					<div class="wp-block-cover alignfull has-foreground-background-color has-background-dim" style="padding-top:max(1.25rem, 8vw);padding-right:max(1.25rem, 8vw);padding-bottom:max(1.25rem, 8vw);padding-left:max(1.25rem, 8vw);min-height:100vh"><div class="wp-block-cover__inner-container"><!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"},"overlayMenu":"always"} -->
+					<!-- wp:page-list {"isNavigationChild":true,"showSubmenuIcon":true,"openSubmenusOnClick":false} /-->
+					<!-- /wp:navigation -->
+
+					<!-- wp:columns -->
+					<div class="wp-block-columns"><!-- wp:column {"verticalAlignment":"bottom","width":"45%","style":{"spacing":{"padding":{"top":"12rem"}}}} -->
+					<div class="wp-block-column is-vertically-aligned-bottom" style="padding-top:12rem;flex-basis:45%"><!-- wp:site-logo {"width":60} /-->
+
+					<!-- wp:heading {"style":{"typography":{"fontWeight":"300","lineHeight":"1.115","fontSize":"clamp(3rem, 6vw, 4.5rem)"}}} -->
+					<h2 style="font-size:clamp(3rem, 6vw, 4.5rem);font-weight:300;line-height:1.115"><em>' . wp_kses_post( __( 'Jesús<br>Rodriguez', 'twentytwentytwo' ) ) . '</em></h2>
+					<!-- /wp:heading -->
+
+					<!-- wp:paragraph {"style":{"typography":{"lineHeight":"1.6"}}} -->
+					<p style="line-height:1.6">' . esc_html__( 'Oh hello. My name’s Jesús, and you’ve found your way to my website. I’m an avid bird watcher, and I also broadcast my own radio show on Tuesday evenings at 11PM EDT.', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph -->
+
+					<!-- wp:spacer {"height":40} -->
+					<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:social-links {"iconColor":"background","iconColorValue":"var(--wp--preset--color--foreground)","iconBackgroundColor":"foreground","iconBackgroundColorValue":"var(--wp--preset--color--background)"} -->
+					<ul class="wp-block-social-links has-icon-color has-icon-background-color"><!-- wp:social-link {"url":"#","service":"wordpress"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"twitter"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"instagram"} /--></ul>
+					<!-- /wp:social-links --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"verticalAlignment":"center","style":{"spacing":{"padding":{"top":"0rem","right":"0rem","bottom":"4rem","left":"0rem"}}}} -->
+					<div class="wp-block-column is-vertically-aligned-center" style="padding-top:0rem;padding-right:0rem;padding-bottom:4rem;padding-left:0rem"><!-- wp:separator {"color":"background","className":"is-style-wide"} -->
+					<hr class="wp-block-separator has-text-color has-background has-background-background-color has-background-color is-style-wide"/>
+					<!-- /wp:separator --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns --></div></div>
+					<!-- /wp:cover -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-solid-color.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-solid-color.php
new file mode 100644
index 0000000000..df8903d9ad
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-about-solid-color.php
@@ -0,0 +1,41 @@
+<?php
+/**
+ * About page on solid color background
+ */
+return array(
+	'title'      => __( 'About page on solid color background', 'twentytwentytwo' ),
+	'categories' => array( 'pages' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"1.25rem","right":"1.25rem","bottom":"1.25rem","left":"1.25rem"}}}} -->
+					<div class="wp-block-group alignfull" style="padding-top:1.25rem;padding-right:1.25rem;padding-bottom:1.25rem;padding-left:1.25rem"><!-- wp:cover {"overlayColor":"secondary","minHeight":80,"minHeightUnit":"vh","isDark":false,"align":"full"} -->
+					<div class="wp-block-cover alignfull is-light" style="min-height:80vh"><span aria-hidden="true" class="has-secondary-background-color has-background-dim-100 wp-block-cover__gradient-background has-background-dim"></span><div class="wp-block-cover__inner-container"><!-- wp:group {"layout":{"inherit":false,"contentSize":"400px"}} -->
+					<div class="wp-block-group"><!-- wp:spacer {"height":64} -->
+					<div style="height:64px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer --><!-- wp:heading {"style":{"typography":{"lineHeight":"1","textTransform":"uppercase","fontSize":"clamp(2.75rem, 6vw, 3.25rem)"}}} -->
+					<h2 id="edvard-smith" style="font-size:clamp(2.75rem, 6vw, 3.25rem);line-height:1;text-transform:uppercase">' . wp_kses_post( __( 'Edvard<br>Smith', 'twentytwentytwo' ) ) . '</h2>
+					<!-- /wp:heading -->
+
+					<!-- wp:spacer {"height":8} -->
+					<div style="height:8px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:paragraph {"fontSize":"small"} -->
+					<p class="has-small-font-size">' . esc_html__( 'Oh hello. My name’s Edvard, and you’ve found your way to my website. I’m an avid bird watcher, and I also broadcast my own radio show every Tuesday evening at 11PM EDT. Listen in sometime!', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph -->
+
+					<!-- wp:spacer {"height":8} -->
+					<div style="height:8px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:social-links {"iconColor":"foreground","iconColorValue":"var(--wp--preset--color--foreground)","className":"is-style-logos-only"} -->
+					<ul class="wp-block-social-links has-icon-color is-style-logos-only"><!-- wp:social-link {"url":"#","service":"wordpress"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"twitter"} /-->
+
+					<!-- wp:social-link {"url":"#","service":"instagram"} /--></ul>
+					<!-- /wp:social-links --><!-- wp:spacer {"height":64} -->
+					<div style="height:64px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer --></div>
+					<!-- /wp:group --></div></div>
+					<!-- /wp:cover --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/page-layout-image-and-text.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-layout-image-and-text.php
new file mode 100644
index 0000000000..7b6fa3ad81
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-layout-image-and-text.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Page layout with image and text.
+ */
+return array(
+	'title'      => __( 'Page layout with image and text', 'twentytwentytwo' ),
+	'categories' => array( 'pages' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var(--wp--custom--spacing--large, 8rem)","bottom":"2rem"}}},"layout":{"inherit":true}} -->
+				<div class="wp-block-group alignfull" style="padding-top:var(--wp--custom--spacing--large, 8rem);padding-bottom:2rem"><!-- wp:heading {"align":"wide","style":{"typography":{"fontSize":"clamp(4rem, 8vw, 7.5rem)","lineHeight":"1.15","fontWeight":"300"}}} -->
+					<h2 class="alignwide" style="font-size:clamp(4rem, 8vw, 7.5rem);font-weight:300;line-height:1.15">' . wp_kses_post( __( '<em>Watching Birds </em><br><em>in the Garden</em>', 'twentytwentytwo' ) ) . '</h2>
+					<!-- /wp:heading --></div>
+					<!-- /wp:group -->
+
+					<!-- wp:image {"align":"full","style":{"color":{}}} -->
+					<figure class="wp-block-image alignfull"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/flight-path-on-transparent-b.png" alt="' . esc_attr_x( 'TBD', 'Short for to be determined', 'twentytwentytwo' ) . '"/></figure>
+					<!-- /wp:image -->
+
+					<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"2rem","bottom":"var(--wp--custom--spacing--large, 8rem)"}}},"layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull" style="padding-top:2rem;padding-bottom:var(--wp--custom--spacing--large, 8rem)">
+					<!-- wp:columns {"align":"wide"} -->
+					<div class="wp-block-columns alignwide"><!-- wp:column {"verticalAlignment":"bottom","style":{"spacing":{"padding":{"bottom":"1em"}}}} -->
+					<div class="wp-block-column is-vertically-aligned-bottom" style="padding-bottom:1em"><!-- wp:site-logo {"width":60} /--></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"verticalAlignment":"bottom"} -->
+					<div class="wp-block-column is-vertically-aligned-bottom"><!-- wp:paragraph -->
+					<p>' . wp_kses_post( __( 'Oh hello. My name’s Angelo, and I operate this blog. I was born in Portland, but I currently live in upstate New York. You may recognize me from publications with names like <a href="#">Eagle Beagle</a> and <a href="#">Mourning Dive</a>. I write for a living.<br><br>I usually use this blog to catalog extensive lists of birds and other things that I find interesting. If you find an error with one of my lists, please keep it to yourself.<br><br>If that’s not your cup of tea, <a href="#">I definitely recommend this tea</a>. It’s my favorite.', 'twentytwentytwo' ) ) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/page-layout-image-text-and-video.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-layout-image-text-and-video.php
new file mode 100644
index 0000000000..7a7a6b79d3
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-layout-image-text-and-video.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Page layout with image, text and video.
+ */
+return array(
+	'title'      => __( 'Page layout with image, text and video', 'twentytwentytwo' ),
+	'categories' => array( 'pages' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var(--wp--custom--spacing--large, 8rem)","bottom":"var(--wp--custom--spacing--large, 8rem)"}}},"backgroundColor":"primary","textColor":"background"} -->
+					<div class="wp-block-group alignfull has-background-color has-primary-background-color has-text-color has-background" style="padding-top:var(--wp--custom--spacing--large, 8rem);padding-bottom:var(--wp--custom--spacing--large, 8rem)"><!-- wp:group {"layout":{"inherit":true}} -->
+					<div class="wp-block-group"><!-- wp:heading {"level":1,"align":"wide","style":{"typography":{"fontSize":"clamp(3rem, 6vw, 4.5rem)"}}} -->
+					<h1 class="alignwide" style="font-size:clamp(3rem, 6vw, 4.5rem)">' . wp_kses_post( __( '<em>Warble</em>, a film about <br>hobbyist bird watchers.', 'twentytwentytwo' ) ) . '</h1>
+					<!-- /wp:heading -->
+
+					<!-- wp:spacer {"height":50} -->
+					<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:columns {"align":"wide"} -->
+					<div class="wp-block-columns alignwide"><!-- wp:column {"width":"33.33%"} -->
+					<div class="wp-block-column" style="flex-basis:33.33%"><!-- wp:heading {"fontSize":"x-large"} -->
+					<h2 class="has-x-large-font-size">' . esc_html__( 'Screening', 'twentytwentytwo' ) . '</h2>
+					<!-- /wp:heading -->
+
+					<!-- wp:paragraph -->
+					<p>' . wp_kses_post( __( 'May 14th, 2022 @ 7:00PM<br>The Vintagé Theater,<br>245 Arden Rd.<br>Gardenville, NH', 'twentytwentytwo' ) ) . '</p>
+					<!-- /wp:paragraph -->
+
+					<!-- wp:buttons -->
+					<div class="wp-block-buttons"><!-- wp:button {"backgroundColor":"secondary","textColor":"primary"} -->
+					<div class="wp-block-button"><a class="wp-block-button__link has-primary-color has-secondary-background-color has-text-color has-background">' . esc_html__( 'Buy Tickets', 'twentytwentytwo' ) . '</a></div>
+					<!-- /wp:button --></div>
+					<!-- /wp:buttons --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"width":"66.66%"} -->
+					<div class="wp-block-column" style="flex-basis:66.66%"></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns --></div>
+					<!-- /wp:group -->
+
+					<!-- wp:image {"align":"full","style":{"color":{}}} -->
+					<figure class="wp-block-image alignfull"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/flight-path-on-transparent-a.png" alt="' . esc_attr__( 'An illustration of a bird in flight', 'twentytwentytwo' ) . '"/></figure>
+					<!-- /wp:image -->
+
+					<!-- wp:group {"align":"full","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull"><!-- wp:columns {"align":"wide"} -->
+					<div class="wp-block-columns alignwide"><!-- wp:column {"width":"33.33%"} -->
+					<div class="wp-block-column" style="flex-basis:33.33%"><!-- wp:heading {"fontSize":"x-large"} -->
+					<h2 class="has-x-large-font-size">' . esc_html__( 'Extended Trailer', 'twentytwentytwo' ) . '</h2>
+					<!-- /wp:heading -->
+
+					<!-- wp:paragraph -->
+					<p>' . esc_html__( 'Oh hello. My name’s Angelo, and you’ve found your way to my blog. I write about a range of topics, but lately I’ve been sharing my hopes for next year.', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"width":"66.66%"} -->
+					<div class="wp-block-column" style="flex-basis:66.66%"><!-- wp:video {"id":181} -->
+					<figure class="wp-block-video"><video controls src="' . esc_url( get_template_directory_uri() ) . '/assets/videos/birds.mp4"></video></figure>
+					<!-- /wp:video --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns --></div>
+					<!-- /wp:group --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/page-layout-two-columns.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-layout-two-columns.php
new file mode 100644
index 0000000000..2a27dfe824
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-layout-two-columns.php
@@ -0,0 +1,73 @@
+<?php
+/**
+ * Page layout with two columns.
+ */
+return array(
+	'title'      => __( 'Page layout with two columns', 'twentytwentytwo' ),
+	'categories' => array( 'pages' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var(--wp--custom--spacing--large, 8rem)","bottom":"var(--wp--custom--spacing--large, 8rem)"}}},"layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull" style="padding-top:var(--wp--custom--spacing--large, 8rem);padding-bottom:var(--wp--custom--spacing--large, 8rem);"><!-- wp:heading {"level":1,"align":"wide","style":{"typography":{"fontSize":"clamp(4rem, 15vw, 12.5rem)","lineHeight":"1","fontWeight":"200"}}} -->
+					<h1 class="alignwide" style="font-size:clamp(4rem, 15vw, 12.5rem);font-weight:200;line-height:1">' . wp_kses_post( __( '<em>Goldfinch </em><br><em>&amp; Sparrow</em>', 'twentytwentytwo' ) ) . '</h1>
+					<!-- /wp:heading -->
+
+					<!-- wp:spacer {"height":50} -->
+					<div style="height:50px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:group {"align":"wide","layout":{"inherit":false}} -->
+					<div class="wp-block-group alignwide"><!-- wp:columns -->
+					<div class="wp-block-columns"><!-- wp:column {"verticalAlignment":"center","width":"20%"} -->
+					<div class="wp-block-column is-vertically-aligned-center" style="flex-basis:20%"><!-- wp:paragraph -->
+					<p>' . esc_html__( 'WELCOME', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"verticalAlignment":"center","width":"80%"} -->
+					<div class="wp-block-column is-vertically-aligned-center" style="flex-basis:80%"><!-- wp:separator {"className":"is-style-wide"} -->
+					<hr class="wp-block-separator is-style-wide"/>
+					<!-- /wp:separator --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns --></div>
+					<!-- /wp:group -->
+
+					<!-- wp:columns {"align":"wide"} -->
+					<div class="wp-block-columns alignwide"><!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:paragraph -->
+					<p>' . wp_kses_post( __( 'Oh hello. My name’s Angelo, and I operate this blog. I was born in Portland, but I currently live in upstate New York. You may recognize me from publications with names like <a href="#">Eagle Beagle</a> and <a href="#">Mourning Dive</a>. I write for a living.<br><br>I usually use this blog to catalog extensive lists of birds and other things that I find interesting. If you find an error with one of my lists, please keep it to yourself.<br><br>If that’s not your cup of tea, <a href="#">I definitely recommend this tea</a>. It’s my favorite.', 'twentytwentytwo' ) ) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column -->
+					<div class="wp-block-column"></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns -->
+
+					<!-- wp:spacer -->
+					<div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:columns {"align":"wide"} -->
+					<div class="wp-block-columns alignwide"><!-- wp:column {"verticalAlignment":"center"} -->
+					<div class="wp-block-column is-vertically-aligned-center"><!-- wp:separator {"className":"is-style-wide"} -->
+					<hr class="wp-block-separator is-style-wide"/>
+					<!-- /wp:separator --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"verticalAlignment":"center"} -->
+					<div class="wp-block-column is-vertically-aligned-center"><!-- wp:paragraph -->
+					<p>' . esc_html__( 'POSTS', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns -->
+
+					<!-- wp:columns {"align":"wide"} -->
+					<div class="wp-block-columns alignwide"><!-- wp:column -->
+					<div class="wp-block-column"></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:latest-posts /--></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/page-sidebar-blog-posts-right.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-sidebar-blog-posts-right.php
new file mode 100644
index 0000000000..84e3b081c6
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-sidebar-blog-posts-right.php
@@ -0,0 +1,87 @@
+<?php
+/**
+ * Blog posts with right sidebar block pattern
+ */
+return array(
+	'title'      => __( 'Blog posts with right sidebar', 'twentytwentytwo' ),
+	'categories' => array( 'pages' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var(--wp--custom--spacing--small, 1.25rem)","bottom":"var(--wp--custom--spacing--small, 1.25rem)"}}},"layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--small, 1.25rem)"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"bottom":"2rem","top":"0px","right":"0px","left":"0px"}}},"layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group alignwide" style="padding-top:0px;padding-right:0px;padding-bottom:2rem;padding-left:0px"><!-- wp:group {"layout":{"type":"flex"}} -->
+					<div class="wp-block-group"><!-- wp:site-logo {"width":64} /--></div>
+					<!-- /wp:group -->
+
+					<!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"}} -->
+					<!-- wp:page-list /-->
+					<!-- /wp:navigation --></div>
+					<!-- /wp:group -->
+
+					<!-- wp:spacer {"height":64} -->
+					<div style="height:64px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:columns {"align":"wide","style":{"spacing":{"margin":{"top":"0px","bottom":"0px"},"blockGap":"5%"},"elements":{"link":{"color":{"text":"var:preset|color|foreground"}}}},"textColor":"foreground"} -->
+					<div class="wp-block-columns alignwide has-foreground-color has-text-color has-link-color" style="margin-top:0px;margin-bottom:0px"><!-- wp:column {"width":"66.66%","style":{"spacing":{"padding":{"bottom":"6rem"}}}} -->
+					<div class="wp-block-column" style="padding-bottom:6rem;flex-basis:66.66%"><!-- wp:query {"queryId":9,"query":{"perPage":"5","pages":0,"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false},"displayLayout":{"type":"list"},"layout":{"inherit":true}} -->
+					<div class="wp-block-query"><!-- wp:post-template -->
+					<!-- wp:post-title {"isLink":true,"style":{"spacing":{"margin":{"top":"0","bottom":"1rem"}},"typography":{"fontStyle":"normal","fontWeight":"300"},"elements":{"link":{"color":{"text":"var:preset|color|foreground"}}}},"textColor":"foreground","fontSize":"var(--wp--custom--typography--font-size--huge, clamp(2.25rem, 4vw, 2.75rem))"} /-->
+
+					<!-- wp:post-featured-image {"isLink":true} /-->
+
+					<!-- wp:post-excerpt /-->
+
+					<!-- wp:group {"layout":{"type":"flex"}} -->
+					<div class="wp-block-group"><!-- wp:post-date {"format":"F j, Y","style":{"typography":{"fontStyle":"normal","fontWeight":"400"}},"fontSize":"small"} /-->
+
+					<!-- wp:post-terms {"term":"category","fontSize":"small"} /-->
+
+					<!-- wp:post-terms {"term":"post_tag","fontSize":"small"} /--></div>
+					<!-- /wp:group -->
+
+					<!-- wp:spacer {"height":64} -->
+					<div style="height:64px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+					<!-- /wp:post-template -->
+
+					<!-- wp:query-pagination {"paginationArrow":"arrow","align":"wide","layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<!-- wp:query-pagination-previous {"fontSize":"small"} /-->
+
+					<!-- wp:query-pagination-numbers /-->
+
+					<!-- wp:query-pagination-next {"fontSize":"small"} /-->
+					<!-- /wp:query-pagination --></div>
+					<!-- /wp:query --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"width":"33.33%"} -->
+					<div class="wp-block-column" style="flex-basis:33.33%"><!-- wp:image {"sizeSlug":"large","linkDestination":"none"} -->
+					<figure class="wp-block-image size-large"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/flight-path-on-salmon.jpg" alt="' . esc_attr__( 'Illustration of a flying bird.', 'twentytwentytwo' ) . '"/></figure>
+					<!-- /wp:image -->
+
+					<!-- wp:spacer {"height":4} -->
+					<div style="height:4px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:site-title {"isLink":false,"style":{"typography":{"fontStyle":"normal","fontWeight":"300","lineHeight":"1.2"}},"fontSize":"large","fontFamily":"source-serif-pro"} /-->
+
+					<!-- wp:site-tagline /-->
+
+					<!-- wp:spacer {"height":16} -->
+					<div style="height:16px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:heading {"level":4,"fontSize":"large"} -->
+					<h4 class="has-large-font-size"><em>' . esc_html__( 'Categories', 'twentytwentytwo' ) . '</em></h4>
+					<!-- /wp:heading -->
+
+					<!-- wp:tag-cloud {"taxonomy":"category","showTagCounts":true} /-->
+
+					<!-- wp:heading {"level":4,"fontSize":"large"} -->
+					<h4 class="has-large-font-size"><em>' . esc_html__( 'Tags', 'twentytwentytwo' ) . '</em></h4>
+					<!-- /wp:heading -->
+
+					<!-- wp:tag-cloud {"showTagCounts":true} /--></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/page-sidebar-blog-posts.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-sidebar-blog-posts.php
new file mode 100644
index 0000000000..c40b207360
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-sidebar-blog-posts.php
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Blog posts with left sidebar block pattern
+ */
+return array(
+	'title'      => __( 'Blog posts with left sidebar', 'twentytwentytwo' ),
+	'categories' => array( 'pages' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var(--wp--custom--spacing--small, 1.25rem)","bottom":"var(--wp--custom--spacing--small, 1.25rem)"}}},"layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--small, 1.25rem)"><!-- wp:columns {"align":"wide","style":{"spacing":{"margin":{"top":"0px","bottom":"0px"},"blockGap":"5%"},"elements":{"link":{"color":{"text":"var:preset|color|primary"}}}},"textColor":"primary"} -->
+					<div class="wp-block-columns alignwide has-primary-color has-text-color has-link-color" style="margin-top:0px;margin-bottom:0px"><!-- wp:column {"width":"33.33%"} -->
+					<div class="wp-block-column" style="flex-basis:33.33%"><!-- wp:cover {"overlayColor":"secondary","minHeight":400,"isDark":false} -->
+					<div class="wp-block-cover is-light" style="min-height:400px"><span aria-hidden="true" class="has-secondary-background-color has-background-dim-100 wp-block-cover__gradient-background has-background-dim"></span><div class="wp-block-cover__inner-container"><!-- wp:site-logo {"align":"center","width":60} /--></div></div>
+					<!-- /wp:cover -->
+
+					<!-- wp:spacer {"height":40} -->
+					<div style="height:40px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:site-tagline {"fontSize":"small"} /-->
+
+					<!-- wp:spacer {"height":32} -->
+					<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:separator {"color":"foreground","className":"is-style-wide"} -->
+					<hr class="wp-block-separator has-text-color has-background has-foreground-background-color has-foreground-color is-style-wide"/>
+					<!-- /wp:separator -->
+
+					<!-- wp:spacer {"height":32} -->
+					<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:navigation {"orientation":"vertical"} -->
+					<!-- wp:page-list /-->
+					<!-- /wp:navigation -->
+
+					<!-- wp:spacer {"height":32} -->
+					<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:separator {"color":"foreground","className":"is-style-wide"} -->
+					<hr class="wp-block-separator has-text-color has-background has-foreground-background-color has-foreground-color is-style-wide"/>
+					<!-- /wp:separator --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"width":"66.66%"} -->
+					<div class="wp-block-column" style="flex-basis:66.66%"><!-- wp:query {"query":{"perPage":"5","pages":0,"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false},"layout":{"inherit":true}} -->
+					<div class="wp-block-query"><!-- wp:post-template -->
+					<!-- wp:post-title {"isLink":true,"style":{"spacing":{"margin":{"top":"0","bottom":"1rem"}},"typography":{"fontStyle":"normal","fontWeight":"300"},"elements":{"link":{"color":{"text":"var:preset|color|primary"}}}},"textColor":"primary","fontSize":"var(--wp--custom--typography--font-size--huge, clamp(2.25rem, 4vw, 2.75rem))"} /-->
+
+					<!-- wp:post-featured-image {"isLink":true} /-->
+
+					<!-- wp:post-excerpt /-->
+
+					<!-- wp:group {"layout":{"type":"flex"}} -->
+					<div class="wp-block-group"><!-- wp:post-date {"format":"F j, Y","style":{"typography":{"fontStyle":"normal","fontWeight":"400"}},"fontSize":"small"} /-->
+
+					<!-- wp:post-terms {"term":"category","fontSize":"small"} /-->
+
+					<!-- wp:post-terms {"term":"post_tag","fontSize":"small"} /--></div>
+					<!-- /wp:group -->
+
+					<!-- wp:spacer {"height":128} -->
+					<div style="height:128px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+					<!-- /wp:post-template -->
+
+					<!-- wp:query-pagination {"paginationArrow":"arrow","align":"wide","layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<!-- wp:query-pagination-previous {"fontSize":"small"} /-->
+
+					<!-- wp:query-pagination-numbers /-->
+
+					<!-- wp:query-pagination-next {"fontSize":"small"} /-->
+					<!-- /wp:query-pagination --></div>
+					<!-- /wp:query --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/page-sidebar-grid-posts.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-sidebar-grid-posts.php
new file mode 100644
index 0000000000..3a4f037eed
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-sidebar-grid-posts.php
@@ -0,0 +1,77 @@
+<?php
+/**
+ * Grid of posts with left sidebar block pattern
+ */
+return array(
+	'title'      => __( 'Grid of posts with left sidebar', 'twentytwentytwo' ),
+	'categories' => array( 'pages' ),
+	'content'    => '<!-- wp:group {"align":"full","style":{"spacing":{"padding":{"top":"var(--wp--custom--spacing--small, 1.25rem)","bottom":"var(--wp--custom--spacing--small, 1.25rem)"}}},"layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--small, 1.25rem)"><!-- wp:columns {"align":"wide","style":{"spacing":{"margin":{"top":"0px","bottom":"0px"}}}} -->
+					<div class="wp-block-columns alignwide" style="margin-top:0px;margin-bottom:0px"><!-- wp:column {"width":"30%"} -->
+					<div class="wp-block-column" style="flex-basis:30%"><!-- wp:site-title {"isLink":false,"style":{"spacing":{"margin":{"top":"0px","bottom":"1rem"}},"typography":{"fontStyle":"italic","fontWeight":"300","lineHeight":"1.1"}},"fontSize":"var(--wp--custom--typography--font-size--huge, clamp(2.25rem, 4vw, 2.75rem))","fontFamily":"source-serif-pro"} /-->
+
+					<!-- wp:site-tagline {"fontSize":"small"} /-->
+
+					<!-- wp:spacer {"height":32} -->
+					<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:separator {"color":"foreground","className":"is-style-wide"} -->
+					<hr class="wp-block-separator has-text-color has-background has-foreground-background-color has-foreground-color is-style-wide"/>
+					<!-- /wp:separator -->
+
+					<!-- wp:spacer {"height":16} -->
+					<div style="height:16px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:navigation {"orientation":"vertical"} -->
+					<!-- wp:page-list /-->
+					<!-- /wp:navigation -->
+
+					<!-- wp:spacer {"height":16} -->
+					<div style="height:16px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:separator {"color":"foreground","className":"is-style-wide"} -->
+					<hr class="wp-block-separator has-text-color has-background has-foreground-background-color has-foreground-color is-style-wide"/>
+					<!-- /wp:separator -->
+
+					<!-- wp:spacer {"height":16} -->
+					<div style="height:16px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:spacer {"height":16} -->
+					<div style="height:16px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:site-logo {"width":60} /--></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"width":"70%"} -->
+					<div class="wp-block-column" style="flex-basis:70%"><!-- wp:query {"query":{"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","sticky":"","inherit":false,"perPage":12},"displayLayout":{"type":"flex","columns":3},"layout":{"inherit":true}} -->
+					<div class="wp-block-query"><!-- wp:post-template -->
+					<!-- wp:post-featured-image {"isLink":true,"width":"100%","height":"200px"} /-->
+
+					<!-- wp:group {"layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<div class="wp-block-group"><!-- wp:post-title {"isLink":true,"style":{"typography":{"fontStyle":"normal","fontWeight":"400"}},"fontSize":"small","fontFamily":"system-font"} /-->
+
+					<!-- wp:post-date {"format":"m.d.y","style":{"typography":{"fontStyle":"italic","fontWeight":"400"}},"fontSize":"small"} /--></div>
+					<!-- /wp:group -->
+					<!-- /wp:post-template -->
+
+					<!-- wp:separator {"className":"alignwide is-style-wide"} -->
+					<hr class="wp-block-separator alignwide is-style-wide"/>
+					<!-- /wp:separator -->
+
+					<!-- wp:query-pagination {"paginationArrow":"arrow","align":"wide","layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<!-- wp:query-pagination-previous {"fontSize":"small"} /-->
+
+					<!-- wp:query-pagination-numbers /-->
+
+					<!-- wp:query-pagination-next {"fontSize":"small"} /-->
+					<!-- /wp:query-pagination --></div>
+					<!-- /wp:query --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/page-sidebar-poster.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-sidebar-poster.php
new file mode 100644
index 0000000000..62df8059ec
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/page-sidebar-poster.php
@@ -0,0 +1,65 @@
+<?php
+/**
+ * Poster with right sidebar block pattern
+ */
+return array(
+	'title'      => __( 'Poster with right sidebar', 'twentytwentytwo' ),
+	'categories' => array( 'pages' ),
+	'content'    => '<!-- wp:group {"align":"full","layout":{"inherit":true}} -->
+					<div class="wp-block-group alignfull"><!-- wp:columns {"align":"wide","style":{"spacing":{"blockGap":"5%"}}} -->
+					<div class="wp-block-columns alignwide"><!-- wp:column {"width":"70%"} -->
+					<div class="wp-block-column" style="flex-basis:70%">
+
+					<!-- wp:heading {"level":1,"align":"wide","style":{"typography":{"fontSize":"clamp(3rem, 6vw, 4.5rem)"},"spacing":{"margin":{"bottom":"0px"}}}} -->
+				<h1 class="alignwide" style="font-size:clamp(3rem, 6vw, 4.5rem);margin-bottom:0px">' . wp_kses_post( __( '<em>Flutter</em>, a collection of bird-related ephemera', 'twentytwentytwo' ) ) . '</h1>
+					<!-- /wp:heading --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"width":""} -->
+					<div class="wp-block-column"></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns -->
+
+					<!-- wp:columns {"align":"wide","style":{"spacing":{"blockGap":"5%"}}} -->
+					<div class="wp-block-columns alignwide"><!-- wp:column {"width":"70%","style":{"spacing":{"padding":{"bottom":"32px"}}}} -->
+					<div class="wp-block-column" style="padding-bottom:32px;flex-basis:70%"><!-- wp:image {"sizeSlug":"full","linkDestination":"none"} -->
+					<figure class="wp-block-image size-full"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/bird-on-salmon.jpg" alt="' . esc_attr__( 'Image of a bird on a branch', 'twentytwentytwo' ) . '"/></figure>
+					<!-- /wp:image --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"width":""} -->
+					<div class="wp-block-column"><!-- wp:image {"width":100,"height":47,"sizeSlug":"full","linkDestination":"none"} -->
+					<figure class="wp-block-image size-full is-resized"><img src="' . esc_url( get_template_directory_uri() ) . '/assets/images/icon-binoculars.png" alt="' . esc_attr__( 'An icon representing binoculars.', 'twentytwentytwo' ) . '" width="100" height="47"/></figure>
+					<!-- /wp:image -->
+
+					<!-- wp:spacer {"height":16} -->
+					<div style="height:16px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:heading {"level":3,"fontSize":"large"} -->
+					<h3 class="has-large-font-size"><em>' . esc_html__( 'Date', 'twentytwentytwo' ) . '</em></h3>
+					<!-- /wp:heading -->
+
+					<!-- wp:paragraph -->
+					<p>' . esc_html__( 'February, 12 2021', 'twentytwentytwo' ) . '</p>
+					<!-- /wp:paragraph -->
+
+					<!-- wp:spacer {"height":16} -->
+					<div style="height:16px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:heading {"level":3,"fontSize":"large"} -->
+					<h3 class="has-large-font-size"><em>' . esc_html__( 'Location', 'twentytwentytwo' ) . '</em></h3>
+					<!-- /wp:heading -->
+
+					<!-- wp:paragraph -->
+					<p>' . wp_kses_post( __( 'The Grand Theater<br>154 Eastern Avenue<br>Maryland NY, 12345', 'twentytwentytwo' ) ) . '</p>
+					<!-- /wp:paragraph -->
+
+					<!-- wp:spacer {"height":16} -->
+					<div style="height:16px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/query-default.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/query-default.php
new file mode 100644
index 0000000000..7cebaccf75
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/query-default.php
@@ -0,0 +1,50 @@
+<?php
+/**
+ * Default posts block pattern
+ */
+return array(
+	'title'      => __( 'Default posts', 'twentytwentytwo' ),
+	'categories' => array( 'query' ),
+	'blockTypes' => array( 'core/query' ),
+	'content'    => '<!-- wp:query {"query":{"perPage":10,"pages":0,"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":""},"align":"wide","layout":{"inherit":true}} -->
+					<div class="wp-block-query alignwide"><!-- wp:post-template {"align":"wide"} -->
+					<!-- wp:group {"layout":{"inherit":true}} -->
+					<div class="wp-block-group"><!-- wp:post-title {"isLink":true,"align":"wide","fontSize":"var(--wp--custom--typography--font-size--huge, clamp(2.25rem, 4vw, 2.75rem))"} /-->
+
+					<!-- wp:post-featured-image {"isLink":true,"align":"wide","style":{"spacing":{"margin":{"top":"calc(1.75 * var(--wp--style--block-gap))"}}}} /-->
+
+					<!-- wp:columns {"align":"wide"} -->
+					<div class="wp-block-columns alignwide"><!-- wp:column {"width":"650px"} -->
+					<div class="wp-block-column" style="flex-basis:650px"><!-- wp:post-excerpt /-->
+
+					<!-- wp:post-date {"isLink":true,"format":"F j, Y","style":{"typography":{"fontStyle":"italic","fontWeight":"400"}},"fontSize":"small"} /--></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"width":""} -->
+					<div class="wp-block-column"></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns -->
+
+					<!-- wp:spacer {"height":16} -->
+					<div style="height:16px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:separator {"align":"wide","className":"is-style-wide"} -->
+					<hr class="wp-block-separator alignwide is-style-wide"/>
+					<!-- /wp:separator -->
+
+					<!-- wp:spacer {"height":16} -->
+					<div style="height:16px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer --></div>
+					<!-- /wp:group -->
+					<!-- /wp:post-template -->
+
+					<!-- wp:query-pagination {"paginationArrow":"arrow","align":"wide","layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<!-- wp:query-pagination-previous {"fontSize":"small"} /-->
+
+					<!-- wp:query-pagination-numbers /-->
+
+					<!-- wp:query-pagination-next {"fontSize":"small"} /-->
+					<!-- /wp:query-pagination --></div>
+					<!-- /wp:query -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/query-grid.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/query-grid.php
new file mode 100644
index 0000000000..f695eba354
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/query-grid.php
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Grid of posts block pattern
+ */
+return array(
+	'title'      => __( 'Grid of posts', 'twentytwentytwo' ),
+	'categories' => array( 'query' ),
+	'blockTypes' => array( 'core/query' ),
+	'content'    => '<!-- wp:query {"query":{"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","sticky":"","perPage":12},"displayLayout":{"type":"flex","columns":3},"align":"wide","layout":{"inherit":true}} -->
+					<div class="wp-block-query alignwide"><!-- wp:post-template {"align":"wide"} -->
+					<!-- wp:post-featured-image {"isLink":true,"width":"100%","height":"318px"} /-->
+
+					<!-- wp:post-title {"isLink":true,"fontSize":"x-large"} /-->
+
+					<!-- wp:post-excerpt /-->
+
+					<!-- wp:post-date {"format":"F j, Y","isLink":true,"fontSize":"small"} /-->
+					<!-- /wp:post-template -->
+
+					<!-- wp:separator {"align":"wide","className":"is-style-wide"} -->
+					<hr class="wp-block-separator alignwide is-style-wide"/>
+					<!-- /wp:separator -->
+
+					<!-- wp:query-pagination {"paginationArrow":"arrow","align":"wide","layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<!-- wp:query-pagination-previous {"fontSize":"small"} /-->
+
+					<!-- wp:query-pagination-numbers /-->
+
+					<!-- wp:query-pagination-next {"fontSize":"small"} /-->
+					<!-- /wp:query-pagination --></div>
+					<!-- /wp:query -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/query-image-grid.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/query-image-grid.php
new file mode 100644
index 0000000000..e5672e3c1c
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/query-image-grid.php
@@ -0,0 +1,36 @@
+<?php
+/**
+ * Grid of image posts block pattern
+ */
+return array(
+	'title'      => __( 'Grid of image posts', 'twentytwentytwo' ),
+	'categories' => array( 'query' ),
+	'blockTypes' => array( 'core/query' ),
+	'content'    => '<!-- wp:query {"query":{"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","sticky":"","inherit":false,"perPage":12},"displayLayout":{"type":"flex","columns":3},"layout":{"inherit":true}} -->
+					<div class="wp-block-query"><!-- wp:post-template -->
+					<!-- wp:post-featured-image {"isLink":true,"width":"100%","height":"200px"} /-->
+
+					<!-- wp:columns {"isStackedOnMobile":false,"style":{"spacing":{"blockGap":"0.5rem"}}} -->
+					<div class="wp-block-columns is-not-stacked-on-mobile"><!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:post-title {"isLink":true,"style":{"typography":{"fontStyle":"normal","fontWeight":"400"},"spacing":{"margin":{"top":"0.2em"}}},"fontSize":"small","fontFamily":"system-font"} /--></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"width":"4em"} -->
+					<div class="wp-block-column" style="flex-basis:4em"><!-- wp:post-date {"textAlign":"right","format":"m.d.y","style":{"typography":{"fontStyle":"italic","fontWeight":"400"}},"fontSize":"small"} /--></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns -->
+					<!-- /wp:post-template -->
+
+					<!-- wp:separator {"className":"is-style-wide"} -->
+					<hr class="wp-block-separator alignwide is-style-wide"/>
+					<!-- /wp:separator -->
+
+					<!-- wp:query-pagination {"paginationArrow":"arrow","align":"wide","layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<!-- wp:query-pagination-previous {"fontSize":"small"} /-->
+
+					<!-- wp:query-pagination-numbers /-->
+
+					<!-- wp:query-pagination-next {"fontSize":"small"} /-->
+					<!-- /wp:query-pagination --></div>
+					<!-- /wp:query -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/query-irregular-grid.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/query-irregular-grid.php
new file mode 100644
index 0000000000..c5da08ab74
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/query-irregular-grid.php
@@ -0,0 +1,170 @@
+<?php
+/**
+ * Irregular grid of posts block pattern
+ */
+return array(
+	'title'      => __( 'Irregular grid of posts', 'twentytwentytwo' ),
+	'categories' => array( 'query' ),
+	'blockTypes' => array( 'core/query' ),
+	'content'    => '<!-- wp:group {"align":"wide"} -->
+					<div class="wp-block-group alignwide"><!-- wp:columns {"align":"wide"} -->
+					<div class="wp-block-columns alignwide"><!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:query {"query":{"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","sticky":"","perPage":"1"},"displayLayout":{"type":"list","columns":3},"align":"wide","layout":{"inherit":true}} -->
+					<div class="wp-block-query alignwide"><!-- wp:post-template {"align":"wide"} -->
+					<!-- wp:post-featured-image {"isLink":true,"width":"100%","height":"318px"} /-->
+
+					<!-- wp:post-title {"isLink":true,"fontSize":"x-large"} /-->
+
+					<!-- wp:post-excerpt /-->
+
+					<!-- wp:post-date {"format":"F j, Y","isLink":true,"fontSize":"small"} /-->
+					<!-- /wp:post-template --></div>
+					<!-- /wp:query --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:query {"query":{"offset":"1","postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","sticky":"","perPage":"1"},"displayLayout":{"type":"list","columns":3},"align":"wide","layout":{"inherit":true}} -->
+					<div class="wp-block-query alignwide"><!-- wp:post-template {"align":"wide"} -->
+					<!-- wp:spacer {"height":64} -->
+					<div style="height:64px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:post-featured-image {"isLink":true,"width":"100%","height":"318px"} /-->
+
+					<!-- wp:post-title {"isLink":true,"fontSize":"x-large"} /-->
+
+					<!-- wp:post-excerpt /-->
+
+					<!-- wp:post-date {"format":"F j, Y","isLink":true,"fontSize":"small"} /-->
+					<!-- /wp:post-template --></div>
+					<!-- /wp:query --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:query {"query":{"offset":"2","postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","sticky":"","perPage":"1"},"displayLayout":{"type":"list","columns":3},"align":"wide","layout":{"inherit":true}} -->
+					<div class="wp-block-query alignwide"><!-- wp:post-template {"align":"wide"} -->
+					<!-- wp:spacer {"height":128} -->
+					<div style="height:128px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:post-featured-image {"isLink":true,"width":"100%","height":"318px"} /-->
+
+					<!-- wp:post-title {"isLink":true,"fontSize":"x-large"} /-->
+
+					<!-- wp:post-excerpt /-->
+
+					<!-- wp:post-date {"format":"F j, Y","isLink":true,"fontSize":"small"} /-->
+					<!-- /wp:post-template --></div>
+					<!-- /wp:query --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns -->
+
+					<!-- wp:columns {"align":"wide"} -->
+					<div class="wp-block-columns alignwide"><!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:query {"query":{"offset":"3","postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","sticky":"","perPage":"1"},"displayLayout":{"type":"list","columns":3},"align":"wide","layout":{"inherit":true}} -->
+					<div class="wp-block-query alignwide"><!-- wp:post-template {"align":"wide"} -->
+					<!-- wp:post-featured-image {"isLink":true,"width":"100%","height":"318px"} /-->
+
+					<!-- wp:post-title {"isLink":true,"fontSize":"x-large"} /-->
+
+					<!-- wp:post-excerpt /-->
+
+					<!-- wp:post-date {"format":"F j, Y","isLink":true,"fontSize":"small"} /-->
+					<!-- /wp:post-template --></div>
+					<!-- /wp:query --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:query {"query":{"offset":"4","postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","sticky":"","perPage":"1"},"displayLayout":{"type":"list","columns":3},"align":"wide","layout":{"inherit":true}} -->
+					<div class="wp-block-query alignwide"><!-- wp:post-template {"align":"wide"} -->
+					<!-- wp:spacer {"height":96} -->
+					<div style="height:96px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:post-featured-image {"isLink":true,"width":"100%","height":"318px"} /-->
+
+					<!-- wp:post-title {"isLink":true,"fontSize":"x-large"} /-->
+
+					<!-- wp:post-excerpt /-->
+
+					<!-- wp:post-date {"format":"F j, Y","isLink":true,"fontSize":"small"} /-->
+					<!-- /wp:post-template --></div>
+					<!-- /wp:query --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:query {"query":{"offset":"5","postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","sticky":"","perPage":"1"},"displayLayout":{"type":"list","columns":3},"align":"wide","layout":{"inherit":true}} -->
+					<div class="wp-block-query alignwide"><!-- wp:post-template {"align":"wide"} -->
+					<!-- wp:spacer {"height":160} -->
+					<div style="height:160px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:post-featured-image {"isLink":true,"width":"100%","height":"318px"} /-->
+
+					<!-- wp:post-title {"isLink":true,"fontSize":"x-large"} /-->
+
+					<!-- wp:post-excerpt /-->
+
+					<!-- wp:post-date {"format":"F j, Y","isLink":true,"fontSize":"small"} /-->
+					<!-- /wp:post-template --></div>
+					<!-- /wp:query --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns -->
+
+					<!-- wp:columns {"align":"wide"} -->
+					<div class="wp-block-columns alignwide"><!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:query {"query":{"offset":"6","postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","sticky":"","perPage":"1"},"displayLayout":{"type":"list","columns":3},"align":"wide","layout":{"inherit":true}} -->
+					<div class="wp-block-query alignwide"><!-- wp:post-template {"align":"wide"} -->
+					<!-- wp:spacer {"height":32} -->
+					<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:post-featured-image {"isLink":true,"width":"100%","height":"318px"} /-->
+
+					<!-- wp:post-title {"isLink":true,"fontSize":"x-large"} /-->
+
+					<!-- wp:post-excerpt /-->
+
+					<!-- wp:post-date {"format":"F j, Y","isLink":true,"fontSize":"small"} /-->
+					<!-- /wp:post-template --></div>
+					<!-- /wp:query --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:query {"query":{"offset":"7","postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","sticky":"","perPage":"1"},"displayLayout":{"type":"list","columns":3},"align":"wide","layout":{"inherit":true}} -->
+					<div class="wp-block-query alignwide"><!-- wp:post-template {"align":"wide"} -->
+					<!-- wp:spacer {"height":160} -->
+					<div style="height:160px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:post-featured-image {"isLink":true,"width":"100%","height":"318px"} /-->
+
+					<!-- wp:post-title {"isLink":true,"fontSize":"x-large"} /-->
+
+					<!-- wp:post-excerpt /-->
+
+					<!-- wp:post-date {"format":"F j, Y","isLink":true,"fontSize":"small"} /-->
+					<!-- /wp:post-template --></div>
+					<!-- /wp:query --></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column -->
+					<div class="wp-block-column"><!-- wp:query {"query":{"offset":"8","postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","sticky":"","perPage":"1"},"displayLayout":{"type":"list","columns":3},"align":"wide","layout":{"inherit":true}} -->
+					<div class="wp-block-query alignwide"><!-- wp:post-template {"align":"wide"} -->
+					<!-- wp:spacer {"height":96} -->
+					<div style="height:96px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+
+					<!-- wp:post-featured-image {"isLink":true,"width":"100%","height":"318px"} /-->
+
+					<!-- wp:post-title {"isLink":true,"fontSize":"x-large"} /-->
+
+					<!-- wp:post-excerpt /-->
+
+					<!-- wp:post-date {"format":"F j, Y","isLink":true,"fontSize":"small"} /-->
+					<!-- /wp:post-template --></div>
+					<!-- /wp:query --></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns --></div>
+					<!-- /wp:group -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/query-large-titles.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/query-large-titles.php
new file mode 100644
index 0000000000..6ff8afadfe
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/query-large-titles.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Large post titles block pattern
+ */
+return array(
+	'title'      => __( 'Large post titles', 'twentytwentytwo' ),
+	'categories' => array( 'query' ),
+	'blockTypes' => array( 'core/query' ),
+	'content'    => '<!-- wp:query {"query":{"pages":0,"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false,"perPage":8},"align":"wide"} -->
+					<div class="wp-block-query alignwide"><!-- wp:post-template -->
+					<!-- wp:columns -->
+					<div class="wp-block-columns"><!-- wp:column {"verticalAlignment":"top","width":"4em"} -->
+					<div class="wp-block-column is-vertically-aligned-top" style="flex-basis:4em"><!-- wp:post-date {"format":"M j","fontSize":"small"} /--></div>
+					<!-- /wp:column -->
+
+					<!-- wp:column {"verticalAlignment":"center","width":""} -->
+					<div class="wp-block-column is-vertically-aligned-center"><!-- wp:post-title {"isLink":true,"style":{"spacing":{"margin":{"top":"0px","bottom":"0px"}},"typography":{"fontSize":"clamp(2.75rem, 6vw, 3.25rem)"}}} /--></div>
+					<!-- /wp:column --></div>
+					<!-- /wp:columns -->
+
+					<!-- wp:separator {"className":"is-style-wide"} -->
+					<hr class="wp-block-separator is-style-wide"/>
+					<!-- /wp:separator -->
+					<!-- /wp:post-template --></div>
+					<!-- /wp:query -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/query-simple-blog.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/query-simple-blog.php
new file mode 100644
index 0000000000..4b089846dd
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/query-simple-blog.php
@@ -0,0 +1,38 @@
+<?php
+/**
+ * Simple blog posts block pattern
+ */
+return array(
+	'title'      => __( 'Simple blog posts', 'twentytwentytwo' ),
+	'categories' => array( 'query' ),
+	'blockTypes' => array( 'core/query' ),
+	'content'    => '<!-- wp:query {"query":{"perPage":3,"pages":0,"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":true,"perPage":10},"layout":{"inherit":true}} -->
+					<div class="wp-block-query"><!-- wp:post-template -->
+					<!-- wp:post-title {"isLink":true,"style":{"spacing":{"margin":{"top":"1rem","bottom":"1rem"}},"typography":{"fontStyle":"normal","fontWeight":"300"},"elements":{"link":{"color":{"text":"var:preset|color|primary"}}}},"textColor":"primary","fontSize":"var(--wp--custom--typography--font-size--huge, clamp(2.25rem, 4vw, 2.75rem))"} /-->
+
+					<!-- wp:post-featured-image {"isLink":true} /-->
+
+					<!-- wp:post-excerpt /-->
+
+					<!-- wp:group {"layout":{"type":"flex"}} -->
+					<div class="wp-block-group"><!-- wp:post-date {"format":"F j, Y","style":{"typography":{"fontStyle":"normal","fontWeight":"400"}},"fontSize":"small"} /-->
+
+					<!-- wp:post-terms {"term":"category","fontSize":"small"} /-->
+
+					<!-- wp:post-terms {"term":"post_tag","fontSize":"small"} /--></div>
+					<!-- /wp:group -->
+
+					<!-- wp:spacer {"height":128} -->
+					<div style="height:128px" aria-hidden="true" class="wp-block-spacer"></div>
+					<!-- /wp:spacer -->
+					<!-- /wp:post-template -->
+
+					<!-- wp:query-pagination {"paginationArrow":"arrow","align":"wide","layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<!-- wp:query-pagination-previous {"fontSize":"small"} /-->
+
+					<!-- wp:query-pagination-numbers /-->
+
+					<!-- wp:query-pagination-next {"fontSize":"small"} /-->
+					<!-- /wp:query-pagination --></div>
+					<!-- /wp:query -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/inc/patterns/query-text-grid.php b/src/wp-content/themes/twentytwentytwo/inc/patterns/query-text-grid.php
new file mode 100644
index 0000000000..a8f84d3cf2
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/inc/patterns/query-text-grid.php
@@ -0,0 +1,31 @@
+<?php
+/**
+ * Text-based grid of posts block pattern
+ */
+return array(
+	'title'      => __( 'Text-based grid of posts', 'twentytwentytwo' ),
+	'categories' => array( 'query' ),
+	'blockTypes' => array( 'core/query' ),
+	'content'    => '<!-- wp:query {"query":{"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","sticky":"","perPage":12},"displayLayout":{"type":"flex","columns":3},"align":"wide","layout":{"inherit":true}} -->
+					<div class="wp-block-query alignwide"><!-- wp:post-template {"align":"wide"} -->
+
+					<!-- wp:post-title {"isLink":true,"fontSize":"x-large"} /-->
+
+					<!-- wp:post-excerpt /-->
+
+					<!-- wp:post-date {"format":"F j, Y","isLink":true,"fontSize":"small"} /-->
+					<!-- /wp:post-template -->
+
+					<!-- wp:separator {"align":"wide","className":"is-style-wide"} -->
+					<hr class="wp-block-separator alignwide is-style-wide"/>
+					<!-- /wp:separator -->
+
+					<!-- wp:query-pagination {"paginationArrow":"arrow","align":"wide","layout":{"type":"flex","justifyContent":"space-between"}} -->
+					<!-- wp:query-pagination-previous {"fontSize":"small"} /-->
+
+					<!-- wp:query-pagination-numbers /-->
+
+					<!-- wp:query-pagination-next {"fontSize":"small"} /-->
+					<!-- /wp:query-pagination --></div>
+					<!-- /wp:query -->',
+);
diff --git a/src/wp-content/themes/twentytwentytwo/index.php b/src/wp-content/themes/twentytwentytwo/index.php
new file mode 100644
index 0000000000..27dc7057dc
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/index.php
@@ -0,0 +1,5 @@
+<?php
+// There is nothing output here because block themes do not use php templates.
+// There is a core ticket discussing removing this requirement for block themes:
+// https://core.trac.wordpress.org/ticket/54272.
+
diff --git a/src/wp-content/themes/twentytwentytwo/parts/footer.html b/src/wp-content/themes/twentytwentytwo/parts/footer.html
new file mode 100644
index 0000000000..e0430f5187
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/parts/footer.html
@@ -0,0 +1,5 @@
+<!-- wp:group {"style":{"spacing":{"padding":{"top":"var(--wp--custom--spacing--large, 8rem)"}}},"layout":{"inherit":true}} -->
+<div class="wp-block-group" style="padding-top:var(--wp--custom--spacing--large, 8rem)">
+<!-- wp:pattern {"slug":"twentytwentytwo/footer-default"} /-->
+</div>
+<!-- /wp:group -->
diff --git a/src/wp-content/themes/twentytwentytwo/parts/header-large-dark.html b/src/wp-content/themes/twentytwentytwo/parts/header-large-dark.html
new file mode 100644
index 0000000000..a63b2d660f
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/parts/header-large-dark.html
@@ -0,0 +1,7 @@
+<!-- wp:group {"align":"full","style":{"elements":{"link":{"color":{"text":"var:preset|color|background"}}},"spacing":{"padding":{"top":"0px","bottom":"var(--wp--custom--spacing--large, 8rem)"}}},"backgroundColor":"foreground","textColor":"background","layout":{"inherit":true}} -->
+<div class="wp-block-group alignfull has-background-color has-foreground-background-color has-text-color has-background has-link-color" style="padding-top:0px;padding-bottom:var(--wp--custom--spacing--large, 8rem)"><!-- wp:template-part {"slug":"header","tagName":"header","align":"wide"} /-->
+
+<!-- wp:pattern {"slug":"twentytwentytwo/hidden-heading-and-bird"} /--></div>
+<!-- /wp:group --><!-- wp:spacer {"height":66} -->
+<div style="height:66px" aria-hidden="true" class="wp-block-spacer"></div>
+<!-- /wp:spacer -->
diff --git a/src/wp-content/themes/twentytwentytwo/parts/header-small-dark.html b/src/wp-content/themes/twentytwentytwo/parts/header-small-dark.html
new file mode 100644
index 0000000000..58708579f5
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/parts/header-small-dark.html
@@ -0,0 +1,7 @@
+<!-- wp:group {"align":"full","style":{"elements":{"link":{"color":{"text":"var:preset|color|background"}}},"spacing":{"padding":{"top":"0px","bottom":"0px"}}},"backgroundColor":"foreground","textColor":"background","layout":{"inherit":true}} -->
+<div class="wp-block-group alignfull has-background-color has-foreground-background-color has-text-color has-background has-link-color" style="padding-top:0px;padding-bottom:0px"><!-- wp:template-part {"slug":"header","tagName":"header","align":"wide"} /-->
+
+<!-- wp:pattern {"slug":"twentytwentytwo/hidden-bird"} /--></div>
+<!-- /wp:group --><!-- wp:spacer {"height":66} -->
+<div style="height:66px" aria-hidden="true" class="wp-block-spacer"></div>
+<!-- /wp:spacer -->
diff --git a/src/wp-content/themes/twentytwentytwo/parts/header.html b/src/wp-content/themes/twentytwentytwo/parts/header.html
new file mode 100644
index 0000000000..31edd6d501
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/parts/header.html
@@ -0,0 +1,13 @@
+<!-- wp:group {"layout":{"inherit":true}} -->
+<div class="wp-block-group"><!-- wp:group {"align":"wide","style":{"spacing":{"padding":{"bottom":"var(--wp--custom--spacing--large, 8rem)","top":"var(--wp--custom--spacing--small, 1.25rem)"}}},"layout":{"type":"flex","justifyContent":"space-between"}} -->
+<div class="wp-block-group alignwide" style="padding-top:var(--wp--custom--spacing--small, 1.25rem);padding-bottom:var(--wp--custom--spacing--large, 8rem)"><!-- wp:group {"layout":{"type":"flex"}} -->
+<div class="wp-block-group"><!-- wp:site-logo {"width":64} /-->
+
+<!-- wp:site-title {"style":{"typography":{"fontStyle":"italic","fontWeight":"400"}}} /--></div>
+<!-- /wp:group -->
+
+<!-- wp:navigation {"layout":{"type":"flex","setCascadingProperties":true,"justifyContent":"right"}} -->
+<!-- wp:page-list {"isNavigationChild":true,"showSubmenuIcon":true,"openSubmenusOnClick":false} /-->
+<!-- /wp:navigation --></div>
+<!-- /wp:group --></div>
+<!-- /wp:group -->
\ No newline at end of file
diff --git a/src/wp-content/themes/twentytwentytwo/readme.txt b/src/wp-content/themes/twentytwentytwo/readme.txt
new file mode 100644
index 0000000000..d99cb3a1da
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/readme.txt
@@ -0,0 +1,69 @@
+=== Twenty Twenty-Two ===
+Contributors: wordpressdotorg
+Requires at least: 5.9
+Tested up to: 5.9
+Requires PHP: 5.6
+Stable tag: 1.0
+License: GPLv2 or later
+License URI: http://www.gnu.org/licenses/gpl-2.0.html
+
+== Description ==
+
+Built on a solidly designed foundation, Twenty Twenty-Two embraces the idea that everyone deserves a truly unique website. The theme’s subtle styles are inspired by the diversity and versatility of birds: its typography is lightweight yet strong, its color palette is drawn from nature, and its layout elements sit gently on the page.
+
+The true richness of Twenty Twenty-Two lies in its opportunity for customization. The theme is built to take advantage of the Full Site Editing features introduced in WordPress 5.9, which means that colors, typography, and the layout of every single page on your site can be customized to suit your vision. It also includes dozens of block patterns, opening the door to a wide range of professionally designed layouts in just a few clicks.
+
+Whether you’re building a single-page website, a blog, a business website, or a portfolio, Twenty Twenty-Two will help you create a site that is uniquely yours.
+
+== Changelog ==
+
+= 1.0 =
+* Released: January 25, 2022
+
+https://wordpress.org/support/article/twenty-twenty-two-changelog#Version_1.0
+
+== Copyright ==
+
+Twenty Twenty-Two WordPress Theme, 2021-2022 WordPress.org
+Twenty Twenty-Two is distributed under the terms of the GNU GPL.
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+This theme bundles the following third-party resources:
+
+Source Serif Font
+Copyright 2014-2021 Adobe (http://www.adobe.com/)
+License: SIL Open Font License, 1.1, https://opensource.org/licenses/OFL-1.1
+Source: https://github.com/adobe-fonts/source-serif
+
+Block Pattern Images:
+
+"White Bellied Flycatcher" illustrated by Elizabeth Gould. Public Domain.
+https://www.rawpixel.com/image/321474/free-illustration-image-bird-vintage-birds
+Includes modified versions created specifically for Twenty Twenty-Two.
+
+Colorful vintage hummingbird illustrations. CC0.
+https://www.rawpixel.com/image/2281674/free-illustration-image-bird-hummingbird-flying
+https://www.rawpixel.com/image/2281671/free-illustration-image-bird-hummingbird-flying
+https://www.rawpixel.com/image/2281679/free-illustration-image-bird-hummingbird-animals
+https://www.rawpixel.com/image/2281665/free-illustration-image-hummingbird-ernst-haeckel-birds
+
+"Green-tailed Jacamar" by Jacques Barraband. CC0.
+https://www.rawpixel.com/image/328508/free-illustration-image-jacques-barraband-paradise
+
+"Ducks" by Goyō Hashiguchi. CC0
+https://www.rawpixel.com/image/3813787/illustration-image-flower-art-floral
+
+"Colombes et lis, étoffe imprimée" illustrated by Maurice Pillard Verneuil.
+https://www.rawpixel.com/image/2053817/illustration-from-lanimal-dans-decoration
+Included as a short video clip.
+
+Modified versions of the above images, as well as additional "flight path" illustrations were created specifically for Twenty Twenty-Two. CC0.
diff --git a/src/wp-content/themes/twentytwentytwo/screenshot.png b/src/wp-content/themes/twentytwentytwo/screenshot.png
new file mode 100644
index 0000000000..9e8710cde3
Binary files /dev/null and b/src/wp-content/themes/twentytwentytwo/screenshot.png differ
diff --git a/src/wp-content/themes/twentytwentytwo/style.css b/src/wp-content/themes/twentytwentytwo/style.css
new file mode 100644
index 0000000000..b9f6a19367
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/style.css
@@ -0,0 +1,148 @@
+/*
+Theme Name: Twenty Twenty-Two
+Theme URI: https://wordpress.org/themes/twentytwentytwo/
+Author: the WordPress team
+Author URI: https://wordpress.org/
+Description: Built on a solidly designed foundation, Twenty Twenty-Two embraces the idea that everyone deserves a truly unique website. The theme’s subtle styles are inspired by the diversity and versatility of birds: its typography is lightweight yet strong, its color palette is drawn from nature, and its layout elements sit gently on the page. The true richness of Twenty Twenty-Two lies in its opportunity for customization. The theme is built to take advantage of the Full Site Editing features introduced in WordPress 5.9, which means that colors, typography, and the layout of every single page on your site can be customized to suit your vision. It also includes dozens of block patterns, opening the door to a wide range of professionally designed layouts in just a few clicks. Whether you’re building a single-page website, a blog, a business website, or a portfolio, Twenty Twenty-Two will help you create a site that is uniquely yours.
+Requires at least: 5.9
+Tested up to: 5.9
+Requires PHP: 5.6
+Version: 1.0
+License: GNU General Public License v2 or later
+License URI: http://www.gnu.org/licenses/gpl-2.0.html
+Text Domain: twentytwentytwo
+Tags: one-column, custom-colors, custom-menu, custom-logo, editor-style, featured-images, full-site-editing, block-patterns, rtl-language-support, sticky-post, threaded-comments
+
+Twenty Twenty-Two WordPress Theme, (C) 2021 WordPress.org
+Twenty Twenty-Two is distributed under the terms of the GNU GPL.
+*/
+
+/*
+ * Font smoothing.
+ * This is a niche setting that will not be available via Global Styles.
+ * https://github.com/WordPress/gutenberg/issues/35934
+ */
+
+body {
+	-moz-osx-font-smoothing: grayscale;
+	-webkit-font-smoothing: antialiased;
+}
+
+/*
+ * Text and navigation link styles.
+ * Necessary until the following issue is resolved in Gutenberg:
+ * https://github.com/WordPress/gutenberg/issues/27075
+ */
+
+a {
+	text-decoration-thickness: 1px;
+	text-underline-offset: 0.25ch;
+}
+
+a:hover,
+a:focus {
+	text-decoration-style: dashed;
+}
+
+a:active {
+	text-decoration: none;
+}
+
+.wp-block-navigation .wp-block-navigation-item a:hover,
+.wp-block-navigation .wp-block-navigation-item a:focus {
+	text-decoration: underline;
+	text-decoration-style: solid;
+}
+
+/*
+ * Search and File Block button styles.
+ * Necessary until the following issues are resolved in Gutenberg:
+ * https://github.com/WordPress/gutenberg/issues/36444
+ * https://github.com/WordPress/gutenberg/issues/27760
+ */
+
+.wp-block-search__button,
+.wp-block-file .wp-block-file__button {
+	background-color: var(--wp--preset--color--primary);
+	border-radius: 0;
+	border: none;
+	color: var(--wp--preset--color--background);
+	font-size: var(--wp--preset--font-size--medium);
+	padding: calc(.667em + 2px) calc(1.333em + 2px);
+}
+
+/*
+ * Button hover styles.
+ * Necessary until the following issue is resolved in Gutenberg:
+ * https://github.com/WordPress/gutenberg/issues/27075
+ */
+
+.wp-block-search__button:hover,
+.wp-block-file .wp-block-file__button:hover,
+.wp-block-button__link:hover {
+	opacity: 0.90;
+}
+
+/*
+ * Alignment styles.
+ * These rules are temporary, and should not be relied on or
+ * modified too heavily by themes or plugins that build on
+ * Twenty Twenty-Two. These are meant to be a precursor to
+ * a global solution provided by the Block Editor.
+ *
+ * Relevant issues:
+ * https://github.com/WordPress/gutenberg/issues/35607
+ * https://github.com/WordPress/gutenberg/issues/35884
+ */
+
+.wp-site-blocks,
+body > .is-root-container,
+.edit-post-visual-editor__post-title-wrapper,
+.wp-block-group.alignfull,
+.wp-block-group.has-background,
+.wp-block-cover.alignfull,
+.is-root-container .wp-block[data-align="full"] > .wp-block-group,
+.is-root-container .wp-block[data-align="full"] > .wp-block-cover {
+	padding-left: var(--wp--custom--spacing--outer);
+	padding-right: var(--wp--custom--spacing--outer);
+}
+
+.wp-site-blocks .alignfull,
+.wp-site-blocks > .wp-block-group.has-background,
+.wp-site-blocks > .wp-block-cover,
+.wp-site-blocks > .wp-block-template-part > .wp-block-group.has-background,
+.wp-site-blocks > .wp-block-template-part > .wp-block-cover,
+body > .is-root-container > .wp-block-cover,
+body > .is-root-container > .wp-block-template-part > .wp-block-group.has-background,
+body > .is-root-container > .wp-block-template-part > .wp-block-cover,
+.is-root-container .wp-block[data-align="full"] {
+	margin-left: calc(-1 * var(--wp--custom--spacing--outer)) !important;
+	margin-right: calc(-1 * var(--wp--custom--spacing--outer)) !important;
+	width: unset;
+}
+
+/* Blocks inside columns don't have negative margins. */
+.wp-site-blocks .wp-block-columns .wp-block-column .alignfull,
+.is-root-container .wp-block-columns .wp-block-column .wp-block[data-align="full"],
+/* We also want to avoid stacking negative margins. */
+.wp-site-blocks .alignfull:not(.wp-block-group) .alignfull,
+.is-root-container .wp-block[data-align="full"] > *:not(.wp-block-group) .wp-block[data-align="full"] {
+	margin-left: auto !important;
+	margin-right: auto !important;
+	width: inherit;
+}
+
+/*
+ * Responsive menu container padding.
+ * This ensures the responsive container inherits the same
+ * spacing defined above. This behavior may be built into
+ * the Block Editor in the future.
+ */
+
+.wp-block-navigation__responsive-container.is-menu-open {
+	padding-top: var(--wp--custom--spacing--outer);
+	padding-bottom: var(--wp--custom--spacing--large);
+	padding-right: var(--wp--custom--spacing--outer);
+	padding-left: var(--wp--custom--spacing--outer);
+}
+
diff --git a/src/wp-content/themes/twentytwentytwo/templates/404.html b/src/wp-content/themes/twentytwentytwo/templates/404.html
new file mode 100644
index 0000000000..5789a3d7d7
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/templates/404.html
@@ -0,0 +1,11 @@
+<!-- wp:template-part {"slug":"header","tagName":"header"} /-->
+
+<!-- wp:group {"tagName":"main"} -->
+<main class="wp-block-group"><!-- wp:group {"layout":{"inherit":true}} -->
+<div class="wp-block-group">
+<!-- wp:pattern {"slug":"twentytwentytwo/hidden-404"} /-->
+</div>
+<!-- /wp:group --></main>
+<!-- /wp:group -->
+
+<!-- wp:template-part {"slug":"footer","tagName":"footer"} /-->
diff --git a/src/wp-content/themes/twentytwentytwo/templates/archive.html b/src/wp-content/themes/twentytwentytwo/templates/archive.html
new file mode 100644
index 0000000000..abc02186be
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/templates/archive.html
@@ -0,0 +1,39 @@
+<!-- wp:template-part {"slug":"header","tagName":"header"} /-->
+
+<!-- wp:group {"layout":{"inherit":true}} -->
+<div class="wp-block-group"><!-- wp:query-title {"type":"archive","align":"wide","style":{"typography":{"fontSize":"clamp(2.75rem, 6vw, 3.25rem)"},"spacing":{"margin":{"bottom":"6rem"}}}} /-->
+
+<!-- wp:query {"query":{"perPage":10,"pages":0,"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":true},"tagName":"main","align":"wide","layout":{"inherit":false}} -->
+<main class="wp-block-query alignwide"><!-- wp:post-template {"align":"wide"} -->
+<!-- wp:post-title {"isLink":true,"align":"wide","style":{"typography":{"fontStyle":"normal","fontWeight":"300"}},"fontSize":"var(--wp--custom--typography--font-size--huge, clamp(2.25rem, 4vw, 2.75rem))"} /-->
+
+<!-- wp:post-featured-image {"isLink":true,"align":"wide","style":{"spacing":{"margin":{"top":"calc(1.75 * var(--wp--style--block-gap))"}}}} /-->
+
+<!-- wp:columns {"align":"wide"} -->
+<div class="wp-block-columns alignwide"><!-- wp:column {"width":"650px"} -->
+<div class="wp-block-column" style="flex-basis:650px"><!-- wp:post-excerpt /-->
+
+<!-- wp:post-date {"format":"F j, Y","isLink":true,"style":{"typography":{"fontStyle":"italic","fontWeight":"400"}},"fontSize":"small"} /--></div>
+<!-- /wp:column -->
+
+<!-- wp:column {"width":""} -->
+<div class="wp-block-column"></div>
+<!-- /wp:column --></div>
+<!-- /wp:columns -->
+
+<!-- wp:spacer {"height":112} -->
+<div style="height:112px" aria-hidden="true" class="wp-block-spacer"></div>
+<!-- /wp:spacer -->
+<!-- /wp:post-template -->
+
+<!-- wp:query-pagination {"paginationArrow":"arrow","align":"wide","layout":{"type":"flex","justifyContent":"space-between"}} -->
+<!-- wp:query-pagination-previous {"fontSize":"small"} /-->
+
+<!-- wp:query-pagination-numbers /-->
+
+<!-- wp:query-pagination-next {"fontSize":"small"} /-->
+<!-- /wp:query-pagination --></main>
+<!-- /wp:query --></div>
+<!-- /wp:group -->
+
+<!-- wp:template-part {"slug":"footer","tagName":"footer"} /-->
diff --git a/src/wp-content/themes/twentytwentytwo/templates/blank.html b/src/wp-content/themes/twentytwentytwo/templates/blank.html
new file mode 100644
index 0000000000..3fed9dcdf1
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/templates/blank.html
@@ -0,0 +1 @@
+<!-- wp:post-content {"layout":{"inherit":true}} /-->
diff --git a/src/wp-content/themes/twentytwentytwo/templates/home.html b/src/wp-content/themes/twentytwentytwo/templates/home.html
new file mode 100644
index 0000000000..fea167e692
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/templates/home.html
@@ -0,0 +1,37 @@
+<!-- wp:template-part {"slug":"header-small-dark","tagName":"header"} /-->
+
+<!-- wp:query {"query":{"perPage":10,"pages":0,"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":true},"layout":{"inherit":true},"tagName":"main"} -->
+<main class="wp-block-query"><!-- wp:post-template {"align":"wide"} -->
+<!-- wp:group {"layout":{"inherit":true}} -->
+<div class="wp-block-group"><!-- wp:post-title {"isLink":true,"align":"wide","fontSize":"var(--wp--custom--typography--font-size--huge, clamp(2.25rem, 4vw, 2.75rem))"} /-->
+
+<!-- wp:post-featured-image {"isLink":true,"align":"wide","style":{"spacing":{"margin":{"top":"calc(1.75 * var(--wp--style--block-gap))"}}}} /-->
+
+<!-- wp:columns {"align":"wide"} -->
+<div class="wp-block-columns alignwide"><!-- wp:column {"width":"650px"} -->
+<div class="wp-block-column" style="flex-basis:650px"><!-- wp:post-excerpt /-->
+
+<!-- wp:post-date {"isLink":true,"format":"F j, Y","style":{"typography":{"fontStyle":"italic","fontWeight":"400"}},"fontSize":"small"} /--></div>
+<!-- /wp:column -->
+
+<!-- wp:column {"width":""} -->
+<div class="wp-block-column"></div>
+<!-- /wp:column --></div>
+<!-- /wp:columns -->
+
+<!-- wp:spacer {"height":112} -->
+<div style="height:112px" aria-hidden="true" class="wp-block-spacer"></div>
+<!-- /wp:spacer --></div>
+<!-- /wp:group -->
+<!-- /wp:post-template -->
+
+<!-- wp:query-pagination {"paginationArrow":"arrow","align":"wide","layout":{"type":"flex","justifyContent":"space-between"}} -->
+<!-- wp:query-pagination-previous {"fontSize":"small"} /-->
+
+<!-- wp:query-pagination-numbers /-->
+
+<!-- wp:query-pagination-next {"fontSize":"small"} /-->
+<!-- /wp:query-pagination --></main>
+<!-- /wp:query -->
+
+<!-- wp:template-part {"slug":"footer","tagName":"footer"} /-->
diff --git a/src/wp-content/themes/twentytwentytwo/templates/index.html b/src/wp-content/themes/twentytwentytwo/templates/index.html
new file mode 100644
index 0000000000..d1d53f37e9
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/templates/index.html
@@ -0,0 +1,37 @@
+<!-- wp:template-part {"slug":"header","tagName":"header"} /-->
+
+<!-- wp:query {"query":{"perPage":10,"pages":0,"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":true},"layout":{"inherit":true},"tagName":"main"} -->
+<main class="wp-block-query"><!-- wp:post-template {"align":"wide"} -->
+<!-- wp:group {"layout":{"inherit":true}} -->
+<div class="wp-block-group"><!-- wp:post-title {"isLink":true,"align":"wide","fontSize":"var(--wp--custom--typography--font-size--huge, clamp(2.25rem, 4vw, 2.75rem))"} /-->
+
+<!-- wp:post-featured-image {"isLink":true,"align":"wide","style":{"spacing":{"margin":{"top":"calc(1.75 * var(--wp--style--block-gap))"}}}} /-->
+
+<!-- wp:columns {"align":"wide"} -->
+<div class="wp-block-columns alignwide"><!-- wp:column {"width":"650px"} -->
+<div class="wp-block-column" style="flex-basis:650px"><!-- wp:post-excerpt /-->
+
+<!-- wp:post-date {"isLink":true,"format":"F j, Y","style":{"typography":{"fontStyle":"italic","fontWeight":"400"}},"fontSize":"small"} /--></div>
+<!-- /wp:column -->
+
+<!-- wp:column {"width":""} -->
+<div class="wp-block-column"></div>
+<!-- /wp:column --></div>
+<!-- /wp:columns -->
+
+<!-- wp:spacer {"height":112} -->
+<div style="height:112px" aria-hidden="true" class="wp-block-spacer"></div>
+<!-- /wp:spacer --></div>
+<!-- /wp:group -->
+<!-- /wp:post-template -->
+
+<!-- wp:query-pagination {"paginationArrow":"arrow","align":"wide","layout":{"type":"flex","justifyContent":"space-between"}} -->
+<!-- wp:query-pagination-previous {"fontSize":"small"} /-->
+
+<!-- wp:query-pagination-numbers /-->
+
+<!-- wp:query-pagination-next {"fontSize":"small"} /-->
+<!-- /wp:query-pagination --></main>
+<!-- /wp:query -->
+
+<!-- wp:template-part {"slug":"footer","tagName":"footer"} /-->
diff --git a/src/wp-content/themes/twentytwentytwo/templates/page-large-header.html b/src/wp-content/themes/twentytwentytwo/templates/page-large-header.html
new file mode 100644
index 0000000000..c5218f8739
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/templates/page-large-header.html
@@ -0,0 +1,9 @@
+<!-- wp:template-part {"slug":"header-large-dark","tagName":"header"} /-->
+
+<!-- wp:group {"tagName":"main"} -->
+<main class="wp-block-group">
+<!-- wp:post-content {"layout":{"inherit":true}} /-->
+</main>
+<!-- /wp:group -->
+
+<!-- wp:template-part {"slug":"footer","tagName":"footer"} /-->
diff --git a/src/wp-content/themes/twentytwentytwo/templates/page-no-separators.html b/src/wp-content/themes/twentytwentytwo/templates/page-no-separators.html
new file mode 100644
index 0000000000..ef1b65e847
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/templates/page-no-separators.html
@@ -0,0 +1,18 @@
+<!-- wp:template-part {"slug":"header","tagName":"header"} /-->
+
+<!-- wp:group {"tagName":"main"} -->
+<main class="wp-block-group"><!-- wp:group {"layout":{"inherit":true}} -->
+<div class="wp-block-group"><!-- wp:post-title {"level":1,"align":"wide","style":{"spacing":{"margin":{"bottom":"var(--wp--custom--spacing--medium, 6rem)"}}}} /-->
+
+<!-- wp:post-featured-image {"align":"wide","style":{"spacing":{"margin":{"bottom":"var(--wp--custom--spacing--medium, 6rem)"}}}} /--></div>
+<!-- /wp:group -->
+
+<!-- wp:post-content {"layout":{"inherit":true}} /-->
+
+<!-- wp:group {"layout":{"inherit":true}} -->
+<div class="wp-block-group">
+<!-- wp:post-comments {"style":{"spacing":{"padding":{"top":"var(--wp--custom--spacing--medium, 6rem)"}}}} /--></div>
+<!-- /wp:group --></main>
+<!-- /wp:group -->
+
+<!-- wp:template-part {"slug":"footer","tagName":"footer"} /-->
diff --git a/src/wp-content/themes/twentytwentytwo/templates/page.html b/src/wp-content/themes/twentytwentytwo/templates/page.html
new file mode 100644
index 0000000000..faf34e665c
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/templates/page.html
@@ -0,0 +1,26 @@
+<!-- wp:template-part {"slug":"header","tagName":"header"} /-->
+
+<!-- wp:group {"tagName":"main"} -->
+<main class="wp-block-group"><!-- wp:group {"layout":{"inherit":true}} -->
+<div class="wp-block-group"><!-- wp:post-title {"level":1,"align":"wide","style":{"spacing":{"margin":{"bottom":"var(--wp--custom--spacing--medium, 6rem)"}}}} /-->
+
+<!-- wp:post-featured-image {"align":"wide","style":{"spacing":{"margin":{"bottom":"var(--wp--custom--spacing--medium, 6rem)"}}}} /-->
+
+<!-- wp:separator {"align":"wide","className":"is-style-wide"} -->
+<hr class="wp-block-separator alignwide is-style-wide"/>
+<!-- /wp:separator --></div>
+<!-- /wp:group -->
+
+<!-- wp:spacer {"height":32} -->
+<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+<!-- /wp:spacer -->
+
+<!-- wp:post-content {"layout":{"inherit":true}} /-->
+
+<!-- wp:group {"layout":{"inherit":true}} -->
+<div class="wp-block-group">
+<!-- wp:post-comments {"style":{"spacing":{"padding":{"top":"var(--wp--custom--spacing--medium, 6rem)"}}}} /--></div>
+<!-- /wp:group --></main>
+<!-- /wp:group -->
+
+<!-- wp:template-part {"slug":"footer","tagName":"footer"} /-->
diff --git a/src/wp-content/themes/twentytwentytwo/templates/search.html b/src/wp-content/themes/twentytwentytwo/templates/search.html
new file mode 100644
index 0000000000..12a5c29633
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/templates/search.html
@@ -0,0 +1,41 @@
+<!-- wp:template-part {"slug":"header","tagName":"header"} /-->
+
+<!-- wp:group {"style":{"spacing":{"padding":{"bottom":"var(--wp--custom--spacing--large, 8rem)"}}},"layout":{"inherit":true}} -->
+<div class="wp-block-group" style="padding-bottom:var(--wp--custom--spacing--large, 8rem)"><!-- wp:search {"label":"Search","showLabel":false,"width":100,"widthUnit":"%","buttonText":"Search","buttonUseIcon":true} /--></div>
+<!-- /wp:group -->
+
+<!-- wp:query {"query":{"perPage":10,"pages":0,"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":true},"layout":{"inherit":true},"tagName":"main"} -->
+<main class="wp-block-query"><!-- wp:post-template {"align":"wide"} -->
+<!-- wp:group {"layout":{"inherit":true}} -->
+<div class="wp-block-group"><!-- wp:post-title {"isLink":true,"align":"wide","fontSize":"var(--wp--custom--typography--font-size--huge, clamp(2.25rem, 4vw, 2.75rem))"} /-->
+
+<!-- wp:post-featured-image {"isLink":true,"align":"wide","style":{"spacing":{"margin":{"top":"calc(1.75 * var(--wp--style--block-gap))"}}}} /-->
+
+<!-- wp:columns {"align":"wide"} -->
+<div class="wp-block-columns alignwide"><!-- wp:column {"width":"650px"} -->
+<div class="wp-block-column" style="flex-basis:650px"><!-- wp:post-excerpt /-->
+
+<!-- wp:post-date {"isLink":true,"format":"F j, Y","style":{"typography":{"fontStyle":"italic","fontWeight":"400"}},"fontSize":"small"} /--></div>
+<!-- /wp:column -->
+
+<!-- wp:column {"width":""} -->
+<div class="wp-block-column"></div>
+<!-- /wp:column --></div>
+<!-- /wp:columns -->
+
+<!-- wp:spacer {"height":112} -->
+<div style="height:112px" aria-hidden="true" class="wp-block-spacer"></div>
+<!-- /wp:spacer --></div>
+<!-- /wp:group -->
+<!-- /wp:post-template -->
+
+<!-- wp:query-pagination {"paginationArrow":"arrow","align":"wide","layout":{"type":"flex","justifyContent":"space-between"}} -->
+<!-- wp:query-pagination-previous {"fontSize":"small"} /-->
+
+<!-- wp:query-pagination-numbers /-->
+
+<!-- wp:query-pagination-next {"fontSize":"small"} /-->
+<!-- /wp:query-pagination --></main>
+<!-- /wp:query -->
+
+<!-- wp:template-part {"slug":"footer","tagName":"footer"} /-->
diff --git a/src/wp-content/themes/twentytwentytwo/templates/single-no-separators.html b/src/wp-content/themes/twentytwentytwo/templates/single-no-separators.html
new file mode 100644
index 0000000000..221fc1f528
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/templates/single-no-separators.html
@@ -0,0 +1,35 @@
+<!-- wp:template-part {"slug":"header","tagName":"header"} /-->
+
+<!-- wp:group {"tagName":"main"} -->
+<main class="wp-block-group"><!-- wp:group {"layout":{"inherit":true}} -->
+<div class="wp-block-group"><!-- wp:post-title {"level":1,"align":"wide","style":{"spacing":{"margin":{"bottom":"var(--wp--custom--spacing--medium, 6rem)"}}}} /-->
+
+<!-- wp:post-featured-image {"align":"wide","style":{"spacing":{"margin":{"bottom":"var(--wp--custom--spacing--medium, 6rem)"}}}} /--></div>
+<!-- /wp:group -->
+
+<!-- wp:post-content {"layout":{"inherit":true}} /-->
+
+<!-- wp:spacer {"height":32} -->
+<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+<!-- /wp:spacer -->
+
+<!-- wp:group {"layout":{"inherit":true}} -->
+<div class="wp-block-group"><!-- wp:group {"layout":{"type":"flex"}} -->
+<div class="wp-block-group"><!-- wp:post-date {"format":"F j, Y","style":{"typography":{"fontStyle":"italic","fontWeight":"400"}},"fontSize":"small"} /-->
+
+<!-- wp:post-author {"showAvatar":false,"fontSize":"small"} /-->
+
+<!-- wp:post-terms {"term":"category","fontSize":"small"} /-->
+
+<!-- wp:post-terms {"term":"post_tag","fontSize":"small"} /--></div>
+<!-- /wp:group -->
+
+<!-- wp:spacer {"height":32} -->
+<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+<!-- /wp:spacer -->
+
+<!-- wp:post-comments /--></div>
+<!-- /wp:group --></main>
+<!-- /wp:group -->
+
+<!-- wp:template-part {"slug":"footer","tagName":"footer"} /-->
diff --git a/src/wp-content/themes/twentytwentytwo/templates/single.html b/src/wp-content/themes/twentytwentytwo/templates/single.html
new file mode 100644
index 0000000000..3b102d2615
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/templates/single.html
@@ -0,0 +1,47 @@
+<!-- wp:template-part {"slug":"header","tagName":"header"} /-->
+
+<!-- wp:group {"tagName":"main"} -->
+<main class="wp-block-group"><!-- wp:group {"layout":{"inherit":true}} -->
+<div class="wp-block-group"><!-- wp:post-title {"level":1,"align":"wide","style":{"spacing":{"margin":{"bottom":"var(--wp--custom--spacing--medium, 6rem)"}}}} /-->
+
+<!-- wp:post-featured-image {"align":"wide","style":{"spacing":{"margin":{"bottom":"var(--wp--custom--spacing--medium, 6rem)"}}}} /-->
+
+<!-- wp:separator {"align":"wide","className":"is-style-wide"} -->
+<hr class="wp-block-separator alignwide is-style-wide"/>
+<!-- /wp:separator --></div>
+<!-- /wp:group -->
+
+<!-- wp:spacer {"height":32} -->
+<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+<!-- /wp:spacer -->
+
+<!-- wp:post-content {"layout":{"inherit":true}} /-->
+
+<!-- wp:spacer {"height":32} -->
+<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+<!-- /wp:spacer -->
+
+<!-- wp:group {"layout":{"inherit":true}} -->
+<div class="wp-block-group"><!-- wp:group {"layout":{"type":"flex"}} -->
+<div class="wp-block-group"><!-- wp:post-date {"format":"F j, Y","style":{"typography":{"fontStyle":"italic","fontWeight":"400"}},"fontSize":"small"} /-->
+
+<!-- wp:post-author {"showAvatar":false,"fontSize":"small"} /-->
+
+<!-- wp:post-terms {"term":"category","fontSize":"small"} /-->
+
+<!-- wp:post-terms {"term":"post_tag","fontSize":"small"} /--></div>
+<!-- /wp:group -->
+
+<!-- wp:spacer {"height":32} -->
+<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
+<!-- /wp:spacer -->
+
+<!-- wp:separator {"className":"is-style-wide"} -->
+<hr class="wp-block-separator is-style-wide"/>
+<!-- /wp:separator -->
+
+<!-- wp:post-comments /--></div>
+<!-- /wp:group --></main>
+<!-- /wp:group -->
+
+<!-- wp:template-part {"slug":"footer","tagName":"footer"} /-->
diff --git a/src/wp-content/themes/twentytwentytwo/theme.json b/src/wp-content/themes/twentytwentytwo/theme.json
new file mode 100644
index 0000000000..fc2ce3f8e3
--- /dev/null
+++ b/src/wp-content/themes/twentytwentytwo/theme.json
@@ -0,0 +1,356 @@
+{
+	"version": 2,
+	"customTemplates": [
+		{
+			"name": "blank",
+			"title": "Blank",
+			"postTypes": [
+				"page",
+				"post"
+			]
+		},
+		{
+			"name": "page-large-header",
+			"title": "Page (Large Header)",
+			"postTypes": [
+				"page"
+			]
+		},
+		{
+			"name": "single-no-separators",
+			"title": "Single Post (No Separators)",
+			"postTypes": [
+				"post"
+			]
+		},
+		{
+			"name": "page-no-separators",
+			"title": "Page (No Separators)",
+			"postTypes": [
+				"page"
+			]
+		}
+	],
+	"settings": {
+		"appearanceTools": true,
+		"color": {
+			"duotone": [
+				{
+					"colors": [ "#000000", "#ffffff" ],
+					"slug": "foreground-and-background",
+					"name": "Foreground and background"
+				},
+				{
+					"colors": [ "#000000", "#ffe2c7" ],
+					"slug": "foreground-and-secondary",
+					"name": "Foreground and secondary"
+				},
+				{
+					"colors": [ "#000000", "#f6f6f6" ],
+					"slug": "foreground-and-tertiary",
+					"name": "Foreground and tertiary"
+				},
+				{
+					"colors": [ "#1a4548", "#ffffff" ],
+					"slug": "primary-and-background",
+					"name": "Primary and background"
+				},
+				{
+					"colors": [ "#1a4548", "#ffe2c7" ],
+					"slug": "primary-and-secondary",
+					"name": "Primary and secondary"
+				},
+				{
+					"colors": [ "#1a4548", "#f6f6f6" ],
+					"slug": "primary-and-tertiary",
+					"name": "Primary and tertiary"
+				}
+			],
+			"gradients": [
+				{
+					"slug": "vertical-secondary-to-tertiary",
+					"gradient": "linear-gradient(to bottom,var(--wp--preset--color--secondary) 0%,var(--wp--preset--color--tertiary) 100%)",
+					"name": "Vertical secondary to tertiary"
+				},
+				{
+					"slug": "vertical-secondary-to-background",
+					"gradient": "linear-gradient(to bottom,var(--wp--preset--color--secondary) 0%,var(--wp--preset--color--background) 100%)",
+					"name": "Vertical secondary to background"
+				},
+				{
+					"slug": "vertical-tertiary-to-background",
+					"gradient": "linear-gradient(to bottom,var(--wp--preset--color--tertiary) 0%,var(--wp--preset--color--background) 100%)",
+					"name": "Vertical tertiary to background"
+				},
+				{
+					"slug": "diagonal-primary-to-foreground",
+					"gradient": "linear-gradient(to bottom right,var(--wp--preset--color--primary) 0%,var(--wp--preset--color--foreground) 100%)",
+					"name": "Diagonal primary to foreground"
+				},
+				{
+					"slug": "diagonal-secondary-to-background",
+					"gradient": "linear-gradient(to bottom right,var(--wp--preset--color--secondary) 50%,var(--wp--preset--color--background) 50%)",
+					"name": "Diagonal secondary to background"
+				},
+				{
+					"slug": "diagonal-background-to-secondary",
+					"gradient": "linear-gradient(to bottom right,var(--wp--preset--color--background) 50%,var(--wp--preset--color--secondary) 50%)",
+					"name": "Diagonal background to secondary"
+				},
+				{
+					"slug": "diagonal-tertiary-to-background",
+					"gradient": "linear-gradient(to bottom right,var(--wp--preset--color--tertiary) 50%,var(--wp--preset--color--background) 50%)",
+					"name": "Diagonal tertiary to background"
+				},
+				{
+					"slug": "diagonal-background-to-tertiary",
+					"gradient": "linear-gradient(to bottom right,var(--wp--preset--color--background) 50%,var(--wp--preset--color--tertiary) 50%)",
+					"name": "Diagonal background to tertiary"
+				}
+			],
+			"palette": [
+				{
+					"slug": "foreground",
+					"color": "#000000",
+					"name": "Foreground"
+				},
+				{
+					"slug": "background",
+					"color": "#ffffff",
+					"name": "Background"
+				},
+				{
+					"slug": "primary",
+					"color": "#1a4548",
+					"name": "Primary"
+				},
+				{
+					"slug": "secondary",
+					"color": "#ffe2c7",
+					"name": "Secondary"
+				},
+				{
+					"slug": "tertiary",
+					"color": "#F6F6F6",
+					"name": "Tertiary"
+				}
+			]
+		},
+		"custom": {
+			"spacing": {
+				"small": "max(1.25rem, 5vw)",
+				"medium": "clamp(2rem, 8vw, calc(4 * var(--wp--style--block-gap)))",
+				"large": "clamp(4rem, 10vw, 8rem)",
+				"outer": "var(--wp--custom--spacing--small, 1.25rem)"
+			},
+			"typography": {
+				"font-size": {
+					"huge": "clamp(2.25rem, 4vw, 2.75rem)",
+					"gigantic": "clamp(2.75rem, 6vw, 3.25rem)",
+					"colossal": "clamp(3.25rem, 8vw, 6.25rem)"
+				},
+				"line-height": {
+					"tiny": 1.15,
+					"small": 1.2,
+					"medium": 1.4,
+					"normal": 1.6
+				}
+			}
+		},
+		"spacing": {
+			"units": [
+				"%",
+				"px",
+				"em",
+				"rem",
+				"vh",
+				"vw"
+			]
+		},
+		"typography": {
+			"dropCap": false,
+			"fontFamilies": [
+				{
+					"fontFamily": "-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Oxygen-Sans,Ubuntu,Cantarell,\"Helvetica Neue\",sans-serif",
+					"name": "System Font",
+					"slug": "system-font"
+				},
+				{
+					"fontFamily": "\"Source Serif Pro\", serif",
+					"name": "Source Serif Pro",
+					"slug": "source-serif-pro"
+				}
+			],
+			"fontSizes": [
+				{
+					"size": "1rem",
+					"slug": "small"
+				},
+				{
+					"size": "1.125rem",
+					"slug": "medium"
+				},
+				{
+					"size": "1.75rem",
+					"slug": "large"
+				},
+				{
+					"size": "clamp(1.75rem, 3vw, 2.25rem)",
+					"slug": "x-large"
+				}
+			]
+		},
+		"layout": {
+			"contentSize": "650px",
+			"wideSize": "1000px"
+		}
+	},
+	"styles": {
+		"blocks": {
+			"core/button": {
+				"border": {
+					"radius": "0"
+				},
+				"color": {
+					"background": "var(--wp--preset--color--primary)",
+					"text": "var(--wp--preset--color--background)"
+				},
+				"typography": {
+					"fontSize": "var(--wp--preset--font-size--medium)"
+				}
+			},
+			"core/post-title": {
+				"typography": {
+					"fontFamily": "var(--wp--preset--font-family--source-serif-pro)",
+					"fontWeight": "300",
+					"lineHeight": "var(--wp--custom--typography--line-height--tiny)",
+					"fontSize": "var(--wp--custom--typography--font-size--gigantic)"
+				}
+			},
+			"core/post-comments": {
+				"spacing": {
+					"padding": {
+						"top": "var(--wp--custom--spacing--small)"
+					}
+				}
+			},
+			"core/pullquote": {
+				"border": {
+					"width": "1px 0"
+				}
+			},
+			"core/query-title": {
+				"typography": {
+					"fontFamily": "var(--wp--preset--font-family--source-serif-pro)",
+					"fontWeight": "300",
+					"lineHeight": "var(--wp--custom--typography--line-height--small)",
+					"fontSize": "var(--wp--custom--typography--font-size--gigantic)"
+				}
+			},
+			"core/quote": {
+				"border": {
+					"width": "1px"
+				}
+			},
+			"core/site-title": {
+				"typography": {
+					"fontFamily": "var(--wp--preset--font-family--system-font)",
+					"lineHeight": "var(--wp--custom--typography--line-height--normal)",
+					"fontSize": "var(--wp--preset--font-size--medium)",
+					"fontWeight": "normal"
+				}
+			}
+		},
+		"color": {
+			"background": "var(--wp--preset--color--background)",
+			"text": "var(--wp--preset--color--foreground)"
+		},
+		"elements": {
+			"h1": {
+				"typography": {
+					"fontFamily": "var(--wp--preset--font-family--source-serif-pro)",
+					"fontWeight": "300",
+					"lineHeight": "var(--wp--custom--typography--line-height--tiny)",
+					"fontSize": "var(--wp--custom--typography--font-size--colossal)"
+				}
+			},
+			"h2": {
+				"typography": {
+					"fontFamily": "var(--wp--preset--font-family--source-serif-pro)",
+					"fontWeight": "300",
+					"lineHeight": "var(--wp--custom--typography--line-height--small)",
+					"fontSize": "var(--wp--custom--typography--font-size--gigantic)"
+				}
+			},
+			"h3": {
+				"typography": {
+					"fontFamily": "var(--wp--preset--font-family--source-serif-pro)",
+					"fontWeight": "300",
+					"lineHeight": "var(--wp--custom--typography--line-height--tiny)",
+					"fontSize": "var(--wp--custom--typography--font-size--huge)"
+				}
+			},
+			"h4": {
+				"typography": {
+					"fontFamily": "var(--wp--preset--font-family--source-serif-pro)",
+					"fontWeight": "300",
+					"lineHeight": "var(--wp--custom--typography--line-height--tiny)",
+					"fontSize": "var(--wp--preset--font-size--x-large)"
+				}
+			},
+			"h5": {
+				"typography": {
+					"fontFamily": "var(--wp--preset--font-family--system-font)",
+					"fontWeight": "700",
+					"textTransform": "uppercase",
+					"lineHeight": "var(--wp--custom--typography--line-height--normal)",
+					"fontSize": "var(--wp--preset--font-size--medium)"
+				}
+			},
+			"h6": {
+				"typography": {
+					"fontFamily": "var(--wp--preset--font-family--system-font)",
+					"fontWeight": "400",
+					"textTransform": "uppercase",
+					"lineHeight": "var(--wp--custom--typography--line-height--normal)",
+					"fontSize": "var(--wp--preset--font-size--medium)"
+				}
+			},
+			"link": {
+				"color": {
+					"text": "var(--wp--preset--color--foreground)"
+				}
+			}
+		},
+		"spacing": {
+			"blockGap": "1.5rem"
+		},
+		"typography": {
+			"fontFamily": "var(--wp--preset--font-family--system-font)",
+			"lineHeight": "var(--wp--custom--typography--line-height--normal)",
+			"fontSize": "var(--wp--preset--font-size--medium)"
+		}
+	},
+	"templateParts": [
+		{
+			"name": "header",
+			"title": "Header",
+			"area": "header"
+		},
+		{
+			"name": "header-large-dark",
+			"title": "Header (Dark, large)",
+			"area": "header"
+		},
+		{
+			"name": "header-small-dark",
+			"title": "Header (Dark, small)",
+			"area": "header"
+		},
+		{
+			"name": "footer",
+			"title": "Footer",
+			"area": "footer"
+		}
+	]
+}
diff --git a/src/wp-includes/ID3/getid3.lib.php b/src/wp-includes/ID3/getid3.lib.php
index 8514e9781f..46a39ee3b2 100644
--- a/src/wp-includes/ID3/getid3.lib.php
+++ b/src/wp-includes/ID3/getid3.lib.php
@@ -242,7 +242,7 @@ class getid3_lib
 	/**
 	 * ANSI/IEEE Standard 754-1985, Standard for Binary Floating Point Arithmetic
 	 *
-	 * @link http://www.psc.edu/general/software/packages/ieee/ieee.html
+	 * @link https://web.archive.org/web/20120325162206/http://www.psc.edu/general/software/packages/ieee/ieee.php
 	 * @link http://www.scri.fsu.edu/~jac/MAD3401/Backgrnd/ieee.html
 	 *
 	 * @param string $byteword
@@ -294,12 +294,12 @@ class getid3_lib
 
 		if (($exponent == (pow(2, $exponentbits) - 1)) && ($fraction != 0)) {
 			// Not a Number
-			$floatvalue = false;
+			$floatvalue = NAN;
 		} elseif (($exponent == (pow(2, $exponentbits) - 1)) && ($fraction == 0)) {
 			if ($signbit == '1') {
-				$floatvalue = '-infinity';
+				$floatvalue = -INF;
 			} else {
-				$floatvalue = '+infinity';
+				$floatvalue = INF;
 			}
 		} elseif (($exponent == 0) && ($fraction == 0)) {
 			if ($signbit == '1') {
@@ -427,14 +427,20 @@ class getid3_lib
 	 * @return string
 	 */
 	public static function Dec2Bin($number) {
+		if (!is_numeric($number)) {
+			// https://github.com/JamesHeinrich/getID3/issues/299
+			trigger_error('TypeError: Dec2Bin(): Argument #1 ($number) must be numeric, '.gettype($number).' given', E_USER_WARNING);
+			return '';
+		}
+		$bytes = array();
 		while ($number >= 256) {
-			$bytes[] = (($number / 256) - (floor($number / 256))) * 256;
+			$bytes[] = (int) (($number / 256) - (floor($number / 256))) * 256;
 			$number = floor($number / 256);
 		}
-		$bytes[] = $number;
+		$bytes[] = (int) $number;
 		$binstring = '';
-		for ($i = 0; $i < count($bytes); $i++) {
-			$binstring = (($i == count($bytes) - 1) ? decbin($bytes[$i]) : str_pad(decbin($bytes[$i]), 8, '0', STR_PAD_LEFT)).$binstring;
+		foreach ($bytes as $i => $byte) {
+			$binstring = (($i == count($bytes) - 1) ? decbin($byte) : str_pad(decbin($byte), 8, '0', STR_PAD_LEFT)).$binstring;
 		}
 		return $binstring;
 	}
@@ -665,6 +671,7 @@ class getid3_lib
 		// or
 		//   $foo['path']['to']['my'] = 'file.txt';
 		$ArrayPath = ltrim($ArrayPath, $Separator);
+		$ReturnedArray = array();
 		if (($pos = strpos($ArrayPath, $Separator)) !== false) {
 			$ReturnedArray[substr($ArrayPath, 0, $pos)] = self::CreateDeepArray(substr($ArrayPath, $pos + 1), $Separator, $Value);
 		} else {
@@ -1538,12 +1545,21 @@ class getid3_lib
 	public static function CopyTagsToComments(&$ThisFileInfo, $option_tags_html=true) {
 		// Copy all entries from ['tags'] into common ['comments']
 		if (!empty($ThisFileInfo['tags'])) {
-			if (isset($ThisFileInfo['tags']['id3v1'])) {
-				// bubble ID3v1 to the end, if present to aid in detecting bad ID3v1 encodings
-				$ID3v1 = $ThisFileInfo['tags']['id3v1'];
-				unset($ThisFileInfo['tags']['id3v1']);
-				$ThisFileInfo['tags']['id3v1'] = $ID3v1;
-				unset($ID3v1);
+
+			// Some tag types can only support limited character sets and may contain data in non-standard encoding (usually ID3v1)
+			// and/or poorly-transliterated tag values that are also in tag formats that do support full-range character sets
+			// To make the output more user-friendly, process the potentially-problematic tag formats last to enhance the chance that
+			// the first entries in [comments] are the most correct and the "bad" ones (if any) come later.
+			// https://github.com/JamesHeinrich/getID3/issues/338
+			$processLastTagTypes = array('id3v1','riff');
+			foreach ($processLastTagTypes as $processLastTagType) {
+				if (isset($ThisFileInfo['tags'][$processLastTagType])) {
+					// bubble ID3v1 to the end, if present to aid in detecting bad ID3v1 encodings
+					$temp = $ThisFileInfo['tags'][$processLastTagType];
+					unset($ThisFileInfo['tags'][$processLastTagType]);
+					$ThisFileInfo['tags'][$processLastTagType] = $temp;
+					unset($temp);
+				}
 			}
 			foreach ($ThisFileInfo['tags'] as $tagtype => $tagarray) {
 				foreach ($tagarray as $tagname => $tagdata) {
@@ -1562,20 +1578,30 @@ class getid3_lib
 										// new value is identical but shorter-than (or equal-length to) one already in comments - skip
 										break 2;
 									}
-								}
-								if (function_exists('mb_convert_encoding')) {
-									if (trim($value) == trim(substr(mb_convert_encoding($existingvalue, $ThisFileInfo['id3v1']['encoding'], $ThisFileInfo['encoding']), 0, 30))) {
-										// value stored in ID3v1 appears to be probably the multibyte value transliterated (badly) into ISO-8859-1 in ID3v1.
-										// As an example, Foobar2000 will do this if you tag a file with Chinese or Arabic or Cyrillic or something that doesn't fit into ISO-8859-1 the ID3v1 will consist of mostly "?" characters, one per multibyte unrepresentable character
-										break 2;
+
+									if (function_exists('mb_convert_encoding')) {
+										if (trim($value) == trim(substr(mb_convert_encoding($existingvalue, $ThisFileInfo['id3v1']['encoding'], $ThisFileInfo['encoding']), 0, 30))) {
+											// value stored in ID3v1 appears to be probably the multibyte value transliterated (badly) into ISO-8859-1 in ID3v1.
+											// As an example, Foobar2000 will do this if you tag a file with Chinese or Arabic or Cyrillic or something that doesn't fit into ISO-8859-1 the ID3v1 will consist of mostly "?" characters, one per multibyte unrepresentable character
+											break 2;
+										}
 									}
 								}
 
 							} elseif (!is_array($value)) {
 
-								$newvaluelength = strlen(trim($value));
+								$newvaluelength   =    strlen(trim($value));
+								$newvaluelengthMB = mb_strlen(trim($value));
 								foreach ($ThisFileInfo['comments'][$tagname] as $existingkey => $existingvalue) {
-									$oldvaluelength = strlen(trim($existingvalue));
+									$oldvaluelength   =    strlen(trim($existingvalue));
+									$oldvaluelengthMB = mb_strlen(trim($existingvalue));
+									if (($newvaluelengthMB == $oldvaluelengthMB) && ($existingvalue == getid3_lib::iconv_fallback('UTF-8', 'ASCII', $value))) {
+										// https://github.com/JamesHeinrich/getID3/issues/338
+										// check for tags containing extended characters that may have been forced into limited-character storage (e.g. UTF8 values into ASCII)
+										// which will usually display unrepresentable characters as "?"
+										$ThisFileInfo['comments'][$tagname][$existingkey] = trim($value);
+										break;
+									}
 									if ((strlen($existingvalue) > 10) && ($newvaluelength > $oldvaluelength) && (substr(trim($value), 0, strlen($existingvalue)) == $existingvalue)) {
 										$ThisFileInfo['comments'][$tagname][$existingkey] = trim($value);
 										break;
@@ -1601,14 +1627,16 @@ class getid3_lib
 			}
 
 			// attempt to standardize spelling of returned keys
-			$StandardizeFieldNames = array(
-				'tracknumber' => 'track_number',
-				'track'       => 'track_number',
-			);
-			foreach ($StandardizeFieldNames as $badkey => $goodkey) {
-				if (array_key_exists($badkey, $ThisFileInfo['comments']) && !array_key_exists($goodkey, $ThisFileInfo['comments'])) {
-					$ThisFileInfo['comments'][$goodkey] = $ThisFileInfo['comments'][$badkey];
-					unset($ThisFileInfo['comments'][$badkey]);
+			if (!empty($ThisFileInfo['comments'])) {
+				$StandardizeFieldNames = array(
+					'tracknumber' => 'track_number',
+					'track'       => 'track_number',
+				);
+				foreach ($StandardizeFieldNames as $badkey => $goodkey) {
+					if (array_key_exists($badkey, $ThisFileInfo['comments']) && !array_key_exists($goodkey, $ThisFileInfo['comments'])) {
+						$ThisFileInfo['comments'][$goodkey] = $ThisFileInfo['comments'][$badkey];
+						unset($ThisFileInfo['comments'][$badkey]);
+					}
 				}
 			}
 
@@ -1734,6 +1762,7 @@ class getid3_lib
 	 * @return float|bool
 	 */
 	public static function getFileSizeSyscall($path) {
+		$commandline = null;
 		$filesize = false;
 
 		if (GETID3_OS_ISWINDOWS) {
@@ -1795,7 +1824,7 @@ class getid3_lib
 	 *
 	 * @return string
 	 */
-	public static function mb_basename($path, $suffix = null) {
+	public static function mb_basename($path, $suffix = '') {
 		$splited = preg_split('#/#', rtrim($path, '/ '));
 		return substr(basename('X'.$splited[count($splited) - 1], $suffix), 1);
 	}
diff --git a/src/wp-includes/ID3/getid3.php b/src/wp-includes/ID3/getid3.php
index 5cb3c036c0..2008025b85 100644
--- a/src/wp-includes/ID3/getid3.php
+++ b/src/wp-includes/ID3/getid3.php
@@ -17,10 +17,6 @@ if (!defined('GETID3_OS_ISWINDOWS')) {
 if (!defined('GETID3_INCLUDEPATH')) {
 	define('GETID3_INCLUDEPATH', dirname(__FILE__).DIRECTORY_SEPARATOR);
 }
-// Workaround Bug #39923 (https://bugs.php.net/bug.php?id=39923)
-if (!defined('IMG_JPG') && defined('IMAGETYPE_JPEG')) {
-	define('IMG_JPG', IMAGETYPE_JPEG);
-}
 if (!defined('ENT_SUBSTITUTE')) { // PHP5.3 adds ENT_IGNORE, PHP5.4 adds ENT_SUBSTITUTE
 	define('ENT_SUBSTITUTE', (defined('ENT_IGNORE') ? ENT_IGNORE : 8));
 }
@@ -57,7 +53,7 @@ if ($open_basedir) {
 		if (substr($basedir, -1, 1) != DIRECTORY_SEPARATOR) {
 			$basedir .= DIRECTORY_SEPARATOR;
 		}
-		if (preg_match('#^'.preg_quote($basedir).'#', $temp_dir)) {
+		if (strpos($temp_dir, $basedir) === 0) {
 			$found_valid_tempdir = true;
 			break;
 		}
@@ -214,6 +210,140 @@ class getID3
 	 */
 	public $option_fread_buffer_size = 32768;
 
+
+
+	// module-specific options
+
+	/** archive.rar
+	 * if true use PHP RarArchive extension, if false (non-extension parsing not yet written in getID3)
+	 *
+	 * @var bool
+	 */
+	public $options_archive_rar_use_php_rar_extension = true;
+
+	/** archive.gzip
+	 * Optional file list - disable for speed.
+	 * Decode gzipped files, if possible, and parse recursively (.tar.gz for example).
+	 *
+	 * @var bool
+	 */
+	public $options_archive_gzip_parse_contents = false;
+
+	/** audio.midi
+	 * if false only parse most basic information, much faster for some files but may be inaccurate
+	 *
+	 * @var bool
+	 */
+	public $options_audio_midi_scanwholefile = true;
+
+	/** audio.mp3
+	 * Forces getID3() to scan the file byte-by-byte and log all the valid audio frame headers - extremely slow,
+	 * unrecommended, but may provide data from otherwise-unusable files.
+	 *
+	 * @var bool
+	 */
+	public $options_audio_mp3_allow_bruteforce = false;
+
+	/** audio.mp3
+	 * number of frames to scan to determine if MPEG-audio sequence is valid
+	 * Lower this number to 5-20 for faster scanning
+	 * Increase this number to 50+ for most accurate detection of valid VBR/CBR mpeg-audio streams
+	 *
+	 * @var int
+	 */
+	public $options_audio_mp3_mp3_valid_check_frames = 50;
+
+	/** audio.wavpack
+	 * Avoid scanning all frames (break after finding ID_RIFF_HEADER and ID_CONFIG_BLOCK,
+	 * significantly faster for very large files but other data may be missed
+	 *
+	 * @var bool
+	 */
+	public $options_audio_wavpack_quick_parsing = false;
+
+	/** audio-video.flv
+	 * Break out of the loop if too many frames have been scanned; only scan this
+	 * many if meta frame does not contain useful duration.
+	 *
+	 * @var int
+	 */
+	public $options_audiovideo_flv_max_frames = 100000;
+
+	/** audio-video.matroska
+	 * If true, do not return information about CLUSTER chunks, since there's a lot of them
+	 * and they're not usually useful [default: TRUE].
+	 *
+	 * @var bool
+	 */
+	public $options_audiovideo_matroska_hide_clusters    = true;
+
+	/** audio-video.matroska
+	 * True to parse the whole file, not only header [default: FALSE].
+	 *
+	 * @var bool
+	 */
+	public $options_audiovideo_matroska_parse_whole_file = false;
+
+	/** audio-video.quicktime
+	 * return all parsed data from all atoms if true, otherwise just returned parsed metadata
+	 *
+	 * @var bool
+	 */
+	public $options_audiovideo_quicktime_ReturnAtomData  = false;
+
+	/** audio-video.quicktime
+	 * return all parsed data from all atoms if true, otherwise just returned parsed metadata
+	 *
+	 * @var bool
+	 */
+	public $options_audiovideo_quicktime_ParseAllPossibleAtoms = false;
+
+	/** audio-video.swf
+	 * return all parsed tags if true, otherwise do not return tags not parsed by getID3
+	 *
+	 * @var bool
+	 */
+	public $options_audiovideo_swf_ReturnAllTagData = false;
+
+	/** graphic.bmp
+	 * return BMP palette
+	 *
+	 * @var bool
+	 */
+	public $options_graphic_bmp_ExtractPalette = false;
+
+	/** graphic.bmp
+	 * return image data
+	 *
+	 * @var bool
+	 */
+	public $options_graphic_bmp_ExtractData    = false;
+
+	/** graphic.png
+	 * If data chunk is larger than this do not read it completely (getID3 only needs the first
+	 * few dozen bytes for parsing).
+	 *
+	 * @var int
+	 */
+	public $options_graphic_png_max_data_bytes = 10000000;
+
+	/** misc.pdf
+	 * return full details of PDF Cross-Reference Table (XREF)
+	 *
+	 * @var bool
+	 */
+	public $options_misc_pdf_returnXREF = false;
+
+	/** misc.torrent
+	 * Assume all .torrent files are less than 1MB and just read entire thing into memory for easy processing.
+	 * Override this value if you need to process files larger than 1MB
+	 *
+	 * @var int
+	 */
+	public $options_misc_torrent_max_torrent_filesize = 1048576;
+
+
+
 	// Public variables
 
 	/**
@@ -257,7 +387,7 @@ class getID3
 	 */
 	protected $startup_warning = '';
 
-	const VERSION           = '1.9.20-202006061653';
+	const VERSION           = '1.9.21-202109171300';
 	const FREAD_BUFFER_SIZE = 32768;
 
 	const ATTACHMENTS_NONE   = false;
@@ -637,6 +767,18 @@ class getID3
 				return $this->error('Format not supported, module "'.$determined_format['include'].'" is corrupt.');
 			}
 			$class = new $class_name($this);
+
+			// set module-specific options
+			foreach (get_object_vars($this) as $getid3_object_vars_key => $getid3_object_vars_value) {
+				if (preg_match('#^options_([^_]+)_([^_]+)_(.+)$#i', $getid3_object_vars_key, $matches)) {
+					list($dummy, $GOVgroup, $GOVmodule, $GOVsetting) = $matches;
+					$GOVgroup = (($GOVgroup == 'audiovideo') ? 'audio-video' : $GOVgroup); // variable names can only contain 0-9a-z_ so standardize here
+					if (($GOVgroup == $determined_format['group']) && ($GOVmodule == $determined_format['module'])) {
+						$class->$GOVsetting = $getid3_object_vars_value;
+					}
+				}
+			}
+
 			$class->Analyze();
 			unset($class);
 
@@ -1355,6 +1497,16 @@ class getID3
 							'fail_ape'  => 'ERROR',
 						),
 
+				// TORRENT             - .torrent
+				'torrent' => array(
+							'pattern'   => '^(d8\\:announce|d7\\:comment)',
+							'group'     => 'misc',
+							'module'    => 'torrent',
+							'mime_type' => 'application/x-bittorrent',
+							'fail_id3'  => 'ERROR',
+							'fail_ape'  => 'ERROR',
+						),
+
 				 // CUE  - data       - CUEsheet (index to single-file disc images)
 				 'cue' => array(
 							'pattern'   => '', // empty pattern means cannot be automatically detected, will fall through all other formats and match based on filename and very basic file contents
@@ -1489,7 +1641,7 @@ class getID3
 						if (is_string($value)) {
 							$value = trim($value, " \r\n\t"); // do not trim nulls from $value!! Unicode characters will get mangled if trailing nulls are removed!
 						}
-						if ($value) {
+						if (isset($value) && $value !== "") {
 							if (!is_numeric($key)) {
 								$this->info['tags'][trim($tag_name)][trim($tag_key)][$key] = $value;
 							} else {
@@ -2096,19 +2248,25 @@ abstract class getid3_handler
 					$this->data_string_position = $this->data_string_length + $bytes;
 					break;
 			}
-			return 0;
-		} else {
-			$pos = $bytes;
-			if ($whence == SEEK_CUR) {
-				$pos = $this->ftell() + $bytes;
-			} elseif ($whence == SEEK_END) {
-				$pos = $this->getid3->info['filesize'] + $bytes;
-			}
-			if (!getid3_lib::intValueSupported($pos)) {
-				throw new getid3_exception('cannot fseek('.$pos.') because beyond PHP filesystem limit', 10);
-			}
+			return 0; // fseek returns 0 on success
+		}
+
+		$pos = $bytes;
+		if ($whence == SEEK_CUR) {
+			$pos = $this->ftell() + $bytes;
+		} elseif ($whence == SEEK_END) {
+			$pos = $this->getid3->info['filesize'] + $bytes;
+		}
+		if (!getid3_lib::intValueSupported($pos)) {
+			throw new getid3_exception('cannot fseek('.$pos.') because beyond PHP filesystem limit', 10);
+		}
+
+		// https://github.com/JamesHeinrich/getID3/issues/327
+		$result = fseek($this->getid3->fp, $bytes, $whence);
+		if ($result !== 0) { // fseek returns 0 on success
+			throw new getid3_exception('cannot fseek('.$pos.'). resource/stream does not appear to support seeking', 10);
 		}
-		return fseek($this->getid3->fp, $bytes, $whence);
+		return $result;
 	}
 
 	/**
@@ -2224,6 +2382,8 @@ abstract class getid3_handler
 	 * @throws getid3_exception
 	 */
 	public function saveAttachment($name, $offset, $length, $image_mime=null) {
+		$fp_dest = null;
+		$dest = null;
 		try {
 
 			// do not extract at all
diff --git a/src/wp-includes/ID3/module.audio-video.asf.php b/src/wp-includes/ID3/module.audio-video.asf.php
index fce923c027..85edb7d755 100644
--- a/src/wp-includes/ID3/module.audio-video.asf.php
+++ b/src/wp-includes/ID3/module.audio-video.asf.php
@@ -93,6 +93,7 @@ class getid3_asf extends getid3_handler
 		$offset = 0;
 		$thisfile_asf_streambitratepropertiesobject = array();
 		$thisfile_asf_codeclistobject = array();
+		$StreamPropertiesObjectData = array();
 
 		for ($HeaderObjectsCounter = 0; $HeaderObjectsCounter < $thisfile_asf_headerobject['headerobjects']; $HeaderObjectsCounter++) {
 			$NextObjectGUID = substr($ASFHeaderData, $offset, 16);
@@ -283,7 +284,7 @@ class getid3_asf extends getid3_handler
 					$thisfile_asf_headerextensionobject['reserved_2']          = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
 					$offset += 2;
 					if ($thisfile_asf_headerextensionobject['reserved_2'] != 6) {
-						$this->warning('header_extension_object.reserved_2 ('.getid3_lib::PrintHexBytes($thisfile_asf_headerextensionobject['reserved_2']).') does not match expected value of "6"');
+						$this->warning('header_extension_object.reserved_2 ('.$thisfile_asf_headerextensionobject['reserved_2'].') does not match expected value of "6"');
 						//return false;
 						break;
 					}
@@ -535,7 +536,7 @@ class getid3_asf extends getid3_handler
 					$thisfile_asf_markerobject['reserved_2'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
 					$offset += 2;
 					if ($thisfile_asf_markerobject['reserved_2'] != 0) {
-						$this->warning('marker_object.reserved_2 ('.getid3_lib::PrintHexBytes($thisfile_asf_markerobject['reserved_2']).') does not match expected value of "0"');
+						$this->warning('marker_object.reserved_2 ('.$thisfile_asf_markerobject['reserved_2'].') does not match expected value of "0"');
 						break;
 					}
 					$thisfile_asf_markerobject['name_length'] = getid3_lib::LittleEndian2Int(substr($ASFHeaderData, $offset, 2));
@@ -1193,7 +1194,7 @@ class getid3_asf extends getid3_handler
 					$thisfile_asf_dataobject['reserved']           = getid3_lib::LittleEndian2Int(substr($DataObjectData, $offset, 2));
 					$offset += 2;
 					if ($thisfile_asf_dataobject['reserved'] != 0x0101) {
-						$this->warning('data_object.reserved ('.getid3_lib::PrintHexBytes($thisfile_asf_dataobject['reserved']).') does not match expected value of "0x0101"');
+						$this->warning('data_object.reserved (0x'.sprintf('%04X', $thisfile_asf_dataobject['reserved']).') does not match expected value of "0x0101"');
 						//return false;
 						break;
 					}
diff --git a/src/wp-includes/ID3/module.audio-video.flv.php b/src/wp-includes/ID3/module.audio-video.flv.php
index 7e684072e3..3b59e596e3 100644
--- a/src/wp-includes/ID3/module.audio-video.flv.php
+++ b/src/wp-includes/ID3/module.audio-video.flv.php
@@ -161,6 +161,7 @@ class getid3_flv extends getid3_handler
 						$info['flv']['video']['videoCodec'] = $LastHeaderByte & 0x07;
 
 						$FLVvideoHeader = $this->fread(11);
+						$PictureSizeEnc = array();
 
 						if ($info['flv']['video']['videoCodec'] == GETID3_FLV_VIDEO_H264) {
 							// this code block contributed by: moysevichØgmail*com
diff --git a/src/wp-includes/ID3/module.audio-video.matroska.php b/src/wp-includes/ID3/module.audio-video.matroska.php
index a285108590..128e614e2c 100644
--- a/src/wp-includes/ID3/module.audio-video.matroska.php
+++ b/src/wp-includes/ID3/module.audio-video.matroska.php
@@ -224,14 +224,14 @@ class getid3_matroska extends getid3_handler
 	 *
 	 * @var bool
 	 */
-	public static $hide_clusters    = true;
+	public $hide_clusters    = true;
 
 	/**
 	 * True to parse the whole file, not only header [default: FALSE].
 	 *
 	 * @var bool
 	 */
-	public static $parse_whole_file = false;
+	public $parse_whole_file = false;
 
 	/*
 	 * Private parser settings/placeholders.
@@ -586,7 +586,7 @@ class getid3_matroska extends getid3_handler
 					$info['matroska']['segment'][0]['length'] = $top_element['length'];
 
 					while ($this->getEBMLelement($element_data, $top_element['end'])) {
-						if ($element_data['id'] != EBML_ID_CLUSTER || !self::$hide_clusters) { // collect clusters only if required
+						if ($element_data['id'] != EBML_ID_CLUSTER || !$this->hide_clusters) { // collect clusters only if required
 							$info['matroska']['segments'][] = $element_data;
 						}
 						switch ($element_data['id']) {
@@ -618,7 +618,7 @@ class getid3_matroska extends getid3_handler
 												$this->warning('seek_entry[target_id] unexpectedly not set at '.$seek_entry['offset']);
 												break;
 											}
-											if (($seek_entry['target_id'] != EBML_ID_CLUSTER) || !self::$hide_clusters) { // collect clusters only if required
+											if (($seek_entry['target_id'] != EBML_ID_CLUSTER) || !$this->hide_clusters) { // collect clusters only if required
 												$info['matroska']['seek'][] = $seek_entry;
 											}
 											break;
@@ -905,7 +905,7 @@ class getid3_matroska extends getid3_handler
 								break;
 
 							case EBML_ID_CUES: // A top-level element to speed seeking access. All entries are local to the segment. Should be mandatory for non "live" streams.
-								if (self::$hide_clusters) { // do not parse cues if hide clusters is "ON" till they point to clusters anyway
+								if ($this->hide_clusters) { // do not parse cues if hide clusters is "ON" till they point to clusters anyway
 									$this->current_offset = $element_data['end'];
 									break;
 								}
@@ -1246,12 +1246,12 @@ class getid3_matroska extends getid3_handler
 									}
 									$this->current_offset = $subelement['end'];
 								}
-								if (!self::$hide_clusters) {
+								if (!$this->hide_clusters) {
 									$info['matroska']['cluster'][] = $cluster_entry;
 								}
 
 								// check to see if all the data we need exists already, if so, break out of the loop
-								if (!self::$parse_whole_file) {
+								if (!$this->parse_whole_file) {
 									if (isset($info['matroska']['info']) && is_array($info['matroska']['info'])) {
 										if (isset($info['matroska']['tracks']['tracks']) && is_array($info['matroska']['tracks']['tracks'])) {
 											if (count($info['matroska']['track_data_offsets']) == count($info['matroska']['tracks']['tracks'])) {
diff --git a/src/wp-includes/ID3/module.audio-video.quicktime.php b/src/wp-includes/ID3/module.audio-video.quicktime.php
index 1cf1c0590b..c3bccfd086 100644
--- a/src/wp-includes/ID3/module.audio-video.quicktime.php
+++ b/src/wp-includes/ID3/module.audio-video.quicktime.php
@@ -24,7 +24,18 @@ getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE_
 class getid3_quicktime extends getid3_handler
 {
 
-	public $ReturnAtomData        = true;
+	/** audio-video.quicktime
+	 * return all parsed data from all atoms if true, otherwise just returned parsed metadata
+	 *
+	 * @var bool
+	 */
+	public $ReturnAtomData        = false;
+
+	/** audio-video.quicktime
+	 * return all parsed data from all atoms if true, otherwise just returned parsed metadata
+	 *
+	 * @var bool
+	 */
 	public $ParseAllPossibleAtoms = false;
 
 	/**
@@ -170,7 +181,7 @@ class getid3_quicktime extends getid3_handler
 			}
 		}
 
-		if (!isset($info['bitrate']) && isset($info['playtime_seconds'])) {
+		if (!isset($info['bitrate']) && !empty($info['playtime_seconds'])) {
 			$info['bitrate'] = (($info['avdataend'] - $info['avdataoffset']) * 8) / $info['playtime_seconds'];
 		}
 		if (isset($info['bitrate']) && !isset($info['audio']['bitrate']) && !isset($info['quicktime']['video'])) {
@@ -560,15 +571,28 @@ class getid3_quicktime extends getid3_handler
 											default:
 												$atom_structure['data'] = substr($boxdata, 8);
 												if ($atomname == 'covr') {
-													// not a foolproof check, but better than nothing
-													if (preg_match('#^\\xFF\\xD8\\xFF#', $atom_structure['data'])) {
-														$atom_structure['image_mime'] = 'image/jpeg';
-													} elseif (preg_match('#^\\x89\\x50\\x4E\\x47\\x0D\\x0A\\x1A\\x0A#', $atom_structure['data'])) {
-														$atom_structure['image_mime'] = 'image/png';
-													} elseif (preg_match('#^GIF#', $atom_structure['data'])) {
-														$atom_structure['image_mime'] = 'image/gif';
+													if (!empty($atom_structure['data'])) {
+														$atom_structure['image_mime'] = 'image/unknown'; // provide default MIME type to ensure array keys exist
+														if (function_exists('getimagesizefromstring') && ($getimagesize = getimagesizefromstring($atom_structure['data'])) && !empty($getimagesize['mime'])) {
+															$atom_structure['image_mime'] = $getimagesize['mime'];
+														} else {
+															// if getimagesizefromstring is not available, or fails for some reason, fall back to simple detection of common image formats
+															$ImageFormatSignatures = array(
+																'image/jpeg' => "\xFF\xD8\xFF",
+																'image/png'  => "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A",
+																'image/gif'  => 'GIF',
+															);
+															foreach ($ImageFormatSignatures as $mime => $image_format_signature) {
+																if (substr($atom_structure['data'], 0, strlen($image_format_signature)) == $image_format_signature) {
+																	$atom_structure['image_mime'] = $mime;
+																	break;
+																}
+															}
+														}
+														$info['quicktime']['comments']['picture'][] = array('image_mime'=>$atom_structure['image_mime'], 'data'=>$atom_structure['data'], 'description'=>'cover');
+													} else {
+														$this->warning('Unknown empty "covr" image at offset '.$baseoffset);
 													}
-													$info['quicktime']['comments']['picture'][] = array('image_mime'=>$atom_structure['image_mime'], 'data'=>$atom_structure['data'], 'description'=>'cover');
 												}
 												break;
 
@@ -728,11 +752,13 @@ class getid3_quicktime extends getid3_handler
 					$atom_structure['flags']['play_on_open'] = (bool) $atom_structure['play_on_open_flag'];
 					$atom_structure['flags']['slide_show']   = (bool) $atom_structure['slide_show_flag'];
 
-					$ptv_lookup[0] = 'normal';
-					$ptv_lookup[1] = 'double';
-					$ptv_lookup[2] = 'half';
-					$ptv_lookup[3] = 'full';
-					$ptv_lookup[4] = 'current';
+					$ptv_lookup = array(
+						0 => 'normal',
+						1 => 'double',
+						2 => 'half',
+						3 => 'full',
+						4 => 'current'
+					);
 					if (isset($ptv_lookup[$atom_structure['display_size_raw']])) {
 						$atom_structure['display_size'] = $ptv_lookup[$atom_structure['display_size_raw']];
 					} else {
@@ -908,13 +934,13 @@ $this->warning('incomplete/incorrect handling of "stsd" with Parrot metadata in
 										$atom_structure['sample_description_table'][$i]['video_pixel_color_depth'] =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 66,  2));
 										$atom_structure['sample_description_table'][$i]['video_color_table_id']    =   getid3_lib::BigEndian2Int(substr($atom_structure['sample_description_table'][$i]['data'], 68,  2));
 
-										$atom_structure['sample_description_table'][$i]['video_pixel_color_type']  = (($atom_structure['sample_description_table'][$i]['video_pixel_color_depth'] > 32) ? 'grayscale' : 'color');
+										$atom_structure['sample_description_table'][$i]['video_pixel_color_type']  = (((int) $atom_structure['sample_description_table'][$i]['video_pixel_color_depth'] > 32) ? 'grayscale' : 'color');
 										$atom_structure['sample_description_table'][$i]['video_pixel_color_name']  = $this->QuicktimeColorNameLookup($atom_structure['sample_description_table'][$i]['video_pixel_color_depth']);
 
 										if ($atom_structure['sample_description_table'][$i]['video_pixel_color_name'] != 'invalid') {
 											$info['quicktime']['video']['codec_fourcc']        = $atom_structure['sample_description_table'][$i]['data_format'];
 											$info['quicktime']['video']['codec_fourcc_lookup'] = $this->QuicktimeVideoCodecLookup($atom_structure['sample_description_table'][$i]['data_format']);
-											$info['quicktime']['video']['codec']               = (($atom_structure['sample_description_table'][$i]['video_encoder_name_len'] > 0) ? $atom_structure['sample_description_table'][$i]['video_encoder_name'] : $atom_structure['sample_description_table'][$i]['data_format']);
+											$info['quicktime']['video']['codec']               = (((int) $atom_structure['sample_description_table'][$i]['video_encoder_name_len'] > 0) ? $atom_structure['sample_description_table'][$i]['video_encoder_name'] : $atom_structure['sample_description_table'][$i]['data_format']);
 											$info['quicktime']['video']['color_depth']         = $atom_structure['sample_description_table'][$i]['video_pixel_color_depth'];
 											$info['quicktime']['video']['color_depth_name']    = $atom_structure['sample_description_table'][$i]['video_pixel_color_name'];
 
@@ -1598,33 +1624,61 @@ $this->warning('incomplete/incorrect handling of "stsd" with Parrot metadata in
 					break;
 
 				case 'NCDT':
-					// http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html
+					// https://exiftool.org/TagNames/Nikon.html
 					// Nikon-specific QuickTime tags found in the NCDT atom of MOV videos from some Nikon cameras such as the Coolpix S8000 and D5100
 					$atom_structure['subatoms'] = $this->QuicktimeParseContainerAtom($atom_data, $baseoffset + 4, $atomHierarchy, $ParseAllPossibleAtoms);
 					break;
 				case 'NCTH': // Nikon Camera THumbnail image
 				case 'NCVW': // Nikon Camera preVieW image
-					// http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html
+				case 'NCM1': // Nikon Camera preview iMage 1
+				case 'NCM2': // Nikon Camera preview iMage 2
+					// https://exiftool.org/TagNames/Nikon.html
 					if (preg_match('/^\xFF\xD8\xFF/', $atom_data)) {
+						$descriptions = array(
+							'NCTH' => 'Nikon Camera Thumbnail Image',
+							'NCVW' => 'Nikon Camera Preview Image',
+							'NCM1' => 'Nikon Camera Preview Image 1',
+							'NCM2' => 'Nikon Camera Preview Image 2',
+						);
 						$atom_structure['data'] = $atom_data;
 						$atom_structure['image_mime'] = 'image/jpeg';
-						$atom_structure['description'] = (($atomname == 'NCTH') ? 'Nikon Camera Thumbnail Image' : (($atomname == 'NCVW') ? 'Nikon Camera Preview Image' : 'Nikon preview image'));
-						$info['quicktime']['comments']['picture'][] = array('image_mime'=>$atom_structure['image_mime'], 'data'=>$atom_data, 'description'=>$atom_structure['description']);
+						$atom_structure['description'] = isset($descriptions[$atomname]) ? $descriptions[$atomname] : 'Nikon preview image';
+						$info['quicktime']['comments']['picture'][] = array(
+							'image_mime' => $atom_structure['image_mime'],
+							'data' => $atom_data,
+							'description' => $atom_structure['description']
+						);
 					}
 					break;
-				case 'NCTG': // Nikon - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#NCTG
-					$atom_structure['data'] = $this->QuicktimeParseNikonNCTG($atom_data);
+				case 'NCTG': // Nikon - https://exiftool.org/TagNames/Nikon.html#NCTG
+					getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.nikon-nctg.php', __FILE__, true);
+					$nikonNCTG = new getid3_tag_nikon_nctg($this->getid3);
+
+					$atom_structure['data'] = $nikonNCTG->parse($atom_data);
+					break;
+				case 'NCHD': // Nikon:MakerNoteVersion  - https://exiftool.org/TagNames/Nikon.html
+					$makerNoteVersion = '';
+					for ($i = 0, $iMax = strlen($atom_data); $i < $iMax; ++$i) {
+						if (ord($atom_data[$i]) >= 0x00 && ord($atom_data[$i]) <= 0x1F) {
+							$makerNoteVersion .= ' '.ord($atom_data[$i]);
+						} else {
+							$makerNoteVersion .= $atom_data[$i];
+						}
+					}
+					$makerNoteVersion = rtrim($makerNoteVersion, "\x00");
+					$atom_structure['data'] = array(
+						'MakerNoteVersion' => $makerNoteVersion
+					);
 					break;
-				case 'NCHD': // Nikon:MakerNoteVersion  - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html
-				case 'NCDB': // Nikon                   - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html
-				case 'CNCV': // Canon:CompressorVersion - http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Canon.html
+				case 'NCDB': // Nikon                   - https://exiftool.org/TagNames/Nikon.html
+				case 'CNCV': // Canon:CompressorVersion - https://exiftool.org/TagNames/Canon.html
 					$atom_structure['data'] = $atom_data;
 					break;
 
 				case "\x00\x00\x00\x00":
 					// some kind of metacontainer, may contain a big data dump such as:
 					// mdta keys \005 mdtacom.apple.quicktime.make (mdtacom.apple.quicktime.creationdate ,mdtacom.apple.quicktime.location.ISO6709 $mdtacom.apple.quicktime.software !mdtacom.apple.quicktime.model ilst \01D \001 \015data \001DE\010Apple 0 \002 (data \001DE\0102011-05-11T17:54:04+0200 2 \003 *data \001DE\010+52.4936+013.3897+040.247/ \01D \004 \015data \001DE\0104.3.1 \005 \018data \001DE\010iPhone 4
-					// http://www.geocities.com/xhelmboyx/quicktime/formats/qti-layout.txt
+					// https://xhelmboyx.tripod.com/formats/qti-layout.txt
 
 					$atom_structure['version']   =          getid3_lib::BigEndian2Int(substr($atom_data, 0, 1));
 					$atom_structure['flags_raw'] =          getid3_lib::BigEndian2Int(substr($atom_data, 1, 3));
@@ -1721,6 +1775,7 @@ $this->warning('incomplete/incorrect handling of "stsd" with Parrot metadata in
 									'unknown_data'   => array(),
 									'debug_list'     => '',      // Used to debug variables stored as comma delimited strings
 							);
+							$debug_structure = array();
 							$debug_structure['debug_items'] = array();
 							// Can start loop here to decode all sensor data in 32 Byte chunks:
 							foreach (str_split($atom_SENSOR_data, 32) as $sensor_key => $sensor_data) {
@@ -2039,7 +2094,7 @@ $this->warning('incomplete/incorrect handling of "stsd" with Parrot metadata in
 	 * @return array|false
 	 */
 	public function QuicktimeParseContainerAtom($atom_data, $baseoffset, &$atomHierarchy, $ParseAllPossibleAtoms) {
-		$atom_structure  = false;
+		$atom_structure = array();
 		$subatomoffset  = 0;
 		$subatomcounter = 0;
 		if ((strlen($atom_data) == 4) && (getid3_lib::BigEndian2Int($atom_data) == 0x00000000)) {
@@ -2057,17 +2112,22 @@ $this->warning('incomplete/incorrect handling of "stsd" with Parrot metadata in
 					$subatomoffset += 4;
 					continue;
 				}
-				return $atom_structure;
+				break;
 			}
 			if (strlen($subatomdata) < ($subatomsize - 8)) {
 			    // we don't have enough data to decode the subatom.
 			    // this may be because we are refusing to parse large subatoms, or it may be because this atom had its size set too large
 			    // so we passed in the start of a following atom incorrectly?
-			    return $atom_structure;
+			    break;
 			}
 			$atom_structure[$subatomcounter++] = $this->QuicktimeParseAtom($subatomname, $subatomsize, $subatomdata, $baseoffset + $subatomoffset, $atomHierarchy, $ParseAllPossibleAtoms);
 			$subatomoffset += $subatomsize;
 		}
+
+		if (empty($atom_structure)) {
+			return false;
+		}
+
 		return $atom_structure;
 	}
 
@@ -2552,8 +2612,9 @@ $this->warning('incomplete/incorrect handling of "stsd" with Parrot metadata in
 		static $QuicktimeContentRatingLookup = array();
 		if (empty($QuicktimeContentRatingLookup)) {
 			$QuicktimeContentRatingLookup[0]  = 'None';
+			$QuicktimeContentRatingLookup[1]  = 'Explicit';
 			$QuicktimeContentRatingLookup[2]  = 'Clean';
-			$QuicktimeContentRatingLookup[4]  = 'Explicit';
+			$QuicktimeContentRatingLookup[4]  = 'Explicit (old)';
 		}
 		return (isset($QuicktimeContentRatingLookup[$rtng]) ? $QuicktimeContentRatingLookup[$rtng] : 'invalid');
 	}
@@ -2606,189 +2667,6 @@ $this->warning('incomplete/incorrect handling of "stsd" with Parrot metadata in
 		return (isset($QuicktimeStoreFrontCodeLookup[$sfid]) ? $QuicktimeStoreFrontCodeLookup[$sfid] : 'invalid');
 	}
 
-	/**
-	 * @param string $atom_data
-	 *
-	 * @return array
-	 */
-	public function QuicktimeParseNikonNCTG($atom_data) {
-		// http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#NCTG
-		// Nikon-specific QuickTime tags found in the NCDT atom of MOV videos from some Nikon cameras such as the Coolpix S8000 and D5100
-		// Data is stored as records of:
-		// * 4 bytes record type
-		// * 2 bytes size of data field type:
-		//     0x0001 = flag   (size field *= 1-byte)
-		//     0x0002 = char   (size field *= 1-byte)
-		//     0x0003 = DWORD+ (size field *= 2-byte), values are stored CDAB
-		//     0x0004 = QWORD+ (size field *= 4-byte), values are stored EFGHABCD
-		//     0x0005 = float  (size field *= 8-byte), values are stored aaaabbbb where value is aaaa/bbbb; possibly multiple sets of values appended together
-		//     0x0007 = bytes  (size field *= 1-byte), values are stored as ??????
-		//     0x0008 = ?????  (size field *= 2-byte), values are stored as ??????
-		// * 2 bytes data size field
-		// * ? bytes data (string data may be null-padded; datestamp fields are in the format "2011:05:25 20:24:15")
-		// all integers are stored BigEndian
-
-		$NCTGtagName = array(
-			0x00000001 => 'Make',
-			0x00000002 => 'Model',
-			0x00000003 => 'Software',
-			0x00000011 => 'CreateDate',
-			0x00000012 => 'DateTimeOriginal',
-			0x00000013 => 'FrameCount',
-			0x00000016 => 'FrameRate',
-			0x00000022 => 'FrameWidth',
-			0x00000023 => 'FrameHeight',
-			0x00000032 => 'AudioChannels',
-			0x00000033 => 'AudioBitsPerSample',
-			0x00000034 => 'AudioSampleRate',
-			0x02000001 => 'MakerNoteVersion',
-			0x02000005 => 'WhiteBalance',
-			0x0200000b => 'WhiteBalanceFineTune',
-			0x0200001e => 'ColorSpace',
-			0x02000023 => 'PictureControlData',
-			0x02000024 => 'WorldTime',
-			0x02000032 => 'UnknownInfo',
-			0x02000083 => 'LensType',
-			0x02000084 => 'Lens',
-		);
-
-		$offset = 0;
-		$data = null;
-		$datalength = strlen($atom_data);
-		$parsed = array();
-		while ($offset < $datalength) {
-			$record_type       = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 4));  $offset += 4;
-			$data_size_type    = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 2));  $offset += 2;
-			$data_size         = getid3_lib::BigEndian2Int(substr($atom_data, $offset, 2));  $offset += 2;
-			switch ($data_size_type) {
-				case 0x0001: // 0x0001 = flag   (size field *= 1-byte)
-					$data = getid3_lib::BigEndian2Int(substr($atom_data, $offset, $data_size * 1));
-					$offset += ($data_size * 1);
-					break;
-				case 0x0002: // 0x0002 = char   (size field *= 1-byte)
-					$data = substr($atom_data, $offset, $data_size * 1);
-					$offset += ($data_size * 1);
-					$data = rtrim($data, "\x00");
-					break;
-				case 0x0003: // 0x0003 = DWORD+ (size field *= 2-byte), values are stored CDAB
-					$data = '';
-					for ($i = $data_size - 1; $i >= 0; $i--) {
-						$data .= substr($atom_data, $offset + ($i * 2), 2);
-					}
-					$data = getid3_lib::BigEndian2Int($data);
-					$offset += ($data_size * 2);
-					break;
-				case 0x0004: // 0x0004 = QWORD+ (size field *= 4-byte), values are stored EFGHABCD
-					$data = '';
-					for ($i = $data_size - 1; $i >= 0; $i--) {
-						$data .= substr($atom_data, $offset + ($i * 4), 4);
-					}
-					$data = getid3_lib::BigEndian2Int($data);
-					$offset += ($data_size * 4);
-					break;
-				case 0x0005: // 0x0005 = float  (size field *= 8-byte), values are stored aaaabbbb where value is aaaa/bbbb; possibly multiple sets of values appended together
-					$data = array();
-					for ($i = 0; $i < $data_size; $i++) {
-						$numerator    = getid3_lib::BigEndian2Int(substr($atom_data, $offset + ($i * 8) + 0, 4));
-						$denomninator = getid3_lib::BigEndian2Int(substr($atom_data, $offset + ($i * 8) + 4, 4));
-						if ($denomninator == 0) {
-							$data[$i] = false;
-						} else {
-							$data[$i] = (double) $numerator / $denomninator;
-						}
-					}
-					$offset += (8 * $data_size);
-					if (count($data) == 1) {
-						$data = $data[0];
-					}
-					break;
-				case 0x0007: // 0x0007 = bytes  (size field *= 1-byte), values are stored as ??????
-					$data = substr($atom_data, $offset, $data_size * 1);
-					$offset += ($data_size * 1);
-					break;
-				case 0x0008: // 0x0008 = ?????  (size field *= 2-byte), values are stored as ??????
-					$data = substr($atom_data, $offset, $data_size * 2);
-					$offset += ($data_size * 2);
-					break;
-				default:
-					echo 'QuicktimeParseNikonNCTG()::unknown $data_size_type: '.$data_size_type.'<br>';
-					break 2;
-			}
-
-			switch ($record_type) {
-				case 0x00000011: // CreateDate
-				case 0x00000012: // DateTimeOriginal
-					$data = strtotime($data);
-					break;
-				case 0x0200001e: // ColorSpace
-					switch ($data) {
-						case 1:
-							$data = 'sRGB';
-							break;
-						case 2:
-							$data = 'Adobe RGB';
-							break;
-					}
-					break;
-				case 0x02000023: // PictureControlData
-					$PictureControlAdjust = array(0=>'default', 1=>'quick', 2=>'full');
-					$FilterEffect = array(0x80=>'off', 0x81=>'yellow', 0x82=>'orange',    0x83=>'red', 0x84=>'green',  0xff=>'n/a');
-					$ToningEffect = array(0x80=>'b&w', 0x81=>'sepia',  0x82=>'cyanotype', 0x83=>'red', 0x84=>'yellow', 0x85=>'green', 0x86=>'blue-green', 0x87=>'blue', 0x88=>'purple-blue', 0x89=>'red-purple', 0xff=>'n/a');
-					$data = array(
-						'PictureControlVersion'     =>                           substr($data,  0,  4),
-						'PictureControlName'        =>                     rtrim(substr($data,  4, 20), "\x00"),
-						'PictureControlBase'        =>                     rtrim(substr($data, 24, 20), "\x00"),
-						//'?'                       =>                           substr($data, 44,  4),
-						'PictureControlAdjust'      => $PictureControlAdjust[ord(substr($data, 48,  1))],
-						'PictureControlQuickAdjust' =>                       ord(substr($data, 49,  1)),
-						'Sharpness'                 =>                       ord(substr($data, 50,  1)),
-						'Contrast'                  =>                       ord(substr($data, 51,  1)),
-						'Brightness'                =>                       ord(substr($data, 52,  1)),
-						'Saturation'                =>                       ord(substr($data, 53,  1)),
-						'HueAdjustment'             =>                       ord(substr($data, 54,  1)),
-						'FilterEffect'              =>         $FilterEffect[ord(substr($data, 55,  1))],
-						'ToningEffect'              =>         $ToningEffect[ord(substr($data, 56,  1))],
-						'ToningSaturation'          =>                       ord(substr($data, 57,  1)),
-					);
-					break;
-				case 0x02000024: // WorldTime
-					// http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#WorldTime
-					// timezone is stored as offset from GMT in minutes
-					$timezone = getid3_lib::BigEndian2Int(substr($data, 0, 2));
-					if ($timezone & 0x8000) {
-						$timezone = 0 - (0x10000 - $timezone);
-					}
-					$timezone /= 60;
-
-					$dst = (bool) getid3_lib::BigEndian2Int(substr($data, 2, 1));
-					switch (getid3_lib::BigEndian2Int(substr($data, 3, 1))) {
-						case 2:
-							$datedisplayformat = 'D/M/Y'; break;
-						case 1:
-							$datedisplayformat = 'M/D/Y'; break;
-						case 0:
-						default:
-							$datedisplayformat = 'Y/M/D'; break;
-					}
-
-					$data = array('timezone'=>floatval($timezone), 'dst'=>$dst, 'display'=>$datedisplayformat);
-					break;
-				case 0x02000083: // LensType
-					$data = array(
-						//'_'  => $data,
-						'mf' => (bool) ($data & 0x01),
-						'd'  => (bool) ($data & 0x02),
-						'g'  => (bool) ($data & 0x04),
-						'vr' => (bool) ($data & 0x08),
-					);
-					break;
-			}
-			$tag_name = (isset($NCTGtagName[$record_type]) ? $NCTGtagName[$record_type] : '0x'.str_pad(dechex($record_type), 8, '0', STR_PAD_LEFT));
-			$parsed[$tag_name] = $data;
-		}
-		return $parsed;
-	}
-
 	/**
 	 * @param string $keyname
 	 * @param string|array $data
diff --git a/src/wp-includes/ID3/module.audio-video.riff.php b/src/wp-includes/ID3/module.audio-video.riff.php
index cdf553386b..6ef1116ad1 100644
--- a/src/wp-includes/ID3/module.audio-video.riff.php
+++ b/src/wp-includes/ID3/module.audio-video.riff.php
@@ -56,6 +56,7 @@ class getid3_riff extends getid3_handler
 		$thisfile_riff_video       = &$thisfile_riff['video'];
 		$thisfile_riff_WAVE        = array();
 
+		$Original                 = array();
 		$Original['avdataoffset'] = $info['avdataoffset'];
 		$Original['avdataend']    = $info['avdataend'];
 
@@ -296,9 +297,18 @@ class getid3_riff extends getid3_handler
 					// shortcut
 					$thisfile_riff_WAVE_bext_0 = &$thisfile_riff_WAVE['bext'][0];
 
-					$thisfile_riff_WAVE_bext_0['title']          =                         trim(substr($thisfile_riff_WAVE_bext_0['data'],   0, 256));
-					$thisfile_riff_WAVE_bext_0['author']         =                         trim(substr($thisfile_riff_WAVE_bext_0['data'], 256,  32));
-					$thisfile_riff_WAVE_bext_0['reference']      =                         trim(substr($thisfile_riff_WAVE_bext_0['data'], 288,  32));
+					$thisfile_riff_WAVE_bext_0['title']          =                              substr($thisfile_riff_WAVE_bext_0['data'],   0, 256);
+					$thisfile_riff_WAVE_bext_0['author']         =                              substr($thisfile_riff_WAVE_bext_0['data'], 256,  32);
+					$thisfile_riff_WAVE_bext_0['reference']      =                              substr($thisfile_riff_WAVE_bext_0['data'], 288,  32);
+					foreach (array('title','author','reference') as $bext_key) {
+						// Some software (notably Logic Pro) may not blank existing data before writing a null-terminated string to the offsets
+						// assigned for text fields, resulting in a null-terminated string (or possibly just a single null) followed by garbage
+						// Keep only string as far as first null byte, discard rest of fixed-width data
+						// https://github.com/JamesHeinrich/getID3/issues/263
+						$null_terminator_offset = strpos($thisfile_riff_WAVE_bext_0[$bext_key], "\x00");
+						$thisfile_riff_WAVE_bext_0[$bext_key] = substr($thisfile_riff_WAVE_bext_0[$bext_key], 0, $null_terminator_offset);
+					}
+
 					$thisfile_riff_WAVE_bext_0['origin_date']    =                              substr($thisfile_riff_WAVE_bext_0['data'], 320,  10);
 					$thisfile_riff_WAVE_bext_0['origin_time']    =                              substr($thisfile_riff_WAVE_bext_0['data'], 330,   8);
 					$thisfile_riff_WAVE_bext_0['time_reference'] = getid3_lib::LittleEndian2Int(substr($thisfile_riff_WAVE_bext_0['data'], 338,   8));
@@ -307,6 +317,7 @@ class getid3_riff extends getid3_handler
 					$thisfile_riff_WAVE_bext_0['coding_history'] =         explode("\r\n", trim(substr($thisfile_riff_WAVE_bext_0['data'], 601)));
 					if (preg_match('#^([0-9]{4}).([0-9]{2}).([0-9]{2})$#', $thisfile_riff_WAVE_bext_0['origin_date'], $matches_bext_date)) {
 						if (preg_match('#^([0-9]{2}).([0-9]{2}).([0-9]{2})$#', $thisfile_riff_WAVE_bext_0['origin_time'], $matches_bext_time)) {
+							$bext_timestamp = array();
 							list($dummy, $bext_timestamp['year'], $bext_timestamp['month'],  $bext_timestamp['day'])    = $matches_bext_date;
 							list($dummy, $bext_timestamp['hour'], $bext_timestamp['minute'], $bext_timestamp['second']) = $matches_bext_time;
 							$thisfile_riff_WAVE_bext_0['origin_date_unix'] = gmmktime($bext_timestamp['hour'], $bext_timestamp['minute'], $bext_timestamp['second'], $bext_timestamp['month'], $bext_timestamp['day'], $bext_timestamp['year']);
@@ -451,7 +462,62 @@ class getid3_riff extends getid3_handler
 					}
 				}
 
+				if (isset($thisfile_riff_WAVE['guan'][0]['data'])) {
+					// shortcut
+					$thisfile_riff_WAVE_guan_0 = &$thisfile_riff_WAVE['guan'][0];
+					if (!empty($thisfile_riff_WAVE_guan_0['data']) && (substr($thisfile_riff_WAVE_guan_0['data'], 0, 14) == 'GUANO|Version:')) {
+						$thisfile_riff['guano'] = array();
+						foreach (explode("\n", $thisfile_riff_WAVE_guan_0['data']) as $line) {
+							if ($line) {
+								@list($key, $value) = explode(':', $line, 2);
+								if (substr($value, 0, 3) == '[{"') {
+									if ($decoded = @json_decode($value, true)) {
+										if (!empty($decoded) && (count($decoded) == 1)) {
+											$value = $decoded[0];
+										} else {
+											$value = $decoded;
+										}
+									}
+								}
+								$thisfile_riff['guano'] = array_merge_recursive($thisfile_riff['guano'], getid3_lib::CreateDeepArray($key, '|', $value));
+							}
+						}
+
+						// https://www.wildlifeacoustics.com/SCHEMA/GUANO.html
+						foreach ($thisfile_riff['guano'] as $key => $value) {
+							switch ($key) {
+								case 'Loc Position':
+									if (preg_match('#^([\\+\\-]?[0-9]+\\.[0-9]+) ([\\+\\-]?[0-9]+\\.[0-9]+)$#', $value, $matches)) {
+										list($dummy, $latitude, $longitude) = $matches;
+										$thisfile_riff['comments']['gps_latitude'][0]  = floatval($latitude);
+										$thisfile_riff['comments']['gps_longitude'][0] = floatval($longitude);
+										$thisfile_riff['guano'][$key] = floatval($latitude).' '.floatval($longitude);
+									}
+									break;
+								case 'Loc Elevation': // Elevation/altitude above mean sea level in meters
+									$thisfile_riff['comments']['gps_altitude'][0] = floatval($value);
+									$thisfile_riff['guano'][$key] = (float) $value;
+									break;
+								case 'Filter HP':        // High-pass filter frequency in kHz
+								case 'Filter LP':        // Low-pass filter frequency in kHz
+								case 'Humidity':         // Relative humidity as a percentage
+								case 'Length':           // Recording length in seconds
+								case 'Loc Accuracy':     // Estimated Position Error in meters
+								case 'Temperature Ext':  // External temperature in degrees Celsius outside the recorder's housing
+								case 'Temperature Int':  // Internal temperature in degrees Celsius inside the recorder's housing
+									$thisfile_riff['guano'][$key] = (float) $value;
+									break;
+								case 'Samplerate':       // Recording sample rate, Hz
+								case 'TE':               // Time-expansion factor. If not specified, then 1 (no time-expansion a.k.a. direct-recording) is assumed.
+									$thisfile_riff['guano'][$key] = (int) $value;
+									break;
+							}
+						}
 
+					} else {
+						$this->warning('RIFF.guan data not in expected format');
+					}
+				}
 
 				if (!isset($thisfile_audio['bitrate']) && isset($thisfile_riff_audio[$streamindex]['bitrate'])) {
 					$thisfile_audio['bitrate'] = $thisfile_riff_audio[$streamindex]['bitrate'];
@@ -733,6 +799,7 @@ class getid3_riff extends getid3_handler
 				}
 				if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strh'][0]['data'])) {
 					if (is_array($thisfile_riff['AVI ']['hdrl']['strl']['strh'])) {
+						$thisfile_riff_raw_strf_strhfccType_streamindex = null;
 						for ($i = 0; $i < count($thisfile_riff['AVI ']['hdrl']['strl']['strh']); $i++) {
 							if (isset($thisfile_riff['AVI ']['hdrl']['strl']['strh'][$i]['data'])) {
 								$strhData = $thisfile_riff['AVI ']['hdrl']['strl']['strh'][$i]['data'];
@@ -1069,7 +1136,7 @@ class getid3_riff extends getid3_handler
 				if (isset($thisfile_riff[$RIFFsubtype]['ID3 '])) {
 					getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true);
 					$getid3_temp = new getID3();
-					$getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp);
+					$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
 					$getid3_id3v2 = new getid3_id3v2($getid3_temp);
 					$getid3_id3v2->StartingOffset = $thisfile_riff[$RIFFsubtype]['ID3 '][0]['offset'] + 8;
 					if ($thisfile_riff[$RIFFsubtype]['ID3 '][0]['valid'] = $getid3_id3v2->Analyze()) {
@@ -1172,7 +1239,7 @@ class getid3_riff extends getid3_handler
 					getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.audio-video.mpeg.php', __FILE__, true);
 
 					$getid3_temp = new getID3();
-					$getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp);
+					$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
 					$getid3_mpeg = new getid3_mpeg($getid3_temp);
 					$getid3_mpeg->Analyze();
 					if (empty($getid3_temp->info['error'])) {
@@ -1258,7 +1325,7 @@ class getid3_riff extends getid3_handler
 					getid3_lib::IncludeDependency(GETID3_INCLUDEPATH.'module.tag.id3v2.php', __FILE__, true);
 
 					$getid3_temp = new getID3();
-					$getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp);
+					$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
 					$getid3_id3v2 = new getid3_id3v2($getid3_temp);
 					$getid3_id3v2->StartingOffset = $thisfile_riff[$RIFFsubtype]['id3 '][0]['offset'] + 8;
 					if ($thisfile_riff[$RIFFsubtype]['id3 '][0]['valid'] = $getid3_id3v2->Analyze()) {
@@ -1514,6 +1581,9 @@ class getid3_riff extends getid3_handler
 
 		$RIFFchunk = false;
 		$FoundAllChunksWeNeed = false;
+		$LISTchunkParent = null;
+		$LISTchunkMaxOffset = null;
+		$AC3syncwordBytes = pack('n', getid3_ac3::syncword); // 0x0B77 -> "\x0B\x77"
 
 		try {
 			$this->fseek($startoffset);
@@ -1557,7 +1627,7 @@ class getid3_riff extends getid3_handler
 										// MP3
 										if (getid3_mp3::MPEGaudioHeaderBytesValid($FirstFourBytes)) {
 											$getid3_temp = new getID3();
-											$getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp);
+											$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
 											$getid3_temp->info['avdataoffset'] = $this->ftell() - 4;
 											$getid3_temp->info['avdataend']    = $this->ftell() + $AudioChunkSize;
 											$getid3_mp3 = new getid3_mp3($getid3_temp, __CLASS__);
@@ -1575,11 +1645,10 @@ class getid3_riff extends getid3_handler
 											unset($getid3_temp, $getid3_mp3);
 										}
 
-									} elseif (strpos($FirstFourBytes, getid3_ac3::syncword) === 0) {
-
+									} elseif (strpos($FirstFourBytes, $AC3syncwordBytes) === 0) {
 										// AC3
 										$getid3_temp = new getID3();
-										$getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp);
+										$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
 										$getid3_temp->info['avdataoffset'] = $this->ftell() - 4;
 										$getid3_temp->info['avdataend']    = $this->ftell() + $AudioChunkSize;
 										$getid3_ac3 = new getid3_ac3($getid3_temp);
@@ -1640,7 +1709,7 @@ class getid3_riff extends getid3_handler
 									// Probably is MP3 data
 									if (getid3_mp3::MPEGaudioHeaderBytesValid(substr($testData, 0, 4))) {
 										$getid3_temp = new getID3();
-										$getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp);
+										$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
 										$getid3_temp->info['avdataoffset'] = $info['avdataoffset'];
 										$getid3_temp->info['avdataend']    = $info['avdataend'];
 										$getid3_mp3 = new getid3_mp3($getid3_temp, __CLASS__);
@@ -1652,12 +1721,12 @@ class getid3_riff extends getid3_handler
 										unset($getid3_temp, $getid3_mp3);
 									}
 
-								} elseif (($isRegularAC3 = (substr($testData, 0, 2) == getid3_ac3::syncword)) || substr($testData, 8, 2) == strrev(getid3_ac3::syncword)) {
+								} elseif (($isRegularAC3 = (substr($testData, 0, 2) == $AC3syncwordBytes)) || substr($testData, 8, 2) == strrev($AC3syncwordBytes)) {
 
 									// This is probably AC-3 data
 									$getid3_temp = new getID3();
 									if ($isRegularAC3) {
-										$getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp);
+										$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
 										$getid3_temp->info['avdataoffset'] = $info['avdataoffset'];
 										$getid3_temp->info['avdataend']    = $info['avdataend'];
 									}
@@ -1673,6 +1742,8 @@ class getid3_riff extends getid3_handler
 											$ac3_data .= substr($testData, 8 + $i + 1, 1);
 											$ac3_data .= substr($testData, 8 + $i + 0, 1);
 										}
+										$getid3_ac3->getid3->info['avdataoffset'] = 0;
+										$getid3_ac3->getid3->info['avdataend']    = strlen($ac3_data);
 										$getid3_ac3->AnalyzeString($ac3_data);
 									}
 
@@ -1691,7 +1762,7 @@ class getid3_riff extends getid3_handler
 
 									// This is probably DTS data
 									$getid3_temp = new getID3();
-									$getid3_temp->openfile($this->getid3->filename, null, $this->getid3->fp);
+									$getid3_temp->openfile($this->getid3->filename, $this->getid3->info['filesize'], $this->getid3->fp);
 									$getid3_temp->info['avdataoffset'] = $info['avdataoffset'];
 									$getid3_dts = new getid3_dts($getid3_temp);
 									$getid3_dts->Analyze();
@@ -1732,6 +1803,8 @@ class getid3_riff extends getid3_handler
 							case 'indx':
 							case 'MEXT':
 							case 'DISP':
+							case 'wamd':
+							case 'guan':
 								// always read data in
 							case 'JUNK':
 								// should be: never read data in
@@ -2076,6 +2149,7 @@ class getid3_riff extends getid3_handler
 	 */
 	public static function ParseBITMAPINFOHEADER($BITMAPINFOHEADER, $littleEndian=true) {
 
+		$parsed                    = array();
 		$parsed['biSize']          = substr($BITMAPINFOHEADER,  0, 4); // number of bytes required by the BITMAPINFOHEADER structure
 		$parsed['biWidth']         = substr($BITMAPINFOHEADER,  4, 4); // width of the bitmap in pixels
 		$parsed['biHeight']        = substr($BITMAPINFOHEADER,  8, 4); // height of the bitmap in pixels. If biHeight is positive, the bitmap is a 'bottom-up' DIB and its origin is the lower left corner. If biHeight is negative, the bitmap is a 'top-down' DIB and its origin is the upper left corner
diff --git a/src/wp-includes/ID3/module.audio.flac.php b/src/wp-includes/ID3/module.audio.flac.php
index 1cea4364c2..014061da94 100644
--- a/src/wp-includes/ID3/module.audio.flac.php
+++ b/src/wp-includes/ID3/module.audio.flac.php
@@ -402,6 +402,7 @@ class getid3_flac extends getid3_handler
 	public function parsePICTURE() {
 		$info = &$this->getid3->info;
 
+		$picture = array();
 		$picture['typeid']         = getid3_lib::BigEndian2Int($this->fread(4));
 		$picture['picturetype']    = self::pictureTypeLookup($picture['typeid']);
 		$picture['image_mime']     = $this->fread(getid3_lib::BigEndian2Int($this->fread(4)));
diff --git a/src/wp-includes/ID3/module.audio.mp3.php b/src/wp-includes/ID3/module.audio.mp3.php
index 26b28068f8..1f5a566b83 100644
--- a/src/wp-includes/ID3/module.audio.mp3.php
+++ b/src/wp-includes/ID3/module.audio.mp3.php
@@ -18,12 +18,6 @@ if (!defined('GETID3_INCLUDEPATH')) { // prevent path-exposing attacks that acce
 	exit;
 }
 
-// number of frames to scan to determine if MPEG-audio sequence is valid
-// Lower this number to 5-20 for faster scanning
-// Increase this number to 50+ for most accurate detection of valid VBR/CBR
-// mpeg-audio streams
-define('GETID3_MP3_VALID_CHECK_FRAMES', 35);
-
 
 class getid3_mp3 extends getid3_handler
 {
@@ -35,6 +29,15 @@ class getid3_mp3 extends getid3_handler
 	 */
 	public $allow_bruteforce = false;
 
+	/**
+	 * number of frames to scan to determine if MPEG-audio sequence is valid
+	 * Lower this number to 5-20 for faster scanning
+	 * Increase this number to 50+ for most accurate detection of valid VBR/CBR mpeg-audio streams
+	 *
+	 * @var int
+	 */
+	public $mp3_valid_check_frames = 50;
+
 	/**
 	 * @return bool
 	 */
@@ -55,6 +58,7 @@ class getid3_mp3 extends getid3_handler
 			$info['audio']['bitrate_mode'] = strtolower($info['mpeg']['audio']['bitrate_mode']);
 		}
 
+		$CurrentDataLAMEversionString = null;
 		if (((isset($info['id3v2']['headerlength']) && ($info['avdataoffset'] > $info['id3v2']['headerlength'])) || (!isset($info['id3v2']) && ($info['avdataoffset'] > 0) && ($info['avdataoffset'] != $initialOffset)))) {
 
 			$synchoffsetwarning = 'Unknown data before synch ';
@@ -121,6 +125,12 @@ class getid3_mp3 extends getid3_handler
 				if (substr($PossiblyLongerLAMEversion_String, 0, strlen($CurrentDataLAMEversionString)) == $CurrentDataLAMEversionString) {
 					$PossiblyLongerLAMEversion_NewString = substr($PossiblyLongerLAMEversion_String, 0, strspn($PossiblyLongerLAMEversion_String, 'LAME0123456789., (abcdefghijklmnopqrstuvwxyzJFSOND)')); //"LAME3.90.3"  "LAME3.87 (beta 1, Sep 27 2000)" "LAME3.88 (beta)"
 					if (empty($info['audio']['encoder']) || (strlen($PossiblyLongerLAMEversion_NewString) > strlen($info['audio']['encoder']))) {
+						if (!empty($info['audio']['encoder']) && !empty($info['mpeg']['audio']['LAME']['short_version']) && ($info['audio']['encoder'] == $info['mpeg']['audio']['LAME']['short_version'])) {
+							if (preg_match('#^LAME[0-9\\.]+#', $PossiblyLongerLAMEversion_NewString, $matches)) {
+								// "LAME3.100" -> "LAME3.100.1", but avoid including "(alpha)" and similar
+								$info['mpeg']['audio']['LAME']['short_version'] = $matches[0];
+							}
+						}
 						$info['audio']['encoder'] = $PossiblyLongerLAMEversion_NewString;
 					}
 				}
@@ -295,7 +305,7 @@ class getid3_mp3 extends getid3_handler
 		} elseif (!empty($info['audio']['bitrate'])) {
 
 			if ($info['audio']['bitrate_mode'] == 'cbr') {
-				$encoder_options = strtoupper($info['audio']['bitrate_mode']).ceil($info['audio']['bitrate'] / 1000);
+				$encoder_options = strtoupper($info['audio']['bitrate_mode']).round($info['audio']['bitrate'] / 1000);
 			} else {
 				$encoder_options = strtoupper($info['audio']['bitrate_mode']);
 			}
@@ -488,7 +498,7 @@ class getid3_mp3 extends getid3_handler
 		if ($MPEGaudioHeaderValidCache[$head4_key]) {
 			$thisfile_mpeg_audio['raw'] = $MPEGheaderRawArray;
 		} else {
-			$this->error('Invalid MPEG audio header ('.getid3_lib::PrintHexBytes($head4).') at offset '.$offset);
+			$this->warning('Invalid MPEG audio header ('.getid3_lib::PrintHexBytes($head4).') at offset '.$offset);
 			return false;
 		}
 
@@ -722,197 +732,200 @@ class getid3_mp3 extends getid3_handler
 
 					$thisfile_mpeg_audio_lame['long_version']  = substr($headerstring, $VBRidOffset + 120, 20);
 					$thisfile_mpeg_audio_lame['short_version'] = substr($thisfile_mpeg_audio_lame['long_version'], 0, 9);
-					$thisfile_mpeg_audio_lame['numeric_version'] = str_replace('LAME', '', $thisfile_mpeg_audio_lame['short_version']);
-					if (preg_match('#^LAME([0-9\\.a-z]+)#', $thisfile_mpeg_audio_lame['long_version'], $matches)) {
+
+					//$thisfile_mpeg_audio_lame['numeric_version'] = str_replace('LAME', '', $thisfile_mpeg_audio_lame['short_version']);
+					$thisfile_mpeg_audio_lame['numeric_version'] = '';
+					if (preg_match('#^LAME([0-9\\.a-z]*)#', $thisfile_mpeg_audio_lame['long_version'], $matches)) {
 						$thisfile_mpeg_audio_lame['short_version']   = $matches[0];
 						$thisfile_mpeg_audio_lame['numeric_version'] = $matches[1];
 					}
-					foreach (explode('.', $thisfile_mpeg_audio_lame['numeric_version']) as $key => $number) {
-						$thisfile_mpeg_audio_lame['integer_version'][$key] = intval($number);
-					}
-
-					//if ($thisfile_mpeg_audio_lame['short_version'] >= 'LAME3.90') {
-					if ((($thisfile_mpeg_audio_lame['integer_version'][0] * 1000) + $thisfile_mpeg_audio_lame['integer_version'][1]) >= 3090) { // cannot use string version compare, may have "LAME3.90" or "LAME3.100" -- see https://github.com/JamesHeinrich/getID3/issues/207
-
-						// extra 11 chars are not part of version string when LAMEtag present
-						unset($thisfile_mpeg_audio_lame['long_version']);
-
-						// It the LAME tag was only introduced in LAME v3.90
-						// http://www.hydrogenaudio.org/?act=ST&f=15&t=9933
-
-						// Offsets of various bytes in http://gabriel.mp3-tech.org/mp3infotag.html
-						// are assuming a 'Xing' identifier offset of 0x24, which is the case for
-						// MPEG-1 non-mono, but not for other combinations
-						$LAMEtagOffsetContant = $VBRidOffset - 0x24;
-
-						// shortcuts
-						$thisfile_mpeg_audio_lame['RGAD']    = array('track'=>array(), 'album'=>array());
-						$thisfile_mpeg_audio_lame_RGAD       = &$thisfile_mpeg_audio_lame['RGAD'];
-						$thisfile_mpeg_audio_lame_RGAD_track = &$thisfile_mpeg_audio_lame_RGAD['track'];
-						$thisfile_mpeg_audio_lame_RGAD_album = &$thisfile_mpeg_audio_lame_RGAD['album'];
-						$thisfile_mpeg_audio_lame['raw'] = array();
-						$thisfile_mpeg_audio_lame_raw    = &$thisfile_mpeg_audio_lame['raw'];
-
-						// byte $9B  VBR Quality
-						// This field is there to indicate a quality level, although the scale was not precised in the original Xing specifications.
-						// Actually overwrites original Xing bytes
-						unset($thisfile_mpeg_audio['VBR_scale']);
-						$thisfile_mpeg_audio_lame['vbr_quality'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0x9B, 1));
-
-						// bytes $9C-$A4  Encoder short VersionString
-						$thisfile_mpeg_audio_lame['short_version'] = substr($headerstring, $LAMEtagOffsetContant + 0x9C, 9);
-
-						// byte $A5  Info Tag revision + VBR method
-						$LAMEtagRevisionVBRmethod = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA5, 1));
-
-						$thisfile_mpeg_audio_lame['tag_revision']   = ($LAMEtagRevisionVBRmethod & 0xF0) >> 4;
-						$thisfile_mpeg_audio_lame_raw['vbr_method'] =  $LAMEtagRevisionVBRmethod & 0x0F;
-						$thisfile_mpeg_audio_lame['vbr_method']     = self::LAMEvbrMethodLookup($thisfile_mpeg_audio_lame_raw['vbr_method']);
-						$thisfile_mpeg_audio['bitrate_mode']        = substr($thisfile_mpeg_audio_lame['vbr_method'], 0, 3); // usually either 'cbr' or 'vbr', but truncates 'vbr-old / vbr-rh' to 'vbr'
-
-						// byte $A6  Lowpass filter value
-						$thisfile_mpeg_audio_lame['lowpass_frequency'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA6, 1)) * 100;
-
-						// bytes $A7-$AE  Replay Gain
-						// http://privatewww.essex.ac.uk/~djmrob/replaygain/rg_data_format.html
-						// bytes $A7-$AA : 32 bit floating point "Peak signal amplitude"
-						if ($thisfile_mpeg_audio_lame['short_version'] >= 'LAME3.94b') {
-							// LAME 3.94a16 and later - 9.23 fixed point
-							// ie 0x0059E2EE / (2^23) = 5890798 / 8388608 = 0.7022378444671630859375
-							$thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] = (float) ((getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA7, 4))) / 8388608);
-						} else {
-							// LAME 3.94a15 and earlier - 32-bit floating point
-							// Actually 3.94a16 will fall in here too and be WRONG, but is hard to detect 3.94a16 vs 3.94a15
-							$thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] = getid3_lib::LittleEndian2Float(substr($headerstring, $LAMEtagOffsetContant + 0xA7, 4));
-						}
-						if ($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] == 0) {
-							unset($thisfile_mpeg_audio_lame_RGAD['peak_amplitude']);
-						} else {
-							$thisfile_mpeg_audio_lame_RGAD['peak_db'] = getid3_lib::RGADamplitude2dB($thisfile_mpeg_audio_lame_RGAD['peak_amplitude']);
+					if (strlen($thisfile_mpeg_audio_lame['numeric_version']) > 0) {
+						foreach (explode('.', $thisfile_mpeg_audio_lame['numeric_version']) as $key => $number) {
+							$thisfile_mpeg_audio_lame['integer_version'][$key] = intval($number);
 						}
+						//if ($thisfile_mpeg_audio_lame['short_version'] >= 'LAME3.90') {
+						if ((($thisfile_mpeg_audio_lame['integer_version'][0] * 1000) + $thisfile_mpeg_audio_lame['integer_version'][1]) >= 3090) { // cannot use string version compare, may have "LAME3.90" or "LAME3.100" -- see https://github.com/JamesHeinrich/getID3/issues/207
+
+							// extra 11 chars are not part of version string when LAMEtag present
+							unset($thisfile_mpeg_audio_lame['long_version']);
+
+							// It the LAME tag was only introduced in LAME v3.90
+							// http://www.hydrogenaudio.org/?act=ST&f=15&t=9933
+
+							// Offsets of various bytes in http://gabriel.mp3-tech.org/mp3infotag.html
+							// are assuming a 'Xing' identifier offset of 0x24, which is the case for
+							// MPEG-1 non-mono, but not for other combinations
+							$LAMEtagOffsetContant = $VBRidOffset - 0x24;
+
+							// shortcuts
+							$thisfile_mpeg_audio_lame['RGAD']    = array('track'=>array(), 'album'=>array());
+							$thisfile_mpeg_audio_lame_RGAD       = &$thisfile_mpeg_audio_lame['RGAD'];
+							$thisfile_mpeg_audio_lame_RGAD_track = &$thisfile_mpeg_audio_lame_RGAD['track'];
+							$thisfile_mpeg_audio_lame_RGAD_album = &$thisfile_mpeg_audio_lame_RGAD['album'];
+							$thisfile_mpeg_audio_lame['raw'] = array();
+							$thisfile_mpeg_audio_lame_raw    = &$thisfile_mpeg_audio_lame['raw'];
+
+							// byte $9B  VBR Quality
+							// This field is there to indicate a quality level, although the scale was not precised in the original Xing specifications.
+							// Actually overwrites original Xing bytes
+							unset($thisfile_mpeg_audio['VBR_scale']);
+							$thisfile_mpeg_audio_lame['vbr_quality'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0x9B, 1));
+
+							// bytes $9C-$A4  Encoder short VersionString
+							$thisfile_mpeg_audio_lame['short_version'] = substr($headerstring, $LAMEtagOffsetContant + 0x9C, 9);
+
+							// byte $A5  Info Tag revision + VBR method
+							$LAMEtagRevisionVBRmethod = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA5, 1));
+
+							$thisfile_mpeg_audio_lame['tag_revision']   = ($LAMEtagRevisionVBRmethod & 0xF0) >> 4;
+							$thisfile_mpeg_audio_lame_raw['vbr_method'] =  $LAMEtagRevisionVBRmethod & 0x0F;
+							$thisfile_mpeg_audio_lame['vbr_method']     = self::LAMEvbrMethodLookup($thisfile_mpeg_audio_lame_raw['vbr_method']);
+							$thisfile_mpeg_audio['bitrate_mode']        = substr($thisfile_mpeg_audio_lame['vbr_method'], 0, 3); // usually either 'cbr' or 'vbr', but truncates 'vbr-old / vbr-rh' to 'vbr'
+
+							// byte $A6  Lowpass filter value
+							$thisfile_mpeg_audio_lame['lowpass_frequency'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA6, 1)) * 100;
+
+							// bytes $A7-$AE  Replay Gain
+							// http://privatewww.essex.ac.uk/~djmrob/replaygain/rg_data_format.html
+							// bytes $A7-$AA : 32 bit floating point "Peak signal amplitude"
+							if ($thisfile_mpeg_audio_lame['short_version'] >= 'LAME3.94b') {
+								// LAME 3.94a16 and later - 9.23 fixed point
+								// ie 0x0059E2EE / (2^23) = 5890798 / 8388608 = 0.7022378444671630859375
+								$thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] = (float) ((getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xA7, 4))) / 8388608);
+							} else {
+								// LAME 3.94a15 and earlier - 32-bit floating point
+								// Actually 3.94a16 will fall in here too and be WRONG, but is hard to detect 3.94a16 vs 3.94a15
+								$thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] = getid3_lib::LittleEndian2Float(substr($headerstring, $LAMEtagOffsetContant + 0xA7, 4));
+							}
+							if ($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'] == 0) {
+								unset($thisfile_mpeg_audio_lame_RGAD['peak_amplitude']);
+							} else {
+								$thisfile_mpeg_audio_lame_RGAD['peak_db'] = getid3_lib::RGADamplitude2dB($thisfile_mpeg_audio_lame_RGAD['peak_amplitude']);
+							}
 
-						$thisfile_mpeg_audio_lame_raw['RGAD_track']      =   getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAB, 2));
-						$thisfile_mpeg_audio_lame_raw['RGAD_album']      =   getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAD, 2));
+							$thisfile_mpeg_audio_lame_raw['RGAD_track']      =   getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAB, 2));
+							$thisfile_mpeg_audio_lame_raw['RGAD_album']      =   getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAD, 2));
 
 
-						if ($thisfile_mpeg_audio_lame_raw['RGAD_track'] != 0) {
+							if ($thisfile_mpeg_audio_lame_raw['RGAD_track'] != 0) {
 
-							$thisfile_mpeg_audio_lame_RGAD_track['raw']['name']        = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0xE000) >> 13;
-							$thisfile_mpeg_audio_lame_RGAD_track['raw']['originator']  = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x1C00) >> 10;
-							$thisfile_mpeg_audio_lame_RGAD_track['raw']['sign_bit']    = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x0200) >> 9;
-							$thisfile_mpeg_audio_lame_RGAD_track['raw']['gain_adjust'] =  $thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x01FF;
-							$thisfile_mpeg_audio_lame_RGAD_track['name']       = getid3_lib::RGADnameLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['name']);
-							$thisfile_mpeg_audio_lame_RGAD_track['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['originator']);
-							$thisfile_mpeg_audio_lame_RGAD_track['gain_db']    = getid3_lib::RGADadjustmentLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['gain_adjust'], $thisfile_mpeg_audio_lame_RGAD_track['raw']['sign_bit']);
+								$thisfile_mpeg_audio_lame_RGAD_track['raw']['name']        = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0xE000) >> 13;
+								$thisfile_mpeg_audio_lame_RGAD_track['raw']['originator']  = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x1C00) >> 10;
+								$thisfile_mpeg_audio_lame_RGAD_track['raw']['sign_bit']    = ($thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x0200) >> 9;
+								$thisfile_mpeg_audio_lame_RGAD_track['raw']['gain_adjust'] =  $thisfile_mpeg_audio_lame_raw['RGAD_track'] & 0x01FF;
+								$thisfile_mpeg_audio_lame_RGAD_track['name']       = getid3_lib::RGADnameLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['name']);
+								$thisfile_mpeg_audio_lame_RGAD_track['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['originator']);
+								$thisfile_mpeg_audio_lame_RGAD_track['gain_db']    = getid3_lib::RGADadjustmentLookup($thisfile_mpeg_audio_lame_RGAD_track['raw']['gain_adjust'], $thisfile_mpeg_audio_lame_RGAD_track['raw']['sign_bit']);
 
-							if (!empty($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'])) {
-								$info['replay_gain']['track']['peak']   = $thisfile_mpeg_audio_lame_RGAD['peak_amplitude'];
+								if (!empty($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'])) {
+									$info['replay_gain']['track']['peak']   = $thisfile_mpeg_audio_lame_RGAD['peak_amplitude'];
+								}
+								$info['replay_gain']['track']['originator'] = $thisfile_mpeg_audio_lame_RGAD_track['originator'];
+								$info['replay_gain']['track']['adjustment'] = $thisfile_mpeg_audio_lame_RGAD_track['gain_db'];
+							} else {
+								unset($thisfile_mpeg_audio_lame_RGAD['track']);
 							}
-							$info['replay_gain']['track']['originator'] = $thisfile_mpeg_audio_lame_RGAD_track['originator'];
-							$info['replay_gain']['track']['adjustment'] = $thisfile_mpeg_audio_lame_RGAD_track['gain_db'];
-						} else {
-							unset($thisfile_mpeg_audio_lame_RGAD['track']);
-						}
-						if ($thisfile_mpeg_audio_lame_raw['RGAD_album'] != 0) {
-
-							$thisfile_mpeg_audio_lame_RGAD_album['raw']['name']        = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0xE000) >> 13;
-							$thisfile_mpeg_audio_lame_RGAD_album['raw']['originator']  = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x1C00) >> 10;
-							$thisfile_mpeg_audio_lame_RGAD_album['raw']['sign_bit']    = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x0200) >> 9;
-							$thisfile_mpeg_audio_lame_RGAD_album['raw']['gain_adjust'] = $thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x01FF;
-							$thisfile_mpeg_audio_lame_RGAD_album['name']       = getid3_lib::RGADnameLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['name']);
-							$thisfile_mpeg_audio_lame_RGAD_album['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['originator']);
-							$thisfile_mpeg_audio_lame_RGAD_album['gain_db']    = getid3_lib::RGADadjustmentLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['gain_adjust'], $thisfile_mpeg_audio_lame_RGAD_album['raw']['sign_bit']);
-
-							if (!empty($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'])) {
-								$info['replay_gain']['album']['peak']   = $thisfile_mpeg_audio_lame_RGAD['peak_amplitude'];
+							if ($thisfile_mpeg_audio_lame_raw['RGAD_album'] != 0) {
+
+								$thisfile_mpeg_audio_lame_RGAD_album['raw']['name']        = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0xE000) >> 13;
+								$thisfile_mpeg_audio_lame_RGAD_album['raw']['originator']  = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x1C00) >> 10;
+								$thisfile_mpeg_audio_lame_RGAD_album['raw']['sign_bit']    = ($thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x0200) >> 9;
+								$thisfile_mpeg_audio_lame_RGAD_album['raw']['gain_adjust'] = $thisfile_mpeg_audio_lame_raw['RGAD_album'] & 0x01FF;
+								$thisfile_mpeg_audio_lame_RGAD_album['name']       = getid3_lib::RGADnameLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['name']);
+								$thisfile_mpeg_audio_lame_RGAD_album['originator'] = getid3_lib::RGADoriginatorLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['originator']);
+								$thisfile_mpeg_audio_lame_RGAD_album['gain_db']    = getid3_lib::RGADadjustmentLookup($thisfile_mpeg_audio_lame_RGAD_album['raw']['gain_adjust'], $thisfile_mpeg_audio_lame_RGAD_album['raw']['sign_bit']);
+
+								if (!empty($thisfile_mpeg_audio_lame_RGAD['peak_amplitude'])) {
+									$info['replay_gain']['album']['peak']   = $thisfile_mpeg_audio_lame_RGAD['peak_amplitude'];
+								}
+								$info['replay_gain']['album']['originator'] = $thisfile_mpeg_audio_lame_RGAD_album['originator'];
+								$info['replay_gain']['album']['adjustment'] = $thisfile_mpeg_audio_lame_RGAD_album['gain_db'];
+							} else {
+								unset($thisfile_mpeg_audio_lame_RGAD['album']);
+							}
+							if (empty($thisfile_mpeg_audio_lame_RGAD)) {
+								unset($thisfile_mpeg_audio_lame['RGAD']);
 							}
-							$info['replay_gain']['album']['originator'] = $thisfile_mpeg_audio_lame_RGAD_album['originator'];
-							$info['replay_gain']['album']['adjustment'] = $thisfile_mpeg_audio_lame_RGAD_album['gain_db'];
-						} else {
-							unset($thisfile_mpeg_audio_lame_RGAD['album']);
-						}
-						if (empty($thisfile_mpeg_audio_lame_RGAD)) {
-							unset($thisfile_mpeg_audio_lame['RGAD']);
-						}
 
 
-						// byte $AF  Encoding flags + ATH Type
-						$EncodingFlagsATHtype = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAF, 1));
-						$thisfile_mpeg_audio_lame['encoding_flags']['nspsytune']   = (bool) ($EncodingFlagsATHtype & 0x10);
-						$thisfile_mpeg_audio_lame['encoding_flags']['nssafejoint'] = (bool) ($EncodingFlagsATHtype & 0x20);
-						$thisfile_mpeg_audio_lame['encoding_flags']['nogap_next']  = (bool) ($EncodingFlagsATHtype & 0x40);
-						$thisfile_mpeg_audio_lame['encoding_flags']['nogap_prev']  = (bool) ($EncodingFlagsATHtype & 0x80);
-						$thisfile_mpeg_audio_lame['ath_type']                      =         $EncodingFlagsATHtype & 0x0F;
-
-						// byte $B0  if ABR {specified bitrate} else {minimal bitrate}
-						$thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB0, 1));
-						if ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 2) { // Average BitRate (ABR)
-							$thisfile_mpeg_audio_lame['bitrate_abr'] = $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'];
-						} elseif ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 1) { // Constant BitRate (CBR)
-							// ignore
-						} elseif ($thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'] > 0) { // Variable BitRate (VBR) - minimum bitrate
-							$thisfile_mpeg_audio_lame['bitrate_min'] = $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'];
-						}
+							// byte $AF  Encoding flags + ATH Type
+							$EncodingFlagsATHtype = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xAF, 1));
+							$thisfile_mpeg_audio_lame['encoding_flags']['nspsytune']   = (bool) ($EncodingFlagsATHtype & 0x10);
+							$thisfile_mpeg_audio_lame['encoding_flags']['nssafejoint'] = (bool) ($EncodingFlagsATHtype & 0x20);
+							$thisfile_mpeg_audio_lame['encoding_flags']['nogap_next']  = (bool) ($EncodingFlagsATHtype & 0x40);
+							$thisfile_mpeg_audio_lame['encoding_flags']['nogap_prev']  = (bool) ($EncodingFlagsATHtype & 0x80);
+							$thisfile_mpeg_audio_lame['ath_type']                      =         $EncodingFlagsATHtype & 0x0F;
+
+							// byte $B0  if ABR {specified bitrate} else {minimal bitrate}
+							$thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB0, 1));
+							if ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 2) { // Average BitRate (ABR)
+								$thisfile_mpeg_audio_lame['bitrate_abr'] = $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'];
+							} elseif ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 1) { // Constant BitRate (CBR)
+								// ignore
+							} elseif ($thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'] > 0) { // Variable BitRate (VBR) - minimum bitrate
+								$thisfile_mpeg_audio_lame['bitrate_min'] = $thisfile_mpeg_audio_lame['raw']['abrbitrate_minbitrate'];
+							}
 
-						// bytes $B1-$B3  Encoder delays
-						$EncoderDelays = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB1, 3));
-						$thisfile_mpeg_audio_lame['encoder_delay'] = ($EncoderDelays & 0xFFF000) >> 12;
-						$thisfile_mpeg_audio_lame['end_padding']   =  $EncoderDelays & 0x000FFF;
-
-						// byte $B4  Misc
-						$MiscByte = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB4, 1));
-						$thisfile_mpeg_audio_lame_raw['noise_shaping']       = ($MiscByte & 0x03);
-						$thisfile_mpeg_audio_lame_raw['stereo_mode']         = ($MiscByte & 0x1C) >> 2;
-						$thisfile_mpeg_audio_lame_raw['not_optimal_quality'] = ($MiscByte & 0x20) >> 5;
-						$thisfile_mpeg_audio_lame_raw['source_sample_freq']  = ($MiscByte & 0xC0) >> 6;
-						$thisfile_mpeg_audio_lame['noise_shaping']       = $thisfile_mpeg_audio_lame_raw['noise_shaping'];
-						$thisfile_mpeg_audio_lame['stereo_mode']         = self::LAMEmiscStereoModeLookup($thisfile_mpeg_audio_lame_raw['stereo_mode']);
-						$thisfile_mpeg_audio_lame['not_optimal_quality'] = (bool) $thisfile_mpeg_audio_lame_raw['not_optimal_quality'];
-						$thisfile_mpeg_audio_lame['source_sample_freq']  = self::LAMEmiscSourceSampleFrequencyLookup($thisfile_mpeg_audio_lame_raw['source_sample_freq']);
-
-						// byte $B5  MP3 Gain
-						$thisfile_mpeg_audio_lame_raw['mp3_gain'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB5, 1), false, true);
-						$thisfile_mpeg_audio_lame['mp3_gain_db']     = (getid3_lib::RGADamplitude2dB(2) / 4) * $thisfile_mpeg_audio_lame_raw['mp3_gain'];
-						$thisfile_mpeg_audio_lame['mp3_gain_factor'] = pow(2, ($thisfile_mpeg_audio_lame['mp3_gain_db'] / 6));
-
-						// bytes $B6-$B7  Preset and surround info
-						$PresetSurroundBytes = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB6, 2));
-						// Reserved                                                    = ($PresetSurroundBytes & 0xC000);
-						$thisfile_mpeg_audio_lame_raw['surround_info'] = ($PresetSurroundBytes & 0x3800);
-						$thisfile_mpeg_audio_lame['surround_info']     = self::LAMEsurroundInfoLookup($thisfile_mpeg_audio_lame_raw['surround_info']);
-						$thisfile_mpeg_audio_lame['preset_used_id']    = ($PresetSurroundBytes & 0x07FF);
-						$thisfile_mpeg_audio_lame['preset_used']       = self::LAMEpresetUsedLookup($thisfile_mpeg_audio_lame);
-						if (!empty($thisfile_mpeg_audio_lame['preset_used_id']) && empty($thisfile_mpeg_audio_lame['preset_used'])) {
-							$this->warning('Unknown LAME preset used ('.$thisfile_mpeg_audio_lame['preset_used_id'].') - please report to info@getid3.org');
-						}
-						if (($thisfile_mpeg_audio_lame['short_version'] == 'LAME3.90.') && !empty($thisfile_mpeg_audio_lame['preset_used_id'])) {
-							// this may change if 3.90.4 ever comes out
-							$thisfile_mpeg_audio_lame['short_version'] = 'LAME3.90.3';
-						}
+							// bytes $B1-$B3  Encoder delays
+							$EncoderDelays = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB1, 3));
+							$thisfile_mpeg_audio_lame['encoder_delay'] = ($EncoderDelays & 0xFFF000) >> 12;
+							$thisfile_mpeg_audio_lame['end_padding']   =  $EncoderDelays & 0x000FFF;
+
+							// byte $B4  Misc
+							$MiscByte = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB4, 1));
+							$thisfile_mpeg_audio_lame_raw['noise_shaping']       = ($MiscByte & 0x03);
+							$thisfile_mpeg_audio_lame_raw['stereo_mode']         = ($MiscByte & 0x1C) >> 2;
+							$thisfile_mpeg_audio_lame_raw['not_optimal_quality'] = ($MiscByte & 0x20) >> 5;
+							$thisfile_mpeg_audio_lame_raw['source_sample_freq']  = ($MiscByte & 0xC0) >> 6;
+							$thisfile_mpeg_audio_lame['noise_shaping']       = $thisfile_mpeg_audio_lame_raw['noise_shaping'];
+							$thisfile_mpeg_audio_lame['stereo_mode']         = self::LAMEmiscStereoModeLookup($thisfile_mpeg_audio_lame_raw['stereo_mode']);
+							$thisfile_mpeg_audio_lame['not_optimal_quality'] = (bool) $thisfile_mpeg_audio_lame_raw['not_optimal_quality'];
+							$thisfile_mpeg_audio_lame['source_sample_freq']  = self::LAMEmiscSourceSampleFrequencyLookup($thisfile_mpeg_audio_lame_raw['source_sample_freq']);
+
+							// byte $B5  MP3 Gain
+							$thisfile_mpeg_audio_lame_raw['mp3_gain'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB5, 1), false, true);
+							$thisfile_mpeg_audio_lame['mp3_gain_db']     = (getid3_lib::RGADamplitude2dB(2) / 4) * $thisfile_mpeg_audio_lame_raw['mp3_gain'];
+							$thisfile_mpeg_audio_lame['mp3_gain_factor'] = pow(2, ($thisfile_mpeg_audio_lame['mp3_gain_db'] / 6));
+
+							// bytes $B6-$B7  Preset and surround info
+							$PresetSurroundBytes = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB6, 2));
+							// Reserved                                                    = ($PresetSurroundBytes & 0xC000);
+							$thisfile_mpeg_audio_lame_raw['surround_info'] = ($PresetSurroundBytes & 0x3800);
+							$thisfile_mpeg_audio_lame['surround_info']     = self::LAMEsurroundInfoLookup($thisfile_mpeg_audio_lame_raw['surround_info']);
+							$thisfile_mpeg_audio_lame['preset_used_id']    = ($PresetSurroundBytes & 0x07FF);
+							$thisfile_mpeg_audio_lame['preset_used']       = self::LAMEpresetUsedLookup($thisfile_mpeg_audio_lame);
+							if (!empty($thisfile_mpeg_audio_lame['preset_used_id']) && empty($thisfile_mpeg_audio_lame['preset_used'])) {
+								$this->warning('Unknown LAME preset used ('.$thisfile_mpeg_audio_lame['preset_used_id'].') - please report to info@getid3.org');
+							}
+							if (($thisfile_mpeg_audio_lame['short_version'] == 'LAME3.90.') && !empty($thisfile_mpeg_audio_lame['preset_used_id'])) {
+								// this may change if 3.90.4 ever comes out
+								$thisfile_mpeg_audio_lame['short_version'] = 'LAME3.90.3';
+							}
 
-						// bytes $B8-$BB  MusicLength
-						$thisfile_mpeg_audio_lame['audio_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB8, 4));
-						$ExpectedNumberOfAudioBytes = (($thisfile_mpeg_audio_lame['audio_bytes'] > 0) ? $thisfile_mpeg_audio_lame['audio_bytes'] : $thisfile_mpeg_audio['VBR_bytes']);
+							// bytes $B8-$BB  MusicLength
+							$thisfile_mpeg_audio_lame['audio_bytes'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xB8, 4));
+							$ExpectedNumberOfAudioBytes = (($thisfile_mpeg_audio_lame['audio_bytes'] > 0) ? $thisfile_mpeg_audio_lame['audio_bytes'] : $thisfile_mpeg_audio['VBR_bytes']);
 
-						// bytes $BC-$BD  MusicCRC
-						$thisfile_mpeg_audio_lame['music_crc']    = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBC, 2));
+							// bytes $BC-$BD  MusicCRC
+							$thisfile_mpeg_audio_lame['music_crc']    = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBC, 2));
 
-						// bytes $BE-$BF  CRC-16 of Info Tag
-						$thisfile_mpeg_audio_lame['lame_tag_crc'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBE, 2));
+							// bytes $BE-$BF  CRC-16 of Info Tag
+							$thisfile_mpeg_audio_lame['lame_tag_crc'] = getid3_lib::BigEndian2Int(substr($headerstring, $LAMEtagOffsetContant + 0xBE, 2));
 
 
-						// LAME CBR
-						if ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 1) {
+							// LAME CBR
+							if ($thisfile_mpeg_audio_lame_raw['vbr_method'] == 1) {
 
-							$thisfile_mpeg_audio['bitrate_mode'] = 'cbr';
-							$thisfile_mpeg_audio['bitrate'] = self::ClosestStandardMP3Bitrate($thisfile_mpeg_audio['bitrate']);
-							$info['audio']['bitrate'] = $thisfile_mpeg_audio['bitrate'];
-							//if (empty($thisfile_mpeg_audio['bitrate']) || (!empty($thisfile_mpeg_audio_lame['bitrate_min']) && ($thisfile_mpeg_audio_lame['bitrate_min'] != 255))) {
-							//	$thisfile_mpeg_audio['bitrate'] = $thisfile_mpeg_audio_lame['bitrate_min'];
-							//}
+								$thisfile_mpeg_audio['bitrate_mode'] = 'cbr';
+								$thisfile_mpeg_audio['bitrate'] = self::ClosestStandardMP3Bitrate($thisfile_mpeg_audio['bitrate']);
+								$info['audio']['bitrate'] = $thisfile_mpeg_audio['bitrate'];
+								//if (empty($thisfile_mpeg_audio['bitrate']) || (!empty($thisfile_mpeg_audio_lame['bitrate_min']) && ($thisfile_mpeg_audio_lame['bitrate_min'] != 255))) {
+								//	$thisfile_mpeg_audio['bitrate'] = $thisfile_mpeg_audio_lame['bitrate_min'];
+								//}
 
-						}
+							}
 
+						}
 					}
 				}
 
@@ -1009,6 +1022,22 @@ class getid3_mp3 extends getid3_handler
 			if (!$this->RecursiveFrameScanning($offset, $nextframetestoffset, $ScanAsCBR)) {
 				return false;
 			}
+			if (!empty($this->getid3->info['mp3_validity_check_bitrates']) && !empty($thisfile_mpeg_audio['bitrate_mode']) && ($thisfile_mpeg_audio['bitrate_mode'] == 'vbr') && !empty($thisfile_mpeg_audio['VBR_bitrate'])) {
+				// https://github.com/JamesHeinrich/getID3/issues/287
+				if (count(array_keys($this->getid3->info['mp3_validity_check_bitrates'])) == 1) {
+					list($cbr_bitrate_in_short_scan) = array_keys($this->getid3->info['mp3_validity_check_bitrates']);
+					$deviation_cbr_from_header_bitrate = abs($thisfile_mpeg_audio['VBR_bitrate'] - $cbr_bitrate_in_short_scan) / $cbr_bitrate_in_short_scan;
+					if ($deviation_cbr_from_header_bitrate < 0.01) {
+						// VBR header bitrate may differ slightly from true bitrate of frames, perhaps accounting for overhead of VBR header frame itself?
+						// If measured CBR bitrate is within 1% of specified bitrate in VBR header then assume that file is truly CBR
+						$thisfile_mpeg_audio['bitrate_mode'] = 'cbr';
+						//$this->warning('VBR header ignored, assuming CBR '.round($cbr_bitrate_in_short_scan / 1000).'kbps based on scan of '.$this->mp3_valid_check_frames.' frames');
+					}
+				}
+			}
+			if (isset($this->getid3->info['mp3_validity_check_bitrates'])) {
+				unset($this->getid3->info['mp3_validity_check_bitrates']);
+			}
 
 		}
 
@@ -1130,8 +1159,9 @@ class getid3_mp3 extends getid3_handler
 		$firstframetestarray = array('error' => array(), 'warning'=> array(), 'avdataend' => $info['avdataend'], 'avdataoffset' => $info['avdataoffset']);
 		$this->decodeMPEGaudioHeader($offset, $firstframetestarray, false);
 
-		for ($i = 0; $i < GETID3_MP3_VALID_CHECK_FRAMES; $i++) {
-			// check next GETID3_MP3_VALID_CHECK_FRAMES frames for validity, to make sure we haven't run across a false synch
+		$info['mp3_validity_check_bitrates'] = array();
+		for ($i = 0; $i < $this->mp3_valid_check_frames; $i++) {
+			// check next (default: 50) frames for validity, to make sure we haven't run across a false synch
 			if (($nextframetestoffset + 4) >= $info['avdataend']) {
 				// end of file
 				return true;
@@ -1139,6 +1169,7 @@ class getid3_mp3 extends getid3_handler
 
 			$nextframetestarray = array('error' => array(), 'warning' => array(), 'avdataend' => $info['avdataend'], 'avdataoffset'=>$info['avdataoffset']);
 			if ($this->decodeMPEGaudioHeader($nextframetestoffset, $nextframetestarray, false)) {
+				getid3_lib::safe_inc($info['mp3_validity_check_bitrates'][$nextframetestarray['mpeg']['audio']['bitrate']]);
 				if ($ScanAsCBR) {
 					// force CBR mode, used for trying to pick out invalid audio streams with valid(?) VBR headers, or VBR streams with no VBR header
 					if (!isset($nextframetestarray['mpeg']['audio']['bitrate']) || !isset($firstframetestarray['mpeg']['audio']['bitrate']) || ($nextframetestarray['mpeg']['audio']['bitrate'] != $firstframetestarray['mpeg']['audio']['bitrate'])) {
@@ -1273,6 +1304,7 @@ class getid3_mp3 extends getid3_handler
 		$LongMPEGbitrateLookup        = array();
 		$LongMPEGpaddingLookup        = array();
 		$LongMPEGfrequencyLookup      = array();
+		$Distribution                 = array();
 		$Distribution['bitrate']      = array();
 		$Distribution['frequency']    = array();
 		$Distribution['layer']        = array();
@@ -1433,6 +1465,9 @@ class getid3_mp3 extends getid3_handler
 		$header = $this->fread($sync_seek_buffer_size);
 		$sync_seek_buffer_size = strlen($header);
 		$SynchSeekOffset = 0;
+		$SyncSeekAttempts = 0;
+		$SyncSeekAttemptsMax = 1000;
+		$FirstFrameThisfileInfo = null;
 		while ($SynchSeekOffset < $sync_seek_buffer_size) {
 			if ((($avdataoffset + $SynchSeekOffset)  < $info['avdataend']) && !feof($this->getid3->fp)) {
 
@@ -1471,7 +1506,24 @@ class getid3_mp3 extends getid3_handler
 				return false;
 			}
 
-			if (($header[$SynchSeekOffset] == "\xFF") && ($header[($SynchSeekOffset + 1)] > "\xE0")) { // synch detected
+			if (($header[$SynchSeekOffset] == "\xFF") && ($header[($SynchSeekOffset + 1)] > "\xE0")) { // possible synch detected
+				if (++$SyncSeekAttempts >= $SyncSeekAttemptsMax) {
+					// https://github.com/JamesHeinrich/getID3/issues/286
+					// corrupt files claiming to be MP3, with a large number of 0xFF bytes near the beginning, can cause this loop to take a very long time
+					// should have escape condition to avoid spending too much time scanning a corrupt file
+					// if a synch's not found within the first 128k bytes, then give up
+					$this->error('Could not find valid MPEG audio synch after scanning '.$SyncSeekAttempts.' candidate offsets');
+					if (isset($info['audio']['bitrate'])) {
+						unset($info['audio']['bitrate']);
+					}
+					if (isset($info['mpeg']['audio'])) {
+						unset($info['mpeg']['audio']);
+					}
+					if (empty($info['mpeg'])) {
+						unset($info['mpeg']);
+					}
+					return false;
+				}
 				$FirstFrameAVDataOffset = null;
 				if (!isset($FirstFrameThisfileInfo) && !isset($info['mpeg']['audio'])) {
 					$FirstFrameThisfileInfo = $info;
@@ -1511,9 +1563,9 @@ class getid3_mp3 extends getid3_handler
 							if ($this->decodeMPEGaudioHeader($GarbageOffsetEnd, $dummy, true, true)) {
 								$info = $dummy;
 								$info['avdataoffset'] = $GarbageOffsetEnd;
-								$this->warning('apparently-valid VBR header not used because could not find '.GETID3_MP3_VALID_CHECK_FRAMES.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.'), but did find valid CBR stream starting at '.$GarbageOffsetEnd);
+								$this->warning('apparently-valid VBR header not used because could not find '.$this->mp3_valid_check_frames.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.'), but did find valid CBR stream starting at '.$GarbageOffsetEnd);
 							} else {
-								$this->warning('using data from VBR header even though could not find '.GETID3_MP3_VALID_CHECK_FRAMES.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.')');
+								$this->warning('using data from VBR header even though could not find '.$this->mp3_valid_check_frames.' consecutive MPEG-audio frames immediately after VBR header (garbage data for '.($GarbageOffsetEnd - $GarbageOffsetStart).' bytes between '.$GarbageOffsetStart.' and '.$GarbageOffsetEnd.')');
 							}
 						}
 					}
@@ -1558,6 +1610,7 @@ class getid3_mp3 extends getid3_handler
 						$pct_data_scanned = 0;
 						for ($current_segment = 0; $current_segment < $max_scan_segments; $current_segment++) {
 							$frames_scanned_this_segment = 0;
+							$scan_start_offset = array();
 							if ($this->ftell() >= $info['avdataend']) {
 								break;
 							}
@@ -1887,6 +1940,7 @@ class getid3_mp3 extends getid3_handler
 			return false;
 		}
 
+		$MPEGrawHeader = array();
 		$MPEGrawHeader['synch']         = (getid3_lib::BigEndian2Int(substr($Header4Bytes, 0, 2)) & 0xFFE0) >> 4;
 		$MPEGrawHeader['version']       = (ord($Header4Bytes[1]) & 0x18) >> 3; //    BB
 		$MPEGrawHeader['layer']         = (ord($Header4Bytes[1]) & 0x06) >> 1; //      CC
diff --git a/src/wp-includes/ID3/module.audio.ogg.php b/src/wp-includes/ID3/module.audio.ogg.php
index fe092d9d94..5786fd0d59 100644
--- a/src/wp-includes/ID3/module.audio.ogg.php
+++ b/src/wp-includes/ID3/module.audio.ogg.php
@@ -529,6 +529,7 @@ class getid3_ogg extends getid3_handler
 	 */
 	public function ParseOggPageHeader() {
 		// http://xiph.org/ogg/vorbis/doc/framing.html
+		$oggheader = array();
 		$oggheader['page_start_offset'] = $this->ftell(); // where we started from in the file
 
 		$filedata = $this->fread($this->getid3->fread_buffer_size());
@@ -680,35 +681,39 @@ class getid3_ogg extends getid3_handler
 
 				$VorbisCommentPage++;
 
-				$oggpageinfo = $this->ParseOggPageHeader();
-				$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
+				if ($oggpageinfo = $this->ParseOggPageHeader()) {
+					$info['ogg']['pageheader'][$oggpageinfo['page_seqno']] = $oggpageinfo;
 
-				// First, save what we haven't read yet
-				$AsYetUnusedData = substr($commentdata, $commentdataoffset);
+					// First, save what we haven't read yet
+					$AsYetUnusedData = substr($commentdata, $commentdataoffset);
 
-				// Then take that data off the end
-				$commentdata     = substr($commentdata, 0, $commentdataoffset);
+					// Then take that data off the end
+					$commentdata     = substr($commentdata, 0, $commentdataoffset);
+
+					// Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct
+					$commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
+					$commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
 
-				// Add [headerlength] bytes of dummy data for the Ogg Page Header, just to keep absolute offsets correct
-				$commentdata .= str_repeat("\x00", 27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
-				$commentdataoffset += (27 + $info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_segments']);
+					// Finally, stick the unused data back on the end
+					$commentdata .= $AsYetUnusedData;
 
-				// Finally, stick the unused data back on the end
-				$commentdata .= $AsYetUnusedData;
+					//$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
+					if (!isset($info['ogg']['pageheader'][$VorbisCommentPage])) {
+						$this->warning('undefined Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell());
+						break;
+					}
+					$readlength = self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1);
+					if ($readlength <= 0) {
+						$this->warning('invalid length Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell());
+						break;
+					}
+					$commentdata .= $this->fread($readlength);
 
-				//$commentdata .= $this->fread($info['ogg']['pageheader'][$oggpageinfo['page_seqno']]['page_length']);
-				if (!isset($info['ogg']['pageheader'][$VorbisCommentPage])) {
-					$this->warning('undefined Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell());
-					break;
-				}
-				$readlength = self::OggPageSegmentLength($info['ogg']['pageheader'][$VorbisCommentPage], 1);
-				if ($readlength <= 0) {
-					$this->warning('invalid length Vorbis Comment page "'.$VorbisCommentPage.'" at offset '.$this->ftell());
+					//$filebaseoffset += $oggpageinfo['header_end_offset'] - $oggpageinfo['page_start_offset'];
+				} else {
+					$this->warning('failed to ParseOggPageHeader() at offset '.$this->ftell());
 					break;
 				}
-				$commentdata .= $this->fread($readlength);
-
-				//$filebaseoffset += $oggpageinfo['header_end_offset'] - $oggpageinfo['page_start_offset'];
 			}
 			$ThisFileInfo_ogg_comments_raw[$i]['offset'] = $commentdataoffset;
 			$commentstring = substr($commentdata, $commentdataoffset, $ThisFileInfo_ogg_comments_raw[$i]['size']);
diff --git a/src/wp-includes/ID3/module.tag.apetag.php b/src/wp-includes/ID3/module.tag.apetag.php
index 26be982c73..c5502133fc 100644
--- a/src/wp-includes/ID3/module.tag.apetag.php
+++ b/src/wp-includes/ID3/module.tag.apetag.php
@@ -360,6 +360,7 @@ class getid3_apetag extends getid3_handler
 		// http://www.uni-jena.de/~pfk/mpp/sv8/apeheader.html
 
 		// shortcut
+		$headerfooterinfo = array();
 		$headerfooterinfo['raw'] = array();
 		$headerfooterinfo_raw = &$headerfooterinfo['raw'];
 
@@ -389,6 +390,7 @@ class getid3_apetag extends getid3_handler
 		// "Note: APE Tags 1.0 do not use any of the APE Tag flags.
 		// All are set to zero on creation and ignored on reading."
 		// http://wiki.hydrogenaud.io/index.php?title=Ape_Tags_Flags
+		$flags                      = array();
 		$flags['header']            = (bool) ($rawflagint & 0x80000000);
 		$flags['footer']            = (bool) ($rawflagint & 0x40000000);
 		$flags['this_is_header']    = (bool) ($rawflagint & 0x20000000);
diff --git a/src/wp-includes/ID3/module.tag.id3v1.php b/src/wp-includes/ID3/module.tag.id3v1.php
index 16dcf253b6..b1de25784b 100644
--- a/src/wp-includes/ID3/module.tag.id3v1.php
+++ b/src/wp-includes/ID3/module.tag.id3v1.php
@@ -31,14 +31,22 @@ class getid3_id3v1 extends getid3_handler
 			return false;
 		}
 
-		$this->fseek(-256, SEEK_END);
-		$preid3v1 = $this->fread(128);
-		$id3v1tag = $this->fread(128);
+		if($info['filesize'] < 256) {
+			$this->fseek(-128, SEEK_END);
+			$preid3v1 = '';
+			$id3v1tag = $this->fread(128);
+		} else {
+			$this->fseek(-256, SEEK_END);
+			$preid3v1 = $this->fread(128);
+			$id3v1tag = $this->fread(128);
+		}
+
 
 		if (substr($id3v1tag, 0, 3) == 'TAG') {
 
 			$info['avdataend'] = $info['filesize'] - 128;
 
+			$ParsedID3v1            = array();
 			$ParsedID3v1['title']   = $this->cutfield(substr($id3v1tag,   3, 30));
 			$ParsedID3v1['artist']  = $this->cutfield(substr($id3v1tag,  33, 30));
 			$ParsedID3v1['album']   = $this->cutfield(substr($id3v1tag,  63, 30));
@@ -297,6 +305,50 @@ class getid3_id3v1 extends getid3_handler
 			145  => 'Anime',
 			146  => 'JPop',
 			147  => 'Synthpop',
+			148 => 'Abstract',
+			149 => 'Art Rock',
+			150 => 'Baroque',
+			151 => 'Bhangra',
+			152 => 'Big Beat',
+			153 => 'Breakbeat',
+			154 => 'Chillout',
+			155 => 'Downtempo',
+			156 => 'Dub',
+			157 => 'EBM',
+			158 => 'Eclectic',
+			159 => 'Electro',
+			160 => 'Electroclash',
+			161 => 'Emo',
+			162 => 'Experimental',
+			163 => 'Garage',
+			164 => 'Global',
+			165 => 'IDM',
+			166 => 'Illbient',
+			167 => 'Industro-Goth',
+			168 => 'Jam Band',
+			169 => 'Krautrock',
+			170 => 'Leftfield',
+			171 => 'Lounge',
+			172 => 'Math Rock',
+			173 => 'New Romantic',
+			174 => 'Nu-Breakz',
+			175 => 'Post-Punk',
+			176 => 'Post-Rock',
+			177 => 'Psytrance',
+			178 => 'Shoegaze',
+			179 => 'Space Rock',
+			180 => 'Trop Rock',
+			181 => 'World Music',
+			182 => 'Neoclassical',
+			183 => 'Audiobook',
+			184 => 'Audio Theatre',
+			185 => 'Neue Deutsche Welle',
+			186 => 'Podcast',
+			187 => 'Indie-Rock',
+			188 => 'G-Funk',
+			189 => 'Dubstep',
+			190 => 'Garage Rock',
+			191 => 'Psybient',
 
 			255  => 'Unknown',
 
diff --git a/src/wp-includes/ID3/module.tag.id3v2.php b/src/wp-includes/ID3/module.tag.id3v2.php
index 85dd7a147a..99e56a5fdb 100644
--- a/src/wp-includes/ID3/module.tag.id3v2.php
+++ b/src/wp-includes/ID3/module.tag.id3v2.php
@@ -345,7 +345,7 @@ class getid3_id3v2 extends getid3_handler
 				}
 				if (($frame_size <= strlen($framedata)) && ($this->IsValidID3v2FrameName($frame_name, $id3v2_majorversion))) {
 
-					unset($parsedFrame);
+					$parsedFrame                    = array();
 					$parsedFrame['frame_name']      = $frame_name;
 					$parsedFrame['frame_flags_raw'] = $frame_flags;
 					$parsedFrame['data']            = substr($framedata, 0, $frame_size);
@@ -978,7 +978,7 @@ class getid3_id3v2 extends getid3_handler
 
 
 		} elseif ((($id3v2_majorversion >= 3) && ($parsedFrame['frame_name'] == 'USLT')) || // 4.8   USLT Unsynchronised lyric/text transcription
-				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'ULT'))) {     // 4.9   ULT  Unsynchronised lyric/text transcription
+				(($id3v2_majorversion == 2) && ($parsedFrame['frame_name'] == 'ULT'))) {    // 4.9   ULT  Unsynchronised lyric/text transcription
 			//   There may be more than one 'Unsynchronised lyrics/text transcription' frame
 			//   in each tag, but only one with the same language and content descriptor.
 			// <Header for 'Unsynchronised lyrics/text transcription', ID: 'USLT'>
@@ -994,24 +994,28 @@ class getid3_id3v2 extends getid3_handler
 				$this->warning('Invalid text encoding byte ('.$frame_textencoding.') in frame "'.$parsedFrame['frame_name'].'" - defaulting to ISO-8859-1 encoding');
 				$frame_textencoding_terminator = "\x00";
 			}
-			$frame_language = substr($parsedFrame['data'], $frame_offset, 3);
-			$frame_offset += 3;
-			$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);
-			if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {
-				$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
-			}
-			$parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
-			$parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']);
-			$parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator));
-			$parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $frame_textencoding_terminator);
+			if (strlen($parsedFrame['data']) >= (4 + strlen($frame_textencoding_terminator))) {  // shouldn't be an issue but badly-written files have been spotted in the wild with not only no contents but also missing the required language field, see https://github.com/JamesHeinrich/getID3/issues/315
+				$frame_language = substr($parsedFrame['data'], $frame_offset, 3);
+				$frame_offset += 3;
+				$frame_terminatorpos = strpos($parsedFrame['data'], $frame_textencoding_terminator, $frame_offset);
+				if (ord(substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator), 1)) === 0) {
+					$frame_terminatorpos++; // strpos() fooled because 2nd byte of Unicode chars are often 0x00
+				}
+				$parsedFrame['description'] = substr($parsedFrame['data'], $frame_offset, $frame_terminatorpos - $frame_offset);
+				$parsedFrame['description'] = $this->MakeUTF16emptyStringEmpty($parsedFrame['description']);
+				$parsedFrame['data'] = substr($parsedFrame['data'], $frame_terminatorpos + strlen($frame_textencoding_terminator));
+				$parsedFrame['data'] = $this->RemoveStringTerminator($parsedFrame['data'], $frame_textencoding_terminator);
 
-			$parsedFrame['encodingid']   = $frame_textencoding;
-			$parsedFrame['encoding']     = $this->TextEncodingNameLookup($frame_textencoding);
+				$parsedFrame['encodingid']   = $frame_textencoding;
+				$parsedFrame['encoding']     = $this->TextEncodingNameLookup($frame_textencoding);
 
-			$parsedFrame['language']     = $frame_language;
-			$parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false);
-			if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
-				$info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']);
+				$parsedFrame['language']     = $frame_language;
+				$parsedFrame['languagename'] = $this->LanguageLookup($frame_language, false);
+				if (!empty($parsedFrame['framenameshort']) && !empty($parsedFrame['data'])) {
+					$info['id3v2']['comments'][$parsedFrame['framenameshort']][] = getid3_lib::iconv_fallback($parsedFrame['encoding'], $info['id3v2']['encoding'], $parsedFrame['data']);
+				}
+			} else {
+				$this->warning('Invalid data in frame "'.$parsedFrame['frame_name'].'" at offset '.$parsedFrame['dataoffset']);
 			}
 			unset($parsedFrame['data']);
 
@@ -1370,6 +1374,8 @@ class getid3_id3v2 extends getid3_handler
 				$frame_textencoding_terminator = "\x00";
 			}
 
+			$frame_imagetype = null;
+			$frame_mimetype = null;
 			if ($id3v2_majorversion == 2 && strlen($parsedFrame['data']) > $frame_offset) {
 				$frame_imagetype = substr($parsedFrame['data'], $frame_offset, 3);
 				if (strtolower($frame_imagetype) == 'ima') {
@@ -1956,18 +1962,14 @@ class getid3_id3v2 extends getid3_handler
 			$frame_offset = 0;
 			$parsedFrame['peakamplitude'] = getid3_lib::BigEndian2Float(substr($parsedFrame['data'], $frame_offset, 4));
 			$frame_offset += 4;
-			$rg_track_adjustment = getid3_lib::Dec2Bin(substr($parsedFrame['data'], $frame_offset, 2));
-			$frame_offset += 2;
-			$rg_album_adjustment = getid3_lib::Dec2Bin(substr($parsedFrame['data'], $frame_offset, 2));
-			$frame_offset += 2;
-			$parsedFrame['raw']['track']['name']       = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 0, 3));
-			$parsedFrame['raw']['track']['originator'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 3, 3));
-			$parsedFrame['raw']['track']['signbit']    = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 6, 1));
-			$parsedFrame['raw']['track']['adjustment'] = getid3_lib::Bin2Dec(substr($rg_track_adjustment, 7, 9));
-			$parsedFrame['raw']['album']['name']       = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 0, 3));
-			$parsedFrame['raw']['album']['originator'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 3, 3));
-			$parsedFrame['raw']['album']['signbit']    = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 6, 1));
-			$parsedFrame['raw']['album']['adjustment'] = getid3_lib::Bin2Dec(substr($rg_album_adjustment, 7, 9));
+			foreach (array('track','album') as $rgad_entry_type) {
+				$rg_adjustment_word = getid3_lib::BigEndian2Int(substr($parsedFrame['data'], $frame_offset, 2));
+				$frame_offset += 2;
+				$parsedFrame['raw'][$rgad_entry_type]['name']       = ($rg_adjustment_word & 0xE000) >> 13;
+				$parsedFrame['raw'][$rgad_entry_type]['originator'] = ($rg_adjustment_word & 0x1C00) >> 10;
+				$parsedFrame['raw'][$rgad_entry_type]['signbit']    = ($rg_adjustment_word & 0x0200) >>  9;
+				$parsedFrame['raw'][$rgad_entry_type]['adjustment'] = ($rg_adjustment_word & 0x0100);
+			}
 			$parsedFrame['track']['name']       = getid3_lib::RGADnameLookup($parsedFrame['raw']['track']['name']);
 			$parsedFrame['track']['originator'] = getid3_lib::RGADoriginatorLookup($parsedFrame['raw']['track']['originator']);
 			$parsedFrame['track']['adjustment'] = getid3_lib::RGADadjustmentLookup($parsedFrame['raw']['track']['adjustment'], $parsedFrame['raw']['track']['signbit']);
@@ -2444,7 +2446,8 @@ class getid3_id3v2 extends getid3_handler
 			TMM	Manats
 			TND	Dinars
 			TOP	Pa'anga
-			TRL	Liras
+			TRL	Liras (old)
+			TRY	Liras
 			TTD	Dollars
 			TVD	Tuvalu Dollars
 			TWD	New Dollars
@@ -2645,6 +2648,7 @@ class getid3_id3v2 extends getid3_handler
 			TND	Tunisia
 			TOP	Tonga
 			TRL	Turkey
+			TRY	Turkey
 			TTD	Trinidad and Tobago
 			TVD	Tuvalu
 			TWD	Taiwan
diff --git a/src/wp-includes/ID3/module.tag.lyrics3.php b/src/wp-includes/ID3/module.tag.lyrics3.php
index b2375057e7..c8b2cf6305 100644
--- a/src/wp-includes/ID3/module.tag.lyrics3.php
+++ b/src/wp-includes/ID3/module.tag.lyrics3.php
@@ -33,6 +33,9 @@ class getid3_lyrics3 extends getid3_handler
 		}
 
 		$this->fseek((0 - 128 - 9 - 6), SEEK_END);          // end - ID3v1 - "LYRICSEND" - [Lyrics3size]
+		$lyrics3offset = null;
+		$lyrics3version = null;
+		$lyrics3size   = null;
 		$lyrics3_id3v1 = $this->fread(128 + 9 + 6);
 		$lyrics3lsz    = (int) substr($lyrics3_id3v1, 0, 6); // Lyrics3size
 		$lyrics3end    = substr($lyrics3_id3v1,  6,   9); // LYRICSEND or LYRICS200
diff --git a/src/wp-includes/ID3/readme.txt b/src/wp-includes/ID3/readme.txt
index e48bcef917..0888bc4de2 100644
--- a/src/wp-includes/ID3/readme.txt
+++ b/src/wp-includes/ID3/readme.txt
@@ -625,3 +625,4 @@ Reference material:
 * http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html
 * http://www.codeproject.com/Articles/8295/MPEG-Audio-Frame-Header
 * http://dsd-guide.com/sites/default/files/white-papers/DSFFileFormatSpec_E.pdf
+* https://fileformats.fandom.com/wiki/Torrent_file
\ No newline at end of file
diff --git a/src/wp-includes/PHPMailer/PHPMailer.php b/src/wp-includes/PHPMailer/PHPMailer.php
index 5228ef0159..7457f88488 100644
--- a/src/wp-includes/PHPMailer/PHPMailer.php
+++ b/src/wp-includes/PHPMailer/PHPMailer.php
@@ -750,7 +750,7 @@ class PHPMailer
      *
      * @var string
      */
-    const VERSION = '6.5.1';
+    const VERSION = '6.5.3';
 
     /**
      * Error severity: message only, continue processing.
@@ -1451,7 +1451,12 @@ class PHPMailer
                 $errorcode = 0;
                 if (defined('INTL_IDNA_VARIANT_UTS46')) {
                     //Use the current punycode standard (appeared in PHP 7.2)
-                    $punycode = idn_to_ascii($domain, $errorcode, \INTL_IDNA_VARIANT_UTS46);
+                    $punycode = idn_to_ascii(
+                        $domain,
+                        \IDNA_DEFAULT | \IDNA_USE_STD3_RULES | \IDNA_CHECK_BIDI |
+                            \IDNA_CHECK_CONTEXTJ | \IDNA_NONTRANSITIONAL_TO_ASCII,
+                        \INTL_IDNA_VARIANT_UTS46
+                    );
                 } elseif (defined('INTL_IDNA_VARIANT_2003')) {
                     //Fall back to this old, deprecated/removed encoding
                     // phpcs:ignore PHPCompatibility.Constants.RemovedConstants.intl_idna_variant_2003Deprecated
@@ -1699,7 +1704,10 @@ class PHPMailer
         //Sendmail docs: http://www.sendmail.org/~ca/email/man/sendmail.html
         //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html
         //Example problem: https://www.drupal.org/node/1057954
-        if (empty($this->Sender) && !empty(ini_get('sendmail_from'))) {
+
+        //PHP 5.6 workaround
+        $sendmail_from_value = ini_get('sendmail_from');
+        if (empty($this->Sender) && !empty($sendmail_from_value)) {
             //PHP config has a sender address we can use
             $this->Sender = ini_get('sendmail_from');
         }
@@ -1881,7 +1889,10 @@ class PHPMailer
         //Qmail docs: http://www.qmail.org/man/man8/qmail-inject.html
         //Example problem: https://www.drupal.org/node/1057954
         //CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be escaped.
-        if (empty($this->Sender) && !empty(ini_get('sendmail_from'))) {
+
+        //PHP 5.6 workaround
+        $sendmail_from_value = ini_get('sendmail_from');
+        if (empty($this->Sender) && !empty($sendmail_from_value)) {
             //PHP config has a sender address we can use
             $this->Sender = ini_get('sendmail_from');
         }
@@ -2198,7 +2209,7 @@ class PHPMailer
      * @param string $langcode  ISO 639-1 2-character language code (e.g. French is "fr")
      *                          Optionally, the language code can be enhanced with a 4-character
      *                          script annotation and/or a 2-character country annotation.
-     * @param string $lang_path Path to the language file directory, with trailing separator (slash).D
+     * @param string $lang_path Path to the language file directory, with trailing separator (slash)
      *                          Do not set this from user input!
      *
      * @return bool Returns true if the requested language was loaded, false otherwise.
diff --git a/src/wp-includes/PHPMailer/SMTP.php b/src/wp-includes/PHPMailer/SMTP.php
index 0cea1e8640..676dba2923 100644
--- a/src/wp-includes/PHPMailer/SMTP.php
+++ b/src/wp-includes/PHPMailer/SMTP.php
@@ -35,7 +35,7 @@ class SMTP
      *
      * @var string
      */
-    const VERSION = '6.5.1';
+    const VERSION = '6.5.3';
 
     /**
      * SMTP line break constant.
@@ -392,7 +392,6 @@ class SMTP
                 STREAM_CLIENT_CONNECT,
                 $socket_context
             );
-            restore_error_handler();
         } else {
             //Fall back to fsockopen which should work in more places, but is missing some features
             $this->edebug(
@@ -407,8 +406,8 @@ class SMTP
                 $errstr,
                 $timeout
             );
-            restore_error_handler();
         }
+        restore_error_handler();
 
         //Verify we connected properly
         if (!is_resource($connection)) {
@@ -696,7 +695,7 @@ class SMTP
     /**
      * Send an SMTP DATA command.
      * Issues a data command and sends the msg_data to the server,
-     * finializing the mail transaction. $msg_data is the message
+     * finalizing the mail transaction. $msg_data is the message
      * that is to be send with the headers. Each header needs to be
      * on a single line followed by a <CRLF> with the message headers
      * and the message body being separated by an additional <CRLF>.
@@ -1170,7 +1169,7 @@ class SMTP
         if (!$this->server_caps) {
             $this->setError('No HELO/EHLO was sent');
 
-            return;
+            return null;
         }
 
         if (!array_key_exists($name, $this->server_caps)) {
@@ -1182,7 +1181,7 @@ class SMTP
             }
             $this->setError('HELO handshake was used; No information about server extensions available');
 
-            return;
+            return null;
         }
 
         return $this->server_caps[$name];
diff --git a/src/wp-includes/SimplePie/Cache/Redis.php b/src/wp-includes/SimplePie/Cache/Redis.php
index dbc88e829a..a5925bec2f 100644
--- a/src/wp-includes/SimplePie/Cache/Redis.php
+++ b/src/wp-includes/SimplePie/Cache/Redis.php
@@ -152,7 +152,7 @@ class SimplePie_Cache_Redis implements SimplePie_Cache_Base {
         if ($data !== false) {
             $return = $this->cache->set($this->name, $data);
             if ($this->options['expire']) {
-                return $this->cache->expire($this->name, $this->ttl);
+                return $this->cache->expire($this->name, $this->options['expire']);
             }
             return $return;
         }
diff --git a/src/wp-includes/SimplePie/Enclosure.php b/src/wp-includes/SimplePie/Enclosure.php
index 32216d848c..8a4cffa30e 100644
--- a/src/wp-includes/SimplePie/Enclosure.php
+++ b/src/wp-includes/SimplePie/Enclosure.php
@@ -1152,7 +1152,12 @@ class SimplePie_Enclosure
 		// If we encounter an unsupported mime-type, check the file extension and guess intelligently.
 		if (!in_array($type, array_merge($types_flash, $types_fmedia, $types_quicktime, $types_wmedia, $types_mp3)))
 		{
-			switch (strtolower($this->get_extension()))
+			$extension = $this->get_extension();
+			if ($extension === null) {
+				return null;
+			}
+
+			switch (strtolower($extension))
 			{
 				// Audio mime-types
 				case 'aac':
diff --git a/src/wp-includes/SimplePie/File.php b/src/wp-includes/SimplePie/File.php
index 90ad8196a6..c2d368b3b8 100644
--- a/src/wp-includes/SimplePie/File.php
+++ b/src/wp-includes/SimplePie/File.php
@@ -106,7 +106,7 @@ class SimplePie_File
 				curl_setopt($fp, CURLOPT_FAILONERROR, 1);
 				curl_setopt($fp, CURLOPT_TIMEOUT, $timeout);
 				curl_setopt($fp, CURLOPT_CONNECTTIMEOUT, $timeout);
-				curl_setopt($fp, CURLOPT_REFERER, $url);
+				curl_setopt($fp, CURLOPT_REFERER, SimplePie_Misc::url_remove_credentials($url));
 				curl_setopt($fp, CURLOPT_USERAGENT, $useragent);
 				curl_setopt($fp, CURLOPT_HTTPHEADER, $headers2);
 				foreach ($curl_options as $curl_param => $curl_value) {
@@ -119,6 +119,7 @@ class SimplePie_File
 					curl_setopt($fp, CURLOPT_ENCODING, 'none');
 					$this->headers = curl_exec($fp);
 				}
+				$this->status_code = curl_getinfo($fp, CURLINFO_HTTP_CODE);
 				if (curl_errno($fp))
 				{
 					$this->error = 'cURL error ' . curl_errno($fp) . ': ' . curl_error($fp);
diff --git a/src/wp-includes/SimplePie/HTTP/Parser.php b/src/wp-includes/SimplePie/HTTP/Parser.php
index 1dbe06c3e3..a4c48ddb71 100644
--- a/src/wp-includes/SimplePie/HTTP/Parser.php
+++ b/src/wp-includes/SimplePie/HTTP/Parser.php
@@ -507,11 +507,13 @@ class SimplePie_HTTP_Parser
 	{
 		$data = explode("\r\n\r\n", $headers, $count);
 		$data = array_pop($data);
-		if (false !== stripos($data, "HTTP/1.0 200 Connection established\r\n\r\n")) {
-			$data = str_ireplace("HTTP/1.0 200 Connection established\r\n\r\n", '', $data);
+		if (false !== stripos($data, "HTTP/1.0 200 Connection established\r\n")) {
+			$exploded = explode("\r\n\r\n", $data, 2);
+			$data = end($exploded);
 		}
-		if (false !== stripos($data, "HTTP/1.1 200 Connection established\r\n\r\n")) {
-			$data = str_ireplace("HTTP/1.1 200 Connection established\r\n\r\n", '', $data);
+		if (false !== stripos($data, "HTTP/1.1 200 Connection established\r\n")) {
+			$exploded = explode("\r\n\r\n", $data, 2);
+			$data = end($exploded);
 		}
 		return $data;
 	}
diff --git a/src/wp-includes/SimplePie/Item.php b/src/wp-includes/SimplePie/Item.php
index 5be6b19940..3ac4fa882b 100644
--- a/src/wp-includes/SimplePie/Item.php
+++ b/src/wp-includes/SimplePie/Item.php
@@ -1803,7 +1803,7 @@ class SimplePie_Item
 							}
 							if (isset($content['attribs']['']['fileSize']))
 							{
-								$length = ceil($content['attribs']['']['fileSize']);
+								$length = intval($content['attribs']['']['fileSize']);
 							}
 							if (isset($content['attribs']['']['medium']))
 							{
@@ -2425,7 +2425,7 @@ class SimplePie_Item
 						}
 						if (isset($content['attribs']['']['fileSize']))
 						{
-							$length = ceil($content['attribs']['']['fileSize']);
+							$length = intval($content['attribs']['']['fileSize']);
 						}
 						if (isset($content['attribs']['']['medium']))
 						{
@@ -2790,7 +2790,7 @@ class SimplePie_Item
 					}
 					if (isset($link['attribs']['']['length']))
 					{
-						$length = ceil($link['attribs']['']['length']);
+						$length = intval($link['attribs']['']['length']);
 					}
 					if (isset($link['attribs']['']['title']))
 					{
@@ -2833,7 +2833,7 @@ class SimplePie_Item
 					}
 					if (isset($link['attribs']['']['length']))
 					{
-						$length = ceil($link['attribs']['']['length']);
+						$length = intval($link['attribs']['']['length']);
 					}
 
 					// Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
@@ -2862,13 +2862,14 @@ class SimplePie_Item
 					$width = null;
 
 					$url = $this->sanitize($enclosure[0]['attribs']['']['url'], SIMPLEPIE_CONSTRUCT_IRI, $this->get_base($enclosure[0]));
+					$url = $this->feed->sanitize->https_url($url);
 					if (isset($enclosure[0]['attribs']['']['type']))
 					{
 						$type = $this->sanitize($enclosure[0]['attribs']['']['type'], SIMPLEPIE_CONSTRUCT_TEXT);
 					}
 					if (isset($enclosure[0]['attribs']['']['length']))
 					{
-						$length = ceil($enclosure[0]['attribs']['']['length']);
+						$length = intval($enclosure[0]['attribs']['']['length']);
 					}
 
 					// Since we don't have group or content for these, we'll just pass the '*_parent' variables directly to the constructor
diff --git a/src/wp-includes/SimplePie/Locator.php b/src/wp-includes/SimplePie/Locator.php
index a207df6fee..c5fae05791 100644
--- a/src/wp-includes/SimplePie/Locator.php
+++ b/src/wp-includes/SimplePie/Locator.php
@@ -64,6 +64,7 @@ class SimplePie_Locator
 	var $max_checked_feeds = 10;
 	var $force_fsockopen = false;
 	var $curl_options = array();
+	var $dom;
 	protected $registry;
 
 	public function __construct(SimplePie_File $file, $timeout = 10, $useragent = null, $max_checked_feeds = 10, $force_fsockopen = false, $curl_options = array())
@@ -75,12 +76,19 @@ class SimplePie_Locator
 		$this->force_fsockopen = $force_fsockopen;
 		$this->curl_options = $curl_options;
 
-		if (class_exists('DOMDocument'))
+		if (class_exists('DOMDocument') && $this->file->body != '')
 		{
 			$this->dom = new DOMDocument();
 
 			set_error_handler(array('SimplePie_Misc', 'silence_errors'));
-			$this->dom->loadHTML($this->file->body);
+			try
+			{
+				$this->dom->loadHTML($this->file->body);
+			}
+			catch (Throwable $ex)
+			{
+				$this->dom = null;
+			}
 			restore_error_handler();
 		}
 		else
diff --git a/src/wp-includes/SimplePie/Misc.php b/src/wp-includes/SimplePie/Misc.php
index a52498ac76..ce3cf0f546 100644
--- a/src/wp-includes/SimplePie/Misc.php
+++ b/src/wp-includes/SimplePie/Misc.php
@@ -2260,4 +2260,14 @@ function embed_wmedia(width, height, link) {
 	{
 		// No-op
 	}
+
+	/**
+	 * Sanitize a URL by removing HTTP credentials.
+	 * @param string $url the URL to sanitize.
+	 * @return string the same URL without HTTP credentials.
+	 */
+	public static function url_remove_credentials($url)
+	{
+		return preg_replace('#^(https?://)[^/:@]+:[^/:@]+@#i', '$1', $url);
+	}
 }
diff --git a/src/wp-includes/SimplePie/Parser.php b/src/wp-includes/SimplePie/Parser.php
index 4efdf41a71..3813b74b27 100644
--- a/src/wp-includes/SimplePie/Parser.php
+++ b/src/wp-includes/SimplePie/Parser.php
@@ -164,12 +164,30 @@ class SimplePie_Parser
 			xml_set_element_handler($xml, 'tag_open', 'tag_close');
 
 			// Parse!
-			if (!xml_parse($xml, $data, true))
+			$wrapper = @is_writable(sys_get_temp_dir()) ? 'php://temp' : 'php://memory';
+			if (($stream = fopen($wrapper, 'r+')) &&
+				fwrite($stream, $data) &&
+				rewind($stream))
+			{
+				//Parse by chunks not to use too much memory
+				do
+				{
+					$stream_data = fread($stream, 1048576);
+					if (!xml_parse($xml, $stream_data === false ? '' : $stream_data, feof($stream)))
+					{
+						$this->error_code = xml_get_error_code($xml);
+						$this->error_string = xml_error_string($this->error_code);
+						$return = false;
+						break;
+					}
+				} while (!feof($stream));
+				fclose($stream);
+			}
+			else
 			{
-				$this->error_code = xml_get_error_code($xml);
-				$this->error_string = xml_error_string($this->error_code);
 				$return = false;
 			}
+
 			$this->current_line = xml_get_current_line_number($xml);
 			$this->current_column = xml_get_current_column_number($xml);
 			$this->current_byte = xml_get_current_byte_index($xml);
diff --git a/src/wp-includes/SimplePie/Registry.php b/src/wp-includes/SimplePie/Registry.php
index bf3baf1793..1aac51d07a 100644
--- a/src/wp-includes/SimplePie/Registry.php
+++ b/src/wp-includes/SimplePie/Registry.php
@@ -208,7 +208,8 @@ class SimplePie_Registry
 			{
 				case 'Cache':
 					// For backwards compatibility with old non-static
-					// Cache::create() methods
+					// Cache::create() methods in PHP < 8.0.
+					// No longer supported as of PHP 8.0.
 					if ($method === 'get_handler')
 					{
 						$result = @call_user_func_array(array($class, 'create'), $parameters);
diff --git a/src/wp-includes/SimplePie/Sanitize.php b/src/wp-includes/SimplePie/Sanitize.php
index 35838032fc..d421c83072 100644
--- a/src/wp-includes/SimplePie/Sanitize.php
+++ b/src/wp-includes/SimplePie/Sanitize.php
@@ -71,6 +71,15 @@ class SimplePie_Sanitize
 	var $useragent = '';
 	var $force_fsockopen = false;
 	var $replace_url_attributes = null;
+	var $registry;
+
+	/**
+	 * List of domains for which to force HTTPS.
+	 * @see SimplePie_Sanitize::set_https_domains()
+	 * Array is a tree split at DNS levels. Example:
+	 * array('biz' => true, 'com' => array('example' => true), 'net' => array('example' => array('www' => true)))
+	 */
+	var $https_domains = array();
 
 	public function __construct()
 	{
@@ -241,6 +250,68 @@ class SimplePie_Sanitize
 		$this->replace_url_attributes = (array) $element_attribute;
 	}
 
+	/**
+	 * Set the list of domains for which to force HTTPS.
+	 * @see SimplePie_Misc::https_url()
+	 * Example array('biz', 'example.com', 'example.org', 'www.example.net');
+	 */
+	public function set_https_domains($domains)
+	{
+		$this->https_domains = array();
+		foreach ($domains as $domain)
+		{
+			$domain = trim($domain, ". \t\n\r\0\x0B");
+			$segments = array_reverse(explode('.', $domain));
+			$node =& $this->https_domains;
+			foreach ($segments as $segment)
+			{//Build a tree
+				if ($node === true)
+				{
+					break;
+				}
+				if (!isset($node[$segment]))
+				{
+					$node[$segment] = array();
+				}
+				$node =& $node[$segment];
+			}
+			$node = true;
+		}
+	}
+
+	/**
+	 * Check if the domain is in the list of forced HTTPS.
+	 */
+	protected function is_https_domain($domain)
+	{
+		$domain = trim($domain, '. ');
+		$segments = array_reverse(explode('.', $domain));
+		$node =& $this->https_domains;
+		foreach ($segments as $segment)
+		{//Explore the tree
+			if (isset($node[$segment]))
+			{
+				$node =& $node[$segment];
+			}
+			else
+			{
+				break;
+			}
+		}
+		return $node === true;
+	}
+
+	/**
+	 * Force HTTPS for selected Web sites.
+	 */
+	public function https_url($url)
+	{
+		return (strtolower(substr($url, 0, 7)) === 'http://') &&
+			$this->is_https_domain(parse_url($url, PHP_URL_HOST)) ?
+			substr_replace($url, 's', 4, 0) :	//Add the 's' to HTTPS
+			$url;
+	}
+
 	public function sanitize($data, $type, $base = '')
 	{
 		$data = trim($data);
@@ -443,6 +514,7 @@ class SimplePie_Sanitize
 						$value = $this->registry->call('Misc', 'absolutize_url', array($element->getAttribute($attribute), $this->base));
 						if ($value !== false)
 						{
+							$value = $this->https_url($value);
 							$element->setAttribute($attribute, $value);
 						}
 					}
diff --git a/src/wp-includes/admin-bar.php b/src/wp-includes/admin-bar.php
index ba85e1f1ae..18ca17b5fa 100644
--- a/src/wp-includes/admin-bar.php
+++ b/src/wp-includes/admin-bar.php
@@ -408,6 +408,33 @@ function wp_admin_bar_site_menu( $wp_admin_bar ) {
 	}
 }
 
+/**
+ * Adds the "Edit site" link to the Toolbar.
+ *
+ * @since 5.9.0
+ *
+ * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance.
+ */
+function wp_admin_bar_edit_site_menu( $wp_admin_bar ) {
+	// Don't show if a block theme is not activated.
+	if ( ! wp_is_block_theme() ) {
+		return;
+	}
+
+	// Don't show for users who can't edit theme options or when in the admin.
+	if ( ! current_user_can( 'edit_theme_options' ) || is_admin() ) {
+		return;
+	}
+
+	$wp_admin_bar->add_node(
+		array(
+			'id'    => 'site-editor',
+			'title' => __( 'Edit site' ),
+			'href'  => admin_url( 'site-editor.php' ),
+		)
+	);
+}
+
 /**
  * Adds the "Customize" link to the Toolbar.
  *
@@ -419,6 +446,11 @@ function wp_admin_bar_site_menu( $wp_admin_bar ) {
 function wp_admin_bar_customize_menu( $wp_admin_bar ) {
 	global $wp_customize;
 
+	// Don't show if a block theme is activated and no plugins use the customizer.
+	if ( wp_is_block_theme() && ! has_action( 'customize_register' ) ) {
+		return;
+	}
+
 	// Don't show for users who can't access the customizer or when in the admin.
 	if ( ! current_user_can( 'customize' ) || is_admin() ) {
 		return;
diff --git a/src/wp-includes/assets/script-loader-packages.php b/src/wp-includes/assets/script-loader-packages.php
index b4c86f09ef..94a0f500f7 100644
--- a/src/wp-includes/assets/script-loader-packages.php
+++ b/src/wp-includes/assets/script-loader-packages.php
@@ -1 +1 @@
-<?php return array('a11y.js' => array('dependencies' => array('wp-dom-ready', 'wp-i18n', 'wp-polyfill'), 'version' => '3243bf46da298d46850bacd71bcc111e'), 'annotations.js' => array('dependencies' => array('lodash', 'wp-data', 'wp-hooks', 'wp-i18n', 'wp-polyfill', 'wp-rich-text'), 'version' => '4556c7bbdf2d9d6a81c1ca770cf73893'), 'api-fetch.js' => array('dependencies' => array('wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => '293ce6ecd6439249249485d369385617'), 'autop.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'bed28c77ea305cd8e02b0529011189f9'), 'blob.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'b8855b04f6a52a7bca89f8d945d46866'), 'block-directory.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-data-controls', 'wp-edit-post', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-primitives'), 'version' => 'de3c45fbc5977806e2091ee4f6f59b13'), 'block-editor.js' => array('dependencies' => array('lodash', 'react', 'wp-a11y', 'wp-blob', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-shortcode', 'wp-token-list', 'wp-url', 'wp-wordcount'), 'version' => 'd94e63317f1c2e9373815c1ae03f911b'), 'block-library.js' => array('dependencies' => array('lodash', 'moment', 'react', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-reusable-blocks', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport'), 'version' => '175a701e1aae933281f8553f0ea7c8f5'), 'block-serialization-default-parser.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'cc8e5d0e23cf68bb9944bf2a7a016e52'), 'blocks.js' => array('dependencies' => array('lodash', 'wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-primitives', 'wp-shortcode'), 'version' => '751c2504a888adf0398a0c604da94753'), 'components.js' => array('dependencies' => array('lodash', 'moment', 'react', 'react-dom', 'wp-a11y', 'wp-compose', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-warning'), 'version' => '4d174b4215adfc2b5b76752aad04e5e7'), 'compose.js' => array('dependencies' => array('lodash', 'react', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-priority-queue'), 'version' => '0f215b3868e125c7f29468d3cbb4a759'), 'core-data.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-blocks', 'wp-data', 'wp-data-controls', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-url'), 'version' => 'b077dccf93658b45b01de1f28d38f04c'), 'customize-widgets.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-polyfill', 'wp-primitives', 'wp-widgets'), 'version' => '09aff80d8b1c180d502f354b5d4ba91f'), 'data.js' => array('dependencies' => array('lodash', 'react', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-priority-queue', 'wp-redux-routine'), 'version' => 'c15e612c9f374c80bc488bce207feb1f'), 'data-controls.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-deprecated', 'wp-polyfill'), 'version' => 'ceef9ce8c9c058d69ebf44db39353687'), 'date.js' => array('dependencies' => array('moment', 'wp-polyfill'), 'version' => '2abad43cdd2da929e01f7d7648e392ab'), 'deprecated.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => '13724e4923d40e224e7c99fdc350a6a1'), 'dom.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '25489fd13f6cba04738b00752f79a668'), 'dom-ready.js' => array('dependencies' => array('wp-polyfill'), 'version' => '1e1b9c1535c1c32d3236d41aa27c7bf9'), 'edit-post.js' => array('dependencies' => array('lodash', 'react', 'wp-a11y', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-data-controls', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-primitives', 'wp-url', 'wp-viewport', 'wp-warning'), 'version' => '01ede5cc8087545dfed018f2b0b9dba0'), 'edit-widgets.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-primitives', 'wp-reusable-blocks', 'wp-url', 'wp-viewport', 'wp-widgets'), 'version' => 'ef2446963dc78b4208f8f4f0cf70b483'), 'editor.js' => array('dependencies' => array('lodash', 'react', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-data-controls', 'wp-date', 'wp-deprecated', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-reusable-blocks', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-wordcount'), 'version' => '60592ad74e11e6bf6d5f155bd5fe286c'), 'element.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-escape-html', 'wp-polyfill'), 'version' => '669f5c11ca4fe7c44d64157347343913'), 'escape-html.js' => array('dependencies' => array('wp-polyfill'), 'version' => '4f03d9c45a01df8191f6833373fe1cfa'), 'format-library.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-url'), 'version' => '23c734677604301357e154aef27733a3'), 'hooks.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'f7ecf196f38940ae0673c46c6c30cd86'), 'html-entities.js' => array('dependencies' => array('wp-polyfill'), 'version' => '140ecb91be91e7eec34220584d085033'), 'i18n.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => 'd897c43bea0c2753dd7368eb2d990898'), 'is-shallow-equal.js' => array('dependencies' => array('wp-polyfill'), 'version' => '798b660598677b39413fdb5f68624aa8'), 'keyboard-shortcuts.js' => array('dependencies' => array('lodash', 'wp-compose', 'wp-data', 'wp-keycodes', 'wp-polyfill'), 'version' => '53d021916e259972fbc68f68892323ac'), 'keycodes.js' => array('dependencies' => array('lodash', 'wp-i18n', 'wp-polyfill'), 'version' => 'cf38e80b47baf72f4822ddb8847f4f24'), 'list-reusable-blocks.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => '80af68069161321e8e131bad6a00d5dc'), 'media-utils.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => 'df373dcd13d7abc3f8b042f369b88557'), 'notices.js' => array('dependencies' => array('lodash', 'wp-data', 'wp-polyfill'), 'version' => 'b08e53c1e070954fa0884cad9a164683'), 'nux.js' => array('dependencies' => array('lodash', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives'), 'version' => 'c0c1a368ca9ade95dbf55485e8d59b68'), 'plugins.js' => array('dependencies' => array('lodash', 'wp-compose', 'wp-element', 'wp-hooks', 'wp-polyfill', 'wp-primitives'), 'version' => 'a843ba54a81c99735da976cf43fac526'), 'primitives.js' => array('dependencies' => array('wp-element', 'wp-polyfill'), 'version' => 'dc0962ac2885a26f8c2abdbe0cf0e333'), 'priority-queue.js' => array('dependencies' => array('wp-polyfill'), 'version' => '18c93919f04bb681234310b314675b17'), 'redux-routine.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '3c50c6bd1563bc7fb88433198400a74c'), 'reusable-blocks.js' => array('dependencies' => array('lodash', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-url'), 'version' => 'bec2012396758ad7603274e338191a42'), 'rich-text.js' => array('dependencies' => array('lodash', 'wp-compose', 'wp-data', 'wp-element', 'wp-escape-html', 'wp-keycodes', 'wp-polyfill'), 'version' => 'f0498feae49f87cd9a121f3e1bae242d'), 'server-side-render.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => '7c732c1add9f9667bdf8dd66fbf74759'), 'shortcode.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '15757929bc8d52a3b184c3fcaeb38c64'), 'token-list.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '7bcd3684420783ef1f6ebb7680fe958e'), 'url.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => 'e9868cffba8a348b31011f87dd53b3c4'), 'viewport.js' => array('dependencies' => array('lodash', 'wp-compose', 'wp-data', 'wp-element', 'wp-polyfill'), 'version' => '0a54bbdc44c5f135018c568a887b8279'), 'warning.js' => array('dependencies' => array('wp-polyfill'), 'version' => '202ac16e99afe7c33c257b248625a947'), 'widgets.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-url'), 'version' => '0f11251901b3f83a3373551071d06740'), 'wordcount.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '02339c8ad03da1e7a03f9212da004007'));
\ No newline at end of file
+<?php return array('a11y.js' => array('dependencies' => array('wp-dom-ready', 'wp-i18n', 'wp-polyfill'), 'version' => 'fa03f246887237d01c383e85ff6f107c'), 'annotations.js' => array('dependencies' => array('lodash', 'wp-data', 'wp-hooks', 'wp-i18n', 'wp-polyfill', 'wp-rich-text'), 'version' => 'acd6ed75d460d0d3781e1ef6c12cf2aa'), 'api-fetch.js' => array('dependencies' => array('wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => '59f6dbf5a1d9a141515c25411bc4f01e'), 'autop.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'e65166da67ee5d5ff66d36ab14532b3b'), 'blob.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'b8855b04f6a52a7bca89f8d945d46866'), 'block-directory.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-edit-post', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-primitives'), 'version' => 'a8ff26eaaddf949aee8669d14277aec3'), 'block-editor.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-shortcode', 'wp-token-list', 'wp-url', 'wp-warning', 'wp-wordcount'), 'version' => '85aa1b380c2c41a1ab8a56731690f7a1'), 'block-library.js' => array('dependencies' => array('lodash', 'moment', 'wp-a11y', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-reusable-blocks', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport'), 'version' => '9121ba79f9f6bd15c1b4cd17907c86b3'), 'block-serialization-default-parser.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'cc8e5d0e23cf68bb9944bf2a7a016e52'), 'blocks.js' => array('dependencies' => array('lodash', 'wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-shortcode'), 'version' => 'a32036d432544d670dbd252aafb343aa'), 'components.js' => array('dependencies' => array('lodash', 'moment', 'react', 'react-dom', 'wp-a11y', 'wp-compose', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-warning'), 'version' => '8bc601986111961e36a4626e9187202b'), 'compose.js' => array('dependencies' => array('lodash', 'react', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-polyfill', 'wp-priority-queue'), 'version' => '1491dea52ef44b12c4130dc7fe00ea20'), 'core-data.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-blocks', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-url'), 'version' => '15ee57b1f0ac2f25cdee181ee369950a'), 'customize-widgets.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-plugins', 'wp-polyfill', 'wp-primitives', 'wp-viewport', 'wp-widgets'), 'version' => 'a4ae79ff9d722a302a31b7af5478e6b7'), 'data.js' => array('dependencies' => array('lodash', 'react', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-priority-queue', 'wp-redux-routine'), 'version' => '93e547cee9fc74070215d5c1ce324bf6'), 'data-controls.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-deprecated', 'wp-polyfill'), 'version' => 'a6b5897d9fe0799f7c5167a4a9fb3fc2'), 'date.js' => array('dependencies' => array('moment', 'wp-polyfill'), 'version' => 'be8358e0f87d66f2bec405069f113602'), 'deprecated.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => '64e8de35a014ff611a39da7042d361dd'), 'dom.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '7d156934b7b48d00965baf08e162ab91'), 'dom-ready.js' => array('dependencies' => array('wp-polyfill'), 'version' => '7ad174e925c73007ee5b17358242e7d9'), 'edit-post.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-data-controls', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-primitives', 'wp-url', 'wp-viewport', 'wp-warning'), 'version' => '1a6df337153da0478216f4b1f58bb3ec'), 'edit-site.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-data-controls', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-primitives', 'wp-reusable-blocks', 'wp-url', 'wp-viewport'), 'version' => 'dde8b7509907e7be17e474892a0acf90'), 'edit-widgets.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-plugins', 'wp-polyfill', 'wp-primitives', 'wp-reusable-blocks', 'wp-url', 'wp-viewport', 'wp-widgets'), 'version' => '66e504d030a7022e8ff7b58a56042f3a'), 'editor.js' => array('dependencies' => array('lodash', 'react', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-data-controls', 'wp-date', 'wp-deprecated', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-reusable-blocks', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-wordcount'), 'version' => 'ef2feccbd53a82ba328a9f678e261049'), 'element.js' => array('dependencies' => array('lodash', 'react', 'react-dom', 'wp-escape-html', 'wp-polyfill'), 'version' => '32e0abe121ab85a88acb6472274ad136'), 'escape-html.js' => array('dependencies' => array('wp-polyfill'), 'version' => '4f03d9c45a01df8191f6833373fe1cfa'), 'format-library.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-polyfill', 'wp-primitives', 'wp-rich-text', 'wp-url'), 'version' => '638b31b2e32bdc443afa62d9aa251d8a'), 'hooks.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'fee9af3abfeb76b497fd074608dca647'), 'html-entities.js' => array('dependencies' => array('wp-polyfill'), 'version' => '140ecb91be91e7eec34220584d085033'), 'i18n.js' => array('dependencies' => array('wp-hooks', 'wp-polyfill'), 'version' => '9ddfa7e364f034c04939567c6c6079d5'), 'is-shallow-equal.js' => array('dependencies' => array('wp-polyfill'), 'version' => '798b660598677b39413fdb5f68624aa8'), 'keyboard-shortcuts.js' => array('dependencies' => array('lodash', 'wp-data', 'wp-element', 'wp-keycodes', 'wp-polyfill'), 'version' => '78a4020b31c5ae28f7e97405b83d5027'), 'keycodes.js' => array('dependencies' => array('lodash', 'wp-i18n', 'wp-polyfill'), 'version' => '57a448b50bb24e264205e448e0b19ea2'), 'list-reusable-blocks.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => '411699046747b4d90f82c5b2547ff43c'), 'media-utils.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n', 'wp-polyfill'), 'version' => 'ab2c70450229febbbb0a87e88074db07'), 'notices.js' => array('dependencies' => array('lodash', 'wp-data', 'wp-polyfill'), 'version' => 'b9e78ffafe025c455d9ccf2c1a78d1de'), 'nux.js' => array('dependencies' => array('lodash', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-primitives'), 'version' => 'feee5fbb3df2a20c6dc4653f33d12e13'), 'plugins.js' => array('dependencies' => array('lodash', 'wp-compose', 'wp-element', 'wp-hooks', 'wp-polyfill', 'wp-primitives'), 'version' => '76d0e1ad216a273ab1359db9aaab1809'), 'primitives.js' => array('dependencies' => array('wp-element', 'wp-polyfill'), 'version' => 'ec5aecfc61b399ed5c8fa2de6b175942'), 'priority-queue.js' => array('dependencies' => array('wp-polyfill'), 'version' => '18c93919f04bb681234310b314675b17'), 'redux-routine.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => 'f4483156a9bae90512f894dbd867b929'), 'reusable-blocks.js' => array('dependencies' => array('lodash', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives', 'wp-url'), 'version' => '436b8be211e4f30893de92b1faad8984'), 'rich-text.js' => array('dependencies' => array('lodash', 'wp-a11y', 'wp-compose', 'wp-data', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-keycodes', 'wp-polyfill'), 'version' => '855cfaa16e1e86346cdf24239800bcaf'), 'server-side-render.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-polyfill', 'wp-url'), 'version' => 'c8b79b06e8a76272ee868b17b6a9d37b'), 'shortcode.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '0e7a194ec8387c92e8d2c2b3755c3c9b'), 'token-list.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => 'a50777df914543c1a77067959d6b3fbf'), 'url.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => 'd99eea3ea07b8acf242f75a06a2c49ff'), 'viewport.js' => array('dependencies' => array('lodash', 'wp-compose', 'wp-data', 'wp-element', 'wp-polyfill'), 'version' => '67406a236d2370eedc90db2dfdcb46bd'), 'warning.js' => array('dependencies' => array('wp-polyfill'), 'version' => '5ebe2df53cf3c74ebffc7e2d3e76184c'), 'widgets.js' => array('dependencies' => array('lodash', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives'), 'version' => '3dd8fa0fcd8381649603b755437d9be1'), 'wordcount.js' => array('dependencies' => array('lodash', 'wp-polyfill'), 'version' => '02339c8ad03da1e7a03f9212da004007'));
\ No newline at end of file
diff --git a/src/wp-includes/author-template.php b/src/wp-includes/author-template.php
index 2911366f03..e129e6f701 100644
--- a/src/wp-includes/author-template.php
+++ b/src/wp-includes/author-template.php
@@ -343,12 +343,13 @@ function the_author_posts_link( $deprecated = '' ) {
  */
 function get_author_posts_url( $author_id, $author_nicename = '' ) {
 	global $wp_rewrite;
-	$auth_ID = (int) $author_id;
-	$link    = $wp_rewrite->get_author_permastruct();
+
+	$author_id = (int) $author_id;
+	$link      = $wp_rewrite->get_author_permastruct();
 
 	if ( empty( $link ) ) {
 		$file = home_url( '/' );
-		$link = $file . '?author=' . $auth_ID;
+		$link = $file . '?author=' . $author_id;
 	} else {
 		if ( '' === $author_nicename ) {
 			$user = get_userdata( $author_id );
diff --git a/src/wp-includes/block-editor.php b/src/wp-includes/block-editor.php
index 1e3f40672a..672518757c 100644
--- a/src/wp-includes/block-editor.php
+++ b/src/wp-includes/block-editor.php
@@ -83,6 +83,7 @@ function get_block_categories( $post_or_block_editor_context ) {
 	 * @param WP_Block_Editor_Context $block_editor_context The current block editor context.
 	 */
 	$block_categories = apply_filters( 'block_categories_all', $block_categories, $block_editor_context );
+
 	if ( ! empty( $block_editor_context->post ) ) {
 		$post = $block_editor_context->post;
 
@@ -123,6 +124,7 @@ function get_allowed_block_types( $block_editor_context ) {
 	 * @param WP_Block_Editor_Context $block_editor_context The current block editor context.
 	 */
 	$allowed_block_types = apply_filters( 'allowed_block_types_all', $allowed_block_types, $block_editor_context );
+
 	if ( ! empty( $block_editor_context->post ) ) {
 		$post = $block_editor_context->post;
 
@@ -187,23 +189,37 @@ function get_default_block_editor_settings() {
 		}
 	}
 
+	// These styles are used if the "no theme styles" options is triggered or on
+	// themes without their own editor styles.
+	$default_editor_styles_file = ABSPATH . WPINC . '/css/dist/block-editor/default-editor-styles.css';
+	if ( file_exists( $default_editor_styles_file ) ) {
+		$default_editor_styles = array(
+			array( 'css' => file_get_contents( $default_editor_styles_file ) ),
+		);
+	} else {
+		$default_editor_styles = array();
+	}
+
 	$editor_settings = array(
-		'alignWide'              => get_theme_support( 'align-wide' ),
-		'allowedBlockTypes'      => true,
-		'allowedMimeTypes'       => get_allowed_mime_types(),
-		'blockCategories'        => get_default_block_categories(),
-		'disableCustomColors'    => get_theme_support( 'disable-custom-colors' ),
-		'disableCustomFontSizes' => get_theme_support( 'disable-custom-font-sizes' ),
-		'disableCustomGradients' => get_theme_support( 'disable-custom-gradients' ),
-		'enableCustomLineHeight' => get_theme_support( 'custom-line-height' ),
-		'enableCustomSpacing'    => get_theme_support( 'custom-spacing' ),
-		'enableCustomUnits'      => get_theme_support( 'custom-units' ),
-		'isRTL'                  => is_rtl(),
-		'imageDefaultSize'       => $image_default_size,
-		'imageDimensions'        => $image_dimensions,
-		'imageEditing'           => true,
-		'imageSizes'             => $available_image_sizes,
-		'maxUploadFileSize'      => $max_upload_size,
+		'alignWide'                        => get_theme_support( 'align-wide' ),
+		'allowedBlockTypes'                => true,
+		'allowedMimeTypes'                 => get_allowed_mime_types(),
+		'defaultEditorStyles'              => $default_editor_styles,
+		'blockCategories'                  => get_default_block_categories(),
+		'disableCustomColors'              => get_theme_support( 'disable-custom-colors' ),
+		'disableCustomFontSizes'           => get_theme_support( 'disable-custom-font-sizes' ),
+		'disableCustomGradients'           => get_theme_support( 'disable-custom-gradients' ),
+		'enableCustomLineHeight'           => get_theme_support( 'custom-line-height' ),
+		'enableCustomSpacing'              => get_theme_support( 'custom-spacing' ),
+		'enableCustomUnits'                => get_theme_support( 'custom-units' ),
+		'isRTL'                            => is_rtl(),
+		'imageDefaultSize'                 => $image_default_size,
+		'imageDimensions'                  => $image_dimensions,
+		'imageEditing'                     => true,
+		'imageSizes'                       => $available_image_sizes,
+		'maxUploadFileSize'                => $max_upload_size,
+		// The following flag is required to enable the new Gallery block format on the mobile apps in 5.9.
+		'__unstableGalleryWithImageBlocks' => true,
 	);
 
 	// Theme settings.
@@ -291,47 +307,63 @@ function get_block_editor_settings( array $custom_settings, $block_editor_contex
 		$custom_settings
 	);
 
-	$theme_json = WP_Theme_JSON_Resolver::get_merged_data( $editor_settings );
+	$presets = array(
+		array(
+			'css'            => 'variables',
+			'__unstableType' => 'presets',
+		),
+		array(
+			'css'            => 'presets',
+			'__unstableType' => 'presets',
+		),
+	);
+	foreach ( $presets as $preset_style ) {
+		$actual_css = wp_get_global_stylesheet( array( $preset_style['css'] ) );
+		if ( '' !== $actual_css ) {
+			$preset_style['css']         = $actual_css;
+			$editor_settings['styles'][] = $preset_style;
+		}
+	}
 
 	if ( WP_Theme_JSON_Resolver::theme_has_support() ) {
-		$editor_settings['styles'][] = array(
-			'css'            => $theme_json->get_stylesheet( 'block_styles' ),
-			'__unstableType' => 'globalStyles',
-		);
-		$editor_settings['styles'][] = array(
-			'css'                     => $theme_json->get_stylesheet( 'css_variables' ),
-			'__experimentalNoWrapper' => true,
-			'__unstableType'          => 'globalStyles',
+		$block_classes = array(
+			'css'            => 'styles',
+			'__unstableType' => 'theme',
 		);
+		$actual_css    = wp_get_global_stylesheet( array( $block_classes['css'] ) );
+		if ( '' !== $actual_css ) {
+			$block_classes['css']        = $actual_css;
+			$editor_settings['styles'][] = $block_classes;
+		}
 	}
 
-	$editor_settings['__experimentalFeatures'] = $theme_json->get_settings();
+	$editor_settings['__experimentalFeatures'] = wp_get_global_settings();
 	// These settings may need to be updated based on data coming from theme.json sources.
 	if ( isset( $editor_settings['__experimentalFeatures']['color']['palette'] ) ) {
 		$colors_by_origin          = $editor_settings['__experimentalFeatures']['color']['palette'];
-		$editor_settings['colors'] = isset( $colors_by_origin['user'] ) ?
-			$colors_by_origin['user'] : (
+		$editor_settings['colors'] = isset( $colors_by_origin['custom'] ) ?
+			$colors_by_origin['custom'] : (
 				isset( $colors_by_origin['theme'] ) ?
 					$colors_by_origin['theme'] :
-					$colors_by_origin['core']
+					$colors_by_origin['default']
 			);
 	}
 	if ( isset( $editor_settings['__experimentalFeatures']['color']['gradients'] ) ) {
 		$gradients_by_origin          = $editor_settings['__experimentalFeatures']['color']['gradients'];
-		$editor_settings['gradients'] = isset( $gradients_by_origin['user'] ) ?
-			$gradients_by_origin['user'] : (
+		$editor_settings['gradients'] = isset( $gradients_by_origin['custom'] ) ?
+			$gradients_by_origin['custom'] : (
 				isset( $gradients_by_origin['theme'] ) ?
 					$gradients_by_origin['theme'] :
-					$gradients_by_origin['core']
+					$gradients_by_origin['default']
 			);
 	}
 	if ( isset( $editor_settings['__experimentalFeatures']['typography']['fontSizes'] ) ) {
 		$font_sizes_by_origin         = $editor_settings['__experimentalFeatures']['typography']['fontSizes'];
-		$editor_settings['fontSizes'] = isset( $font_sizes_by_origin['user'] ) ?
-			$font_sizes_by_origin['user'] : (
+		$editor_settings['fontSizes'] = isset( $font_sizes_by_origin['custom'] ) ?
+			$font_sizes_by_origin['custom'] : (
 				isset( $font_sizes_by_origin['theme'] ) ?
 					$font_sizes_by_origin['theme'] :
-					$font_sizes_by_origin['core']
+					$font_sizes_by_origin['default']
 			);
 	}
 	if ( isset( $editor_settings['__experimentalFeatures']['color']['custom'] ) ) {
@@ -346,17 +378,17 @@ function get_block_editor_settings( array $custom_settings, $block_editor_contex
 		$editor_settings['disableCustomFontSizes'] = ! $editor_settings['__experimentalFeatures']['typography']['customFontSize'];
 		unset( $editor_settings['__experimentalFeatures']['typography']['customFontSize'] );
 	}
-	if ( isset( $editor_settings['__experimentalFeatures']['typography']['customLineHeight'] ) ) {
-		$editor_settings['enableCustomLineHeight'] = $editor_settings['__experimentalFeatures']['typography']['customLineHeight'];
-		unset( $editor_settings['__experimentalFeatures']['typography']['customLineHeight'] );
+	if ( isset( $editor_settings['__experimentalFeatures']['typography']['lineHeight'] ) ) {
+		$editor_settings['enableCustomLineHeight'] = $editor_settings['__experimentalFeatures']['typography']['lineHeight'];
+		unset( $editor_settings['__experimentalFeatures']['typography']['lineHeight'] );
 	}
 	if ( isset( $editor_settings['__experimentalFeatures']['spacing']['units'] ) ) {
 		$editor_settings['enableCustomUnits'] = $editor_settings['__experimentalFeatures']['spacing']['units'];
 		unset( $editor_settings['__experimentalFeatures']['spacing']['units'] );
 	}
-	if ( isset( $editor_settings['__experimentalFeatures']['spacing']['customPadding'] ) ) {
-		$editor_settings['enableCustomSpacing'] = $editor_settings['__experimentalFeatures']['spacing']['customPadding'];
-		unset( $editor_settings['__experimentalFeatures']['spacing']['customPadding'] );
+	if ( isset( $editor_settings['__experimentalFeatures']['spacing']['padding'] ) ) {
+		$editor_settings['enableCustomSpacing'] = $editor_settings['__experimentalFeatures']['spacing']['padding'];
+		unset( $editor_settings['__experimentalFeatures']['spacing']['padding'] );
 	}
 
 	/**
@@ -368,6 +400,7 @@ function get_block_editor_settings( array $custom_settings, $block_editor_contex
 	 * @param WP_Block_Editor_Context $block_editor_context The current block editor context.
 	 */
 	$editor_settings = apply_filters( 'block_editor_settings_all', $editor_settings, $block_editor_context );
+
 	if ( ! empty( $block_editor_context->post ) ) {
 		$post = $block_editor_context->post;
 
@@ -407,9 +440,11 @@ function block_editor_rest_api_preload( array $preload_paths, $block_editor_cont
 	 *
 	 * @since 5.8.0
 	 *
-	 * @param string[] $preload_paths Array of paths to preload.
+	 * @param string[]                $preload_paths        Array of paths to preload.
+	 * @param WP_Block_Editor_Context $block_editor_context The current block editor context.
 	 */
 	$preload_paths = apply_filters( 'block_editor_rest_api_preload_paths', $preload_paths, $block_editor_context );
+
 	if ( ! empty( $block_editor_context->post ) ) {
 		$selected_post = $block_editor_context->post;
 
@@ -438,6 +473,19 @@ function block_editor_rest_api_preload( array $preload_paths, $block_editor_cont
 	 */
 	$backup_global_post = ! empty( $post ) ? clone $post : $post;
 
+	foreach ( $preload_paths as &$path ) {
+		if ( is_string( $path ) && ! str_starts_with( $path, '/' ) ) {
+			$path = '/' . $path;
+			continue;
+		}
+
+		if ( is_array( $path ) && is_string( $path[0] ) && ! str_starts_with( $path[0], '/' ) ) {
+				$path[0] = '/' . $path[0];
+		}
+	}
+
+	unset( $path );
+
 	$preload_data = array_reduce(
 		$preload_paths,
 		'rest_preload_api_request',
@@ -464,22 +512,12 @@ function block_editor_rest_api_preload( array $preload_paths, $block_editor_cont
  *
  * @global array $editor_styles
  *
- * @return array An array of theme styles for the block editor. Includes default font family
- *               style and theme stylesheets.
+ * @return array An array of theme styles for the block editor.
  */
 function get_block_editor_theme_styles() {
 	global $editor_styles;
 
-	if ( ! WP_Theme_JSON_Resolver::theme_has_support() ) {
-		$styles = array(
-			array(
-				'css'            => 'body { font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif }',
-				'__unstableType' => 'core',
-			),
-		);
-	} else {
-		$styles = array();
-	}
+	$styles = array();
 
 	if ( $editor_styles && current_theme_supports( 'editor-styles' ) ) {
 		foreach ( $editor_styles as $style ) {
diff --git a/src/wp-includes/block-patterns.php b/src/wp-includes/block-patterns.php
index b01869f8b6..0d4eacd1a3 100644
--- a/src/wp-includes/block-patterns.php
+++ b/src/wp-includes/block-patterns.php
@@ -48,12 +48,17 @@ function _register_core_block_patterns_and_categories() {
  * Register Core's official patterns from wordpress.org/patterns.
  *
  * @since 5.8.0
+ * @since 5.9.0 The $current_screen argument was removed.
  *
- * @param WP_Screen $current_screen The screen that the current request was triggered from.
+ * @param WP_Screen $deprecated Unused. Formerly the screen that the current request was triggered from.
  */
-function _load_remote_block_patterns( $current_screen ) {
-	if ( ! $current_screen->is_block_editor ) {
-		return;
+function _load_remote_block_patterns( $deprecated = null ) {
+	if ( ! empty( $deprecated ) ) {
+		_deprecated_argument( __FUNCTION__, '5.9.0' );
+		$current_screen = $deprecated;
+		if ( ! $current_screen->is_block_editor ) {
+			return;
+		}
 	}
 
 	$supports_core_patterns = get_theme_support( 'core-block-patterns' );
@@ -83,3 +88,42 @@ function _load_remote_block_patterns( $current_screen ) {
 		}
 	}
 }
+
+/**
+ * Register `Featured` (category) patterns from wordpress.org/patterns.
+ *
+ * @since 5.9.0
+ */
+function _load_remote_featured_patterns() {
+	$supports_core_patterns = get_theme_support( 'core-block-patterns' );
+
+	/** This filter is documented in wp-includes/block-patterns.php */
+	$should_load_remote = apply_filters( 'should_load_remote_block_patterns', true );
+
+	if ( ! $should_load_remote || ! $supports_core_patterns ) {
+		return;
+	}
+
+	if ( ! WP_Block_Pattern_Categories_Registry::get_instance()->is_registered( 'featured' ) ) {
+		register_block_pattern_category( 'featured', array( 'label' => __( 'Featured' ) ) );
+	}
+
+	$request         = new WP_REST_Request( 'GET', '/wp/v2/pattern-directory/patterns' );
+	$featured_cat_id = 26; // This is the `Featured` category id from pattern directory.
+	$request->set_param( 'category', $featured_cat_id );
+	$response = rest_do_request( $request );
+	if ( $response->is_error() ) {
+		return;
+	}
+	$patterns = $response->get_data();
+
+	foreach ( $patterns as $pattern ) {
+		$pattern_name = sanitize_title( $pattern['title'] );
+		$registry     = WP_Block_Patterns_Registry::get_instance();
+		// Some patterns might be already registered as core patterns with the `core` prefix.
+		$is_registered = $registry->is_registered( $pattern_name ) || $registry->is_registered( "core/$pattern_name" );
+		if ( ! $is_registered ) {
+			register_block_pattern( $pattern_name, (array) $pattern );
+		}
+	}
+}
diff --git a/src/wp-includes/block-patterns/query-medium-posts.php b/src/wp-includes/block-patterns/query-medium-posts.php
index fdcbce323a..bd564ebe43 100644
--- a/src/wp-includes/block-patterns/query-medium-posts.php
+++ b/src/wp-includes/block-patterns/query-medium-posts.php
@@ -9,7 +9,7 @@ return array(
 	'title'      => _x( 'Image at left', 'Block pattern title' ),
 	'blockTypes' => array( 'core/query' ),
 	'categories' => array( 'query' ),
-	'content'    => '<!-- wp:query {"query":{"perPage":1,"pages":0,"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false}} -->
+	'content'    => '<!-- wp:query {"query":{"perPage":3,"pages":0,"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false}} -->
 					<div class="wp-block-query">
 					<!-- wp:post-template -->
 					<!-- wp:columns {"align":"wide"} -->
diff --git a/src/wp-includes/block-patterns/query-small-posts.php b/src/wp-includes/block-patterns/query-small-posts.php
index c858f19813..2f165c1b8b 100644
--- a/src/wp-includes/block-patterns/query-small-posts.php
+++ b/src/wp-includes/block-patterns/query-small-posts.php
@@ -9,7 +9,7 @@ return array(
 	'title'      => _x( 'Small image and title', 'Block pattern title' ),
 	'blockTypes' => array( 'core/query' ),
 	'categories' => array( 'query' ),
-	'content'    => '<!-- wp:query {"query":{"perPage":1,"pages":0,"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false}} -->
+	'content'    => '<!-- wp:query {"query":{"perPage":3,"pages":0,"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false}} -->
 					<div class="wp-block-query">
 					<!-- wp:post-template -->
 					<!-- wp:columns {"verticalAlignment":"center"} -->
diff --git a/src/wp-includes/block-patterns/query-standard-posts.php b/src/wp-includes/block-patterns/query-standard-posts.php
index 50fa37d637..c05ace98db 100644
--- a/src/wp-includes/block-patterns/query-standard-posts.php
+++ b/src/wp-includes/block-patterns/query-standard-posts.php
@@ -9,7 +9,7 @@ return array(
 	'title'      => _x( 'Standard', 'Block pattern title' ),
 	'blockTypes' => array( 'core/query' ),
 	'categories' => array( 'query' ),
-	'content'    => '<!-- wp:query {"query":{"perPage":1,"pages":0,"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false}} -->
+	'content'    => '<!-- wp:query {"query":{"perPage":3,"pages":0,"offset":0,"postType":"post","categoryIds":[],"tagIds":[],"order":"desc","orderBy":"date","author":"","search":"","exclude":[],"sticky":"","inherit":false}} -->
 					<div class="wp-block-query">
 					<!-- wp:post-template -->
 					<!-- wp:post-title {"isLink":true} /-->
diff --git a/src/wp-includes/block-supports/align.php b/src/wp-includes/block-supports/align.php
index ae0c2a4256..5a1e3a7e58 100644
--- a/src/wp-includes/block-supports/align.php
+++ b/src/wp-includes/block-supports/align.php
@@ -31,7 +31,7 @@ function wp_register_alignment_support( $block_type ) {
 }
 
 /**
- * Add CSS classes for block alignment to the incoming attributes array.
+ * Adds CSS classes for block alignment to the incoming attributes array.
  * This will be applied to the block markup in the front-end.
  *
  * @since 5.6.0
@@ -39,7 +39,6 @@ function wp_register_alignment_support( $block_type ) {
  *
  * @param WP_Block_Type $block_type       Block Type.
  * @param array         $block_attributes Block attributes.
- *
  * @return array Block alignment CSS classes and inline styles.
  */
 function wp_apply_alignment_support( $block_type, $block_attributes ) {
diff --git a/src/wp-includes/block-supports/border.php b/src/wp-includes/block-supports/border.php
index 08f3781ba6..15fd36bbdc 100644
--- a/src/wp-includes/block-supports/border.php
+++ b/src/wp-includes/block-supports/border.php
@@ -47,7 +47,6 @@ function wp_register_border_support( $block_type ) {
  *
  * @param WP_Block_Type $block_type       Block type.
  * @param array         $block_attributes Block attributes.
- *
  * @return array Border CSS classes and inline styles.
  */
 function wp_apply_border_support( $block_type, $block_attributes ) {
@@ -63,8 +62,23 @@ function wp_apply_border_support( $block_type, $block_attributes ) {
 		wp_has_border_feature_support( $block_type, 'radius' ) &&
 		isset( $block_attributes['style']['border']['radius'] )
 	) {
-		$border_radius = (int) $block_attributes['style']['border']['radius'];
-		$styles[]      = sprintf( 'border-radius: %dpx;', $border_radius );
+		$border_radius = $block_attributes['style']['border']['radius'];
+
+		if ( is_array( $border_radius ) ) {
+			// We have individual border radius corner values.
+			foreach ( $border_radius as $key => $radius ) {
+				// Convert CamelCase corner name to kebab-case.
+				$corner   = strtolower( preg_replace( '/(?<!^)[A-Z]/', '-$0', $key ) );
+				$styles[] = sprintf( 'border-%s-radius: %s;', $corner, $radius );
+			}
+		} else {
+			// This check handles original unitless implementation.
+			if ( is_numeric( $border_radius ) ) {
+				$border_radius .= 'px';
+			}
+
+			$styles[] = sprintf( 'border-radius: %s;', $border_radius );
+		}
 	}
 
 	// Border style.
@@ -81,8 +95,14 @@ function wp_apply_border_support( $block_type, $block_attributes ) {
 		wp_has_border_feature_support( $block_type, 'width' ) &&
 		isset( $block_attributes['style']['border']['width'] )
 	) {
-		$border_width = intval( $block_attributes['style']['border']['width'] );
-		$styles[]     = sprintf( 'border-width: %dpx;', $border_width );
+		$border_width = $block_attributes['style']['border']['width'];
+
+		// This check handles original unitless implementation.
+		if ( is_numeric( $border_width ) ) {
+			$border_width .= 'px';
+		}
+
+		$styles[] = sprintf( 'border-width: %s;', $border_width );
 	}
 
 	// Border color.
@@ -124,8 +144,8 @@ function wp_apply_border_support( $block_type, $block_attributes ) {
  * @access private
  *
  * @param WP_Block_Type $block_type Block type.
- *
- * @return bool
+ * @return bool Whether serialization of the current block's border properties
+ *              should occur.
  */
 function wp_skip_border_serialization( $block_type ) {
 	$border_support = _wp_array_get( $block_type->supports, array( '__experimentalBorder' ), false );
diff --git a/src/wp-includes/block-supports/colors.php b/src/wp-includes/block-supports/colors.php
index cd7ecf1cac..7db9a4ad7a 100644
--- a/src/wp-includes/block-supports/colors.php
+++ b/src/wp-includes/block-supports/colors.php
@@ -99,7 +99,7 @@ function wp_apply_colors_support( $block_type, $block_attributes ) {
 		}
 		// Apply color class or inline style.
 		if ( $has_named_text_color ) {
-			$classes[] = sprintf( 'has-%s-color', $block_attributes['textColor'] );
+			$classes[] = sprintf( 'has-%s-color', _wp_to_kebab_case( $block_attributes['textColor'] ) );
 		} elseif ( $has_custom_text_color ) {
 			$styles[] = sprintf( 'color: %s;', $block_attributes['style']['color']['text'] );
 		}
@@ -116,7 +116,7 @@ function wp_apply_colors_support( $block_type, $block_attributes ) {
 		}
 		// Apply background color classes or styles.
 		if ( $has_named_background_color ) {
-			$classes[] = sprintf( 'has-%s-background-color', $block_attributes['backgroundColor'] );
+			$classes[] = sprintf( 'has-%s-background-color', _wp_to_kebab_case( $block_attributes['backgroundColor'] ) );
 		} elseif ( $has_custom_background_color ) {
 			$styles[] = sprintf( 'background-color: %s;', $block_attributes['style']['color']['background'] );
 		}
@@ -132,7 +132,7 @@ function wp_apply_colors_support( $block_type, $block_attributes ) {
 		}
 		// Apply required background class.
 		if ( $has_named_gradient ) {
-			$classes[] = sprintf( 'has-%s-gradient-background', $block_attributes['gradient'] );
+			$classes[] = sprintf( 'has-%s-gradient-background', _wp_to_kebab_case( $block_attributes['gradient'] ) );
 		} elseif ( $has_custom_gradient ) {
 			$styles[] = sprintf( 'background: %s;', $block_attributes['style']['color']['gradient'] );
 		}
diff --git a/src/wp-includes/block-supports/dimensions.php b/src/wp-includes/block-supports/dimensions.php
new file mode 100644
index 0000000000..7e56c011e7
--- /dev/null
+++ b/src/wp-includes/block-supports/dimensions.php
@@ -0,0 +1,90 @@
+<?php
+/**
+ * Dimensions block support flag.
+ *
+ * This does not include the `spacing` block support even though that visually
+ * appears under the "Dimensions" panel in the editor. It remains in its
+ * original `spacing.php` file for backwards compatibility.
+ *
+ * @package WordPress
+ * @since 5.9.0
+ */
+
+/**
+ * Registers the style block attribute for block types that support it.
+ *
+ * @since 5.9.0
+ * @access private
+ *
+ * @param WP_Block_Type $block_type Block Type.
+ */
+function wp_register_dimensions_support( $block_type ) {
+	// Setup attributes and styles within that if needed.
+	if ( ! $block_type->attributes ) {
+		$block_type->attributes = array();
+	}
+
+	// Check for existing style attribute definition e.g. from block.json.
+	if ( array_key_exists( 'style', $block_type->attributes ) ) {
+		return;
+	}
+
+	$has_dimensions_support = block_has_support( $block_type, array( '__experimentalDimensions' ), false );
+	// Future block supports such as height & width will be added here.
+
+	if ( $has_dimensions_support ) {
+		$block_type->attributes['style'] = array(
+			'type' => 'object',
+		);
+	}
+}
+
+/**
+ * Adds CSS classes for block dimensions to the incoming attributes array.
+ * This will be applied to the block markup in the front-end.
+ *
+ * @since 5.9.0
+ * @access private
+ *
+ * @param WP_Block_Type $block_type       Block Type.
+ * @param array         $block_attributes Block attributes.
+ * @return array Block dimensions CSS classes and inline styles.
+ */
+function wp_apply_dimensions_support( $block_type, $block_attributes ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
+	if ( wp_skip_dimensions_serialization( $block_type ) ) {
+		return array();
+	}
+
+	$styles = array();
+
+	// Height support to be added in near future.
+	// Width support to be added in near future.
+
+	return empty( $styles ) ? array() : array( 'style' => implode( ' ', $styles ) );
+}
+
+/**
+ * Checks whether serialization of the current block's dimensions properties
+ * should occur.
+ *
+ * @since 5.9.0
+ * @access private
+ *
+ * @param WP_Block_type $block_type Block type.
+ * @return bool Whether to serialize spacing support styles & classes.
+ */
+function wp_skip_dimensions_serialization( $block_type ) {
+	$dimensions_support = _wp_array_get( $block_type->supports, array( '__experimentalDimensions' ), false );
+	return is_array( $dimensions_support ) &&
+		array_key_exists( '__experimentalSkipSerialization', $dimensions_support ) &&
+		$dimensions_support['__experimentalSkipSerialization'];
+}
+
+// Register the block support.
+WP_Block_Supports::get_instance()->register(
+	'dimensions',
+	array(
+		'register_attribute' => 'wp_register_dimensions_support',
+		'apply'              => 'wp_apply_dimensions_support',
+	)
+);
diff --git a/src/wp-includes/block-supports/duotone.php b/src/wp-includes/block-supports/duotone.php
index 04aac0ef1e..f73988e332 100644
--- a/src/wp-includes/block-supports/duotone.php
+++ b/src/wp-includes/block-supports/duotone.php
@@ -45,7 +45,6 @@
  *
  * @param mixed $n   Number of unknown type.
  * @param int   $max Upper value of the range to bound to.
- *
  * @return float Value in the range [0, 1].
  */
 function wp_tinycolor_bound01( $n, $max ) {
@@ -70,7 +69,29 @@ function wp_tinycolor_bound01( $n, $max ) {
 }
 
 /**
- * Round and convert values of an RGB object.
+ * Direct port of tinycolor's boundAlpha function to maintain consistency with
+ * how tinycolor works.
+ *
+ * @see https://github.com/bgrins/TinyColor
+ *
+ * @since 5.9.0
+ * @access private
+ *
+ * @param mixed $n Number of unknown type.
+ * @return float Value in the range [0,1].
+ */
+function _wp_tinycolor_bound_alpha( $n ) {
+	if ( is_numeric( $n ) ) {
+		$n = (float) $n;
+		if ( $n >= 0 && $n <= 1 ) {
+			return $n;
+		}
+	}
+	return 1;
+}
+
+/**
+ * Rounds and converts values of an RGB object.
  *
  * Direct port of TinyColor's function, lightly simplified to maintain
  * consistency with TinyColor.
@@ -81,7 +102,6 @@ function wp_tinycolor_bound01( $n, $max ) {
  * @access private
  *
  * @param array $rgb_color RGB object.
- *
  * @return array Rounded and converted RGB object.
  */
 function wp_tinycolor_rgb_to_rgb( $rgb_color ) {
@@ -106,7 +126,6 @@ function wp_tinycolor_rgb_to_rgb( $rgb_color ) {
  * @param float $p first component.
  * @param float $q second component.
  * @param float $t third component.
- *
  * @return float R, G, or B component.
  */
 function wp_tinycolor_hue_to_rgb( $p, $q, $t ) {
@@ -129,7 +148,7 @@ function wp_tinycolor_hue_to_rgb( $p, $q, $t ) {
 }
 
 /**
- * Convert an HSL object to an RGB object with converted and rounded values.
+ * Converts an HSL object to an RGB object with converted and rounded values.
  *
  * Direct port of TinyColor's function, lightly simplified to maintain
  * consistency with TinyColor.
@@ -140,7 +159,6 @@ function wp_tinycolor_hue_to_rgb( $p, $q, $t ) {
  * @access private
  *
  * @param array $hsl_color HSL object.
- *
  * @return array Rounded and converted RGB object.
  */
 function wp_tinycolor_hsl_to_rgb( $hsl_color ) {
@@ -170,8 +188,7 @@ function wp_tinycolor_hsl_to_rgb( $hsl_color ) {
 
 /**
  * Parses hex, hsl, and rgb CSS strings using the same regex as TinyColor v1.4.2
- * used in the JavaScript. Only colors output from react-color are implemented
- * and the alpha value is ignored as it is not used in duotone.
+ * used in the JavaScript. Only colors output from react-color are implemented.
  *
  * Direct port of TinyColor's function, lightly simplified to maintain
  * consistency with TinyColor.
@@ -180,10 +197,10 @@ function wp_tinycolor_hsl_to_rgb( $hsl_color ) {
  * @see https://github.com/casesandberg/react-color/
  *
  * @since 5.8.0
+ * @since 5.9.0 Added alpha processing.
  * @access private
  *
  * @param string $color_str CSS color string.
- *
  * @return array RGB object.
  */
 function wp_tinycolor_string_to_rgb( $color_str ) {
@@ -199,90 +216,139 @@ function wp_tinycolor_string_to_rgb( $color_str ) {
 
 	$rgb_regexp = '/^rgb' . $permissive_match3 . '$/';
 	if ( preg_match( $rgb_regexp, $color_str, $match ) ) {
-		return wp_tinycolor_rgb_to_rgb(
+		$rgb = wp_tinycolor_rgb_to_rgb(
 			array(
 				'r' => $match[1],
 				'g' => $match[2],
 				'b' => $match[3],
 			)
 		);
+
+		$rgb['a'] = 1;
+
+		return $rgb;
 	}
 
 	$rgba_regexp = '/^rgba' . $permissive_match4 . '$/';
 	if ( preg_match( $rgba_regexp, $color_str, $match ) ) {
-		return wp_tinycolor_rgb_to_rgb(
+		$rgb = wp_tinycolor_rgb_to_rgb(
 			array(
 				'r' => $match[1],
 				'g' => $match[2],
 				'b' => $match[3],
 			)
 		);
+
+		$rgb['a'] = _wp_tinycolor_bound_alpha( $match[4] );
+
+		return $rgb;
 	}
 
 	$hsl_regexp = '/^hsl' . $permissive_match3 . '$/';
 	if ( preg_match( $hsl_regexp, $color_str, $match ) ) {
-		return wp_tinycolor_hsl_to_rgb(
+		$rgb = wp_tinycolor_hsl_to_rgb(
 			array(
 				'h' => $match[1],
 				's' => $match[2],
 				'l' => $match[3],
 			)
 		);
+
+		$rgb['a'] = 1;
+
+		return $rgb;
 	}
 
 	$hsla_regexp = '/^hsla' . $permissive_match4 . '$/';
 	if ( preg_match( $hsla_regexp, $color_str, $match ) ) {
-		return wp_tinycolor_hsl_to_rgb(
+		$rgb = wp_tinycolor_hsl_to_rgb(
 			array(
 				'h' => $match[1],
 				's' => $match[2],
 				'l' => $match[3],
 			)
 		);
+
+		$rgb['a'] = _wp_tinycolor_bound_alpha( $match[4] );
+
+		return $rgb;
 	}
 
 	$hex8_regexp = '/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/';
 	if ( preg_match( $hex8_regexp, $color_str, $match ) ) {
-		return wp_tinycolor_rgb_to_rgb(
+		$rgb = wp_tinycolor_rgb_to_rgb(
 			array(
 				'r' => base_convert( $match[1], 16, 10 ),
 				'g' => base_convert( $match[2], 16, 10 ),
 				'b' => base_convert( $match[3], 16, 10 ),
 			)
 		);
+
+		$rgb['a'] = _wp_tinycolor_bound_alpha(
+			base_convert( $match[4], 16, 10 ) / 255
+		);
+
+		return $rgb;
 	}
 
 	$hex6_regexp = '/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/';
 	if ( preg_match( $hex6_regexp, $color_str, $match ) ) {
-		return wp_tinycolor_rgb_to_rgb(
+		$rgb = wp_tinycolor_rgb_to_rgb(
 			array(
 				'r' => base_convert( $match[1], 16, 10 ),
 				'g' => base_convert( $match[2], 16, 10 ),
 				'b' => base_convert( $match[3], 16, 10 ),
 			)
 		);
+
+		$rgb['a'] = 1;
+
+		return $rgb;
 	}
 
 	$hex4_regexp = '/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/';
 	if ( preg_match( $hex4_regexp, $color_str, $match ) ) {
-		return wp_tinycolor_rgb_to_rgb(
+		$rgb = wp_tinycolor_rgb_to_rgb(
 			array(
 				'r' => base_convert( $match[1] . $match[1], 16, 10 ),
 				'g' => base_convert( $match[2] . $match[2], 16, 10 ),
 				'b' => base_convert( $match[3] . $match[3], 16, 10 ),
 			)
 		);
+
+		$rgb['a'] = _wp_tinycolor_bound_alpha(
+			base_convert( $match[4] . $match[4], 16, 10 ) / 255
+		);
+
+		return $rgb;
 	}
 
 	$hex3_regexp = '/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/';
 	if ( preg_match( $hex3_regexp, $color_str, $match ) ) {
-		return wp_tinycolor_rgb_to_rgb(
+		$rgb = wp_tinycolor_rgb_to_rgb(
 			array(
 				'r' => base_convert( $match[1] . $match[1], 16, 10 ),
 				'g' => base_convert( $match[2] . $match[2], 16, 10 ),
 				'b' => base_convert( $match[3] . $match[3], 16, 10 ),
 			)
 		);
+
+		$rgb['a'] = 1;
+
+		return $rgb;
+	}
+
+	/*
+	 * The JS color picker considers the string "transparent" to be a hex value,
+	 * so we need to handle it here as a special case.
+	 */
+	if ( 'transparent' === $color_str ) {
+		return array(
+			'r' => 0,
+			'g' => 0,
+			'b' => 0,
+			'a' => 0,
+		);
 	}
 }
 
@@ -315,39 +381,24 @@ function wp_register_duotone_support( $block_type ) {
 }
 
 /**
- * Render out the duotone stylesheet and SVG.
+ * Renders the duotone filter SVG and returns the CSS filter property to
+ * reference the rendered SVG.
  *
- * @since 5.8.0
+ * @since 5.9.0
  * @access private
- *
- * @param string $block_content Rendered block content.
- * @param array  $block         Block object.
- *
- * @return string Filtered block content.
- */
-function wp_render_duotone_support( $block_content, $block ) {
-	$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
-
-	$duotone_support = false;
-	if ( $block_type && property_exists( $block_type, 'supports' ) ) {
-		$duotone_support = _wp_array_get( $block_type->supports, array( 'color', '__experimentalDuotone' ), false );
-	}
-
-	$has_duotone_attribute = isset( $block['attrs']['style']['color']['duotone'] );
-
-	if (
-		! $duotone_support ||
-		! $has_duotone_attribute
-	) {
-		return $block_content;
-	}
-
-	$duotone_colors = $block['attrs']['style']['color']['duotone'];
 
+ * @param array $preset Duotone preset value as seen in theme.json.
+ * @return string Duotone CSS filter property.
+ */
+function wp_render_duotone_filter_preset( $preset ) {
+	$duotone_id     = $preset['slug'];
+	$duotone_colors = $preset['colors'];
+	$filter_id      = 'wp-duotone-' . $duotone_id;
 	$duotone_values = array(
 		'r' => array(),
 		'g' => array(),
 		'b' => array(),
+		'a' => array(),
 	);
 	foreach ( $duotone_colors as $color_str ) {
 		$color = wp_tinycolor_string_to_rgb( $color_str );
@@ -355,31 +406,15 @@ function wp_render_duotone_support( $block_content, $block ) {
 		$duotone_values['r'][] = $color['r'] / 255;
 		$duotone_values['g'][] = $color['g'] / 255;
 		$duotone_values['b'][] = $color['b'] / 255;
+		$duotone_values['a'][] = $color['a'];
 	}
 
-	$duotone_id = 'wp-duotone-filter-' . uniqid();
-
-	$selectors        = explode( ',', $duotone_support );
-	$selectors_scoped = array_map(
-		static function ( $selector ) use ( $duotone_id ) {
-			return '.' . $duotone_id . ' ' . trim( $selector );
-		},
-		$selectors
-	);
-	$selectors_group  = implode( ', ', $selectors_scoped );
-
 	ob_start();
 
 	?>
 
-	<style>
-		<?php echo $selectors_group; ?> {
-			filter: url( <?php echo esc_url( '#' . $duotone_id ); ?> );
-		}
-	</style>
-
 	<svg
-		xmlns:xlink="http://www.w3.org/1999/xlink"
+		xmlns="http://www.w3.org/2000/svg"
 		viewBox="0 0 0 0"
 		width="0"
 		height="0"
@@ -388,38 +423,111 @@ function wp_render_duotone_support( $block_content, $block ) {
 		style="visibility: hidden; position: absolute; left: -9999px; overflow: hidden;"
 	>
 		<defs>
-			<filter id="<?php echo esc_attr( $duotone_id ); ?>">
+			<filter id="<?php echo esc_attr( $filter_id ); ?>">
 				<feColorMatrix
+					color-interpolation-filters="sRGB"
 					type="matrix"
-					<?php // phpcs:disable Generic.WhiteSpace.DisallowSpaceIndent ?>
-					values=".299 .587 .114 0 0
-							.299 .587 .114 0 0
-							.299 .587 .114 0 0
-							0 0 0 1 0"
-					<?php // phpcs:enable Generic.WhiteSpace.DisallowSpaceIndent ?>
+					values="
+						.299 .587 .114 0 0
+						.299 .587 .114 0 0
+						.299 .587 .114 0 0
+						.299 .587 .114 0 0
+					"
 				/>
 				<feComponentTransfer color-interpolation-filters="sRGB" >
 					<feFuncR type="table" tableValues="<?php echo esc_attr( implode( ' ', $duotone_values['r'] ) ); ?>" />
 					<feFuncG type="table" tableValues="<?php echo esc_attr( implode( ' ', $duotone_values['g'] ) ); ?>" />
 					<feFuncB type="table" tableValues="<?php echo esc_attr( implode( ' ', $duotone_values['b'] ) ); ?>" />
+					<feFuncA type="table" tableValues="<?php echo esc_attr( implode( ' ', $duotone_values['a'] ) ); ?>" />
 				</feComponentTransfer>
+				<feComposite in2="SourceGraphic" operator="in" />
 			</filter>
 		</defs>
 	</svg>
 
 	<?php
 
-	$duotone = ob_get_clean();
+	$svg = ob_get_clean();
+
+	if ( ! defined( 'SCRIPT_DEBUG' ) || ! SCRIPT_DEBUG ) {
+		// Clean up the whitespace.
+		$svg = preg_replace( "/[\r\n\t ]+/", ' ', $svg );
+		$svg = preg_replace( '/> </', '><', $svg );
+		$svg = trim( $svg );
+	}
+
+	add_action(
+		// Safari doesn't render SVG filters defined in data URIs,
+		// and SVG filters won't render in the head of a document,
+		// so the next best place to put the SVG is in the footer.
+		is_admin() ? 'admin_footer' : 'wp_footer',
+		function () use ( $svg ) {
+			echo $svg;
+		}
+	);
+
+	return "url('#" . $filter_id . "')";
+}
+
+/**
+ * Render out the duotone stylesheet and SVG.
+ *
+ * @since 5.8.0
+ * @access private
+ *
+ * @param string $block_content Rendered block content.
+ * @param array  $block         Block object.
+ * @return string Filtered block content.
+ */
+function wp_render_duotone_support( $block_content, $block ) {
+	$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
+
+	$duotone_support = false;
+	if ( $block_type && property_exists( $block_type, 'supports' ) ) {
+		$duotone_support = _wp_array_get( $block_type->supports, array( 'color', '__experimentalDuotone' ), false );
+	}
+
+	$has_duotone_attribute = isset( $block['attrs']['style']['color']['duotone'] );
+
+	if (
+		! $duotone_support ||
+		! $has_duotone_attribute
+	) {
+		return $block_content;
+	}
+
+	$filter_preset   = array(
+		'slug'   => uniqid(),
+		'colors' => $block['attrs']['style']['color']['duotone'],
+	);
+	$filter_property = wp_render_duotone_filter_preset( $filter_preset );
+	$filter_id       = 'wp-duotone-' . $filter_preset['slug'];
+
+	$scope     = '.' . $filter_id;
+	$selectors = explode( ',', $duotone_support );
+	$scoped    = array();
+	foreach ( $selectors as $sel ) {
+		$scoped[] = $scope . ' ' . trim( $sel );
+	}
+	$selector = implode( ', ', $scoped );
+
+	// !important is needed because these styles render before global styles,
+	// and they should be overriding the duotone filters set by global styles.
+	$filter_style = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG
+		? $selector . " {\n\tfilter: " . $filter_property . " !important;\n}\n"
+		: $selector . '{filter:' . $filter_property . ' !important;}';
+
+	wp_register_style( $filter_id, false, array(), true, true );
+	wp_add_inline_style( $filter_id, $filter_style );
+	wp_enqueue_style( $filter_id );
 
 	// Like the layout hook, this assumes the hook only applies to blocks with a single wrapper.
-	$content = preg_replace(
+	return preg_replace(
 		'/' . preg_quote( 'class="', '/' ) . '/',
-		'class="' . $duotone_id . ' ',
+		'class="' . $filter_id . ' ',
 		$block_content,
 		1
 	);
-
-	return $content . $duotone;
 }
 
 // Register the block support.
diff --git a/src/wp-includes/block-supports/elements.php b/src/wp-includes/block-supports/elements.php
index 4e43dda375..ceb8841ac1 100644
--- a/src/wp-includes/block-supports/elements.php
+++ b/src/wp-includes/block-supports/elements.php
@@ -17,6 +17,10 @@
  * @return string Filtered block content.
  */
 function wp_render_elements_support( $block_content, $block ) {
+	if ( ! $block_content ) {
+		return $block_content;
+	}
+
 	$link_color = null;
 	if ( ! empty( $block['attrs'] ) ) {
 		$link_color = _wp_array_get( $block['attrs'], array( 'style', 'elements', 'link', 'color', 'text' ), null );
@@ -42,7 +46,7 @@ function wp_render_elements_support( $block_content, $block ) {
 	}
 	$link_color_declaration = esc_html( safecss_filter_attr( "color: $link_color" ) );
 
-	$style = "<style>.$class_name a{" . $link_color_declaration . " !important;}</style>\n";
+	$style = "<style>.$class_name a{" . $link_color_declaration . ";}</style>\n";
 
 	// Like the layout hook this assumes the hook only applies to blocks with a single wrapper.
 	// Retrieve the opening tag of the first HTML element.
@@ -64,8 +68,19 @@ function wp_render_elements_support( $block_content, $block ) {
 		$content              = substr_replace( $block_content, ' class="' . $class_name . '"', $first_element_offset + strlen( $first_element ) - 1, 0 );
 	}
 
-	return $content . $style;
+	/*
+	 * Ideally styles should be loaded in the head, but blocks may be parsed
+	 * after that, so loading in the footer for now.
+	 * See https://core.trac.wordpress.org/ticket/53494.
+	 */
+	add_action(
+		'wp_footer',
+		static function () use ( $style ) {
+			echo $style;
+		}
+	);
 
+	return $content;
 }
 
 add_filter( 'render_block', 'wp_render_elements_support', 10, 2 );
diff --git a/src/wp-includes/block-supports/layout.php b/src/wp-includes/block-supports/layout.php
index be1da09899..529a775a92 100644
--- a/src/wp-includes/block-supports/layout.php
+++ b/src/wp-includes/block-supports/layout.php
@@ -29,6 +29,106 @@ function wp_register_layout_support( $block_type ) {
 	}
 }
 
+/**
+ * Generates the CSS corresponding to the provided layout.
+ *
+ * @since 5.9.0
+ * @access private
+ *
+ * @param string $selector              CSS selector.
+ * @param array  $layout                Layout object. The one that is passed has already checked
+ *                                      the existence of default block layout.
+ * @param bool   $has_block_gap_support Whether the theme has support for the block gap.
+ * @param string $gap_value             The block gap value to apply.
+ * @return string CSS style.
+ */
+function wp_get_layout_style( $selector, $layout, $has_block_gap_support = false, $gap_value = null ) {
+	$layout_type = isset( $layout['type'] ) ? $layout['type'] : 'default';
+
+	$style = '';
+	if ( 'default' === $layout_type ) {
+		$content_size = isset( $layout['contentSize'] ) ? $layout['contentSize'] : '';
+		$wide_size    = isset( $layout['wideSize'] ) ? $layout['wideSize'] : '';
+
+		$all_max_width_value  = $content_size ? $content_size : $wide_size;
+		$wide_max_width_value = $wide_size ? $wide_size : $content_size;
+
+		// Make sure there is a single CSS rule, and all tags are stripped for security.
+		// TODO: Use `safecss_filter_attr` instead - once https://core.trac.wordpress.org/ticket/46197 is patched.
+		$all_max_width_value  = wp_strip_all_tags( explode( ';', $all_max_width_value )[0] );
+		$wide_max_width_value = wp_strip_all_tags( explode( ';', $wide_max_width_value )[0] );
+
+		$style = '';
+		if ( $content_size || $wide_size ) {
+			$style  = "$selector > * {";
+			$style .= 'max-width: ' . esc_html( $all_max_width_value ) . ';';
+			$style .= 'margin-left: auto !important;';
+			$style .= 'margin-right: auto !important;';
+			$style .= '}';
+
+			$style .= "$selector > .alignwide { max-width: " . esc_html( $wide_max_width_value ) . ';}';
+			$style .= "$selector .alignfull { max-width: none; }";
+		}
+
+		$style .= "$selector .alignleft { float: left; margin-right: 2em; }";
+		$style .= "$selector .alignright { float: right; margin-left: 2em; }";
+		if ( $has_block_gap_support ) {
+			$gap_style = $gap_value ? $gap_value : 'var( --wp--style--block-gap )';
+			$style    .= "$selector > * { margin-top: 0; margin-bottom: 0; }";
+			$style    .= "$selector > * + * { margin-top: $gap_style;  margin-bottom: 0; }";
+		}
+	} elseif ( 'flex' === $layout_type ) {
+		$layout_orientation = isset( $layout['orientation'] ) ? $layout['orientation'] : 'horizontal';
+
+		$justify_content_options = array(
+			'left'   => 'flex-start',
+			'right'  => 'flex-end',
+			'center' => 'center',
+		);
+
+		if ( 'horizontal' === $layout_orientation ) {
+			$justify_content_options += array( 'space-between' => 'space-between' );
+		}
+
+		$flex_wrap_options = array( 'wrap', 'nowrap' );
+		$flex_wrap         = ! empty( $layout['flexWrap'] ) && in_array( $layout['flexWrap'], $flex_wrap_options, true ) ?
+			$layout['flexWrap'] :
+			'wrap';
+
+		$style  = "$selector {";
+		$style .= 'display: flex;';
+		if ( $has_block_gap_support ) {
+			$gap_style = $gap_value ? $gap_value : 'var( --wp--style--block-gap, 0.5em )';
+			$style    .= "gap: $gap_style;";
+		} else {
+			$style .= 'gap: 0.5em;';
+		}
+		$style .= "flex-wrap: $flex_wrap;";
+		$style .= 'align-items: center;';
+		if ( 'horizontal' === $layout_orientation ) {
+			$style .= 'align-items: center;';
+			/**
+			 * Add this style only if is not empty for backwards compatibility,
+			 * since we intend to convert blocks that had flex layout implemented
+			 * by custom css.
+			 */
+			if ( ! empty( $layout['justifyContent'] ) && array_key_exists( $layout['justifyContent'], $justify_content_options ) ) {
+				$style .= "justify-content: {$justify_content_options[ $layout['justifyContent'] ]};";
+			}
+		} else {
+			$style .= 'flex-direction: column;';
+			if ( ! empty( $layout['justifyContent'] ) && array_key_exists( $layout['justifyContent'], $justify_content_options ) ) {
+				$style .= "align-items: {$justify_content_options[ $layout['justifyContent'] ]};";
+			}
+		}
+		$style .= '}';
+
+		$style .= "$selector > * { margin: 0; }";
+	}
+
+	return $style;
+}
+
 /**
  * Renders the layout config to the block wrapper.
  *
@@ -42,47 +142,30 @@ function wp_register_layout_support( $block_type ) {
 function wp_render_layout_support_flag( $block_content, $block ) {
 	$block_type     = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] );
 	$support_layout = block_has_support( $block_type, array( '__experimentalLayout' ), false );
-	if ( ! $support_layout || ! isset( $block['attrs']['layout'] ) ) {
+
+	if ( ! $support_layout ) {
 		return $block_content;
 	}
 
-	$used_layout = $block['attrs']['layout'];
+	$block_gap             = wp_get_global_settings( array( 'spacing', 'blockGap' ) );
+	$default_layout        = wp_get_global_settings( array( 'layout' ) );
+	$has_block_gap_support = isset( $block_gap ) ? null !== $block_gap : false;
+	$default_block_layout  = _wp_array_get( $block_type->supports, array( '__experimentalLayout', 'default' ), array() );
+	$used_layout           = isset( $block['attrs']['layout'] ) ? $block['attrs']['layout'] : $default_block_layout;
 	if ( isset( $used_layout['inherit'] ) && $used_layout['inherit'] ) {
-		$tree           = WP_Theme_JSON_Resolver::get_merged_data();
-		$default_layout = _wp_array_get( $tree->get_settings(), array( 'layout' ) );
 		if ( ! $default_layout ) {
 			return $block_content;
 		}
 		$used_layout = $default_layout;
 	}
 
-	$id           = uniqid();
-	$content_size = isset( $used_layout['contentSize'] ) ? $used_layout['contentSize'] : null;
-	$wide_size    = isset( $used_layout['wideSize'] ) ? $used_layout['wideSize'] : null;
-
-	$all_max_width_value  = $content_size ? $content_size : $wide_size;
-	$wide_max_width_value = $wide_size ? $wide_size : $content_size;
-
-	// Make sure there is a single CSS rule, and all tags are stripped for security.
-	$all_max_width_value  = safecss_filter_attr( explode( ';', $all_max_width_value )[0] );
-	$wide_max_width_value = safecss_filter_attr( explode( ';', $wide_max_width_value )[0] );
-
-	$style = '';
-	if ( $content_size || $wide_size ) {
-		$style  = ".wp-container-$id > * {";
-		$style .= 'max-width: ' . esc_html( $all_max_width_value ) . ';';
-		$style .= 'margin-left: auto !important;';
-		$style .= 'margin-right: auto !important;';
-		$style .= '}';
-
-		$style .= ".wp-container-$id > .alignwide { max-width: " . esc_html( $wide_max_width_value ) . ';}';
-
-		$style .= ".wp-container-$id .alignfull { max-width: none; }";
-	}
-
-	$style .= ".wp-container-$id .alignleft { float: left; margin-right: 2em; }";
-	$style .= ".wp-container-$id .alignright { float: right; margin-left: 2em; }";
-
+	$id        = uniqid();
+	$gap_value = _wp_array_get( $block, array( 'attrs', 'style', 'spacing', 'blockGap' ) );
+	// Skip if gap value contains unsupported characters.
+	// Regex for CSS value borrowed from `safecss_filter_attr`, and used here
+	// because we only want to match against the value, not the CSS attribute.
+	$gap_value = preg_match( '%[\\\(&=}]|/\*%', $gap_value ) ? null : $gap_value;
+	$style     = wp_get_layout_style( ".wp-container-$id", $used_layout, $has_block_gap_support, $gap_value );
 	// This assumes the hook only applies to blocks with a single wrapper.
 	// I think this is a reasonable limitation for that particular hook.
 	$content = preg_replace(
@@ -92,7 +175,19 @@ function wp_render_layout_support_flag( $block_content, $block ) {
 		1
 	);
 
-	return $content . '<style>' . $style . '</style>';
+	/*
+	 * Ideally styles should be loaded in the head, but blocks may be parsed
+	 * after that, so loading in the footer for now.
+	 * See https://core.trac.wordpress.org/ticket/53494.
+	 */
+	add_action(
+		'wp_footer',
+		static function () use ( $style ) {
+			echo '<style>' . $style . '</style>';
+		}
+	);
+
+	return $content;
 }
 
 // Register the block support.
@@ -114,21 +209,28 @@ add_filter( 'render_block', 'wp_render_layout_support_flag', 10, 2 );
  *
  * @param string $block_content Rendered block content.
  * @param array  $block         Block object.
- *
  * @return string Filtered block content.
  */
 function wp_restore_group_inner_container( $block_content, $block ) {
-	$group_with_inner_container_regex = '/(^\s*<div\b[^>]*wp-block-group(\s|")[^>]*>)(\s*<div\b[^>]*wp-block-group__inner-container(\s|")[^>]*>)((.|\S|\s)*)/';
+	$tag_name                         = isset( $block['attrs']['tagName'] ) ? $block['attrs']['tagName'] : 'div';
+	$group_with_inner_container_regex = sprintf(
+		'/(^\s*<%1$s\b[^>]*wp-block-group(\s|")[^>]*>)(\s*<div\b[^>]*wp-block-group__inner-container(\s|")[^>]*>)((.|\S|\s)*)/U',
+		preg_quote( $tag_name, '/' )
+	);
 
 	if (
 		'core/group' !== $block['blockName'] ||
 		WP_Theme_JSON_Resolver::theme_has_support() ||
-		1 === preg_match( $group_with_inner_container_regex, $block_content )
+		1 === preg_match( $group_with_inner_container_regex, $block_content ) ||
+		( isset( $block['attrs']['layout']['type'] ) && 'default' !== $block['attrs']['layout']['type'] )
 	) {
 		return $block_content;
 	}
 
-	$replace_regex   = '/(^\s*<div\b[^>]*wp-block-group[^>]*>)(.*)(<\/div>\s*$)/ms';
+	$replace_regex   = sprintf(
+		'/(^\s*<%1$s\b[^>]*wp-block-group[^>]*>)(.*)(<\/%1$s>\s*$)/ms',
+		preg_quote( $tag_name, '/' )
+	);
 	$updated_content = preg_replace_callback(
 		$replace_regex,
 		static function( $matches ) {
diff --git a/src/wp-includes/block-supports/spacing.php b/src/wp-includes/block-supports/spacing.php
index 69c1b77f20..a65bae2f08 100644
--- a/src/wp-includes/block-supports/spacing.php
+++ b/src/wp-includes/block-supports/spacing.php
@@ -1,6 +1,9 @@
 <?php
 /**
  * Spacing block support flag.
+
+ * For backwards compatibility, this remains separate to the dimensions.php
+ * block support despite both belonging under a single panel in the editor.
  *
  * @package WordPress
  * @since 5.8.0
@@ -38,29 +41,36 @@ function wp_register_spacing_support( $block_type ) {
  *
  * @param WP_Block_Type $block_type       Block Type.
  * @param array         $block_attributes Block attributes.
- *
  * @return array Block spacing CSS classes and inline styles.
  */
 function wp_apply_spacing_support( $block_type, $block_attributes ) {
-	$has_padding_support = wp_has_spacing_feature_support( $block_type, 'padding' );
-	$has_margin_support  = wp_has_spacing_feature_support( $block_type, 'margin' );
+	if ( wp_skip_spacing_serialization( $block_type ) ) {
+		return array();
+	}
+
+	$has_padding_support = block_has_support( $block_type, array( 'spacing', 'padding' ), false );
+	$has_margin_support  = block_has_support( $block_type, array( 'spacing', 'margin' ), false );
 	$styles              = array();
 
 	if ( $has_padding_support ) {
 		$padding_value = _wp_array_get( $block_attributes, array( 'style', 'spacing', 'padding' ), null );
-		if ( null !== $padding_value ) {
+		if ( is_array( $padding_value ) ) {
 			foreach ( $padding_value as $key => $value ) {
 				$styles[] = sprintf( 'padding-%s: %s;', $key, $value );
 			}
+		} elseif ( null !== $padding_value ) {
+			$styles[] = sprintf( 'padding: %s;', $padding_value );
 		}
 	}
 
 	if ( $has_margin_support ) {
 		$margin_value = _wp_array_get( $block_attributes, array( 'style', 'spacing', 'margin' ), null );
-		if ( null !== $margin_value ) {
+		if ( is_array( $margin_value ) ) {
 			foreach ( $margin_value as $key => $value ) {
 				$styles[] = sprintf( 'margin-%s: %s;', $key, $value );
 			}
+		} elseif ( null !== $margin_value ) {
+			$styles[] = sprintf( 'margin: %s;', $margin_value );
 		}
 	}
 
@@ -68,20 +78,21 @@ function wp_apply_spacing_support( $block_type, $block_attributes ) {
 }
 
 /**
- * Checks whether the current block type supports the spacing feature requested.
+ * Checks whether serialization of the current block's spacing properties should
+ * occur.
  *
- * @since 5.8.0
+ * @since 5.9.0
  * @access private
  *
- * @param WP_Block_Type $block_type Block type to check for support.
- * @param string        $feature    Name of the feature to check support for.
- * @param mixed         $default    Fallback value for feature support. Default false.
- * @return bool Whether the feature is supported.
+ * @param WP_Block_Type $block_type Block type.
+ * @return bool Whether to serialize spacing support styles & classes.
  */
-function wp_has_spacing_feature_support( $block_type, $feature, $default = false ) {
-	// Check if the specific feature has been opted into individually
-	// via nested flag under `spacing`.
-	return block_has_support( $block_type, array( 'spacing', $feature ), $default );
+function wp_skip_spacing_serialization( $block_type ) {
+	$spacing_support = _wp_array_get( $block_type->supports, array( 'spacing' ), false );
+
+	return is_array( $spacing_support ) &&
+		array_key_exists( '__experimentalSkipSerialization', $spacing_support ) &&
+		$spacing_support['__experimentalSkipSerialization'];
 }
 
 // Register the block support.
diff --git a/src/wp-includes/block-supports/typography.php b/src/wp-includes/block-supports/typography.php
index 2d9f69e773..cf219dc493 100644
--- a/src/wp-includes/block-supports/typography.php
+++ b/src/wp-includes/block-supports/typography.php
@@ -28,6 +28,7 @@ function wp_register_typography_support( $block_type ) {
 	$has_font_size_support       = _wp_array_get( $typography_supports, array( 'fontSize' ), false );
 	$has_font_style_support      = _wp_array_get( $typography_supports, array( '__experimentalFontStyle' ), false );
 	$has_font_weight_support     = _wp_array_get( $typography_supports, array( '__experimentalFontWeight' ), false );
+	$has_letter_spacing_support  = _wp_array_get( $typography_supports, array( '__experimentalLetterSpacing' ), false );
 	$has_line_height_support     = _wp_array_get( $typography_supports, array( 'lineHeight' ), false );
 	$has_text_decoration_support = _wp_array_get( $typography_supports, array( '__experimentalTextDecoration' ), false );
 	$has_text_transform_support  = _wp_array_get( $typography_supports, array( '__experimentalTextTransform' ), false );
@@ -36,6 +37,7 @@ function wp_register_typography_support( $block_type ) {
 		|| $has_font_size_support
 		|| $has_font_style_support
 		|| $has_font_weight_support
+		|| $has_letter_spacing_support
 		|| $has_line_height_support
 		|| $has_text_decoration_support
 		|| $has_text_transform_support;
@@ -58,16 +60,15 @@ function wp_register_typography_support( $block_type ) {
 }
 
 /**
- * Add CSS classes and inline styles for typography features such as font sizes
+ * Adds CSS classes and inline styles for typography features such as font sizes
  * to the incoming attributes array. This will be applied to the block markup in
  * the front-end.
  *
  * @since 5.6.0
  * @access private
  *
- * @param  WP_Block_Type $block_type       Block type.
- * @param  array         $block_attributes Block attributes.
- *
+ * @param WP_Block_Type $block_type       Block type.
+ * @param array         $block_attributes Block attributes.
  * @return array Typography CSS classes and inline styles.
  */
 function wp_apply_typography_support( $block_type, $block_attributes ) {
@@ -93,6 +94,7 @@ function wp_apply_typography_support( $block_type, $block_attributes ) {
 	$has_font_size_support       = _wp_array_get( $typography_supports, array( 'fontSize' ), false );
 	$has_font_style_support      = _wp_array_get( $typography_supports, array( '__experimentalFontStyle' ), false );
 	$has_font_weight_support     = _wp_array_get( $typography_supports, array( '__experimentalFontWeight' ), false );
+	$has_letter_spacing_support  = _wp_array_get( $typography_supports, array( '__experimentalLetterSpacing' ), false );
 	$has_line_height_support     = _wp_array_get( $typography_supports, array( 'lineHeight' ), false );
 	$has_text_decoration_support = _wp_array_get( $typography_supports, array( '__experimentalTextDecoration' ), false );
 	$has_text_transform_support  = _wp_array_get( $typography_supports, array( '__experimentalTextTransform' ), false );
@@ -102,24 +104,28 @@ function wp_apply_typography_support( $block_type, $block_attributes ) {
 		$has_custom_font_size = isset( $block_attributes['style']['typography']['fontSize'] );
 
 		if ( $has_named_font_size ) {
-			$classes[] = sprintf( 'has-%s-font-size', $block_attributes['fontSize'] );
+			$classes[] = sprintf( 'has-%s-font-size', _wp_to_kebab_case( $block_attributes['fontSize'] ) );
 		} elseif ( $has_custom_font_size ) {
 			$styles[] = sprintf( 'font-size: %s;', $block_attributes['style']['typography']['fontSize'] );
 		}
 	}
 
 	if ( $has_font_family_support ) {
-		$has_font_family = isset( $block_attributes['style']['typography']['fontFamily'] );
-		if ( $has_font_family ) {
-			$font_family = $block_attributes['style']['typography']['fontFamily'];
-			if ( strpos( $font_family, 'var:preset|font-family' ) !== false ) {
-				// Get the name from the string and add proper styles.
-				$index_to_splice  = strrpos( $font_family, '|' ) + 1;
-				$font_family_name = substr( $font_family, $index_to_splice );
-				$styles[]         = sprintf( 'font-family: var(--wp--preset--font-family--%s);', $font_family_name );
-			} else {
-				$styles[] = sprintf( 'font-family: %s;', $block_attributes['style']['typography']['fontFamily'] );
+		$has_named_font_family  = array_key_exists( 'fontFamily', $block_attributes );
+		$has_custom_font_family = isset( $block_attributes['style']['typography']['fontFamily'] );
+
+		if ( $has_named_font_family ) {
+			$classes[] = sprintf( 'has-%s-font-family', _wp_to_kebab_case( $block_attributes['fontFamily'] ) );
+		} elseif ( $has_custom_font_family ) {
+			// Before using classes, the value was serialized as a CSS Custom Property.
+			// We don't need this code path when it lands in core.
+			$font_family_custom = $block_attributes['style']['typography']['fontFamily'];
+			if ( strpos( $font_family_custom, 'var:preset|font-family' ) !== false ) {
+				$index_to_splice    = strrpos( $font_family_custom, '|' ) + 1;
+				$font_family_slug   = _wp_to_kebab_case( substr( $font_family_custom, $index_to_splice ) );
+				$font_family_custom = sprintf( 'var(--wp--preset--font-family--%s)', $font_family_slug );
 			}
+			$styles[] = sprintf( 'font-family: %s;', $font_family_custom );
 		}
 	}
 
@@ -158,6 +164,13 @@ function wp_apply_typography_support( $block_type, $block_attributes ) {
 		}
 	}
 
+	if ( $has_letter_spacing_support ) {
+		$letter_spacing_style = wp_typography_get_css_variable_inline_style( $block_attributes, 'letterSpacing', 'letter-spacing' );
+		if ( $letter_spacing_style ) {
+			$styles[] = $letter_spacing_style;
+		}
+	}
+
 	if ( ! empty( $classes ) ) {
 		$attributes['class'] = implode( ' ', $classes );
 	}
@@ -178,8 +191,7 @@ function wp_apply_typography_support( $block_type, $block_attributes ) {
  * @param array  $attributes   Block's attributes.
  * @param string $feature      Key for the feature within the typography styles.
  * @param string $css_property Slug for the CSS property the inline style sets.
- *
- * @return string              CSS inline style.
+ * @return string CSS inline style.
  */
 function wp_typography_get_css_variable_inline_style( $attributes, $feature, $css_property ) {
 	// Retrieve current attribute value or skip if not found.
diff --git a/src/wp-includes/block-template-utils.php b/src/wp-includes/block-template-utils.php
index 2c5b68707b..f471e374b9 100644
--- a/src/wp-includes/block-template-utils.php
+++ b/src/wp-includes/block-template-utils.php
@@ -1,23 +1,555 @@
 <?php
 /**
- * Utilities used to fetch and create templates.
+ * Utilities used to fetch and create templates and template parts.
  *
  * @package WordPress
  * @since 5.8.0
  */
 
+// Define constants for supported wp_template_part_area taxonomy.
+if ( ! defined( 'WP_TEMPLATE_PART_AREA_HEADER' ) ) {
+	define( 'WP_TEMPLATE_PART_AREA_HEADER', 'header' );
+}
+if ( ! defined( 'WP_TEMPLATE_PART_AREA_FOOTER' ) ) {
+	define( 'WP_TEMPLATE_PART_AREA_FOOTER', 'footer' );
+}
+if ( ! defined( 'WP_TEMPLATE_PART_AREA_SIDEBAR' ) ) {
+	define( 'WP_TEMPLATE_PART_AREA_SIDEBAR', 'sidebar' );
+}
+if ( ! defined( 'WP_TEMPLATE_PART_AREA_UNCATEGORIZED' ) ) {
+	define( 'WP_TEMPLATE_PART_AREA_UNCATEGORIZED', 'uncategorized' );
+}
+
+/**
+ * For backward compatibility reasons,
+ * block themes might be using block-templates or block-template-parts,
+ * this function ensures we fallback to these folders properly.
+ *
+ * @since 5.9.0
+ *
+ * @param string $theme_stylesheet The stylesheet. Default is to leverage the main theme root.
+ *
+ * @return string[] {
+ *     Folder names used by block themes.
+ *
+ *     @type string $wp_template      Theme-relative directory name for block templates.
+ *     @type string $wp_template_part Theme-relative directory name for block template parts.
+ * }
+ */
+function get_block_theme_folders( $theme_stylesheet = null ) {
+	$theme_name = null === $theme_stylesheet ? get_stylesheet() : $theme_stylesheet;
+	$root_dir   = get_theme_root( $theme_name );
+	$theme_dir  = "$root_dir/$theme_name";
+
+	if ( file_exists( $theme_dir . '/block-templates' ) || file_exists( $theme_dir . '/block-template-parts' ) ) {
+		return array(
+			'wp_template'      => 'block-templates',
+			'wp_template_part' => 'block-template-parts',
+		);
+	}
+
+	return array(
+		'wp_template'      => 'templates',
+		'wp_template_part' => 'parts',
+	);
+}
+
+/**
+ * Returns a filtered list of allowed area values for template parts.
+ *
+ * @since 5.9.0
+ *
+ * @return array The supported template part area values.
+ */
+function get_allowed_block_template_part_areas() {
+	$default_area_definitions = array(
+		array(
+			'area'        => WP_TEMPLATE_PART_AREA_UNCATEGORIZED,
+			'label'       => __( 'General' ),
+			'description' => __(
+				'General templates often perform a specific role like displaying post content, and are not tied to any particular area.'
+			),
+			'icon'        => 'layout',
+			'area_tag'    => 'div',
+		),
+		array(
+			'area'        => WP_TEMPLATE_PART_AREA_HEADER,
+			'label'       => __( 'Header' ),
+			'description' => __(
+				'The Header template defines a page area that typically contains a title, logo, and main navigation.'
+			),
+			'icon'        => 'header',
+			'area_tag'    => 'header',
+		),
+		array(
+			'area'        => WP_TEMPLATE_PART_AREA_FOOTER,
+			'label'       => __( 'Footer' ),
+			'description' => __(
+				'The Footer template defines a page area that typically contains site credits, social links, or any other combination of blocks.'
+			),
+			'icon'        => 'footer',
+			'area_tag'    => 'footer',
+		),
+	);
+
+	/**
+	 * Filters the list of allowed template part area values.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array $default_area_definitions An array of supported area objects.
+	 */
+	return apply_filters( 'default_wp_template_part_areas', $default_area_definitions );
+}
+
+
+/**
+ * Returns a filtered list of default template types, containing their
+ * localized titles and descriptions.
+ *
+ * @since 5.9.0
+ *
+ * @return array The default template types.
+ */
+function get_default_block_template_types() {
+	$default_template_types = array(
+		'index'          => array(
+			'title'       => _x( 'Index', 'Template name' ),
+			'description' => __( 'Displays posts.' ),
+		),
+		'home'           => array(
+			'title'       => _x( 'Home', 'Template name' ),
+			'description' => __( 'Displays as the site\'s home page, or as the Posts page when a static home page isn\'t set.' ),
+		),
+		'front-page'     => array(
+			'title'       => _x( 'Front Page', 'Template name' ),
+			'description' => __( 'Displays as the site\'s home page.' ),
+		),
+		'singular'       => array(
+			'title'       => _x( 'Singular', 'Template name' ),
+			'description' => __( 'Displays a single post or page.' ),
+		),
+		'single'         => array(
+			'title'       => _x( 'Single Post', 'Template name' ),
+			'description' => __( 'Displays a single post.' ),
+		),
+		'page'           => array(
+			'title'       => _x( 'Page', 'Template name' ),
+			'description' => __( 'Displays a single page.' ),
+		),
+		'archive'        => array(
+			'title'       => _x( 'Archive', 'Template name' ),
+			'description' => __( 'Displays post categories, tags, and other archives.' ),
+		),
+		'author'         => array(
+			'title'       => _x( 'Author', 'Template name' ),
+			'description' => __( 'Displays latest posts written by a single author.' ),
+		),
+		'category'       => array(
+			'title'       => _x( 'Category', 'Template name' ),
+			'description' => __( 'Displays latest posts in single post category.' ),
+		),
+		'taxonomy'       => array(
+			'title'       => _x( 'Taxonomy', 'Template name' ),
+			'description' => __( 'Displays latest posts from a single post taxonomy.' ),
+		),
+		'date'           => array(
+			'title'       => _x( 'Date', 'Template name' ),
+			'description' => __( 'Displays posts from a specific date.' ),
+		),
+		'tag'            => array(
+			'title'       => _x( 'Tag', 'Template name' ),
+			'description' => __( 'Displays latest posts with single post tag.' ),
+		),
+		'attachment'     => array(
+			'title'       => __( 'Media' ),
+			'description' => __( 'Displays individual media items or attachments.' ),
+		),
+		'search'         => array(
+			'title'       => _x( 'Search', 'Template name' ),
+			'description' => __( 'Template used to display search results.' ),
+		),
+		'privacy-policy' => array(
+			'title'       => __( 'Privacy Policy' ),
+			'description' => __( 'Displays the privacy policy page.' ),
+		),
+		'404'            => array(
+			'title'       => _x( '404', 'Template name' ),
+			'description' => __( 'Displays when no content is found.' ),
+		),
+	);
+
+	/**
+	 * Filters the list of template types.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array $default_template_types An array of template types, formatted as [ slug => [ title, description ] ].
+	 */
+	return apply_filters( 'default_template_types', $default_template_types );
+}
+
+/**
+ * Checks whether the input 'area' is a supported value.
+ * Returns the input if supported, otherwise returns the 'uncategorized' value.
+ *
+ * @since 5.9.0
+ * @access private
+ *
+ * @param string $type Template part area name.
+ *
+ * @return string Input if supported, else the uncategorized value.
+ */
+function _filter_block_template_part_area( $type ) {
+	$allowed_areas = array_map(
+		static function ( $item ) {
+			return $item['area'];
+		},
+		get_allowed_block_template_part_areas()
+	);
+	if ( in_array( $type, $allowed_areas, true ) ) {
+		return $type;
+	}
+
+	$warning_message = sprintf(
+		/* translators: %1$s: Template area type, %2$s: the uncategorized template area value. */
+		__( '"%1$s" is not a supported wp_template_part area value and has been added as "%2$s".' ),
+		$type,
+		WP_TEMPLATE_PART_AREA_UNCATEGORIZED
+	);
+	trigger_error( $warning_message, E_USER_NOTICE );
+	return WP_TEMPLATE_PART_AREA_UNCATEGORIZED;
+}
+
+/**
+ * Finds all nested template part file paths in a theme's directory.
+ *
+ * @since 5.9.0
+ * @access private
+ *
+ * @param string $base_directory The theme's file path.
+ * @return array A list of paths to all template part files.
+ */
+function _get_block_templates_paths( $base_directory ) {
+	$path_list = array();
+	if ( file_exists( $base_directory ) ) {
+		$nested_files      = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $base_directory ) );
+		$nested_html_files = new RegexIterator( $nested_files, '/^.+\.html$/i', RecursiveRegexIterator::GET_MATCH );
+		foreach ( $nested_html_files as $path => $file ) {
+			$path_list[] = $path;
+		}
+	}
+	return $path_list;
+}
+
+/**
+ * Retrieves the template file from the theme for a given slug.
+ *
+ * @since 5.9.0
+ * @access private
+ *
+ * @param string $template_type 'wp_template' or 'wp_template_part'.
+ * @param string $slug          Template slug.
+ *
+ * @return array|null Template.
+ */
+function _get_block_template_file( $template_type, $slug ) {
+	if ( 'wp_template' !== $template_type && 'wp_template_part' !== $template_type ) {
+		return null;
+	}
+
+	$themes = array(
+		get_stylesheet() => get_stylesheet_directory(),
+		get_template()   => get_template_directory(),
+	);
+	foreach ( $themes as $theme_slug => $theme_dir ) {
+		$template_base_paths = get_block_theme_folders( $theme_slug );
+		$file_path           = $theme_dir . '/' . $template_base_paths[ $template_type ] . '/' . $slug . '.html';
+		if ( file_exists( $file_path ) ) {
+			$new_template_item = array(
+				'slug'  => $slug,
+				'path'  => $file_path,
+				'theme' => $theme_slug,
+				'type'  => $template_type,
+			);
+
+			if ( 'wp_template_part' === $template_type ) {
+				return _add_block_template_part_area_info( $new_template_item );
+			}
+
+			if ( 'wp_template' === $template_type ) {
+				return _add_block_template_info( $new_template_item );
+			}
+
+			return $new_template_item;
+		}
+	}
+
+	return null;
+}
+
+/**
+ * Retrieves the template files from the theme.
+ *
+ * @since 5.9.0
+ * @access private
+ *
+ * @param string $template_type 'wp_template' or 'wp_template_part'.
+ *
+ * @return array Template.
+ */
+function _get_block_templates_files( $template_type ) {
+	if ( 'wp_template' !== $template_type && 'wp_template_part' !== $template_type ) {
+		return null;
+	}
+
+	$themes         = array(
+		get_stylesheet() => get_stylesheet_directory(),
+		get_template()   => get_template_directory(),
+	);
+	$template_files = array();
+	foreach ( $themes as $theme_slug => $theme_dir ) {
+		$template_base_paths  = get_block_theme_folders( $theme_slug );
+		$theme_template_files = _get_block_templates_paths( $theme_dir . '/' . $template_base_paths[ $template_type ] );
+		foreach ( $theme_template_files as $template_file ) {
+			$template_base_path = $template_base_paths[ $template_type ];
+			$template_slug      = substr(
+				$template_file,
+				// Starting position of slug.
+				strpos( $template_file, $template_base_path . DIRECTORY_SEPARATOR ) + 1 + strlen( $template_base_path ),
+				// Subtract ending '.html'.
+				-5
+			);
+			$new_template_item = array(
+				'slug'  => $template_slug,
+				'path'  => $template_file,
+				'theme' => $theme_slug,
+				'type'  => $template_type,
+			);
+
+			if ( 'wp_template_part' === $template_type ) {
+				$template_files[] = _add_block_template_part_area_info( $new_template_item );
+			}
+
+			if ( 'wp_template' === $template_type ) {
+				$template_files[] = _add_block_template_info( $new_template_item );
+			}
+		}
+	}
+
+	return $template_files;
+}
+
+/**
+ * Attempts to add custom template information to the template item.
+ *
+ * @since 5.9.0
+ * @access private
+ *
+ * @param array $template_item Template to add information to (requires 'slug' field).
+ * @return array Template item.
+ */
+function _add_block_template_info( $template_item ) {
+	if ( ! WP_Theme_JSON_Resolver::theme_has_support() ) {
+		return $template_item;
+	}
+
+	$theme_data = WP_Theme_JSON_Resolver::get_theme_data()->get_custom_templates();
+	if ( isset( $theme_data[ $template_item['slug'] ] ) ) {
+		$template_item['title']     = $theme_data[ $template_item['slug'] ]['title'];
+		$template_item['postTypes'] = $theme_data[ $template_item['slug'] ]['postTypes'];
+	}
+
+	return $template_item;
+}
+
+/**
+ * Attempts to add the template part's area information to the input template.
+ *
+ * @since 5.9.0
+ * @access private
+ *
+ * @param array $template_info Template to add information to (requires 'type' and 'slug' fields).
+ *
+ * @return array Template info.
+ */
+function _add_block_template_part_area_info( $template_info ) {
+	if ( WP_Theme_JSON_Resolver::theme_has_support() ) {
+		$theme_data = WP_Theme_JSON_Resolver::get_theme_data()->get_template_parts();
+	}
+
+	if ( isset( $theme_data[ $template_info['slug'] ]['area'] ) ) {
+		$template_info['title'] = $theme_data[ $template_info['slug'] ]['title'];
+		$template_info['area']  = _filter_block_template_part_area( $theme_data[ $template_info['slug'] ]['area'] );
+	} else {
+		$template_info['area'] = WP_TEMPLATE_PART_AREA_UNCATEGORIZED;
+	}
+
+	return $template_info;
+}
+
+/**
+ * Returns an array containing the references of
+ * the passed blocks and their inner blocks.
+ *
+ * @since 5.9.0
+ * @access private
+ *
+ * @param array $blocks array of blocks.
+ *
+ * @return array block references to the passed blocks and their inner blocks.
+ */
+function _flatten_blocks( &$blocks ) {
+	$all_blocks = array();
+	$queue      = array();
+	foreach ( $blocks as &$block ) {
+		$queue[] = &$block;
+	}
+
+	while ( count( $queue ) > 0 ) {
+		$block = &$queue[0];
+		array_shift( $queue );
+		$all_blocks[] = &$block;
+
+		if ( ! empty( $block['innerBlocks'] ) ) {
+			foreach ( $block['innerBlocks'] as &$inner_block ) {
+				$queue[] = &$inner_block;
+			}
+		}
+	}
+
+	return $all_blocks;
+}
+
+/**
+ * Parses wp_template content and injects the active theme's
+ * stylesheet as a theme attribute into each wp_template_part
+ *
+ * @since 5.9.0
+ * @access private
+ *
+ * @param string $template_content serialized wp_template content.
+ *
+ * @return string Updated 'wp_template' content.
+ */
+function _inject_theme_attribute_in_block_template_content( $template_content ) {
+	$has_updated_content = false;
+	$new_content         = '';
+	$template_blocks     = parse_blocks( $template_content );
+
+	$blocks = _flatten_blocks( $template_blocks );
+	foreach ( $blocks as &$block ) {
+		if (
+			'core/template-part' === $block['blockName'] &&
+			! isset( $block['attrs']['theme'] )
+		) {
+			$block['attrs']['theme'] = wp_get_theme()->get_stylesheet();
+			$has_updated_content     = true;
+		}
+	}
+
+	if ( $has_updated_content ) {
+		foreach ( $template_blocks as &$block ) {
+			$new_content .= serialize_block( $block );
+		}
+
+		return $new_content;
+	}
+
+	return $template_content;
+}
+
+/**
+ * Parses a block template and removes the theme attribute from each template part.
+ *
+ * @since 5.9.0
+ * @access private
+ *
+ * @param string $template_content Serialized block template content.
+ * @return string Updated block template content.
+ */
+function _remove_theme_attribute_in_block_template_content( $template_content ) {
+	$has_updated_content = false;
+	$new_content         = '';
+	$template_blocks     = parse_blocks( $template_content );
+
+	$blocks = _flatten_blocks( $template_blocks );
+	foreach ( $blocks as $key => $block ) {
+		if ( 'core/template-part' === $block['blockName'] && isset( $block['attrs']['theme'] ) ) {
+			unset( $blocks[ $key ]['attrs']['theme'] );
+			$has_updated_content = true;
+		}
+	}
+
+	if ( ! $has_updated_content ) {
+		return $template_content;
+	}
+
+	foreach ( $template_blocks as $block ) {
+		$new_content .= serialize_block( $block );
+	}
+
+	return $new_content;
+}
+
+/**
+ * Build a unified template object based on a theme file.
+ *
+ * @since 5.9.0
+ * @access private
+ *
+ * @param array  $template_file Theme file.
+ * @param string $template_type 'wp_template' or 'wp_template_part'.
+ *
+ * @return WP_Block_Template Template.
+ */
+function _build_block_template_result_from_file( $template_file, $template_type ) {
+	$default_template_types = get_default_block_template_types();
+	$template_content       = file_get_contents( $template_file['path'] );
+	$theme                  = wp_get_theme()->get_stylesheet();
+
+	$template                 = new WP_Block_Template();
+	$template->id             = $theme . '//' . $template_file['slug'];
+	$template->theme          = $theme;
+	$template->content        = _inject_theme_attribute_in_block_template_content( $template_content );
+	$template->slug           = $template_file['slug'];
+	$template->source         = 'theme';
+	$template->type           = $template_type;
+	$template->title          = ! empty( $template_file['title'] ) ? $template_file['title'] : $template_file['slug'];
+	$template->status         = 'publish';
+	$template->has_theme_file = true;
+	$template->is_custom      = true;
+
+	if ( 'wp_template' === $template_type && isset( $default_template_types[ $template_file['slug'] ] ) ) {
+		$template->description = $default_template_types[ $template_file['slug'] ]['description'];
+		$template->title       = $default_template_types[ $template_file['slug'] ]['title'];
+		$template->is_custom   = false;
+	}
+
+	if ( 'wp_template' === $template_type && isset( $template_file['postTypes'] ) ) {
+		$template->post_types = $template_file['postTypes'];
+	}
+
+	if ( 'wp_template_part' === $template_type && isset( $template_file['area'] ) ) {
+		$template->area = $template_file['area'];
+	}
+
+	return $template;
+}
+
 /**
  * Build a unified template object based a post Object.
  *
+ * @since 5.9.0
  * @access private
- * @since 5.8.0
  *
  * @param WP_Post $post Template post.
  *
  * @return WP_Block_Template|WP_Error Template.
  */
-function _build_template_result_from_post( $post ) {
-	$terms = get_the_terms( $post, 'wp_theme' );
+function _build_block_template_result_from_post( $post ) {
+	$default_template_types = get_default_block_template_types();
+	$terms                  = get_the_terms( $post, 'wp_theme' );
 
 	if ( is_wp_error( $terms ) ) {
 		return $terms;
@@ -27,7 +559,11 @@ function _build_template_result_from_post( $post ) {
 		return new WP_Error( 'template_missing_theme', __( 'No theme is defined for this template.' ) );
 	}
 
-	$theme = $terms[0]->name;
+	$theme          = $terms[0]->name;
+	$has_theme_file = wp_get_theme()->get_stylesheet() === $theme &&
+		null !== _get_block_template_file( $post->post_type, $post->post_name );
+
+	$origin = get_post_meta( $post->ID, 'origin', true );
 
 	$template                 = new WP_Block_Template();
 	$template->wp_id          = $post->ID;
@@ -36,11 +572,25 @@ function _build_template_result_from_post( $post ) {
 	$template->content        = $post->post_content;
 	$template->slug           = $post->post_name;
 	$template->source         = 'custom';
+	$template->origin         = ! empty( $origin ) ? $origin : null;
 	$template->type           = $post->post_type;
 	$template->description    = $post->post_excerpt;
 	$template->title          = $post->post_title;
 	$template->status         = $post->post_status;
-	$template->has_theme_file = false;
+	$template->has_theme_file = $has_theme_file;
+	$template->is_custom      = true;
+	$template->author         = $post->post_author;
+
+	if ( 'wp_template' === $post->post_type && isset( $default_template_types[ $template->slug ] ) ) {
+		$template->is_custom = false;
+	}
+
+	if ( 'wp_template_part' === $post->post_type ) {
+		$type_terms = get_the_terms( $post, 'wp_template_part_area' );
+		if ( ! is_wp_error( $type_terms ) && false !== $type_terms ) {
+			$template->area = $type_terms[0]->name;
+		}
+	}
 
 	return $template;
 }
@@ -50,16 +600,43 @@ function _build_template_result_from_post( $post ) {
  *
  * @since 5.8.0
  *
- * @param array $query {
+ * @param array  $query {
  *     Optional. Arguments to retrieve templates.
  *
- *     @type array  $slug__in List of slugs to include.
- *     @type int    $wp_id Post ID of customized template.
+ *     @type array  $slug__in  List of slugs to include.
+ *     @type int    $wp_id     Post ID of customized template.
+ *     @type string $area      A 'wp_template_part_area' taxonomy value to filter by (for wp_template_part template type only).
+ *     @type string $post_type Post type to get the templates for.
  * }
- * @param string $template_type Optional. The template type (post type). Default 'wp_template'.
- * @return WP_Block_Template[] Block template objects.
+ * @param string $template_type 'wp_template' or 'wp_template_part'.
+ *
+ * @return array Templates.
  */
 function get_block_templates( $query = array(), $template_type = 'wp_template' ) {
+	/**
+	 * Filters the block templates array before the query takes place.
+	 *
+	 * Return a non-null value to bypass the WordPress queries.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_Block_Template[]|null $block_templates Return an array of block templates to short-circuit the default query,
+	 *                                                  or null to allow WP to run it's normal queries.
+	 * @param array  $query {
+	 *     Optional. Arguments to retrieve templates.
+	 *
+	 *     @type array  $slug__in List of slugs to include.
+	 *     @type int    $wp_id Post ID of customized template.
+	 *     @type string $post_type Post type to get the templates for.
+	 * }
+	 * @param string $template_type wp_template or wp_template_part.
+	 */
+	$templates = apply_filters( 'pre_get_block_templates', null, $query, $template_type );
+	if ( ! is_null( $templates ) ) {
+		return $templates;
+	}
+
+	$post_type     = isset( $query['post_type'] ) ? $query['post_type'] : '';
 	$wp_query_args = array(
 		'post_status'    => array( 'auto-draft', 'draft', 'publish' ),
 		'post_type'      => $template_type,
@@ -74,11 +651,20 @@ function get_block_templates( $query = array(), $template_type = 'wp_template' )
 		),
 	);
 
+	if ( 'wp_template_part' === $template_type && isset( $query['area'] ) ) {
+		$wp_query_args['tax_query'][]           = array(
+			'taxonomy' => 'wp_template_part_area',
+			'field'    => 'name',
+			'terms'    => $query['area'],
+		);
+		$wp_query_args['tax_query']['relation'] = 'AND';
+	}
+
 	if ( isset( $query['slug__in'] ) ) {
 		$wp_query_args['post_name__in'] = $query['slug__in'];
 	}
 
-	// This is only needed for the regular templates CPT listing and editor.
+	// This is only needed for the regular templates/template parts post type listing and editor.
 	if ( isset( $query['wp_id'] ) ) {
 		$wp_query_args['p'] = $query['wp_id'];
 	} else {
@@ -88,14 +674,66 @@ function get_block_templates( $query = array(), $template_type = 'wp_template' )
 	$template_query = new WP_Query( $wp_query_args );
 	$query_result   = array();
 	foreach ( $template_query->posts as $post ) {
-		$template = _build_template_result_from_post( $post );
+		$template = _build_block_template_result_from_post( $post );
 
-		if ( ! is_wp_error( $template ) ) {
-			$query_result[] = $template;
+		if ( is_wp_error( $template ) ) {
+			continue;
+		}
+
+		if ( $post_type && ! $template->is_custom ) {
+			continue;
+		}
+
+		$query_result[] = $template;
+	}
+
+	if ( ! isset( $query['wp_id'] ) ) {
+		$template_files = _get_block_templates_files( $template_type );
+		foreach ( $template_files as $template_file ) {
+			$template = _build_block_template_result_from_file( $template_file, $template_type );
+
+			if ( $post_type && ! $template->is_custom ) {
+				continue;
+			}
+
+			if ( $post_type &&
+				isset( $template->post_types ) &&
+				! in_array( $post_type, $template->post_types, true )
+			) {
+				continue;
+			}
+
+			$is_not_custom   = false === array_search(
+				wp_get_theme()->get_stylesheet() . '//' . $template_file['slug'],
+				array_column( $query_result, 'id' ),
+				true
+			);
+			$fits_slug_query =
+				! isset( $query['slug__in'] ) || in_array( $template_file['slug'], $query['slug__in'], true );
+			$fits_area_query =
+				! isset( $query['area'] ) || $template_file['area'] === $query['area'];
+			$should_include  = $is_not_custom && $fits_slug_query && $fits_area_query;
+			if ( $should_include ) {
+				$query_result[] = $template;
+			}
 		}
 	}
 
-	return $query_result;
+	/**
+	 * Filters the array of queried block templates array after they've been fetched.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_Block_Template[] $query_result Array of found block templates.
+	 * @param array  $query {
+	 *     Optional. Arguments to retrieve templates.
+	 *
+	 *     @type array  $slug__in List of slugs to include.
+	 *     @type int    $wp_id Post ID of customized template.
+	 * }
+	 * @param string $template_type wp_template or wp_template_part.
+	 */
+	return apply_filters( 'get_block_templates', $query_result, $query, $template_type );
 }
 
 /**
@@ -104,10 +742,29 @@ function get_block_templates( $query = array(), $template_type = 'wp_template' )
  * @since 5.8.0
  *
  * @param string $id            Template unique identifier (example: theme_slug//template_slug).
- * @param string $template_type Optional. The template type (post type). Default 'wp_template'.
+ * @param string $template_type Optional. Template type: `'wp_template'` or '`wp_template_part'`.
+ *                              Default `'wp_template'`.
+ *
  * @return WP_Block_Template|null Template.
  */
 function get_block_template( $id, $template_type = 'wp_template' ) {
+	/**
+	 *Filters the block template object before the query takes place.
+	 *
+	 * Return a non-null value to bypass the WordPress queries.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_Block_Template|null $block_template Return block template object to short-circuit the default query,
+	 *                                               or null to allow WP to run its normal queries.
+	 * @param string $id                             Template unique identifier (example: theme_slug//template_slug).
+	 * @param string $template_type                  Template type: `'wp_template'` or '`wp_template_part'`.
+	 */
+	$block_template = apply_filters( 'pre_get_block_template', null, $id, $template_type );
+	if ( ! is_null( $block_template ) ) {
+		return $block_template;
+	}
+
 	$parts = explode( '//', $id, 2 );
 	if ( count( $parts ) < 2 ) {
 		return null;
@@ -131,12 +788,168 @@ function get_block_template( $id, $template_type = 'wp_template' ) {
 	$posts                = $template_query->posts;
 
 	if ( count( $posts ) > 0 ) {
-		$template = _build_template_result_from_post( $posts[0] );
+		$template = _build_block_template_result_from_post( $posts[0] );
 
 		if ( ! is_wp_error( $template ) ) {
 			return $template;
 		}
 	}
 
-	return null;
+	$block_template = get_block_file_template( $id, $template_type );
+
+	/**
+	 * Filters the queried block template object after it's been fetched.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_Block_Template|null $block_template The found block template, or null if there isn't one.
+	 * @param string                 $id             Template unique identifier (example: theme_slug//template_slug).
+	 * @param array                  $template_type  Template type: `'wp_template'` or '`wp_template_part'`.
+	 */
+	return apply_filters( 'get_block_template', $block_template, $id, $template_type );
+}
+
+/**
+ * Retrieves a single unified template object using its id.
+ *
+ * @since 5.9.0
+ *
+ * @param string $id            Template unique identifier (example: theme_slug//template_slug).
+ * @param string $template_type Optional. Template type: `'wp_template'` or '`wp_template_part'`.
+ *                              Default `'wp_template'`.
+ * @return WP_Block_Template|null The found block template, or null if there isn't one.
+ */
+function get_block_file_template( $id, $template_type = 'wp_template' ) {
+	/**
+	 * Filters the block templates array before the query takes place.
+	 *
+	 * Return a non-null value to bypass the WordPress queries.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_Block_Template|null $block_template Return block template object to short-circuit the default query,
+	 *                                               or null to allow WP to run its normal queries.
+	 * @param string                 $id             Template unique identifier (example: theme_slug//template_slug).
+	 * @param string                 $template_type  Template type: `'wp_template'` or '`wp_template_part'`.
+	 */
+	$block_template = apply_filters( 'pre_get_block_file_template', null, $id, $template_type );
+	if ( ! is_null( $block_template ) ) {
+		return $block_template;
+	}
+
+	$parts = explode( '//', $id, 2 );
+	if ( count( $parts ) < 2 ) {
+		/** This filter is documented in wp-includes/block-template-utils.php */
+		return apply_filters( 'get_block_file_template', null, $id, $template_type );
+	}
+	list( $theme, $slug ) = $parts;
+
+	if ( wp_get_theme()->get_stylesheet() !== $theme ) {
+		/** This filter is documented in wp-includes/block-template-utils.php */
+		return apply_filters( 'get_block_file_template', null, $id, $template_type );
+	}
+
+	$template_file = _get_block_template_file( $template_type, $slug );
+	if ( null === $template_file ) {
+		/** This filter is documented in wp-includes/block-template-utils.php */
+		return apply_filters( 'get_block_file_template', null, $id, $template_type );
+	}
+
+	$block_template = _build_block_template_result_from_file( $template_file, $template_type );
+
+	/**
+	 * Filters the array of queried block templates array after they've been fetched.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_Block_Template|null $block_template The found block template, or null if there is none.
+	 * @param string                 $id             Template unique identifier (example: theme_slug//template_slug).
+	 * @param string                 $template_type  Template type: `'wp_template'` or '`wp_template_part'`.
+	 */
+	return apply_filters( 'get_block_file_template', $block_template, $id, $template_type );
+}
+
+/**
+ * Print a template-part.
+ *
+ * @since 5.9.0
+ *
+ * @param string $part The template-part to print. Use "header" or "footer".
+ */
+function block_template_part( $part ) {
+	$template_part = get_block_template( get_stylesheet() . '//' . $part, 'wp_template_part' );
+	if ( ! $template_part || empty( $template_part->content ) ) {
+		return;
+	}
+	echo do_blocks( $template_part->content );
+}
+
+/**
+ * Print the header template-part.
+ *
+ * @since 5.9.0
+ */
+function block_header_area() {
+	block_template_part( 'header' );
+}
+
+/**
+ * Print the footer template-part.
+ *
+ * @since 5.9.0
+ */
+function block_footer_area() {
+	block_template_part( 'footer' );
+}
+
+/**
+ * Creates an export of the current templates and
+ * template parts from the site editor at the
+ * specified path in a ZIP file.
+ *
+ * @since 5.9.0
+ *
+ * @return WP_Error|string Path of the ZIP file or error on failure.
+ */
+function wp_generate_block_templates_export_file() {
+	if ( ! class_exists( 'ZipArchive' ) ) {
+		return new WP_Error( 'missing_zip_package', __( 'Zip Export not supported.' ) );
+	}
+
+	$obscura  = wp_generate_password( 12, false, false );
+	$filename = get_temp_dir() . 'edit-site-export-' . $obscura . '.zip';
+
+	$zip = new ZipArchive();
+	if ( true !== $zip->open( $filename, ZipArchive::CREATE ) ) {
+		return new WP_Error( 'unable_to_create_zip', __( 'Unable to open export file (archive) for writing.' ) );
+	}
+
+	$zip->addEmptyDir( 'theme' );
+	$zip->addEmptyDir( 'theme/templates' );
+	$zip->addEmptyDir( 'theme/parts' );
+
+	// Load templates into the zip file.
+	$templates = get_block_templates();
+	foreach ( $templates as $template ) {
+		$template->content = _remove_theme_attribute_in_block_template_content( $template->content );
+
+		$zip->addFromString(
+			'theme/templates/' . $template->slug . '.html',
+			$template->content
+		);
+	}
+
+	// Load template parts into the zip file.
+	$template_parts = get_block_templates( array(), 'wp_template_part' );
+	foreach ( $template_parts as $template_part ) {
+		$zip->addFromString(
+			'theme/parts/' . $template_part->slug . '.html',
+			$template_part->content
+		);
+	}
+
+	// Save changes to the zip file.
+	$zip->close();
+
+	return $filename;
 }
diff --git a/src/wp-includes/block-template.php b/src/wp-includes/block-template.php
index 945b96b027..7bea75dca4 100644
--- a/src/wp-includes/block-template.php
+++ b/src/wp-includes/block-template.php
@@ -5,6 +5,32 @@
  * @package WordPress
  */
 
+/**
+ * Adds necessary filters to use 'wp_template' posts instead of theme template files.
+ *
+ * @access private
+ * @since 5.9.0
+ */
+function _add_template_loader_filters() {
+	if ( ! current_theme_supports( 'block-templates' ) ) {
+		return;
+	}
+
+	$template_types = array_keys( get_default_block_template_types() );
+	foreach ( $template_types as $template_type ) {
+		// Skip 'embed' for now because it is not a regular template type.
+		if ( 'embed' === $template_type ) {
+			continue;
+		}
+		add_filter( str_replace( '-', '', $template_type ) . '_template', 'locate_block_template', 20, 3 );
+	}
+
+	// Request to resolve a template.
+	if ( isset( $_GET['_wp-find-template'] ) ) {
+		add_filter( 'pre_get_posts', '_resolve_template_for_new_post' );
+	}
+}
+
 /**
  * Find a block template with equal or higher specificity than a given PHP template file.
  *
@@ -22,6 +48,10 @@
 function locate_block_template( $template, $type, array $templates ) {
 	global $_wp_current_template_content;
 
+	if ( ! current_theme_supports( 'block-templates' ) ) {
+		return $template;
+	}
+
 	if ( $template ) {
 		/*
 		 * locate_template() has found a PHP template at the path specified by $template.
@@ -40,12 +70,12 @@ function locate_block_template( $template, $type, array $templates ) {
 		);
 		$index                  = array_search( $relative_template_path, $templates, true );
 
-		// If the template hiearchy algorithm has successfully located a PHP template file,
+		// If the template hierarchy algorithm has successfully located a PHP template file,
 		// we will only consider block templates with higher or equal specificity.
 		$templates = array_slice( $templates, 0, $index + 1 );
 	}
 
-	$block_template = resolve_block_template( $type, $templates );
+	$block_template = resolve_block_template( $type, $templates, $template );
 
 	if ( $block_template ) {
 		if ( empty( $block_template->content ) && is_user_logged_in() ) {
@@ -92,12 +122,14 @@ function locate_block_template( $template, $type, array $templates ) {
  *
  * @access private
  * @since 5.8.0
+ * @since 5.9.0 Added the `$fallback_template` parameter.
  *
  * @param string   $template_type      The current template type.
  * @param string[] $template_hierarchy The current template hierarchy, ordered by priority.
+ * @param string   $fallback_template  A PHP fallback template to use if no matching block template is found.
  * @return WP_Block_Template|null template A template object, or null if none could be found.
  */
-function resolve_block_template( $template_type, $template_hierarchy ) {
+function resolve_block_template( $template_type, $template_hierarchy, $fallback_template ) {
 	if ( ! $template_type ) {
 		return null;
 	}
@@ -129,6 +161,43 @@ function resolve_block_template( $template_type, $template_hierarchy ) {
 		}
 	);
 
+	$theme_base_path        = get_stylesheet_directory() . DIRECTORY_SEPARATOR;
+	$parent_theme_base_path = get_template_directory() . DIRECTORY_SEPARATOR;
+
+	// Is the active theme a child theme, and is the PHP fallback template part of it?
+	if (
+		strpos( $fallback_template, $theme_base_path ) === 0 &&
+		strpos( $fallback_template, $parent_theme_base_path ) === false
+	) {
+		$fallback_template_slug = substr(
+			$fallback_template,
+			// Starting position of slug.
+			strpos( $fallback_template, $theme_base_path ) + strlen( $theme_base_path ),
+			// Remove '.php' suffix.
+			-4
+		);
+
+		// Is our candidate block template's slug identical to our PHP fallback template's?
+		if (
+			count( $templates ) &&
+			$fallback_template_slug === $templates[0]->slug &&
+			'theme' === $templates[0]->source
+		) {
+			// Unfortunately, we cannot trust $templates[0]->theme, since it will always
+			// be set to the active theme's slug by _build_block_template_result_from_file(),
+			// even if the block template is really coming from the active theme's parent.
+			// (The reason for this is that we want it to be associated with the active theme
+			// -- not its parent -- once we edit it and store it to the DB as a wp_template CPT.)
+			// Instead, we use _get_block_template_file() to locate the block template file.
+			$template_file = _get_block_template_file( 'wp_template', $fallback_template_slug );
+			if ( $template_file && get_template() === $template_file['theme'] ) {
+				// The block template is part of the parent theme, so we
+				// have to give precedence to the child theme's PHP template.
+				array_shift( $templates );
+			}
+		}
+	}
+
 	return count( $templates ) ? $templates[0] : null;
 }
 
@@ -170,7 +239,10 @@ function get_the_block_template_html() {
 	$content = $wp_embed->autoembed( $content );
 	$content = do_blocks( $content );
 	$content = wptexturize( $content );
+	$content = convert_smilies( $content );
+	$content = shortcode_unautop( $content );
 	$content = wp_filter_content_tags( $content );
+	$content = do_shortcode( $content );
 	$content = str_replace( ']]>', ']]&gt;', $content );
 
 	// Wrap block template in .wp-site-blocks to allow for specific descendant styles
@@ -227,3 +299,35 @@ function _block_template_render_without_post_block_context( $context ) {
 
 	return $context;
 }
+
+/**
+ * Sets the current WP_Query to return auto-draft posts.
+ *
+ * The auto-draft status indicates a new post, so allow the the WP_Query instance to
+ * return an auto-draft post for template resolution when editing a new post.
+ *
+ * @access private
+ * @since 5.9.0
+ *
+ * @param WP_Query $wp_query Current WP_Query instance, passed by reference.
+ */
+function _resolve_template_for_new_post( $wp_query ) {
+	remove_filter( 'pre_get_posts', '_resolve_template_for_new_post' );
+
+	// Pages.
+	$page_id = isset( $wp_query->query['page_id'] ) ? $wp_query->query['page_id'] : null;
+
+	// Posts, including custom post types.
+	$p = isset( $wp_query->query['p'] ) ? $wp_query->query['p'] : null;
+
+	$post_id = $page_id ? $page_id : $p;
+	$post    = get_post( $post_id );
+
+	if (
+		$post &&
+		'auto-draft' === $post->post_status &&
+		current_user_can( 'edit_post', $post->ID )
+	) {
+		$wp_query->set( 'post_status', 'auto-draft' );
+	}
+}
diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php
index 97c292d875..28e269c1d9 100644
--- a/src/wp-includes/blocks.php
+++ b/src/wp-includes/blocks.php
@@ -83,9 +83,11 @@ function register_block_script_handle( $metadata, $field_name ) {
 	}
 
 	$script_handle     = generate_block_asset_handle( $metadata['name'], $field_name );
-	$script_asset_path = realpath(
-		dirname( $metadata['file'] ) . '/' .
-		substr_replace( $script_path, '.asset.php', - strlen( '.js' ) )
+	$script_asset_path = wp_normalize_path(
+		realpath(
+			dirname( $metadata['file'] ) . '/' .
+			substr_replace( $script_path, '.asset.php', - strlen( '.js' ) )
+		)
 	);
 	if ( ! file_exists( $script_asset_path ) ) {
 		_doing_it_wrong(
@@ -100,9 +102,13 @@ function register_block_script_handle( $metadata, $field_name ) {
 		);
 		return false;
 	}
-	$is_core_block       = isset( $metadata['file'] ) && 0 === strpos( $metadata['file'], ABSPATH . WPINC );
+	// Path needs to be normalized to work in Windows env.
+	$wpinc_path_norm  = wp_normalize_path( ABSPATH . WPINC );
+	$script_path_norm = wp_normalize_path( realpath( dirname( $metadata['file'] ) . '/' . $script_path ) );
+	$is_core_block    = isset( $metadata['file'] ) && 0 === strpos( $metadata['file'], $wpinc_path_norm );
+
 	$script_uri          = $is_core_block ?
-		includes_url( str_replace( ABSPATH . WPINC, '', realpath( dirname( $metadata['file'] ) . '/' . $script_path ) ) ) :
+		includes_url( str_replace( $wpinc_path_norm, '', $script_path_norm ) ) :
 		plugins_url( $script_path, $metadata['file'] );
 	$script_asset        = require $script_asset_path;
 	$script_dependencies = isset( $script_asset['dependencies'] ) ? $script_asset['dependencies'] : array();
@@ -139,7 +145,8 @@ function register_block_style_handle( $metadata, $field_name ) {
 	if ( empty( $metadata[ $field_name ] ) ) {
 		return false;
 	}
-	$is_core_block = isset( $metadata['file'] ) && 0 === strpos( $metadata['file'], ABSPATH . WPINC );
+	$wpinc_path_norm = wp_normalize_path( ABSPATH . WPINC );
+	$is_core_block   = isset( $metadata['file'] ) && 0 === strpos( $metadata['file'], $wpinc_path_norm );
 	if ( $is_core_block && ! wp_should_load_separate_core_block_assets() ) {
 		return false;
 	}
@@ -232,7 +239,7 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
 	if ( ! is_array( $metadata ) || empty( $metadata['name'] ) ) {
 		return false;
 	}
-	$metadata['file'] = $metadata_file;
+	$metadata['file'] = wp_normalize_path( $metadata_file );
 
 	/**
 	 * Filters the metadata provided for registering a block type.
@@ -1146,3 +1153,178 @@ function build_query_vars_from_query_block( $block, $page ) {
 	}
 	return $query;
 }
+
+/**
+ * Helper function that returns the proper pagination arrow html for
+ * `QueryPaginationNext` and `QueryPaginationPrevious` blocks based
+ * on the provided `paginationArrow` from `QueryPagination` context.
+ *
+ * It's used in QueryPaginationNext and QueryPaginationPrevious blocks.
+ *
+ * @since 5.9.0
+ *
+ * @param WP_Block $block   Block instance.
+ * @param boolean  $is_next Flag for handling `next/previous` blocks.
+ *
+ * @return string|null Returns the constructed WP_Query arguments.
+ */
+function get_query_pagination_arrow( $block, $is_next ) {
+	$arrow_map = array(
+		'none'    => '',
+		'arrow'   => array(
+			'next'     => '→',
+			'previous' => '←',
+		),
+		'chevron' => array(
+			'next'     => '»',
+			'previous' => '«',
+		),
+	);
+	if ( ! empty( $block->context['paginationArrow'] ) && array_key_exists( $block->context['paginationArrow'], $arrow_map ) && ! empty( $arrow_map[ $block->context['paginationArrow'] ] ) ) {
+		$pagination_type = $is_next ? 'next' : 'previous';
+		$arrow_attribute = $block->context['paginationArrow'];
+		$arrow           = $arrow_map[ $block->context['paginationArrow'] ][ $pagination_type ];
+		$arrow_classes   = "wp-block-query-pagination-$pagination_type-arrow is-arrow-$arrow_attribute";
+		return "<span class='$arrow_classes'>$arrow</span>";
+	}
+	return null;
+}
+
+/**
+ * Enqueues a stylesheet for a specific block.
+ *
+ * If the theme has opted-in to separate-styles loading,
+ * then the stylesheet will be enqueued on-render,
+ * otherwise when the block inits.
+ *
+ * @since 5.9.0
+ *
+ * @param string $block_name The block-name, including namespace.
+ * @param array  $args       An array of arguments [handle,src,deps,ver,media].
+ * @return void
+ */
+function wp_enqueue_block_style( $block_name, $args ) {
+	$args = wp_parse_args(
+		$args,
+		array(
+			'handle' => '',
+			'src'    => '',
+			'deps'   => array(),
+			'ver'    => false,
+			'media'  => 'all',
+		)
+	);
+
+	/**
+	 * Callback function to register and enqueue styles.
+	 *
+	 * @param string $content When the callback is used for the render_block filter,
+	 *                        the content needs to be returned so the function parameter
+	 *                        is to ensure the content exists.
+	 * @return string Block content.
+	 */
+	$callback = static function( $content ) use ( $args ) {
+		// Register the stylesheet.
+		if ( ! empty( $args['src'] ) ) {
+			wp_register_style( $args['handle'], $args['src'], $args['deps'], $args['ver'], $args['media'] );
+		}
+
+		// Add `path` data if provided.
+		if ( isset( $args['path'] ) ) {
+			wp_style_add_data( $args['handle'], 'path', $args['path'] );
+
+			// Get the RTL file path.
+			$rtl_file_path = str_replace( '.css', '-rtl.css', $args['path'] );
+
+			// Add RTL stylesheet.
+			if ( file_exists( $rtl_file_path ) ) {
+				wp_style_add_data( $args['handle'], 'rtl', 'replace' );
+
+				if ( is_rtl() ) {
+					wp_style_add_data( $args['handle'], 'path', $rtl_file_path );
+				}
+			}
+		}
+
+		// Enqueue the stylesheet.
+		wp_enqueue_style( $args['handle'] );
+
+		return $content;
+	};
+
+	$hook = did_action( 'wp_enqueue_scripts' ) ? 'wp_footer' : 'wp_enqueue_scripts';
+	if ( wp_should_load_separate_core_block_assets() ) {
+		/**
+		 * Callback function to register and enqueue styles.
+		 *
+		 * @param string $content The block content.
+		 * @param array  $block   The full block, including name and attributes.
+		 * @return string Block content.
+		 */
+		$callback_separate = static function( $content, $block ) use ( $block_name, $callback ) {
+			if ( ! empty( $block['blockName'] ) && $block_name === $block['blockName'] ) {
+				return $callback( $content );
+			}
+			return $content;
+		};
+
+		/*
+		 * The filter's callback here is an anonymous function because
+		 * using a named function in this case is not possible.
+		 *
+		 * The function cannot be unhooked, however, users are still able
+		 * to dequeue the stylesheets registered/enqueued by the callback
+		 * which is why in this case, using an anonymous function
+		 * was deemed acceptable.
+		 */
+		add_filter( 'render_block', $callback_separate, 10, 2 );
+		return;
+	}
+
+	/*
+	 * The filter's callback here is an anonymous function because
+	 * using a named function in this case is not possible.
+	 *
+	 * The function cannot be unhooked, however, users are still able
+	 * to dequeue the stylesheets registered/enqueued by the callback
+	 * which is why in this case, using an anonymous function
+	 * was deemed acceptable.
+	 */
+	add_filter( $hook, $callback );
+
+	// Enqueue assets in the editor.
+	add_action( 'enqueue_block_assets', $callback );
+}
+
+/**
+ * Allow multiple block styles.
+ *
+ * @since 5.9.0
+ *
+ * @param array $metadata Metadata for registering a block type.
+ * @return array Metadata for registering a block type.
+ */
+function _wp_multiple_block_styles( $metadata ) {
+	foreach ( array( 'style', 'editorStyle' ) as $key ) {
+		if ( ! empty( $metadata[ $key ] ) && is_array( $metadata[ $key ] ) ) {
+			$default_style = array_shift( $metadata[ $key ] );
+			foreach ( $metadata[ $key ] as $handle ) {
+				$args = array( 'handle' => $handle );
+				if ( 0 === strpos( $handle, 'file:' ) && isset( $metadata['file'] ) ) {
+					$style_path = remove_block_asset_path_prefix( $handle );
+					$args       = array(
+						'handle' => sanitize_key( "{$metadata['name']}-{$style_path}" ),
+						'src'    => plugins_url( $style_path, $metadata['file'] ),
+					);
+				}
+
+				wp_enqueue_block_style( $metadata['name'], $args );
+			}
+
+			// Only return the 1st item in the array.
+			$metadata[ $key ] = $default_style;
+		}
+	}
+	return $metadata;
+}
+add_filter( 'block_type_metadata', '_wp_multiple_block_styles' );
diff --git a/src/wp-includes/blocks/archives.php b/src/wp-includes/blocks/archives.php
index 7b51169e21..2f4ad1045a 100644
--- a/src/wp-includes/blocks/archives.php
+++ b/src/wp-includes/blocks/archives.php
@@ -40,6 +40,10 @@ function render_block_core_archives( $attributes ) {
 
 		$archives = wp_get_archives( $dropdown_args );
 
+		$classnames = esc_attr( $class );
+
+		$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classnames ) );
+
 		switch ( $dropdown_args['type'] ) {
 			case 'yearly':
 				$label = __( 'Select Year' );
@@ -60,13 +64,13 @@ function render_block_core_archives( $attributes ) {
 
 		$label = esc_html( $label );
 
-		$block_content = '<label class="screen-reader-text" for="' . $dropdown_id . '">' . $title . '</label>
+		$block_content = '<label for="' . $dropdown_id . '">' . $title . '</label>
 	<select id="' . $dropdown_id . '" name="archive-dropdown" onchange="document.location.href=this.options[this.selectedIndex].value;">
 	<option value="">' . $label . '</option>' . $archives . '</select>';
 
 		return sprintf(
-			'<div class="%1$s">%2$s</div>',
-			esc_attr( $class ),
+			'<div %1$s>%2$s</div>',
+			$wrapper_attributes,
 			$block_content
 		);
 	}
diff --git a/src/wp-includes/blocks/button/block.json b/src/wp-includes/blocks/button/block.json
index f2e4a52deb..99119b6d1d 100644
--- a/src/wp-includes/blocks/button/block.json
+++ b/src/wp-includes/blocks/button/block.json
@@ -63,9 +63,19 @@
 		},
 		"typography": {
 			"fontSize": true,
-			"__experimentalFontFamily": true
+			"__experimentalFontFamily": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true
+			}
 		},
 		"reusable": false,
+		"spacing": {
+			"__experimentalSkipSerialization": true,
+			"padding": [ "horizontal", "vertical" ],
+			"__experimentalDefaultControls": {
+				"padding": true
+			}
+		},
 		"__experimentalBorder": {
 			"radius": true,
 			"__experimentalSkipSerialization": true
diff --git a/src/wp-includes/blocks/buttons/block.json b/src/wp-includes/blocks/buttons/block.json
index 74eed0a4a0..818d4d20e9 100644
--- a/src/wp-includes/blocks/buttons/block.json
+++ b/src/wp-includes/blocks/buttons/block.json
@@ -6,18 +6,24 @@
 	"description": "Prompt visitors to take action with a group of button-style links.",
 	"keywords": [ "link" ],
 	"textdomain": "default",
-	"attributes": {
-		"contentJustification": {
-			"type": "string"
-		},
-		"orientation": {
-			"type": "string",
-			"default": "horizontal"
-		}
-	},
 	"supports": {
 		"anchor": true,
-		"align": [ "wide", "full" ]
+		"align": [ "wide", "full" ],
+		"__experimentalExposeControlsToChildren": true,
+		"spacing": {
+			"blockGap": true,
+			"margin": ["top", "bottom" ],
+			"__experimentalDefaultControls": {
+				"blockGap": true
+			}
+		},
+		"__experimentalLayout": {
+			"allowSwitching": false,
+			"allowInheriting": false,
+			"default": {
+				"type": "flex"
+			}
+		}
 	},
 	"editorStyle": "wp-block-buttons-editor",
 	"style": "wp-block-buttons"
diff --git a/src/wp-includes/blocks/calendar.php b/src/wp-includes/blocks/calendar.php
index 6e0c52886a..3e0e48c65b 100644
--- a/src/wp-includes/blocks/calendar.php
+++ b/src/wp-includes/blocks/calendar.php
@@ -15,6 +15,15 @@
 function render_block_core_calendar( $attributes ) {
 	global $monthnum, $year;
 
+	// Calendar shouldn't be rendered
+	// when there are no published posts on the site.
+	if ( ! block_core_calendar_has_published_posts() ) {
+		if ( is_user_logged_in() ) {
+			return '<div>' . __( 'The calendar block is hidden because there are no published posts.' ) . '</div>';
+		}
+		return '';
+	}
+
 	$previous_monthnum = $monthnum;
 	$previous_year     = $year;
 
@@ -59,3 +68,90 @@ function register_block_core_calendar() {
 }
 
 add_action( 'init', 'register_block_core_calendar' );
+
+/**
+ * Returns whether or not there are any published posts.
+ *
+ * Used to hide the calendar block when there are no published posts.
+ * This compensates for a known Core bug: https://core.trac.wordpress.org/ticket/12016
+ *
+ * @return bool Has any published posts or not.
+ */
+function block_core_calendar_has_published_posts() {
+	// Multisite already has an option that stores the count of the published posts.
+	// Let's use that for multisites.
+	if ( is_multisite() ) {
+		return 0 < (int) get_option( 'post_count' );
+	}
+
+	// On single sites we try our own cached option first.
+	$has_published_posts = get_option( 'wp_calendar_block_has_published_posts', null );
+	if ( null !== $has_published_posts ) {
+		return (bool) $has_published_posts;
+	}
+
+	// No cache hit, let's update the cache and return the cached value.
+	return block_core_calendar_update_has_published_posts();
+}
+
+/**
+ * Queries the database for any published post and saves
+ * a flag whether any published post exists or not.
+ *
+ * @return bool Has any published posts or not.
+ */
+function block_core_calendar_update_has_published_posts() {
+	global $wpdb;
+	$has_published_posts = (bool) $wpdb->get_var( "SELECT 1 as test FROM {$wpdb->posts} WHERE post_type = 'post' AND post_status = 'publish' LIMIT 1" );
+	update_option( 'wp_calendar_block_has_published_posts', $has_published_posts );
+	return $has_published_posts;
+}
+
+/**
+ * Handler for updating the has published posts flag when a post is deleted.
+ *
+ * @param int $post_id Deleted post ID.
+ */
+function block_core_calendar_update_has_published_post_on_delete( $post_id ) {
+	if ( is_multisite() ) {
+		return;
+	}
+
+	$post = get_post( $post_id );
+
+	if ( ! $post || 'publish' !== $post->post_status || 'post' !== $post->post_type ) {
+		return;
+	}
+
+	block_core_calendar_update_has_published_posts();
+}
+
+/**
+ * Handler for updating the has published posts flag when a post status changes.
+ *
+ * @param string  $new_status The status the post is changing to.
+ * @param string  $old_status The status the post is changing from.
+ * @param WP_Post $post       Post object.
+ */
+function block_core_calendar_update_has_published_post_on_transition_post_status( $new_status, $old_status, $post ) {
+	if ( is_multisite() ) {
+		return;
+	}
+
+	if ( $new_status === $old_status ) {
+		return;
+	}
+
+	if ( 'post' !== get_post_type( $post ) ) {
+		return;
+	}
+
+	if ( 'publish' !== $new_status && 'publish' !== $old_status ) {
+		return;
+	}
+
+	block_core_calendar_update_has_published_posts();
+}
+
+add_action( 'delete_post', 'block_core_calendar_update_has_published_post_on_delete' );
+add_action( 'transition_post_status', 'block_core_calendar_update_has_published_post_on_transition_post_status', 10, 3 );
diff --git a/src/wp-includes/blocks/categories.php b/src/wp-includes/blocks/categories.php
index 3cffff9551..5492712d51 100644
--- a/src/wp-includes/blocks/categories.php
+++ b/src/wp-includes/blocks/categories.php
@@ -23,6 +23,9 @@ function render_block_core_categories( $attributes ) {
 		'show_count'   => ! empty( $attributes['showPostCounts'] ),
 		'title_li'     => '',
 	);
+	if ( ! empty( $attributes['showOnlyTopLevel'] ) && $attributes['showOnlyTopLevel'] ) {
+		$args['parent'] = 0;
+	}
 
 	if ( ! empty( $attributes['displayAsDropdown'] ) ) {
 		$id                       = 'wp-block-categories-' . $block_id;
diff --git a/src/wp-includes/blocks/categories/block.json b/src/wp-includes/blocks/categories/block.json
index b238df4203..448b27c9cc 100644
--- a/src/wp-includes/blocks/categories/block.json
+++ b/src/wp-includes/blocks/categories/block.json
@@ -17,6 +17,10 @@
 		"showPostCounts": {
 			"type": "boolean",
 			"default": false
+		},
+		"showOnlyTopLevel": {
+			"type": "boolean",
+			"default": false
 		}
 	},
 	"supports": {
diff --git a/src/wp-includes/blocks/code/block.json b/src/wp-includes/blocks/code/block.json
index 8ea75ed6da..992058d12f 100644
--- a/src/wp-includes/blocks/code/block.json
+++ b/src/wp-includes/blocks/code/block.json
@@ -14,8 +14,32 @@
 	},
 	"supports": {
 		"anchor": true,
+		"__experimentalSelector": ".wp-block-code > code",
 		"typography": {
-			"fontSize": true
+			"fontSize": true,
+			"lineHeight": true,
+			"__experimentalFontStyle": true,
+			"__experimentalFontWeight": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalTextTransform": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true
+			}
+		},
+		"spacing": {
+			"margin": [ "top", "bottom" ],
+			"padding": true
+		},
+		"__experimentalBorder": {
+			"radius": true,
+			"color": true,
+			"width": true,
+			"style": true
+		},
+		"color": {
+			"text": true,
+			"background": true,
+			"gradients": true
 		}
 	},
 	"style": "wp-block-code"
diff --git a/src/wp-includes/blocks/column/block.json b/src/wp-includes/blocks/column/block.json
index 00e443b0ec..44ef3438b2 100644
--- a/src/wp-includes/blocks/column/block.json
+++ b/src/wp-includes/blocks/column/block.json
@@ -13,7 +13,11 @@
 		"width": {
 			"type": "string"
 		},
+		"allowedBlocks": {
+			"type": "array"
+		},
 		"templateLock": {
+			"type": [ "string", "boolean" ],
 			"enum": [ "all", "insert", false ]
 		}
 	},
@@ -26,7 +30,10 @@
 			"link": true
 		},
 		"spacing": {
-			"padding": true
+			"padding": true,
+			"__experimentalDefaultControls": {
+				"padding": true
+			}
 		}
 	}
 }
diff --git a/src/wp-includes/blocks/columns/block.json b/src/wp-includes/blocks/columns/block.json
index f3bc49d3d2..38dc5db74e 100644
--- a/src/wp-includes/blocks/columns/block.json
+++ b/src/wp-includes/blocks/columns/block.json
@@ -3,11 +3,15 @@
 	"name": "core/columns",
 	"title": "Columns",
 	"category": "design",
-	"description": "Add a block that displays content in multiple columns, then add whatever content blocks you’d like.",
+	"description": "Display content in multiple columns, with blocks added to each column.",
 	"textdomain": "default",
 	"attributes": {
 		"verticalAlignment": {
 			"type": "string"
+		},
+		"isStackedOnMobile": {
+			"type": "boolean",
+			"default": true
 		}
 	},
 	"supports": {
@@ -17,6 +21,13 @@
 		"color": {
 			"gradients": true,
 			"link": true
+		},
+		"spacing": {
+			"margin": [ "top", "bottom" ],
+			"padding": true,
+			"__experimentalDefaultControls": {
+				"padding": true
+			}
 		}
 	},
 	"editorStyle": "wp-block-columns-editor",
diff --git a/src/wp-includes/blocks/cover/block.json b/src/wp-includes/blocks/cover/block.json
index 3b3ad5d804..aa00d40341 100644
--- a/src/wp-includes/blocks/cover/block.json
+++ b/src/wp-includes/blocks/cover/block.json
@@ -12,6 +12,13 @@
 		"id": {
 			"type": "number"
 		},
+		"alt": {
+			"type": "string",
+			"source": "attribute",
+			"selector": "img",
+			"attribute": "alt",
+			"default": ""
+		},
 		"hasParallax": {
 			"type": "boolean",
 			"default": false
@@ -22,7 +29,7 @@
 		},
 		"dimRatio": {
 			"type": "number",
-			"default": 50
+			"default": 100
 		},
 		"overlayColor": {
 			"type": "string"
@@ -51,6 +58,17 @@
 		},
 		"contentPosition": {
 			"type": "string"
+		},
+		"isDark": {
+			"type": "boolean",
+			"default": true
+		},
+		"allowedBlocks": {
+			"type": "array"
+		},
+		"templateLock": {
+			"type": [ "string", "boolean" ],
+			"enum": [ "all", "insert", false ]
 		}
 	},
 	"supports": {
@@ -58,7 +76,10 @@
 		"align": true,
 		"html": false,
 		"spacing": {
-			"padding": true
+			"padding": true,
+			"__experimentalDefaultControls": {
+				"padding": true
+			}
 		},
 		"color": {
 			"__experimentalDuotone": "> .wp-block-cover__image-background, > .wp-block-cover__video-background",
diff --git a/src/wp-includes/blocks/embed/block.json b/src/wp-includes/blocks/embed/block.json
index cc0cb64c03..ae46421963 100644
--- a/src/wp-includes/blocks/embed/block.json
+++ b/src/wp-includes/blocks/embed/block.json
@@ -3,7 +3,7 @@
 	"name": "core/embed",
 	"title": "Embed",
 	"category": "embed",
-	"description": "Add a block that displays content pulled from other sites, like Twitter, Instagram or YouTube.",
+	"description": "Add a block that displays content pulled from other sites, like Twitter or YouTube.",
 	"textdomain": "default",
 	"attributes": {
 		"url": {
diff --git a/src/wp-includes/blocks/file/block.json b/src/wp-includes/blocks/file/block.json
index b7cfe76507..2d01180d82 100644
--- a/src/wp-includes/blocks/file/block.json
+++ b/src/wp-includes/blocks/file/block.json
@@ -13,6 +13,12 @@
 		"href": {
 			"type": "string"
 		},
+		"fileId": {
+			"type": "string",
+			"source": "attribute",
+			"selector": "a:not([download])",
+			"attribute": "id"
+		},
 		"fileName": {
 			"type": "string",
 			"source": "html",
diff --git a/src/wp-includes/blocks/gallery.php b/src/wp-includes/blocks/gallery.php
new file mode 100644
index 0000000000..ac30d58e22
--- /dev/null
+++ b/src/wp-includes/blocks/gallery.php
@@ -0,0 +1,51 @@
+<?php
+/**
+ * Server-side rendering of the `core/gallery` block.
+ *
+ * @package WordPress
+ */
+
+/**
+ * Handles backwards compatibility for Gallery Blocks,
+ * whose images feature a `data-id` attribute.
+ *
+ * Now that the Gallery Block contains inner Image Blocks,
+ * we add a custom `data-id` attribute before rendering the gallery
+ * so that the Image Block can pick it up in its render_callback.
+ *
+ * @param array $parsed_block The block being rendered.
+ * @return array The migrated block object.
+ */
+function block_core_gallery_data_id_backcompatibility( $parsed_block ) {
+	if ( 'core/gallery' === $parsed_block['blockName'] ) {
+		foreach ( $parsed_block['innerBlocks'] as $key => $inner_block ) {
+			if ( 'core/image' === $inner_block['blockName'] ) {
+				if ( ! isset( $parsed_block['innerBlocks'][ $key ]['attrs']['data-id'] ) && isset( $inner_block['attrs']['id'] ) ) {
+					$parsed_block['innerBlocks'][ $key ]['attrs']['data-id'] = esc_attr( $inner_block['attrs']['id'] );
+				}
+			}
+		}
+	}
+
+	return $parsed_block;
+}
+
+add_filter( 'render_block_data', 'block_core_gallery_data_id_backcompatibility' );
+
+/**
+ * Registers the `core/gallery` block on server.
+ * This render callback needs to be here
+ * so that the gallery styles are loaded in block-based themes.
+ */
+function register_block_core_gallery() {
+	register_block_type_from_metadata(
+		__DIR__ . '/gallery',
+		array(
+			'render_callback' => function ( $attributes, $content ) {
+				return $content;
+			},
+		)
+	);
+}
+
+add_action( 'init', 'register_block_core_gallery' );
diff --git a/src/wp-includes/blocks/gallery/block.json b/src/wp-includes/blocks/gallery/block.json
index a87edb1eda..f5b3d317ec 100644
--- a/src/wp-includes/blocks/gallery/block.json
+++ b/src/wp-includes/blocks/gallery/block.json
@@ -58,6 +58,13 @@
 			},
 			"default": []
 		},
+		"shortCodeTransforms": {
+			"type": "array",
+			"default": [],
+			"items": {
+				"type": "object"
+			}
+		},
 		"columns": {
 			"type": "number",
 			"minimum": 1,
@@ -72,14 +79,30 @@
 			"type": "boolean",
 			"default": true
 		},
+		"fixedHeight": {
+			"type": "boolean",
+			"default": true
+		},
+		"linkTarget": {
+			"type": "string"
+		},
 		"linkTo": {
 			"type": "string"
 		},
 		"sizeSlug": {
 			"type": "string",
 			"default": "large"
+		},
+		"allowResize": {
+			"type": "boolean",
+			"default": false
 		}
 	},
+	"providesContext": {
+		"allowResize": "allowResize",
+		"imageCrop": "imageCrop",
+		"fixedHeight": "fixedHeight"
+	},
 	"supports": {
 		"anchor": true,
 		"align": true
diff --git a/src/wp-includes/blocks/group/block.json b/src/wp-includes/blocks/group/block.json
index b12fb40043..7921b74ffd 100644
--- a/src/wp-includes/blocks/group/block.json
+++ b/src/wp-includes/blocks/group/block.json
@@ -12,6 +12,7 @@
 			"default": "div"
 		},
 		"templateLock": {
+			"type": [ "string", "boolean" ],
 			"enum": [ "all", "insert", false ]
 		}
 	},
@@ -24,7 +25,12 @@
 			"link": true
 		},
 		"spacing": {
-			"padding": true
+			"padding": true,
+			"blockGap": true,
+			"__experimentalDefaultControls": {
+				"padding": true,
+				"blockGap": true
+			}
 		},
 		"__experimentalBorder": {
 			"color": true,
diff --git a/src/wp-includes/blocks/heading/block.json b/src/wp-includes/blocks/heading/block.json
index 69ec1ba374..b09baa78d4 100644
--- a/src/wp-includes/blocks/heading/block.json
+++ b/src/wp-includes/blocks/heading/block.json
@@ -32,13 +32,25 @@
 		"color": {
 			"link": true
 		},
+		"spacing": {
+			"margin": true
+		},
 		"typography": {
 			"fontSize": true,
 			"lineHeight": true,
-			"__experimentalFontWeight": true
+			"__experimentalFontStyle": true,
+			"__experimentalFontWeight": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalTextTransform": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true,
+				"fontAppearance": true,
+				"textTransform": true
+			}
 		},
 		"__experimentalSelector": "h1,h2,h3,h4,h5,h6",
-		"__unstablePasteTextInline": true
+		"__unstablePasteTextInline": true,
+		"__experimentalSlashInserter": true
 	},
 	"editorStyle": "wp-block-heading-editor",
 	"style": "wp-block-heading"
diff --git a/src/wp-includes/blocks/image.php b/src/wp-includes/blocks/image.php
new file mode 100644
index 0000000000..f8f7066a97
--- /dev/null
+++ b/src/wp-includes/blocks/image.php
@@ -0,0 +1,42 @@
+<?php
+/**
+ * Server-side rendering of the `core/image` block.
+ *
+ * @package WordPress
+ */
+
+/**
+ * Renders the `core/image` block on the server,
+ * adding a data-id attribute to the element if core/gallery has added on pre-render.
+ *
+ * @param  array $attributes The block attributes.
+ * @param  array $content    The block content.
+ * @return string Returns the block content with the data-id attribute added.
+ */
+function render_block_core_image( $attributes, $content ) {
+	if ( isset( $attributes['data-id'] ) ) {
+		// Add the data-id="$id" attribute to the img element
+		// to provide backwards compatibility for the Gallery Block,
+		// which now wraps Image Blocks within innerBlocks.
+		// The data-id attribute is added in a core/gallery `render_block_data` hook.
+		$data_id_attribute = 'data-id="' . esc_attr( $attributes['data-id'] ) . '"';
+		if ( ! strpos( $content, $data_id_attribute ) ) {
+			$content = str_replace( '<img', '<img ' . $data_id_attribute . ' ', $content );
+		}
+	}
+	return $content;
+}
+
+
+/**
+ * Registers the `core/image` block on server.
+ */
+function register_block_core_image() {
+	register_block_type_from_metadata(
+		__DIR__ . '/image',
+		array(
+			'render_callback' => 'render_block_core_image',
+		)
+	);
+}
+add_action( 'init', 'register_block_core_image' );
diff --git a/src/wp-includes/blocks/image/block.json b/src/wp-includes/blocks/image/block.json
index 9cb1901028..b603b41a8c 100644
--- a/src/wp-includes/blocks/image/block.json
+++ b/src/wp-includes/blocks/image/block.json
@@ -3,6 +3,7 @@
 	"name": "core/image",
 	"title": "Image",
 	"category": "media",
+	"usesContext": [ "allowResize", "imageCrop", "fixedHeight" ],
 	"description": "Insert an image to make a visual statement.",
 	"keywords": [ "img", "photo", "picture" ],
 	"textdomain": "default",
diff --git a/src/wp-includes/blocks/index.php b/src/wp-includes/blocks/index.php
index b702cdf03c..f7382b1e9a 100644
--- a/src/wp-includes/blocks/index.php
+++ b/src/wp-includes/blocks/index.php
@@ -11,32 +11,43 @@ require ABSPATH . WPINC . '/blocks/block.php';
 require ABSPATH . WPINC . '/blocks/calendar.php';
 require ABSPATH . WPINC . '/blocks/categories.php';
 require ABSPATH . WPINC . '/blocks/file.php';
+require ABSPATH . WPINC . '/blocks/gallery.php';
+require ABSPATH . WPINC . '/blocks/image.php';
 require ABSPATH . WPINC . '/blocks/latest-comments.php';
 require ABSPATH . WPINC . '/blocks/latest-posts.php';
 require ABSPATH . WPINC . '/blocks/legacy-widget.php';
 require ABSPATH . WPINC . '/blocks/loginout.php';
+require ABSPATH . WPINC . '/blocks/navigation-link.php';
+require ABSPATH . WPINC . '/blocks/navigation-submenu.php';
+require ABSPATH . WPINC . '/blocks/navigation.php';
 require ABSPATH . WPINC . '/blocks/page-list.php';
+require ABSPATH . WPINC . '/blocks/pattern.php';
+require ABSPATH . WPINC . '/blocks/post-author.php';
+require ABSPATH . WPINC . '/blocks/post-comments.php';
 require ABSPATH . WPINC . '/blocks/post-content.php';
 require ABSPATH . WPINC . '/blocks/post-date.php';
 require ABSPATH . WPINC . '/blocks/post-excerpt.php';
 require ABSPATH . WPINC . '/blocks/post-featured-image.php';
+require ABSPATH . WPINC . '/blocks/post-navigation-link.php';
+require ABSPATH . WPINC . '/blocks/post-template.php';
 require ABSPATH . WPINC . '/blocks/post-terms.php';
 require ABSPATH . WPINC . '/blocks/post-title.php';
-require ABSPATH . WPINC . '/blocks/post-template.php';
-require ABSPATH . WPINC . '/blocks/query.php';
-require ABSPATH . WPINC . '/blocks/query-pagination.php';
 require ABSPATH . WPINC . '/blocks/query-pagination-next.php';
 require ABSPATH . WPINC . '/blocks/query-pagination-numbers.php';
 require ABSPATH . WPINC . '/blocks/query-pagination-previous.php';
+require ABSPATH . WPINC . '/blocks/query-pagination.php';
 require ABSPATH . WPINC . '/blocks/query-title.php';
+require ABSPATH . WPINC . '/blocks/query.php';
 require ABSPATH . WPINC . '/blocks/rss.php';
 require ABSPATH . WPINC . '/blocks/search.php';
 require ABSPATH . WPINC . '/blocks/shortcode.php';
-require ABSPATH . WPINC . '/blocks/site-tagline.php';
 require ABSPATH . WPINC . '/blocks/site-logo.php';
+require ABSPATH . WPINC . '/blocks/site-tagline.php';
 require ABSPATH . WPINC . '/blocks/site-title.php';
 require ABSPATH . WPINC . '/blocks/social-link.php';
 require ABSPATH . WPINC . '/blocks/tag-cloud.php';
+require ABSPATH . WPINC . '/blocks/template-part.php';
+require ABSPATH . WPINC . '/blocks/term-description.php';
 
 /**
  * Registers core block types using metadata files.
@@ -55,11 +66,9 @@ function register_core_block_types_from_metadata() {
 		'cover',
 		'embed',
 		'freeform',
-		'gallery',
 		'group',
 		'heading',
 		'html',
-		'image',
 		'list',
 		'media-text',
 		'missing',
diff --git a/src/wp-includes/blocks/latest-comments.php b/src/wp-includes/blocks/latest-comments.php
index 6343a46d0b..3e649bbf5f 100644
--- a/src/wp-includes/blocks/latest-comments.php
+++ b/src/wp-includes/blocks/latest-comments.php
@@ -42,14 +42,15 @@ function wp_latest_comments_draft_or_post_title( $post = 0 ) {
  */
 function render_block_core_latest_comments( $attributes = array() ) {
 	$comments = get_comments(
-		// This filter is documented in wp-includes/widgets/class-wp-widget-recent-comments.php.
+		/** This filter is documented in wp-includes/widgets/class-wp-widget-recent-comments.php */
 		apply_filters(
 			'widget_comments_args',
 			array(
 				'number'      => $attributes['commentsToShow'],
 				'status'      => 'approve',
 				'post_status' => 'publish',
-			)
+			),
+			array()
 		)
 	);
 
diff --git a/src/wp-includes/blocks/legacy-widget.php b/src/wp-includes/blocks/legacy-widget.php
index e827f8f7c5..0d4e733d4c 100644
--- a/src/wp-includes/blocks/legacy-widget.php
+++ b/src/wp-includes/blocks/legacy-widget.php
@@ -108,6 +108,33 @@ function handle_legacy_widget_preview_iframe() {
 				padding: 0 !important;
 				margin: 0 !important;
 			}
+
+			/* Hide root level text nodes */
+			body {
+				font-size: 0 !important;
+			}
+
+			/* Hide non-widget elements */
+			body *:not(#page):not(#content):not(.widget):not(.widget *) {
+				display: none !important;
+				font-size: 0 !important;
+				height: 0 !important;
+				left: -9999px !important;
+				max-height: 0 !important;
+				max-width: 0 !important;
+				opacity: 0 !important;
+				pointer-events: none !important;
+				position: absolute !important;
+				top: -9999px !important;
+				transform: translate(-9999px, -9999px) !important;
+				visibility: hidden !important;
+				z-index: -999 !important;
+			}
+
+			/* Restore widget font-size */
+			.widget {
+				font-size: var(--global--font-size-base);
+			}
 		</style>
 	</head>
 	<body <?php body_class(); ?>>
diff --git a/src/wp-includes/blocks/list/block.json b/src/wp-includes/blocks/list/block.json
index 278dbad0d0..c82710f08d 100644
--- a/src/wp-includes/blocks/list/block.json
+++ b/src/wp-includes/blocks/list/block.json
@@ -39,13 +39,23 @@
 		"className": false,
 		"typography": {
 			"fontSize": true,
-			"__experimentalFontFamily": true
+			"__experimentalFontFamily": true,
+			"lineHeight": true,
+			"__experimentalFontStyle": true,
+			"__experimentalFontWeight": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalTextTransform": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true
+			}
 		},
 		"color": {
-			"gradients": true
+			"gradients": true,
+			"link": true
 		},
 		"__unstablePasteTextInline": true,
-		"__experimentalSelector": "ol,ul"
+		"__experimentalSelector": "ol,ul",
+		"__experimentalSlashInserter": true
 	},
 	"editorStyle": "wp-block-list-editor",
 	"style": "wp-block-list"
diff --git a/src/wp-includes/blocks/loginout.php b/src/wp-includes/blocks/loginout.php
index c9c23cf90b..ac10ced20f 100644
--- a/src/wp-includes/blocks/loginout.php
+++ b/src/wp-includes/blocks/loginout.php
@@ -38,7 +38,7 @@ function render_block_core_loginout( $attributes ) {
 }
 
 /**
- * Registers the `core/latest-posts` block on server.
+ * Registers the `core/loginout` block on server.
  */
 function register_block_core_loginout() {
 	register_block_type_from_metadata(
diff --git a/src/wp-includes/blocks/navigation-link.php b/src/wp-includes/blocks/navigation-link.php
new file mode 100644
index 0000000000..aa6a5d57e1
--- /dev/null
+++ b/src/wp-includes/blocks/navigation-link.php
@@ -0,0 +1,350 @@
+<?php
+/**
+ * Server-side rendering of the `core/navigation-link` block.
+ *
+ * @package WordPress
+ */
+
+/**
+ * Build an array with CSS classes and inline styles defining the colors
+ * which will be applied to the navigation markup in the front-end.
+ *
+ * @param  array $context    Navigation block context.
+ * @param  array $attributes Block attributes.
+ * @return array Colors CSS classes and inline styles.
+ */
+function block_core_navigation_link_build_css_colors( $context, $attributes ) {
+	$colors = array(
+		'css_classes'   => array(),
+		'inline_styles' => '',
+	);
+
+	$is_sub_menu = isset( $attributes['isTopLevelLink'] ) ? ( ! $attributes['isTopLevelLink'] ) : false;
+
+	// Text color.
+	$named_text_color  = null;
+	$custom_text_color = null;
+
+	if ( $is_sub_menu && array_key_exists( 'customOverlayTextColor', $context ) ) {
+		$custom_text_color = $context['customOverlayTextColor'];
+	} elseif ( $is_sub_menu && array_key_exists( 'overlayTextColor', $context ) ) {
+		$named_text_color = $context['overlayTextColor'];
+	} elseif ( array_key_exists( 'customTextColor', $context ) ) {
+		$custom_text_color = $context['customTextColor'];
+	} elseif ( array_key_exists( 'textColor', $context ) ) {
+		$named_text_color = $context['textColor'];
+	} elseif ( isset( $context['style']['color']['text'] ) ) {
+		$custom_text_color = $context['style']['color']['text'];
+	}
+
+	// If has text color.
+	if ( ! is_null( $named_text_color ) ) {
+		// Add the color class.
+		array_push( $colors['css_classes'], 'has-text-color', sprintf( 'has-%s-color', $named_text_color ) );
+	} elseif ( ! is_null( $custom_text_color ) ) {
+		// Add the custom color inline style.
+		$colors['css_classes'][]  = 'has-text-color';
+		$colors['inline_styles'] .= sprintf( 'color: %s;', $custom_text_color );
+	}
+
+	// Background color.
+	$named_background_color  = null;
+	$custom_background_color = null;
+
+	if ( $is_sub_menu && array_key_exists( 'customOverlayBackgroundColor', $context ) ) {
+		$custom_background_color = $context['customOverlayBackgroundColor'];
+	} elseif ( $is_sub_menu && array_key_exists( 'overlayBackgroundColor', $context ) ) {
+		$named_background_color = $context['overlayBackgroundColor'];
+	} elseif ( array_key_exists( 'customBackgroundColor', $context ) ) {
+		$custom_background_color = $context['customBackgroundColor'];
+	} elseif ( array_key_exists( 'backgroundColor', $context ) ) {
+		$named_background_color = $context['backgroundColor'];
+	} elseif ( isset( $context['style']['color']['background'] ) ) {
+		$custom_background_color = $context['style']['color']['background'];
+	}
+
+	// If has background color.
+	if ( ! is_null( $named_background_color ) ) {
+		// Add the background-color class.
+		array_push( $colors['css_classes'], 'has-background', sprintf( 'has-%s-background-color', $named_background_color ) );
+	} elseif ( ! is_null( $custom_background_color ) ) {
+		// Add the custom background-color inline style.
+		$colors['css_classes'][]  = 'has-background';
+		$colors['inline_styles'] .= sprintf( 'background-color: %s;', $custom_background_color );
+	}
+
+	return $colors;
+}
+
+/**
+ * Build an array with CSS classes and inline styles defining the font sizes
+ * which will be applied to the navigation markup in the front-end.
+ *
+ * @param  array $context Navigation block context.
+ * @return array Font size CSS classes and inline styles.
+ */
+function block_core_navigation_link_build_css_font_sizes( $context ) {
+	// CSS classes.
+	$font_sizes = array(
+		'css_classes'   => array(),
+		'inline_styles' => '',
+	);
+
+	$has_named_font_size  = array_key_exists( 'fontSize', $context );
+	$has_custom_font_size = isset( $context['style']['typography']['fontSize'] );
+
+	if ( $has_named_font_size ) {
+		// Add the font size class.
+		$font_sizes['css_classes'][] = sprintf( 'has-%s-font-size', $context['fontSize'] );
+	} elseif ( $has_custom_font_size ) {
+		// Add the custom font size inline style.
+		$font_sizes['inline_styles'] = sprintf( 'font-size: %s;', $context['style']['typography']['fontSize'] );
+	}
+
+	return $font_sizes;
+}
+
+/**
+ * Returns the top-level submenu SVG chevron icon.
+ *
+ * @return string
+ */
+function block_core_navigation_link_render_submenu_icon() {
+	return '<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" role="img" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg>';
+}
+
+/**
+ * Renders the `core/navigation-link` block.
+ *
+ * @param array $attributes The block attributes.
+ * @param array $content The saved content.
+ * @param array $block The parsed block.
+ *
+ * @return string Returns the post content with the legacy widget added.
+ */
+function render_block_core_navigation_link( $attributes, $content, $block ) {
+	$navigation_link_has_id = isset( $attributes['id'] ) && is_numeric( $attributes['id'] );
+	$is_post_type           = isset( $attributes['kind'] ) && 'post-type' === $attributes['kind'];
+	$is_post_type           = $is_post_type || isset( $attributes['type'] ) && ( 'post' === $attributes['type'] || 'page' === $attributes['type'] );
+
+	// Don't render the block's subtree if it is a draft or if the ID does not exist.
+	if ( $is_post_type && $navigation_link_has_id ) {
+		$post = get_post( $attributes['id'] );
+		if ( ! $post || 'publish' !== $post->post_status ) {
+			return '';
+		}
+	}
+
+	// Don't render the block's subtree if it has no label.
+	if ( empty( $attributes['label'] ) ) {
+		return '';
+	}
+
+	$colors          = block_core_navigation_link_build_css_colors( $block->context, $attributes );
+	$font_sizes      = block_core_navigation_link_build_css_font_sizes( $block->context );
+	$classes         = array_merge(
+		$colors['css_classes'],
+		$font_sizes['css_classes']
+	);
+	$style_attribute = ( $colors['inline_styles'] . $font_sizes['inline_styles'] );
+
+	$css_classes = trim( implode( ' ', $classes ) );
+	$has_submenu = count( $block->inner_blocks ) > 0;
+	$is_active   = ! empty( $attributes['id'] ) && ( get_the_ID() === $attributes['id'] );
+
+	$wrapper_attributes = get_block_wrapper_attributes(
+		array(
+			'class' => $css_classes . ' wp-block-navigation-item' . ( $has_submenu ? ' has-child' : '' ) .
+				( $is_active ? ' current-menu-item' : '' ),
+			'style' => $style_attribute,
+		)
+	);
+	$html               = '<li ' . $wrapper_attributes . '>' .
+		'<a class="wp-block-navigation-item__content" ';
+
+	// Start appending HTML attributes to anchor tag.
+	if ( isset( $attributes['url'] ) ) {
+		$html .= ' href="' . esc_url( $attributes['url'] ) . '"';
+	}
+
+	if ( $is_active ) {
+		$html .= ' aria-current="page"';
+	}
+
+	if ( isset( $attributes['opensInNewTab'] ) && true === $attributes['opensInNewTab'] ) {
+		$html .= ' target="_blank"  ';
+	}
+
+	if ( isset( $attributes['rel'] ) ) {
+		$html .= ' rel="' . esc_attr( $attributes['rel'] ) . '"';
+	} elseif ( isset( $attributes['nofollow'] ) && $attributes['nofollow'] ) {
+		$html .= ' rel="nofollow"';
+	}
+
+	if ( isset( $attributes['title'] ) ) {
+		$html .= ' title="' . esc_attr( $attributes['title'] ) . '"';
+	}
+
+	// End appending HTML attributes to anchor tag.
+
+	// Start anchor tag content.
+	$html .= '>' .
+		// Wrap title with span to isolate it from submenu icon.
+		'<span class="wp-block-navigation-item__label">';
+
+	if ( isset( $attributes['label'] ) ) {
+		$html .= wp_kses(
+			$attributes['label'],
+			array(
+				'code'   => array(),
+				'em'     => array(),
+				'img'    => array(
+					'scale' => array(),
+					'class' => array(),
+					'style' => array(),
+					'src'   => array(),
+					'alt'   => array(),
+				),
+				's'      => array(),
+				'span'   => array(
+					'style' => array(),
+				),
+				'strong' => array(),
+			)
+		);
+	}
+
+	$html .= '</span>';
+
+	if ( isset( $block->context['showSubmenuIcon'] ) && $block->context['showSubmenuIcon'] && $has_submenu ) {
+		// The submenu icon can be hidden by a CSS rule on the Navigation Block.
+		$html .= '<span class="wp-block-navigation__submenu-icon">' . block_core_navigation_link_render_submenu_icon() . '</span>';
+	}
+
+	$html .= '</a>';
+	// End anchor tag content.
+
+	if ( $has_submenu ) {
+		$inner_blocks_html = '';
+		foreach ( $block->inner_blocks as $inner_block ) {
+			$inner_blocks_html .= $inner_block->render();
+		}
+
+		$html .= sprintf(
+			'<ul class="wp-block-navigation__submenu-container">%s</ul>',
+			$inner_blocks_html
+		);
+	}
+
+	$html .= '</li>';
+
+	return $html;
+}
+
+/**
+ * Returns a navigation link variation
+ *
+ * @param WP_Taxonomy|WP_Post_Type $entity post type or taxonomy entity.
+ * @param string                   $kind string of value 'taxonomy' or 'post-type'.
+ *
+ * @return array
+ */
+function build_variation_for_navigation_link( $entity, $kind ) {
+	$title       = '';
+	$description = '';
+
+	if ( property_exists( $entity->labels, 'item_link' ) ) {
+		$title = $entity->labels->item_link;
+	}
+	if ( property_exists( $entity->labels, 'item_link_description' ) ) {
+		$description = $entity->labels->item_link_description;
+	}
+
+	$variation = array(
+		'name'        => $entity->name,
+		'title'       => $title,
+		'description' => $description,
+		'attributes'  => array(
+			'type' => $entity->name,
+			'kind' => $kind,
+		),
+	);
+
+	// Tweak some value for the variations.
+	$variation_overrides = array(
+		'post_tag'    => array(
+			'name'       => 'tag',
+			'attributes' => array(
+				'type' => 'tag',
+				'kind' => $kind,
+			),
+		),
+		'post_format' => array(
+			// The item_link and item_link_description for post formats is the
+			// same as for tags, so need to be overridden.
+			'title'       => __( 'Post Format Link' ),
+			'description' => __( 'A link to a post format' ),
+			'attributes'  => array(
+				'type' => 'post_format',
+				'kind' => $kind,
+			),
+		),
+	);
+
+	if ( array_key_exists( $entity->name, $variation_overrides ) ) {
+		$variation = array_merge(
+			$variation,
+			$variation_overrides[ $entity->name ]
+		);
+	}
+
+	return $variation;
+}
+
+/**
+ * Register the navigation link block.
+ *
+ * @uses render_block_core_navigation()
+ * @throws WP_Error An WP_Error exception parsing the block definition.
+ */
+function register_block_core_navigation_link() {
+	$post_types = get_post_types( array( 'show_in_nav_menus' => true ), 'objects' );
+	$taxonomies = get_taxonomies( array( 'show_in_nav_menus' => true ), 'objects' );
+
+	// Use two separate arrays as a way to order the variations in the UI.
+	// Known variations (like Post Link and Page Link) are added to the
+	// `built_ins` array. Variations for custom post types and taxonomies are
+	// added to the `variations` array and will always appear after `built-ins.
+	$built_ins  = array();
+	$variations = array();
+
+	if ( $post_types ) {
+		foreach ( $post_types as $post_type ) {
+			$variation = build_variation_for_navigation_link( $post_type, 'post-type' );
+			if ( $post_type->_builtin ) {
+				$built_ins[] = $variation;
+			} else {
+				$variations[] = $variation;
+			}
+		}
+	}
+	if ( $taxonomies ) {
+		foreach ( $taxonomies as $taxonomy ) {
+			$variation = build_variation_for_navigation_link( $taxonomy, 'taxonomy' );
+			if ( $taxonomy->_builtin ) {
+				$built_ins[] = $variation;
+			} else {
+				$variations[] = $variation;
+			}
+		}
+	}
+
+	register_block_type_from_metadata(
+		__DIR__ . '/navigation-link',
+		array(
+			'render_callback' => 'render_block_core_navigation_link',
+			'variations'      => array_merge( $built_ins, $variations ),
+		)
+	);
+}
+add_action( 'init', 'register_block_core_navigation_link' );
diff --git a/src/wp-includes/blocks/navigation-link/block.json b/src/wp-includes/blocks/navigation-link/block.json
new file mode 100644
index 0000000000..eac8af0cde
--- /dev/null
+++ b/src/wp-includes/blocks/navigation-link/block.json
@@ -0,0 +1,65 @@
+{
+	"apiVersion": 2,
+	"name": "core/navigation-link",
+	"title": "Custom Link",
+	"category": "design",
+	"parent": [
+		"core/navigation"
+	],
+	"description": "Add a page, link, or another item to your navigation.",
+	"textdomain": "default",
+	"attributes": {
+		"label": {
+			"type": "string"
+		},
+		"type": {
+			"type": "string"
+		},
+		"description": {
+			"type": "string"
+		},
+		"rel": {
+			"type": "string"
+		},
+		"id": {
+			"type": "number"
+		},
+		"opensInNewTab": {
+			"type": "boolean",
+			"default": false
+		},
+		"url": {
+			"type": "string"
+		},
+		"title": {
+			"type": "string"
+		},
+		"kind": {
+			"type": "string"
+		},
+		"isTopLevelLink": {
+			"type": "boolean"
+		}
+	},
+	"usesContext": [
+		"textColor",
+		"customTextColor",
+		"backgroundColor",
+		"customBackgroundColor",
+		"overlayTextColor",
+		"customOverlayTextColor",
+		"overlayBackgroundColor",
+		"customOverlayBackgroundColor",
+		"fontSize",
+		"customFontSize",
+		"showSubmenuIcon",
+		"style"
+	],
+	"supports": {
+		"reusable": false,
+		"html": false,
+		"__experimentalSlashInserter": true
+	},
+	"editorStyle": "wp-block-navigation-link-editor",
+	"style": "wp-block-navigation-link"
+}
diff --git a/src/wp-includes/blocks/navigation-submenu.php b/src/wp-includes/blocks/navigation-submenu.php
new file mode 100644
index 0000000000..0d58bc0f6f
--- /dev/null
+++ b/src/wp-includes/blocks/navigation-submenu.php
@@ -0,0 +1,285 @@
+<?php
+/**
+ * Server-side rendering of the `core/navigation-submenu` block.
+ *
+ * @package WordPress
+ */
+
+/**
+ * Build an array with CSS classes and inline styles defining the colors
+ * which will be applied to the navigation markup in the front-end.
+ *
+ * @param  array $context    Navigation block context.
+ * @param  array $attributes Block attributes.
+ * @return array Colors CSS classes and inline styles.
+ */
+function block_core_navigation_submenu_build_css_colors( $context, $attributes ) {
+	$colors = array(
+		'css_classes'   => array(),
+		'inline_styles' => '',
+	);
+
+	$is_sub_menu = isset( $attributes['isTopLevelItem'] ) ? ( ! $attributes['isTopLevelItem'] ) : false;
+
+	// Text color.
+	$named_text_color  = null;
+	$custom_text_color = null;
+
+	if ( $is_sub_menu && array_key_exists( 'customOverlayTextColor', $context ) ) {
+		$custom_text_color = $context['customOverlayTextColor'];
+	} elseif ( $is_sub_menu && array_key_exists( 'overlayTextColor', $context ) ) {
+		$named_text_color = $context['overlayTextColor'];
+	} elseif ( array_key_exists( 'customTextColor', $context ) ) {
+		$custom_text_color = $context['customTextColor'];
+	} elseif ( array_key_exists( 'textColor', $context ) ) {
+		$named_text_color = $context['textColor'];
+	} elseif ( isset( $context['style']['color']['text'] ) ) {
+		$custom_text_color = $context['style']['color']['text'];
+	}
+
+	// If has text color.
+	if ( ! is_null( $named_text_color ) ) {
+		// Add the color class.
+		array_push( $colors['css_classes'], 'has-text-color', sprintf( 'has-%s-color', $named_text_color ) );
+	} elseif ( ! is_null( $custom_text_color ) ) {
+		// Add the custom color inline style.
+		$colors['css_classes'][]  = 'has-text-color';
+		$colors['inline_styles'] .= sprintf( 'color: %s;', $custom_text_color );
+	}
+
+	// Background color.
+	$named_background_color  = null;
+	$custom_background_color = null;
+
+	if ( $is_sub_menu && array_key_exists( 'customOverlayBackgroundColor', $context ) ) {
+		$custom_background_color = $context['customOverlayBackgroundColor'];
+	} elseif ( $is_sub_menu && array_key_exists( 'overlayBackgroundColor', $context ) ) {
+		$named_background_color = $context['overlayBackgroundColor'];
+	} elseif ( array_key_exists( 'customBackgroundColor', $context ) ) {
+		$custom_background_color = $context['customBackgroundColor'];
+	} elseif ( array_key_exists( 'backgroundColor', $context ) ) {
+		$named_background_color = $context['backgroundColor'];
+	} elseif ( isset( $context['style']['color']['background'] ) ) {
+		$custom_background_color = $context['style']['color']['background'];
+	}
+
+	// If has background color.
+	if ( ! is_null( $named_background_color ) ) {
+		// Add the background-color class.
+		array_push( $colors['css_classes'], 'has-background', sprintf( 'has-%s-background-color', $named_background_color ) );
+	} elseif ( ! is_null( $custom_background_color ) ) {
+		// Add the custom background-color inline style.
+		$colors['css_classes'][]  = 'has-background';
+		$colors['inline_styles'] .= sprintf( 'background-color: %s;', $custom_background_color );
+	}
+
+	return $colors;
+}
+
+/**
+ * Build an array with CSS classes and inline styles defining the font sizes
+ * which will be applied to the navigation markup in the front-end.
+ *
+ * @param  array $context Navigation block context.
+ * @return array Font size CSS classes and inline styles.
+ */
+function block_core_navigation_submenu_build_css_font_sizes( $context ) {
+	// CSS classes.
+	$font_sizes = array(
+		'css_classes'   => array(),
+		'inline_styles' => '',
+	);
+
+	$has_named_font_size  = array_key_exists( 'fontSize', $context );
+	$has_custom_font_size = isset( $context['style']['typography']['fontSize'] );
+
+	if ( $has_named_font_size ) {
+		// Add the font size class.
+		$font_sizes['css_classes'][] = sprintf( 'has-%s-font-size', $context['fontSize'] );
+	} elseif ( $has_custom_font_size ) {
+		// Add the custom font size inline style.
+		$font_sizes['inline_styles'] = sprintf( 'font-size: %s;', $context['style']['typography']['fontSize'] );
+	}
+
+	return $font_sizes;
+}
+
+/**
+ * Returns the top-level submenu SVG chevron icon.
+ *
+ * @return string
+ */
+function block_core_navigation_submenu_render_submenu_icon() {
+	return '<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" role="img" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg>';
+}
+
+/**
+ * Renders the `core/navigation-submenu` block.
+ *
+ * @param array  $attributes The block attributes.
+ * @param string $content The saved content.
+ * @param object $block The parsed block.
+ *
+ * @return string Returns the post content with the legacy widget added.
+ */
+function render_block_core_navigation_submenu( $attributes, $content, $block ) {
+
+	$navigation_link_has_id = isset( $attributes['id'] ) && is_numeric( $attributes['id'] );
+	$is_post_type           = isset( $attributes['kind'] ) && 'post-type' === $attributes['kind'];
+	$is_post_type           = $is_post_type || isset( $attributes['type'] ) && ( 'post' === $attributes['type'] || 'page' === $attributes['type'] );
+
+	// Don't render the block's subtree if it is a draft.
+	if ( $is_post_type && $navigation_link_has_id && 'publish' !== get_post_status( $attributes['id'] ) ) {
+		return '';
+	}
+
+	// Don't render the block's subtree if it has no label.
+	if ( empty( $attributes['label'] ) ) {
+		return '';
+	}
+
+	$colors          = block_core_navigation_submenu_build_css_colors( $block->context, $attributes );
+	$font_sizes      = block_core_navigation_submenu_build_css_font_sizes( $block->context );
+	$classes         = array_merge(
+		$colors['css_classes'],
+		$font_sizes['css_classes']
+	);
+	$style_attribute = ( $colors['inline_styles'] . $font_sizes['inline_styles'] );
+
+	$css_classes = trim( implode( ' ', $classes ) );
+	$has_submenu = count( $block->inner_blocks ) > 0;
+	$is_active   = ! empty( $attributes['id'] ) && ( get_the_ID() === $attributes['id'] );
+
+	$show_submenu_indicators = isset( $block->context['showSubmenuIcon'] ) && $block->context['showSubmenuIcon'];
+	$open_on_click           = isset( $block->context['openSubmenusOnClick'] ) && $block->context['openSubmenusOnClick'];
+	$open_on_hover_and_click = isset( $block->context['openSubmenusOnClick'] ) && ! $block->context['openSubmenusOnClick'] &&
+		$show_submenu_indicators;
+
+	$wrapper_attributes = get_block_wrapper_attributes(
+		array(
+			'class' => $css_classes . ' wp-block-navigation-item' . ( $has_submenu ? ' has-child' : '' ) .
+			( $open_on_click ? ' open-on-click' : '' ) . ( $open_on_hover_and_click ? ' open-on-hover-click' : '' ) .
+			( $is_active ? ' current-menu-item' : '' ),
+			'style' => $style_attribute,
+		)
+	);
+
+	$label = '';
+
+	if ( isset( $attributes['label'] ) ) {
+		$label .= wp_kses(
+			$attributes['label'],
+			array(
+				'code'   => array(),
+				'em'     => array(),
+				'img'    => array(
+					'scale' => array(),
+					'class' => array(),
+					'style' => array(),
+					'src'   => array(),
+					'alt'   => array(),
+				),
+				's'      => array(),
+				'span'   => array(
+					'style' => array(),
+				),
+				'strong' => array(),
+			)
+		);
+	}
+
+	$aria_label = sprintf(
+		/* translators: Accessibility text. %s: Parent page title. */
+		__( '%s submenu' ),
+		wp_strip_all_tags( $label )
+	);
+
+	$html = '<li ' . $wrapper_attributes . '>';
+
+	// If Submenus open on hover, we render an anchor tag with attributes.
+	// If submenu icons are set to show, we also render a submenu button, so the submenu can be opened on click.
+	if ( ! $open_on_click ) {
+		$item_url = isset( $attributes['url'] ) ? esc_url( $attributes['url'] ) : '';
+		// Start appending HTML attributes to anchor tag.
+		$html .= '<a class="wp-block-navigation-item__content" href="' . $item_url . '"';
+
+		if ( $is_active ) {
+			$html .= ' aria-current="page"';
+		}
+
+		if ( isset( $attributes['opensInNewTab'] ) && true === $attributes['opensInNewTab'] ) {
+			$html .= ' target="_blank"  ';
+		}
+
+		if ( isset( $attributes['rel'] ) ) {
+			$html .= ' rel="' . esc_attr( $attributes['rel'] ) . '"';
+		} elseif ( isset( $attributes['nofollow'] ) && $attributes['nofollow'] ) {
+			$html .= ' rel="nofollow"';
+		}
+
+		if ( isset( $attributes['title'] ) ) {
+			$html .= ' title="' . esc_attr( $attributes['title'] ) . '"';
+		}
+
+		$html .= '>';
+		// End appending HTML attributes to anchor tag.
+
+		$html .= $label;
+
+		$html .= '</a>';
+		// End anchor tag content.
+
+		if ( $show_submenu_indicators ) {
+			// The submenu icon is rendered in a button here
+			// so that there's a clickable element to open the submenu.
+			$html .= '<button aria-label="' . $aria_label . '" class="wp-block-navigation__submenu-icon wp-block-navigation-submenu__toggle" aria-expanded="false">' . block_core_navigation_submenu_render_submenu_icon() . '</button>';
+		}
+	} else {
+		// If menus open on click, we render the parent as a button.
+		$html .= '<button aria-label="' . $aria_label . '" class="wp-block-navigation-item__content wp-block-navigation-submenu__toggle" aria-expanded="false">';
+
+		// Wrap title with span to isolate it from submenu icon.
+		$html .= '<span class="wp-block-navigation-item__label">';
+
+		$html .= $label;
+
+		$html .= '</span>';
+
+		$html .= '<span class="wp-block-navigation__submenu-icon">' . block_core_navigation_submenu_render_submenu_icon() . '</span>';
+
+		$html .= '</button>';
+
+	}
+
+	if ( $has_submenu ) {
+		$inner_blocks_html = '';
+		foreach ( $block->inner_blocks as $inner_block ) {
+			$inner_blocks_html .= $inner_block->render();
+		}
+
+		$html .= sprintf(
+			'<ul class="wp-block-navigation__submenu-container">%s</ul>',
+			$inner_blocks_html
+		);
+	}
+
+	$html .= '</li>';
+
+	return $html;
+}
+
+/**
+ * Register the navigation submenu block.
+ *
+ * @uses render_block_core_navigation_submenu()
+ * @throws WP_Error An WP_Error exception parsing the block definition.
+ */
+function register_block_core_navigation_submenu() {
+	register_block_type_from_metadata(
+		__DIR__ . '/navigation-submenu',
+		array(
+			'render_callback' => 'render_block_core_navigation_submenu',
+		)
+	);
+}
+add_action( 'init', 'register_block_core_navigation_submenu' );
diff --git a/src/wp-includes/blocks/navigation-submenu/block.json b/src/wp-includes/blocks/navigation-submenu/block.json
new file mode 100644
index 0000000000..db0791485a
--- /dev/null
+++ b/src/wp-includes/blocks/navigation-submenu/block.json
@@ -0,0 +1,65 @@
+{
+	"apiVersion": 2,
+	"name": "core/navigation-submenu",
+	"title": "Submenu",
+	"category": "design",
+	"parent": [
+		"core/navigation"
+	],
+	"description": "Add a submenu to your navigation.",
+	"textdomain": "default",
+	"attributes": {
+		"label": {
+			"type": "string"
+		},
+		"type": {
+			"type": "string"
+		},
+		"description": {
+			"type": "string"
+		},
+		"rel": {
+			"type": "string"
+		},
+		"id": {
+			"type": "number"
+		},
+		"opensInNewTab": {
+			"type": "boolean",
+			"default": false
+		},
+		"url": {
+			"type": "string"
+		},
+		"title": {
+			"type": "string"
+		},
+		"kind": {
+			"type": "string"
+		},
+		"isTopLevelItem": {
+			"type": "boolean"
+		}
+	},
+	"usesContext": [
+		"textColor",
+		"customTextColor",
+		"backgroundColor",
+		"customBackgroundColor",
+		"overlayTextColor",
+		"customOverlayTextColor",
+		"overlayBackgroundColor",
+		"customOverlayBackgroundColor",
+		"fontSize",
+		"customFontSize",
+		"showSubmenuIcon",
+		"openSubmenusOnClick",
+		"style"
+	],
+	"supports": {
+		"reusable": false,
+		"html": false
+	},
+	"editorStyle": "wp-block-navigation-submenu-editor",
+	"style": "wp-block-navigation-submenu"
+}
diff --git a/src/wp-includes/blocks/navigation.php b/src/wp-includes/blocks/navigation.php
new file mode 100644
index 0000000000..6cb6eeacf0
--- /dev/null
+++ b/src/wp-includes/blocks/navigation.php
@@ -0,0 +1,618 @@
+<?php
+/**
+ * Server-side rendering of the `core/navigation` block.
+ *
+ * @package WordPress
+ */
+
+// These functions are used for the __unstableLocation feature and only active
+// when the gutenberg plugin is active.
+if ( defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN ) {
+	/**
+	 * Returns the menu items for a WordPress menu location.
+	 *
+	 * @param string $location The menu location.
+	 * @return array Menu items for the location.
+	 */
+	function block_core_navigation_get_menu_items_at_location( $location ) {
+		if ( empty( $location ) ) {
+			return;
+		}
+
+		// Build menu data. The following approximates the code in
+		// `wp_nav_menu()` and `gutenberg_output_block_nav_menu`.
+
+		// Find the location in the list of locations, returning early if the
+		// location can't be found.
+		$locations = get_nav_menu_locations();
+		if ( ! isset( $locations[ $location ] ) ) {
+			return;
+		}
+
+		// Get the menu from the location, returning early if there is no
+		// menu or there was an error.
+		$menu = wp_get_nav_menu_object( $locations[ $location ] );
+		if ( ! $menu || is_wp_error( $menu ) ) {
+			return;
+		}
+
+		$menu_items = wp_get_nav_menu_items( $menu->term_id, array( 'update_post_term_cache' => false ) );
+		_wp_menu_item_classes_by_context( $menu_items );
+
+		return $menu_items;
+	}
+
+
+	/**
+	 * Sorts a standard array of menu items into a nested structure keyed by the
+	 * id of the parent menu.
+	 *
+	 * @param array $menu_items Menu items to sort.
+	 * @return array An array keyed by the id of the parent menu where each element
+	 *               is an array of menu items that belong to that parent.
+	 */
+	function block_core_navigation_sort_menu_items_by_parent_id( $menu_items ) {
+		$sorted_menu_items = array();
+		foreach ( (array) $menu_items as $menu_item ) {
+			$sorted_menu_items[ $menu_item->menu_order ] = $menu_item;
+		}
+		unset( $menu_items, $menu_item );
+
+		$menu_items_by_parent_id = array();
+		foreach ( $sorted_menu_items as $menu_item ) {
+			$menu_items_by_parent_id[ $menu_item->menu_item_parent ][] = $menu_item;
+		}
+
+		return $menu_items_by_parent_id;
+	}
+
+	/**
+	 * Turns menu item data into a nested array of parsed blocks
+	 *
+	 * @param array $menu_items               An array of menu items that represent
+	 *                                        an individual level of a menu.
+	 * @param array $menu_items_by_parent_id  An array keyed by the id of the
+	 *                                        parent menu where each element is an
+	 *                                        array of menu items that belong to
+	 *                                        that parent.
+	 * @return array An array of parsed block data.
+	 */
+	function block_core_navigation_parse_blocks_from_menu_items( $menu_items, $menu_items_by_parent_id ) {
+		if ( empty( $menu_items ) ) {
+			return array();
+		}
+
+		$blocks = array();
+
+		foreach ( $menu_items as $menu_item ) {
+			$class_name       = ! empty( $menu_item->classes ) ? implode( ' ', (array) $menu_item->classes ) : null;
+			$id               = ( null !== $menu_item->object_id && 'custom' !== $menu_item->object ) ? $menu_item->object_id : null;
+			$opens_in_new_tab = null !== $menu_item->target && '_blank' === $menu_item->target;
+			$rel              = ( null !== $menu_item->xfn && '' !== $menu_item->xfn ) ? $menu_item->xfn : null;
+			$kind             = null !== $menu_item->type ? str_replace( '_', '-', $menu_item->type ) : 'custom';
+
+			$block = array(
+				'blockName' => isset( $menu_items_by_parent_id[ $menu_item->ID ] ) ? 'core/navigation-submenu' : 'core/navigation-link',
+				'attrs'     => array(
+					'className'     => $class_name,
+					'description'   => $menu_item->description,
+					'id'            => $id,
+					'kind'          => $kind,
+					'label'         => $menu_item->title,
+					'opensInNewTab' => $opens_in_new_tab,
+					'rel'           => $rel,
+					'title'         => $menu_item->attr_title,
+					'type'          => $menu_item->object,
+					'url'           => $menu_item->url,
+				),
+			);
+
+			$block['innerBlocks']  = isset( $menu_items_by_parent_id[ $menu_item->ID ] )
+				? block_core_navigation_parse_blocks_from_menu_items( $menu_items_by_parent_id[ $menu_item->ID ], $menu_items_by_parent_id )
+				: array();
+			$block['innerContent'] = array_map( 'serialize_block', $block['innerBlocks'] );
+
+			$blocks[] = $block;
+		}
+
+		return $blocks;
+	}
+}
+
+/**
+ * Build an array with CSS classes and inline styles defining the colors
+ * which will be applied to the navigation markup in the front-end.
+ *
+ * @param array $attributes Navigation block attributes.
+ *
+ * @return array Colors CSS classes and inline styles.
+ */
+function block_core_navigation_build_css_colors( $attributes ) {
+	$colors = array(
+		'css_classes'           => array(),
+		'inline_styles'         => '',
+		'overlay_css_classes'   => array(),
+		'overlay_inline_styles' => '',
+	);
+
+	// Text color.
+	$has_named_text_color  = array_key_exists( 'textColor', $attributes );
+	$has_custom_text_color = array_key_exists( 'customTextColor', $attributes );
+
+	// If has text color.
+	if ( $has_custom_text_color || $has_named_text_color ) {
+		// Add has-text-color class.
+		$colors['css_classes'][] = 'has-text-color';
+	}
+
+	if ( $has_named_text_color ) {
+		// Add the color class.
+		$colors['css_classes'][] = sprintf( 'has-%s-color', $attributes['textColor'] );
+	} elseif ( $has_custom_text_color ) {
+		// Add the custom color inline style.
+		$colors['inline_styles'] .= sprintf( 'color: %s;', $attributes['customTextColor'] );
+	}
+
+	// Background color.
+	$has_named_background_color  = array_key_exists( 'backgroundColor', $attributes );
+	$has_custom_background_color = array_key_exists( 'customBackgroundColor', $attributes );
+
+	// If has background color.
+	if ( $has_custom_background_color || $has_named_background_color ) {
+		// Add has-background class.
+		$colors['css_classes'][] = 'has-background';
+	}
+
+	if ( $has_named_background_color ) {
+		// Add the background-color class.
+		$colors['css_classes'][] = sprintf( 'has-%s-background-color', $attributes['backgroundColor'] );
+	} elseif ( $has_custom_background_color ) {
+		// Add the custom background-color inline style.
+		$colors['inline_styles'] .= sprintf( 'background-color: %s;', $attributes['customBackgroundColor'] );
+	}
+
+	// Overlay text color.
+	$has_named_overlay_text_color  = array_key_exists( 'overlayTextColor', $attributes );
+	$has_custom_overlay_text_color = array_key_exists( 'customOverlayTextColor', $attributes );
+
+	// If has overlay text color.
+	if ( $has_custom_overlay_text_color || $has_named_overlay_text_color ) {
+		// Add has-text-color class.
+		$colors['overlay_css_classes'][] = 'has-text-color';
+	}
+
+	if ( $has_named_overlay_text_color ) {
+		// Add the overlay color class.
+		$colors['overlay_css_classes'][] = sprintf( 'has-%s-color', $attributes['overlayTextColor'] );
+	} elseif ( $has_custom_overlay_text_color ) {
+		// Add the custom overlay color inline style.
+		$colors['overlay_inline_styles'] .= sprintf( 'color: %s;', $attributes['customOverlayTextColor'] );
+	}
+
+	// Overlay background color.
+	$has_named_overlay_background_color  = array_key_exists( 'overlayBackgroundColor', $attributes );
+	$has_custom_overlay_background_color = array_key_exists( 'customOverlayBackgroundColor', $attributes );
+
+	// If has overlay background color.
+	if ( $has_custom_overlay_background_color || $has_named_overlay_background_color ) {
+		// Add has-background class.
+		$colors['overlay_css_classes'][] = 'has-background';
+	}
+
+	if ( $has_named_overlay_background_color ) {
+		// Add the overlay background-color class.
+		$colors['overlay_css_classes'][] = sprintf( 'has-%s-background-color', $attributes['overlayBackgroundColor'] );
+	} elseif ( $has_custom_overlay_background_color ) {
+		// Add the custom overlay background-color inline style.
+		$colors['overlay_inline_styles'] .= sprintf( 'background-color: %s;', $attributes['customOverlayBackgroundColor'] );
+	}
+
+	return $colors;
+}
+
+/**
+ * Build an array with CSS classes and inline styles defining the font sizes
+ * which will be applied to the navigation markup in the front-end.
+ *
+ * @param array $attributes Navigation block attributes.
+ *
+ * @return array Font size CSS classes and inline styles.
+ */
+function block_core_navigation_build_css_font_sizes( $attributes ) {
+	// CSS classes.
+	$font_sizes = array(
+		'css_classes'   => array(),
+		'inline_styles' => '',
+	);
+
+	$has_named_font_size  = array_key_exists( 'fontSize', $attributes );
+	$has_custom_font_size = array_key_exists( 'customFontSize', $attributes );
+
+	if ( $has_named_font_size ) {
+		// Add the font size class.
+		$font_sizes['css_classes'][] = sprintf( 'has-%s-font-size', $attributes['fontSize'] );
+	} elseif ( $has_custom_font_size ) {
+		// Add the custom font size inline style.
+		$font_sizes['inline_styles'] = sprintf( 'font-size: %spx;', $attributes['customFontSize'] );
+	}
+
+	return $font_sizes;
+}
+
+/**
+ * Returns the top-level submenu SVG chevron icon.
+ *
+ * @return string
+ */
+function block_core_navigation_render_submenu_icon() {
+	return '<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" role="img" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg>';
+}
+
+
+/**
+ * Finds the first non-empty `wp_navigation` Post.
+ *
+ * @return WP_Post|null the first non-empty Navigation or null.
+ */
+function block_core_navigation_get_first_non_empty_navigation() {
+	// Order and orderby args set to mirror those in `wp_get_nav_menus`
+	// see:
+	// - https://github.com/WordPress/wordpress-develop/blob/ba943e113d3b31b121f77a2d30aebe14b047c69d/src/wp-includes/nav-menu.php#L613-L619.
+	// - https://developer.wordpress.org/reference/classes/wp_query/#order-orderby-parameters.
+	$parsed_args = array(
+		'post_type'      => 'wp_navigation',
+		'no_found_rows'  => true,
+		'order'          => 'ASC',
+		'orderby'        => 'name',
+		'post_status'    => 'publish',
+		'posts_per_page' => 20, // Try the first 20 posts.
+	);
+
+	$navigation_posts = new WP_Query( $parsed_args );
+	foreach ( $navigation_posts->posts as $navigation_post ) {
+		if ( has_blocks( $navigation_post ) ) {
+			return $navigation_post;
+		}
+	}
+
+	return null;
+}
+
+/**
+ * Filter out empty "null" blocks from the block list.
+ * 'parse_blocks' includes a null block with '\n\n' as the content when
+ * it encounters whitespace. This is not a bug but rather how the parser
+ * is designed.
+ *
+ * @param array $parsed_blocks the parsed blocks to be normalized.
+ * @return array the normalized parsed blocks.
+ */
+function block_core_navigation_filter_out_empty_blocks( $parsed_blocks ) {
+	$filtered = array_filter(
+		$parsed_blocks,
+		function( $block ) {
+			return isset( $block['blockName'] );
+		}
+	);
+
+	// Reset keys.
+	return array_values( $filtered );
+}
+
+/**
+ * Retrieves the appropriate fallback to be used on the front of the
+ * site when there is no menu assigned to the Nav block.
+ *
+ * This aims to mirror how the fallback mechanic for wp_nav_menu works.
+ * See https://developer.wordpress.org/reference/functions/wp_nav_menu/#more-information.
+ *
+ * @return array the array of blocks to be used as a fallback.
+ */
+function block_core_navigation_get_fallback_blocks() {
+	$page_list_fallback = array(
+		array(
+			'blockName' => 'core/page-list',
+			'attrs'     => array(
+				'__unstableMaxPages' => 4,
+			),
+		),
+	);
+
+	$registry = WP_Block_Type_Registry::get_instance();
+
+	// If `core/page-list` is not registered then return empty blocks.
+	$fallback_blocks = $registry->is_registered( 'core/page-list' ) ? $page_list_fallback : array();
+
+	// Default to a list of Pages.
+
+	$navigation_post = block_core_navigation_get_first_non_empty_navigation();
+
+	// Prefer using the first non-empty Navigation as fallback if available.
+	if ( $navigation_post ) {
+		$maybe_fallback = block_core_navigation_filter_out_empty_blocks( parse_blocks( $navigation_post->post_content ) );
+
+		// Normalizing blocks may result in an empty array of blocks if they were all `null` blocks.
+		// In this case default to the (Page List) fallback.
+		$fallback_blocks = ! empty( $maybe_fallback ) ? $maybe_fallback : $fallback_blocks;
+	}
+
+	/**
+	 * Filters the fallback experience for the Navigation block.
+	 *
+	 * Returning a falsey value will opt out of the fallback and cause the block not to render.
+	 * To customise the blocks provided return an array of blocks - these should be valid
+	 * children of the `core/navigation` block.
+	 *
+	 * @param array[] default fallback blocks provided by the default block mechanic.
+	 */
+	return apply_filters( 'block_core_navigation_render_fallback', $fallback_blocks );
+}
+
+/**
+ * Renders the `core/navigation` block on server.
+ *
+ * @param array $attributes The block attributes.
+ * @param array $content The saved content.
+ * @param array $block The parsed block.
+ *
+ * @return string Returns the post content with the legacy widget added.
+ */
+function render_block_core_navigation( $attributes, $content, $block ) {
+
+	// Flag used to indicate whether the rendered output is considered to be
+	// a fallback (i.e. the block has no menu associated with it).
+	$is_fallback = false;
+
+	/**
+	 * Deprecated:
+	 * The rgbTextColor and rgbBackgroundColor attributes
+	 * have been deprecated in favor of
+	 * customTextColor and customBackgroundColor ones.
+	 * Move the values from old attrs to the new ones.
+	 */
+	if ( isset( $attributes['rgbTextColor'] ) && empty( $attributes['textColor'] ) ) {
+		$attributes['customTextColor'] = $attributes['rgbTextColor'];
+	}
+
+	if ( isset( $attributes['rgbBackgroundColor'] ) && empty( $attributes['backgroundColor'] ) ) {
+		$attributes['customBackgroundColor'] = $attributes['rgbBackgroundColor'];
+	}
+
+	unset( $attributes['rgbTextColor'], $attributes['rgbBackgroundColor'] );
+
+	/**
+	 * This is for backwards compatibility after `isResponsive` attribute has been removed.
+	 */
+	$has_old_responsive_attribute = ! empty( $attributes['isResponsive'] ) && $attributes['isResponsive'];
+	$is_responsive_menu           = isset( $attributes['overlayMenu'] ) && 'never' !== $attributes['overlayMenu'] || $has_old_responsive_attribute;
+	$should_load_view_script      = ! wp_script_is( 'wp-block-navigation-view' ) && ( $is_responsive_menu || $attributes['openSubmenusOnClick'] || $attributes['showSubmenuIcon'] );
+	if ( $should_load_view_script ) {
+		wp_enqueue_script( 'wp-block-navigation-view' );
+	}
+
+	$inner_blocks = $block->inner_blocks;
+
+	// Ensure that blocks saved with the legacy ref attribute name (navigationMenuId) continue to render.
+	if ( array_key_exists( 'navigationMenuId', $attributes ) ) {
+		$attributes['ref'] = $attributes['navigationMenuId'];
+	}
+
+	// If:
+	// - the gutenberg plugin is active
+	// - `__unstableLocation` is defined
+	// - we have menu items at the defined location
+	// - we don't have a relationship to a `wp_navigation` Post (via `ref`).
+	// ...then create inner blocks from the classic menu assigned to that location.
+	if (
+		defined( 'IS_GUTENBERG_PLUGIN' ) && IS_GUTENBERG_PLUGIN &&
+		array_key_exists( '__unstableLocation', $attributes ) &&
+		! array_key_exists( 'ref', $attributes ) &&
+		! empty( block_core_navigation_get_menu_items_at_location( $attributes['__unstableLocation'] ) )
+	) {
+		$menu_items = block_core_navigation_get_menu_items_at_location( $attributes['__unstableLocation'] );
+		if ( empty( $menu_items ) ) {
+			return '';
+		}
+
+		$menu_items_by_parent_id = block_core_navigation_sort_menu_items_by_parent_id( $menu_items );
+		$parsed_blocks           = block_core_navigation_parse_blocks_from_menu_items( $menu_items_by_parent_id[0], $menu_items_by_parent_id );
+		$inner_blocks            = new WP_Block_List( $parsed_blocks, $attributes );
+	}
+
+	// Load inner blocks from the navigation post.
+	if ( array_key_exists( 'ref', $attributes ) ) {
+		$navigation_post = get_post( $attributes['ref'] );
+		if ( ! isset( $navigation_post ) ) {
+			return '';
+		}
+
+		$parsed_blocks = parse_blocks( $navigation_post->post_content );
+
+		// 'parse_blocks' includes a null block with '\n\n' as the content when
+		// it encounters whitespace. This code strips it.
+		$compacted_blocks = block_core_navigation_filter_out_empty_blocks( $parsed_blocks );
+
+		// TODO - this uses the full navigation block attributes for the
+		// context which could be refined.
+		$inner_blocks = new WP_Block_List( $compacted_blocks, $attributes );
+	}
+
+	// If there are no inner blocks then fallback to rendering an appropriate fallback.
+	if ( empty( $inner_blocks ) ) {
+		$is_fallback = true; // indicate we are rendering the fallback.
+
+		$fallback_blocks = block_core_navigation_get_fallback_blocks();
+
+		// Fallback my have been filtered so do basic test for validity.
+		if ( empty( $fallback_blocks ) || ! is_array( $fallback_blocks ) ) {
+			return '';
+		}
+
+		$inner_blocks = new WP_Block_List( $fallback_blocks, $attributes );
+
+	}
+
+	$layout_justification = array(
+		'left'          => 'items-justified-left',
+		'right'         => 'items-justified-right',
+		'center'        => 'items-justified-center',
+		'space-between' => 'items-justified-space-between',
+	);
+
+	// Restore legacy classnames for submenu positioning.
+	$layout_class = '';
+	if ( isset( $attributes['layout']['justifyContent'] ) ) {
+		$layout_class .= $layout_justification[ $attributes['layout']['justifyContent'] ];
+	}
+	if ( isset( $attributes['layout']['orientation'] ) && 'vertical' === $attributes['layout']['orientation'] ) {
+		$layout_class .= ' is-vertical';
+	}
+
+	if ( isset( $attributes['layout']['flexWrap'] ) && 'nowrap' === $attributes['layout']['flexWrap'] ) {
+		$layout_class .= ' no-wrap';
+	}
+
+	$colors     = block_core_navigation_build_css_colors( $attributes );
+	$font_sizes = block_core_navigation_build_css_font_sizes( $attributes );
+	$classes    = array_merge(
+		$colors['css_classes'],
+		$font_sizes['css_classes'],
+		$is_responsive_menu ? array( 'is-responsive' ) : array(),
+		$layout_class ? array( $layout_class ) : array(),
+		$is_fallback ? array( 'is-fallback' ) : array()
+	);
+
+	$inner_blocks_html = '';
+	$is_list_open      = false;
+	foreach ( $inner_blocks as $inner_block ) {
+		if ( ( 'core/navigation-link' === $inner_block->name || 'core/home-link' === $inner_block->name || 'core/site-title' === $inner_block->name || 'core/site-logo' === $inner_block->name || 'core/navigation-submenu' === $inner_block->name ) && ! $is_list_open ) {
+			$is_list_open       = true;
+			$inner_blocks_html .= '<ul class="wp-block-navigation__container">';
+		}
+		if ( 'core/navigation-link' !== $inner_block->name && 'core/home-link' !== $inner_block->name && 'core/site-title' !== $inner_block->name && 'core/site-logo' !== $inner_block->name && 'core/navigation-submenu' !== $inner_block->name && $is_list_open ) {
+			$is_list_open       = false;
+			$inner_blocks_html .= '</ul>';
+		}
+		if ( 'core/site-title' === $inner_block->name || 'core/site-logo' === $inner_block->name ) {
+			$inner_blocks_html .= '<li class="wp-block-navigation-item">' . $inner_block->render() . '</li>';
+		} else {
+			$inner_blocks_html .= $inner_block->render();
+		}
+	}
+
+	if ( $is_list_open ) {
+		$inner_blocks_html .= '</ul>';
+	}
+
+	$block_styles = isset( $attributes['styles'] ) ? $attributes['styles'] : '';
+
+	$wrapper_attributes = get_block_wrapper_attributes(
+		array(
+			'class' => implode( ' ', $classes ),
+			'style' => $block_styles . $colors['inline_styles'] . $font_sizes['inline_styles'],
+		)
+	);
+
+	$modal_unique_id = uniqid();
+
+	// Determine whether or not navigation elements should be wrapped in the markup required to make it responsive,
+	// return early if they don't.
+	if ( ! $is_responsive_menu ) {
+		return sprintf(
+			'<nav %1$s>%2$s</nav>',
+			$wrapper_attributes,
+			$inner_blocks_html
+		);
+	}
+
+	$is_hidden_by_default = isset( $attributes['overlayMenu'] ) && 'always' === $attributes['overlayMenu'];
+
+	$responsive_container_classes = array(
+		'wp-block-navigation__responsive-container',
+		$is_hidden_by_default ? 'hidden-by-default' : '',
+		implode( ' ', $colors['overlay_css_classes'] ),
+	);
+	$open_button_classes          = array(
+		'wp-block-navigation__responsive-container-open',
+		$is_hidden_by_default ? 'always-shown' : '',
+	);
+
+	$responsive_container_markup = sprintf(
+		'<button aria-haspopup="true" aria-label="%3$s" class="%6$s" data-micromodal-trigger="modal-%1$s"><svg width="24" height="24" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" role="img" aria-hidden="true" focusable="false"><rect x="4" y="7.5" width="16" height="1.5" /><rect x="4" y="15" width="16" height="1.5" /></svg></button>
+			<div class="%5$s" style="%7$s" id="modal-%1$s">
+				<div class="wp-block-navigation__responsive-close" tabindex="-1" data-micromodal-close>
+					<div class="wp-block-navigation__responsive-dialog" aria-label="%8$s">
+							<button aria-label="%4$s" data-micromodal-close class="wp-block-navigation__responsive-container-close"><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24" height="24" role="img" aria-hidden="true" focusable="false"><path d="M13 11.8l6.1-6.3-1-1-6.1 6.2-6.1-6.2-1 1 6.1 6.3-6.5 6.7 1 1 6.5-6.6 6.5 6.6 1-1z"></path></svg></button>
+						<div class="wp-block-navigation__responsive-container-content" id="modal-%1$s-content">
+							%2$s
+						</div>
+					</div>
+				</div>
+			</div>',
+		$modal_unique_id,
+		$inner_blocks_html,
+		__( 'Open menu' ), // Open button label.
+		__( 'Close menu' ), // Close button label.
+		implode( ' ', $responsive_container_classes ),
+		implode( ' ', $open_button_classes ),
+		$colors['overlay_inline_styles'],
+		__( 'Menu' )
+	);
+
+	return sprintf(
+		'<nav %1$s>%2$s</nav>',
+		$wrapper_attributes,
+		$responsive_container_markup
+	);
+}
+
+/**
+ * Register the navigation block.
+ *
+ * @throws WP_Error An WP_Error exception parsing the block definition.
+ * @uses render_block_core_navigation()
+ */
+function register_block_core_navigation() {
+	register_block_type_from_metadata(
+		__DIR__ . '/navigation',
+		array(
+			'render_callback' => 'render_block_core_navigation',
+		)
+	);
+}
+
+add_action( 'init', 'register_block_core_navigation' );
+
+/**
+ * Filter that changes the parsed attribute values of navigation blocks contain typographic presets to contain the values directly.
+ *
+ * @param array $parsed_block The block being rendered.
+ *
+ * @return array The block being rendered without typographic presets.
+ */
+function block_core_navigation_typographic_presets_backcompatibility( $parsed_block ) {
+	if ( 'core/navigation' === $parsed_block['blockName'] ) {
+		$attribute_to_prefix_map = array(
+			'fontStyle'      => 'var:preset|font-style|',
+			'fontWeight'     => 'var:preset|font-weight|',
+			'textDecoration' => 'var:preset|text-decoration|',
+			'textTransform'  => 'var:preset|text-transform|',
+		);
+		foreach ( $attribute_to_prefix_map as $style_attribute => $prefix ) {
+			if ( ! empty( $parsed_block['attrs']['style']['typography'][ $style_attribute ] ) ) {
+				$prefix_len      = strlen( $prefix );
+				$attribute_value = &$parsed_block['attrs']['style']['typography'][ $style_attribute ];
+				if ( 0 === strncmp( $attribute_value, $prefix, $prefix_len ) ) {
+					$attribute_value = substr( $attribute_value, $prefix_len );
+				}
+				if ( 'textDecoration' === $style_attribute && 'strikethrough' === $attribute_value ) {
+					$attribute_value = 'line-through';
+				}
+			}
+		}
+	}
+
+	return $parsed_block;
+}
+
+add_filter( 'render_block_data', 'block_core_navigation_typographic_presets_backcompatibility' );
diff --git a/src/wp-includes/blocks/navigation/block.json b/src/wp-includes/blocks/navigation/block.json
new file mode 100644
index 0000000000..b15c19391e
--- /dev/null
+++ b/src/wp-includes/blocks/navigation/block.json
@@ -0,0 +1,113 @@
+{
+	"apiVersion": 2,
+	"name": "core/navigation",
+	"title": "Navigation",
+	"category": "theme",
+	"description": "A collection of blocks that allow visitors to get around your site.",
+	"keywords": [
+		"menu",
+		"navigation",
+		"links"
+	],
+	"textdomain": "default",
+	"attributes": {
+		"ref": {
+			"type": "number"
+		},
+		"textColor": {
+			"type": "string"
+		},
+		"customTextColor": {
+			"type": "string"
+		},
+		"rgbTextColor": {
+			"type": "string"
+		},
+		"backgroundColor": {
+			"type": "string"
+		},
+		"customBackgroundColor": {
+			"type": "string"
+		},
+		"rgbBackgroundColor": {
+			"type": "string"
+		},
+		"showSubmenuIcon": {
+			"type": "boolean",
+			"default": true
+		},
+		"openSubmenusOnClick": {
+			"type": "boolean",
+			"default": false
+		},
+		"overlayMenu": {
+			"type": "string",
+			"default": "mobile"
+		},
+		"__unstableLocation": {
+			"type": "string"
+		},
+		"overlayBackgroundColor": {
+			"type": "string"
+		},
+		"customOverlayBackgroundColor": {
+			"type": "string"
+		},
+		"overlayTextColor": {
+			"type": "string"
+		},
+		"customOverlayTextColor": {
+			"type": "string"
+		}
+	},
+	"usesContext": [ "navigationArea" ],
+	"providesContext": {
+		"textColor": "textColor",
+		"customTextColor": "customTextColor",
+		"backgroundColor": "backgroundColor",
+		"customBackgroundColor": "customBackgroundColor",
+		"overlayTextColor": "overlayTextColor",
+		"customOverlayTextColor": "customOverlayTextColor",
+		"overlayBackgroundColor": "overlayBackgroundColor",
+		"customOverlayBackgroundColor": "customOverlayBackgroundColor",
+		"fontSize": "fontSize",
+		"customFontSize": "customFontSize",
+		"showSubmenuIcon": "showSubmenuIcon",
+		"openSubmenusOnClick": "openSubmenusOnClick",
+		"style": "style",
+		"orientation": "orientation"
+	},
+	"supports": {
+		"align": [
+			"wide",
+			"full"
+		],
+		"anchor": true,
+		"html": false,
+		"inserter": true,
+		"typography": {
+			"fontSize": true,
+			"lineHeight": true,
+			"__experimentalFontStyle": true,
+			"__experimentalFontWeight": true,
+			"__experimentalTextTransform": true,
+			"__experimentalFontFamily": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true
+			}
+		},
+		"spacing": {
+			"units": [ "px", "em", "rem", "vh", "vw" ]
+		},
+		"__experimentalLayout": {
+			"allowSwitching": false,
+			"allowInheriting": false,
+			"default": {
+				"type": "flex"
+			}
+		}
+	},
+	"viewScript": "file:./view.min.js",
+	"editorStyle": "wp-block-navigation-editor",
+	"style": "wp-block-navigation"
+}
diff --git a/src/wp-includes/blocks/navigation/view.asset.php b/src/wp-includes/blocks/navigation/view.asset.php
new file mode 100644
index 0000000000..0e99617c4a
--- /dev/null
+++ b/src/wp-includes/blocks/navigation/view.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array(), 'version' => '49bd3949750c5172758e1b3058f0c72a');
\ No newline at end of file
diff --git a/src/wp-includes/blocks/navigation/view.min.asset.php b/src/wp-includes/blocks/navigation/view.min.asset.php
new file mode 100644
index 0000000000..a47e07872f
--- /dev/null
+++ b/src/wp-includes/blocks/navigation/view.min.asset.php
@@ -0,0 +1 @@
+<?php return array('dependencies' => array(), 'version' => '3776ea67846b3bb10fe8f7cdd486b0ba');
\ No newline at end of file
diff --git a/src/wp-includes/blocks/page-list.php b/src/wp-includes/blocks/page-list.php
index 5ee409fedd..efec9ff583 100644
--- a/src/wp-includes/blocks/page-list.php
+++ b/src/wp-includes/blocks/page-list.php
@@ -9,28 +9,34 @@
  * Build an array with CSS classes and inline styles defining the colors
  * which will be applied to the pages markup in the front-end when it is a descendant of navigation.
  *
- * @param  array $context Navigation block context.
+ * @param  array $attributes Block attributes.
+ * @param  array $context    Navigation block context.
  * @return array Colors CSS classes and inline styles.
  */
-function block_core_page_list_build_css_colors( $context ) {
+function block_core_page_list_build_css_colors( $attributes, $context ) {
 	$colors = array(
-		'css_classes'   => array(),
-		'inline_styles' => '',
+		'css_classes'           => array(),
+		'inline_styles'         => '',
+		'overlay_css_classes'   => array(),
+		'overlay_inline_styles' => '',
 	);
 
 	// Text color.
 	$has_named_text_color  = array_key_exists( 'textColor', $context );
+	$has_picked_text_color = array_key_exists( 'customTextColor', $context );
 	$has_custom_text_color = isset( $context['style']['color']['text'] );
 
 	// If has text color.
-	if ( $has_custom_text_color || $has_named_text_color ) {
+	if ( $has_custom_text_color || $has_picked_text_color || $has_named_text_color ) {
 		// Add has-text-color class.
 		$colors['css_classes'][] = 'has-text-color';
 	}
 
 	if ( $has_named_text_color ) {
 		// Add the color class.
-		$colors['css_classes'][] = sprintf( 'has-%s-color', $context['textColor'] );
+		$colors['css_classes'][] = sprintf( 'has-%s-color', _wp_to_kebab_case( $context['textColor'] ) );
+	} elseif ( $has_picked_text_color ) {
+		$colors['inline_styles'] .= sprintf( 'color: %s;', $context['customTextColor'] );
 	} elseif ( $has_custom_text_color ) {
 		// Add the custom color inline style.
 		$colors['inline_styles'] .= sprintf( 'color: %s;', $context['style']['color']['text'] );
@@ -38,22 +44,56 @@ function block_core_page_list_build_css_colors( $context ) {
 
 	// Background color.
 	$has_named_background_color  = array_key_exists( 'backgroundColor', $context );
+	$has_picked_background_color = array_key_exists( 'customBackgroundColor', $context );
 	$has_custom_background_color = isset( $context['style']['color']['background'] );
 
 	// If has background color.
-	if ( $has_custom_background_color || $has_named_background_color ) {
+	if ( $has_custom_background_color || $has_picked_background_color || $has_named_background_color ) {
 		// Add has-background class.
 		$colors['css_classes'][] = 'has-background';
 	}
 
 	if ( $has_named_background_color ) {
 		// Add the background-color class.
-		$colors['css_classes'][] = sprintf( 'has-%s-background-color', $context['backgroundColor'] );
+		$colors['css_classes'][] = sprintf( 'has-%s-background-color', _wp_to_kebab_case( $context['backgroundColor'] ) );
+	} elseif ( $has_picked_background_color ) {
+		$colors['inline_styles'] .= sprintf( 'background-color: %s;', $context['customBackgroundColor'] );
 	} elseif ( $has_custom_background_color ) {
 		// Add the custom background-color inline style.
 		$colors['inline_styles'] .= sprintf( 'background-color: %s;', $context['style']['color']['background'] );
 	}
 
+	// Overlay text color.
+	$has_named_overlay_text_color  = array_key_exists( 'overlayTextColor', $context );
+	$has_picked_overlay_text_color = array_key_exists( 'customOverlayTextColor', $context );
+
+	// If it has a text color.
+	if ( $has_named_overlay_text_color || $has_picked_overlay_text_color ) {
+		$colors['overlay_css_classes'][] = 'has-text-color';
+	}
+
+	// Give overlay colors priority, fall back to Navigation block colors, then global styles.
+	if ( $has_named_overlay_text_color ) {
+		$colors['overlay_css_classes'][] = sprintf( 'has-%s-color', _wp_to_kebab_case( $context['overlayTextColor'] ) );
+	} elseif ( $has_picked_overlay_text_color ) {
+		$colors['overlay_inline_styles'] .= sprintf( 'color: %s;', $context['customOverlayTextColor'] );
+	}
+
+	// Overlay background colors.
+	$has_named_overlay_background_color  = array_key_exists( 'overlayBackgroundColor', $context );
+	$has_picked_overlay_background_color = array_key_exists( 'customOverlayBackgroundColor', $context );
+
+	// If has background color.
+	if ( $has_named_overlay_background_color || $has_picked_overlay_background_color ) {
+		$colors['overlay_css_classes'][] = 'has-background';
+	}
+
+	if ( $has_named_overlay_background_color ) {
+		$colors['overlay_css_classes'][] = sprintf( 'has-%s-background-color', _wp_to_kebab_case( $context['overlayBackgroundColor'] ) );
+	} elseif ( $has_picked_overlay_background_color ) {
+		$colors['overlay_inline_styles'] .= sprintf( 'background-color: %s;', $context['customOverlayBackgroundColor'] );
+	}
+
 	return $colors;
 }
 
@@ -79,7 +119,7 @@ function block_core_page_list_build_css_font_sizes( $context ) {
 		$font_sizes['css_classes'][] = sprintf( 'has-%s-font-size', $context['fontSize'] );
 	} elseif ( $has_custom_font_size ) {
 		// Add the custom font size inline style.
-		$font_sizes['inline_styles'] = sprintf( 'font-size: %spx;', $context['style']['typography']['fontSize'] );
+		$font_sizes['inline_styles'] = sprintf( 'font-size: %s;', $context['style']['typography']['fontSize'] );
 	}
 
 	return $font_sizes;
@@ -88,28 +128,79 @@ function block_core_page_list_build_css_font_sizes( $context ) {
 /**
  * Outputs Page list markup from an array of pages with nested children.
  *
- * @param array $nested_pages The array of nested pages.
+ * @param boolean $open_submenus_on_click Whether to open submenus on click instead of hover.
+ * @param boolean $show_submenu_icons Whether to show submenu indicator icons.
+ * @param boolean $is_navigation_child If block is a child of Navigation block.
+ * @param array   $nested_pages The array of nested pages.
+ * @param array   $active_page_ancestor_ids An array of ancestor ids for active page.
+ * @param array   $colors Color information for overlay styles.
+ * @param integer $depth The nesting depth.
  *
  * @return string List markup.
  */
-function block_core_page_list_render_nested_page_list( $nested_pages ) {
+function block_core_page_list_render_nested_page_list( $open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $nested_pages, $active_page_ancestor_ids = array(), $colors = array(), $depth = 0 ) {
 	if ( empty( $nested_pages ) ) {
 		return;
 	}
 	$markup = '';
 	foreach ( (array) $nested_pages as $page ) {
-		$css_class = 'wp-block-pages-list__item';
+		$css_class       = $page['is_active'] ? ' current-menu-item' : '';
+		$aria_current    = $page['is_active'] ? ' aria-current="page"' : '';
+		$style_attribute = '';
+
+		$css_class .= in_array( $page['page_id'], $active_page_ancestor_ids, true ) ? ' current-menu-ancestor' : '';
 		if ( isset( $page['children'] ) ) {
 			$css_class .= ' has-child';
 		}
-		$markup .= '<li class="' . $css_class . '">';
-		$markup .= '<a class="wp-block-pages-list__item__link" href="' . esc_url( $page['link'] ) . '">' . wp_kses(
-			$page['title'],
-			wp_kses_allowed_html( 'post' )
-		) . '</a>';
+
+		if ( $is_navigation_child ) {
+			$css_class .= ' wp-block-navigation-item';
+
+			if ( $open_submenus_on_click ) {
+				$css_class .= ' open-on-click';
+			} elseif ( $show_submenu_icons ) {
+				$css_class .= ' open-on-hover-click';
+			}
+		}
+
+		$navigation_child_content_class = $is_navigation_child ? ' wp-block-navigation-item__content' : '';
+
+		// If this is the first level of submenus, include the overlay colors.
+		if ( 1 === $depth && isset( $colors['overlay_css_classes'], $colors['overlay_inline_styles'] ) ) {
+			$css_class .= ' ' . trim( implode( ' ', $colors['overlay_css_classes'] ) );
+			if ( '' !== $colors['overlay_inline_styles'] ) {
+				$style_attribute = sprintf( ' style="%s"', esc_attr( $colors['overlay_inline_styles'] ) );
+			}
+		}
+
+		$title      = wp_kses( $page['title'], wp_kses_allowed_html( 'post' ) );
+		$aria_label = sprintf(
+			/* translators: Accessibility text. %s: Parent page title. */
+			__( '%s submenu' ),
+			wp_strip_all_tags( $title )
+		);
+
+		$markup .= '<li class="wp-block-pages-list__item' . $css_class . '"' . $style_attribute . '>';
+
+		if ( isset( $page['children'] ) && $is_navigation_child && $open_submenus_on_click ) {
+			$markup .= '<button aria-label="' . $aria_label . '" class="' . $navigation_child_content_class . ' wp-block-navigation-submenu__toggle" aria-expanded="false">' . $title . '<span class="wp-block-page-list__submenu-icon wp-block-navigation__submenu-icon"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" role="img" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg></span>' .
+			'</button>';
+		} else {
+			$markup .= '<a class="wp-block-pages-list__item__link' . $navigation_child_content_class . '" href="' . esc_url( $page['link'] ) . '"' . $aria_current . '>' . $title . '</a>';
+		}
+
 		if ( isset( $page['children'] ) ) {
-			$markup .= '<span class="wp-block-page-list__submenu-icon"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" role="img" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg></span>';
-			$markup .= '<ul class="submenu-container">' . block_core_page_list_render_nested_page_list( $page['children'] ) . '</ul>';
+			if ( $is_navigation_child && $show_submenu_icons && ! $open_submenus_on_click ) {
+				$markup .= '<button aria-label="' . $aria_label . '" class="wp-block-navigation__submenu-icon wp-block-navigation-submenu__toggle" aria-expanded="false">';
+				$markup .= '<span class="wp-block-page-list__submenu-icon wp-block-navigation__submenu-icon"><svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 12 12" fill="none" role="img" aria-hidden="true" focusable="false"><path d="M1.50002 4L6.00002 8L10.5 4" stroke-width="1.5"></path></svg></span>';
+				$markup .= '</button>';
+			}
+			$markup .= '<ul class="submenu-container';
+			// Extra classname is added when the block is a child of Navigation.
+			if ( $is_navigation_child ) {
+				$markup .= ' wp-block-navigation__submenu-container';
+			}
+			$markup .= '">' . block_core_page_list_render_nested_page_list( $open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $page['children'], $active_page_ancestor_ids, $colors, $depth + 1 ) . '</ul>';
 		}
 		$markup .= '</li>';
 	}
@@ -149,44 +240,50 @@ function render_block_core_page_list( $attributes, $content, $block ) {
 	static $block_id = 0;
 	$block_id++;
 
-	// TODO: When https://core.trac.wordpress.org/ticket/39037 REST API support for multiple orderby values is resolved,
-	// update 'sort_column' to 'menu_order, post_title'. Sorting by both menu_order and post_title ensures a stable sort.
-	// Otherwise with pages that have the same menu_order value, we can see different ordering depending on how DB
-	// queries are constructed internally. For example we might see a different order when a limit is set to <499
-	// versus >= 500.
 	$all_pages = get_pages(
 		array(
-			'sort_column' => 'menu_order',
+			'sort_column' => 'menu_order,post_title',
 			'order'       => 'asc',
 		)
 	);
 
+	// If thare are no pages, there is nothing to show.
+	if ( empty( $all_pages ) ) {
+		return;
+	}
+
 	$top_level_pages = array();
 
 	$pages_with_children = array();
 
+	$active_page_ancestor_ids = array();
+
 	foreach ( (array) $all_pages as $page ) {
+		$is_active = ! empty( $page->ID ) && ( get_the_ID() === $page->ID );
+
+		if ( $is_active ) {
+			$active_page_ancestor_ids = get_post_ancestors( $page->ID );
+		}
+
 		if ( $page->post_parent ) {
 			$pages_with_children[ $page->post_parent ][ $page->ID ] = array(
-				'title' => $page->post_title,
-				'link'  => get_permalink( $page->ID ),
+				'page_id'   => $page->ID,
+				'title'     => $page->post_title,
+				'link'      => get_permalink( $page->ID ),
+				'is_active' => $is_active,
 			);
 		} else {
 			$top_level_pages[ $page->ID ] = array(
-				'title' => $page->post_title,
-				'link'  => get_permalink( $page->ID ),
+				'page_id'   => $page->ID,
+				'title'     => $page->post_title,
+				'link'      => get_permalink( $page->ID ),
+				'is_active' => $is_active,
 			);
 
 		}
 	}
 
-	$nested_pages = block_core_page_list_nest_pages( $top_level_pages, $pages_with_children );
-
-	$wrapper_markup = '<ul %1$s>%2$s</ul>';
-
-	$items_markup = block_core_page_list_render_nested_page_list( $nested_pages );
-
-	$colors          = block_core_page_list_build_css_colors( $block->context );
+	$colors          = block_core_page_list_build_css_colors( $attributes, $block->context );
 	$font_sizes      = block_core_page_list_build_css_font_sizes( $block->context );
 	$classes         = array_merge(
 		$colors['css_classes'],
@@ -195,10 +292,23 @@ function render_block_core_page_list( $attributes, $content, $block ) {
 	$style_attribute = ( $colors['inline_styles'] . $font_sizes['inline_styles'] );
 	$css_classes     = trim( implode( ' ', $classes ) );
 
-	if ( $block->context && $block->context['showSubmenuIcon'] ) {
-		$css_classes .= ' show-submenu-icons';
+	$nested_pages = block_core_page_list_nest_pages( $top_level_pages, $pages_with_children );
+
+	// Limit the number of items to be visually displayed.
+	if ( ! empty( $attributes['__unstableMaxPages'] ) ) {
+		$nested_pages = array_slice( $nested_pages, 0, $attributes['__unstableMaxPages'] );
 	}
 
+	$is_navigation_child = array_key_exists( 'showSubmenuIcon', $block->context );
+
+	$open_submenus_on_click = array_key_exists( 'openSubmenusOnClick', $block->context ) ? $block->context['openSubmenusOnClick'] : false;
+
+	$show_submenu_icons = array_key_exists( 'showSubmenuIcon', $block->context ) ? $block->context['showSubmenuIcon'] : false;
+
+	$wrapper_markup = '<ul %1$s>%2$s</ul>';
+
+	$items_markup = block_core_page_list_render_nested_page_list( $open_submenus_on_click, $show_submenu_icons, $is_navigation_child, $nested_pages, $active_page_ancestor_ids, $colors );
+
 	$wrapper_attributes = get_block_wrapper_attributes(
 		array(
 			'class' => $css_classes,
diff --git a/src/wp-includes/blocks/page-list/block.json b/src/wp-includes/blocks/page-list/block.json
index 25118d2dbe..146f236fca 100644
--- a/src/wp-includes/blocks/page-list/block.json
+++ b/src/wp-includes/blocks/page-list/block.json
@@ -6,15 +6,22 @@
 	"description": "Display a list of all pages.",
 	"keywords": [ "menu", "navigation" ],
 	"textdomain": "default",
+	"attributes": {
+	},
 	"usesContext": [
 		"textColor",
 		"customTextColor",
 		"backgroundColor",
 		"customBackgroundColor",
+		"overlayTextColor",
+		"customOverlayTextColor",
+		"overlayBackgroundColor",
+		"customOverlayBackgroundColor",
 		"fontSize",
 		"customFontSize",
 		"showSubmenuIcon",
-		"style"
+		"style",
+		"openSubmenusOnClick"
 	],
 	"supports": {
 		"reusable": false,
diff --git a/src/wp-includes/blocks/paragraph/block.json b/src/wp-includes/blocks/paragraph/block.json
index d05e48a7be..80bc900ff4 100644
--- a/src/wp-includes/blocks/paragraph/block.json
+++ b/src/wp-includes/blocks/paragraph/block.json
@@ -37,7 +37,14 @@
 		},
 		"typography": {
 			"fontSize": true,
-			"lineHeight": true
+			"lineHeight": true,
+			"__experimentalFontStyle": true,
+			"__experimentalFontWeight": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalTextTransform": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true
+			}
 		},
 		"__experimentalSelector": "p",
 		"__unstablePasteTextInline": true
diff --git a/src/wp-includes/blocks/pattern.php b/src/wp-includes/blocks/pattern.php
new file mode 100644
index 0000000000..32a08601ca
--- /dev/null
+++ b/src/wp-includes/blocks/pattern.php
@@ -0,0 +1,44 @@
+<?php
+/**
+ * Server-side rendering of the `core/pattern` block.
+ *
+ * @package WordPress
+ */
+
+/**
+ *  Registers the `core/pattern` block on the server.
+ *
+ * @return void
+ */
+function register_block_core_pattern() {
+	register_block_type_from_metadata(
+		__DIR__ . '/pattern',
+		array(
+			'render_callback' => 'render_block_core_pattern',
+		)
+	);
+}
+
+/**
+ * Renders the `core/pattern` block on the server.
+ *
+ * @param array $attributes Block attributes.
+ *
+ * @return string Returns the output of the pattern.
+ */
+function render_block_core_pattern( $attributes ) {
+	if ( empty( $attributes['slug'] ) ) {
+		return '';
+	}
+
+	$slug     = $attributes['slug'];
+	$registry = WP_Block_Patterns_Registry::get_instance();
+	if ( ! $registry->is_registered( $slug ) ) {
+		return '';
+	}
+
+	$pattern = $registry->get_registered( $slug );
+	return do_blocks( $pattern['content'] );
+}
+
+add_action( 'init', 'register_block_core_pattern' );
diff --git a/src/wp-includes/blocks/pattern/block.json b/src/wp-includes/blocks/pattern/block.json
new file mode 100644
index 0000000000..c0c27cd821
--- /dev/null
+++ b/src/wp-includes/blocks/pattern/block.json
@@ -0,0 +1,17 @@
+{
+	"apiVersion": 2,
+	"name": "core/pattern",
+	"title": "Pattern",
+	"category": "theme",
+	"description": "Show a block pattern.",
+	"supports": {
+		"html": false,
+		"inserter": false
+	},
+	"textdomain": "default",
+	"attributes": {
+		"slug": {
+			"type": "string"
+		}
+	}
+}
diff --git a/src/wp-includes/blocks/post-author.php b/src/wp-includes/blocks/post-author.php
new file mode 100644
index 0000000000..e31be65f70
--- /dev/null
+++ b/src/wp-includes/blocks/post-author.php
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Server-side rendering of the `core/post-author` block.
+ *
+ * @package WordPress
+ */
+
+/**
+ * Renders the `core/post-author` block on the server.
+ *
+ * @param  array    $attributes Block attributes.
+ * @param  string   $content    Block default content.
+ * @param  WP_Block $block      Block instance.
+ * @return string Returns the rendered author block.
+ */
+function render_block_core_post_author( $attributes, $content, $block ) {
+	if ( ! isset( $block->context['postId'] ) ) {
+		return '';
+	}
+
+	$author_id = get_post_field( 'post_author', $block->context['postId'] );
+	if ( empty( $author_id ) ) {
+		return '';
+	}
+
+	$avatar = ! empty( $attributes['avatarSize'] ) ? get_avatar(
+		$author_id,
+		$attributes['avatarSize']
+	) : null;
+
+	$byline  = ! empty( $attributes['byline'] ) ? $attributes['byline'] : false;
+	$classes = array_merge(
+		isset( $attributes['className'] ) ? array( $attributes['className'] ) : array(),
+		isset( $attributes['itemsJustification'] ) ? array( 'items-justified-' . $attributes['itemsJustification'] ) : array(),
+		isset( $attributes['textAlign'] ) ? array( 'has-text-align-' . $attributes['textAlign'] ) : array()
+	);
+
+	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $classes ) ) );
+
+	return sprintf( '<div %1$s>', $wrapper_attributes ) .
+	( ! empty( $attributes['showAvatar'] ) ? '<div class="wp-block-post-author__avatar">' . $avatar . '</div>' : '' ) .
+	'<div class="wp-block-post-author__content">' .
+	( ! empty( $byline ) ? '<p class="wp-block-post-author__byline">' . $byline . '</p>' : '' ) .
+	'<p class="wp-block-post-author__name">' . get_the_author_meta( 'display_name', $author_id ) . '</p>' .
+	( ! empty( $attributes['showBio'] ) ? '<p class="wp-block-post-author__bio">' . get_the_author_meta( 'user_description', $author_id ) . '</p>' : '' ) .
+	'</div>' .
+	'</div>';
+}
+
+/**
+ * Registers the `core/post-author` block on the server.
+ */
+function register_block_core_post_author() {
+	register_block_type_from_metadata(
+		__DIR__ . '/post-author',
+		array(
+			'render_callback' => 'render_block_core_post_author',
+		)
+	);
+}
+add_action( 'init', 'register_block_core_post_author' );
diff --git a/src/wp-includes/blocks/post-author/block.json b/src/wp-includes/blocks/post-author/block.json
new file mode 100644
index 0000000000..d46c8df69d
--- /dev/null
+++ b/src/wp-includes/blocks/post-author/block.json
@@ -0,0 +1,53 @@
+{
+	"apiVersion": 2,
+	"name": "core/post-author",
+	"title": "Post Author",
+	"category": "theme",
+	"description": "Add the author of this post.",
+	"textdomain": "default",
+	"attributes": {
+		"textAlign": {
+			"type": "string"
+		},
+		"avatarSize": {
+			"type": "number",
+			"default": 48
+		},
+		"showAvatar": {
+			"type": "boolean",
+			"default": true
+		},
+		"showBio": {
+			"type": "boolean"
+		},
+		"byline": {
+			"type": "string"
+		}
+	},
+	"usesContext": [ "postType", "postId", "queryId" ],
+	"supports": {
+		"html": false,
+		"spacing": {
+			"margin": true,
+			"padding": true
+		},
+		"typography": {
+			"fontSize": true,
+			"lineHeight": true,
+			"__experimentalFontStyle": true,
+			"__experimentalFontWeight": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalTextTransform": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true
+			}
+		},
+		"color": {
+			"gradients": true,
+			"link": true,
+			"__experimentalDuotone": ".wp-block-post-author__avatar img"
+		}
+	},
+	"editorStyle": "wp-block-post-author-editor",
+	"style": "wp-block-post-author"
+}
diff --git a/src/wp-includes/blocks/post-comments.php b/src/wp-includes/blocks/post-comments.php
new file mode 100644
index 0000000000..8ddb0e6f74
--- /dev/null
+++ b/src/wp-includes/blocks/post-comments.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * Server-side rendering of the `core/post-comments` block.
+ *
+ * @package WordPress
+ */
+
+/**
+ * Renders the `core/post-comments` block on the server.
+ *
+ * @param array    $attributes Block attributes.
+ * @param string   $content    Block default content.
+ * @param WP_Block $block      Block instance.
+ * @return string Returns the filtered post comments for the current post wrapped inside "p" tags.
+ */
+function render_block_core_post_comments( $attributes, $content, $block ) {
+	global $post;
+
+	$post_id = $block->context['postId'];
+	if ( ! isset( $post_id ) ) {
+		return '';
+	}
+
+	$comment_args = array(
+		'post_id' => $post_id,
+		'count'   => true,
+	);
+	// Return early if there are no comments and comments are closed.
+	if ( ! comments_open( $post_id ) && get_comments( $comment_args ) === 0 ) {
+		return '';
+	}
+
+	$post_before = $post;
+	$post        = get_post( $post_id );
+	setup_postdata( $post );
+
+	ob_start();
+	// There's a deprecation warning generated by WP Core.
+	// Ideally this deprecation is removed from Core.
+	// In the meantime, this removes it from the output.
+	add_filter( 'deprecated_file_trigger_error', '__return_false' );
+	comments_template();
+	remove_filter( 'deprecated_file_trigger_error', '__return_false' );
+	$post = $post_before;
+
+	$classes = '';
+	if ( isset( $attributes['textAlign'] ) ) {
+		$classes .= 'has-text-align-' . $attributes['textAlign'];
+	}
+
+	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) );
+	$output             = ob_get_clean();
+
+	return sprintf( '<div %1$s>%2$s</div>', $wrapper_attributes, $output );
+}
+
+/**
+ * Registers the `core/post-comments` block on the server.
+ */
+function register_block_core_post_comments() {
+	register_block_type_from_metadata(
+		__DIR__ . '/post-comments',
+		array(
+			'render_callback' => 'render_block_core_post_comments',
+		)
+	);
+}
+add_action( 'init', 'register_block_core_post_comments' );
+
+/**
+ * Use the button block classes for the form-submit button.
+ *
+ * @param array $fields The default comment form arguments.
+ *
+ * @return array Returns the modified fields.
+ */
+function post_comments_block_form_defaults( $fields ) {
+	if ( wp_is_block_theme() ) {
+		$fields['submit_button'] = '<input name="%1$s" type="submit" id="%2$s" class="%3$s wp-block-button__link" value="%4$s" />';
+		$fields['submit_field']  = '<p class="form-submit wp-block-button">%1$s %2$s</p>';
+	}
+
+	return $fields;
+}
+add_filter( 'comment_form_defaults', 'post_comments_block_form_defaults' );
diff --git a/src/wp-includes/blocks/post-comments/block.json b/src/wp-includes/blocks/post-comments/block.json
new file mode 100644
index 0000000000..2c797f5115
--- /dev/null
+++ b/src/wp-includes/blocks/post-comments/block.json
@@ -0,0 +1,38 @@
+{
+	"apiVersion": 2,
+	"name": "core/post-comments",
+	"title": "Post Comments",
+	"category": "theme",
+	"description": "Display a post's comments.",
+	"textdomain": "default",
+	"attributes": {
+		"textAlign": {
+			"type": "string"
+		}
+	},
+	"usesContext": [ "postId", "postType" ],
+	"supports": {
+		"html": false,
+		"align": [ "wide", "full" ],
+		"typography": {
+			"fontSize": true,
+			"lineHeight": true,
+			"__experimentalFontStyle": true,
+			"__experimentalFontWeight": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalTextTransform": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true
+			}
+		},
+		"color": {
+			"gradients": true,
+			"link": true
+		}
+	},
+	"style": [
+		"wp-block-post-comments",
+		"wp-block-buttons",
+		"wp-block-button"
+	]
+}
diff --git a/src/wp-includes/blocks/post-content.php b/src/wp-includes/blocks/post-content.php
index 400e3068df..b1ed1b4542 100644
--- a/src/wp-includes/blocks/post-content.php
+++ b/src/wp-includes/blocks/post-content.php
@@ -36,11 +36,21 @@ function render_block_core_post_content( $attributes, $content, $block ) {
 
 	$seen_ids[ $post_id ] = true;
 
+	// Check is needed for backward compatibility with third-party plugins
+	// that might rely on the `in_the_loop` check; calling `the_post` sets it to true.
 	if ( ! in_the_loop() && have_posts() ) {
 		the_post();
 	}
 
-	$content = get_the_content( null, false, $post_id );
+	// When inside the main loop, we want to use queried object
+	// so that `the_preview` for the current post can apply.
+	// We force this behavior by omitting the third argument (post ID) from the `get_the_content`.
+	$content = get_the_content( null, false );
+	// Check for nextpage to display page links for paginated posts.
+	if ( has_block( 'core/nextpage' ) ) {
+		$content .= wp_link_pages( array( 'echo' => 0 ) );
+	}
+
 	/** This filter is documented in wp-includes/post-template.php */
 	$content = apply_filters( 'the_content', str_replace( ']]>', ']]&gt;', $content ) );
 	unset( $seen_ids[ $post_id ] );
diff --git a/src/wp-includes/blocks/post-date/block.json b/src/wp-includes/blocks/post-date/block.json
index 260e5f1c2a..4698801f06 100644
--- a/src/wp-includes/blocks/post-date/block.json
+++ b/src/wp-includes/blocks/post-date/block.json
@@ -26,7 +26,15 @@
 		},
 		"typography": {
 			"fontSize": true,
-			"lineHeight": true
+			"lineHeight": true,
+			"__experimentalFontFamily": true,
+			"__experimentalFontWeight": true,
+			"__experimentalFontStyle": true,
+			"__experimentalTextTransform": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true
+			}
 		}
 	}
 }
diff --git a/src/wp-includes/blocks/post-excerpt.php b/src/wp-includes/blocks/post-excerpt.php
index 03e0acf4fe..d650cc3cf0 100644
--- a/src/wp-includes/blocks/post-excerpt.php
+++ b/src/wp-includes/blocks/post-excerpt.php
@@ -18,6 +18,12 @@ function render_block_core_post_excerpt( $attributes, $content, $block ) {
 		return '';
 	}
 
+	$excerpt = get_the_excerpt();
+
+	if ( empty( $excerpt ) ) {
+		return '';
+	}
+
 	$more_text           = ! empty( $attributes['moreText'] ) ? '<a class="wp-block-post-excerpt__more-link" href="' . esc_url( get_the_permalink( $block->context['postId'] ) ) . '">' . $attributes['moreText'] . '</a>' : '';
 	$filter_excerpt_more = function( $more ) use ( $more_text ) {
 		return empty( $more_text ) ? $more : '';
@@ -38,7 +44,7 @@ function render_block_core_post_excerpt( $attributes, $content, $block ) {
 	}
 	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) );
 
-	$content               = '<p class="wp-block-post-excerpt__excerpt">' . get_the_excerpt( $block->context['postId'] );
+	$content               = '<p class="wp-block-post-excerpt__excerpt">' . $excerpt;
 	$show_more_on_new_line = ! isset( $attributes['showMoreOnNewLine'] ) || $attributes['showMoreOnNewLine'];
 	if ( $show_more_on_new_line && ! empty( $more_text ) ) {
 		$content .= '</p><p class="wp-block-post-excerpt__more-text">' . $more_text . '</p>';
diff --git a/src/wp-includes/blocks/post-excerpt/block.json b/src/wp-includes/blocks/post-excerpt/block.json
index a066c4250a..c3b15ad5ec 100644
--- a/src/wp-includes/blocks/post-excerpt/block.json
+++ b/src/wp-includes/blocks/post-excerpt/block.json
@@ -24,9 +24,20 @@
 			"gradients": true,
 			"link": true
 		},
+		"spacing": {
+			"margin": true,
+			"padding": true
+		},
 		"typography": {
 			"fontSize": true,
-			"lineHeight": true
+			"lineHeight": true,
+			"__experimentalFontStyle": true,
+			"__experimentalFontWeight": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalTextTransform": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true
+			}
 		}
 	},
 	"editorStyle": "wp-block-post-excerpt-editor",
diff --git a/src/wp-includes/blocks/post-featured-image.php b/src/wp-includes/blocks/post-featured-image.php
index 8497a0569a..21e6aca445 100644
--- a/src/wp-includes/blocks/post-featured-image.php
+++ b/src/wp-includes/blocks/post-featured-image.php
@@ -23,14 +23,30 @@ function render_block_core_post_featured_image( $attributes, $content, $block )
 	if ( ! $featured_image ) {
 		return '';
 	}
-
+	$wrapper_attributes = get_block_wrapper_attributes();
 	if ( isset( $attributes['isLink'] ) && $attributes['isLink'] ) {
 		$featured_image = sprintf( '<a href="%1s">%2s</a>', get_the_permalink( $post_ID ), $featured_image );
 	}
 
-	$wrapper_attributes = get_block_wrapper_attributes();
+	$has_width  = ! empty( $attributes['width'] );
+	$has_height = ! empty( $attributes['height'] );
+	if ( ! $has_height && ! $has_width ) {
+		return "<figure $wrapper_attributes>$featured_image</figure>";
+	}
+
+	if ( $has_width ) {
+		$wrapper_attributes = get_block_wrapper_attributes( array( 'style' => "width:{$attributes['width']};" ) );
+	}
+
+	if ( $has_height ) {
+		$image_styles = "height:{$attributes['height']};";
+		if ( ! empty( $attributes['scale'] ) ) {
+			$image_styles .= "object-fit:{$attributes['scale']};";
+		}
+		$featured_image = str_replace( 'src=', "style='$image_styles' src=", $featured_image );
+	}
 
-	return '<figure ' . $wrapper_attributes . '>' . $featured_image . '</figure>';
+	return "<figure $wrapper_attributes>$featured_image</figure>";
 }
 
 /**
diff --git a/src/wp-includes/blocks/post-featured-image/block.json b/src/wp-includes/blocks/post-featured-image/block.json
index a5ab8d6cfd..49116ef908 100644
--- a/src/wp-includes/blocks/post-featured-image/block.json
+++ b/src/wp-includes/blocks/post-featured-image/block.json
@@ -9,12 +9,31 @@
 		"isLink": {
 			"type": "boolean",
 			"default": false
+		},
+		"width": {
+			"type": "string"
+		},
+		"height": {
+			"type": "string"
+		},
+		"scale": {
+			"type": "string",
+			"default": "cover"
 		}
 	},
 	"usesContext": [ "postId", "postType", "queryId" ],
 	"supports": {
 		"align": [ "left", "right", "center", "wide", "full" ],
-		"html": false
+		"color": {
+			"__experimentalDuotone": "img",
+			"text": false,
+			"background": false
+		},
+		"html": false,
+		"spacing": {
+			"margin": true,
+			"padding": true
+		}
 	},
 	"editorStyle": "wp-block-post-featured-image-editor",
 	"style": "wp-block-post-featured-image"
diff --git a/src/wp-includes/blocks/post-navigation-link.php b/src/wp-includes/blocks/post-navigation-link.php
new file mode 100644
index 0000000000..9fedf38d6f
--- /dev/null
+++ b/src/wp-includes/blocks/post-navigation-link.php
@@ -0,0 +1,96 @@
+<?php
+/**
+ * Server-side rendering of the `core/post-navigation-link` block.
+ *
+ * @package WordPress
+ */
+
+/**
+ * Renders the `core/post-navigation-link` block on the server.
+ *
+ * @param array  $attributes Block attributes.
+ * @param string $content    Block default content.
+ *
+ * @return string Returns the next or previous post link that is adjacent to the current post.
+ */
+function render_block_core_post_navigation_link( $attributes, $content ) {
+	if ( ! is_singular() ) {
+		return '';
+	}
+
+	// Get the nagigation type to show the proper link. Available options are `next|previous`.
+	$navigation_type = isset( $attributes['type'] ) ? $attributes['type'] : 'next';
+	// Allow only `next` and `previous` in `$navigation_type`.
+	if ( ! in_array( $navigation_type, array( 'next', 'previous' ), true ) ) {
+		return '';
+	}
+	$classes = "post-navigation-link-$navigation_type";
+	if ( isset( $attributes['textAlign'] ) ) {
+		$classes .= " has-text-align-{$attributes['textAlign']}";
+	}
+	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) );
+	// Set default values.
+	$format = '%link';
+	$link   = 'next' === $navigation_type ? _x( 'Next', 'label for next post link' ) : _x( 'Previous', 'label for previous post link' );
+	$label  = '';
+
+	// If a custom label is provided, make this a link.
+	// `$label` is used to prepend the provided label, if we want to show the page title as well.
+	if ( isset( $attributes['label'] ) && ! empty( $attributes['label'] ) ) {
+		$label = "{$attributes['label']}";
+		$link  = $label;
+	}
+
+	// If we want to also show the page title, make the page title a link and prepend the label.
+	if ( isset( $attributes['showTitle'] ) && $attributes['showTitle'] ) {
+		/*
+		 * If the label link option is not enabled but there is a custom label,
+		 * display the custom label as text before the linked title.
+		 */
+		if ( ! $attributes['linkLabel'] ) {
+			if ( $label ) {
+				$format = '<span class="post-navigation-link__label">' . $label . '</span> %link';
+			}
+			$link = '%title';
+		} elseif ( isset( $attributes['linkLabel'] ) && $attributes['linkLabel'] ) {
+			// If the label link option is enabled and there is a custom label, display it before the title.
+			if ( $label ) {
+				$link = '<span class="post-navigation-link__label">' . $label . '</span> <span class="post-navigation-link__title">%title</title>';
+			} else {
+				/*
+				 * If the label link option is enabled and there is no custom label,
+				 * add a colon between the label and the post title.
+				 */
+				$label = 'next' === $navigation_type ? _x( 'Next:', 'label before the title of the next post' ) : _x( 'Previous:', 'label before the title of the previous post' );
+				$link  = sprintf(
+					'<span class="post-navigation-link__label">%1$s</span> <span class="post-navigation-link__title">%2$s</span>',
+					$label,
+					'%title'
+				);
+			}
+		}
+	}
+
+	// The dynamic portion of the function name, `$navigation_type`,
+	// refers to the type of adjacency, 'next' or 'previous'.
+	$get_link_function = "get_{$navigation_type}_post_link";
+	$content           = $get_link_function( $format, $link );
+	return sprintf(
+		'<div %1$s>%2$s</div>',
+		$wrapper_attributes,
+		$content
+	);
+}
+
+/**
+ * Registers the `core/post-navigation-link` block on the server.
+ */
+function register_block_core_post_navigation_link() {
+	register_block_type_from_metadata(
+		__DIR__ . '/post-navigation-link',
+		array(
+			'render_callback' => 'render_block_core_post_navigation_link',
+		)
+	);
+}
+add_action( 'init', 'register_block_core_post_navigation_link' );
diff --git a/src/wp-includes/blocks/post-navigation-link/block.json b/src/wp-includes/blocks/post-navigation-link/block.json
new file mode 100644
index 0000000000..ec983b6b57
--- /dev/null
+++ b/src/wp-includes/blocks/post-navigation-link/block.json
@@ -0,0 +1,43 @@
+{
+	"apiVersion": 2,
+	"name": "core/post-navigation-link",
+	"title": "Post Navigation Link",
+	"category": "theme",
+	"description": "Displays the next or previous post link that is adjacent to the current post.",
+	"textdomain": "default",
+	"attributes": {
+		"textAlign": {
+			"type": "string"
+		},
+		"type": {
+			"type": "string",
+			"default": "next"
+		},
+		"label": {
+			"type": "string"
+		},
+		"showTitle": {
+			"type": "boolean",
+			"default": false
+		},
+		"linkLabel": {
+			"type": "boolean",
+			"default": false
+		}
+	},
+	"supports": {
+		"reusable": false,
+		"html": false,
+		"typography": {
+			"fontSize": true,
+			"lineHeight": true,
+			"__experimentalFontStyle": true,
+			"__experimentalFontWeight": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalTextTransform": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true
+			}
+		}
+	}
+}
diff --git a/src/wp-includes/blocks/post-template.php b/src/wp-includes/blocks/post-template.php
index 3daacbad7f..45bf3c4c64 100644
--- a/src/wp-includes/blocks/post-template.php
+++ b/src/wp-includes/blocks/post-template.php
@@ -61,7 +61,8 @@ function render_block_core_post_template( $attributes, $content, $block ) {
 				)
 			)
 		)->render( array( 'dynamic' => false ) );
-		$content      .= "<li>{$block_content}</li>";
+		$post_classes  = esc_attr( implode( ' ', get_post_class( 'wp-block-post' ) ) );
+		$content      .= '<li class="' . $post_classes . '">' . $block_content . '</li>';
 	}
 
 	wp_reset_postdata();
diff --git a/src/wp-includes/blocks/post-template/block.json b/src/wp-includes/blocks/post-template/block.json
index 7ac5910941..2e0959d04b 100644
--- a/src/wp-includes/blocks/post-template/block.json
+++ b/src/wp-includes/blocks/post-template/block.json
@@ -16,7 +16,10 @@
 	"supports": {
 		"reusable": false,
 		"html": false,
-		"align": true
+		"align": true,
+		"__experimentalLayout": {
+			"allowEditing": false
+		}
 	},
 	"style": "wp-block-post-template",
 	"editorStyle": "wp-block-post-template-editor"
diff --git a/src/wp-includes/blocks/post-terms.php b/src/wp-includes/blocks/post-terms.php
index d82395b549..2573c4f0fb 100644
--- a/src/wp-includes/blocks/post-terms.php
+++ b/src/wp-includes/blocks/post-terms.php
@@ -23,30 +23,25 @@ function render_block_core_post_terms( $attributes, $content, $block ) {
 	}
 
 	$post_terms = get_the_terms( $block->context['postId'], $attributes['term'] );
-	if ( is_wp_error( $post_terms ) ) {
+	if ( is_wp_error( $post_terms ) || empty( $post_terms ) ) {
 		return '';
 	}
-	if ( empty( $post_terms ) ) {
-		return '';
+
+	$classes = 'taxonomy-' . $attributes['term'];
+	if ( isset( $attributes['textAlign'] ) ) {
+		$classes .= ' has-text-align-' . $attributes['textAlign'];
 	}
 
-	$align_class_name = empty( $attributes['textAlign'] ) ? '' : ' ' . "has-text-align-{$attributes['textAlign']}";
+	$separator = empty( $attributes['separator'] ) ? ' ' : $attributes['separator'];
 
-	$terms_links = '';
-	foreach ( $post_terms as $term ) {
-		$terms_links .= sprintf(
-			'<a href="%1$s">%2$s</a> | ',
-			get_term_link( $term->term_id ),
-			esc_html( $term->name )
-		);
-	}
-	$terms_links        = trim( $terms_links, ' | ' );
-	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $align_class_name ) );
+	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classes ) );
 
-	return sprintf(
-		'<div %1$s>%2$s</div>',
-		$wrapper_attributes,
-		$terms_links
+	return get_the_term_list(
+		$block->context['postId'],
+		$attributes['term'],
+		"<div $wrapper_attributes>",
+		'<span class="wp-block-post-terms__separator">' . $separator . '</span>',
+		'</div>'
 	);
 }
 
diff --git a/src/wp-includes/blocks/post-terms/block.json b/src/wp-includes/blocks/post-terms/block.json
index 1f9f61738e..04a46942f4 100644
--- a/src/wp-includes/blocks/post-terms/block.json
+++ b/src/wp-includes/blocks/post-terms/block.json
@@ -2,7 +2,7 @@
 	"apiVersion": 2,
 	"name": "core/post-terms",
 	"title": "Post Terms",
-	"category": "design",
+	"category": "theme",
 	"description": "Post terms.",
 	"textdomain": "default",
 	"attributes": {
@@ -11,6 +11,10 @@
 		},
 		"textAlign": {
 			"type": "string"
+		},
+		"separator": {
+			"type": "string",
+			"default": ", "
 		}
 	},
 	"usesContext": [ "postId", "postType" ],
@@ -22,7 +26,15 @@
 		},
 		"typography": {
 			"lineHeight": true,
-			"fontSize": true
+			"fontSize": true,
+			"__experimentalFontStyle": true,
+			"__experimentalFontWeight": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalTextTransform": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true
+			}
 		}
-	}
+	},
+	"style": "wp-block-post-terms"
 }
diff --git a/src/wp-includes/blocks/post-title.php b/src/wp-includes/blocks/post-title.php
index 798278b556..5630286426 100644
--- a/src/wp-includes/blocks/post-title.php
+++ b/src/wp-includes/blocks/post-title.php
@@ -19,7 +19,13 @@ function render_block_core_post_title( $attributes, $content, $block ) {
 		return '';
 	}
 
-	$post_ID          = $block->context['postId'];
+	$post_ID = $block->context['postId'];
+	$title   = get_the_title();
+
+	if ( ! $title ) {
+		return '';
+	}
+
 	$tag_name         = 'h2';
 	$align_class_name = empty( $attributes['textAlign'] ) ? '' : "has-text-align-{$attributes['textAlign']}";
 
@@ -27,9 +33,8 @@ function render_block_core_post_title( $attributes, $content, $block ) {
 		$tag_name = 0 === $attributes['level'] ? 'p' : 'h' . $attributes['level'];
 	}
 
-	$title = get_the_title( $post_ID );
 	if ( isset( $attributes['isLink'] ) && $attributes['isLink'] ) {
-		$title = sprintf( '<a href="%1s" target="%2s" rel="%3s">%4s</a>', get_the_permalink( $post_ID ), $attributes['linkTarget'], $attributes['rel'], $title );
+		$title = sprintf( '<a href="%1$s" target="%2$s" rel="%3$s">%4$s</a>', get_the_permalink( $post_ID ), $attributes['linkTarget'], $attributes['rel'], $title );
 	}
 	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $align_class_name ) );
 
diff --git a/src/wp-includes/blocks/post-title/block.json b/src/wp-includes/blocks/post-title/block.json
index b20985442e..ce0b04384b 100644
--- a/src/wp-includes/blocks/post-title/block.json
+++ b/src/wp-includes/blocks/post-title/block.json
@@ -35,10 +35,22 @@
 			"gradients": true,
 			"link": true
 		},
+		"spacing": {
+			"margin": true
+		},
 		"typography": {
 			"fontSize": true,
 			"lineHeight": true,
-			"__experimentalFontFamily": true
+			"__experimentalFontFamily": true,
+			"__experimentalFontWeight": true,
+			"__experimentalFontStyle": true,
+			"__experimentalTextTransform": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true,
+				"fontAppearance": true,
+				"textTransform": true
+			}
 		}
 	},
 	"style": "wp-block-post-title"
diff --git a/src/wp-includes/blocks/preformatted/block.json b/src/wp-includes/blocks/preformatted/block.json
index 6deb40540b..53e32bdf5d 100644
--- a/src/wp-includes/blocks/preformatted/block.json
+++ b/src/wp-includes/blocks/preformatted/block.json
@@ -21,7 +21,15 @@
 			"gradients": true
 		},
 		"typography": {
-			"fontSize": true
+			"fontSize": true,
+			"lineHeight": true,
+			"__experimentalFontStyle": true,
+			"__experimentalFontWeight": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalTextTransform": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true
+			}
 		}
 	},
 	"style": "wp-block-preformatted"
diff --git a/src/wp-includes/blocks/pullquote/block.json b/src/wp-includes/blocks/pullquote/block.json
index 1237a506ad..3411ce072e 100644
--- a/src/wp-includes/blocks/pullquote/block.json
+++ b/src/wp-includes/blocks/pullquote/block.json
@@ -20,31 +20,37 @@
 			"default": "",
 			"__experimentalRole": "content"
 		},
-		"mainColor": {
-			"type": "string"
-		},
-		"customMainColor": {
-			"type": "string"
-		},
-		"textColor": {
-			"type": "string"
-		},
-		"customTextColor": {
+		"textAlign": {
 			"type": "string"
 		}
 	},
 	"supports": {
 		"anchor": true,
-		"align": [ "left", "right", "wide", "full" ]
-	},
-	"styles": [
-		{
-			"name": "default",
-			"label": "Default",
-			"isDefault": true
+		"align": [ "left", "right", "wide", "full" ],
+		"color": {
+			"gradients": true,
+			"background": true,
+			"link": true
+		},
+		"typography": {
+			"fontSize": true,
+			"lineHeight": true,
+			"__experimentalFontStyle": true,
+			"__experimentalFontWeight": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalTextTransform": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true,
+				"fontAppearance": true
+			}
 		},
-		{ "name": "solid-color", "label": "Solid color" }
-	],
+		"__experimentalBorder": {
+			"color": true,
+			"radius": true,
+			"style": true,
+			"width": true
+		}
+	},
 	"editorStyle": "wp-block-pullquote-editor",
 	"style": "wp-block-pullquote"
 }
diff --git a/src/wp-includes/blocks/query-pagination-next.php b/src/wp-includes/blocks/query-pagination-next.php
index f22a4810f9..ea581e705f 100644
--- a/src/wp-includes/blocks/query-pagination-next.php
+++ b/src/wp-includes/blocks/query-pagination-next.php
@@ -20,9 +20,13 @@ function render_block_core_query_pagination_next( $attributes, $content, $block
 	$max_page = isset( $block->context['query']['pages'] ) ? (int) $block->context['query']['pages'] : 0;
 
 	$wrapper_attributes = get_block_wrapper_attributes();
-	$default_label      = __( 'Next Page &raquo;' );
+	$default_label      = __( 'Next Page' );
 	$label              = isset( $attributes['label'] ) && ! empty( $attributes['label'] ) ? $attributes['label'] : $default_label;
-	$content            = '';
+	$pagination_arrow   = get_query_pagination_arrow( $block, true );
+	if ( $pagination_arrow ) {
+		$label .= $pagination_arrow;
+	}
+	$content = '';
 
 	// Check if the pagination is for Query that inherits the global context.
 	if ( isset( $block->context['query']['inherit'] ) && $block->context['query']['inherit'] ) {
@@ -39,8 +43,9 @@ function render_block_core_query_pagination_next( $attributes, $content, $block
 		$content = get_next_posts_link( $label, $max_page );
 		remove_filter( 'next_posts_link_attributes', $filter_link_attributes );
 	} elseif ( ! $max_page || $max_page > $page ) {
-		$custom_query = new WP_Query( build_query_vars_from_query_block( $block, $page ) );
-		if ( (int) $custom_query->max_num_pages !== $page ) {
+		$custom_query           = new WP_Query( build_query_vars_from_query_block( $block, $page ) );
+		$custom_query_max_pages = (int) $custom_query->max_num_pages;
+		if ( $custom_query_max_pages && $custom_query_max_pages !== $page ) {
 			$content = sprintf(
 				'<a href="%1$s" %2$s>%3$s</a>',
 				esc_url( add_query_arg( $page_key, $page + 1 ) ),
diff --git a/src/wp-includes/blocks/query-pagination-next/block.json b/src/wp-includes/blocks/query-pagination-next/block.json
index afc69d6e14..e98f99ae7e 100644
--- a/src/wp-includes/blocks/query-pagination-next/block.json
+++ b/src/wp-includes/blocks/query-pagination-next/block.json
@@ -1,7 +1,7 @@
 {
 	"apiVersion": 2,
 	"name": "core/query-pagination-next",
-	"title": "Query Pagination Next",
+	"title": "Next Page",
 	"category": "design",
 	"parent": [ "core/query-pagination" ],
 	"description": "Displays the next posts page link.",
@@ -11,17 +11,24 @@
 			"type": "string"
 		}
 	},
-	"usesContext": [ "queryId", "query" ],
+	"usesContext": [ "queryId", "query", "paginationArrow" ],
 	"supports": {
 		"reusable": false,
 		"html": false,
 		"color": {
 			"gradients": true,
-			"link": true
+			"text": false
 		},
 		"typography": {
 			"fontSize": true,
-			"lineHeight": true
+			"lineHeight": true,
+			"__experimentalFontStyle": true,
+			"__experimentalFontWeight": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalTextTransform": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true
+			}
 		}
 	}
 }
diff --git a/src/wp-includes/blocks/query-pagination-numbers.php b/src/wp-includes/blocks/query-pagination-numbers.php
index 9d27e88519..60fe85efa1 100644
--- a/src/wp-includes/blocks/query-pagination-numbers.php
+++ b/src/wp-includes/blocks/query-pagination-numbers.php
@@ -45,6 +45,28 @@ function render_block_core_query_pagination_numbers( $attributes, $content, $blo
 			'total'     => $total,
 			'prev_next' => false,
 		);
+		if ( 1 !== $page ) {
+			/**
+			 * `paginate_links` doesn't use the provided `format` when the page is `1`.
+			 * This is great for the main query as it removes the extra query params
+			 * making the URL shorter, but in the case of multiple custom queries is
+			 * problematic. It results in returning an empty link which ends up with
+			 * a link to the current page.
+			 *
+			 * A way to address this is to add a `fake` query arg with no value that
+			 * is the same for all custom queries. This way the link is not empty and
+			 * preserves all the other existent query args.
+			 *
+			 * @see https://developer.wordpress.org/reference/functions/paginate_links/
+			 *
+			 * The proper fix of this should be in core. Track Ticket:
+			 * @see https://core.trac.wordpress.org/ticket/53868
+			 *
+			 * TODO: After two WP versions (starting from the WP version the core patch landed),
+			 * we should remove this and call `paginate_links` with the proper new arg.
+			 */
+			$paginate_args['add_args'] = array( 'cst' => '' );
+		}
 		// We still need to preserve `paged` query param if exists, as is used
 		// for Queries that inherit from global context.
 		$paged = empty( $_GET['paged'] ) ? null : (int) $_GET['paged'];
diff --git a/src/wp-includes/blocks/query-pagination-numbers/block.json b/src/wp-includes/blocks/query-pagination-numbers/block.json
index d9142de147..6e8609102c 100644
--- a/src/wp-includes/blocks/query-pagination-numbers/block.json
+++ b/src/wp-includes/blocks/query-pagination-numbers/block.json
@@ -1,7 +1,7 @@
 {
 	"apiVersion": 2,
 	"name": "core/query-pagination-numbers",
-	"title": "Query Pagination Numbers",
+	"title": "Page Numbers",
 	"category": "design",
 	"parent": [ "core/query-pagination" ],
 	"description": "Displays a list of page numbers for pagination",
diff --git a/src/wp-includes/blocks/query-pagination-previous.php b/src/wp-includes/blocks/query-pagination-previous.php
index 676347de8e..4750649672 100644
--- a/src/wp-includes/blocks/query-pagination-previous.php
+++ b/src/wp-includes/blocks/query-pagination-previous.php
@@ -19,9 +19,13 @@ function render_block_core_query_pagination_previous( $attributes, $content, $bl
 	$page     = empty( $_GET[ $page_key ] ) ? 1 : (int) $_GET[ $page_key ];
 
 	$wrapper_attributes = get_block_wrapper_attributes();
-	$default_label      = __( '&laquo; Previous Page' );
+	$default_label      = __( 'Previous Page' );
 	$label              = isset( $attributes['label'] ) && ! empty( $attributes['label'] ) ? $attributes['label'] : $default_label;
-	$content            = '';
+	$pagination_arrow   = get_query_pagination_arrow( $block, false );
+	if ( $pagination_arrow ) {
+		$label = $pagination_arrow . $label;
+	}
+	$content = '';
 	// Check if the pagination is for Query that inherits the global context
 	// and handle appropriately.
 	if ( isset( $block->context['query']['inherit'] ) && $block->context['query']['inherit'] ) {
diff --git a/src/wp-includes/blocks/query-pagination-previous/block.json b/src/wp-includes/blocks/query-pagination-previous/block.json
index 78a53867d0..c73b924c3f 100644
--- a/src/wp-includes/blocks/query-pagination-previous/block.json
+++ b/src/wp-includes/blocks/query-pagination-previous/block.json
@@ -1,7 +1,7 @@
 {
 	"apiVersion": 2,
 	"name": "core/query-pagination-previous",
-	"title": "Query Pagination Previous",
+	"title": "Previous Page",
 	"category": "design",
 	"parent": [ "core/query-pagination" ],
 	"description": "Displays the previous posts page link.",
@@ -11,17 +11,24 @@
 			"type": "string"
 		}
 	},
-	"usesContext": [ "queryId", "query" ],
+	"usesContext": [ "queryId", "query", "paginationArrow" ],
 	"supports": {
 		"reusable": false,
 		"html": false,
 		"color": {
 			"gradients": true,
-			"link": true
+			"text": false
 		},
 		"typography": {
 			"fontSize": true,
-			"lineHeight": true
+			"lineHeight": true,
+			"__experimentalFontStyle": true,
+			"__experimentalFontWeight": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalTextTransform": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true
+			}
 		}
 	}
 }
diff --git a/src/wp-includes/blocks/query-pagination.php b/src/wp-includes/blocks/query-pagination.php
index a9f31bf78f..ae32242bc9 100644
--- a/src/wp-includes/blocks/query-pagination.php
+++ b/src/wp-includes/blocks/query-pagination.php
@@ -5,12 +5,35 @@
  * @package WordPress
  */
 
+/**
+ * Renders the `core/query-pagination` block on the server.
+ *
+ * @param array  $attributes Block attributes.
+ * @param string $content    Block default content.
+ *
+ * @return string Returns the wrapper for the Query pagination.
+ */
+function render_block_core_query_pagination( $attributes, $content ) {
+	if ( empty( trim( $content ) ) ) {
+		return '';
+	}
+
+	return sprintf(
+		'<div %1$s>%2$s</div>',
+		get_block_wrapper_attributes(),
+		$content
+	);
+}
+
 /**
  * Registers the `core/query-pagination` block on the server.
  */
 function register_block_core_query_pagination() {
 	register_block_type_from_metadata(
-		__DIR__ . '/query-pagination'
+		__DIR__ . '/query-pagination',
+		array(
+			'render_callback' => 'render_block_core_query_pagination',
+		)
 	);
 }
 add_action( 'init', 'register_block_core_query_pagination' );
diff --git a/src/wp-includes/blocks/query-pagination/block.json b/src/wp-includes/blocks/query-pagination/block.json
index c1de24977f..6732e425f3 100644
--- a/src/wp-includes/blocks/query-pagination/block.json
+++ b/src/wp-includes/blocks/query-pagination/block.json
@@ -1,12 +1,21 @@
 {
 	"apiVersion": 2,
 	"name": "core/query-pagination",
-	"title": "Query Pagination",
+	"title": "Pagination",
 	"category": "design",
 	"parent": [ "core/query" ],
 	"description": "Displays a paginated navigation to next/previous set of posts, when applicable.",
 	"textdomain": "default",
+	"attributes": {
+		"paginationArrow": {
+			"type": "string",
+			"default": "none"
+		}
+	},
 	"usesContext": [ "queryId", "query" ],
+	"providesContext": {
+		"paginationArrow": "paginationArrow"
+	},
 	"supports": {
 		"align": true,
 		"reusable": false,
@@ -14,6 +23,13 @@
 		"color": {
 			"gradients": true,
 			"link": true
+		},
+		"__experimentalLayout": {
+			"allowSwitching": false,
+			"allowInheriting": false,
+			"default": {
+				"type": "flex"
+			}
 		}
 	},
 	"editorStyle": "wp-block-query-pagination-editor",
diff --git a/src/wp-includes/blocks/query-title/block.json b/src/wp-includes/blocks/query-title/block.json
index 3e5d43fc50..5f737d5749 100644
--- a/src/wp-includes/blocks/query-title/block.json
+++ b/src/wp-includes/blocks/query-title/block.json
@@ -2,7 +2,7 @@
 	"apiVersion": 2,
 	"name": "core/query-title",
 	"title": "Query Title",
-	"category": "design",
+	"category": "theme",
 	"description": "Display the query title.",
 	"textdomain": "default",
 	"attributes": {
@@ -23,10 +23,22 @@
 		"color": {
 			"gradients": true
 		},
+		"spacing": {
+			"margin": true
+		},
 		"typography": {
 			"fontSize": true,
 			"lineHeight": true,
-			"__experimentalFontFamily": true
+			"__experimentalFontFamily": true,
+			"__experimentalFontStyle": true,
+			"__experimentalFontWeight": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalTextTransform": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true,
+				"fontAppearance": true,
+				"textTransform": true
+			}
 		}
 	},
 	"editorStyle": "wp-block-query-title-editor"
diff --git a/src/wp-includes/blocks/quote/block.json b/src/wp-includes/blocks/quote/block.json
index 9bae4dff96..ad3f199e0f 100644
--- a/src/wp-includes/blocks/quote/block.json
+++ b/src/wp-includes/blocks/quote/block.json
@@ -27,7 +27,20 @@
 		}
 	},
 	"supports": {
-		"anchor": true
+		"anchor": true,
+		"__experimentalSlashInserter": true,
+		"typography": {
+			"fontSize": true,
+			"lineHeight": true,
+			"__experimentalFontStyle": true,
+			"__experimentalFontWeight": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalTextTransform": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true,
+				"fontAppearance": true
+			}
+		}
 	},
 	"styles": [
 		{
@@ -35,6 +48,7 @@
 			"label": "Default",
 			"isDefault": true
 		},
+		{ "name": "plain", "label": "Plain" },
 		{ "name": "large", "label": "Large" }
 	],
 	"editorStyle": "wp-block-quote-editor",
diff --git a/src/wp-includes/blocks/search.php b/src/wp-includes/blocks/search.php
index eba67deeec..991e2fa1f8 100644
--- a/src/wp-includes/blocks/search.php
+++ b/src/wp-includes/blocks/search.php
@@ -27,53 +27,60 @@ function render_block_core_search( $attributes ) {
 		)
 	);
 
-	$input_id        = 'wp-block-search__input-' . ++$instance_id;
-	$classnames      = classnames_for_block_core_search( $attributes );
-	$show_label      = ( ! empty( $attributes['showLabel'] ) ) ? true : false;
-	$use_icon_button = ( ! empty( $attributes['buttonUseIcon'] ) ) ? true : false;
-	$show_input      = ( ! empty( $attributes['buttonPosition'] ) && 'button-only' === $attributes['buttonPosition'] ) ? false : true;
-	$show_button     = ( ! empty( $attributes['buttonPosition'] ) && 'no-button' === $attributes['buttonPosition'] ) ? false : true;
-	$label_markup    = '';
-	$input_markup    = '';
-	$button_markup   = '';
-	$inline_styles   = styles_for_block_core_search( $attributes );
-
-	if ( $show_label ) {
-		if ( ! empty( $attributes['label'] ) ) {
-			$label_markup = sprintf(
-				'<label for="%s" class="wp-block-search__label">%s</label>',
-				$input_id,
-				$attributes['label']
-			);
-		} else {
-			$label_markup = sprintf(
-				'<label for="%s" class="wp-block-search__label screen-reader-text">%s</label>',
-				$input_id,
-				__( 'Search' )
-			);
-		}
+	$input_id         = 'wp-block-search__input-' . ++$instance_id;
+	$classnames       = classnames_for_block_core_search( $attributes );
+	$show_label       = ( ! empty( $attributes['showLabel'] ) ) ? true : false;
+	$use_icon_button  = ( ! empty( $attributes['buttonUseIcon'] ) ) ? true : false;
+	$show_input       = ( ! empty( $attributes['buttonPosition'] ) && 'button-only' === $attributes['buttonPosition'] ) ? false : true;
+	$show_button      = ( ! empty( $attributes['buttonPosition'] ) && 'no-button' === $attributes['buttonPosition'] ) ? false : true;
+	$label_markup     = '';
+	$input_markup     = '';
+	$button_markup    = '';
+	$inline_styles    = styles_for_block_core_search( $attributes );
+	$color_classes    = get_color_classes_for_block_core_search( $attributes );
+	$is_button_inside = ! empty( $attributes['buttonPosition'] ) &&
+		'button-inside' === $attributes['buttonPosition'];
+	// Border color classes need to be applied to the elements that have a border color.
+	$border_color_classes = get_border_color_classes_for_block_core_search( $attributes );
+
+	$label_markup = sprintf(
+		'<label for="%1$s" class="wp-block-search__label screen-reader-text">%2$s</label>',
+		$input_id,
+		empty( $attributes['label'] ) ? __( 'Search' ) : esc_html( $attributes['label'] )
+	);
+	if ( $show_label && ! empty( $attributes['label'] ) ) {
+		$label_markup = sprintf(
+			'<label for="%1$s" class="wp-block-search__label">%2$s</label>',
+			$input_id,
+			esc_html( $attributes['label'] )
+		);
 	}
 
 	if ( $show_input ) {
-		$input_markup = sprintf(
-			'<input type="search" id="%s" class="wp-block-search__input" name="s" value="%s" placeholder="%s" %s required />',
+		$input_classes = ! $is_button_inside ? $border_color_classes : '';
+		$input_markup  = sprintf(
+			'<input type="search" id="%s" class="wp-block-search__input %s" name="s" value="%s" placeholder="%s" %s required />',
 			$input_id,
+			esc_attr( $input_classes ),
 			esc_attr( get_search_query() ),
 			esc_attr( $attributes['placeholder'] ),
-			$inline_styles['shared']
+			$inline_styles['input']
 		);
 	}
 
 	if ( $show_button ) {
 		$button_internal_markup = '';
-		$button_classes         = '';
+		$button_classes         = $color_classes;
 
+		if ( ! $is_button_inside ) {
+			$button_classes .= ' ' . $border_color_classes;
+		}
 		if ( ! $use_icon_button ) {
 			if ( ! empty( $attributes['buttonText'] ) ) {
-				$button_internal_markup = $attributes['buttonText'];
+				$button_internal_markup = esc_html( $attributes['buttonText'] );
 			}
 		} else {
-			$button_classes        .= 'has-icon';
+			$button_classes        .= ' has-icon';
 			$button_internal_markup =
 				'<svg id="search-icon" class="search-icon" viewBox="0 0 24 24" width="24" height="24">
 			        <path d="M13.5 6C10.5 6 8 8.5 8 11.5c0 1.1.3 2.1.9 3l-3.4 3 1 1.1 3.4-2.9c1 .9 2.2 1.4 3.6 1.4 3 0 5.5-2.5 5.5-5.5C19 8.5 16.5 6 13.5 6zm0 9.5c-2.2 0-4-1.8-4-4s1.8-4 4-4 4 1.8 4 4-1.8 4-4 4z"></path>
@@ -81,19 +88,21 @@ function render_block_core_search( $attributes ) {
 		}
 
 		$button_markup = sprintf(
-			'<button type="submit" class="wp-block-search__button %s"%s>%s</button>',
-			$button_classes,
-			$inline_styles['shared'],
+			'<button type="submit" class="wp-block-search__button %s" %s>%s</button>',
+			esc_attr( $button_classes ),
+			$inline_styles['button'],
 			$button_internal_markup
 		);
 	}
 
-	$field_markup       = sprintf(
-		'<div class="wp-block-search__inside-wrapper"%s>%s</div>',
+	$field_markup_classes = $is_button_inside ? $border_color_classes : '';
+	$field_markup         = sprintf(
+		'<div class="wp-block-search__inside-wrapper %s" %s>%s</div>',
+		esc_attr( $field_markup_classes ),
 		$inline_styles['wrapper'],
 		$input_markup . $button_markup
 	);
-	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $classnames ) );
+	$wrapper_attributes   = get_block_wrapper_attributes( array( 'class' => $classnames ) );
 
 	return sprintf(
 		'<form role="search" method="get" action="%s" %s>%s</form>',
@@ -169,8 +178,9 @@ function classnames_for_block_core_search( $attributes ) {
  * @return array Style HTML attribute.
  */
 function styles_for_block_core_search( $attributes ) {
-	$shared_styles  = array();
 	$wrapper_styles = array();
+	$button_styles  = array();
+	$input_styles   = array();
 
 	// Add width styles.
 	$has_width   = ! empty( $attributes['width'] ) && ! empty( $attributes['widthUnit'] );
@@ -188,26 +198,155 @@ function styles_for_block_core_search( $attributes ) {
 	$has_border_radius = ! empty( $attributes['style']['border']['radius'] );
 
 	if ( $has_border_radius ) {
-		// Shared style for button and input radius values.
+		$default_padding = '4px';
 		$border_radius   = $attributes['style']['border']['radius'];
-		$shared_styles[] = sprintf( 'border-radius: %spx;', esc_attr( $border_radius ) );
-
 		// Apply wrapper border radius if button placed inside.
-		$button_inside = ! empty( $attributes['buttonPosition'] ) &&
+		$is_button_inside = ! empty( $attributes['buttonPosition'] ) &&
+			'button-inside' === $attributes['buttonPosition'];
+
+		if ( is_array( $border_radius ) ) {
+			// Apply styles for individual corner border radii.
+			foreach ( $border_radius as $key => $value ) {
+				if ( null !== $value ) {
+					// Convert camelCase key to kebab-case.
+					$name = strtolower( preg_replace( '/(?<!^)[A-Z]/', '-$0', $key ) );
+
+					// Add shared styles for individual border radii for input & button.
+					$border_style    = sprintf(
+						'border-%s-radius: %s;',
+						esc_attr( $name ),
+						esc_attr( $value )
+					);
+					$input_styles[]  = $border_style;
+					$button_styles[] = $border_style;
+
+					// Add adjusted border radius styles for the wrapper element
+					// if button is positioned inside.
+					if ( $is_button_inside && intval( $value ) !== 0 ) {
+						$wrapper_styles[] = sprintf(
+							'border-%s-radius: calc(%s + %s);',
+							esc_attr( $name ),
+							esc_attr( $value ),
+							$default_padding
+						);
+					}
+				}
+			}
+		} else {
+			// Numeric check is for backwards compatibility purposes.
+			$border_radius   = is_numeric( $border_radius ) ? $border_radius . 'px' : $border_radius;
+			$border_style    = sprintf( 'border-radius: %s;', esc_attr( $border_radius ) );
+			$input_styles[]  = $border_style;
+			$button_styles[] = $border_style;
+
+			if ( $is_button_inside && intval( $border_radius ) !== 0 ) {
+				// Adjust wrapper border radii to maintain visual consistency
+				// with inner elements when button is positioned inside.
+				$wrapper_styles[] = sprintf(
+					'border-radius: calc(%s + %s);',
+					esc_attr( $border_radius ),
+					$default_padding
+				);
+			}
+		}
+	}
+
+	// Add border color styles.
+	$has_border_color = ! empty( $attributes['style']['border']['color'] );
+
+	if ( $has_border_color ) {
+		$border_color     = $attributes['style']['border']['color'];
+		$is_button_inside = ! empty( $attributes['buttonPosition'] ) &&
 			'button-inside' === $attributes['buttonPosition'];
 
-		if ( $button_inside ) {
-			// We adjust the border radius value for the outer wrapper element
-			// to make it visually consistent with the radius applied to inner
-			// elements.
-			$default_padding  = 4;
-			$adjusted_radius  = $border_radius + $default_padding;
-			$wrapper_styles[] = sprintf( 'border-radius: %dpx;', esc_attr( $adjusted_radius ) );
+		// Apply wrapper border color if button placed inside.
+		if ( $is_button_inside ) {
+			$wrapper_styles[] = sprintf( 'border-color: %s;', esc_attr( $border_color ) );
+		} else {
+			$button_styles[] = sprintf( 'border-color: %s;', esc_attr( $border_color ) );
+			$input_styles[]  = sprintf( 'border-color: %s;', esc_attr( $border_color ) );
 		}
 	}
 
+	// Add color styles.
+	$has_text_color = ! empty( $attributes['style']['color']['text'] );
+	if ( $has_text_color ) {
+		$button_styles[] = sprintf( 'color: %s;', esc_attr( $attributes['style']['color']['text'] ) );
+	}
+
+	$has_background_color = ! empty( $attributes['style']['color']['background'] );
+	if ( $has_background_color ) {
+		$button_styles[] = sprintf( 'background-color: %s;', esc_attr( $attributes['style']['color']['background'] ) );
+	}
+
+	$has_custom_gradient = ! empty( $attributes['style']['color']['gradient'] );
+	if ( $has_custom_gradient ) {
+		$button_styles[] = sprintf( 'background: %s;', $attributes['style']['color']['gradient'] );
+	}
+
 	return array(
-		'shared'  => ! empty( $shared_styles ) ? sprintf( ' style="%s"', implode( ' ', $shared_styles ) ) : '',
-		'wrapper' => ! empty( $wrapper_styles ) ? sprintf( ' style="%s"', implode( ' ', $wrapper_styles ) ) : '',
+		'input'   => ! empty( $input_styles ) ? sprintf( ' style="%s"', safecss_filter_attr( implode( ' ', $input_styles ) ) ) : '',
+		'button'  => ! empty( $button_styles ) ? sprintf( ' style="%s"', safecss_filter_attr( implode( ' ', $button_styles ) ) ) : '',
+		'wrapper' => ! empty( $wrapper_styles ) ? sprintf( ' style="%s"', safecss_filter_attr( implode( ' ', $wrapper_styles ) ) ) : '',
 	);
 }
+
+/**
+ * Returns border color classnames depending on whether there are named or custom border colors.
+ *
+ * @param array $attributes The block attributes.
+ *
+ * @return string The border color classnames to be applied to the block elements.
+ */
+function get_border_color_classes_for_block_core_search( $attributes ) {
+	$has_custom_border_color = ! empty( $attributes['style']['border']['color'] );
+	$border_color_classes    = ! empty( $attributes['borderColor'] ) ? sprintf( 'has-border-color has-%s-border-color', $attributes['borderColor'] ) : '';
+	// If there's a border color style and no `borderColor` text string, we still want to add the generic `has-border-color` class name to the element.
+	if ( $has_custom_border_color && empty( $attributes['borderColor'] ) ) {
+		$border_color_classes = 'has-border-color';
+	}
+	return $border_color_classes;
+}
+
+/**
+ * Returns color classnames depending on whether there are named or custom text and background colors.
+ *
+ * @param array $attributes The block attributes.
+ *
+ * @return string The color classnames to be applied to the block elements.
+ */
+function get_color_classes_for_block_core_search( $attributes ) {
+	$classnames = array();
+
+	// Text color.
+	$has_named_text_color  = ! empty( $attributes['textColor'] );
+	$has_custom_text_color = ! empty( $attributes['style']['color']['text'] );
+	if ( $has_named_text_color ) {
+		$classnames[] = sprintf( 'has-text-color has-%s-color', $attributes['textColor'] );
+	} elseif ( $has_custom_text_color ) {
+		// If a custom 'textColor' was selected instead of a preset, still add the generic `has-text-color` class.
+		$classnames[] = 'has-text-color';
+	}
+
+	// Background color.
+	$has_named_background_color  = ! empty( $attributes['backgroundColor'] );
+	$has_custom_background_color = ! empty( $attributes['style']['color']['background'] );
+	$has_named_gradient          = ! empty( $attributes['gradient'] );
+	$has_custom_gradient         = ! empty( $attributes['style']['color']['gradient'] );
+	if (
+		$has_named_background_color ||
+		$has_custom_background_color ||
+		$has_named_gradient ||
+		$has_custom_gradient
+	) {
+		$classnames[] = 'has-background';
+	}
+	if ( $has_named_background_color ) {
+		$classnames[] = sprintf( 'has-%s-background-color', $attributes['backgroundColor'] );
+	}
+	if ( $has_named_gradient ) {
+		$classnames[] = sprintf( 'has-%s-gradient-background', $attributes['gradient'] );
+	}
+
+	return implode( ' ', $classnames );
+}
diff --git a/src/wp-includes/blocks/search/block.json b/src/wp-includes/blocks/search/block.json
index b96f14f53c..d2b3e08e94 100644
--- a/src/wp-includes/blocks/search/block.json
+++ b/src/wp-includes/blocks/search/block.json
@@ -41,7 +41,12 @@
 	},
 	"supports": {
 		"align": [ "left", "center", "right" ],
+		"color": {
+			"gradients": true,
+			"__experimentalSkipSerialization": true
+		},
 		"__experimentalBorder": {
+			"color": true,
 			"radius": true,
 			"__experimentalSkipSerialization": true
 		},
diff --git a/src/wp-includes/blocks/site-logo.php b/src/wp-includes/blocks/site-logo.php
index ef24e73e1e..37a8417ea0 100644
--- a/src/wp-includes/blocks/site-logo.php
+++ b/src/wp-includes/blocks/site-logo.php
@@ -48,10 +48,6 @@ function render_block_core_site_logo( $attributes ) {
 		$classnames[] = $attributes['className'];
 	}
 
-	if ( ! empty( $attributes['align'] ) && in_array( $attributes['align'], array( 'center', 'left', 'right' ), true ) ) {
-		$classnames[] = "align{$attributes['align']}";
-	}
-
 	if ( empty( $attributes['width'] ) ) {
 		$classnames[] = 'is-default-size';
 	}
@@ -80,6 +76,23 @@ function register_block_core_site_logo_setting() {
 
 add_action( 'rest_api_init', 'register_block_core_site_logo_setting', 10 );
 
+/**
+ * Register a core site setting for a site icon
+ */
+function register_block_core_site_icon_setting() {
+	register_setting(
+		'general',
+		'site_icon',
+		array(
+			'show_in_rest' => true,
+			'type'         => 'integer',
+			'description'  => __( 'Site icon.' ),
+		)
+	);
+}
+
+add_action( 'rest_api_init', 'register_block_core_site_icon_setting', 10 );
+
 /**
  * Registers the `core/site-logo` block on the server.
  */
@@ -133,6 +146,12 @@ add_filter( 'pre_set_theme_mod_custom_logo', '_sync_custom_logo_to_site_logo' );
  * @param array $value     Updated theme mod settings.
  */
 function _delete_site_logo_on_remove_custom_logo( $old_value, $value ) {
+	global $_ignore_site_logo_changes;
+
+	if ( $_ignore_site_logo_changes ) {
+		return;
+	}
+
 	// If the custom_logo is being unset, it's being removed from theme mods.
 	if ( isset( $old_value['custom_logo'] ) && ! isset( $value['custom_logo'] ) ) {
 		delete_option( 'site_logo' );
@@ -143,6 +162,12 @@ function _delete_site_logo_on_remove_custom_logo( $old_value, $value ) {
  * Deletes the site logo when all theme mods are being removed.
  */
 function _delete_site_logo_on_remove_theme_mods() {
+	global $_ignore_site_logo_changes;
+
+	if ( $_ignore_site_logo_changes ) {
+		return;
+	}
+
 	if ( false !== get_theme_support( 'custom-logo' ) ) {
 		delete_option( 'site_logo' );
 	}
@@ -160,3 +185,21 @@ function _delete_site_logo_on_remove_custom_logo_on_setup_theme() {
 	add_action( "delete_option_theme_mods_$theme", '_delete_site_logo_on_remove_theme_mods' );
 }
 add_action( 'setup_theme', '_delete_site_logo_on_remove_custom_logo_on_setup_theme', 11 );
+
+/**
+ * Removes the custom_logo theme-mod when the site_logo option gets deleted.
+ */
+function _delete_custom_logo_on_remove_site_logo() {
+	global $_ignore_site_logo_changes;
+
+	// Prevent _delete_site_logo_on_remove_custom_logo and
+	// _delete_site_logo_on_remove_theme_mods from firing and causing an
+	// infinite loop.
+	$_ignore_site_logo_changes = true;
+
+	// Remove the custom logo.
+	remove_theme_mod( 'custom_logo' );
+
+	$_ignore_site_logo_changes = false;
+}
+add_action( 'delete_option_site_logo', '_delete_custom_logo_on_remove_site_logo' );
diff --git a/src/wp-includes/blocks/site-logo/block.json b/src/wp-includes/blocks/site-logo/block.json
index c40cfcdd2b..60ac8b5bea 100644
--- a/src/wp-includes/blocks/site-logo/block.json
+++ b/src/wp-includes/blocks/site-logo/block.json
@@ -2,13 +2,10 @@
 	"apiVersion": 2,
 	"name": "core/site-logo",
 	"title": "Site Logo",
-	"category": "layout",
-	"description": "Useful for displaying a graphic mark, design, or symbol to represent the site. Once a site logo is set, it can be reused in different places and templates. It should not be confused with the site icon, which is the small image used in the dashboard, browser tabs, public search results, etc, to help recognize a site.",
+	"category": "theme",
+	"description": "Display a graphic to represent this site. Update the block, and the changes apply everywhere it’s used. This is different than the site icon, which is the smaller image visible in your dashboard, browser tabs, etc used to help others recognize this site.",
 	"textdomain": "default",
 	"attributes": {
-		"align": {
-			"type": "string"
-		},
 		"width": {
 			"type": "number"
 		},
@@ -19,12 +16,27 @@
 		"linkTarget": {
 			"type": "string",
 			"default": "_self"
+		},
+		"shouldSyncIcon": {
+			"type": "boolean"
+		}
+	},
+	"example": {
+		"viewportWidth": 500,
+		"attributes": {
+			"width": 350,
+			"className": "block-editor-block-types-list__site-logo-example"
 		}
 	},
 	"supports": {
 		"html": false,
 		"align": true,
-		"alignWide": false
+		"alignWide": false,
+		"color": {
+			"__experimentalDuotone": "img",
+			"text": false,
+			"background": false
+		}
 	},
 	"styles": [
 		{
diff --git a/src/wp-includes/blocks/site-logo/editor-rtl.css b/src/wp-includes/blocks/site-logo/editor-rtl.css
index 0c8910804f..5046b5ca0f 100644
--- a/src/wp-includes/blocks/site-logo/editor-rtl.css
+++ b/src/wp-includes/blocks/site-logo/editor-rtl.css
@@ -40,6 +40,12 @@
  * React Native specific.
  * These variables do not appear to be used anywhere else.
  */
+/**
+*  Converts a hex value into the rgb equivalent.
+*
+* @param {string} hex - the hexadecimal value to convert
+* @return {string} comma separated rgb values
+*/
 /**
  * Breakpoint mixins
  */
@@ -69,23 +75,14 @@
  * Reset the WP Admin page styles for Gutenberg-like pages.
  */
 .wp-block[data-align=center] > .wp-block-site-logo {
+  display: table;
   margin-right: auto;
   margin-left: auto;
-  text-align: center;
 }
 
 .wp-block-site-logo a {
   pointer-events: none;
 }
-.wp-block-site-logo:not(.is-default-size) {
-  display: table;
-}
-.wp-block-site-logo.is-default-size {
-  width: 120px;
-}
-.wp-block-site-logo.is-default-size img {
-  width: 100%;
-}
 .wp-block-site-logo .custom-logo-link {
   cursor: inherit;
 }
@@ -97,26 +94,34 @@
 }
 .wp-block-site-logo img {
   display: block;
+  height: auto;
   max-width: 100%;
 }
-.wp-block-site-logo .components-placeholder {
-  justify-content: flex-start;
-  min-height: auto;
-  height: 120px;
-  padding: 12px;
+
+.wp-block-site-logo.wp-block-site-logo .components-placeholder,
+.wp-block-site-logo.wp-block-site-logo .components-resizable-box__container {
+  border-radius: inherit;
 }
-.wp-block-site-logo .components-placeholder .components-placeholder__label {
-  margin-top: 12px;
-  white-space: nowrap;
+.wp-block-site-logo.wp-block-site-logo.is-default-size .components-placeholder {
+  height: 120px;
+  width: 120px;
 }
-.wp-block-site-logo .components-placeholder .components-placeholder__label .block-editor-block-icon,
-.wp-block-site-logo .components-placeholder .components-placeholder__label > svg {
-  margin-left: 4px;
+.wp-block-site-logo.wp-block-site-logo .components-placeholder {
+  justify-content: center;
+  align-items: center;
+  box-shadow: none;
+  padding: 0;
+  min-height: 48px;
+  min-width: 48px;
+  height: 100%;
+  width: 100%;
+  color: currentColor;
+  background: transparent;
 }
-.wp-block-site-logo .components-placeholder .components-form-file-upload {
+.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-form-file-upload {
   display: none;
 }
-.wp-block-site-logo .components-placeholder .components-placeholder__preview {
+.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-placeholder__preview {
   position: absolute;
   top: 4px;
   left: 4px;
@@ -127,6 +132,65 @@
   align-items: center;
   justify-content: center;
 }
-.wp-block-site-logo .components-placeholder .components-drop-zone__content-text {
+.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-drop-zone__content-text {
   display: none;
+}
+.wp-block-site-logo.wp-block-site-logo .components-placeholder::before {
+  content: "";
+  display: block;
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  border: 1px dashed currentColor;
+  opacity: 0.4;
+  pointer-events: none;
+  border-radius: inherit;
+}
+.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-placeholder__fieldset {
+  width: auto;
+}
+.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button {
+  color: inherit;
+  padding: 0;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  width: 48px;
+  height: 48px;
+  border-radius: 50%;
+  position: relative;
+  visibility: hidden;
+  background: transparent;
+  transition: all 0.1s linear;
+}
+@media (prefers-reduced-motion: reduce) {
+  .wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button {
+    transition-duration: 0s;
+    transition-delay: 0s;
+  }
+}
+.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button > svg {
+  color: #fff;
+}
+.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-placeholder__illustration {
+  position: absolute;
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  width: 100%;
+  height: 100%;
+  stroke: currentColor;
+  stroke-dasharray: 3;
+  opacity: 0.4;
+}
+.wp-block-site-logo.wp-block-site-logo.is-selected .components-button.components-button {
+  background: var(--wp-admin-theme-color);
+  border-color: var(--wp-admin-theme-color);
+  border-style: solid;
+  color: #fff;
+  opacity: 1;
+  visibility: visible;
 }
\ No newline at end of file
diff --git a/src/wp-includes/blocks/site-logo/editor-rtl.min.css b/src/wp-includes/blocks/site-logo/editor-rtl.min.css
index 9e9df73b74..6911b907ac 100644
--- a/src/wp-includes/blocks/site-logo/editor-rtl.min.css
+++ b/src/wp-includes/blocks/site-logo/editor-rtl.min.css
@@ -1 +1 @@
-.wp-block[data-align=center]>.wp-block-site-logo{margin-right:auto;margin-left:auto;text-align:center}.wp-block-site-logo a{pointer-events:none}.wp-block-site-logo:not(.is-default-size){display:table}.wp-block-site-logo.is-default-size{width:120px}.wp-block-site-logo.is-default-size img{width:100%}.wp-block-site-logo .custom-logo-link{cursor:inherit}.wp-block-site-logo .custom-logo-link:focus{box-shadow:none}.wp-block-site-logo .custom-logo-link.is-transient img{opacity:.3}.wp-block-site-logo img{display:block;max-width:100%}.wp-block-site-logo .components-placeholder{justify-content:flex-start;min-height:auto;height:120px;padding:12px}.wp-block-site-logo .components-placeholder .components-placeholder__label{margin-top:12px;white-space:nowrap}.wp-block-site-logo .components-placeholder .components-placeholder__label .block-editor-block-icon,.wp-block-site-logo .components-placeholder .components-placeholder__label>svg{margin-left:4px}.wp-block-site-logo .components-placeholder .components-form-file-upload{display:none}.wp-block-site-logo .components-placeholder .components-placeholder__preview{position:absolute;top:4px;left:4px;bottom:4px;right:4px;background:hsla(0,0%,100%,.8);display:flex;align-items:center;justify-content:center}.wp-block-site-logo .components-placeholder .components-drop-zone__content-text{display:none}
\ No newline at end of file
+.wp-block[data-align=center]>.wp-block-site-logo{display:table;margin-right:auto;margin-left:auto}.wp-block-site-logo a{pointer-events:none}.wp-block-site-logo .custom-logo-link{cursor:inherit}.wp-block-site-logo .custom-logo-link:focus{box-shadow:none}.wp-block-site-logo .custom-logo-link.is-transient img{opacity:.3}.wp-block-site-logo img{display:block;height:auto;max-width:100%}.wp-block-site-logo.wp-block-site-logo .components-placeholder,.wp-block-site-logo.wp-block-site-logo .components-resizable-box__container{border-radius:inherit}.wp-block-site-logo.wp-block-site-logo.is-default-size .components-placeholder{height:120px;width:120px}.wp-block-site-logo.wp-block-site-logo .components-placeholder{justify-content:center;align-items:center;box-shadow:none;padding:0;min-height:48px;min-width:48px;height:100%;width:100%;color:currentColor;background:transparent}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-form-file-upload{display:none}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-placeholder__preview{position:absolute;top:4px;left:4px;bottom:4px;right:4px;background:hsla(0,0%,100%,.8);display:flex;align-items:center;justify-content:center}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-drop-zone__content-text{display:none}.wp-block-site-logo.wp-block-site-logo .components-placeholder:before{content:"";display:block;position:absolute;top:0;left:0;bottom:0;right:0;border:1px dashed;opacity:.4;pointer-events:none;border-radius:inherit}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-placeholder__fieldset{width:auto}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button{color:inherit;padding:0;display:flex;justify-content:center;align-items:center;width:48px;height:48px;border-radius:50%;position:relative;visibility:hidden;background:transparent;transition:all .1s linear}@media (prefers-reduced-motion:reduce){.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button{transition-duration:0s;transition-delay:0s}}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button>svg{color:#fff}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-placeholder__illustration{position:absolute;top:0;left:0;bottom:0;right:0;width:100%;height:100%;stroke:currentColor;stroke-dasharray:3;opacity:.4}.wp-block-site-logo.wp-block-site-logo.is-selected .components-button.components-button{background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color);border-style:solid;color:#fff;opacity:1;visibility:visible}
\ No newline at end of file
diff --git a/src/wp-includes/blocks/site-logo/editor.css b/src/wp-includes/blocks/site-logo/editor.css
index ec977aa055..395e7e09dc 100644
--- a/src/wp-includes/blocks/site-logo/editor.css
+++ b/src/wp-includes/blocks/site-logo/editor.css
@@ -40,6 +40,12 @@
  * React Native specific.
  * These variables do not appear to be used anywhere else.
  */
+/**
+*  Converts a hex value into the rgb equivalent.
+*
+* @param {string} hex - the hexadecimal value to convert
+* @return {string} comma separated rgb values
+*/
 /**
  * Breakpoint mixins
  */
@@ -69,23 +75,14 @@
  * Reset the WP Admin page styles for Gutenberg-like pages.
  */
 .wp-block[data-align=center] > .wp-block-site-logo {
+  display: table;
   margin-left: auto;
   margin-right: auto;
-  text-align: center;
 }
 
 .wp-block-site-logo a {
   pointer-events: none;
 }
-.wp-block-site-logo:not(.is-default-size) {
-  display: table;
-}
-.wp-block-site-logo.is-default-size {
-  width: 120px;
-}
-.wp-block-site-logo.is-default-size img {
-  width: 100%;
-}
 .wp-block-site-logo .custom-logo-link {
   cursor: inherit;
 }
@@ -97,26 +94,34 @@
 }
 .wp-block-site-logo img {
   display: block;
+  height: auto;
   max-width: 100%;
 }
-.wp-block-site-logo .components-placeholder {
-  justify-content: flex-start;
-  min-height: auto;
-  height: 120px;
-  padding: 12px;
+
+.wp-block-site-logo.wp-block-site-logo .components-placeholder,
+.wp-block-site-logo.wp-block-site-logo .components-resizable-box__container {
+  border-radius: inherit;
 }
-.wp-block-site-logo .components-placeholder .components-placeholder__label {
-  margin-top: 12px;
-  white-space: nowrap;
+.wp-block-site-logo.wp-block-site-logo.is-default-size .components-placeholder {
+  height: 120px;
+  width: 120px;
 }
-.wp-block-site-logo .components-placeholder .components-placeholder__label .block-editor-block-icon,
-.wp-block-site-logo .components-placeholder .components-placeholder__label > svg {
-  margin-right: 4px;
+.wp-block-site-logo.wp-block-site-logo .components-placeholder {
+  justify-content: center;
+  align-items: center;
+  box-shadow: none;
+  padding: 0;
+  min-height: 48px;
+  min-width: 48px;
+  height: 100%;
+  width: 100%;
+  color: currentColor;
+  background: transparent;
 }
-.wp-block-site-logo .components-placeholder .components-form-file-upload {
+.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-form-file-upload {
   display: none;
 }
-.wp-block-site-logo .components-placeholder .components-placeholder__preview {
+.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-placeholder__preview {
   position: absolute;
   top: 4px;
   right: 4px;
@@ -127,6 +132,65 @@
   align-items: center;
   justify-content: center;
 }
-.wp-block-site-logo .components-placeholder .components-drop-zone__content-text {
+.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-drop-zone__content-text {
   display: none;
+}
+.wp-block-site-logo.wp-block-site-logo .components-placeholder::before {
+  content: "";
+  display: block;
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  border: 1px dashed currentColor;
+  opacity: 0.4;
+  pointer-events: none;
+  border-radius: inherit;
+}
+.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-placeholder__fieldset {
+  width: auto;
+}
+.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button {
+  color: inherit;
+  padding: 0;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  width: 48px;
+  height: 48px;
+  border-radius: 50%;
+  position: relative;
+  visibility: hidden;
+  background: transparent;
+  transition: all 0.1s linear;
+}
+@media (prefers-reduced-motion: reduce) {
+  .wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button {
+    transition-duration: 0s;
+    transition-delay: 0s;
+  }
+}
+.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button > svg {
+  color: #fff;
+}
+.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-placeholder__illustration {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  stroke: currentColor;
+  stroke-dasharray: 3;
+  opacity: 0.4;
+}
+.wp-block-site-logo.wp-block-site-logo.is-selected .components-button.components-button {
+  background: var(--wp-admin-theme-color);
+  border-color: var(--wp-admin-theme-color);
+  border-style: solid;
+  color: #fff;
+  opacity: 1;
+  visibility: visible;
 }
\ No newline at end of file
diff --git a/src/wp-includes/blocks/site-logo/editor.min.css b/src/wp-includes/blocks/site-logo/editor.min.css
index 0b48ccd28a..e99bcc60e1 100644
--- a/src/wp-includes/blocks/site-logo/editor.min.css
+++ b/src/wp-includes/blocks/site-logo/editor.min.css
@@ -1 +1 @@
-.wp-block[data-align=center]>.wp-block-site-logo{margin-left:auto;margin-right:auto;text-align:center}.wp-block-site-logo a{pointer-events:none}.wp-block-site-logo:not(.is-default-size){display:table}.wp-block-site-logo.is-default-size{width:120px}.wp-block-site-logo.is-default-size img{width:100%}.wp-block-site-logo .custom-logo-link{cursor:inherit}.wp-block-site-logo .custom-logo-link:focus{box-shadow:none}.wp-block-site-logo .custom-logo-link.is-transient img{opacity:.3}.wp-block-site-logo img{display:block;max-width:100%}.wp-block-site-logo .components-placeholder{justify-content:flex-start;min-height:auto;height:120px;padding:12px}.wp-block-site-logo .components-placeholder .components-placeholder__label{margin-top:12px;white-space:nowrap}.wp-block-site-logo .components-placeholder .components-placeholder__label .block-editor-block-icon,.wp-block-site-logo .components-placeholder .components-placeholder__label>svg{margin-right:4px}.wp-block-site-logo .components-placeholder .components-form-file-upload{display:none}.wp-block-site-logo .components-placeholder .components-placeholder__preview{position:absolute;top:4px;right:4px;bottom:4px;left:4px;background:hsla(0,0%,100%,.8);display:flex;align-items:center;justify-content:center}.wp-block-site-logo .components-placeholder .components-drop-zone__content-text{display:none}
\ No newline at end of file
+.wp-block[data-align=center]>.wp-block-site-logo{display:table;margin-left:auto;margin-right:auto}.wp-block-site-logo a{pointer-events:none}.wp-block-site-logo .custom-logo-link{cursor:inherit}.wp-block-site-logo .custom-logo-link:focus{box-shadow:none}.wp-block-site-logo .custom-logo-link.is-transient img{opacity:.3}.wp-block-site-logo img{display:block;height:auto;max-width:100%}.wp-block-site-logo.wp-block-site-logo .components-placeholder,.wp-block-site-logo.wp-block-site-logo .components-resizable-box__container{border-radius:inherit}.wp-block-site-logo.wp-block-site-logo.is-default-size .components-placeholder{height:120px;width:120px}.wp-block-site-logo.wp-block-site-logo .components-placeholder{justify-content:center;align-items:center;box-shadow:none;padding:0;min-height:48px;min-width:48px;height:100%;width:100%;color:currentColor;background:transparent}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-form-file-upload{display:none}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-placeholder__preview{position:absolute;top:4px;right:4px;bottom:4px;left:4px;background:hsla(0,0%,100%,.8);display:flex;align-items:center;justify-content:center}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-drop-zone__content-text{display:none}.wp-block-site-logo.wp-block-site-logo .components-placeholder:before{content:"";display:block;position:absolute;top:0;right:0;bottom:0;left:0;border:1px dashed;opacity:.4;pointer-events:none;border-radius:inherit}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-placeholder__fieldset{width:auto}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button{color:inherit;padding:0;display:flex;justify-content:center;align-items:center;width:48px;height:48px;border-radius:50%;position:relative;visibility:hidden;background:transparent;transition:all .1s linear}@media (prefers-reduced-motion:reduce){.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button{transition-duration:0s;transition-delay:0s}}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-button.components-button>svg{color:#fff}.wp-block-site-logo.wp-block-site-logo .components-placeholder .components-placeholder__illustration{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;stroke:currentColor;stroke-dasharray:3;opacity:.4}.wp-block-site-logo.wp-block-site-logo.is-selected .components-button.components-button{background:var(--wp-admin-theme-color);border-color:var(--wp-admin-theme-color);border-style:solid;color:#fff;opacity:1;visibility:visible}
\ No newline at end of file
diff --git a/src/wp-includes/blocks/site-logo/style-rtl.css b/src/wp-includes/blocks/site-logo/style-rtl.css
index a9f9fdd63c..9062fc1144 100644
--- a/src/wp-includes/blocks/site-logo/style-rtl.css
+++ b/src/wp-includes/blocks/site-logo/style-rtl.css
@@ -40,6 +40,12 @@
  * React Native specific.
  * These variables do not appear to be used anywhere else.
  */
+/**
+*  Converts a hex value into the rgb equivalent.
+*
+* @param {string} hex - the hexadecimal value to convert
+* @return {string} comma separated rgb values
+*/
 /**
  * Breakpoint mixins
  */
@@ -78,9 +84,15 @@
   width: 120px;
   height: auto;
 }
-.wp-block-site-logo .aligncenter {
-  display: table;
+.wp-block-site-logo a,
+.wp-block-site-logo img {
+  border-radius: inherit;
+}
+.wp-block-site-logo.aligncenter {
+  margin-right: auto;
+  margin-left: auto;
+  text-align: center;
 }
-.wp-block-site-logo.is-style-rounded img {
+.wp-block-site-logo.is-style-rounded {
   border-radius: 9999px;
 }
\ No newline at end of file
diff --git a/src/wp-includes/blocks/site-logo/style-rtl.min.css b/src/wp-includes/blocks/site-logo/style-rtl.min.css
index 79b08e68b0..b77c9a0046 100644
--- a/src/wp-includes/blocks/site-logo/style-rtl.min.css
+++ b/src/wp-includes/blocks/site-logo/style-rtl.min.css
@@ -1 +1 @@
-.wp-block-site-logo{line-height:0}.wp-block-site-logo a{display:inline-block}.wp-block-site-logo.is-default-size img{width:120px;height:auto}.wp-block-site-logo .aligncenter{display:table}.wp-block-site-logo.is-style-rounded img{border-radius:9999px}
\ No newline at end of file
+.wp-block-site-logo{line-height:0}.wp-block-site-logo a{display:inline-block}.wp-block-site-logo.is-default-size img{width:120px;height:auto}.wp-block-site-logo a,.wp-block-site-logo img{border-radius:inherit}.wp-block-site-logo.aligncenter{margin-right:auto;margin-left:auto;text-align:center}.wp-block-site-logo.is-style-rounded{border-radius:9999px}
\ No newline at end of file
diff --git a/src/wp-includes/blocks/site-logo/style.css b/src/wp-includes/blocks/site-logo/style.css
index a9f9fdd63c..27ca9707b5 100644
--- a/src/wp-includes/blocks/site-logo/style.css
+++ b/src/wp-includes/blocks/site-logo/style.css
@@ -40,6 +40,12 @@
  * React Native specific.
  * These variables do not appear to be used anywhere else.
  */
+/**
+*  Converts a hex value into the rgb equivalent.
+*
+* @param {string} hex - the hexadecimal value to convert
+* @return {string} comma separated rgb values
+*/
 /**
  * Breakpoint mixins
  */
@@ -78,9 +84,15 @@
   width: 120px;
   height: auto;
 }
-.wp-block-site-logo .aligncenter {
-  display: table;
+.wp-block-site-logo a,
+.wp-block-site-logo img {
+  border-radius: inherit;
+}
+.wp-block-site-logo.aligncenter {
+  margin-left: auto;
+  margin-right: auto;
+  text-align: center;
 }
-.wp-block-site-logo.is-style-rounded img {
+.wp-block-site-logo.is-style-rounded {
   border-radius: 9999px;
 }
\ No newline at end of file
diff --git a/src/wp-includes/blocks/site-logo/style.min.css b/src/wp-includes/blocks/site-logo/style.min.css
index 79b08e68b0..2f58ac8399 100644
--- a/src/wp-includes/blocks/site-logo/style.min.css
+++ b/src/wp-includes/blocks/site-logo/style.min.css
@@ -1 +1 @@
-.wp-block-site-logo{line-height:0}.wp-block-site-logo a{display:inline-block}.wp-block-site-logo.is-default-size img{width:120px;height:auto}.wp-block-site-logo .aligncenter{display:table}.wp-block-site-logo.is-style-rounded img{border-radius:9999px}
\ No newline at end of file
+.wp-block-site-logo{line-height:0}.wp-block-site-logo a{display:inline-block}.wp-block-site-logo.is-default-size img{width:120px;height:auto}.wp-block-site-logo a,.wp-block-site-logo img{border-radius:inherit}.wp-block-site-logo.aligncenter{margin-left:auto;margin-right:auto;text-align:center}.wp-block-site-logo.is-style-rounded{border-radius:9999px}
\ No newline at end of file
diff --git a/src/wp-includes/blocks/site-tagline/block.json b/src/wp-includes/blocks/site-tagline/block.json
index 13ba84c968..61428975ed 100644
--- a/src/wp-includes/blocks/site-tagline/block.json
+++ b/src/wp-includes/blocks/site-tagline/block.json
@@ -2,7 +2,7 @@
 	"apiVersion": 2,
 	"name": "core/site-tagline",
 	"title": "Site Tagline",
-	"category": "design",
+	"category": "theme",
 	"description": "Describe in a few words what the website is about. The tagline can be used in search results or when sharing on social networks even if it's not displayed in the theme design.",
 	"keywords": [ "description" ],
 	"textdomain": "default",
@@ -12,6 +12,7 @@
 		}
 	},
 	"supports": {
+		"align": [ "wide", "full" ],
 		"html": false,
 		"color": {
 			"gradients": true
@@ -24,7 +25,13 @@
 			"fontSize": true,
 			"lineHeight": true,
 			"__experimentalFontFamily": true,
-			"__experimentalTextTransform": true
+			"__experimentalTextTransform": true,
+			"__experimentalFontStyle": true,
+			"__experimentalFontWeight": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true
+			}
 		}
 	},
 	"editorStyle": "wp-block-site-tagline-editor"
diff --git a/src/wp-includes/blocks/site-title.php b/src/wp-includes/blocks/site-title.php
index 079187f500..a7de6feffa 100644
--- a/src/wp-includes/blocks/site-title.php
+++ b/src/wp-includes/blocks/site-title.php
@@ -21,18 +21,31 @@ function render_block_core_site_title( $attributes ) {
 	$tag_name         = 'h1';
 	$align_class_name = empty( $attributes['textAlign'] ) ? '' : "has-text-align-{$attributes['textAlign']}";
 
+	$aria_current = is_home() || ( is_front_page() && 'page' === get_option( 'show_on_front' ) ) ? ' aria-current="page"' : '';
+
 	if ( isset( $attributes['level'] ) ) {
 		$tag_name = 0 === $attributes['level'] ? 'p' : 'h' . $attributes['level'];
 	}
 
-	$link               = sprintf( '<a href="%1$s" rel="home">%2$s</a>', get_bloginfo( 'url' ), $site_title );
+	if ( $attributes['isLink'] ) {
+		$link_attrs = array(
+			'href="' . get_bloginfo( 'url' ) . '"',
+			'rel="home"',
+			$aria_current,
+		);
+		if ( '_blank' === $attributes['linkTarget'] ) {
+			$link_attrs[] = 'target="_blank"';
+			$link_attrs[] = 'aria-label="' . esc_attr__( '(opens in a new tab)' ) . '"';
+		}
+		$site_title = sprintf( '<a %1$s>%2$s</a>', implode( ' ', $link_attrs ), $site_title );
+	}
 	$wrapper_attributes = get_block_wrapper_attributes( array( 'class' => $align_class_name ) );
 
 	return sprintf(
 		'<%1$s %2$s>%3$s</%1$s>',
 		$tag_name,
 		$wrapper_attributes,
-		$link
+		$site_title
 	);
 }
 
diff --git a/src/wp-includes/blocks/site-title/block.json b/src/wp-includes/blocks/site-title/block.json
index c43f078dac..7030ed68cf 100644
--- a/src/wp-includes/blocks/site-title/block.json
+++ b/src/wp-includes/blocks/site-title/block.json
@@ -2,8 +2,8 @@
 	"apiVersion": 2,
 	"name": "core/site-title",
 	"title": "Site Title",
-	"category": "design",
-	"description": "Displays and allows editing the name of the site. The site title usually appears in the browser title bar, in search results, and more. Also available in Settings > General.",
+	"category": "theme",
+	"description": "Displays the name of this site. Update the block, and the changes apply everywhere it’s used. This will also appear in the browser title bar and in search results.",
 	"textdomain": "default",
 	"attributes": {
 		"level": {
@@ -12,14 +12,24 @@
 		},
 		"textAlign": {
 			"type": "string"
+		},
+		"isLink": {
+			"type": "boolean",
+			"default": true
+		},
+		"linkTarget": {
+			"type": "string",
+			"default": "_self"
 		}
 	},
+	"example": {
+		"viewportWidth": 500
+	},
 	"supports": {
 		"align": [ "wide", "full" ],
 		"html": false,
 		"color": {
 			"gradients": true,
-			"text": false,
 			"link": true
 		},
 		"spacing": {
@@ -32,7 +42,15 @@
 			"__experimentalFontFamily": true,
 			"__experimentalTextTransform": true,
 			"__experimentalFontStyle": true,
-			"__experimentalFontWeight": true
+			"__experimentalFontWeight": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true,
+				"lineHeight": true,
+				"fontAppearance": true,
+				"letterSpacing": true,
+				"textTransform": true
+			}
 		}
 	},
 	"editorStyle": "wp-block-site-title-editor"
diff --git a/src/wp-includes/blocks/social-links/block.json b/src/wp-includes/blocks/social-links/block.json
index b559ae04fa..091b7ba614 100644
--- a/src/wp-includes/blocks/social-links/block.json
+++ b/src/wp-includes/blocks/social-links/block.json
@@ -40,7 +40,29 @@
 	},
 	"supports": {
 		"align": [ "left", "center", "right" ],
-		"anchor": true
+		"anchor": true,
+		"__experimentalExposeControlsToChildren": true,
+		"__experimentalLayout": {
+			"allowSwitching": false,
+			"allowInheriting": false,
+			"default": {
+				"type": "flex"
+			}
+		},
+		"spacing": {
+			"blockGap": true,
+			"margin": [ "top", "bottom" ],
+			"units": [
+				"px",
+				"em",
+				"rem",
+				"vh",
+				"vw"
+			],
+			"__experimentalDefaultControls": {
+				"blockGap": true
+			}
+		}
 	},
 	"styles": [
 		{ "name": "default", "label": "Default", "isDefault": true },
diff --git a/src/wp-includes/blocks/table/block.json b/src/wp-includes/blocks/table/block.json
index 01e5c58520..2890d09545 100644
--- a/src/wp-includes/blocks/table/block.json
+++ b/src/wp-includes/blocks/table/block.json
@@ -3,7 +3,7 @@
 	"name": "core/table",
 	"title": "Table",
 	"category": "text",
-	"description": "Insert a table — perfect for sharing charts and data.",
+	"description": "Create structured content in rows and columns to display information.",
 	"textdomain": "default",
 	"attributes": {
 		"hasFixedLayout": {
@@ -129,6 +129,17 @@
 			"__experimentalSkipSerialization": true,
 			"gradients": true
 		},
+		"typography": {
+			"fontSize": true,
+			"lineHeight": true,
+			"__experimentalFontStyle": true,
+			"__experimentalFontWeight": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalTextTransform": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true
+			}
+		},
 		"__experimentalBorder": {
 			"__experimentalSkipSerialization": true,
 			"color": true,
diff --git a/src/wp-includes/blocks/tag-cloud.php b/src/wp-includes/blocks/tag-cloud.php
index cdebc92271..0658998d4e 100644
--- a/src/wp-includes/blocks/tag-cloud.php
+++ b/src/wp-includes/blocks/tag-cloud.php
@@ -17,6 +17,7 @@ function render_block_core_tag_cloud( $attributes ) {
 		'echo'       => false,
 		'taxonomy'   => $attributes['taxonomy'],
 		'show_count' => $attributes['showTagCounts'],
+		'number'     => $attributes['numberOfTags'],
 	);
 	$tag_cloud = wp_tag_cloud( $args );
 
diff --git a/src/wp-includes/blocks/tag-cloud/block.json b/src/wp-includes/blocks/tag-cloud/block.json
index e394a53223..dad4dfdd40 100644
--- a/src/wp-includes/blocks/tag-cloud/block.json
+++ b/src/wp-includes/blocks/tag-cloud/block.json
@@ -6,6 +6,12 @@
 	"description": "A cloud of your most used tags.",
 	"textdomain": "default",
 	"attributes": {
+		"numberOfTags": {
+			"type": "number",
+			"default": 45,
+			"minimum": 1,
+			"maximum": 100
+		},
 		"taxonomy": {
 			"type": "string",
 			"default": "post_tag"
diff --git a/src/wp-includes/blocks/template-part.php b/src/wp-includes/blocks/template-part.php
new file mode 100644
index 0000000000..20bc6900f8
--- /dev/null
+++ b/src/wp-includes/blocks/template-part.php
@@ -0,0 +1,198 @@
+<?php
+/**
+ * Server-side rendering of the `core/template-part` block.
+ *
+ * @package WordPress
+ */
+
+/**
+ * Renders the `core/template-part` block on the server.
+ *
+ * @param array $attributes The block attributes.
+ *
+ * @return string The render.
+ */
+function render_block_core_template_part( $attributes ) {
+	static $seen_ids = array();
+
+	$template_part_id = null;
+	$content          = null;
+	$area             = WP_TEMPLATE_PART_AREA_UNCATEGORIZED;
+
+	if (
+		isset( $attributes['slug'] ) &&
+		isset( $attributes['theme'] ) &&
+		wp_get_theme()->get_stylesheet() === $attributes['theme']
+	) {
+		$template_part_id    = $attributes['theme'] . '//' . $attributes['slug'];
+		$template_part_query = new WP_Query(
+			array(
+				'post_type'      => 'wp_template_part',
+				'post_status'    => 'publish',
+				'post_name__in'  => array( $attributes['slug'] ),
+				'tax_query'      => array(
+					array(
+						'taxonomy' => 'wp_theme',
+						'field'    => 'slug',
+						'terms'    => $attributes['theme'],
+					),
+				),
+				'posts_per_page' => 1,
+				'no_found_rows'  => true,
+			)
+		);
+		$template_part_post  = $template_part_query->have_posts() ? $template_part_query->next_post() : null;
+		if ( $template_part_post ) {
+			// A published post might already exist if this template part was customized elsewhere
+			// or if it's part of a customized template.
+			$content    = $template_part_post->post_content;
+			$area_terms = get_the_terms( $template_part_post, 'wp_template_part_area' );
+			if ( ! is_wp_error( $area_terms ) && false !== $area_terms ) {
+				$area = $area_terms[0]->name;
+			}
+			/**
+			 * Fires when a block template part is loaded from a template post stored in the database.
+			 *
+			 * @since 5.9.0
+			 *
+			 * @param string  $template_part_id   The requested template part namespaced to the theme.
+			 * @param array   $attributes         The block attributes.
+			 * @param WP_Post $template_part_post The template part post object.
+			 * @param string  $content            The template part content.
+			 */
+			do_action( 'render_block_core_template_part_post', $template_part_id, $attributes, $template_part_post, $content );
+		} else {
+			// Else, if the template part was provided by the active theme,
+			// render the corresponding file content.
+			$parent_theme_folders        = get_block_theme_folders( get_template() );
+			$child_theme_folders         = get_block_theme_folders( get_stylesheet() );
+			$child_theme_part_file_path  = get_theme_file_path( '/' . $child_theme_folders['wp_template_part'] . '/' . $attributes['slug'] . '.html' );
+			$parent_theme_part_file_path = get_theme_file_path( '/' . $parent_theme_folders['wp_template_part'] . '/' . $attributes['slug'] . '.html' );
+			$template_part_file_path     = 0 === validate_file( $attributes['slug'] ) && file_exists( $child_theme_part_file_path ) ? $child_theme_part_file_path : $parent_theme_part_file_path;
+			if ( 0 === validate_file( $attributes['slug'] ) && file_exists( $template_part_file_path ) ) {
+				$content = file_get_contents( $template_part_file_path );
+				$content = is_string( $content ) && '' !== $content
+						? _inject_theme_attribute_in_block_template_content( $content )
+						: '';
+			}
+
+			if ( '' !== $content && null !== $content ) {
+				/**
+				 * Fires when a block template part is loaded from a template part in the theme.
+				 *
+				 * @since 5.9.0
+				 *
+				 * @param string $template_part_id        The requested template part namespaced to the theme.
+				 * @param array  $attributes              The block attributes.
+				 * @param string $template_part_file_path Absolute path to the template path.
+				 * @param string $content                 The template part content.
+				 */
+				do_action( 'render_block_core_template_part_file', $template_part_id, $attributes, $template_part_file_path, $content );
+			} else {
+				/**
+				 * Fires when a requested block template part does not exist in the database nor in the theme.
+				 *
+				 * @since 5.9.0
+				 *
+				 * @param string $template_part_id        The requested template part namespaced to the theme.
+				 * @param array  $attributes              The block attributes.
+				 * @param string $template_part_file_path Absolute path to the not found template path.
+				 */
+				do_action( 'render_block_core_template_part_none', $template_part_id, $attributes, $template_part_file_path );
+			}
+		}
+	}
+
+	if ( is_null( $content ) && is_user_logged_in() ) {
+		if ( ! isset( $attributes['slug'] ) ) {
+			// If there is no slug this is a placeholder and we dont want to return any message.
+			return;
+		}
+		return sprintf(
+			/* translators: %s: Template part slug. */
+			__( 'Template part has been deleted or is unavailable: %s' ),
+			$attributes['slug']
+		);
+	}
+
+	if ( isset( $seen_ids[ $template_part_id ] ) ) {
+		// WP_DEBUG_DISPLAY must only be honored when WP_DEBUG. This precedent
+		// is set in `wp_debug_mode()`.
+		$is_debug = defined( 'WP_DEBUG' ) && WP_DEBUG &&
+			defined( 'WP_DEBUG_DISPLAY' ) && WP_DEBUG_DISPLAY;
+
+		return $is_debug ?
+			// translators: Visible only in the front end, this warning takes the place of a faulty block.
+			__( '[block rendering halted]' ) :
+			'';
+	}
+
+	// Run through the actions that are typically taken on the_content.
+	$seen_ids[ $template_part_id ] = true;
+	$content                       = do_blocks( $content );
+	unset( $seen_ids[ $template_part_id ] );
+	$content = wptexturize( $content );
+	$content = convert_smilies( $content );
+	$content = shortcode_unautop( $content );
+	$content = wp_filter_content_tags( $content );
+	$content = do_shortcode( $content );
+
+	// Handle embeds for block template parts.
+	global $wp_embed;
+	$content = $wp_embed->autoembed( $content );
+
+	if ( empty( $attributes['tagName'] ) ) {
+		$defined_areas = get_allowed_block_template_part_areas();
+		$area_tag      = 'div';
+		foreach ( $defined_areas as $defined_area ) {
+			if ( $defined_area['area'] === $area && isset( $defined_area['area_tag'] ) ) {
+				$area_tag = $defined_area['area_tag'];
+			}
+		}
+		$html_tag = $area_tag;
+	} else {
+		$html_tag = esc_attr( $attributes['tagName'] );
+	}
+	$wrapper_attributes = get_block_wrapper_attributes();
+
+	return "<$html_tag $wrapper_attributes>" . str_replace( ']]>', ']]&gt;', $content ) . "</$html_tag>";
+}
+
+/**
+ * Returns an array of variation objects for the template part block.
+ *
+ * @return array Array containing the block variation objects.
+ */
+function build_template_part_block_variations() {
+	$variations    = array();
+	$defined_areas = get_allowed_block_template_part_areas();
+	foreach ( $defined_areas as $area ) {
+		if ( 'uncategorized' !== $area['area'] ) {
+			$variations[] = array(
+				'name'        => $area['area'],
+				'title'       => $area['label'],
+				'description' => $area['description'],
+				'attributes'  => array(
+					'area' => $area['area'],
+				),
+				'scope'       => array( 'inserter' ),
+				'icon'        => $area['icon'],
+			);
+		}
+	}
+	return $variations;
+}
+
+/**
+ * Registers the `core/template-part` block on the server.
+ */
+function register_block_core_template_part() {
+	register_block_type_from_metadata(
+		__DIR__ . '/template-part',
+		array(
+			'render_callback' => 'render_block_core_template_part',
+			'variations'      => build_template_part_block_variations(),
+		)
+	);
+}
+add_action( 'init', 'register_block_core_template_part' );
diff --git a/src/wp-includes/blocks/template-part/block.json b/src/wp-includes/blocks/template-part/block.json
new file mode 100644
index 0000000000..1f78e8febd
--- /dev/null
+++ b/src/wp-includes/blocks/template-part/block.json
@@ -0,0 +1,28 @@
+{
+	"apiVersion": 2,
+	"name": "core/template-part",
+	"title": "Template Part",
+	"category": "theme",
+	"description": "Edit the different global regions of your site, like the header, footer, sidebar, or create your own.",
+	"textdomain": "default",
+	"attributes": {
+		"slug": {
+			"type": "string"
+		},
+		"theme": {
+			"type": "string"
+		},
+		"tagName": {
+			"type": "string"
+		},
+		"area": {
+			"type": "string"
+		}
+	},
+	"supports": {
+		"align": true,
+		"html": false,
+		"reusable": false
+	},
+	"editorStyle": "wp-block-template-part-editor"
+}
diff --git a/src/wp-includes/blocks/term-description.php b/src/wp-includes/blocks/term-description.php
new file mode 100644
index 0000000000..4f1cd7e518
--- /dev/null
+++ b/src/wp-includes/blocks/term-description.php
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Server-side rendering of the `core/term-description` block.
+ *
+ * @package WordPress
+ */
+
+/**
+ * Renders the `core/term-description` block on the server.
+ *
+ * @param array $attributes Block attributes.
+ *
+ * @return string Returns the description of the current taxonomy term, if available
+ */
+function render_block_core_term_description( $attributes ) {
+	$term_description = '';
+
+	if ( is_category() || is_tag() || is_tax() ) {
+		$term_description = term_description();
+	}
+
+	if ( empty( $term_description ) ) {
+		return '';
+	}
+
+	$extra_attributes   = ( isset( $attributes['textAlign'] ) )
+		? array( 'class' => 'has-text-align-' . $attributes['textAlign'] )
+		: array();
+	$wrapper_attributes = get_block_wrapper_attributes( $extra_attributes );
+
+	return '<div ' . $wrapper_attributes . '>' . $term_description . '</div>';
+}
+
+/**
+ * Registers the `core/term-description` block on the server.
+ */
+function register_block_core_term_description() {
+	register_block_type_from_metadata(
+		__DIR__ . '/term-description',
+		array(
+			'render_callback' => 'render_block_core_term_description',
+		)
+	);
+}
+add_action( 'init', 'register_block_core_term_description' );
diff --git a/src/wp-includes/blocks/term-description/block.json b/src/wp-includes/blocks/term-description/block.json
new file mode 100644
index 0000000000..608ae1a242
--- /dev/null
+++ b/src/wp-includes/blocks/term-description/block.json
@@ -0,0 +1,28 @@
+{
+	"apiVersion": 2,
+	"name": "core/term-description",
+	"title": "Term Description",
+	"category": "theme",
+	"description": "Display the description of categories, tags and custom taxonomies when viewing an archive.",
+	"textdomain": "default",
+	"attributes": {
+		"textAlign": {
+			"type": "string"
+		}
+	},
+	"supports": {
+		"align": [ "wide", "full" ],
+		"html": false,
+		"color": {
+			"link": true
+		},
+		"typography": {
+			"fontSize": true,
+			"lineHeight": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true
+			}
+		}
+	},
+	"editorStyle": "wp-block-term-description-editor"
+}
diff --git a/src/wp-includes/blocks/verse/block.json b/src/wp-includes/blocks/verse/block.json
index ec080e7c1e..4260fb8e77 100644
--- a/src/wp-includes/blocks/verse/block.json
+++ b/src/wp-includes/blocks/verse/block.json
@@ -27,7 +27,16 @@
 		},
 		"typography": {
 			"fontSize": true,
-			"__experimentalFontFamily": true
+			"__experimentalFontFamily": true,
+			"lineHeight": true,
+			"__experimentalFontStyle": true,
+			"__experimentalFontWeight": true,
+			"__experimentalLetterSpacing": true,
+			"__experimentalTextTransform": true,
+			"__experimentalDefaultControls": {
+				"fontSize": true,
+				"fontAppearance": true
+			}
 		},
 		"spacing": {
 			"padding": true
diff --git a/src/wp-includes/blocks/widget-group.php b/src/wp-includes/blocks/widget-group.php
new file mode 100644
index 0000000000..6cf6442346
--- /dev/null
+++ b/src/wp-includes/blocks/widget-group.php
@@ -0,0 +1,78 @@
+<?php
+/**
+ * Server-side rendering of the `core/widget-group` block.
+ *
+ * @package WordPress
+ */
+
+/**
+ * Renders the 'core/widget-group' block.
+ *
+ * @param array    $attributes The block attributes.
+ * @param string   $content The block content.
+ * @param WP_Block $block The block.
+ *
+ * @return string Rendered block.
+ */
+function render_block_core_widget_group( $attributes, $content, $block ) {
+	global $wp_registered_sidebars, $_sidebar_being_rendered;
+
+	if ( isset( $wp_registered_sidebars[ $_sidebar_being_rendered ] ) ) {
+		$before_title = $wp_registered_sidebars[ $_sidebar_being_rendered ]['before_title'];
+		$after_title  = $wp_registered_sidebars[ $_sidebar_being_rendered ]['after_title'];
+	} else {
+		$before_title = '<h2 class="widget-title">';
+		$after_title  = '</h2>';
+	}
+
+	$html = '';
+
+	if ( ! empty( $attributes['title'] ) ) {
+		$html .= $before_title . $attributes['title'] . $after_title;
+	}
+
+	$html .= '<div class="wp-widget-group__inner-blocks">';
+	foreach ( $block->inner_blocks as $inner_block ) {
+		$html .= $inner_block->render();
+	}
+	$html .= '</div>';
+
+	return $html;
+}
+
+/**
+ * Registers the 'core/widget-group' block.
+ */
+function register_block_core_widget_group() {
+	register_block_type_from_metadata(
+		__DIR__ . '/widget-group',
+		array(
+			'render_callback' => 'render_block_core_widget_group',
+		)
+	);
+}
+
+add_action( 'init', 'register_block_core_widget_group' );
+
+/**
+ * Make a note of the sidebar being rendered before WordPress starts rendering
+ * it. This lets us get to the current sidebar in
+ * render_block_core_widget_group().
+ *
+ * @param int|string $index       Index, name, or ID of the dynamic sidebar.
+ */
+function note_sidebar_being_rendered( $index ) {
+	global $_sidebar_being_rendered;
+	$_sidebar_being_rendered = $index;
+}
+add_action( 'dynamic_sidebar_before', 'note_sidebar_being_rendered' );
+
+/**
+ * Clear whatever we set in note_sidebar_being_rendered() after WordPress
+ * finishes rendering a sidebar.
+ */
+function discard_sidebar_being_rendered() {
+	global $_sidebar_being_rendered;
+	unset( $_sidebar_being_rendered );
+}
+add_action( 'dynamic_sidebar_after', 'discard_sidebar_being_rendered' );
diff --git a/src/wp-includes/blocks/widget-group/block.json b/src/wp-includes/blocks/widget-group/block.json
new file mode 100644
index 0000000000..ec48d90eda
--- /dev/null
+++ b/src/wp-includes/blocks/widget-group/block.json
@@ -0,0 +1,18 @@
+{
+	"apiVersion": 2,
+	"name": "core/widget-group",
+	"category": "widgets",
+	"attributes": {
+		"title": {
+			"type": "string"
+		}
+	},
+	"supports": {
+		"html": false,
+		"inserter": true,
+		"customClassName": true,
+		"reusable": false
+	},
+	"editorStyle": "wp-block-widget-group-editor",
+	"style": "wp-block-widget-group"
+}
diff --git a/src/wp-includes/bookmark-template.php b/src/wp-includes/bookmark-template.php
index 4a156a76cf..cd07204ad9 100644
--- a/src/wp-includes/bookmark-template.php
+++ b/src/wp-includes/bookmark-template.php
@@ -102,13 +102,24 @@ function _walk_bookmarks( $bookmarks, $args = '' ) {
 			$title = ' title="' . $title . '"';
 		}
 		$rel = $bookmark->link_rel;
-		if ( '' !== $rel ) {
-			$rel = ' rel="' . esc_attr( $rel ) . '"';
-		}
+
 		$target = $bookmark->link_target;
 		if ( '' !== $target ) {
+			if ( is_string( $rel ) && '' !== $rel ) {
+				if ( ! str_contains( $rel, 'noopener' ) ) {
+					$rel = trim( $rel ) . ' noopener';
+				}
+			} else {
+				$rel = 'noopener';
+			}
+
 			$target = ' target="' . $target . '"';
 		}
+
+		if ( '' !== $rel ) {
+			$rel = ' rel="' . esc_attr( $rel ) . '"';
+		}
+
 		$output .= '<a href="' . $the_link . '"' . $rel . $title . $target . '>';
 
 		$output .= $parsed_args['link_before'];
diff --git a/src/wp-includes/capabilities.php b/src/wp-includes/capabilities.php
index 3ff0481fd4..5ee344b390 100644
--- a/src/wp-includes/capabilities.php
+++ b/src/wp-includes/capabilities.php
@@ -888,7 +888,7 @@ function get_super_admins() {
  * @return bool Whether the user is a site admin.
  */
 function is_super_admin( $user_id = false ) {
-	if ( ! $user_id || get_current_user_id() == $user_id ) {
+	if ( ! $user_id ) {
 		$user = wp_get_current_user();
 	} else {
 		$user = get_userdata( $user_id );
diff --git a/src/wp-includes/category-template.php b/src/wp-includes/category-template.php
index 38c52a79a9..76ed7ea04f 100644
--- a/src/wp-includes/category-template.php
+++ b/src/wp-includes/category-template.php
@@ -661,9 +661,9 @@ function wp_list_categories( $args = '' ) {
 	 *
 	 * @since 2.1.0
 	 *
-	 * @param string $output HTML output.
-	 * @param array  $args   An array of taxonomy-listing arguments. See wp_list_categories()
-	 *                       for information on accepted arguments.
+	 * @param string       $output HTML output.
+	 * @param array|string $args   An array or query string of taxonomy-listing arguments. See
+	 *                             wp_list_categories() for information on accepted arguments.
 	 */
 	$html = apply_filters( 'wp_list_categories', $output, $args );
 
@@ -737,9 +737,9 @@ function wp_tag_cloud( $args = '' ) {
 
 	foreach ( $tags as $key => $tag ) {
 		if ( 'edit' === $args['link'] ) {
-			$link = get_edit_term_link( $tag->term_id, $tag->taxonomy, $args['post_type'] );
+			$link = get_edit_term_link( $tag, $tag->taxonomy, $args['post_type'] );
 		} else {
-			$link = get_term_link( (int) $tag->term_id, $tag->taxonomy );
+			$link = get_term_link( $tag, $tag->taxonomy );
 		}
 
 		if ( is_wp_error( $link ) ) {
diff --git a/src/wp-includes/class-simplepie.php b/src/wp-includes/class-simplepie.php
index ff55274509..a392e54cd9 100644
--- a/src/wp-includes/class-simplepie.php
+++ b/src/wp-includes/class-simplepie.php
@@ -68,7 +68,7 @@ spl_autoload_register( 'wp_simplepie_autoload' );
  * POSSIBILITY OF SUCH DAMAGE.
  *
  * @package SimplePie
- * @version 1.5.6
+ * @version 1.5.8
  * @copyright 2004-2017 Ryan Parman, Sam Sneddon, Ryan McCue
  * @author Ryan Parman
  * @author Sam Sneddon
@@ -85,7 +85,7 @@ define('SIMPLEPIE_NAME', 'SimplePie');
 /**
  * SimplePie Version
  */
-define('SIMPLEPIE_VERSION', '1.5.6');
+define('SIMPLEPIE_VERSION', '1.5.8');
 
 /**
  * SimplePie Build
@@ -459,6 +459,13 @@ class SimplePie
 	 */
 	public $error;
 
+	/**
+	 * @var int HTTP status code
+	 * @see SimplePie::status_code()
+	 * @access private
+	 */
+	public $status_code;
+
 	/**
 	 * @var object Instance of SimplePie_Sanitize (or other class)
 	 * @see SimplePie::set_sanitize_class()
@@ -943,6 +950,39 @@ class SimplePie
 		$this->cache_location = (string) $location;
 	}
 
+	/**
+	 * Return the filename (i.e. hash, without path and without extension) of the file to cache a given URL.
+	 * @param string $url The URL of the feed to be cached.
+	 * @return string A filename (i.e. hash, without path and without extension).
+	 */
+	public function get_cache_filename($url)
+	{
+		// Append custom parameters to the URL to avoid cache pollution in case of multiple calls with different parameters.
+		$url .= $this->force_feed ? '#force_feed' : '';
+		$options = array();
+		if ($this->timeout != 10)
+		{
+			$options[CURLOPT_TIMEOUT] = $this->timeout;
+		}
+		if ($this->useragent !== SIMPLEPIE_USERAGENT)
+		{
+			$options[CURLOPT_USERAGENT] = $this->useragent;
+		}
+		if (!empty($this->curl_options))
+		{
+			foreach ($this->curl_options as $k => $v)
+			{
+				$options[$k] = $v;
+			}
+		}
+		if (!empty($options))
+		{
+			ksort($options);
+			$url .= '#' . urlencode(var_export($options, true));
+		}
+		return call_user_func($this->cache_name_function, $url);
+	}
+
 	/**
 	 * Set whether feed items should be sorted into reverse chronological order
 	 *
@@ -1181,6 +1221,7 @@ class SimplePie
 			$this->strip_attributes(false);
 			$this->add_attributes(false);
 			$this->set_image_handler(false);
+			$this->set_https_domains(array());
 		}
 	}
 
@@ -1283,6 +1324,19 @@ class SimplePie
 		$this->sanitize->set_url_replacements($element_attribute);
 	}
 
+	/**
+	 * Set the list of domains for which to force HTTPS.
+	 * @see SimplePie_Sanitize::set_https_domains()
+	 * @param array List of HTTPS domains. Example array('biz', 'example.com', 'example.org', 'www.example.net').
+	 */
+	public function set_https_domains($domains = array())
+	{
+		if (is_array($domains))
+		{
+			$this->sanitize->set_https_domains($domains);
+		}
+	}
+
 	/**
 	 * Set the handler to enable the display of cached images.
 	 *
@@ -1408,8 +1462,8 @@ class SimplePie
 			// Decide whether to enable caching
 			if ($this->cache && $parsed_feed_url['scheme'] !== '')
 			{
-				$url = $this->feed_url . ($this->force_feed ? '#force_feed' : '');
-				$cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, call_user_func($this->cache_name_function, $url), 'spc'));
+				$filename = $this->get_cache_filename($this->feed_url);
+				$cache = $this->registry->call('Cache', 'get_handler', array($this->cache_location, $filename, 'spc'));
 			}
 
 			// Fetch the data via SimplePie_File into $this->raw_data
@@ -1549,7 +1603,7 @@ class SimplePie
 	 * Fetch the data via SimplePie_File
 	 *
 	 * If the data is already cached, attempt to fetch it from there instead
-	 * @param SimplePie_Cache|false $cache Cache handler, or false to not load from the cache
+	 * @param SimplePie_Cache_Base|false $cache Cache handler, or false to not load from the cache
 	 * @return array|true Returns true if the data was loaded from the cache, or an array of HTTP headers and sniffed type
 	 */
 	protected function fetch_data(&$cache)
@@ -1612,6 +1666,7 @@ class SimplePie
 						}
 
 						$file = $this->registry->create('File', array($this->feed_url, $this->timeout/10, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options));
+						$this->status_code = $file->status_code;
 
 						if ($file->success)
 						{
@@ -1666,6 +1721,8 @@ class SimplePie
 				$file = $this->registry->create('File', array($this->feed_url, $this->timeout, 5, $headers, $this->useragent, $this->force_fsockopen, $this->curl_options));
 			}
 		}
+		$this->status_code = $file->status_code;
+
 		// If the file connection has an error, set SimplePie::error to that and quit
 		if (!$file->success && !($file->method & SIMPLEPIE_FILE_SOURCE_REMOTE === 0 || ($file->status_code === 200 || $file->status_code > 206 && $file->status_code < 300)))
 		{
@@ -1763,7 +1820,7 @@ class SimplePie
 	}
 
 	/**
-	 * Get the error message for the occured error
+	 * Get the error message for the occurred error
 	 *
 	 * @return string|array Error message, or array of messages for multifeeds
 	 */
@@ -1772,6 +1829,16 @@ class SimplePie
 		return $this->error;
 	}
 
+	/**
+	 * Get the last HTTP status code
+	 *
+	 * @return int Status code
+	 */
+	public function status_code()
+	{
+		return $this->status_code;
+	}
+
 	/**
 	 * Get the raw XML
 	 *
@@ -2615,13 +2682,19 @@ class SimplePie
 			}
 		}
 
-		if (isset($this->data['headers']['link']) &&
-		    preg_match('/<([^>]+)>; rel='.preg_quote($rel).'/',
-		               $this->data['headers']['link'], $match))
+		if (isset($this->data['headers']['link']))
 		{
-			return array($match[1]);
+			$link_headers = $this->data['headers']['link'];
+			if (is_string($link_headers)) {
+				$link_headers = array($link_headers);
+			}
+			$matches = preg_filter('/<([^>]+)>; rel='.preg_quote($rel).'/', '$1', $link_headers);
+			if (!empty($matches)) {
+				return $matches;
+			}
 		}
-		else if (isset($this->data['links'][$rel]))
+
+		if (isset($this->data['links'][$rel]))
 		{
 			return $this->data['links'][$rel];
 		}
diff --git a/src/wp-includes/class-walker-category-dropdown.php b/src/wp-includes/class-walker-category-dropdown.php
index 82b4fedbc5..74849101f8 100644
--- a/src/wp-includes/class-walker-category-dropdown.php
+++ b/src/wp-includes/class-walker-category-dropdown.php
@@ -31,7 +31,7 @@ class Walker_CategoryDropdown extends Walker {
 	 *
 	 * @since 2.1.0
 	 * @todo Decouple this
-	 * @var array
+	 * @var string[]
 	 *
 	 * @see Walker::$db_fields
 	 */
diff --git a/src/wp-includes/class-walker-category.php b/src/wp-includes/class-walker-category.php
index fcf54a333f..dd7252cffe 100644
--- a/src/wp-includes/class-walker-category.php
+++ b/src/wp-includes/class-walker-category.php
@@ -30,7 +30,7 @@ class Walker_Category extends Walker {
 	 * Database fields to use.
 	 *
 	 * @since 2.1.0
-	 * @var array
+	 * @var string[]
 	 *
 	 * @see Walker::$db_fields
 	 * @todo Decouple this
@@ -164,7 +164,7 @@ class Walker_Category extends Walker {
 				$link .= '(';
 			}
 
-			$link .= '<a href="' . esc_url( get_term_feed_link( $category->term_id, $category->taxonomy, $args['feed_type'] ) ) . '"';
+			$link .= '<a href="' . esc_url( get_term_feed_link( $category, $category->taxonomy, $args['feed_type'] ) ) . '"';
 
 			if ( empty( $args['feed'] ) ) {
 				/* translators: %s: Category name. */
diff --git a/src/wp-includes/class-walker-comment.php b/src/wp-includes/class-walker-comment.php
index 1a81a0b5d1..dfc8ccd39d 100644
--- a/src/wp-includes/class-walker-comment.php
+++ b/src/wp-includes/class-walker-comment.php
@@ -30,7 +30,7 @@ class Walker_Comment extends Walker {
 	 * Database fields to use.
 	 *
 	 * @since 2.7.0
-	 * @var array
+	 * @var string[]
 	 *
 	 * @see Walker::$db_fields
 	 * @todo Decouple this
diff --git a/src/wp-includes/class-walker-nav-menu.php b/src/wp-includes/class-walker-nav-menu.php
index fad796005c..36be60f9d6 100644
--- a/src/wp-includes/class-walker-nav-menu.php
+++ b/src/wp-includes/class-walker-nav-menu.php
@@ -30,7 +30,7 @@ class Walker_Nav_Menu extends Walker {
 	 *
 	 * @since 3.0.0
 	 * @todo Decouple this.
-	 * @var array
+	 * @var string[]
 	 *
 	 * @see Walker::$db_fields
 	 */
diff --git a/src/wp-includes/class-walker-page-dropdown.php b/src/wp-includes/class-walker-page-dropdown.php
index e27ea813bf..efd821f018 100644
--- a/src/wp-includes/class-walker-page-dropdown.php
+++ b/src/wp-includes/class-walker-page-dropdown.php
@@ -30,7 +30,7 @@ class Walker_PageDropdown extends Walker {
 	 * Database fields to use.
 	 *
 	 * @since 2.1.0
-	 * @var array
+	 * @var string[]
 	 *
 	 * @see Walker::$db_fields
 	 * @todo Decouple this
diff --git a/src/wp-includes/class-walker-page.php b/src/wp-includes/class-walker-page.php
index ad443dc2a6..bec195ed43 100644
--- a/src/wp-includes/class-walker-page.php
+++ b/src/wp-includes/class-walker-page.php
@@ -30,7 +30,7 @@ class Walker_Page extends Walker {
 	 * Database fields to use.
 	 *
 	 * @since 2.1.0
-	 * @var array
+	 * @var string[]
 	 *
 	 * @see Walker::$db_fields
 	 * @todo Decouple this.
diff --git a/src/wp-includes/class-wp-admin-bar.php b/src/wp-includes/class-wp-admin-bar.php
index 2d8814e590..6eab9c3fdb 100644
--- a/src/wp-includes/class-wp-admin-bar.php
+++ b/src/wp-includes/class-wp-admin-bar.php
@@ -642,6 +642,7 @@ class WP_Admin_Bar {
 		add_action( 'admin_bar_menu', 'wp_admin_bar_wp_menu', 10 );
 		add_action( 'admin_bar_menu', 'wp_admin_bar_my_sites_menu', 20 );
 		add_action( 'admin_bar_menu', 'wp_admin_bar_site_menu', 30 );
+		add_action( 'admin_bar_menu', 'wp_admin_bar_edit_site_menu', 40 );
 		add_action( 'admin_bar_menu', 'wp_admin_bar_customize_menu', 40 );
 		add_action( 'admin_bar_menu', 'wp_admin_bar_updates_menu', 50 );
 
diff --git a/src/wp-includes/class-wp-block-pattern-categories-registry.php b/src/wp-includes/class-wp-block-pattern-categories-registry.php
index 82cb80ce28..9891214d3d 100644
--- a/src/wp-includes/class-wp-block-pattern-categories-registry.php
+++ b/src/wp-includes/class-wp-block-pattern-categories-registry.php
@@ -33,7 +33,11 @@ final class WP_Block_Pattern_Categories_Registry {
 	 * @since 5.5.0
 	 *
 	 * @param string $category_name       Pattern category name including namespace.
-	 * @param array  $category_properties Array containing the properties of the category: label.
+	 * @param array  $category_properties {
+	 *     List of properties for the block pattern category.
+	 *
+	 *     @type string $label Required. A human-readable label for the pattern category.
+	 * }
 	 * @return bool True if the pattern was registered with success and false otherwise.
 	 */
 	public function register( $category_name, $category_properties ) {
@@ -141,7 +145,9 @@ final class WP_Block_Pattern_Categories_Registry {
  * @since 5.5.0
  *
  * @param string $category_name       Pattern category name including namespace.
- * @param array  $category_properties Array containing the properties of the category.
+ * @param array  $category_properties List of properties for the block pattern.
+ *                                    See WP_Block_Pattern_Categories_Registry::register() for
+ *                                    accepted arguments.
  * @return bool True if the pattern category was registered with success and false otherwise.
  */
 function register_block_pattern_category( $category_name, $category_properties ) {
diff --git a/src/wp-includes/class-wp-block-patterns-registry.php b/src/wp-includes/class-wp-block-patterns-registry.php
index 7496b445c2..7066cb08d1 100644
--- a/src/wp-includes/class-wp-block-patterns-registry.php
+++ b/src/wp-includes/class-wp-block-patterns-registry.php
@@ -8,13 +8,13 @@
  */
 
 /**
- * Class used for interacting with patterns.
+ * Class used for interacting with block patterns.
  *
  * @since 5.5.0
  */
 final class WP_Block_Patterns_Registry {
 	/**
-	 * Registered patterns array.
+	 * Registered block patterns array.
 	 *
 	 * @since 5.5.0
 	 * @var array
@@ -30,13 +30,30 @@ final class WP_Block_Patterns_Registry {
 	private static $instance = null;
 
 	/**
-	 * Registers a pattern.
+	 * Registers a block pattern.
 	 *
 	 * @since 5.5.0
 	 *
-	 * @param string $pattern_name       Pattern name including namespace.
-	 * @param array  $pattern_properties Array containing the properties of the pattern: title,
-	 *                                   content, description, viewportWidth, categories, keywords.
+	 * @param string $pattern_name       Block pattern name including namespace.
+	 * @param array  $pattern_properties {
+	 *     List of properties for the block pattern.
+	 *
+	 *     @type string $title         Required. A human-readable title for the pattern.
+	 *     @type string $content       Required. Block HTML markup for the pattern.
+	 *     @type string $description   Optional. Visually hidden text used to describe the pattern in the
+	 *                                 inserter. A description is optional, but is strongly
+	 *                                 encouraged when the title does not fully describe what the
+	 *                                 pattern does. The description will help users discover the
+	 *                                 pattern while searching.
+	 *     @type int    $viewportWidth Optional. The intended width of the pattern to allow for a scaled
+	 *                                 preview within the pattern inserter.
+	 *     @type array  $categories    Optional. A list of registered pattern categories used to group block
+	 *                                 patterns. Block patterns can be shown on multiple categories.
+	 *                                 A category must be registered separately in order to be used
+	 *                                 here.
+	 *     @type array  $keywords      Optional. A list of aliases or keywords that help users discover the
+	 *                                 pattern while searching.
+	 * }
 	 * @return bool True if the pattern was registered with success and false otherwise.
 	 */
 	public function register( $pattern_name, $pattern_properties ) {
@@ -76,11 +93,11 @@ final class WP_Block_Patterns_Registry {
 	}
 
 	/**
-	 * Unregisters a pattern.
+	 * Unregisters a block pattern.
 	 *
 	 * @since 5.5.0
 	 *
-	 * @param string $pattern_name Pattern name including namespace.
+	 * @param string $pattern_name Block pattern name including namespace.
 	 * @return bool True if the pattern was unregistered with success and false otherwise.
 	 */
 	public function unregister( $pattern_name ) {
@@ -100,11 +117,11 @@ final class WP_Block_Patterns_Registry {
 	}
 
 	/**
-	 * Retrieves an array containing the properties of a registered pattern.
+	 * Retrieves an array containing the properties of a registered block pattern.
 	 *
 	 * @since 5.5.0
 	 *
-	 * @param string $pattern_name Pattern name including namespace.
+	 * @param string $pattern_name Block pattern name including namespace.
 	 * @return array Registered pattern properties.
 	 */
 	public function get_registered( $pattern_name ) {
@@ -116,11 +133,11 @@ final class WP_Block_Patterns_Registry {
 	}
 
 	/**
-	 * Retrieves all registered patterns.
+	 * Retrieves all registered block patterns.
 	 *
 	 * @since 5.5.0
 	 *
-	 * @return array Array of arrays containing the registered patterns properties,
+	 * @return array Array of arrays containing the registered block patterns properties,
 	 *               and per style.
 	 */
 	public function get_all_registered() {
@@ -128,11 +145,11 @@ final class WP_Block_Patterns_Registry {
 	}
 
 	/**
-	 * Checks if a pattern is registered.
+	 * Checks if a block pattern is registered.
 	 *
 	 * @since 5.5.0
 	 *
-	 * @param string $pattern_name Pattern name including namespace.
+	 * @param string $pattern_name Block pattern name including namespace.
 	 * @return bool True if the pattern is registered, false otherwise.
 	 */
 	public function is_registered( $pattern_name ) {
@@ -158,12 +175,13 @@ final class WP_Block_Patterns_Registry {
 }
 
 /**
- * Registers a new pattern.
+ * Registers a new block pattern.
  *
  * @since 5.5.0
  *
- * @param string $pattern_name       Pattern name including namespace.
- * @param array  $pattern_properties Array containing the properties of the pattern.
+ * @param string $pattern_name       Block pattern name including namespace.
+ * @param array  $pattern_properties List of properties for the block pattern.
+ *                                   See WP_Block_Patterns_Registry::register() for accepted arguments.
  * @return bool True if the pattern was registered with success and false otherwise.
  */
 function register_block_pattern( $pattern_name, $pattern_properties ) {
@@ -171,11 +189,11 @@ function register_block_pattern( $pattern_name, $pattern_properties ) {
 }
 
 /**
- * Unregisters a pattern.
+ * Unregisters a block pattern.
  *
  * @since 5.5.0
  *
- * @param string $pattern_name Pattern name including namespace.
+ * @param string $pattern_name Block pattern name including namespace.
  * @return bool True if the pattern was unregistered with success and false otherwise.
  */
 function unregister_block_pattern( $pattern_name ) {
diff --git a/src/wp-includes/class-wp-block-styles-registry.php b/src/wp-includes/class-wp-block-styles-registry.php
index 0d419da12e..272e400f8c 100644
--- a/src/wp-includes/class-wp-block-styles-registry.php
+++ b/src/wp-includes/class-wp-block-styles-registry.php
@@ -17,7 +17,8 @@ final class WP_Block_Styles_Registry {
 	 * Registered block styles, as `$block_name => $block_style_name => $block_style_properties` multidimensional arrays.
 	 *
 	 * @since 5.3.0
-	 * @var array
+	 *
+	 * @var array[]
 	 */
 	private $registered_block_styles = array();
 
@@ -25,12 +26,13 @@ final class WP_Block_Styles_Registry {
 	 * Container for the main instance of the class.
 	 *
 	 * @since 5.3.0
+	 *
 	 * @var WP_Block_Styles_Registry|null
 	 */
 	private static $instance = null;
 
 	/**
-	 * Registers a block style.
+	 * Registers a block style for the given block type.
 	 *
 	 * @since 5.3.0
 	 *
@@ -60,6 +62,15 @@ final class WP_Block_Styles_Registry {
 			return false;
 		}
 
+		if ( str_contains( $style_properties['name'], ' ' ) ) {
+			_doing_it_wrong(
+				__METHOD__,
+				__( 'Block style name must not contain any spaces.' ),
+				'5.9.0'
+			);
+			return false;
+		}
+
 		$block_style_name = $style_properties['name'];
 
 		if ( ! isset( $this->registered_block_styles[ $block_name ] ) ) {
@@ -71,7 +82,9 @@ final class WP_Block_Styles_Registry {
 	}
 
 	/**
-	 * Unregisters a block style.
+	 * Unregisters a block style of the given block type.
+	 *
+	 * @since 5.3.0
 	 *
 	 * @param string $block_name       Block type name including namespace.
 	 * @param string $block_style_name Block style name.
@@ -94,7 +107,7 @@ final class WP_Block_Styles_Registry {
 	}
 
 	/**
-	 * Retrieves an array containing the properties of a registered block style.
+	 * Retrieves the properties of a registered block style for the given block type.
 	 *
 	 * @since 5.3.0
 	 *
@@ -115,20 +128,19 @@ final class WP_Block_Styles_Registry {
 	 *
 	 * @since 5.3.0
 	 *
-	 * @return array Array of arrays containing the registered block styles properties grouped per block,
-	 *               and per style.
+	 * @return array[] Array of arrays containing the registered block styles properties grouped by block type.
 	 */
 	public function get_all_registered() {
 		return $this->registered_block_styles;
 	}
 
 	/**
-	 * Retrieves registered block styles for a specific block.
+	 * Retrieves registered block styles for a specific block type.
 	 *
 	 * @since 5.3.0
 	 *
 	 * @param string $block_name Block type name including namespace.
-	 * @return array Array whose keys are block style names and whose value are block style properties.
+	 * @return array[] Array whose keys are block style names and whose values are block style properties.
 	 */
 	public function get_registered_styles_for_block( $block_name ) {
 		if ( isset( $this->registered_block_styles[ $block_name ] ) ) {
@@ -138,7 +150,7 @@ final class WP_Block_Styles_Registry {
 	}
 
 	/**
-	 * Checks if a block style is registered.
+	 * Checks if a block style is registered for the given block type.
 	 *
 	 * @since 5.3.0
 	 *
diff --git a/src/wp-includes/class-wp-block-supports.php b/src/wp-includes/class-wp-block-supports.php
index a14efa36bd..1cae5eb08c 100644
--- a/src/wp-includes/class-wp-block-supports.php
+++ b/src/wp-includes/class-wp-block-supports.php
@@ -58,7 +58,7 @@ class WP_Block_Supports {
 	}
 
 	/**
-	 * Initializes the block supports. It registes the block supports block attributes.
+	 * Initializes the block supports. It registers the block supports block attributes.
 	 *
 	 * @since 5.6.0
 	 */
@@ -72,7 +72,7 @@ class WP_Block_Supports {
 	 *
 	 * @since 5.6.0
 	 *
-	 * @param string $block_support_name Block support name.
+	 * @param string $block_support_name   Block support name.
 	 * @param array  $block_support_config Array containing the properties of the block support.
 	 */
 	public function register( $block_support_name, $block_support_config ) {
@@ -88,7 +88,7 @@ class WP_Block_Supports {
 	 *
 	 * @since 5.6.0
 	 *
-	 * @return array Array of HTML attributes.
+	 * @return string[] Array of HTML attributes.
 	 */
 	public function apply_block_supports() {
 		$block_attributes = self::$block_to_render['attrs'];
@@ -163,9 +163,8 @@ class WP_Block_Supports {
  *
  * @since 5.6.0
  *
- * @param array $extra_attributes Optional. Extra attributes to render on the block wrapper.
- *
- * @return string String of HTML classes.
+ * @param string[] $extra_attributes Optional. Array of extra attributes to render on the block wrapper.
+ * @return string String of HTML attributes.
  */
 function get_block_wrapper_attributes( $extra_attributes = array() ) {
 	$new_attributes = WP_Block_Supports::get_instance()->apply_block_supports();
diff --git a/src/wp-includes/class-wp-block-template.php b/src/wp-includes/class-wp-block-template.php
index 704a2afc45..51dbdbfbc3 100644
--- a/src/wp-includes/class-wp-block-template.php
+++ b/src/wp-includes/class-wp-block-template.php
@@ -38,7 +38,7 @@ class WP_Block_Template {
 	public $slug;
 
 	/**
-	 * Id.
+	 * ID.
 	 *
 	 * @since 5.8.0
 	 * @var string
@@ -78,10 +78,20 @@ class WP_Block_Template {
 	public $source = 'theme';
 
 	/**
-	 * Post Id.
+	 * Origin of the content when the content has been customized.
+	 * When customized, origin takes on the value of source and source becomes
+	 * 'custom'.
+	 *
+	 * @since 5.9.0
+	 * @var string
+	 */
+	public $origin;
+
+	/**
+	 * Post ID.
 	 *
 	 * @since 5.8.0
-	 * @var integer|null
+	 * @var int|null
 	 */
 	public $wp_id;
 
@@ -97,7 +107,42 @@ class WP_Block_Template {
 	 * Whether a template is, or is based upon, an existing template file.
 	 *
 	 * @since 5.8.0
-	 * @var boolean
+	 * @var bool
 	 */
 	public $has_theme_file;
+
+	/**
+	 * Whether a template is a custom template.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @var bool
+	 */
+	public $is_custom = true;
+
+	/**
+	 * Author.
+	 *
+	 * A value of 0 means no author.
+	 *
+	 * @since 5.9.0
+	 * @var int
+	 */
+	public $author;
+
+	/**
+	 * Post types.
+	 *
+	 * @since 5.9.0
+	 * @var array
+	 */
+	public $post_types;
+
+	/**
+	 * Area.
+	 *
+	 * @since 5.9.0
+	 * @var string
+	 */
+	public $area;
 }
diff --git a/src/wp-includes/class-wp-block-type.php b/src/wp-includes/class-wp-block-type.php
index 10dbe42428..b3700e8d2e 100644
--- a/src/wp-includes/class-wp-block-type.php
+++ b/src/wp-includes/class-wp-block-type.php
@@ -79,7 +79,7 @@ class WP_Block_Type {
 	 * in search interfaces.
 	 *
 	 * @since 5.5.0
-	 * @var array
+	 * @var string[]
 	 */
 	public $keywords = array();
 
@@ -223,7 +223,7 @@ class WP_Block_Type {
 	 *                                           available when nested within the specified blocks.
 	 *     @type string|null   $icon             Block type icon.
 	 *     @type string        $description      A detailed block type description.
-	 *     @type array         $keywords         Additional keywords to produce block type as
+	 *     @type string[]      $keywords         Additional keywords to produce block type as
 	 *                                           result in search interfaces.
 	 *     @type string|null   $textdomain       The translation textdomain.
 	 *     @type array         $styles           Alternative block styles.
diff --git a/src/wp-includes/class-wp-block.php b/src/wp-includes/class-wp-block.php
index ed5b0f0767..90148f7613 100644
--- a/src/wp-includes/class-wp-block.php
+++ b/src/wp-includes/class-wp-block.php
@@ -196,9 +196,9 @@ class WP_Block {
 	 * @since 5.5.0
 	 *
 	 * @param array $options {
-	 *   Optional options object.
+	 *     Optional options object.
 	 *
-	 *   @type bool $dynamic Defaults to 'true'. Optionally set to false to avoid using the block's render_callback.
+	 *     @type bool $dynamic Defaults to 'true'. Optionally set to false to avoid using the block's render_callback.
 	 * }
 	 * @return string Rendered block output.
 	 */
diff --git a/src/wp-includes/class-wp-comment-query.php b/src/wp-includes/class-wp-comment-query.php
index a592fdb687..902bf25714 100644
--- a/src/wp-includes/class-wp-comment-query.php
+++ b/src/wp-includes/class-wp-comment-query.php
@@ -141,114 +141,134 @@ class WP_Comment_Query {
 	 * @since 4.5.0 Introduced the `$author_url` argument.
 	 * @since 4.6.0 Introduced the `$cache_domain` argument.
 	 * @since 4.9.0 Introduced the `$paged` argument.
+	 * @since 5.1.0 Introduced the `$meta_compare_key` argument.
+	 * @since 5.3.0 Introduced the `$meta_type_key` argument.
 	 *
 	 * @param string|array $query {
 	 *     Optional. Array or query string of comment query parameters. Default empty.
 	 *
-	 *     @type string       $author_email              Comment author email address. Default empty.
-	 *     @type string       $author_url                Comment author URL. Default empty.
-	 *     @type int[]        $author__in                Array of author IDs to include comments for. Default empty.
-	 *     @type int[]        $author__not_in            Array of author IDs to exclude comments for. Default empty.
-	 *     @type int[]        $comment__in               Array of comment IDs to include. Default empty.
-	 *     @type int[]        $comment__not_in           Array of comment IDs to exclude. Default empty.
-	 *     @type bool         $count                     Whether to return a comment count (true) or array of
-	 *                                                   comment objects (false). Default false.
-	 *     @type array        $date_query                Date query clauses to limit comments by. See WP_Date_Query.
-	 *                                                   Default null.
-	 *     @type string       $fields                    Comment fields to return. Accepts 'ids' for comment IDs
-	 *                                                   only or empty for all fields. Default empty.
-	 *     @type int          $ID                        Currently unused.
-	 *     @type array        $include_unapproved        Array of IDs or email addresses of users whose unapproved
-	 *                                                   comments will be returned by the query regardless of
-	 *                                                   `$status`. Default empty.
-	 *     @type int          $karma                     Karma score to retrieve matching comments for.
-	 *                                                   Default empty.
-	 *     @type string       $meta_key                  Include comments with a matching comment meta key.
-	 *                                                   Default empty.
-	 *     @type string       $meta_value                Include comments with a matching comment meta value.
-	 *                                                   Requires `$meta_key` to be set. Default empty.
-	 *     @type array        $meta_query                Meta query clauses to limit retrieved comments by.
-	 *                                                   See WP_Meta_Query. Default empty.
-	 *     @type int          $number                    Maximum number of comments to retrieve.
-	 *                                                   Default empty (no limit).
-	 *     @type int          $paged                     When used with $number, defines the page of results to return.
-	 *                                                   When used with $offset, $offset takes precedence. Default 1.
-	 *     @type int          $offset                    Number of comments to offset the query. Used to build
-	 *                                                   LIMIT clause. Default 0.
-	 *     @type bool         $no_found_rows             Whether to disable the `SQL_CALC_FOUND_ROWS` query.
-	 *                                                   Default: true.
-	 *     @type string|array $orderby                   Comment status or array of statuses. To use 'meta_value'
-	 *                                                   or 'meta_value_num', `$meta_key` must also be defined.
-	 *                                                   To sort by a specific `$meta_query` clause, use that
-	 *                                                   clause's array key. Accepts 'comment_agent',
-	 *                                                   'comment_approved', 'comment_author',
-	 *                                                   'comment_author_email', 'comment_author_IP',
-	 *                                                   'comment_author_url', 'comment_content', 'comment_date',
-	 *                                                   'comment_date_gmt', 'comment_ID', 'comment_karma',
-	 *                                                   'comment_parent', 'comment_post_ID', 'comment_type',
-	 *                                                   'user_id', 'comment__in', 'meta_value', 'meta_value_num',
-	 *                                                   the value of $meta_key, and the array keys of
-	 *                                                   `$meta_query`. Also accepts false, an empty array, or
-	 *                                                   'none' to disable `ORDER BY` clause.
-	 *                                                   Default: 'comment_date_gmt'.
-	 *     @type string       $order                     How to order retrieved comments. Accepts 'ASC', 'DESC'.
-	 *                                                   Default: 'DESC'.
-	 *     @type int          $parent                    Parent ID of comment to retrieve children of.
-	 *                                                   Default empty.
-	 *     @type int[]        $parent__in                Array of parent IDs of comments to retrieve children for.
-	 *                                                   Default empty.
-	 *     @type int[]        $parent__not_in            Array of parent IDs of comments *not* to retrieve
-	 *                                                   children for. Default empty.
-	 *     @type int[]        $post_author__in           Array of author IDs to retrieve comments for.
-	 *                                                   Default empty.
-	 *     @type int[]        $post_author__not_in       Array of author IDs *not* to retrieve comments for.
-	 *                                                   Default empty.
-	 *     @type int          $post_ID                   Currently unused.
-	 *     @type int          $post_id                   Limit results to those affiliated with a given post ID.
-	 *                                                   Default 0.
-	 *     @type int[]        $post__in                  Array of post IDs to include affiliated comments for.
-	 *                                                   Default empty.
-	 *     @type int[]        $post__not_in              Array of post IDs to exclude affiliated comments for.
-	 *                                                   Default empty.
-	 *     @type int          $post_author               Post author ID to limit results by. Default empty.
-	 *     @type string|array $post_status               Post status or array of post statuses to retrieve
-	 *                                                   affiliated comments for. Pass 'any' to match any value.
-	 *                                                   Default empty.
-	 *     @type string|array $post_type                 Post type or array of post types to retrieve affiliated
-	 *                                                   comments for. Pass 'any' to match any value. Default empty.
-	 *     @type string       $post_name                 Post name to retrieve affiliated comments for.
-	 *                                                   Default empty.
-	 *     @type int          $post_parent               Post parent ID to retrieve affiliated comments for.
-	 *                                                   Default empty.
-	 *     @type string       $search                    Search term(s) to retrieve matching comments for.
-	 *                                                   Default empty.
-	 *     @type string|array $status                    Comment statuses to limit results by. Accepts an array
-	 *                                                   or space/comma-separated list of 'hold' (`comment_status=0`),
-	 *                                                   'approve' (`comment_status=1`), 'all', or a custom
-	 *                                                   comment status. Default 'all'.
-	 *     @type string|array $type                      Include comments of a given type, or array of types.
-	 *                                                   Accepts 'comment', 'pings' (includes 'pingback' and
-	 *                                                   'trackback'), or any custom type string. Default empty.
-	 *     @type string[]     $type__in                  Include comments from a given array of comment types.
-	 *                                                   Default empty.
-	 *     @type string[]     $type__not_in              Exclude comments from a given array of comment types.
-	 *                                                   Default empty.
-	 *     @type int          $user_id                   Include comments for a specific user ID. Default empty.
-	 *     @type bool|string  $hierarchical              Whether to include comment descendants in the results.
-	 *                                                   - 'threaded' returns a tree, with each comment's children
-	 *                                                   stored in a `children` property on the `WP_Comment` object.
-	 *                                                   - 'flat' returns a flat array of found comments plus
-	 *                                                   their children.
-	 *                                                   - Boolean `false` leaves out descendants.
-	 *                                                   The parameter is ignored (forced to `false`) when
-	 *                                                   `$fields` is 'ids' or 'counts'. Accepts 'threaded',
-	 *                                                   'flat', or false. Default: false.
-	 *     @type string       $cache_domain              Unique cache key to be produced when this query is stored in
-	 *                                                   an object cache. Default is 'core'.
-	 *     @type bool         $update_comment_meta_cache Whether to prime the metadata cache for found comments.
-	 *                                                   Default true.
-	 *     @type bool         $update_comment_post_cache Whether to prime the cache for comment posts.
-	 *                                                   Default false.
+	 *     @type string          $author_email              Comment author email address. Default empty.
+	 *     @type string          $author_url                Comment author URL. Default empty.
+	 *     @type int[]           $author__in                Array of author IDs to include comments for. Default empty.
+	 *     @type int[]           $author__not_in            Array of author IDs to exclude comments for. Default empty.
+	 *     @type int[]           $comment__in               Array of comment IDs to include. Default empty.
+	 *     @type int[]           $comment__not_in           Array of comment IDs to exclude. Default empty.
+	 *     @type bool            $count                     Whether to return a comment count (true) or array of
+	 *                                                      comment objects (false). Default false.
+	 *     @type array           $date_query                Date query clauses to limit comments by. See WP_Date_Query.
+	 *                                                      Default null.
+	 *     @type string          $fields                    Comment fields to return. Accepts 'ids' for comment IDs
+	 *                                                      only or empty for all fields. Default empty.
+	 *     @type int             $ID                        Currently unused.
+	 *     @type array           $include_unapproved        Array of IDs or email addresses of users whose unapproved
+	 *                                                      comments will be returned by the query regardless of
+	 *                                                      `$status`. Default empty.
+	 *     @type int             $karma                     Karma score to retrieve matching comments for.
+	 *                                                      Default empty.
+	 *     @type string|string[] $meta_key                  Meta key or keys to filter by.
+	 *     @type string|string[] $meta_value                Meta value or values to filter by.
+	 *     @type string          $meta_compare              MySQL operator used for comparing the meta value.
+	 *                                                      See WP_Meta_Query::__construct for accepted values and default value.
+	 *     @type string          $meta_compare_key          MySQL operator used for comparing the meta key.
+	 *                                                      See WP_Meta_Query::__construct for accepted values and default value.
+	 *     @type string          $meta_type                 MySQL data type that the meta_value column will be CAST to for comparisons.
+	 *                                                      See WP_Meta_Query::__construct for accepted values and default value.
+	 *     @type string          $meta_type_key             MySQL data type that the meta_key column will be CAST to for comparisons.
+	 *                                                      See WP_Meta_Query::__construct for accepted values and default value.
+	 *     @type array           $meta_query                An associative array of WP_Meta_Query arguments.
+	 *                                                      See WP_Meta_Query::__construct for accepted values.
+	 *     @type int             $number                    Maximum number of comments to retrieve.
+	 *                                                      Default empty (no limit).
+	 *     @type int             $paged                     When used with `$number`, defines the page of results to return.
+	 *                                                      When used with `$offset`, `$offset` takes precedence. Default 1.
+	 *     @type int             $offset                    Number of comments to offset the query. Used to build
+	 *                                                      LIMIT clause. Default 0.
+	 *     @type bool            $no_found_rows             Whether to disable the `SQL_CALC_FOUND_ROWS` query.
+	 *                                                      Default: true.
+	 *     @type string|array    $orderby                   Comment status or array of statuses. To use 'meta_value'
+	 *                                                      or 'meta_value_num', `$meta_key` must also be defined.
+	 *                                                      To sort by a specific `$meta_query` clause, use that
+	 *                                                      clause's array key. Accepts:
+	 *                                                      - 'comment_agent'
+	 *                                                      - 'comment_approved'
+	 *                                                      - 'comment_author'
+	 *                                                      - 'comment_author_email'
+	 *                                                      - 'comment_author_IP'
+	 *                                                      - 'comment_author_url'
+	 *                                                      - 'comment_content'
+	 *                                                      - 'comment_date'
+	 *                                                      - 'comment_date_gmt'
+	 *                                                      - 'comment_ID'
+	 *                                                      - 'comment_karma'
+	 *                                                      - 'comment_parent'
+	 *                                                      - 'comment_post_ID'
+	 *                                                      - 'comment_type'
+	 *                                                      - 'user_id'
+	 *                                                      - 'comment__in'
+	 *                                                      - 'meta_value'
+	 *                                                      - 'meta_value_num'
+	 *                                                      - The value of `$meta_key`
+	 *                                                      - The array keys of `$meta_query`
+	 *                                                      - false, an empty array, or 'none' to disable `ORDER BY` clause.
+	 *                                                      Default: 'comment_date_gmt'.
+	 *     @type string          $order                     How to order retrieved comments. Accepts 'ASC', 'DESC'.
+	 *                                                      Default: 'DESC'.
+	 *     @type int             $parent                    Parent ID of comment to retrieve children of.
+	 *                                                      Default empty.
+	 *     @type int[]           $parent__in                Array of parent IDs of comments to retrieve children for.
+	 *                                                      Default empty.
+	 *     @type int[]           $parent__not_in            Array of parent IDs of comments *not* to retrieve
+	 *                                                      children for. Default empty.
+	 *     @type int[]           $post_author__in           Array of author IDs to retrieve comments for.
+	 *                                                      Default empty.
+	 *     @type int[]           $post_author__not_in       Array of author IDs *not* to retrieve comments for.
+	 *                                                      Default empty.
+	 *     @type int             $post_ID                   Currently unused.
+	 *     @type int             $post_id                   Limit results to those affiliated with a given post ID.
+	 *                                                      Default 0.
+	 *     @type int[]           $post__in                  Array of post IDs to include affiliated comments for.
+	 *                                                      Default empty.
+	 *     @type int[]           $post__not_in              Array of post IDs to exclude affiliated comments for.
+	 *                                                      Default empty.
+	 *     @type int             $post_author               Post author ID to limit results by. Default empty.
+	 *     @type string|string[] $post_status               Post status or array of post statuses to retrieve
+	 *                                                      affiliated comments for. Pass 'any' to match any value.
+	 *                                                      Default empty.
+	 *     @type string|string[] $post_type                 Post type or array of post types to retrieve affiliated
+	 *                                                      comments for. Pass 'any' to match any value. Default empty.
+	 *     @type string          $post_name                 Post name to retrieve affiliated comments for.
+	 *                                                      Default empty.
+	 *     @type int             $post_parent               Post parent ID to retrieve affiliated comments for.
+	 *                                                      Default empty.
+	 *     @type string          $search                    Search term(s) to retrieve matching comments for.
+	 *                                                      Default empty.
+	 *     @type string|array    $status                    Comment statuses to limit results by. Accepts an array
+	 *                                                      or space/comma-separated list of 'hold' (`comment_status=0`),
+	 *                                                      'approve' (`comment_status=1`), 'all', or a custom
+	 *                                                      comment status. Default 'all'.
+	 *     @type string|string[] $type                      Include comments of a given type, or array of types.
+	 *                                                      Accepts 'comment', 'pings' (includes 'pingback' and
+	 *                                                      'trackback'), or any custom type string. Default empty.
+	 *     @type string[]        $type__in                  Include comments from a given array of comment types.
+	 *                                                      Default empty.
+	 *     @type string[]        $type__not_in              Exclude comments from a given array of comment types.
+	 *                                                      Default empty.
+	 *     @type int             $user_id                   Include comments for a specific user ID. Default empty.
+	 *     @type bool|string     $hierarchical              Whether to include comment descendants in the results.
+	 *                                                      - 'threaded' returns a tree, with each comment's children
+	 *                                                        stored in a `children` property on the `WP_Comment` object.
+	 *                                                      - 'flat' returns a flat array of found comments plus
+	 *                                                        their children.
+	 *                                                      - Boolean `false` leaves out descendants.
+	 *                                                      The parameter is ignored (forced to `false`) when
+	 *                                                      `$fields` is 'ids' or 'counts'. Accepts 'threaded',
+	 *                                                      'flat', or false. Default: false.
+	 *     @type string          $cache_domain              Unique cache key to be produced when this query is stored in
+	 *                                                      an object cache. Default is 'core'.
+	 *     @type bool            $update_comment_meta_cache Whether to prime the metadata cache for found comments.
+	 *                                                      Default true.
+	 *     @type bool            $update_comment_post_cache Whether to prime the cache for comment posts.
+	 *                                                      Default false.
 	 * }
 	 */
 	public function __construct( $query = '' ) {
diff --git a/src/wp-includes/class-wp-customize-manager.php b/src/wp-includes/class-wp-customize-manager.php
index faa9487c30..b566ae6dff 100644
--- a/src/wp-includes/class-wp-customize-manager.php
+++ b/src/wp-includes/class-wp-customize-manager.php
@@ -161,7 +161,7 @@ final class WP_Customize_Manager {
 	 * Mapping of 'panel', 'section', 'control' to the ID which should be autofocused.
 	 *
 	 * @since 4.4.0
-	 * @var array
+	 * @var string[]
 	 */
 	protected $autofocus = array();
 
@@ -346,7 +346,7 @@ final class WP_Customize_Manager {
 		 * @see WP_Customize_Manager::__construct()
 		 *
 		 * @param string[]             $components Array of core components to load.
-		 * @param WP_Customize_Manager $manager   WP_Customize_Manager instance.
+		 * @param WP_Customize_Manager $manager    WP_Customize_Manager instance.
 		 */
 		$components = apply_filters( 'customize_loaded_components', $this->components, $this );
 
@@ -496,7 +496,7 @@ final class WP_Customize_Manager {
 	/**
 	 * Start preview and customize theme.
 	 *
-	 * Check if customize query variable exist. Init filters to filter the current theme.
+	 * Check if customize query variable exist. Init filters to filter the active theme.
 	 *
 	 * @since 3.4.0
 	 *
@@ -699,7 +699,7 @@ final class WP_Customize_Manager {
 	/**
 	 * Stop previewing the selected theme.
 	 *
-	 * Removes filters to change the current theme.
+	 * Removes filters to change the active theme.
 	 *
 	 * @since 3.4.0
 	 */
@@ -1769,7 +1769,7 @@ final class WP_Customize_Manager {
 				}
 				if ( isset( $setting_params['type'] ) && 'theme_mod' === $setting_params['type'] ) {
 
-					// Ensure that theme mods values are only used if they were saved under the current theme.
+					// Ensure that theme mods values are only used if they were saved under the active theme.
 					$namespace_pattern = '/^(?P<stylesheet>.+?)::(?P<setting_id>.+)$/';
 					if ( preg_match( $namespace_pattern, $setting_id, $matches ) && $this->get_stylesheet() === $matches['stylesheet'] ) {
 						$values[ $matches['setting_id'] ] = $setting_params['value'];
@@ -2297,7 +2297,7 @@ final class WP_Customize_Manager {
 	}
 
 	/**
-	 * Filters the current theme and return the name of the previewed theme.
+	 * Filters the active theme and return the name of the previewed theme.
 	 *
 	 * @since 3.4.0
 	 *
@@ -4720,7 +4720,7 @@ final class WP_Customize_Manager {
 	 *
 	 * @since 4.4.0
 	 *
-	 * @return array {
+	 * @return string[] {
 	 *     Mapping of 'panel', 'section', 'control' to the ID which should be autofocused.
 	 *
 	 *     @type string $control ID for control to be autofocused.
@@ -5808,10 +5808,11 @@ final class WP_Customize_Manager {
 		if ( 'installed' === $theme_action ) {
 
 			// Load all installed themes from wp_prepare_themes_for_js().
-			$themes = array( 'themes' => wp_prepare_themes_for_js() );
-			foreach ( $themes['themes'] as &$theme ) {
-				$theme['type']   = 'installed';
-				$theme['active'] = ( isset( $_POST['customized_theme'] ) && $_POST['customized_theme'] === $theme['id'] );
+			$themes = array( 'themes' => array() );
+			foreach ( wp_prepare_themes_for_js() as $theme ) {
+				$theme['type']      = 'installed';
+				$theme['active']    = ( isset( $_POST['customized_theme'] ) && $_POST['customized_theme'] === $theme['id'] );
+				$themes['themes'][] = $theme;
 			}
 		} elseif ( 'wporg' === $theme_action ) {
 
@@ -5923,7 +5924,7 @@ final class WP_Customize_Manager {
 		 * @see themes_api()
 		 * @see WP_Customize_Manager::__construct()
 		 *
-		 * @param array                $themes  Nested array of theme data.
+		 * @param array|stdClass       $themes  Nested array or object of theme data.
 		 * @param array                $args    List of arguments, such as page, search term, and tags to query for.
 		 * @param WP_Customize_Manager $manager Instance of Customize manager.
 		 */
diff --git a/src/wp-includes/class-wp-customize-panel.php b/src/wp-includes/class-wp-customize-panel.php
index 71d93ead97..6ec6cd55e0 100644
--- a/src/wp-includes/class-wp-customize-panel.php
+++ b/src/wp-includes/class-wp-customize-panel.php
@@ -56,7 +56,7 @@ class WP_Customize_Panel {
 	 * Priority of the panel, defining the display order of panels and sections.
 	 *
 	 * @since 4.0.0
-	 * @var integer
+	 * @var int
 	 */
 	public $priority = 160;
 
@@ -232,10 +232,11 @@ class WP_Customize_Panel {
 	 * feature support required by the panel.
 	 *
 	 * @since 4.0.0
+	 * @since 5.9.0 Method was marked non-final.
 	 *
 	 * @return bool False if theme doesn't support the panel or the user doesn't have the capability.
 	 */
-	final public function check_capabilities() {
+	public function check_capabilities() {
 		if ( $this->capability && ! current_user_can( $this->capability ) ) {
 			return false;
 		}
diff --git a/src/wp-includes/class-wp-customize-section.php b/src/wp-includes/class-wp-customize-section.php
index e7484d6f2f..97da8a9e35 100644
--- a/src/wp-includes/class-wp-customize-section.php
+++ b/src/wp-includes/class-wp-customize-section.php
@@ -56,7 +56,7 @@ class WP_Customize_Section {
 	 * Priority of the section which informs load order of sections.
 	 *
 	 * @since 3.4.0
-	 * @var integer
+	 * @var int
 	 */
 	public $priority = 160;
 
diff --git a/src/wp-includes/class-wp-customize-widgets.php b/src/wp-includes/class-wp-customize-widgets.php
index c96773b139..8edcd6f1c9 100644
--- a/src/wp-includes/class-wp-customize-widgets.php
+++ b/src/wp-includes/class-wp-customize-widgets.php
@@ -420,6 +420,7 @@ final class WP_Customize_Widgets {
 				'priority'                 => 110,
 				'active_callback'          => array( $this, 'is_panel_active' ),
 				'auto_expand_sole_section' => true,
+				'theme_supports'           => 'widgets',
 			)
 		);
 
@@ -1421,9 +1422,8 @@ final class WP_Customize_Widgets {
 			if ( ! empty( $widget_object->widget_options['show_instance_in_rest'] ) ) {
 				if ( 'block' === $id_base && ! current_user_can( 'unfiltered_html' ) ) {
 					/*
-					 * The content of the 'block' widget is not filtered on the
-					 * fly while editing. Filter the content here to prevent
-					 * vulnerabilities.
+					 * The content of the 'block' widget is not filtered on the fly while editing.
+					 * Filter the content here to prevent vulnerabilities.
 					 */
 					$value['raw_instance']['content'] = wp_kses_post( $value['raw_instance']['content'] );
 				}
diff --git a/src/wp-includes/class-wp-date-query.php b/src/wp-includes/class-wp-date-query.php
index 55d3e3f01d..1978afe762 100644
--- a/src/wp-includes/class-wp-date-query.php
+++ b/src/wp-includes/class-wp-date-query.php
@@ -53,7 +53,7 @@ class WP_Date_Query {
 	 * Supported time-related parameter keys.
 	 *
 	 * @since 4.1.0
-	 * @var array
+	 * @var string[]
 	 */
 	public $time_keys = array( 'after', 'before', 'year', 'month', 'monthnum', 'week', 'w', 'dayofyear', 'day', 'dayofweek', 'dayofweek_iso', 'hour', 'minute', 'second' );
 
@@ -569,7 +569,7 @@ class WP_Date_Query {
 	 *
 	 * @since 4.1.0
 	 *
-	 * @return array {
+	 * @return string[] {
 	 *     Array containing JOIN and WHERE SQL clauses to append to the main query.
 	 *
 	 *     @type string $join  SQL fragment to append to the main JOIN clause.
@@ -679,7 +679,7 @@ class WP_Date_Query {
 	 * @since 3.7.0
 	 *
 	 * @param array $query Date query arguments.
-	 * @return array {
+	 * @return string[] {
 	 *     Array containing JOIN and WHERE SQL clauses to append to the main query.
 	 *
 	 *     @type string $join  SQL fragment to append to the main JOIN clause.
@@ -697,7 +697,7 @@ class WP_Date_Query {
 	 *
 	 * @param array $query        Date query clause.
 	 * @param array $parent_query Parent query of the current date query.
-	 * @return array {
+	 * @return string[] {
 	 *     Array containing JOIN and WHERE SQL clauses to append to the main query.
 	 *
 	 *     @type string $join  SQL fragment to append to the main JOIN clause.
diff --git a/src/wp-includes/class-wp-embed.php b/src/wp-includes/class-wp-embed.php
index 1fa37be41b..d93ea7c01e 100644
--- a/src/wp-includes/class-wp-embed.php
+++ b/src/wp-includes/class-wp-embed.php
@@ -88,9 +88,9 @@ class WP_Embed {
 		}
 		?>
 <script type="text/javascript">
-	jQuery(document).ready(function($){
+	jQuery( function($) {
 		$.get("<?php echo esc_url( admin_url( 'admin-ajax.php', 'relative' ) ) . '?action=oembed-cache&post=' . $post->ID; ?>");
-	});
+	} );
 </script>
 		<?php
 	}
diff --git a/src/wp-includes/class-wp-hook.php b/src/wp-includes/class-wp-hook.php
index cb49271ba4..018db1c967 100644
--- a/src/wp-includes/class-wp-hook.php
+++ b/src/wp-includes/class-wp-hook.php
@@ -168,9 +168,11 @@ final class WP_Hook implements Iterator, ArrayAccess {
 	 *
 	 * @since 4.7.0
 	 *
-	 * @param string   $hook_name The filter hook to which the function to be removed is hooked.
-	 * @param callable $callback  The callback to be removed from running when the filter is applied.
-	 * @param int      $priority  The exact priority used when adding the original filter callback.
+	 * @param string                $hook_name The filter hook to which the function to be removed is hooked.
+	 * @param callable|string|array $callback  The callback to be removed from running when the filter is applied.
+	 *                                         This method can be called unconditionally to speculatively remove
+	 *                                         a callback that may or may not exist.
+	 * @param int                   $priority  The exact priority used when adding the original filter callback.
 	 * @return bool Whether the callback existed before it was removed.
 	 */
 	public function remove_filter( $hook_name, $callback, $priority ) {
@@ -201,8 +203,10 @@ final class WP_Hook implements Iterator, ArrayAccess {
 	 *
 	 * @since 4.7.0
 	 *
-	 * @param string         $hook_name Optional. The name of the filter hook. Default empty.
-	 * @param callable|false $callback  Optional. The callback to check for. Default false.
+	 * @param string                      $hook_name Optional. The name of the filter hook. Default empty.
+	 * @param callable|string|array|false $callback  Optional. The callback to check for.
+	 *                                               This method can be called unconditionally to speculatively check
+	 *                                               a callback that may or may not exist. Default false.
 	 * @return bool|int If `$callback` is omitted, returns boolean for whether the hook has
 	 *                  anything registered. When checking a specific function, the priority
 	 *                  of that hook is returned, or false if the function is not attached.
diff --git a/src/wp-includes/class-wp-http-encoding.php b/src/wp-includes/class-wp-http-encoding.php
index 33314826f7..e9e94e4d77 100644
--- a/src/wp-includes/class-wp-http-encoding.php
+++ b/src/wp-includes/class-wp-http-encoding.php
@@ -88,7 +88,7 @@ class WP_Http_Encoding {
 	 *
 	 * Warning: Magic numbers within. Due to the potential different formats that the compressed
 	 * data may be returned in, some "magic offsets" are needed to ensure proper decompression
-	 * takes place. For a simple progmatic way to determine the magic offset in use, see:
+	 * takes place. For a simple pragmatic way to determine the magic offset in use, see:
 	 * https://core.trac.wordpress.org/ticket/18273
 	 *
 	 * @since 2.8.1
@@ -97,38 +97,38 @@ class WP_Http_Encoding {
 	 * @link https://www.php.net/manual/en/function.gzinflate.php#70875
 	 * @link https://www.php.net/manual/en/function.gzinflate.php#77336
 	 *
-	 * @param string $gzData String to decompress.
+	 * @param string $gz_data String to decompress.
 	 * @return string|false Decompressed string on success, false on failure.
 	 */
-	public static function compatible_gzinflate( $gzData ) {
+	public static function compatible_gzinflate( $gz_data ) {
 
 		// Compressed data might contain a full header, if so strip it for gzinflate().
-		if ( "\x1f\x8b\x08" === substr( $gzData, 0, 3 ) ) {
+		if ( "\x1f\x8b\x08" === substr( $gz_data, 0, 3 ) ) {
 			$i   = 10;
-			$flg = ord( substr( $gzData, 3, 1 ) );
+			$flg = ord( substr( $gz_data, 3, 1 ) );
 			if ( $flg > 0 ) {
 				if ( $flg & 4 ) {
-					list($xlen) = unpack( 'v', substr( $gzData, $i, 2 ) );
+					list($xlen) = unpack( 'v', substr( $gz_data, $i, 2 ) );
 					$i          = $i + 2 + $xlen;
 				}
 				if ( $flg & 8 ) {
-					$i = strpos( $gzData, "\0", $i ) + 1;
+					$i = strpos( $gz_data, "\0", $i ) + 1;
 				}
 				if ( $flg & 16 ) {
-					$i = strpos( $gzData, "\0", $i ) + 1;
+					$i = strpos( $gz_data, "\0", $i ) + 1;
 				}
 				if ( $flg & 2 ) {
 					$i = $i + 2;
 				}
 			}
-			$decompressed = @gzinflate( substr( $gzData, $i, -8 ) );
+			$decompressed = @gzinflate( substr( $gz_data, $i, -8 ) );
 			if ( false !== $decompressed ) {
 				return $decompressed;
 			}
 		}
 
 		// Compressed data from java.util.zip.Deflater amongst others.
-		$decompressed = @gzinflate( substr( $gzData, 2 ) );
+		$decompressed = @gzinflate( substr( $gz_data, 2 ) );
 		if ( false !== $decompressed ) {
 			return $decompressed;
 		}
diff --git a/src/wp-includes/class-wp-http-proxy.php b/src/wp-includes/class-wp-http-proxy.php
index 0f7d96fb8c..4408b9ba26 100644
--- a/src/wp-includes/class-wp-http-proxy.php
+++ b/src/wp-includes/class-wp-http-proxy.php
@@ -25,7 +25,7 @@
  * <li>WP_PROXY_PASSWORD - Proxy password, if it requires authentication.</li>
  * <li>WP_PROXY_BYPASS_HOSTS - Will prevent the hosts in this list from going through the proxy.
  * You do not need to have localhost and the site host in this list, because they will not be passed
- * through the proxy. The list should be presented in a comma separated list, wildcards using * are supported, eg. *.wordpress.org</li>
+ * through the proxy. The list should be presented in a comma separated list, wildcards using * are supported. Example: *.wordpress.org</li>
  * </ol>
  *
  * An example can be as seen below.
@@ -44,10 +44,12 @@ class WP_HTTP_Proxy {
 	/**
 	 * Whether proxy connection should be used.
 	 *
-	 * @since 2.8.0
+	 * Constants which control this behaviour:
+	 *
+	 * - `WP_PROXY_HOST`
+	 * - `WP_PROXY_PORT`
 	 *
-	 * @use WP_PROXY_HOST
-	 * @use WP_PROXY_PORT
+	 * @since 2.8.0
 	 *
 	 * @return bool
 	 */
@@ -58,10 +60,12 @@ class WP_HTTP_Proxy {
 	/**
 	 * Whether authentication should be used.
 	 *
-	 * @since 2.8.0
+	 * Constants which control this behaviour:
+	 *
+	 * - `WP_PROXY_USERNAME`
+	 * - `WP_PROXY_PASSWORD`
 	 *
-	 * @use WP_PROXY_USERNAME
-	 * @use WP_PROXY_PASSWORD
+	 * @since 2.8.0
 	 *
 	 * @return bool
 	 */
diff --git a/src/wp-includes/class-wp-http-streams.php b/src/wp-includes/class-wp-http-streams.php
index 998dbde34e..afb94cdbf5 100644
--- a/src/wp-includes/class-wp-http-streams.php
+++ b/src/wp-includes/class-wp-http-streams.php
@@ -416,7 +416,7 @@ class WP_Http_Streams {
 	 *
 	 * @param resource $stream The PHP Stream which the SSL request is being made over
 	 * @param string   $host   The hostname being requested
-	 * @return bool If the cerficiate presented in $stream is valid for $host
+	 * @return bool If the certificate presented in $stream is valid for $host
 	 */
 	public static function verify_ssl_certificate( $stream, $host ) {
 		$context_options = stream_context_get_options( $stream );
diff --git a/src/wp-includes/class-wp-http.php b/src/wp-includes/class-wp-http.php
index 0cc9c8f78b..8146ef94c2 100644
--- a/src/wp-includes/class-wp-http.php
+++ b/src/wp-includes/class-wp-http.php
@@ -136,7 +136,7 @@ class WP_Http {
 	 *     @type string       $sslcertificates     Absolute path to an SSL certificate .crt file.
 	 *                                             Default ABSPATH . WPINC . '/certificates/ca-bundle.crt'.
 	 *     @type bool         $stream              Whether to stream to a file. If set to true and no filename was
-	 *                                             given, it will be droped it in the WP temp dir and its name will
+	 *                                             given, it will be dropped it in the WP temp dir and its name will
 	 *                                             be set using the basename of the URL. Default false.
 	 *     @type string       $filename            Filename of the file to write to when streaming. $stream must be
 	 *                                             set to true. Default null.
@@ -435,7 +435,7 @@ class WP_Http {
 		}
 
 		/**
-		 * Filters the HTTP API response immediately before the response is returned.
+		 * Filters a successful HTTP API response immediately before the response is returned.
 		 *
 		 * @since 2.9.0
 		 *
diff --git a/src/wp-includes/class-wp-image-editor-gd.php b/src/wp-includes/class-wp-image-editor-gd.php
index f175b90d20..f32e2b4202 100644
--- a/src/wp-includes/class-wp-image-editor-gd.php
+++ b/src/wp-includes/class-wp-image-editor-gd.php
@@ -70,7 +70,7 @@ class WP_Image_Editor_GD extends WP_Image_Editor {
 			case 'image/gif':
 				return ( $image_types & IMG_GIF ) != 0;
 			case 'image/webp':
-				return ( $image_types & IMG_WEBP ) != 0; // phpcs:ignore PHPCompatibility.Constants.NewConstants.img_webpFound
+				return ( $image_types & IMG_WEBP ) != 0;
 		}
 
 		return false;
diff --git a/src/wp-includes/class-wp-image-editor-imagick.php b/src/wp-includes/class-wp-image-editor-imagick.php
index b7336fe5ae..d898db553a 100644
--- a/src/wp-includes/class-wp-image-editor-imagick.php
+++ b/src/wp-includes/class-wp-image-editor-imagick.php
@@ -589,7 +589,7 @@ class WP_Image_Editor_Imagick extends WP_Image_Editor {
 		try {
 			$this->image->rotateImage( new ImagickPixel( 'none' ), 360 - $angle );
 
-			// Normalise EXIF orientation data so that display is consistent across devices.
+			// Normalize EXIF orientation data so that display is consistent across devices.
 			if ( is_callable( array( $this->image, 'setImageOrientation' ) ) && defined( 'Imagick::ORIENTATION_TOPLEFT' ) ) {
 				$this->image->setImageOrientation( Imagick::ORIENTATION_TOPLEFT );
 			}
@@ -627,7 +627,7 @@ class WP_Image_Editor_Imagick extends WP_Image_Editor {
 				$this->image->flopImage();
 			}
 
-			// Normalise EXIF orientation data so that display is consistent across devices.
+			// Normalize EXIF orientation data so that display is consistent across devices.
 			if ( is_callable( array( $this->image, 'setImageOrientation' ) ) && defined( 'Imagick::ORIENTATION_TOPLEFT' ) ) {
 				$this->image->setImageOrientation( Imagick::ORIENTATION_TOPLEFT );
 			}
diff --git a/src/wp-includes/class-wp-image-editor.php b/src/wp-includes/class-wp-image-editor.php
index 67bb5d35db..823501eb46 100644
--- a/src/wp-includes/class-wp-image-editor.php
+++ b/src/wp-includes/class-wp-image-editor.php
@@ -175,7 +175,7 @@ abstract class WP_Image_Editor {
 	 *
 	 * @since 3.5.0
 	 *
-	 * @return array {
+	 * @return int[] {
 	 *     Dimensions of the image.
 	 *
 	 *     @type int $width  The image width.
@@ -485,7 +485,7 @@ abstract class WP_Image_Editor {
 		}
 
 		/**
-		 * Filters the `$orientation` value to correct it before rotating or to prevemnt rotating the image.
+		 * Filters the `$orientation` value to correct it before rotating or to prevent rotating the image.
 		 *
 		 * @since 5.3.0
 		 *
diff --git a/src/wp-includes/class-wp-list-util.php b/src/wp-includes/class-wp-list-util.php
index dfd44172b4..49fd3a00af 100644
--- a/src/wp-includes/class-wp-list-util.php
+++ b/src/wp-includes/class-wp-list-util.php
@@ -9,7 +9,7 @@
 /**
  * List utility.
  *
- * Utility class to handle operations on an array of objects.
+ * Utility class to handle operations on an array of objects or arrays.
  *
  * @since 4.7.0
  */
@@ -34,7 +34,7 @@ class WP_List_Util {
 	 * Temporary arguments for sorting.
 	 *
 	 * @since 4.7.0
-	 * @var array
+	 * @var string[]
 	 */
 	private $orderby = array();
 
@@ -102,7 +102,8 @@ class WP_List_Util {
 		$operator = strtoupper( $operator );
 
 		if ( ! in_array( $operator, array( 'AND', 'OR', 'NOT' ), true ) ) {
-			return array();
+			$this->output = array();
+			return $this->output;
 		}
 
 		$count    = count( $args );
@@ -139,15 +140,15 @@ class WP_List_Util {
 	}
 
 	/**
-	 * Plucks a certain field out of each object in the list.
+	 * Plucks a certain field out of each element in the input array.
 	 *
 	 * This has the same functionality and prototype of
 	 * array_column() (PHP 5.5) but also supports objects.
 	 *
 	 * @since 4.7.0
 	 *
-	 * @param int|string $field     Field from the object to place instead of the entire object
-	 * @param int|string $index_key Optional. Field from the object to use as keys for the new array.
+	 * @param int|string $field     Field to fetch from the object or array.
+	 * @param int|string $index_key Optional. Field from the element to use as keys for the new array.
 	 *                              Default null.
 	 * @return array Array of found values. If `$index_key` is set, an array of found values with keys
 	 *               corresponding to `$index_key`. If `$index_key` is null, array keys from the original
@@ -200,7 +201,7 @@ class WP_List_Util {
 	}
 
 	/**
-	 * Sorts the list, based on one or more orderby arguments.
+	 * Sorts the input array based on one or more orderby arguments.
 	 *
 	 * @since 4.7.0
 	 *
@@ -238,7 +239,7 @@ class WP_List_Util {
 	}
 
 	/**
-	 * Callback to sort the list by specific fields.
+	 * Callback to sort an array by specific fields.
 	 *
 	 * @since 4.7.0
 	 *
diff --git a/src/wp-includes/class-wp-locale.php b/src/wp-includes/class-wp-locale.php
index 50dd44847e..291848e974 100644
--- a/src/wp-includes/class-wp-locale.php
+++ b/src/wp-includes/class-wp-locale.php
@@ -18,7 +18,7 @@ class WP_Locale {
 	 * Stores the translated strings for the full weekday names.
 	 *
 	 * @since 2.1.0
-	 * @var array
+	 * @var string[]
 	 */
 	public $weekday;
 
@@ -31,7 +31,7 @@ class WP_Locale {
 	 * @see WP_Locale::init() for how to handle the hack.
 	 *
 	 * @since 2.1.0
-	 * @var array
+	 * @var string[]
 	 */
 	public $weekday_initial;
 
@@ -39,7 +39,7 @@ class WP_Locale {
 	 * Stores the translated strings for the abbreviated weekday names.
 	 *
 	 * @since 2.1.0
-	 * @var array
+	 * @var string[]
 	 */
 	public $weekday_abbrev;
 
@@ -47,7 +47,7 @@ class WP_Locale {
 	 * Stores the translated strings for the full month names.
 	 *
 	 * @since 2.1.0
-	 * @var array
+	 * @var string[]
 	 */
 	public $month;
 
@@ -55,7 +55,7 @@ class WP_Locale {
 	 * Stores the translated strings for the month names in genitive case, if the locale specifies.
 	 *
 	 * @since 4.4.0
-	 * @var array
+	 * @var string[]
 	 */
 	public $month_genitive;
 
@@ -63,7 +63,7 @@ class WP_Locale {
 	 * Stores the translated strings for the abbreviated month names.
 	 *
 	 * @since 2.1.0
-	 * @var array
+	 * @var string[]
 	 */
 	public $month_abbrev;
 
@@ -73,7 +73,7 @@ class WP_Locale {
 	 * Also the capitalized versions.
 	 *
 	 * @since 2.1.0
-	 * @var array
+	 * @var string[]
 	 */
 	public $meridiem;
 
@@ -138,7 +138,7 @@ class WP_Locale {
 
 		// Abbreviations for each day.
 		$this->weekday_abbrev[ __( 'Sunday' ) ]    = /* translators: Three-letter abbreviation of the weekday. */ __( 'Sun' );
-		$this->weekday_abbrev[ __( 'Monday' ) ]    = /* translators: Ttree-letter abbreviation of the weekday. */ __( 'Mon' );
+		$this->weekday_abbrev[ __( 'Monday' ) ]    = /* translators: Three-letter abbreviation of the weekday. */ __( 'Mon' );
 		$this->weekday_abbrev[ __( 'Tuesday' ) ]   = /* translators: Three-letter abbreviation of the weekday. */ __( 'Tue' );
 		$this->weekday_abbrev[ __( 'Wednesday' ) ] = /* translators: Three-letter abbreviation of the weekday. */ __( 'Wed' );
 		$this->weekday_abbrev[ __( 'Thursday' ) ]  = /* translators: Three-letter abbreviation of the weekday. */ __( 'Thu' );
diff --git a/src/wp-includes/class-wp-meta-query.php b/src/wp-includes/class-wp-meta-query.php
index 0b3ffab033..ac1da7d1f6 100644
--- a/src/wp-includes/class-wp-meta-query.php
+++ b/src/wp-includes/class-wp-meta-query.php
@@ -99,37 +99,68 @@ class WP_Meta_Query {
 	 *
 	 * @since 3.2.0
 	 * @since 4.2.0 Introduced support for naming query clauses by associative array keys.
-	 * @since 5.1.0 Introduced $compare_key clause parameter, which enables LIKE key matches.
-	 * @since 5.3.0 Increased the number of operators available to $compare_key. Introduced $type_key,
-	 *              which enables the $key to be cast to a new data type for comparisons.
+	 * @since 5.1.0 Introduced `$compare_key` clause parameter, which enables LIKE key matches.
+	 * @since 5.3.0 Increased the number of operators available to `$compare_key`. Introduced `$type_key`,
+	 *              which enables the `$key` to be cast to a new data type for comparisons.
 	 *
 	 * @param array $meta_query {
 	 *     Array of meta query clauses. When first-order clauses or sub-clauses use strings as
 	 *     their array keys, they may be referenced in the 'orderby' parameter of the parent query.
 	 *
-	 *     @type string $relation Optional. The MySQL keyword used to join
-	 *                            the clauses of the query. Accepts 'AND', or 'OR'. Default 'AND'.
+	 *     @type string $relation Optional. The MySQL keyword used to join the clauses of the query.
+	 *                            Accepts 'AND' or 'OR'. Default 'AND'.
 	 *     @type array  ...$0 {
 	 *         Optional. An array of first-order clause parameters, or another fully-formed meta query.
 	 *
-	 *         @type string $key         Meta key to filter by.
-	 *         @type string $compare_key MySQL operator used for comparing the $key. Accepts '=', '!='
-	 *                                   'LIKE', 'NOT LIKE', 'IN', 'NOT IN', 'REGEXP', 'NOT REGEXP', 'RLIKE',
-	 *                                   'EXISTS' (alias of '=') or 'NOT EXISTS' (alias of '!=').
-	 *                                   Default is 'IN' when `$key` is an array, '=' otherwise.
-	 *         @type string $type_key    MySQL data type that the meta_key column will be CAST to for
-	 *                                   comparisons. Accepts 'BINARY' for case-sensitive regular expression
-	 *                                   comparisons. Default is ''.
-	 *         @type string $value       Meta value to filter by.
-	 *         @type string $compare     MySQL operator used for comparing the $value. Accepts '=',
-	 *                                   '!=', '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE',
-	 *                                   'IN', 'NOT IN', 'BETWEEN', 'NOT BETWEEN', 'REGEXP',
-	 *                                   'NOT REGEXP', 'RLIKE', 'EXISTS' or 'NOT EXISTS'.
-	 *                                   Default is 'IN' when `$value` is an array, '=' otherwise.
-	 *         @type string $type        MySQL data type that the meta_value column will be CAST to for
-	 *                                   comparisons. Accepts 'NUMERIC', 'BINARY', 'CHAR', 'DATE',
-	 *                                   'DATETIME', 'DECIMAL', 'SIGNED', 'TIME', or 'UNSIGNED'.
-	 *                                   Default is 'CHAR'.
+	 *         @type string|string[] $key         Meta key or keys to filter by.
+	 *         @type string          $compare_key MySQL operator used for comparing the $key. Accepts:
+	 *                                            - '='
+	 *                                            - '!='
+	 *                                            - 'LIKE'
+	 *                                            - 'NOT LIKE'
+	 *                                            - 'IN'
+	 *                                            - 'NOT IN'
+	 *                                            - 'REGEXP'
+	 *                                            - 'NOT REGEXP'
+	 *                                            - 'RLIKE',
+	 *                                            - 'EXISTS' (alias of '=')
+	 *                                            - 'NOT EXISTS' (alias of '!=')
+	 *                                            Default is 'IN' when `$key` is an array, '=' otherwise.
+	 *         @type string          $type_key    MySQL data type that the meta_key column will be CAST to for
+	 *                                            comparisons. Accepts 'BINARY' for case-sensitive regular expression
+	 *                                            comparisons. Default is ''.
+	 *         @type string|string[] $value       Meta value or values to filter by.
+	 *         @type string          $compare     MySQL operator used for comparing the $value. Accepts:
+	 *                                            - '=',
+	 *                                            - '!='
+	 *                                            - '>'
+	 *                                            - '>='
+	 *                                            - '<'
+	 *                                            - '<='
+	 *                                            - 'LIKE'
+	 *                                            - 'NOT LIKE'
+	 *                                            - 'IN'
+	 *                                            - 'NOT IN'
+	 *                                            - 'BETWEEN'
+	 *                                            - 'NOT BETWEEN'
+	 *                                            - 'REGEXP'
+	 *                                            - 'NOT REGEXP'
+	 *                                            - 'RLIKE'
+	 *                                            - 'EXISTS'
+	 *                                            - 'NOT EXISTS'
+	 *                                            Default is 'IN' when `$value` is an array, '=' otherwise.
+	 *         @type string          $type        MySQL data type that the meta_value column will be CAST to for
+	 *                                            comparisons. Accepts:
+	 *                                            - 'NUMERIC'
+	 *                                            - 'BINARY'
+	 *                                            - 'CHAR'
+	 *                                            - 'DATE'
+	 *                                            - 'DATETIME'
+	 *                                            - 'DECIMAL'
+	 *                                            - 'SIGNED'
+	 *                                            - 'TIME'
+	 *                                            - 'UNSIGNED'
+	 *                                            Default is 'CHAR'.
 	 *     }
 	 * }
 	 */
@@ -307,12 +338,15 @@ class WP_Meta_Query {
 	 *
 	 * @since 3.2.0
 	 *
-	 * @param string $type              Type of meta, eg 'user', 'post'.
+	 * @param string $type              Type of meta. Possible values include but are not limited
+	 *                                  to 'post', 'comment', 'blog', 'term', and 'user'.
 	 * @param string $primary_table     Database table where the object being filtered is stored (eg wp_users).
 	 * @param string $primary_id_column ID column for the filtered object in $primary_table.
-	 * @param object $context           Optional. The main query object.
-	 * @return array|false {
-	 *     Array containing JOIN and WHERE SQL clauses to append to the main query.
+	 * @param object $context           Optional. The main query object that corresponds to the type, for
+	 *                                  example a `WP_Query`, `WP_User_Query`, or `WP_Site_Query`.
+	 * @return string[]|false {
+	 *     Array containing JOIN and WHERE SQL clauses to append to the main query,
+	 *     or false if no table exists for the requested meta type.
 	 *
 	 *     @type string $join  SQL fragment to append to the main JOIN clause.
 	 *     @type string $where SQL fragment to append to the main WHERE clause.
@@ -347,12 +381,14 @@ class WP_Meta_Query {
 		 *
 		 * @since 3.1.0
 		 *
-		 * @param array  $sql               Array containing the query's JOIN and WHERE clauses.
-		 * @param array  $queries           Array of meta queries.
-		 * @param string $type              Type of meta.
-		 * @param string $primary_table     Primary table.
-		 * @param string $primary_id_column Primary column ID.
-		 * @param object $context           The main query object.
+		 * @param string[] $sql               Array containing the query's JOIN and WHERE clauses.
+		 * @param array    $queries           Array of meta queries.
+		 * @param string   $type              Type of meta. Possible values include but are not limited
+		 *                                    to 'post', 'comment', 'blog', 'term', and 'user'.
+		 * @param string   $primary_table     Primary table.
+		 * @param string   $primary_id_column Primary column ID.
+		 * @param object   $context           The main query object that corresponds to the type, for
+		 *                                    example a `WP_Query`, `WP_User_Query`, or `WP_Site_Query`.
 		 */
 		return apply_filters_ref_array( 'get_meta_sql', array( $sql, $this->queries, $type, $primary_table, $primary_id_column, $context ) );
 	}
@@ -365,7 +401,7 @@ class WP_Meta_Query {
 	 *
 	 * @since 4.1.0
 	 *
-	 * @return array {
+	 * @return string[] {
 	 *     Array containing JOIN and WHERE SQL clauses to append to the main query.
 	 *
 	 *     @type string $join  SQL fragment to append to the main JOIN clause.
@@ -398,7 +434,7 @@ class WP_Meta_Query {
 	 * @param array $query Query to parse (passed by reference).
 	 * @param int   $depth Optional. Number of tree levels deep we currently are.
 	 *                     Used to calculate indentation. Default 0.
-	 * @return array {
+	 * @return string[] {
 	 *     Array containing JOIN and WHERE SQL clauses to append to a single query array.
 	 *
 	 *     @type string $join  SQL fragment to append to the main JOIN clause.
@@ -484,7 +520,7 @@ class WP_Meta_Query {
 	 * @param array  $parent_query Parent query array.
 	 * @param string $clause_key   Optional. The array key used to name the clause in the original `$meta_query`
 	 *                             parameters. If not provided, a key will be generated automatically.
-	 * @return array {
+	 * @return string[] {
 	 *     Array containing JOIN and WHERE SQL clauses to append to a first-order query.
 	 *
 	 *     @type string $join  SQL fragment to append to the main JOIN clause.
@@ -812,7 +848,7 @@ class WP_Meta_Query {
 			$clause_compare  = strtoupper( $clause['compare'] );
 			$sibling_compare = strtoupper( $sibling['compare'] );
 			if ( in_array( $clause_compare, $compatible_compares, true ) && in_array( $sibling_compare, $compatible_compares, true ) ) {
-				$alias = $sibling['alias'];
+				$alias = preg_replace( '/\W/', '_', $sibling['alias'] );
 				break;
 			}
 		}
diff --git a/src/wp-includes/class-wp-post-type.php b/src/wp-includes/class-wp-post-type.php
index 029bd26fe7..ef40f4ec90 100644
--- a/src/wp-includes/class-wp-post-type.php
+++ b/src/wp-includes/class-wp-post-type.php
@@ -92,6 +92,7 @@ final class WP_Post_Type {
 	 * Whether queries can be performed on the front end for the post type as part of `parse_request()`.
 	 *
 	 * Endpoints would include:
+	 *
 	 * - `?post_type={post_type_key}`
 	 * - `?{post_type_key}={single_post_slug}`
 	 * - `?{post_type_query_var}={single_post_slug}`
@@ -117,8 +118,8 @@ final class WP_Post_Type {
 	 * Where to show the post type in the admin menu.
 	 *
 	 * To work, $show_ui must be true. If true, the post type is shown in its own top level menu. If false, no menu is
-	 * shown. If a string of an existing top level menu (eg. 'tools.php' or 'edit.php?post_type=page'), the post type
-	 * will be placed as a sub-menu of that.
+	 * shown. If a string of an existing top level menu ('tools.php' or 'edit.php?post_type=page', for example), the
+	 * post type will be placed as a sub-menu of that.
 	 *
 	 * Default is the value of $show_ui.
 	 *
diff --git a/src/wp-includes/class-wp-query.php b/src/wp-includes/class-wp-query.php
index 1f9516eec4..975d1318a5 100644
--- a/src/wp-includes/class-wp-query.php
+++ b/src/wp-includes/class-wp-query.php
@@ -630,118 +630,137 @@ class WP_Query {
 	 * @param string|array $query {
 	 *     Optional. Array or string of Query parameters.
 	 *
-	 *     @type int          $attachment_id           Attachment post ID. Used for 'attachment' post_type.
-	 *     @type int|string   $author                  Author ID, or comma-separated list of IDs.
-	 *     @type string       $author_name             User 'user_nicename'.
-	 *     @type int[]        $author__in              An array of author IDs to query from.
-	 *     @type int[]        $author__not_in          An array of author IDs not to query from.
-	 *     @type bool         $cache_results           Whether to cache post information. Default true.
-	 *     @type int|string   $cat                     Category ID or comma-separated list of IDs (this or any children).
-	 *     @type int[]        $category__and           An array of category IDs (AND in).
-	 *     @type int[]        $category__in            An array of category IDs (OR in, no children).
-	 *     @type int[]        $category__not_in        An array of category IDs (NOT in).
-	 *     @type string       $category_name           Use category slug (not name, this or any children).
-	 *     @type array|int    $comment_count           Filter results by comment count. Provide an integer to match
-	 *                                                 comment count exactly. Provide an array with integer 'value'
-	 *                                                 and 'compare' operator ('=', '!=', '>', '>=', '<', '<=' ) to
-	 *                                                 compare against comment_count in a specific way.
-	 *     @type string       $comment_status          Comment status.
-	 *     @type int          $comments_per_page       The number of comments to return per page.
-	 *                                                 Default 'comments_per_page' option.
-	 *     @type array        $date_query              An associative array of WP_Date_Query arguments.
-	 *                                                 See WP_Date_Query::__construct().
-	 *     @type int          $day                     Day of the month. Default empty. Accepts numbers 1-31.
-	 *     @type bool         $exact                   Whether to search by exact keyword. Default false.
-	 *     @type string       $fields                  Post fields to query for. Accepts:
-	 *                                                 - '' Returns an array of complete post objects (`WP_Post[]`).
-	 *                                                 - 'ids' Returns an array of post IDs (`int[]`).
-	 *                                                 - 'id=>parent' Returns an associative array of parent post IDs,
-	 *                                                   keyed by post ID (`int[]`).
-	 *                                                 Default ''.
-	 *     @type int          $hour                    Hour of the day. Default empty. Accepts numbers 0-23.
-	 *     @type int|bool     $ignore_sticky_posts     Whether to ignore sticky posts or not. Setting this to false
-	 *                                                 excludes stickies from 'post__in'. Accepts 1|true, 0|false.
-	 *                                                 Default false.
-	 *     @type int          $m                       Combination YearMonth. Accepts any four-digit year and month
-	 *                                                 numbers 1-12. Default empty.
-	 *     @type string       $meta_compare            Comparison operator to test the 'meta_value'.
-	 *     @type string       $meta_compare_key        Comparison operator to test the 'meta_key'.
-	 *     @type string       $meta_key                Custom field key.
-	 *     @type array        $meta_query              An associative array of WP_Meta_Query arguments. See WP_Meta_Query.
-	 *     @type string       $meta_value              Custom field value.
-	 *     @type int          $meta_value_num          Custom field value number.
-	 *     @type string       $meta_type_key           Cast for 'meta_key'. See WP_Meta_Query::construct().
-	 *     @type int          $menu_order              The menu order of the posts.
-	 *     @type int          $minute                  Minute of the hour. Default empty. Accepts numbers 0-59.
-	 *     @type int          $monthnum                The two-digit month. Default empty. Accepts numbers 1-12.
-	 *     @type string       $name                    Post slug.
-	 *     @type bool         $nopaging                Show all posts (true) or paginate (false). Default false.
-	 *     @type bool         $no_found_rows           Whether to skip counting the total rows found. Enabling can improve
-	 *                                                 performance. Default false.
-	 *     @type int          $offset                  The number of posts to offset before retrieval.
-	 *     @type string       $order                   Designates ascending or descending order of posts. Default 'DESC'.
-	 *                                                 Accepts 'ASC', 'DESC'.
-	 *     @type string|array $orderby                 Sort retrieved posts by parameter. One or more options may be
-	 *                                                 passed. To use 'meta_value', or 'meta_value_num',
-	 *                                                 'meta_key=keyname' must be also be defined. To sort by a
-	 *                                                 specific `$meta_query` clause, use that clause's array key.
-	 *                                                 Accepts 'none', 'name', 'author', 'date', 'title',
-	 *                                                 'modified', 'menu_order', 'parent', 'ID', 'rand',
-	 *                                                 'relevance', 'RAND(x)' (where 'x' is an integer seed value),
-	 *                                                 'comment_count', 'meta_value', 'meta_value_num', 'post__in',
-	 *                                                 'post_name__in', 'post_parent__in', and the array keys
-	 *                                                 of `$meta_query`. Default is 'date', except when a search
-	 *                                                 is being performed, when the default is 'relevance'.
-	 *     @type int          $p                       Post ID.
-	 *     @type int          $page                    Show the number of posts that would show up on page X of a
-	 *                                                 static front page.
-	 *     @type int          $paged                   The number of the current page.
-	 *     @type int          $page_id                 Page ID.
-	 *     @type string       $pagename                Page slug.
-	 *     @type string       $perm                    Show posts if user has the appropriate capability.
-	 *     @type string       $ping_status             Ping status.
-	 *     @type int[]        $post__in                An array of post IDs to retrieve, sticky posts will be included.
-	 *     @type int[]        $post__not_in            An array of post IDs not to retrieve. Note: a string of comma-
-	 *                                                 separated IDs will NOT work.
-	 *     @type string       $post_mime_type          The mime type of the post. Used for 'attachment' post_type.
-	 *     @type string[]     $post_name__in           An array of post slugs that results must match.
-	 *     @type int          $post_parent             Page ID to retrieve child pages for. Use 0 to only retrieve
-	 *                                                 top-level pages.
-	 *     @type int[]        $post_parent__in         An array containing parent page IDs to query child pages from.
-	 *     @type int[]        $post_parent__not_in     An array containing parent page IDs not to query child pages from.
-	 *     @type string|array $post_type               A post type slug (string) or array of post type slugs.
-	 *                                                 Default 'any' if using 'tax_query'.
-	 *     @type string|array $post_status             A post status (string) or array of post statuses.
-	 *     @type int          $posts_per_page          The number of posts to query for. Use -1 to request all posts.
-	 *     @type int          $posts_per_archive_page  The number of posts to query for by archive page. Overrides
-	 *                                                 'posts_per_page' when is_archive(), or is_search() are true.
-	 *     @type string       $s                       Search keyword(s). Prepending a term with a hyphen will
-	 *                                                 exclude posts matching that term. Eg, 'pillow -sofa' will
-	 *                                                 return posts containing 'pillow' but not 'sofa'. The
-	 *                                                 character used for exclusion can be modified using the
-	 *                                                 the 'wp_query_search_exclusion_prefix' filter.
-	 *     @type int          $second                  Second of the minute. Default empty. Accepts numbers 0-59.
-	 *     @type bool         $sentence                Whether to search by phrase. Default false.
-	 *     @type bool         $suppress_filters        Whether to suppress filters. Default false.
-	 *     @type string       $tag                     Tag slug. Comma-separated (either), Plus-separated (all).
-	 *     @type int[]        $tag__and                An array of tag IDs (AND in).
-	 *     @type int[]        $tag__in                 An array of tag IDs (OR in).
-	 *     @type int[]        $tag__not_in             An array of tag IDs (NOT in).
-	 *     @type int          $tag_id                  Tag id or comma-separated list of IDs.
-	 *     @type string[]     $tag_slug__and           An array of tag slugs (AND in).
-	 *     @type string[]     $tag_slug__in            An array of tag slugs (OR in). unless 'ignore_sticky_posts' is
-	 *                                                 true. Note: a string of comma-separated IDs will NOT work.
-	 *     @type array        $tax_query               An associative array of WP_Tax_Query arguments.
-	 *                                                 See WP_Tax_Query->__construct().
-	 *     @type string       $title                   Post title.
-	 *     @type bool         $update_post_meta_cache  Whether to update the post meta cache. Default true.
-	 *     @type bool         $update_post_term_cache  Whether to update the post term cache. Default true.
-	 *     @type bool         $lazy_load_term_meta     Whether to lazy-load term meta. Setting to false will
-	 *                                                 disable cache priming for term meta, so that each
-	 *                                                 get_term_meta() call will hit the database.
-	 *                                                 Defaults to the value of `$update_post_term_cache`.
-	 *     @type int          $w                       The week number of the year. Default empty. Accepts numbers 0-53.
-	 *     @type int          $year                    The four-digit year. Default empty. Accepts any four-digit year.
+	 *     @type int             $attachment_id           Attachment post ID. Used for 'attachment' post_type.
+	 *     @type int|string      $author                  Author ID, or comma-separated list of IDs.
+	 *     @type string          $author_name             User 'user_nicename'.
+	 *     @type int[]           $author__in              An array of author IDs to query from.
+	 *     @type int[]           $author__not_in          An array of author IDs not to query from.
+	 *     @type bool            $cache_results           Whether to cache post information. Default true.
+	 *     @type int|string      $cat                     Category ID or comma-separated list of IDs (this or any children).
+	 *     @type int[]           $category__and           An array of category IDs (AND in).
+	 *     @type int[]           $category__in            An array of category IDs (OR in, no children).
+	 *     @type int[]           $category__not_in        An array of category IDs (NOT in).
+	 *     @type string          $category_name           Use category slug (not name, this or any children).
+	 *     @type array|int       $comment_count           Filter results by comment count. Provide an integer to match
+	 *                                                    comment count exactly. Provide an array with integer 'value'
+	 *                                                    and 'compare' operator ('=', '!=', '>', '>=', '<', '<=' ) to
+	 *                                                    compare against comment_count in a specific way.
+	 *     @type string          $comment_status          Comment status.
+	 *     @type int             $comments_per_page       The number of comments to return per page.
+	 *                                                    Default 'comments_per_page' option.
+	 *     @type array           $date_query              An associative array of WP_Date_Query arguments.
+	 *                                                    See WP_Date_Query::__construct().
+	 *     @type int             $day                     Day of the month. Default empty. Accepts numbers 1-31.
+	 *     @type bool            $exact                   Whether to search by exact keyword. Default false.
+	 *     @type string          $fields                  Post fields to query for. Accepts:
+	 *                                                    - '' Returns an array of complete post objects (`WP_Post[]`).
+	 *                                                    - 'ids' Returns an array of post IDs (`int[]`).
+	 *                                                    - 'id=>parent' Returns an associative array of parent post IDs,
+	 *                                                      keyed by post ID (`int[]`).
+	 *                                                    Default ''.
+	 *     @type int             $hour                    Hour of the day. Default empty. Accepts numbers 0-23.
+	 *     @type int|bool        $ignore_sticky_posts     Whether to ignore sticky posts or not. Setting this to false
+	 *                                                    excludes stickies from 'post__in'. Accepts 1|true, 0|false.
+	 *                                                    Default false.
+	 *     @type int             $m                       Combination YearMonth. Accepts any four-digit year and month
+	 *                                                    numbers 1-12. Default empty.
+	 *     @type string|string[] $meta_key                Meta key or keys to filter by.
+	 *     @type string|string[] $meta_value              Meta value or values to filter by.
+	 *     @type string          $meta_compare            MySQL operator used for comparing the meta value.
+	 *                                                    See WP_Meta_Query::__construct for accepted values and default value.
+	 *     @type string          $meta_compare_key        MySQL operator used for comparing the meta key.
+	 *                                                    See WP_Meta_Query::__construct for accepted values and default value.
+	 *     @type string          $meta_type               MySQL data type that the meta_value column will be CAST to for comparisons.
+	 *                                                    See WP_Meta_Query::__construct for accepted values and default value.
+	 *     @type string          $meta_type_key           MySQL data type that the meta_key column will be CAST to for comparisons.
+	 *                                                    See WP_Meta_Query::__construct for accepted values and default value.
+	 *     @type array           $meta_query              An associative array of WP_Meta_Query arguments.
+	 *                                                    See WP_Meta_Query::__construct for accepted values.
+	 *     @type int             $menu_order              The menu order of the posts.
+	 *     @type int             $minute                  Minute of the hour. Default empty. Accepts numbers 0-59.
+	 *     @type int             $monthnum                The two-digit month. Default empty. Accepts numbers 1-12.
+	 *     @type string          $name                    Post slug.
+	 *     @type bool            $nopaging                Show all posts (true) or paginate (false). Default false.
+	 *     @type bool            $no_found_rows           Whether to skip counting the total rows found. Enabling can improve
+	 *                                                    performance. Default false.
+	 *     @type int             $offset                  The number of posts to offset before retrieval.
+	 *     @type string          $order                   Designates ascending or descending order of posts. Default 'DESC'.
+	 *                                                    Accepts 'ASC', 'DESC'.
+	 *     @type string|array    $orderby                 Sort retrieved posts by parameter. One or more options may be passed.
+	 *                                                    To use 'meta_value', or 'meta_value_num', 'meta_key=keyname' must be
+	 *                                                    also be defined. To sort by a specific `$meta_query` clause, use that
+	 *                                                    clause's array key. Accepts:
+	 *                                                    - 'none'
+	 *                                                    - 'name'
+	 *                                                    - 'author'
+	 *                                                    - 'date'
+	 *                                                    - 'title'
+	 *                                                    - 'modified'
+	 *                                                    - 'menu_order'
+	 *                                                    - 'parent'
+	 *                                                    - 'ID'
+	 *                                                    - 'rand'
+	 *                                                    - 'relevance'
+	 *                                                    - 'RAND(x)' (where 'x' is an integer seed value)
+	 *                                                    - 'comment_count'
+	 *                                                    - 'meta_value'
+	 *                                                    - 'meta_value_num'
+	 *                                                    - 'post__in'
+	 *                                                    - 'post_name__in'
+	 *                                                    - 'post_parent__in'
+	 *                                                    - The array keys of `$meta_query`.
+	 *                                                    Default is 'date', except when a search is being performed, when
+	 *                                                    the default is 'relevance'.
+	 *     @type int             $p                       Post ID.
+	 *     @type int             $page                    Show the number of posts that would show up on page X of a
+	 *                                                    static front page.
+	 *     @type int             $paged                   The number of the current page.
+	 *     @type int             $page_id                 Page ID.
+	 *     @type string          $pagename                Page slug.
+	 *     @type string          $perm                    Show posts if user has the appropriate capability.
+	 *     @type string          $ping_status             Ping status.
+	 *     @type int[]           $post__in                An array of post IDs to retrieve, sticky posts will be included.
+	 *     @type int[]           $post__not_in            An array of post IDs not to retrieve. Note: a string of comma-
+	 *                                                    separated IDs will NOT work.
+	 *     @type string          $post_mime_type          The mime type of the post. Used for 'attachment' post_type.
+	 *     @type string[]        $post_name__in           An array of post slugs that results must match.
+	 *     @type int             $post_parent             Page ID to retrieve child pages for. Use 0 to only retrieve
+	 *                                                    top-level pages.
+	 *     @type int[]           $post_parent__in         An array containing parent page IDs to query child pages from.
+	 *     @type int[]           $post_parent__not_in     An array containing parent page IDs not to query child pages from.
+	 *     @type string|string[] $post_type               A post type slug (string) or array of post type slugs.
+	 *                                                    Default 'any' if using 'tax_query'.
+	 *     @type string|string[] $post_status             A post status (string) or array of post statuses.
+	 *     @type int             $posts_per_page          The number of posts to query for. Use -1 to request all posts.
+	 *     @type int             $posts_per_archive_page  The number of posts to query for by archive page. Overrides
+	 *                                                    'posts_per_page' when is_archive(), or is_search() are true.
+	 *     @type string          $s                       Search keyword(s). Prepending a term with a hyphen will
+	 *                                                    exclude posts matching that term. Eg, 'pillow -sofa' will
+	 *                                                    return posts containing 'pillow' but not 'sofa'. The
+	 *                                                    character used for exclusion can be modified using the
+	 *                                                    the 'wp_query_search_exclusion_prefix' filter.
+	 *     @type int             $second                  Second of the minute. Default empty. Accepts numbers 0-59.
+	 *     @type bool            $sentence                Whether to search by phrase. Default false.
+	 *     @type bool            $suppress_filters        Whether to suppress filters. Default false.
+	 *     @type string          $tag                     Tag slug. Comma-separated (either), Plus-separated (all).
+	 *     @type int[]           $tag__and                An array of tag IDs (AND in).
+	 *     @type int[]           $tag__in                 An array of tag IDs (OR in).
+	 *     @type int[]           $tag__not_in             An array of tag IDs (NOT in).
+	 *     @type int             $tag_id                  Tag id or comma-separated list of IDs.
+	 *     @type string[]        $tag_slug__and           An array of tag slugs (AND in).
+	 *     @type string[]        $tag_slug__in            An array of tag slugs (OR in). unless 'ignore_sticky_posts' is
+	 *                                                    true. Note: a string of comma-separated IDs will NOT work.
+	 *     @type array           $tax_query               An associative array of WP_Tax_Query arguments.
+	 *                                                    See WP_Tax_Query->__construct().
+	 *     @type string          $title                   Post title.
+	 *     @type bool            $update_post_meta_cache  Whether to update the post meta cache. Default true.
+	 *     @type bool            $update_post_term_cache  Whether to update the post term cache. Default true.
+	 *     @type bool            $lazy_load_term_meta     Whether to lazy-load term meta. Setting to false will
+	 *                                                    disable cache priming for term meta, so that each
+	 *                                                    get_term_meta() call will hit the database.
+	 *                                                    Defaults to the value of `$update_post_term_cache`.
+	 *     @type int             $w                       The week number of the year. Default empty. Accepts numbers 0-53.
+	 *     @type int             $year                    The four-digit year. Default empty. Accepts any four-digit year.
 	 * }
 	 */
 	public function parse_query( $query = '' ) {
@@ -2807,11 +2826,21 @@ class WP_Query {
 			 * Filters all query clauses at once, for convenience.
 			 *
 			 * Covers the WHERE, GROUP BY, JOIN, ORDER BY, DISTINCT,
-			 * fields (SELECT), and LIMITS clauses.
+			 * fields (SELECT), and LIMIT clauses.
 			 *
 			 * @since 3.1.0
 			 *
-			 * @param string[] $clauses Associative array of the clauses for the query.
+			 * @param string[] $clauses {
+			 *     Associative array of the clauses for the query.
+			 *
+			 *     @type string $where    The WHERE clause of the query.
+			 *     @type string $groupby  The GROUP BY clause of the query.
+			 *     @type string $join     The JOIN clause of the query.
+			 *     @type string $orderby  The ORDER BY clause of the query.
+			 *     @type string $distinct The DISTINCT clause of the query.
+			 *     @type string $fields   The SELECT clause of the query.
+			 *     @type string $limits   The LIMIT clause of the query.
+			 * }
 			 * @param WP_Query $query   The WP_Query instance (passed by reference).
 			 */
 			$clauses = (array) apply_filters_ref_array( 'posts_clauses', array( compact( $pieces ), &$this ) );
@@ -2931,11 +2960,21 @@ class WP_Query {
 			 * For use by caching plugins.
 			 *
 			 * Covers the WHERE, GROUP BY, JOIN, ORDER BY, DISTINCT,
-			 * fields (SELECT), and LIMITS clauses.
+			 * fields (SELECT), and LIMIT clauses.
 			 *
 			 * @since 3.1.0
 			 *
-			 * @param string[] $pieces Associative array of the pieces of the query.
+			 * @param string[] $pieces {
+			 *     Associative array of the clauses for the query.
+			 *
+			 *     @type string $where    The WHERE clause of the query.
+			 *     @type string $groupby  The GROUP BY clause of the query.
+			 *     @type string $join     The JOIN clause of the query.
+			 *     @type string $orderby  The ORDER BY clause of the query.
+			 *     @type string $distinct The DISTINCT clause of the query.
+			 *     @type string $fields   The SELECT clause of the query.
+			 *     @type string $limits   The LIMIT clause of the query.
+			 * }
 			 * @param WP_Query $query  The WP_Query instance (passed by reference).
 			 */
 			$clauses = (array) apply_filters_ref_array( 'posts_clauses_request', array( compact( $pieces ), &$this ) );
diff --git a/src/wp-includes/class-wp-recovery-mode-email-service.php b/src/wp-includes/class-wp-recovery-mode-email-service.php
index 9c8dd6964a..574744b138 100644
--- a/src/wp-includes/class-wp-recovery-mode-email-service.php
+++ b/src/wp-includes/class-wp-recovery-mode-email-service.php
@@ -338,7 +338,7 @@ When seeking help with this issue, you may be asked for some of the following in
 			),
 			'theme' => sprintf(
 				/* translators: 1: Current active theme name. 2: Current active theme version. */
-				__( 'Current theme: %1$s (version %2$s)' ),
+				__( 'Active theme: %1$s (version %2$s)' ),
 				$theme->get( 'Name' ),
 				$theme->get( 'Version' )
 			),
diff --git a/src/wp-includes/class-wp-rewrite.php b/src/wp-includes/class-wp-rewrite.php
index 531707884b..a1a262aa7b 100644
--- a/src/wp-includes/class-wp-rewrite.php
+++ b/src/wp-includes/class-wp-rewrite.php
@@ -275,7 +275,7 @@ class WP_Rewrite {
 	 * Additional tags can be added with add_rewrite_tag().
 	 *
 	 * @since 1.5.0
-	 * @var array
+	 * @var string[]
 	 */
 	public $rewritecode = array(
 		'%year%',
@@ -296,7 +296,7 @@ class WP_Rewrite {
 	 * of rewrite tags, see WP_Rewrite::$rewritecode.
 	 *
 	 * @since 1.5.0
-	 * @var array
+	 * @var string[]
 	 */
 	public $rewritereplace = array(
 		'([0-9]{4})',
@@ -316,7 +316,7 @@ class WP_Rewrite {
 	 * Query variables that rewrite tags map to, see WP_Rewrite::$rewritecode.
 	 *
 	 * @since 1.5.0
-	 * @var array
+	 * @var string[]
 	 */
 	public $queryreplace = array(
 		'year=',
@@ -336,7 +336,7 @@ class WP_Rewrite {
 	 * Supported default feeds.
 	 *
 	 * @since 1.5.0
-	 * @var array
+	 * @var string[]
 	 */
 	public $feeds = array( 'feed', 'rdf', 'rss', 'rss2', 'atom' );
 
@@ -1173,7 +1173,7 @@ class WP_Rewrite {
 
 					// Not matching a permalink so this is a lot simpler.
 				} else {
-					// Close the match and finalise the query.
+					// Close the match and finalize the query.
 					$match .= '?$';
 					$query  = $index . '?' . $query;
 				}
diff --git a/src/wp-includes/class-wp-simplepie-sanitize-kses.php b/src/wp-includes/class-wp-simplepie-sanitize-kses.php
index ae462bf1cb..183fe07ca7 100644
--- a/src/wp-includes/class-wp-simplepie-sanitize-kses.php
+++ b/src/wp-includes/class-wp-simplepie-sanitize-kses.php
@@ -8,7 +8,7 @@
  */
 
 /**
- * Core class used to implement SimpliePie feed sanitization.
+ * Core class used to implement SimplePie feed sanitization.
  *
  * Extends the SimplePie_Sanitize class to use KSES, because
  * we cannot universally count on DOMDocument being available.
diff --git a/src/wp-includes/class-wp-site-query.php b/src/wp-includes/class-wp-site-query.php
index 4445f6880f..703c9580f1 100644
--- a/src/wp-includes/class-wp-site-query.php
+++ b/src/wp-includes/class-wp-site-query.php
@@ -109,62 +109,74 @@ class WP_Site_Query {
 	 * @since 4.6.0
 	 * @since 4.8.0 Introduced the 'lang_id', 'lang__in', and 'lang__not_in' parameters.
 	 * @since 5.1.0 Introduced the 'update_site_meta_cache', 'meta_query', 'meta_key',
-	 *              'meta_value', 'meta_type' and 'meta_compare' parameters.
+	 *              'meta_compare_key', 'meta_value', 'meta_type', and 'meta_compare' parameters.
+	 * @since 5.3.0 Introduced the 'meta_type_key' parameter.
 	 *
 	 * @param string|array $query {
 	 *     Optional. Array or query string of site query parameters. Default empty.
 	 *
-	 *     @type int[]        $site__in               Array of site IDs to include. Default empty.
-	 *     @type int[]        $site__not_in           Array of site IDs to exclude. Default empty.
-	 *     @type bool         $count                  Whether to return a site count (true) or array of site objects.
-	 *                                                Default false.
-	 *     @type array        $date_query             Date query clauses to limit sites by. See WP_Date_Query.
-	 *                                                Default null.
-	 *     @type string       $fields                 Site fields to return. Accepts 'ids' (returns an array of site IDs)
-	 *                                                or empty (returns an array of complete site objects). Default empty.
-	 *     @type int          $ID                     A site ID to only return that site. Default empty.
-	 *     @type int          $number                 Maximum number of sites to retrieve. Default 100.
-	 *     @type int          $offset                 Number of sites to offset the query. Used to build LIMIT clause.
-	 *                                                Default 0.
-	 *     @type bool         $no_found_rows          Whether to disable the `SQL_CALC_FOUND_ROWS` query. Default true.
-	 *     @type string|array $orderby                Site status or array of statuses. Accepts 'id', 'domain', 'path',
-	 *                                                'network_id', 'last_updated', 'registered', 'domain_length',
-	 *                                                'path_length', 'site__in' and 'network__in'. Also accepts false,
-	 *                                                an empty array, or 'none' to disable `ORDER BY` clause.
-	 *                                                Default 'id'.
-	 *     @type string       $order                  How to order retrieved sites. Accepts 'ASC', 'DESC'. Default 'ASC'.
-	 *     @type int          $network_id             Limit results to those affiliated with a given network ID. If 0,
-	 *                                                include all networks. Default 0.
-	 *     @type int[]        $network__in            Array of network IDs to include affiliated sites for. Default empty.
-	 *     @type int[]        $network__not_in        Array of network IDs to exclude affiliated sites for. Default empty.
-	 *     @type string       $domain                 Limit results to those affiliated with a given domain. Default empty.
-	 *     @type string[]     $domain__in             Array of domains to include affiliated sites for. Default empty.
-	 *     @type string[]     $domain__not_in         Array of domains to exclude affiliated sites for. Default empty.
-	 *     @type string       $path                   Limit results to those affiliated with a given path. Default empty.
-	 *     @type string[]     $path__in               Array of paths to include affiliated sites for. Default empty.
-	 *     @type string[]     $path__not_in           Array of paths to exclude affiliated sites for. Default empty.
-	 *     @type int          $public                 Limit results to public sites. Accepts '1' or '0'. Default empty.
-	 *     @type int          $archived               Limit results to archived sites. Accepts '1' or '0'. Default empty.
-	 *     @type int          $mature                 Limit results to mature sites. Accepts '1' or '0'. Default empty.
-	 *     @type int          $spam                   Limit results to spam sites. Accepts '1' or '0'. Default empty.
-	 *     @type int          $deleted                Limit results to deleted sites. Accepts '1' or '0'. Default empty.
-	 *     @type int          $lang_id                Limit results to a language ID. Default empty.
-	 *     @type string[]     $lang__in               Array of language IDs to include affiliated sites for. Default empty.
-	 *     @type string[]     $lang__not_in           Array of language IDs to exclude affiliated sites for. Default empty.
-	 *     @type string       $search                 Search term(s) to retrieve matching sites for. Default empty.
-	 *     @type string[]     $search_columns         Array of column names to be searched. Accepts 'domain' and 'path'.
-	 *                                                Default empty array.
-	 *     @type bool         $update_site_cache      Whether to prime the cache for found sites. Default true.
-	 *     @type bool         $update_site_meta_cache Whether to prime the metadata cache for found sites. Default true.
-	 *     @type array        $meta_query             Meta query clauses to limit retrieved sites by. See `WP_Meta_Query`.
-	 *                                                Default empty.
-	 *     @type string       $meta_key               Limit sites to those matching a specific metadata key.
-	 *                                                Can be used in conjunction with `$meta_value`. Default empty.
-	 *     @type string       $meta_value             Limit sites to those matching a specific metadata value.
-	 *                                                Usually used in conjunction with `$meta_key`. Default empty.
-	 *     @type string       $meta_type              Data type that the `$meta_value` column will be CAST to for
-	 *                                                comparisons. Default empty.
-	 *     @type string       $meta_compare           Comparison operator to test the `$meta_value`. Default empty.
+	 *     @type int[]           $site__in               Array of site IDs to include. Default empty.
+	 *     @type int[]           $site__not_in           Array of site IDs to exclude. Default empty.
+	 *     @type bool            $count                  Whether to return a site count (true) or array of site objects.
+	 *                                                   Default false.
+	 *     @type array           $date_query             Date query clauses to limit sites by. See WP_Date_Query.
+	 *                                                   Default null.
+	 *     @type string          $fields                 Site fields to return. Accepts 'ids' (returns an array of site IDs)
+	 *                                                   or empty (returns an array of complete site objects). Default empty.
+	 *     @type int             $ID                     A site ID to only return that site. Default empty.
+	 *     @type int             $number                 Maximum number of sites to retrieve. Default 100.
+	 *     @type int             $offset                 Number of sites to offset the query. Used to build LIMIT clause.
+	 *                                                   Default 0.
+	 *     @type bool            $no_found_rows          Whether to disable the `SQL_CALC_FOUND_ROWS` query. Default true.
+	 *     @type string|array    $orderby                Site status or array of statuses. Accepts:
+	 *                                                   - 'id'
+	 *                                                   - 'domain'
+	 *                                                   - 'path'
+	 *                                                   - 'network_id'
+	 *                                                   - 'last_updated'
+	 *                                                   - 'registered'
+	 *                                                   - 'domain_length'
+	 *                                                   - 'path_length'
+	 *                                                   - 'site__in'
+	 *                                                   - 'network__in'
+	 *                                                   - false, an empty array, or 'none' to disable `ORDER BY` clause.
+	 *                                                   Default 'id'.
+	 *     @type string          $order                  How to order retrieved sites. Accepts 'ASC', 'DESC'. Default 'ASC'.
+	 *     @type int             $network_id             Limit results to those affiliated with a given network ID. If 0,
+	 *                                                   include all networks. Default 0.
+	 *     @type int[]           $network__in            Array of network IDs to include affiliated sites for. Default empty.
+	 *     @type int[]           $network__not_in        Array of network IDs to exclude affiliated sites for. Default empty.
+	 *     @type string          $domain                 Limit results to those affiliated with a given domain. Default empty.
+	 *     @type string[]        $domain__in             Array of domains to include affiliated sites for. Default empty.
+	 *     @type string[]        $domain__not_in         Array of domains to exclude affiliated sites for. Default empty.
+	 *     @type string          $path                   Limit results to those affiliated with a given path. Default empty.
+	 *     @type string[]        $path__in               Array of paths to include affiliated sites for. Default empty.
+	 *     @type string[]        $path__not_in           Array of paths to exclude affiliated sites for. Default empty.
+	 *     @type int             $public                 Limit results to public sites. Accepts '1' or '0'. Default empty.
+	 *     @type int             $archived               Limit results to archived sites. Accepts '1' or '0'. Default empty.
+	 *     @type int             $mature                 Limit results to mature sites. Accepts '1' or '0'. Default empty.
+	 *     @type int             $spam                   Limit results to spam sites. Accepts '1' or '0'. Default empty.
+	 *     @type int             $deleted                Limit results to deleted sites. Accepts '1' or '0'. Default empty.
+	 *     @type int             $lang_id                Limit results to a language ID. Default empty.
+	 *     @type string[]        $lang__in               Array of language IDs to include affiliated sites for. Default empty.
+	 *     @type string[]        $lang__not_in           Array of language IDs to exclude affiliated sites for. Default empty.
+	 *     @type string          $search                 Search term(s) to retrieve matching sites for. Default empty.
+	 *     @type string[]        $search_columns         Array of column names to be searched. Accepts 'domain' and 'path'.
+	 *                                                   Default empty array.
+	 *     @type bool            $update_site_cache      Whether to prime the cache for found sites. Default true.
+	 *     @type bool            $update_site_meta_cache Whether to prime the metadata cache for found sites. Default true.
+	 *     @type string|string[] $meta_key               Meta key or keys to filter by.
+	 *     @type string|string[] $meta_value             Meta value or values to filter by.
+	 *     @type string          $meta_compare           MySQL operator used for comparing the meta value.
+	 *                                                   See WP_Meta_Query::__construct for accepted values and default value.
+	 *     @type string          $meta_compare_key       MySQL operator used for comparing the meta key.
+	 *                                                   See WP_Meta_Query::__construct for accepted values and default value.
+	 *     @type string          $meta_type              MySQL data type that the meta_value column will be CAST to for comparisons.
+	 *                                                   See WP_Meta_Query::__construct for accepted values and default value.
+	 *     @type string          $meta_type_key          MySQL data type that the meta_key column will be CAST to for comparisons.
+	 *                                                   See WP_Meta_Query::__construct for accepted values and default value.
+	 *     @type array           $meta_query             An associative array of WP_Meta_Query arguments.
+	 *                                                   See WP_Meta_Query::__construct for accepted values.
 	 * }
 	 */
 	public function __construct( $query = '' ) {
diff --git a/src/wp-includes/class-wp-tax-query.php b/src/wp-includes/class-wp-tax-query.php
index 1432245cc0..eb4b7849e2 100644
--- a/src/wp-includes/class-wp-tax-query.php
+++ b/src/wp-includes/class-wp-tax-query.php
@@ -236,7 +236,7 @@ class WP_Tax_Query {
 	 *
 	 * @param string $primary_table     Database table where the object being filtered is stored (eg wp_users).
 	 * @param string $primary_id_column ID column for the filtered object in $primary_table.
-	 * @return array {
+	 * @return string[] {
 	 *     Array containing JOIN and WHERE SQL clauses to append to the main query.
 	 *
 	 *     @type string $join  SQL fragment to append to the main JOIN clause.
@@ -258,7 +258,7 @@ class WP_Tax_Query {
 	 *
 	 * @since 4.1.0
 	 *
-	 * @return array {
+	 * @return string[] {
 	 *     Array containing JOIN and WHERE SQL clauses to append to the main query.
 	 *
 	 *     @type string $join  SQL fragment to append to the main JOIN clause.
@@ -291,7 +291,7 @@ class WP_Tax_Query {
 	 * @param array $query Query to parse (passed by reference).
 	 * @param int   $depth Optional. Number of tree levels deep we currently are.
 	 *                     Used to calculate indentation. Default 0.
-	 * @return array {
+	 * @return string[] {
 	 *     Array containing JOIN and WHERE SQL clauses to append to a single query array.
 	 *
 	 *     @type string $join  SQL fragment to append to the main JOIN clause.
@@ -373,7 +373,7 @@ class WP_Tax_Query {
 	 *
 	 * @param array $clause       Query clause (passed by reference).
 	 * @param array $parent_query Parent query array.
-	 * @return array {
+	 * @return string[] {
 	 *     Array containing JOIN and WHERE SQL clauses to append to a first-order query.
 	 *
 	 *     @type string $join  SQL fragment to append to the main JOIN clause.
@@ -527,7 +527,7 @@ class WP_Tax_Query {
 
 			// The sibling must both have compatible operator to share its alias.
 			if ( in_array( strtoupper( $sibling['operator'] ), $compatible_operators, true ) ) {
-				$alias = $sibling['alias'];
+				$alias = preg_replace( '/\W/', '_', $sibling['alias'] );
 				break;
 			}
 		}
@@ -556,7 +556,11 @@ class WP_Tax_Query {
 			return;
 		}
 
-		$query['terms'] = array_unique( (array) $query['terms'] );
+		if ( 'slug' === $query['field'] || 'name' === $query['field'] ) {
+			$query['terms'] = array_unique( (array) $query['terms'] );
+		} else {
+			$query['terms'] = wp_parse_id_list( $query['terms'] );
+		}
 
 		if ( is_taxonomy_hierarchical( $query['taxonomy'] ) && $query['include_children'] ) {
 			$this->transform_query( $query, 'term_id' );
diff --git a/src/wp-includes/class-wp-taxonomy.php b/src/wp-includes/class-wp-taxonomy.php
index 9ef1fdce4a..81dc0bd407 100644
--- a/src/wp-includes/class-wp-taxonomy.php
+++ b/src/wp-includes/class-wp-taxonomy.php
@@ -144,7 +144,7 @@ final class WP_Taxonomy {
 	 * An array of object types this taxonomy is registered for.
 	 *
 	 * @since 4.7.0
-	 * @var array
+	 * @var string[]
 	 */
 	public $object_type = null;
 
@@ -289,8 +289,8 @@ final class WP_Taxonomy {
 	 *
 	 * @since 4.7.0
 	 *
-	 * @param array|string $object_type Name of the object type for the taxonomy object.
-	 * @param array|string $args        Array or query string of arguments for registering a taxonomy.
+	 * @param string|string[] $object_type Name or array of names of the object types for the taxonomy.
+	 * @param array|string    $args        Array or query string of arguments for registering a taxonomy.
 	 */
 	public function set_props( $object_type, $args ) {
 		$args = wp_parse_args( $args );
diff --git a/src/wp-includes/class-wp-term-query.php b/src/wp-includes/class-wp-term-query.php
index f5388e6624..1583ed6ab6 100644
--- a/src/wp-includes/class-wp-term-query.php
+++ b/src/wp-includes/class-wp-term-query.php
@@ -88,103 +88,108 @@ class WP_Term_Query {
 	 * @since 4.6.0 Introduced 'term_taxonomy_id' parameter.
 	 * @since 4.7.0 Introduced 'object_ids' parameter.
 	 * @since 4.9.0 Added 'slug__in' support for 'orderby'.
+	 * @since 5.1.0 Introduced the 'meta_compare_key' parameter.
+	 * @since 5.3.0 Introduced the 'meta_type_key' parameter.
 	 *
 	 * @param string|array $query {
 	 *     Optional. Array or query string of term query parameters. Default empty.
 	 *
-	 *     @type string|array $taxonomy               Taxonomy name, or array of taxonomies, to which results should
-	 *                                                be limited.
-	 *     @type int|int[]    $object_ids             Object ID, or array of object IDs. Results will be
-	 *                                                limited to terms associated with these objects.
-	 *     @type string       $orderby                Field(s) to order terms by. Accepts:
-	 *                                                * Term fields ('name', 'slug', 'term_group', 'term_id', 'id',
-	 *                                                  'description', 'parent', 'term_order'). Unless `$object_ids`
-	 *                                                  is not empty, 'term_order' is treated the same as 'term_id'.
-	 *                                                * 'count' to use the number of objects associated with the term.
-	 *                                                * 'include' to match the 'order' of the `$include` param.
-	 *                                                * 'slug__in' to match the 'order' of the `$slug` param.
-	 *                                                * 'meta_value'
-	 *                                                * 'meta_value_num'.
-	 *                                                * The value of `$meta_key`.
-	 *                                                * The array keys of `$meta_query`.
-	 *                                                * 'none' to omit the ORDER BY clause.
-	 *                                                Default 'name'.
-	 *     @type string       $order                  Whether to order terms in ascending or descending order.
-	 *                                                Accepts 'ASC' (ascending) or 'DESC' (descending).
-	 *                                                Default 'ASC'.
-	 *     @type bool|int     $hide_empty             Whether to hide terms not assigned to any posts. Accepts
-	 *                                                1|true or 0|false. Default 1|true.
-	 *     @type int[]|string $include                Array or comma/space-separated string of term IDs to include.
-	 *                                                Default empty array.
-	 *     @type int[]|string $exclude                Array or comma/space-separated string of term IDs to exclude.
-	 *                                                If `$include` is non-empty, `$exclude` is ignored.
-	 *                                                Default empty array.
-	 *     @type int[]|string $exclude_tree           Array or comma/space-separated string of term IDs to exclude
-	 *                                                along with all of their descendant terms. If `$include` is
-	 *                                                non-empty, `$exclude_tree` is ignored. Default empty array.
-	 *     @type int|string   $number                 Maximum number of terms to return. Accepts ''|0 (all) or any
-	 *                                                positive number. Default ''|0 (all). Note that $number may
-	 *                                                not return accurate results when coupled with `$object_ids`.
-	 *                                                See #41796 for details.
-	 *     @type int          $offset                 The number by which to offset the terms query. Default empty.
-	 *     @type string       $fields                 Term fields to query for. Accepts:
-	 *                                                * 'all' Returns an array of complete term objects (`WP_Term[]`).
-	 *                                                * 'all_with_object_id' Returns an array of term objects
-	 *                                                  with the 'object_id' param (`WP_Term[]`). Works only
-	 *                                                  when the `$object_ids` parameter is populated.
-	 *                                                * 'ids' Returns an array of term IDs (`int[]`).
-	 *                                                * 'tt_ids' Returns an array of term taxonomy IDs (`int[]`).
-	 *                                                * 'names' Returns an array of term names (`string[]`).
-	 *                                                * 'slugs' Returns an array of term slugs (`string[]`).
-	 *                                                * 'count' Returns the number of matching terms (`int`).
-	 *                                                * 'id=>parent' Returns an associative array of parent term IDs,
-	 *                                                   keyed by term ID (`int[]`).
-	 *                                                * 'id=>name' Returns an associative array of term names,
-	 *                                                   keyed by term ID (`string[]`).
-	 *                                                * 'id=>slug' Returns an associative array of term slugs,
-	 *                                                   keyed by term ID (`string[]`).
-	 *                                                Default 'all'.
-	 *     @type bool         $count                  Whether to return a term count. If true, will take precedence
-	 *                                                over `$fields`. Default false.
-	 *     @type string|array $name                   Name or array of names to return term(s) for.
-	 *                                                Default empty.
-	 *     @type string|array $slug                   Slug or array of slugs to return term(s) for.
-	 *                                                Default empty.
-	 *     @type int|int[]    $term_taxonomy_id       Term taxonomy ID, or array of term taxonomy IDs,
-	 *                                                to match when querying terms.
-	 *     @type bool         $hierarchical           Whether to include terms that have non-empty descendants
-	 *                                                (even if `$hide_empty` is set to true). Default true.
-	 *     @type string       $search                 Search criteria to match terms. Will be SQL-formatted with
-	 *                                                wildcards before and after. Default empty.
-	 *     @type string       $name__like             Retrieve terms with criteria by which a term is LIKE
-	 *                                                `$name__like`. Default empty.
-	 *     @type string       $description__like      Retrieve terms where the description is LIKE
-	 *                                                `$description__like`. Default empty.
-	 *     @type bool         $pad_counts             Whether to pad the quantity of a term's children in the
-	 *                                                quantity of each term's "count" object variable.
-	 *                                                Default false.
-	 *     @type string       $get                    Whether to return terms regardless of ancestry or whether the
-	 *                                                terms are empty. Accepts 'all' or '' (disabled).
-	 *                                                Default ''.
-	 *     @type int          $child_of               Term ID to retrieve child terms of. If multiple taxonomies
-	 *                                                are passed, `$child_of` is ignored. Default 0.
-	 *     @type int          $parent                 Parent term ID to retrieve direct-child terms of.
-	 *                                                Default empty.
-	 *     @type bool         $childless              True to limit results to terms that have no children.
-	 *                                                This parameter has no effect on non-hierarchical taxonomies.
-	 *                                                Default false.
-	 *     @type string       $cache_domain           Unique cache key to be produced when this query is stored in
-	 *                                                an object cache. Default 'core'.
-	 *     @type bool         $update_term_meta_cache Whether to prime meta caches for matched terms. Default true.
-	 *     @type array        $meta_query             Meta query clauses to limit retrieved terms by.
-	 *                                                See `WP_Meta_Query`. Default empty.
-	 *     @type string       $meta_key               Limit terms to those matching a specific metadata key.
-	 *                                                Can be used in conjunction with `$meta_value`. Default empty.
-	 *     @type string       $meta_value             Limit terms to those matching a specific metadata value.
-	 *                                                Usually used in conjunction with `$meta_key`. Default empty.
-	 *     @type string       $meta_type              MySQL data type that the `$meta_value` will be CAST to for
-	 *                                                comparisons. Default empty.
-	 *     @type string       $meta_compare           Comparison operator to test the 'meta_value'. Default empty.
+	 *     @type string|string[] $taxonomy               Taxonomy name, or array of taxonomy names, to which results
+	 *                                                   should be limited.
+	 *     @type int|int[]       $object_ids             Object ID, or array of object IDs. Results will be
+	 *                                                   limited to terms associated with these objects.
+	 *     @type string          $orderby                Field(s) to order terms by. Accepts:
+	 *                                                   - Term fields ('name', 'slug', 'term_group', 'term_id', 'id',
+	 *                                                     'description', 'parent', 'term_order'). Unless `$object_ids`
+	 *                                                     is not empty, 'term_order' is treated the same as 'term_id'.
+	 *                                                   - 'count' to use the number of objects associated with the term.
+	 *                                                   - 'include' to match the 'order' of the `$include` param.
+	 *                                                   - 'slug__in' to match the 'order' of the `$slug` param.
+	 *                                                   - 'meta_value'
+	 *                                                   - 'meta_value_num'.
+	 *                                                   - The value of `$meta_key`.
+	 *                                                   - The array keys of `$meta_query`.
+	 *                                                   - 'none' to omit the ORDER BY clause.
+	 *                                                   Default 'name'.
+	 *     @type string          $order                  Whether to order terms in ascending or descending order.
+	 *                                                   Accepts 'ASC' (ascending) or 'DESC' (descending).
+	 *                                                   Default 'ASC'.
+	 *     @type bool|int        $hide_empty             Whether to hide terms not assigned to any posts. Accepts
+	 *                                                   1|true or 0|false. Default 1|true.
+	 *     @type int[]|string    $include                Array or comma/space-separated string of term IDs to include.
+	 *                                                   Default empty array.
+	 *     @type int[]|string    $exclude                Array or comma/space-separated string of term IDs to exclude.
+	 *                                                   If `$include` is non-empty, `$exclude` is ignored.
+	 *                                                   Default empty array.
+	 *     @type int[]|string    $exclude_tree           Array or comma/space-separated string of term IDs to exclude
+	 *                                                   along with all of their descendant terms. If `$include` is
+	 *                                                   non-empty, `$exclude_tree` is ignored. Default empty array.
+	 *     @type int|string      $number                 Maximum number of terms to return. Accepts ''|0 (all) or any
+	 *                                                   positive number. Default ''|0 (all). Note that `$number` may
+	 *                                                   not return accurate results when coupled with `$object_ids`.
+	 *                                                   See #41796 for details.
+	 *     @type int             $offset                 The number by which to offset the terms query. Default empty.
+	 *     @type string          $fields                 Term fields to query for. Accepts:
+	 *                                                   - 'all' Returns an array of complete term objects (`WP_Term[]`).
+	 *                                                   - 'all_with_object_id' Returns an array of term objects
+	 *                                                     with the 'object_id' param (`WP_Term[]`). Works only
+	 *                                                     when the `$object_ids` parameter is populated.
+	 *                                                   - 'ids' Returns an array of term IDs (`int[]`).
+	 *                                                   - 'tt_ids' Returns an array of term taxonomy IDs (`int[]`).
+	 *                                                   - 'names' Returns an array of term names (`string[]`).
+	 *                                                   - 'slugs' Returns an array of term slugs (`string[]`).
+	 *                                                   - 'count' Returns the number of matching terms (`int`).
+	 *                                                   - 'id=>parent' Returns an associative array of parent term IDs,
+	 *                                                      keyed by term ID (`int[]`).
+	 *                                                   - 'id=>name' Returns an associative array of term names,
+	 *                                                      keyed by term ID (`string[]`).
+	 *                                                   - 'id=>slug' Returns an associative array of term slugs,
+	 *                                                      keyed by term ID (`string[]`).
+	 *                                                   Default 'all'.
+	 *     @type bool            $count                  Whether to return a term count. If true, will take precedence
+	 *                                                   over `$fields`. Default false.
+	 *     @type string|string[] $name                   Name or array of names to return term(s) for.
+	 *                                                   Default empty.
+	 *     @type string|string[] $slug                   Slug or array of slugs to return term(s) for.
+	 *                                                   Default empty.
+	 *     @type int|int[]       $term_taxonomy_id       Term taxonomy ID, or array of term taxonomy IDs,
+	 *                                                   to match when querying terms.
+	 *     @type bool            $hierarchical           Whether to include terms that have non-empty descendants
+	 *                                                   (even if `$hide_empty` is set to true). Default true.
+	 *     @type string          $search                 Search criteria to match terms. Will be SQL-formatted with
+	 *                                                   wildcards before and after. Default empty.
+	 *     @type string          $name__like             Retrieve terms with criteria by which a term is LIKE
+	 *                                                   `$name__like`. Default empty.
+	 *     @type string          $description__like      Retrieve terms where the description is LIKE
+	 *                                                   `$description__like`. Default empty.
+	 *     @type bool            $pad_counts             Whether to pad the quantity of a term's children in the
+	 *                                                   quantity of each term's "count" object variable.
+	 *                                                   Default false.
+	 *     @type string          $get                    Whether to return terms regardless of ancestry or whether the
+	 *                                                   terms are empty. Accepts 'all' or '' (disabled).
+	 *                                                   Default ''.
+	 *     @type int             $child_of               Term ID to retrieve child terms of. If multiple taxonomies
+	 *                                                   are passed, `$child_of` is ignored. Default 0.
+	 *     @type int             $parent                 Parent term ID to retrieve direct-child terms of.
+	 *                                                   Default empty.
+	 *     @type bool            $childless              True to limit results to terms that have no children.
+	 *                                                   This parameter has no effect on non-hierarchical taxonomies.
+	 *                                                   Default false.
+	 *     @type string          $cache_domain           Unique cache key to be produced when this query is stored in
+	 *                                                   an object cache. Default 'core'.
+	 *     @type bool            $update_term_meta_cache Whether to prime meta caches for matched terms. Default true.
+	 *     @type string|string[] $meta_key               Meta key or keys to filter by.
+	 *     @type string|string[] $meta_value             Meta value or values to filter by.
+	 *     @type string          $meta_compare           MySQL operator used for comparing the meta value.
+	 *                                                   See WP_Meta_Query::__construct for accepted values and default value.
+	 *     @type string          $meta_compare_key       MySQL operator used for comparing the meta key.
+	 *                                                   See WP_Meta_Query::__construct for accepted values and default value.
+	 *     @type string          $meta_type              MySQL data type that the meta_value column will be CAST to for comparisons.
+	 *                                                   See WP_Meta_Query::__construct for accepted values and default value.
+	 *     @type string          $meta_type_key          MySQL data type that the meta_key column will be CAST to for comparisons.
+	 *                                                   See WP_Meta_Query::__construct for accepted values and default value.
+	 *     @type array           $meta_query             An associative array of WP_Meta_Query arguments.
+	 *                                                   See WP_Meta_Query::__construct for accepted values.
 	 * }
 	 */
 	public function __construct( $query = '' ) {
@@ -770,7 +775,7 @@ class WP_Term_Query {
 		}
 
 		if ( empty( $terms ) ) {
-			wp_cache_add( $cache_key, array(), 'terms', DAY_IN_SECONDS );
+			wp_cache_add( $cache_key, array(), 'terms' );
 			return array();
 		}
 
@@ -875,7 +880,7 @@ class WP_Term_Query {
 			}
 		}
 
-		wp_cache_add( $cache_key, $terms, 'terms', DAY_IN_SECONDS );
+		wp_cache_add( $cache_key, $terms, 'terms' );
 
 		if ( 'all' === $_fields || 'all_with_object_id' === $_fields ) {
 			$terms = $this->populate_terms( $terms );
diff --git a/src/wp-includes/class-wp-text-diff-renderer-table.php b/src/wp-includes/class-wp-text-diff-renderer-table.php
index 3db5a51d85..43c0d0e422 100644
--- a/src/wp-includes/class-wp-text-diff-renderer-table.php
+++ b/src/wp-includes/class-wp-text-diff-renderer-table.php
@@ -255,7 +255,7 @@ class WP_Text_Diff_Renderer_Table extends Text_Diff_Renderer {
 		 * - match is numeric: an index in other column.
 		 * - match is 'X': no match. It is a new row.
 		 * *_rows are column vectors for the orig column and the final column.
-		 * - row >= 0: an indix of the $orig or $final array.
+		 * - row >= 0: an index of the $orig or $final array.
 		 * - row < 0: a blank row for that column.
 		 */
 		list($orig_matches, $final_matches, $orig_rows, $final_rows) = $this->interleave_changed_lines( $orig, $final );
diff --git a/src/wp-includes/class-wp-theme-json-resolver.php b/src/wp-includes/class-wp-theme-json-resolver.php
index 47427c27e3..b9a3819d40 100644
--- a/src/wp-includes/class-wp-theme-json-resolver.php
+++ b/src/wp-includes/class-wp-theme-json-resolver.php
@@ -11,6 +11,10 @@
  * Class that abstracts the processing of the different data sources
  * for site-level config and offers an API to work with them.
  *
+ * This class is for internal core usage and is not supposed to be used by extenders (plugins and/or themes).
+ * This is a low-level API that may need to do breaking changes. Please,
+ * use get_global_settings, get_global_styles, and get_global_stylesheet instead.
+ *
  * @access private
  */
 class WP_Theme_JSON_Resolver {
@@ -40,9 +44,27 @@ class WP_Theme_JSON_Resolver {
 	private static $theme_has_support = null;
 
 	/**
-	 * Container to keep loaded i18n schema for `theme.json`.
+	 * Container for data coming from the user.
+	 *
+	 * @since 5.9.0
+	 * @var WP_Theme_JSON
+	 */
+	private static $user = null;
+
+	/**
+	 * Stores the ID of the custom post type
+	 * that holds the user data.
 	 *
 	 * @since 5.9.0
+	 * @var int
+	 */
+	private static $user_custom_post_type_id = null;
+
+	/**
+	 * Container to keep loaded i18n schema for `theme.json`.
+	 *
+	 * @since 5.8.0 As `$theme_json_i18n`.
+	 * @since 5.9.0 Renamed from `$theme_json_i18n` to `$i18n_schema`.
 	 * @var array
 	 */
 	private static $i18n_schema = null;
@@ -114,7 +136,7 @@ class WP_Theme_JSON_Resolver {
 
 		$config     = self::read_json_file( __DIR__ . '/theme.json' );
 		$config     = self::translate( $config );
-		self::$core = new WP_Theme_JSON( $config, 'core' );
+		self::$core = new WP_Theme_JSON( $config, 'default' );
 
 		return self::$core;
 	}
@@ -122,34 +144,71 @@ class WP_Theme_JSON_Resolver {
 	/**
 	 * Returns the theme's data.
 	 *
-	 * Data from theme.json can be augmented via the $theme_support_data variable.
-	 * This is useful, for example, to backfill the gaps in theme.json that a theme
-	 * has declared via add_theme_supports.
-	 *
-	 * Note that if the same data is present in theme.json and in $theme_support_data,
-	 * the theme.json's is not overwritten.
+	 * Data from theme.json will be backfilled from existing
+	 * theme supports, if any. Note that if the same data
+	 * is present in theme.json and in theme supports,
+	 * the theme.json takes precedence.
 	 *
 	 * @since 5.8.0
+	 * @since 5.9.0 Theme supports have been inlined and the `$theme_support_data` argument removed.
 	 *
-	 * @param array $theme_support_data Optional. Theme support data in theme.json format.
-	 *                                  Default empty array.
+	 * @param array $deprecated Deprecated. Not used.
 	 * @return WP_Theme_JSON Entity that holds theme data.
 	 */
-	public static function get_theme_data( $theme_support_data = array() ) {
+	public static function get_theme_data( $deprecated = array() ) {
+		if ( ! empty( $deprecated ) ) {
+			_deprecated_argument( __METHOD__, '5.9.0' );
+		}
 		if ( null === self::$theme ) {
 			$theme_json_data = self::read_json_file( self::get_file_path_from_theme( 'theme.json' ) );
 			$theme_json_data = self::translate( $theme_json_data, wp_get_theme()->get( 'TextDomain' ) );
 			self::$theme     = new WP_Theme_JSON( $theme_json_data );
-		}
 
-		if ( empty( $theme_support_data ) ) {
-			return self::$theme;
+			if ( wp_get_theme()->parent() ) {
+				// Get parent theme.json.
+				$parent_theme_json_data = self::read_json_file( self::get_file_path_from_theme( 'theme.json', true ) );
+				$parent_theme_json_data = self::translate( $parent_theme_json_data, wp_get_theme()->parent()->get( 'TextDomain' ) );
+				$parent_theme           = new WP_Theme_JSON( $parent_theme_json_data );
+
+				// Merge the child theme.json into the parent theme.json.
+				// The child theme takes precedence over the parent.
+				$parent_theme->merge( self::$theme );
+				self::$theme = $parent_theme;
+			}
 		}
 
 		/*
 		 * We want the presets and settings declared in theme.json
-		 * to override the ones declared via add_theme_support.
+		 * to override the ones declared via theme supports.
+		 * So we take theme supports, transform it to theme.json shape
+		 * and merge the self::$theme upon that.
 		 */
+		$theme_support_data = WP_Theme_JSON::get_from_editor_settings( get_default_block_editor_settings() );
+		if ( ! self::theme_has_support() ) {
+			if ( ! isset( $theme_support_data['settings']['color'] ) ) {
+				$theme_support_data['settings']['color'] = array();
+			}
+
+			$default_palette = false;
+			if ( current_theme_supports( 'default-color-palette' ) ) {
+				$default_palette = true;
+			}
+			if ( ! isset( $theme_support_data['settings']['color']['palette'] ) ) {
+				// If the theme does not have any palette, we still want to show the core one.
+				$default_palette = true;
+			}
+			$theme_support_data['settings']['color']['defaultPalette'] = $default_palette;
+
+			$default_gradients = false;
+			if ( current_theme_supports( 'default-gradient-presets' ) ) {
+				$default_gradients = true;
+			}
+			if ( ! isset( $theme_support_data['settings']['color']['gradients'] ) ) {
+				// If the theme does not have any gradients, we still want to show the core ones.
+				$default_gradients = true;
+			}
+			$theme_support_data['settings']['color']['defaultGradients'] = $default_gradients;
+		}
 		$with_theme_supports = new WP_Theme_JSON( $theme_support_data );
 		$with_theme_supports->merge( self::$theme );
 
@@ -157,40 +216,199 @@ class WP_Theme_JSON_Resolver {
 	}
 
 	/**
-	 * There are different sources of data for a site: core and theme.
+	 * Returns the custom post type that contains the user's origin config
+	 * for the active theme or a void array if none are found.
 	 *
-	 * While the getters {@link get_core_data}, {@link get_theme_data} return the raw data
-	 * from the respective origins, this method merges them all together.
+	 * This can also create and return a new draft custom post type.
 	 *
-	 * If the same piece of data is declared in different origins (core and theme),
-	 * the last origin overrides the previous. For example, if core disables custom colors
-	 * but a theme enables them, the theme config wins.
+	 * @since 5.9.0
+	 *
+	 * @param WP_Theme $theme              The theme object. If empty, it
+	 *                                     defaults to the active theme.
+	 * @param bool     $create_post        Optional. Whether a new custom post
+	 *                                     type should be created if none are
+	 *                                     found. Default false.
+	 * @param array    $post_status_filter Optional. Filter custom post type by
+	 *                                     post status. Default `array( 'publish' )`,
+	 *                                     so it only fetches published posts.
+	 * @return array Custom Post Type for the user's origin config.
+	 */
+	public static function get_user_data_from_wp_global_styles( $theme, $create_post = false, $post_status_filter = array( 'publish' ) ) {
+		if ( ! $theme instanceof WP_Theme ) {
+			$theme = wp_get_theme();
+		}
+		$user_cpt         = array();
+		$post_type_filter = 'wp_global_styles';
+		$args             = array(
+			'numberposts' => 1,
+			'orderby'     => 'date',
+			'order'       => 'desc',
+			'post_type'   => $post_type_filter,
+			'post_status' => $post_status_filter,
+			'tax_query'   => array(
+				array(
+					'taxonomy' => 'wp_theme',
+					'field'    => 'name',
+					'terms'    => $theme->get_stylesheet(),
+				),
+			),
+		);
+
+		$cache_key = sprintf( 'wp_global_styles_%s', md5( serialize( $args ) ) );
+		$post_id   = wp_cache_get( $cache_key );
+
+		if ( (int) $post_id > 0 ) {
+			return get_post( $post_id, ARRAY_A );
+		}
+
+		// Special case: '-1' is a results not found.
+		if ( -1 === $post_id && ! $create_post ) {
+			return $user_cpt;
+		}
+
+		$recent_posts = wp_get_recent_posts( $args );
+		if ( is_array( $recent_posts ) && ( count( $recent_posts ) === 1 ) ) {
+			$user_cpt = $recent_posts[0];
+		} elseif ( $create_post ) {
+			$cpt_post_id = wp_insert_post(
+				array(
+					'post_content' => '{"version": ' . WP_Theme_JSON::LATEST_SCHEMA . ', "isGlobalStylesUserThemeJSON": true }',
+					'post_status'  => 'publish',
+					'post_title'   => 'Custom Styles',
+					'post_type'    => $post_type_filter,
+					'post_name'    => 'wp-global-styles-' . urlencode( wp_get_theme()->get_stylesheet() ),
+					'tax_input'    => array(
+						'wp_theme' => array( wp_get_theme()->get_stylesheet() ),
+					),
+				),
+				true
+			);
+			$user_cpt    = get_post( $cpt_post_id, ARRAY_A );
+		}
+		$cache_expiration = $user_cpt ? DAY_IN_SECONDS : HOUR_IN_SECONDS;
+		wp_cache_set( $cache_key, $user_cpt ? $user_cpt['ID'] : -1, '', $cache_expiration );
+
+		return $user_cpt;
+	}
+
+	/**
+	 * Returns the user's origin config.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @return WP_Theme_JSON Entity that holds styles for user data.
+	 */
+	public static function get_user_data() {
+		if ( null !== self::$user ) {
+			return self::$user;
+		}
+
+		$config   = array();
+		$user_cpt = self::get_user_data_from_wp_global_styles( wp_get_theme() );
+
+		if ( array_key_exists( 'post_content', $user_cpt ) ) {
+			$decoded_data = json_decode( $user_cpt['post_content'], true );
+
+			$json_decoding_error = json_last_error();
+			if ( JSON_ERROR_NONE !== $json_decoding_error ) {
+				trigger_error( 'Error when decoding a theme.json schema for user data. ' . json_last_error_msg() );
+				return new WP_Theme_JSON( $config, 'custom' );
+			}
+
+			// Very important to verify that the flag isGlobalStylesUserThemeJSON is true.
+			// If it's not true then the content was not escaped and is not safe.
+			if (
+				is_array( $decoded_data ) &&
+				isset( $decoded_data['isGlobalStylesUserThemeJSON'] ) &&
+				$decoded_data['isGlobalStylesUserThemeJSON']
+			) {
+				unset( $decoded_data['isGlobalStylesUserThemeJSON'] );
+				$config = $decoded_data;
+			}
+		}
+		self::$user = new WP_Theme_JSON( $config, 'custom' );
+
+		return self::$user;
+	}
+
+	/**
+	 * Returns the data merged from multiple origins.
+	 *
+	 * There are three sources of data (origins) for a site:
+	 * default, theme, and custom. The custom's has higher priority
+	 * than the theme's, and the theme's higher than default's.
+	 *
+	 * Unlike the getters {@link get_core_data},
+	 * {@link get_theme_data}, and {@link get_user_data},
+	 * this method returns data after it has been merged
+	 * with the previous origins. This means that if the same piece of data
+	 * is declared in different origins (user, theme, and core),
+	 * the last origin overrides the previous.
+	 *
+	 * For example, if the user has set a background color
+	 * for the paragraph block, and the theme has done it as well,
+	 * the user preference wins.
 	 *
 	 * @since 5.8.0
+	 * @since 5.9.0 Added user data, removed the `$settings` parameter,
+	 *              added the `$origin` parameter.
 	 *
-	 * @param array $settings Optional. Existing block editor settings. Default empty array.
+	 * @param string $origin Optional. To what level should we merge data.
+	 *                       Valid values are 'theme' or 'custom'. Default 'custom'.
 	 * @return WP_Theme_JSON
 	 */
-	public static function get_merged_data( $settings = array() ) {
-		$theme_support_data = WP_Theme_JSON::get_from_editor_settings( $settings );
+	public static function get_merged_data( $origin = 'custom' ) {
+		if ( is_array( $origin ) ) {
+			_deprecated_argument( __FUNCTION__, '5.9.0' );
+		}
 
 		$result = new WP_Theme_JSON();
 		$result->merge( self::get_core_data() );
-		$result->merge( self::get_theme_data( $theme_support_data ) );
+		$result->merge( self::get_theme_data() );
+
+		if ( 'custom' === $origin ) {
+			$result->merge( self::get_user_data() );
+		}
 
 		return $result;
 	}
 
 	/**
-	 * Whether the current theme has a theme.json file.
+	 * Returns the ID of the custom post type
+	 * that stores user data.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @return integer|null
+	 */
+	public static function get_user_global_styles_post_id() {
+		if ( null !== self::$user_custom_post_type_id ) {
+			return self::$user_custom_post_type_id;
+		}
+
+		$user_cpt = self::get_user_data_from_wp_global_styles( wp_get_theme(), true );
+
+		if ( array_key_exists( 'ID', $user_cpt ) ) {
+			self::$user_custom_post_type_id = $user_cpt['ID'];
+		}
+
+		return self::$user_custom_post_type_id;
+	}
+
+	/**
+	 * Whether the active theme has a theme.json file.
 	 *
 	 * @since 5.8.0
+	 * @since 5.9.0 Added a check in the parent theme.
 	 *
 	 * @return bool
 	 */
 	public static function theme_has_support() {
 		if ( ! isset( self::$theme_has_support ) ) {
-			self::$theme_has_support = (bool) self::get_file_path_from_theme( 'theme.json' );
+			self::$theme_has_support = (
+				is_readable( self::get_file_path_from_theme( 'theme.json' ) ) ||
+				is_readable( self::get_file_path_from_theme( 'theme.json', true ) )
+			);
 		}
 
 		return self::$theme_has_support;
@@ -202,35 +420,33 @@ class WP_Theme_JSON_Resolver {
 	 * If it isn't, returns an empty string, otherwise returns the whole file path.
 	 *
 	 * @since 5.8.0
+	 * @since 5.9.0 Adapted to work with child themes, added the `$template` argument.
 	 *
 	 * @param string $file_name Name of the file.
+	 * @param bool   $template  Optional. Use template theme directory. Default false.
 	 * @return string The whole file path or empty if the file doesn't exist.
 	 */
-	private static function get_file_path_from_theme( $file_name ) {
-		/*
-		 * This used to be a locate_template call. However, that method proved problematic
-		 * due to its use of constants (STYLESHEETPATH) that threw errors in some scenarios.
-		 *
-		 * When the theme.json merge algorithm properly supports child themes,
-		 * this should also fall back to the template path, as locate_template did.
-		 */
-		$located   = '';
-		$candidate = get_stylesheet_directory() . '/' . $file_name;
-		if ( is_readable( $candidate ) ) {
-			$located = $candidate;
-		}
-		return $located;
+	private static function get_file_path_from_theme( $file_name, $template = false ) {
+		$path      = $template ? get_template_directory() : get_stylesheet_directory();
+		$candidate = $path . '/' . $file_name;
+
+		return is_readable( $candidate ) ? $candidate : '';
 	}
 
 	/**
 	 * Cleans the cached data so it can be recalculated.
 	 *
 	 * @since 5.8.0
+	 * @since 5.9.0 Added the `$user`, `$user_custom_post_type_id`,
+	 *              and `$i18n_schema` variables to reset.
 	 */
 	public static function clean_cached_data() {
-		self::$core              = null;
-		self::$theme             = null;
-		self::$theme_has_support = null;
+		self::$core                     = null;
+		self::$theme                    = null;
+		self::$user                     = null;
+		self::$user_custom_post_type_id = null;
+		self::$theme_has_support        = null;
+		self::$i18n_schema              = null;
 	}
 
 }
diff --git a/src/wp-includes/class-wp-theme-json-schema.php b/src/wp-includes/class-wp-theme-json-schema.php
new file mode 100644
index 0000000000..462af76376
--- /dev/null
+++ b/src/wp-includes/class-wp-theme-json-schema.php
@@ -0,0 +1,152 @@
+<?php
+/**
+ * WP_Theme_JSON_Schema class
+ *
+ * @package WordPress
+ * @subpackage Theme
+ * @since 5.9.0
+ */
+
+/**
+ * Class that migrates a given theme.json structure to the latest schema.
+ *
+ * This class is for internal core usage and is not supposed to be used by extenders (plugins and/or themes).
+ * This is a low-level API that may need to do breaking changes. Please,
+ * use get_global_settings, get_global_styles, and get_global_stylesheet instead.
+ *
+ * @since 5.9.0
+ * @access private
+ */
+class WP_Theme_JSON_Schema {
+
+	/**
+	 * Maps old properties to their new location within the schema's settings.
+	 * This will be applied at both the defaults and individual block levels.
+	 */
+	const V1_TO_V2_RENAMED_PATHS = array(
+		'border.customRadius'         => 'border.radius',
+		'spacing.customMargin'        => 'spacing.margin',
+		'spacing.customPadding'       => 'spacing.padding',
+		'typography.customLineHeight' => 'typography.lineHeight',
+	);
+
+	/**
+	 * Function that migrates a given theme.json structure to the last version.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array $theme_json The structure to migrate.
+	 *
+	 * @return array The structure in the last version.
+	 */
+	public static function migrate( $theme_json ) {
+		if ( ! isset( $theme_json['version'] ) ) {
+			$theme_json = array(
+				'version' => WP_Theme_JSON::LATEST_SCHEMA,
+			);
+		}
+
+		if ( 1 === $theme_json['version'] ) {
+			$theme_json = self::migrate_v1_to_v2( $theme_json );
+		}
+
+		return $theme_json;
+	}
+
+	/**
+	 * Removes the custom prefixes for a few properties
+	 * that were part of v1:
+	 *
+	 * 'border.customRadius'         => 'border.radius',
+	 * 'spacing.customMargin'        => 'spacing.margin',
+	 * 'spacing.customPadding'       => 'spacing.padding',
+	 * 'typography.customLineHeight' => 'typography.lineHeight',
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array $old Data to migrate.
+	 *
+	 * @return array Data without the custom prefixes.
+	 */
+	private static function migrate_v1_to_v2( $old ) {
+		// Copy everything.
+		$new = $old;
+
+		// Overwrite the things that changed.
+		if ( isset( $old['settings'] ) ) {
+			$new['settings'] = self::rename_paths( $old['settings'], self::V1_TO_V2_RENAMED_PATHS );
+		}
+
+		// Set the new version.
+		$new['version'] = 2;
+
+		return $new;
+	}
+
+	/**
+	 * Processes the settings subtree.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array $settings        Array to process.
+	 * @param array $paths_to_rename Paths to rename.
+	 *
+	 * @return array The settings in the new format.
+	 */
+	private static function rename_paths( $settings, $paths_to_rename ) {
+		$new_settings = $settings;
+
+		// Process any renamed/moved paths within default settings.
+		self::rename_settings( $new_settings, $paths_to_rename );
+
+		// Process individual block settings.
+		if ( isset( $new_settings['blocks'] ) && is_array( $new_settings['blocks'] ) ) {
+			foreach ( $new_settings['blocks'] as &$block_settings ) {
+				self::rename_settings( $block_settings, $paths_to_rename );
+			}
+		}
+
+		return $new_settings;
+	}
+
+	/**
+	 * Processes a settings array, renaming or moving properties.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array $settings        Reference to settings either defaults or an individual block's.
+	 * @param array $paths_to_rename Paths to rename.
+	 */
+	private static function rename_settings( &$settings, $paths_to_rename ) {
+		foreach ( $paths_to_rename as $original => $renamed ) {
+			$original_path = explode( '.', $original );
+			$renamed_path  = explode( '.', $renamed );
+			$current_value = _wp_array_get( $settings, $original_path, null );
+
+			if ( null !== $current_value ) {
+				_wp_array_set( $settings, $renamed_path, $current_value );
+				self::unset_setting_by_path( $settings, $original_path );
+			}
+		}
+	}
+
+	/**
+	 * Removes a property from within the provided settings by its path.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array $settings Reference to the current settings array.
+	 * @param array $path Path to the property to be removed.
+	 *
+	 * @return void
+	 */
+	private static function unset_setting_by_path( &$settings, $path ) {
+		$tmp_settings = &$settings; // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
+		$last_key     = array_pop( $path );
+		foreach ( $path as $key ) {
+			$tmp_settings = &$tmp_settings[ $key ];
+		}
+
+		unset( $tmp_settings[ $last_key ] );
+	}
+}
diff --git a/src/wp-includes/class-wp-theme-json.php b/src/wp-includes/class-wp-theme-json.php
index d394bd3301..6f7d4ee356 100644
--- a/src/wp-includes/class-wp-theme-json.php
+++ b/src/wp-includes/class-wp-theme-json.php
@@ -10,6 +10,10 @@
 /**
  * Class that encapsulates the processing of structures that adhere to the theme.json spec.
  *
+ * This class is for internal core usage and is not supposed to be used by extenders (plugins and/or themes).
+ * This is a low-level API that may need to do breaking changes. Please,
+ * use get_global_settings, get_global_styles, and get_global_stylesheet instead.
+ *
  * @access private
  */
 class WP_Theme_JSON {
@@ -47,9 +51,9 @@ class WP_Theme_JSON {
 	 * @var string[]
 	 */
 	const VALID_ORIGINS = array(
-		'core',
+		'default',
 		'theme',
-		'user',
+		'custom',
 	);
 
 	/**
@@ -70,179 +74,266 @@ class WP_Theme_JSON {
 	 *
 	 * This contains the necessary metadata to process them:
 	 *
-	 * - path          => where to find the preset within the settings section
-	 *
-	 * - value_key     => the key that represents the value
-	 *
-	 * - css_var_infix => infix to use in generating the CSS Custom Property. Example:
-	 *                   --wp--preset--<preset_infix>--<slug>: <preset_value>
-	 *
-	 * - classes      => array containing a structure with the classes to
-	 *                   generate for the presets. Each class should have
-	 *                   the class suffix and the property name. Example:
-	 *
-	 *                   .has-<slug>-<class_suffix> {
-	 *                       <property_name>: <preset_value>
-	 *                   }
+	 * - path              => where to find the preset within the settings section
+	 * - override          => whether a theme preset with the same slug as a default preset
+	 *                        can override it
+	 * - use_default_names => whether to use the default names
+	 * - value_key         => the key that represents the value
+	 * - value_func        => optionally, instead of value_key, a function to generate
+	 *                        the value that takes a preset as an argument
+	 *                        (either value_key or value_func should be present)
+	 * - css_vars          => template string to use in generating the CSS Custom Property.
+	 *                        Example output: "--wp--preset--duotone--blue: <value>" will generate
+	 *                        as many CSS Custom Properties as presets defined
+	 *                        substituting the $slug for the slug's value for each preset value.
+	 * - classes           => array containing a structure with the classes to
+	 *                        generate for the presets, where for each array item
+	 *                        the key is the class name and the value the property name.
+	 *                        The "$slug" substring will be replaced by the slug of each preset.
+	 *                        For example:
+	 *                        'classes' => array(
+	 *                           '.has-$slug-color'            => 'color',
+	 *                           '.has-$slug-background-color' => 'background-color',
+	 *                           '.has-$slug-border-color'     => 'border-color',
+	 *                        )
+	 * - properties        => array of CSS properties to be used by kses to
+	 *                        validate the content of each preset
+	 *                        by means of the remove_insecure_properties method.
 	 *
 	 * @since 5.8.0
+	 * @since 5.9.0 Added the `color.duotone` and `typography.fontFamilies` presets,
+	 *              `use_default_names` preset key, and simplified the metadata structure.
 	 * @var array
 	 */
 	const PRESETS_METADATA = array(
 		array(
-			'path'          => array( 'color', 'palette' ),
-			'value_key'     => 'color',
-			'css_var_infix' => 'color',
-			'classes'       => array(
-				array(
-					'class_suffix'  => 'color',
-					'property_name' => 'color',
-				),
-				array(
-					'class_suffix'  => 'background-color',
-					'property_name' => 'background-color',
-				),
+			'path'              => array( 'color', 'palette' ),
+			'override'          => array( 'color', 'defaultPalette' ),
+			'use_default_names' => false,
+			'value_key'         => 'color',
+			'css_vars'          => '--wp--preset--color--$slug',
+			'classes'           => array(
+				'.has-$slug-color'            => 'color',
+				'.has-$slug-background-color' => 'background-color',
+				'.has-$slug-border-color'     => 'border-color',
 			),
+			'properties'        => array( 'color', 'background-color', 'border-color' ),
 		),
 		array(
-			'path'          => array( 'color', 'gradients' ),
-			'value_key'     => 'gradient',
-			'css_var_infix' => 'gradient',
-			'classes'       => array(
-				array(
-					'class_suffix'  => 'gradient-background',
-					'property_name' => 'background',
-				),
-			),
+			'path'              => array( 'color', 'gradients' ),
+			'override'          => array( 'color', 'defaultGradients' ),
+			'use_default_names' => false,
+			'value_key'         => 'gradient',
+			'css_vars'          => '--wp--preset--gradient--$slug',
+			'classes'           => array( '.has-$slug-gradient-background' => 'background' ),
+			'properties'        => array( 'background' ),
 		),
 		array(
-			'path'          => array( 'typography', 'fontSizes' ),
-			'value_key'     => 'size',
-			'css_var_infix' => 'font-size',
-			'classes'       => array(
-				array(
-					'class_suffix'  => 'font-size',
-					'property_name' => 'font-size',
-				),
-			),
+			'path'              => array( 'color', 'duotone' ),
+			'override'          => true,
+			'use_default_names' => false,
+			'value_func'        => 'wp_render_duotone_filter_preset',
+			'css_vars'          => '--wp--preset--duotone--$slug',
+			'classes'           => array(),
+			'properties'        => array( 'filter' ),
+		),
+		array(
+			'path'              => array( 'typography', 'fontSizes' ),
+			'override'          => true,
+			'use_default_names' => true,
+			'value_key'         => 'size',
+			'css_vars'          => '--wp--preset--font-size--$slug',
+			'classes'           => array( '.has-$slug-font-size' => 'font-size' ),
+			'properties'        => array( 'font-size' ),
+		),
+		array(
+			'path'              => array( 'typography', 'fontFamilies' ),
+			'override'          => true,
+			'use_default_names' => false,
+			'value_key'         => 'fontFamily',
+			'css_vars'          => '--wp--preset--font-family--$slug',
+			'classes'           => array( '.has-$slug-font-family' => 'font-family' ),
+			'properties'        => array( 'font-family' ),
 		),
 	);
 
 	/**
 	 * Metadata for style properties.
 	 *
-	 * Each property declares:
-	 *
-	 * - 'value': path to the value in theme.json and block attributes.
+	 * Each element is a direct mapping from the CSS property name to the
+	 * path to the value in theme.json & block attributes.
 	 *
 	 * @since 5.8.0
+	 * @since 5.9.0 Added the `border-*`, `font-family`, `font-style`, `font-weight`,
+	 *              `letter-spacing`, `margin-*`, `padding-*`, `--wp--style--block-gap`,
+	 *              `text-decoration`, `text-transform`, and `filter` properties,
+	 *              simplified the metadata structure.
 	 * @var array
 	 */
 	const PROPERTIES_METADATA = array(
-		'background'       => array(
-			'value' => array( 'color', 'gradient' ),
-		),
-		'background-color' => array(
-			'value' => array( 'color', 'background' ),
-		),
-		'color'            => array(
-			'value' => array( 'color', 'text' ),
-		),
-		'font-size'        => array(
-			'value' => array( 'typography', 'fontSize' ),
-		),
-		'line-height'      => array(
-			'value' => array( 'typography', 'lineHeight' ),
-		),
-		'margin'           => array(
-			'value'      => array( 'spacing', 'margin' ),
-			'properties' => array( 'top', 'right', 'bottom', 'left' ),
-		),
-		'padding'          => array(
-			'value'      => array( 'spacing', 'padding' ),
-			'properties' => array( 'top', 'right', 'bottom', 'left' ),
-		),
+		'background'                 => array( 'color', 'gradient' ),
+		'background-color'           => array( 'color', 'background' ),
+		'border-radius'              => array( 'border', 'radius' ),
+		'border-top-left-radius'     => array( 'border', 'radius', 'topLeft' ),
+		'border-top-right-radius'    => array( 'border', 'radius', 'topRight' ),
+		'border-bottom-left-radius'  => array( 'border', 'radius', 'bottomLeft' ),
+		'border-bottom-right-radius' => array( 'border', 'radius', 'bottomRight' ),
+		'border-color'               => array( 'border', 'color' ),
+		'border-width'               => array( 'border', 'width' ),
+		'border-style'               => array( 'border', 'style' ),
+		'color'                      => array( 'color', 'text' ),
+		'font-family'                => array( 'typography', 'fontFamily' ),
+		'font-size'                  => array( 'typography', 'fontSize' ),
+		'font-style'                 => array( 'typography', 'fontStyle' ),
+		'font-weight'                => array( 'typography', 'fontWeight' ),
+		'letter-spacing'             => array( 'typography', 'letterSpacing' ),
+		'line-height'                => array( 'typography', 'lineHeight' ),
+		'margin'                     => array( 'spacing', 'margin' ),
+		'margin-top'                 => array( 'spacing', 'margin', 'top' ),
+		'margin-right'               => array( 'spacing', 'margin', 'right' ),
+		'margin-bottom'              => array( 'spacing', 'margin', 'bottom' ),
+		'margin-left'                => array( 'spacing', 'margin', 'left' ),
+		'padding'                    => array( 'spacing', 'padding' ),
+		'padding-top'                => array( 'spacing', 'padding', 'top' ),
+		'padding-right'              => array( 'spacing', 'padding', 'right' ),
+		'padding-bottom'             => array( 'spacing', 'padding', 'bottom' ),
+		'padding-left'               => array( 'spacing', 'padding', 'left' ),
+		'--wp--style--block-gap'     => array( 'spacing', 'blockGap' ),
+		'text-decoration'            => array( 'typography', 'textDecoration' ),
+		'text-transform'             => array( 'typography', 'textTransform' ),
+		'filter'                     => array( 'filter', 'duotone' ),
 	);
 
 	/**
-	 * @since 5.8.0
+	 * Protected style properties.
+	 *
+	 * These style properties are only rendered if a setting enables it
+	 * via a value other than `null`.
+	 *
+	 * Each element maps the style property to the corresponding theme.json
+	 * setting key.
+	 *
+	 * @since 5.9.0
+	 */
+	const PROTECTED_PROPERTIES = array(
+		'spacing.blockGap' => array( 'spacing', 'blockGap' ),
+	);
+
+	/**
+	 * The top-level keys a theme.json can have.
+	 *
+	 * @since 5.8.0 As `ALLOWED_TOP_LEVEL_KEYS`.
+	 * @since 5.9.0 Renamed from `ALLOWED_TOP_LEVEL_KEYS` to `VALID_TOP_LEVEL_KEYS`,
+	 *              added the `customTemplates` and `templateParts` values.
 	 * @var string[]
 	 */
-	const ALLOWED_TOP_LEVEL_KEYS = array(
+	const VALID_TOP_LEVEL_KEYS = array(
+		'customTemplates',
 		'settings',
 		'styles',
+		'templateParts',
 		'version',
 	);
 
 	/**
-	 * @since 5.8.0
+	 * The valid properties under the settings key.
+	 *
+	 * @since 5.8.0 As `ALLOWED_SETTINGS`.
+	 * @since 5.9.0 Renamed from `ALLOWED_SETTINGS` to `VALID_SETTINGS`,
+	 *              added new properties for `border`, `color`, `spacing`,
+	 *              and `typography`, and renamed others according to the new schema.
 	 * @var array
 	 */
-	const ALLOWED_SETTINGS = array(
-		'border'     => array(
-			'customRadius' => null,
+	const VALID_SETTINGS = array(
+		'appearanceTools' => null,
+		'border'          => array(
+			'color'  => null,
+			'radius' => null,
+			'style'  => null,
+			'width'  => null,
 		),
-		'color'      => array(
-			'custom'         => null,
-			'customDuotone'  => null,
-			'customGradient' => null,
-			'duotone'        => null,
-			'gradients'      => null,
-			'link'           => null,
-			'palette'        => null,
+		'color'           => array(
+			'background'       => null,
+			'custom'           => null,
+			'customDuotone'    => null,
+			'customGradient'   => null,
+			'defaultGradients' => null,
+			'defaultPalette'   => null,
+			'duotone'          => null,
+			'gradients'        => null,
+			'link'             => null,
+			'palette'          => null,
+			'text'             => null,
 		),
-		'custom'     => null,
-		'layout'     => array(
+		'custom'          => null,
+		'layout'          => array(
 			'contentSize' => null,
 			'wideSize'    => null,
 		),
-		'spacing'    => array(
-			'customMargin'  => null,
-			'customPadding' => null,
-			'units'         => null,
+		'spacing'         => array(
+			'blockGap' => null,
+			'margin'   => null,
+			'padding'  => null,
+			'units'    => null,
 		),
-		'typography' => array(
-			'customFontSize'   => null,
-			'customLineHeight' => null,
-			'dropCap'          => null,
-			'fontSizes'        => null,
+		'typography'      => array(
+			'customFontSize' => null,
+			'dropCap'        => null,
+			'fontFamilies'   => null,
+			'fontSizes'      => null,
+			'fontStyle'      => null,
+			'fontWeight'     => null,
+			'letterSpacing'  => null,
+			'lineHeight'     => null,
+			'textDecoration' => null,
+			'textTransform'  => null,
 		),
 	);
 
 	/**
-	 * @since 5.8.0
+	 * The valid properties under the styles key.
+	 *
+	 * @since 5.8.0 As `ALLOWED_STYLES`.
+	 * @since 5.9.0 Renamed from `ALLOWED_STYLES` to `VALID_STYLES`,
+	 *              added new properties for `border`, `filter`, `spacing`,
+	 *              and `typography`.
 	 * @var array
 	 */
-	const ALLOWED_STYLES = array(
+	const VALID_STYLES = array(
 		'border'     => array(
+			'color'  => null,
 			'radius' => null,
+			'style'  => null,
+			'width'  => null,
 		),
 		'color'      => array(
 			'background' => null,
 			'gradient'   => null,
 			'text'       => null,
 		),
+		'filter'     => array(
+			'duotone' => null,
+		),
 		'spacing'    => array(
-			'margin'  => array(
-				'top'    => null,
-				'right'  => null,
-				'bottom' => null,
-				'left'   => null,
-			),
-			'padding' => array(
-				'bottom' => null,
-				'left'   => null,
-				'right'  => null,
-				'top'    => null,
-			),
+			'margin'   => null,
+			'padding'  => null,
+			'blockGap' => 'top',
 		),
 		'typography' => array(
-			'fontSize'   => null,
-			'lineHeight' => null,
+			'fontFamily'     => null,
+			'fontSize'       => null,
+			'fontStyle'      => null,
+			'fontWeight'     => null,
+			'letterSpacing'  => null,
+			'lineHeight'     => null,
+			'textDecoration' => null,
+			'textTransform'  => null,
 		),
 	);
 
 	/**
+	 * The valid elements that can be found under styles.
+	 *
 	 * @since 5.8.0
 	 * @var string[]
 	 */
@@ -257,85 +348,158 @@ class WP_Theme_JSON {
 	);
 
 	/**
+	 * The latest version of the schema in use.
+	 *
 	 * @since 5.8.0
+	 * @since 5.9.0 Changed value from 1 to 2.
 	 * @var int
 	 */
-	const LATEST_SCHEMA = 1;
+	const LATEST_SCHEMA = 2;
 
 	/**
 	 * Constructor.
 	 *
 	 * @since 5.8.0
 	 *
-	 * @param array $theme_json A structure that follows the theme.json schema.
-	 * @param string $origin    Optional. What source of data this object represents.
-	 *                          One of 'core', 'theme', or 'user'. Default 'theme'.
+	 * @param array  $theme_json A structure that follows the theme.json schema.
+	 * @param string $origin     Optional. What source of data this object represents.
+	 *                           One of 'default', 'theme', or 'custom'. Default 'theme'.
 	 */
 	public function __construct( $theme_json = array(), $origin = 'theme' ) {
 		if ( ! in_array( $origin, self::VALID_ORIGINS, true ) ) {
 			$origin = 'theme';
 		}
 
-		if ( ! isset( $theme_json['version'] ) || self::LATEST_SCHEMA !== $theme_json['version'] ) {
-			$this->theme_json = array();
-			return;
-		}
-
-		$this->theme_json = self::sanitize( $theme_json );
+		$this->theme_json    = WP_Theme_JSON_Schema::migrate( $theme_json );
+		$valid_block_names   = array_keys( self::get_blocks_metadata() );
+		$valid_element_names = array_keys( self::ELEMENTS );
+		$theme_json          = self::sanitize( $this->theme_json, $valid_block_names, $valid_element_names );
+		$this->theme_json    = self::maybe_opt_in_into_settings( $theme_json );
 
 		// Internally, presets are keyed by origin.
 		$nodes = self::get_setting_nodes( $this->theme_json );
 		foreach ( $nodes as $node ) {
-			foreach ( self::PRESETS_METADATA as $preset ) {
-				$path   = array_merge( $node['path'], $preset['path'] );
+			foreach ( self::PRESETS_METADATA as $preset_metadata ) {
+				$path   = array_merge( $node['path'], $preset_metadata['path'] );
 				$preset = _wp_array_get( $this->theme_json, $path, null );
 				if ( null !== $preset ) {
-					_wp_array_set( $this->theme_json, $path, array( $origin => $preset ) );
+					// If the preset is not already keyed by origin.
+					if ( isset( $preset[0] ) || empty( $preset ) ) {
+						_wp_array_set( $this->theme_json, $path, array( $origin => $preset ) );
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Enables some opt-in settings if theme declared support.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array $theme_json A theme.json structure to modify.
+	 * @return array The modified theme.json structure.
+	 */
+	private static function maybe_opt_in_into_settings( $theme_json ) {
+		$new_theme_json = $theme_json;
+
+		if (
+			isset( $new_theme_json['settings']['appearanceTools'] ) &&
+			true === $new_theme_json['settings']['appearanceTools']
+		) {
+			self::do_opt_in_into_settings( $new_theme_json['settings'] );
+		}
+
+		if ( isset( $new_theme_json['settings']['blocks'] ) && is_array( $new_theme_json['settings']['blocks'] ) ) {
+			foreach ( $new_theme_json['settings']['blocks'] as &$block ) {
+				if ( isset( $block['appearanceTools'] ) && ( true === $block['appearanceTools'] ) ) {
+					self::do_opt_in_into_settings( $block );
 				}
 			}
 		}
+
+		return $new_theme_json;
+	}
+
+	/**
+	 * Enables some settings.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array $context The context to which the settings belong.
+	 */
+	private static function do_opt_in_into_settings( &$context ) {
+		$to_opt_in = array(
+			array( 'border', 'color' ),
+			array( 'border', 'radius' ),
+			array( 'border', 'style' ),
+			array( 'border', 'width' ),
+			array( 'color', 'link' ),
+			array( 'spacing', 'blockGap' ),
+			array( 'spacing', 'margin' ),
+			array( 'spacing', 'padding' ),
+			array( 'typography', 'lineHeight' ),
+		);
+
+		foreach ( $to_opt_in as $path ) {
+			// Use "unset prop" as a marker instead of "null" because
+			// "null" can be a valid value for some props (e.g. blockGap).
+			if ( 'unset prop' === _wp_array_get( $context, $path, 'unset prop' ) ) {
+				_wp_array_set( $context, $path, true );
+			}
+		}
+
+		unset( $context['appearanceTools'] );
 	}
 
 	/**
 	 * Sanitizes the input according to the schemas.
 	 *
 	 * @since 5.8.0
+	 * @since 5.9.0 Added the `$valid_block_names` and `$valid_element_name` parameters.
 	 *
-	 * @param array $input Structure to sanitize.
+	 * @param array $input               Structure to sanitize.
+	 * @param array $valid_block_names   List of valid block names.
+	 * @param array $valid_element_names List of valid element names.
 	 * @return array The sanitized output.
 	 */
-	private static function sanitize( $input ) {
+	private static function sanitize( $input, $valid_block_names, $valid_element_names ) {
 		$output = array();
 
 		if ( ! is_array( $input ) ) {
 			return $output;
 		}
 
-		$allowed_top_level_keys = self::ALLOWED_TOP_LEVEL_KEYS;
-		$allowed_settings       = self::ALLOWED_SETTINGS;
-		$allowed_styles         = self::ALLOWED_STYLES;
-		$allowed_blocks         = array_keys( self::get_blocks_metadata() );
-		$allowed_elements       = array_keys( self::ELEMENTS );
+		$output = array_intersect_key( $input, array_flip( self::VALID_TOP_LEVEL_KEYS ) );
 
-		$output = array_intersect_key( $input, array_flip( $allowed_top_level_keys ) );
+		// Some styles are only meant to be available at the top-level (e.g.: blockGap),
+		// hence, the schema for blocks & elements should not have them.
+		$styles_non_top_level = self::VALID_STYLES;
+		foreach ( array_keys( $styles_non_top_level ) as $section ) {
+			foreach ( array_keys( $styles_non_top_level[ $section ] ) as $prop ) {
+				if ( 'top' === $styles_non_top_level[ $section ][ $prop ] ) {
+					unset( $styles_non_top_level[ $section ][ $prop ] );
+				}
+			}
+		}
 
-		// Build the schema.
+		// Build the schema based on valid block & element names.
 		$schema                 = array();
 		$schema_styles_elements = array();
-		foreach ( $allowed_elements as $element ) {
-			$schema_styles_elements[ $element ] = $allowed_styles;
+		foreach ( $valid_element_names as $element ) {
+			$schema_styles_elements[ $element ] = $styles_non_top_level;
 		}
 		$schema_styles_blocks   = array();
 		$schema_settings_blocks = array();
-		foreach ( $allowed_blocks as $block ) {
-			$schema_settings_blocks[ $block ]           = $allowed_settings;
-			$schema_styles_blocks[ $block ]             = $allowed_styles;
+		foreach ( $valid_block_names as $block ) {
+			$schema_settings_blocks[ $block ]           = self::VALID_SETTINGS;
+			$schema_styles_blocks[ $block ]             = $styles_non_top_level;
 			$schema_styles_blocks[ $block ]['elements'] = $schema_styles_elements;
 		}
-		$schema['styles']             = $allowed_styles;
+		$schema['styles']             = self::VALID_STYLES;
 		$schema['styles']['blocks']   = $schema_styles_blocks;
 		$schema['styles']['elements'] = $schema_styles_elements;
-		$schema['settings']           = $allowed_settings;
+		$schema['settings']           = self::VALID_SETTINGS;
 		$schema['settings']['blocks'] = $schema_settings_blocks;
 
 		// Remove anything that's not present in the schema.
@@ -377,14 +541,16 @@ class WP_Theme_JSON {
 	 *       'core/heading': {
 	 *         'selector': 'h1',
 	 *         'elements': {}
-	 *       }
-	 *       'core/group': {
-	 *         'selector': '.wp-block-group',
+	 *       },
+	 *       'core/image': {
+	 *         'selector': '.wp-block-image',
+	 *         'duotone': 'img',
 	 *         'elements': {}
 	 *       }
 	 *     }
 	 *
 	 * @since 5.8.0
+	 * @since 5.9.0 Added `duotone` key with CSS selector.
 	 *
 	 * @return array Block metadata.
 	 */
@@ -407,11 +573,16 @@ class WP_Theme_JSON {
 				self::$blocks_metadata[ $block_name ]['selector'] = '.wp-block-' . str_replace( '/', '-', str_replace( 'core/', '', $block_name ) );
 			}
 
-			/*
-			 * Assign defaults, then overwrite those that the block sets by itself.
-			 * If the block selector is compounded, will append the element to each
-			 * individual block selector.
-			 */
+			if (
+				isset( $block_type->supports['color']['__experimentalDuotone'] ) &&
+				is_string( $block_type->supports['color']['__experimentalDuotone'] )
+			) {
+				self::$blocks_metadata[ $block_name ]['duotone'] = $block_type->supports['color']['__experimentalDuotone'];
+			}
+
+			// Assign defaults, then overwrite those that the block sets by itself.
+			// If the block selector is compounded, will append the element to each
+			// individual block selector.
 			$block_selectors = explode( ',', self::$blocks_metadata[ $block_name ]['selector'] );
 			foreach ( self::ELEMENTS as $el_name => $el_selector ) {
 				$element_selector = array();
@@ -493,25 +664,95 @@ class WP_Theme_JSON {
 	 * the theme.json structure this object represents.
 	 *
 	 * @since 5.8.0
+	 * @since 5.9.0 Removed the `$type` parameter`, added the `$types` and `$origins` parameters.
 	 *
-	 * @param string $type Optional. Type of stylesheet we want. Accepts 'all',
-	 *                     'block_styles', and 'css_variables'. Default 'all'.
+	 * @param array $types   Types of styles to load. Will load all by default. It accepts:
+	 *                       - `variables`: only the CSS Custom Properties for presets & custom ones.
+	 *                       - `styles`: only the styles section in theme.json.
+	 *                       - `presets`: only the classes for the presets.
+	 * @param array $origins A list of origins to include. By default it includes `self::VALID_ORIGINS`.
 	 * @return string Stylesheet.
 	 */
-	public function get_stylesheet( $type = 'all' ) {
+	public function get_stylesheet( $types = array( 'variables', 'styles', 'presets' ), $origins = self::VALID_ORIGINS ) {
+		if ( is_string( $types ) ) {
+			// Dispatch error and map old arguments to new ones.
+			_deprecated_argument( __FUNCTION__, '5.9.0' );
+			if ( 'block_styles' === $types ) {
+				$types = array( 'styles', 'presets' );
+			} elseif ( 'css_variables' === $types ) {
+				$types = array( 'variables' );
+			} else {
+				$types = array( 'variables', 'styles', 'presets' );
+			}
+		}
+
 		$blocks_metadata = self::get_blocks_metadata();
 		$style_nodes     = self::get_style_nodes( $this->theme_json, $blocks_metadata );
 		$setting_nodes   = self::get_setting_nodes( $this->theme_json, $blocks_metadata );
 
-		switch ( $type ) {
-			case 'block_styles':
-				return $this->get_block_styles( $style_nodes, $setting_nodes );
-			case 'css_variables':
-				return $this->get_css_variables( $setting_nodes );
-			default:
-				return $this->get_css_variables( $setting_nodes ) . $this->get_block_styles( $style_nodes, $setting_nodes );
+		$stylesheet = '';
+
+		if ( in_array( 'variables', $types, true ) ) {
+			$stylesheet .= $this->get_css_variables( $setting_nodes, $origins );
+		}
+
+		if ( in_array( 'styles', $types, true ) ) {
+			$stylesheet .= $this->get_block_classes( $style_nodes );
 		}
 
+		if ( in_array( 'presets', $types, true ) ) {
+			$stylesheet .= $this->get_preset_classes( $setting_nodes, $origins );
+		}
+
+		return $stylesheet;
+	}
+
+	/**
+	 * Returns the page templates of the active theme.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @return array
+	 */
+	public function get_custom_templates() {
+		$custom_templates = array();
+		if ( ! isset( $this->theme_json['customTemplates'] ) || ! is_array( $this->theme_json['customTemplates'] ) ) {
+			return $custom_templates;
+		}
+
+		foreach ( $this->theme_json['customTemplates'] as $item ) {
+			if ( isset( $item['name'] ) ) {
+				$custom_templates[ $item['name'] ] = array(
+					'title'     => isset( $item['title'] ) ? $item['title'] : '',
+					'postTypes' => isset( $item['postTypes'] ) ? $item['postTypes'] : array( 'page' ),
+				);
+			}
+		}
+		return $custom_templates;
+	}
+
+	/**
+	 * Returns the template part data of active theme.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @return array
+	 */
+	public function get_template_parts() {
+		$template_parts = array();
+		if ( ! isset( $this->theme_json['templateParts'] ) || ! is_array( $this->theme_json['templateParts'] ) ) {
+			return $template_parts;
+		}
+
+		foreach ( $this->theme_json['templateParts'] as $item ) {
+			if ( isset( $item['name'] ) ) {
+				$template_parts[ $item['name'] ] = array(
+					'title' => isset( $item['title'] ) ? $item['title'] : '',
+					'area'  => isset( $item['area'] ) ? $item['area'] : '',
+				);
+			}
+		}
+		return $template_parts;
 	}
 
 	/**
@@ -526,37 +767,17 @@ class WP_Theme_JSON {
 	 *     style-property-one: value;
 	 *   }
 	 *
-	 * Additionally, it'll also create new rulesets
-	 * as classes for each preset value such as:
-	 *
-	 *     .has-value-color {
-	 *       color: value;
-	 *     }
-	 *
-	 *     .has-value-background-color {
-	 *       background-color: value;
-	 *     }
-	 *
-	 *     .has-value-font-size {
-	 *       font-size: value;
-	 *     }
-	 *
-	 *     .has-value-gradient-background {
-	 *       background: value;
-	 *     }
-	 *
-	 *     p.has-value-gradient-background {
-	 *       background: value;
-	 *     }
+	 * @since 5.8.0 As `get_block_styles()`.
+	 * @since 5.9.0 Renamed from `get_block_styles()` to `get_block_classes()`
+	 *              and no longer returns preset classes.
+	 *              Removed the `$setting_nodes` parameter.
 	 *
-	 * @since 5.8.0
-	 *
-	 * @param array $style_nodes   Nodes with styles.
-	 * @param array $setting_nodes Nodes with settings.
+	 * @param array $style_nodes Nodes with styles.
 	 * @return string The new stylesheet.
 	 */
-	private function get_block_styles( $style_nodes, $setting_nodes ) {
+	private function get_block_classes( $style_nodes ) {
 		$block_rules = '';
+
 		foreach ( $style_nodes as $metadata ) {
 			if ( null === $metadata['selector'] ) {
 				continue;
@@ -564,11 +785,88 @@ class WP_Theme_JSON {
 
 			$node         = _wp_array_get( $this->theme_json, $metadata['path'], array() );
 			$selector     = $metadata['selector'];
-			$declarations = self::compute_style_properties( $node );
+			$settings     = _wp_array_get( $this->theme_json, array( 'settings' ) );
+			$declarations = self::compute_style_properties( $node, $settings );
+
+			// 1. Separate the ones who use the general selector
+			// and the ones who use the duotone selector.
+			$declarations_duotone = array();
+			foreach ( $declarations as $index => $declaration ) {
+				if ( 'filter' === $declaration['name'] ) {
+					unset( $declarations[ $index ] );
+					$declarations_duotone[] = $declaration;
+				}
+			}
+
+			/*
+			 * Reset default browser margin on the root body element.
+			 * This is set on the root selector **before** generating the ruleset
+			 * from the `theme.json`. This is to ensure that if the `theme.json` declares
+			 * `margin` in its `spacing` declaration for the `body` element then these
+			 * user-generated values take precedence in the CSS cascade.
+			 * @link https://github.com/WordPress/gutenberg/issues/36147.
+			 */
+			if ( self::ROOT_BLOCK_SELECTOR === $selector ) {
+				$block_rules .= 'body { margin: 0; }';
+			}
+
+			// 2. Generate the rules that use the general selector.
 			$block_rules .= self::to_ruleset( $selector, $declarations );
+
+			// 3. Generate the rules that use the duotone selector.
+			if ( isset( $metadata['duotone'] ) && ! empty( $declarations_duotone ) ) {
+				$selector_duotone = self::scope_selector( $metadata['selector'], $metadata['duotone'] );
+				$block_rules     .= self::to_ruleset( $selector_duotone, $declarations_duotone );
+			}
+
+			if ( self::ROOT_BLOCK_SELECTOR === $selector ) {
+				$block_rules .= '.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }';
+				$block_rules .= '.wp-site-blocks > .alignright { float: right; margin-left: 2em; }';
+				$block_rules .= '.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }';
+
+				$has_block_gap_support = _wp_array_get( $this->theme_json, array( 'settings', 'spacing', 'blockGap' ) ) !== null;
+				if ( $has_block_gap_support ) {
+					$block_rules .= '.wp-site-blocks > * { margin-top: 0; margin-bottom: 0; }';
+					$block_rules .= '.wp-site-blocks > * + * { margin-top: var( --wp--style--block-gap ); }';
+				}
+			}
 		}
 
+		return $block_rules;
+	}
+
+	/**
+	 * Creates new rulesets as classes for each preset value such as:
+	 *
+	 *   .has-value-color {
+	 *     color: value;
+	 *   }
+	 *
+	 *   .has-value-background-color {
+	 *     background-color: value;
+	 *   }
+	 *
+	 *   .has-value-font-size {
+	 *     font-size: value;
+	 *   }
+	 *
+	 *   .has-value-gradient-background {
+	 *     background: value;
+	 *   }
+	 *
+	 *   p.has-value-gradient-background {
+	 *     background: value;
+	 *   }
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array $setting_nodes Nodes with settings.
+	 * @param array $origins       List of origins to process presets from.
+	 * @return string The new stylesheet.
+	 */
+	private function get_preset_classes( $setting_nodes, $origins ) {
 		$preset_rules = '';
+
 		foreach ( $setting_nodes as $metadata ) {
 			if ( null === $metadata['selector'] ) {
 				continue;
@@ -576,10 +874,10 @@ class WP_Theme_JSON {
 
 			$selector      = $metadata['selector'];
 			$node          = _wp_array_get( $this->theme_json, $metadata['path'], array() );
-			$preset_rules .= self::compute_preset_classes( $node, $selector );
+			$preset_rules .= self::compute_preset_classes( $node, $selector, $origins );
 		}
 
-		return $block_rules . $preset_rules;
+		return $preset_rules;
 	}
 
 	/**
@@ -597,11 +895,13 @@ class WP_Theme_JSON {
 	 *     }
 	 *
 	 * @since 5.8.0
+	 * @since 5.9.0 Added the `$origins` parameter.
 	 *
-	 * @param array $nodes Nodes with settings.
+	 * @param array $nodes   Nodes with settings.
+	 * @param array $origins List of origins to process.
 	 * @return string The new stylesheet.
 	 */
-	private function get_css_variables( $nodes ) {
+	private function get_css_variables( $nodes, $origins ) {
 		$stylesheet = '';
 		foreach ( $nodes as $metadata ) {
 			if ( null === $metadata['selector'] ) {
@@ -611,7 +911,7 @@ class WP_Theme_JSON {
 			$selector = $metadata['selector'];
 
 			$node         = _wp_array_get( $this->theme_json, $metadata['path'], array() );
-			$declarations = array_merge( self::compute_preset_vars( $node ), self::compute_theme_vars( $node ) );
+			$declarations = array_merge( self::compute_preset_vars( $node, $origins ), self::compute_theme_vars( $node ) );
 
 			$stylesheet .= self::to_ruleset( $selector, $declarations );
 		}
@@ -667,46 +967,19 @@ class WP_Theme_JSON {
 		return implode( ',', $new_selectors );
 	}
 
-	/**
-	 * Given an array of presets keyed by origin and the value key of the preset,
-	 * it returns an array where each key is the preset slug and each value the preset value.
-	 *
-	 * @since 5.8.0
-	 *
-	 * @param array  $preset_per_origin Array of presets keyed by origin.
-	 * @param string $value_key         The property of the preset that contains its value.
-	 * @return array Array of presets where each key is a slug and each value is the preset value.
-	 */
-	private static function get_merged_preset_by_slug( $preset_per_origin, $value_key ) {
-		$result = array();
-		foreach ( self::VALID_ORIGINS as $origin ) {
-			if ( ! isset( $preset_per_origin[ $origin ] ) ) {
-				continue;
-			}
-			foreach ( $preset_per_origin[ $origin ] as $preset ) {
-				/*
-				 * We don't want to use kebabCase here,
-				 * see https://github.com/WordPress/gutenberg/issues/32347
-				 * However, we need to make sure the generated class or CSS variable
-				 * doesn't contain spaces.
-				 */
-				$result[ preg_replace( '/\s+/', '-', $preset['slug'] ) ] = $preset[ $value_key ];
-			}
-		}
-		return $result;
-	}
-
 	/**
 	 * Given a settings array, it returns the generated rulesets
 	 * for the preset classes.
 	 *
 	 * @since 5.8.0
+	 * @since 5.9.0 Added the `$origins` parameter.
 	 *
 	 * @param array  $settings Settings to process.
 	 * @param string $selector Selector wrapping the classes.
+	 * @param array  $origins  List of origins to process.
 	 * @return string The result of processing the presets.
 	 */
-	private static function compute_preset_classes( $settings, $selector ) {
+	private static function compute_preset_classes( $settings, $selector, $origins ) {
 		if ( self::ROOT_BLOCK_SELECTOR === $selector ) {
 			// Classes at the global level do not need any CSS prefixed,
 			// and we don't want to increase its specificity.
@@ -714,17 +987,18 @@ class WP_Theme_JSON {
 		}
 
 		$stylesheet = '';
-		foreach ( self::PRESETS_METADATA as $preset ) {
-			$preset_per_origin = _wp_array_get( $settings, $preset['path'], array() );
-			$preset_by_slug    = self::get_merged_preset_by_slug( $preset_per_origin, $preset['value_key'] );
-			foreach ( $preset['classes'] as $class ) {
-				foreach ( $preset_by_slug as $slug => $value ) {
+		foreach ( self::PRESETS_METADATA as $preset_metadata ) {
+			$slugs = self::get_settings_slugs( $settings, $preset_metadata, $origins );
+			foreach ( $preset_metadata['classes'] as $class => $property ) {
+				foreach ( $slugs as $slug ) {
+					$css_var     = self::replace_slug_in_string( $preset_metadata['css_vars'], $slug );
+					$class_name  = self::replace_slug_in_string( $class, $slug );
 					$stylesheet .= self::to_ruleset(
-						self::append_to_selector( $selector, '.has-' . _wp_to_kebab_case( $slug ) . '-' . $class['class_suffix'] ),
+						self::append_to_selector( $selector, $class_name ),
 						array(
 							array(
-								'name'  => $class['property_name'],
-								'value' => 'var(--wp--preset--' . $preset['css_var_infix'] . '--' . _wp_to_kebab_case( $slug ) . ') !important',
+								'name'  => $property,
+								'value' => 'var(' . $css_var . ') !important',
 							),
 						)
 					);
@@ -735,6 +1009,146 @@ class WP_Theme_JSON {
 		return $stylesheet;
 	}
 
+	/**
+	 * Function that scopes a selector with another one. This works a bit like
+	 * SCSS nesting except the `&` operator isn't supported.
+	 *
+	 * <code>
+	 * $scope = '.a, .b .c';
+	 * $selector = '> .x, .y';
+	 * $merged = scope_selector( $scope, $selector );
+	 * // $merged is '.a > .x, .a .y, .b .c > .x, .b .c .y'
+	 * </code>
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param string $scope    Selector to scope to.
+	 * @param string $selector Original selector.
+	 * @return string Scoped selector.
+	 */
+	private static function scope_selector( $scope, $selector ) {
+		$scopes    = explode( ',', $scope );
+		$selectors = explode( ',', $selector );
+
+		$selectors_scoped = array();
+		foreach ( $scopes as $outer ) {
+			foreach ( $selectors as $inner ) {
+				$selectors_scoped[] = trim( $outer ) . ' ' . trim( $inner );
+			}
+		}
+
+		return implode( ', ', $selectors_scoped );
+	}
+
+	/**
+	 * Gets preset values keyed by slugs based on settings and metadata.
+	 *
+	 * <code>
+	 * $settings = array(
+	 *     'typography' => array(
+	 *         'fontFamilies' => array(
+	 *             array(
+	 *                 'slug'       => 'sansSerif',
+	 *                 'fontFamily' => '"Helvetica Neue", sans-serif',
+	 *             ),
+	 *             array(
+	 *                 'slug'   => 'serif',
+	 *                 'colors' => 'Georgia, serif',
+	 *             )
+	 *         ),
+	 *     ),
+	 * );
+	 * $meta = array(
+	 *    'path'      => array( 'typography', 'fontFamilies' ),
+	 *    'value_key' => 'fontFamily',
+	 * );
+	 * $values_by_slug = get_settings_values_by_slug();
+	 * // $values_by_slug === array(
+	 * //   'sans-serif' => '"Helvetica Neue", sans-serif',
+	 * //   'serif'      => 'Georgia, serif',
+	 * // );
+	 * </code>
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array $settings        Settings to process.
+	 * @param array $preset_metadata One of the PRESETS_METADATA values.
+	 * @param array $origins         List of origins to process.
+	 * @return array Array of presets where each key is a slug and each value is the preset value.
+	 */
+	private static function get_settings_values_by_slug( $settings, $preset_metadata, $origins ) {
+		$preset_per_origin = _wp_array_get( $settings, $preset_metadata['path'], array() );
+
+		$result = array();
+		foreach ( $origins as $origin ) {
+			if ( ! isset( $preset_per_origin[ $origin ] ) ) {
+				continue;
+			}
+			foreach ( $preset_per_origin[ $origin ] as $preset ) {
+				$slug = _wp_to_kebab_case( $preset['slug'] );
+
+				$value = '';
+				if ( isset( $preset_metadata['value_key'] ) ) {
+					$value_key = $preset_metadata['value_key'];
+					$value     = $preset[ $value_key ];
+				} elseif (
+					isset( $preset_metadata['value_func'] ) &&
+					is_callable( $preset_metadata['value_func'] )
+				) {
+					$value_func = $preset_metadata['value_func'];
+					$value      = call_user_func( $value_func, $preset );
+				} else {
+					// If we don't have a value, then don't add it to the result.
+					continue;
+				}
+
+				$result[ $slug ] = $value;
+			}
+		}
+		return $result;
+	}
+
+	/**
+	 * Similar to get_settings_values_by_slug, but doesn't compute the value.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array $settings        Settings to process.
+	 * @param array $preset_metadata One of the PRESETS_METADATA values.
+	 * @param array $origins         List of origins to process.
+	 * @return array Array of presets where the key and value are both the slug.
+	 */
+	private static function get_settings_slugs( $settings, $preset_metadata, $origins = self::VALID_ORIGINS ) {
+		$preset_per_origin = _wp_array_get( $settings, $preset_metadata['path'], array() );
+
+		$result = array();
+		foreach ( $origins as $origin ) {
+			if ( ! isset( $preset_per_origin[ $origin ] ) ) {
+				continue;
+			}
+			foreach ( $preset_per_origin[ $origin ] as $preset ) {
+				$slug = _wp_to_kebab_case( $preset['slug'] );
+
+				// Use the array as a set so we don't get duplicates.
+				$result[ $slug ] = $slug;
+			}
+		}
+		return $result;
+	}
+
+	/**
+	 * Transform a slug into a CSS Custom Property.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param string $input String to replace.
+	 * @param string $slug  The slug value to use to generate the custom property.
+	 * @return string The CSS Custom Property. Something along the lines of `--wp--preset--color--black`.
+	 */
+	private static function replace_slug_in_string( $input, $slug ) {
+		return strtr( $input, array( '$slug' => $slug ) );
+	}
+
 	/**
 	 * Given the block settings, it extracts the CSS Custom Properties
 	 * for the presets and adds them to the $declarations array
@@ -746,18 +1160,19 @@ class WP_Theme_JSON {
 	 *     )
 	 *
 	 * @since 5.8.0
+	 * @since 5.9.0 Added the `$origins` parameter.
 	 *
 	 * @param array $settings Settings to process.
+	 * @param array $origins  List of origins to process.
 	 * @return array Returns the modified $declarations.
 	 */
-	private static function compute_preset_vars( $settings ) {
+	private static function compute_preset_vars( $settings, $origins ) {
 		$declarations = array();
-		foreach ( self::PRESETS_METADATA as $preset ) {
-			$preset_per_origin = _wp_array_get( $settings, $preset['path'], array() );
-			$preset_by_slug    = self::get_merged_preset_by_slug( $preset_per_origin, $preset['value_key'] );
-			foreach ( $preset_by_slug as $slug => $value ) {
+		foreach ( self::PRESETS_METADATA as $preset_metadata ) {
+			$values_by_slug = self::get_settings_values_by_slug( $settings, $preset_metadata, $origins );
+			foreach ( $values_by_slug as $slug => $value ) {
 				$declarations[] = array(
-					'name'  => '--wp--preset--' . $preset['css_var_infix'] . '--' . _wp_to_kebab_case( $slug ),
+					'name'  => self::replace_slug_in_string( $preset_metadata['css_vars'], $slug ),
 					'value' => $value,
 				);
 			}
@@ -838,7 +1253,7 @@ class WP_Theme_JSON {
 			$new_key = $prefix . str_replace(
 				'/',
 				'-',
-				strtolower( preg_replace( '/(?<!^)[A-Z]/', '-$0', $property ) ) // CamelCase to kebab-case.
+				strtolower( _wp_to_kebab_case( $property ) )
 			);
 
 			if ( is_array( $value ) ) {
@@ -864,46 +1279,42 @@ class WP_Theme_JSON {
 	 *     )
 	 *
 	 * @since 5.8.0
+	 * @since 5.9.0 Added the `$settings` and `$properties` parameters.
 	 *
-	 * @param array $styles Styles to process.
+	 * @param array $styles    Styles to process.
+	 * @param array $settings  Theme settings.
+	 * @param array $properties Properties metadata.
 	 * @return array Returns the modified $declarations.
 	 */
-	private static function compute_style_properties( $styles ) {
+	private static function compute_style_properties( $styles, $settings = array(), $properties = self::PROPERTIES_METADATA ) {
 		$declarations = array();
 		if ( empty( $styles ) ) {
 			return $declarations;
 		}
 
-		$properties = array();
-		foreach ( self::PROPERTIES_METADATA as $name => $metadata ) {
-			/*
-			 * Some properties can be shorthand properties, meaning that
-			 * they contain multiple values instead of a single one.
-			 * An example of this is the padding property.
-			 */
-			if ( self::has_properties( $metadata ) ) {
-				foreach ( $metadata['properties'] as $property ) {
-					$properties[] = array(
-						'name'  => $name . '-' . $property,
-						'value' => array_merge( $metadata['value'], array( $property ) ),
-					);
+		foreach ( $properties as $css_property => $value_path ) {
+			$value = self::get_property_value( $styles, $value_path );
+
+			// Look up protected properties, keyed by value path.
+			// Skip protected properties that are explicitly set to `null`.
+			if ( is_array( $value_path ) ) {
+				$path_string = implode( '.', $value_path );
+				if (
+					array_key_exists( $path_string, self::PROTECTED_PROPERTIES ) &&
+					_wp_array_get( $settings, self::PROTECTED_PROPERTIES[ $path_string ], null ) === null
+				) {
+					continue;
 				}
-			} else {
-				$properties[] = array(
-					'name'  => $name,
-					'value' => $metadata['value'],
-				);
 			}
-		}
 
-		foreach ( $properties as $prop ) {
-			$value = self::get_property_value( $styles, $prop['value'] );
-			if ( empty( $value ) ) {
+			// Skip if empty and not "0" or value represents array of longhand values.
+			$has_missing_value = empty( $value ) && ! is_numeric( $value );
+			if ( $has_missing_value || is_array( $value ) ) {
 				continue;
 			}
 
 			$declarations[] = array(
-				'name'  => $prop['name'],
+				'name'  => $css_property,
 				'value' => $value,
 			);
 		}
@@ -911,22 +1322,6 @@ class WP_Theme_JSON {
 		return $declarations;
 	}
 
-	/**
-	 * Whether the metadata contains a key named properties.
-	 *
-	 * @since 5.8.0
-	 *
-	 * @param array $metadata Description of the style property.
-	 * @return bool True if properties exists, false otherwise.
-	 */
-	private static function has_properties( $metadata ) {
-		if ( array_key_exists( 'properties', $metadata ) ) {
-			return true;
-		}
-
-		return false;
-	}
-
 	/**
 	 * Returns the style property for the given path.
 	 *
@@ -935,15 +1330,16 @@ class WP_Theme_JSON {
 	 * "--wp--preset--color--secondary".
 	 *
 	 * @since 5.8.0
+	 * @since 5.9.0 Added support for values of array type, which are returned as is.
 	 *
 	 * @param array $styles Styles subtree.
 	 * @param array $path   Which property to process.
-	 * @return string Style property value.
+	 * @return string|array Style property value.
 	 */
 	private static function get_property_value( $styles, $path ) {
 		$value = _wp_array_get( $styles, $path, '' );
 
-		if ( '' === $value ) {
+		if ( '' === $value || is_array( $value ) ) {
 			return $value;
 		}
 
@@ -1015,18 +1411,19 @@ class WP_Theme_JSON {
 		return $nodes;
 	}
 
-
 	/**
 	 * Builds metadata for the style nodes, which returns in the form of:
 	 *
 	 *     [
 	 *       [
 	 *         'path'     => [ 'path', 'to', 'some', 'node' ],
-	 *         'selector' => 'CSS selector for some node'
+	 *         'selector' => 'CSS selector for some node',
+	 *         'duotone'  => 'CSS selector for duotone for some node'
 	 *       ],
 	 *       [
 	 *         'path'     => ['path', 'to', 'other', 'node' ],
-	 *         'selector' => 'CSS selector for other node'
+	 *         'selector' => 'CSS selector for other node',
+	 *         'duotone'  => null
 	 *       ],
 	 *     ]
 	 *
@@ -1068,9 +1465,15 @@ class WP_Theme_JSON {
 				$selector = $selectors[ $name ]['selector'];
 			}
 
+			$duotone_selector = null;
+			if ( isset( $selectors[ $name ]['duotone'] ) ) {
+				$duotone_selector = $selectors[ $name ]['duotone'];
+			}
+
 			$nodes[] = array(
 				'path'     => array( 'styles', 'blocks', $name ),
 				'selector' => $selector,
+				'duotone'  => $duotone_selector,
 			);
 
 			if ( isset( $theme_json['styles']['blocks'][ $name ]['elements'] ) ) {
@@ -1090,6 +1493,7 @@ class WP_Theme_JSON {
 	 * Merge new incoming data.
 	 *
 	 * @since 5.8.0
+	 * @since 5.9.0 Duotone preset also has origins.
 	 *
 	 * @param WP_Theme_JSON $incoming Data to merge.
 	 */
@@ -1098,30 +1502,367 @@ class WP_Theme_JSON {
 		$this->theme_json = array_replace_recursive( $this->theme_json, $incoming_data );
 
 		/*
-		 * The array_replace_recursive() algorithm merges at the leaf level.
-		 * For leaf values that are arrays it will use the numeric indexes for replacement.
-		 * In those cases, we want to replace the existing with the incoming value, if it exists.
+		 * The array_replace_recursive algorithm merges at the leaf level,
+		 * but we don't want leaf arrays to be merged, so we overwrite it.
+		 *
+		 * For leaf values that are sequential arrays it will use the numeric indexes for replacement.
+		 * We rather replace the existing with the incoming value, if it exists.
+		 * This is the case of spacing.units.
+		 *
+		 * For leaf values that are associative arrays it will merge them as expected.
+		 * This is also not the behavior we want for the current associative arrays (presets).
+		 * We rather replace the existing with the incoming value, if it exists.
+		 * This happens, for example, when we merge data from theme.json upon existing
+		 * theme supports or when we merge anything coming from the same source twice.
+		 * This is the case of color.palette, color.gradients, color.duotone,
+		 * typography.fontSizes, or typography.fontFamilies.
+		 *
+		 * Additionally, for some preset types, we also want to make sure the
+		 * values they introduce don't conflict with default values. We do so
+		 * by checking the incoming slugs for theme presets and compare them
+		 * with the equivalent default presets: if a slug is present as a default
+		 * we remove it from the theme presets.
+		 */
+		$nodes        = self::get_setting_nodes( $incoming_data );
+		$slugs_global = self::get_default_slugs( $this->theme_json, array( 'settings' ) );
+		foreach ( $nodes as $node ) {
+			$slugs_node = self::get_default_slugs( $this->theme_json, $node['path'] );
+			$slugs      = array_merge_recursive( $slugs_global, $slugs_node );
+
+			// Replace the spacing.units.
+			$path    = array_merge( $node['path'], array( 'spacing', 'units' ) );
+			$content = _wp_array_get( $incoming_data, $path, null );
+			if ( isset( $content ) ) {
+				_wp_array_set( $this->theme_json, $path, $content );
+			}
+
+			// Replace the presets.
+			foreach ( self::PRESETS_METADATA as $preset ) {
+				$override_preset = self::should_override_preset( $this->theme_json, $node['path'], $preset['override'] );
+
+				foreach ( self::VALID_ORIGINS as $origin ) {
+					$base_path = array_merge( $node['path'], $preset['path'] );
+					$path      = array_merge( $base_path, array( $origin ) );
+					$content   = _wp_array_get( $incoming_data, $path, null );
+					if ( ! isset( $content ) ) {
+						continue;
+					}
+
+					if ( 'theme' === $origin && $preset['use_default_names'] ) {
+						foreach ( $content as &$item ) {
+							if ( ! array_key_exists( 'name', $item ) ) {
+								$name = self::get_name_from_defaults( $item['slug'], $base_path );
+								if ( null !== $name ) {
+									$item['name'] = $name;
+								}
+							}
+						}
+					}
+
+					if (
+						( 'theme' !== $origin ) ||
+						( 'theme' === $origin && $override_preset )
+					) {
+						_wp_array_set( $this->theme_json, $path, $content );
+					} else {
+						$slugs_for_preset = _wp_array_get( $slugs, $preset['path'], array() );
+						$content          = self::filter_slugs( $content, $slugs_for_preset );
+						_wp_array_set( $this->theme_json, $path, $content );
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Returns whether a presets should be overridden or not.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array      $theme_json The theme.json like structure to inspect.
+	 * @param array      $path Path to inspect.
+	 * @param bool|array $override Data to compute whether to override the preset.
+	 * @return boolean
+	 */
+	private static function should_override_preset( $theme_json, $path, $override ) {
+		if ( is_bool( $override ) ) {
+			return $override;
+		}
+
+		/*
+		 * The relationship between whether to override the defaults
+		 * and whether the defaults are enabled is inverse:
+		 *
+		 * - If defaults are enabled  => theme presets should not be overridden
+		 * - If defaults are disabled => theme presets should be overridden
+		 *
+		 * For example, a theme sets defaultPalette to false,
+		 * making the default palette hidden from the user.
+		 * In that case, we want all the theme presets to be present,
+		 * so they should override the defaults.
 		 */
-		$to_replace   = array();
-		$to_replace[] = array( 'spacing', 'units' );
-		$to_replace[] = array( 'color', 'duotone' );
-		foreach ( self::VALID_ORIGINS as $origin ) {
-			$to_replace[] = array( 'color', 'palette', $origin );
-			$to_replace[] = array( 'color', 'gradients', $origin );
-			$to_replace[] = array( 'typography', 'fontSizes', $origin );
-			$to_replace[] = array( 'typography', 'fontFamilies', $origin );
+		if ( is_array( $override ) ) {
+			$value = _wp_array_get( $theme_json, array_merge( $path, $override ) );
+			if ( isset( $value ) ) {
+				return ! $value;
+			}
+
+			// Search the top-level key if none was found for this node.
+			$value = _wp_array_get( $theme_json, array_merge( array( 'settings' ), $override ) );
+			if ( isset( $value ) ) {
+				return ! $value;
+			}
+
+			return true;
 		}
+	}
 
-		$nodes = self::get_setting_nodes( $this->theme_json );
-		foreach ( $nodes as $metadata ) {
-			foreach ( $to_replace as $property_path ) {
-				$path = array_merge( $metadata['path'], $property_path );
-				$node = _wp_array_get( $incoming_data, $path, null );
-				if ( isset( $node ) ) {
-					_wp_array_set( $this->theme_json, $path, $node );
+	/**
+	 * Returns the default slugs for all the presets in an associative array
+	 * whose keys are the preset paths and the leafs is the list of slugs.
+	 *
+	 * For example:
+	 *
+	 *  array(
+	 *   'color' => array(
+	 *     'palette'   => array( 'slug-1', 'slug-2' ),
+	 *     'gradients' => array( 'slug-3', 'slug-4' ),
+	 *   ),
+	 * )
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array $data      A theme.json like structure.
+	 * @param array $node_path The path to inspect. It's 'settings' by default.
+	 * @return array
+	 */
+	private static function get_default_slugs( $data, $node_path ) {
+		$slugs = array();
+
+		foreach ( self::PRESETS_METADATA as $metadata ) {
+			$path   = array_merge( $node_path, $metadata['path'], array( 'default' ) );
+			$preset = _wp_array_get( $data, $path, null );
+			if ( ! isset( $preset ) ) {
+				continue;
+			}
+
+			$slugs_for_preset = array();
+			$slugs_for_preset = array_map(
+				static function( $value ) {
+					return isset( $value['slug'] ) ? $value['slug'] : null;
+				},
+				$preset
+			);
+			_wp_array_set( $slugs, $metadata['path'], $slugs_for_preset );
+		}
+
+		return $slugs;
+	}
+
+	/**
+	 * Get a `default`'s preset name by a provided slug.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param string $slug The slug we want to find a match from default presets.
+	 * @param array  $base_path The path to inspect. It's 'settings' by default.
+	 * @return string|null
+	 */
+	private function get_name_from_defaults( $slug, $base_path ) {
+		$path            = array_merge( $base_path, array( 'default' ) );
+		$default_content = _wp_array_get( $this->theme_json, $path, null );
+		if ( ! $default_content ) {
+			return null;
+		}
+		foreach ( $default_content as $item ) {
+			if ( $slug === $item['slug'] ) {
+				return $item['name'];
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * Removes the preset values whose slug is equal to any of given slugs.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array $node  The node with the presets to validate.
+	 * @param array $slugs The slugs that should not be overridden.
+	 * @return array The new node.
+	 */
+	private static function filter_slugs( $node, $slugs ) {
+		if ( empty( $slugs ) ) {
+			return $node;
+		}
+
+		$new_node = array();
+		foreach ( $node as $value ) {
+			if ( isset( $value['slug'] ) && ! in_array( $value['slug'], $slugs, true ) ) {
+				$new_node[] = $value;
+			}
+		}
+
+		return $new_node;
+	}
+
+	/**
+	 * Removes insecure data from theme.json.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array $theme_json Structure to sanitize.
+	 * @return array Sanitized structure.
+	 */
+	public static function remove_insecure_properties( $theme_json ) {
+		$sanitized = array();
+
+		$theme_json = WP_Theme_JSON_Schema::migrate( $theme_json );
+
+		$valid_block_names   = array_keys( self::get_blocks_metadata() );
+		$valid_element_names = array_keys( self::ELEMENTS );
+		$theme_json          = self::sanitize( $theme_json, $valid_block_names, $valid_element_names );
+
+		$blocks_metadata = self::get_blocks_metadata();
+		$style_nodes     = self::get_style_nodes( $theme_json, $blocks_metadata );
+		foreach ( $style_nodes as $metadata ) {
+			$input = _wp_array_get( $theme_json, $metadata['path'], array() );
+			if ( empty( $input ) ) {
+				continue;
+			}
+
+			$output = self::remove_insecure_styles( $input );
+			if ( ! empty( $output ) ) {
+				_wp_array_set( $sanitized, $metadata['path'], $output );
+			}
+		}
+
+		$setting_nodes = self::get_setting_nodes( $theme_json );
+		foreach ( $setting_nodes as $metadata ) {
+			$input = _wp_array_get( $theme_json, $metadata['path'], array() );
+			if ( empty( $input ) ) {
+				continue;
+			}
+
+			$output = self::remove_insecure_settings( $input );
+			if ( ! empty( $output ) ) {
+				_wp_array_set( $sanitized, $metadata['path'], $output );
+			}
+		}
+
+		if ( empty( $sanitized['styles'] ) ) {
+			unset( $theme_json['styles'] );
+		} else {
+			$theme_json['styles'] = $sanitized['styles'];
+		}
+
+		if ( empty( $sanitized['settings'] ) ) {
+			unset( $theme_json['settings'] );
+		} else {
+			$theme_json['settings'] = $sanitized['settings'];
+		}
+
+		return $theme_json;
+	}
+
+	/**
+	 * Processes a setting node and returns the same node
+	 * without the insecure settings.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array $input Node to process.
+	 * @return array
+	 */
+	private static function remove_insecure_settings( $input ) {
+		$output = array();
+		foreach ( self::PRESETS_METADATA as $preset_metadata ) {
+			foreach ( self::VALID_ORIGINS as $origin ) {
+				$path_with_origin = array_merge( $preset_metadata['path'], array( $origin ) );
+				$presets          = _wp_array_get( $input, $path_with_origin, null );
+				if ( null === $presets ) {
+					continue;
+				}
+
+				$escaped_preset = array();
+				foreach ( $presets as $preset ) {
+					if (
+						esc_attr( esc_html( $preset['name'] ) ) === $preset['name'] &&
+						sanitize_html_class( $preset['slug'] ) === $preset['slug']
+					) {
+						$value = null;
+						if ( isset( $preset_metadata['value_key'] ) ) {
+							$value = $preset[ $preset_metadata['value_key'] ];
+						} elseif (
+							isset( $preset_metadata['value_func'] ) &&
+							is_callable( $preset_metadata['value_func'] )
+						) {
+							$value = call_user_func( $preset_metadata['value_func'], $preset );
+						}
+
+						$preset_is_valid = true;
+						foreach ( $preset_metadata['properties'] as $property ) {
+							if ( ! self::is_safe_css_declaration( $property, $value ) ) {
+								$preset_is_valid = false;
+								break;
+							}
+						}
+
+						if ( $preset_is_valid ) {
+							$escaped_preset[] = $preset;
+						}
+					}
+				}
+
+				if ( ! empty( $escaped_preset ) ) {
+					_wp_array_set( $output, $path_with_origin, $escaped_preset );
+				}
+			}
+		}
+		return $output;
+	}
+
+	/**
+	 * Processes a style node and returns the same node
+	 * without the insecure styles.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array $input Node to process.
+	 * @return array
+	 */
+	private static function remove_insecure_styles( $input ) {
+		$output       = array();
+		$declarations = self::compute_style_properties( $input );
+
+		foreach ( $declarations as $declaration ) {
+			if ( self::is_safe_css_declaration( $declaration['name'], $declaration['value'] ) ) {
+				$path = self::PROPERTIES_METADATA[ $declaration['name'] ];
+
+				// Check the value isn't an array before adding so as to not
+				// double up shorthand and longhand styles.
+				$value = _wp_array_get( $input, $path, array() );
+				if ( ! is_array( $value ) ) {
+					_wp_array_set( $output, $path, $value );
 				}
 			}
 		}
+		return $output;
+	}
+
+	/**
+	 * Checks that a declaration provided by the user is safe.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param string $property_name  Property name in a CSS declaration, i.e. the `color` in `color: red`.
+	 * @param string $property_value Value in a CSS declaration, i.e. the `red` in `color: red`.
+	 * @return bool
+	 */
+	private static function is_safe_css_declaration( $property_name, $property_value ) {
+		$style_to_validate = $property_name . ': ' . $property_value;
+		$filtered          = esc_html( safecss_filter_attr( $style_to_validate ) );
+		return ! empty( trim( $filtered ) );
 	}
 
 	/**
@@ -1176,7 +1917,7 @@ class WP_Theme_JSON {
 			if ( ! isset( $theme_settings['settings']['typography'] ) ) {
 				$theme_settings['settings']['typography'] = array();
 			}
-			$theme_settings['settings']['typography']['customLineHeight'] = $settings['enableCustomLineHeight'];
+			$theme_settings['settings']['typography']['lineHeight'] = $settings['enableCustomLineHeight'];
 		}
 
 		if ( isset( $settings['enableCustomUnits'] ) ) {
@@ -1220,7 +1961,7 @@ class WP_Theme_JSON {
 			if ( ! isset( $theme_settings['settings']['spacing'] ) ) {
 				$theme_settings['settings']['spacing'] = array();
 			}
-			$theme_settings['settings']['spacing']['customPadding'] = $settings['enableCustomSpacing'];
+			$theme_settings['settings']['spacing']['padding'] = $settings['enableCustomSpacing'];
 		}
 
 		return $theme_settings;
diff --git a/src/wp-includes/class-wp-theme.php b/src/wp-includes/class-wp-theme.php
index d0607528b5..2c4dcd7fc8 100644
--- a/src/wp-includes/class-wp-theme.php
+++ b/src/wp-includes/class-wp-theme.php
@@ -23,7 +23,7 @@ final class WP_Theme implements ArrayAccess {
 	 *
 	 * @since 3.4.0
 	 * @since 5.4.0 Added `Requires at least` and `Requires PHP` headers.
-	 * @var array
+	 * @var string[]
 	 */
 	private static $file_headers = array(
 		'Name'        => 'Theme Name',
@@ -54,7 +54,7 @@ final class WP_Theme implements ArrayAccess {
 	 * @since 5.0.0 Added the Twenty Nineteen theme.
 	 * @since 5.3.0 Added the Twenty Twenty theme.
 	 * @since 5.6.0 Added the Twenty Twenty-One theme.
-	 * @var array
+	 * @var string[]
 	 */
 	private static $default_themes = array(
 		'classic'         => 'WordPress Classic',
@@ -70,13 +70,14 @@ final class WP_Theme implements ArrayAccess {
 		'twentynineteen'  => 'Twenty Nineteen',
 		'twentytwenty'    => 'Twenty Twenty',
 		'twentytwentyone' => 'Twenty Twenty-One',
+		'twentytwentytwo' => 'Twenty Twenty-Two',
 	);
 
 	/**
 	 * Renamed theme tags.
 	 *
 	 * @since 3.8.0
-	 * @var array
+	 * @var string[]
 	 */
 	private static $tag_map = array(
 		'fixed-width'    => 'fixed-layout',
@@ -697,7 +698,7 @@ final class WP_Theme implements ArrayAccess {
 	 *
 	 * @since 3.4.0
 	 *
-	 * @return WP_Theme|false Parent theme, or false if the current theme is not a child theme.
+	 * @return WP_Theme|false Parent theme, or false if the active theme is not a child theme.
 	 */
 	public function parent() {
 		return isset( $this->parent ) ? $this->parent : false;
@@ -980,8 +981,8 @@ final class WP_Theme implements ArrayAccess {
 						'tan'               => __( 'Tan' ),
 						'white'             => __( 'White' ),
 						'yellow'            => __( 'Yellow' ),
-						'dark'              => __( 'Dark' ),
-						'light'             => __( 'Light' ),
+						'dark'              => _x( 'Dark', 'color scheme' ),
+						'light'             => _x( 'Light', 'color scheme' ),
 						'fixed-layout'      => __( 'Fixed Layout' ),
 						'fluid-layout'      => __( 'Fluid Layout' ),
 						'responsive-layout' => __( 'Responsive Layout' ),
@@ -1212,11 +1213,11 @@ final class WP_Theme implements ArrayAccess {
 	 * @since 4.7.0
 	 * @since 5.8.0 Include block templates.
 	 *
-	 * @return string[] Array of page templates, keyed by filename and post type,
-	 *                  with the value of the translated header name.
+	 * @return array[] Array of page template arrays, keyed by post type and filename,
+	 *                 with the value of the translated header name.
 	 */
 	public function get_post_templates() {
-		// If you screw up your current theme and we invalidate your parent, most things still work. Let it slide.
+		// If you screw up your active theme and we invalidate your parent, most things still work. Let it slide.
 		if ( $this->errors() && $this->errors()->get_error_codes() !== array( 'theme_parent_invalid' ) ) {
 			return array();
 		}
@@ -1252,6 +1253,14 @@ final class WP_Theme implements ArrayAccess {
 				$block_templates = get_block_templates( array(), 'wp_template' );
 				foreach ( get_post_types( array( 'public' => true ) ) as $type ) {
 					foreach ( $block_templates as $block_template ) {
+						if ( ! $block_template->is_custom ) {
+							continue;
+						}
+
+						if ( isset( $block_template->post_types ) && ! in_array( $type, $block_template->post_types, true ) ) {
+							continue;
+						}
+
 						$post_templates[ $type ][ $block_template->slug ] = $block_template->title;
 					}
 				}
@@ -1459,6 +1468,57 @@ final class WP_Theme implements ArrayAccess {
 		return false;
 	}
 
+	/**
+	 * Returns whether this theme is a block-based theme or not.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @return bool
+	 */
+	public function is_block_theme() {
+		$paths_to_index_block_template = array(
+			$this->get_file_path( '/block-templates/index.html' ),
+			$this->get_file_path( '/templates/index.html' ),
+		);
+
+		foreach ( $paths_to_index_block_template as $path_to_index_block_template ) {
+			if ( is_file( $path_to_index_block_template ) && is_readable( $path_to_index_block_template ) ) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	/**
+	 * Retrieves the path of a file in the theme.
+	 *
+	 * Searches in the stylesheet directory before the template directory so themes
+	 * which inherit from a parent theme can just override one file.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param string $file Optional. File to search for in the stylesheet directory.
+	 * @return string The path of the file.
+	 */
+	public function get_file_path( $file = '' ) {
+		$file = ltrim( $file, '/' );
+
+		$stylesheet_directory = $this->get_stylesheet_directory();
+		$template_directory   = $this->get_template_directory();
+
+		if ( empty( $file ) ) {
+			$path = $stylesheet_directory;
+		} elseif ( file_exists( $stylesheet_directory . '/' . $file ) ) {
+			$path = $stylesheet_directory . '/' . $file;
+		} else {
+			$path = $template_directory . '/' . $file;
+		}
+
+		/** This filter is documented in wp-includes/link-template.php */
+		return apply_filters( 'theme_file_path', $path, $file );
+	}
+
 	/**
 	 * Determines the latest WordPress default theme that is installed.
 	 *
diff --git a/src/wp-includes/class-wp-user-query.php b/src/wp-includes/class-wp-user-query.php
index 936ffe89bf..ac6465c5f1 100644
--- a/src/wp-includes/class-wp-user-query.php
+++ b/src/wp-includes/class-wp-user-query.php
@@ -136,6 +136,8 @@ class WP_User_Query {
 	 *              querying for all users with using -1.
 	 * @since 4.7.0 Added 'nicename', 'nicename__in', 'nicename__not_in', 'login', 'login__in',
 	 *              and 'login__not_in' parameters.
+	 * @since 5.1.0 Introduced the 'meta_compare_key' parameter.
+	 * @since 5.3.0 Introduced the 'meta_type_key' parameter.
 	 * @since 5.9.0 Added 'capability', 'capability__in', and 'capability__not_in' parameters.
 	 *
 	 * @global wpdb $wpdb WordPress database abstraction object.
@@ -144,85 +146,108 @@ class WP_User_Query {
 	 * @param string|array $query {
 	 *     Optional. Array or string of Query parameters.
 	 *
-	 *     @type int          $blog_id             The site ID. Default is the current site.
-	 *     @type string|array $role                An array or a comma-separated list of role names that users must match
-	 *                                             to be included in results. Note that this is an inclusive list: users
-	 *                                             must match *each* role. Default empty.
-	 *     @type string[]     $role__in            An array of role names. Matched users must have at least one of these
-	 *                                             roles. Default empty array.
-	 *     @type string[]     $role__not_in        An array of role names to exclude. Users matching one or more of these
-	 *                                             roles will not be included in results. Default empty array.
-	 *     @type string       $capability          An array or a comma-separated list of capability names that users must match
-	 *                                             to be included in results. Note that this is an inclusive list: users
-	 *                                             must match *each* capability.
-	 *                                             Does NOT work for capabilities not in the database or filtered via {@see 'map_meta_cap'}.
-	 *                                             Default empty.
-	 *     @type string[]     $capability__in      An array of capability names. Matched users must have at least one of these
-	 *                                             capabilities.
-	 *                                             Does NOT work for capabilities not in the database or filtered via {@see 'map_meta_cap'}.
-	 *                                             Default empty array.
-	 *     @type string[]     $capability__not_in  An array of capability names to exclude. Users matching one or more of these
-	 *                                             capabilities will not be included in results.
-	 *                                             Does NOT work for capabilities not in the database or filtered via {@see 'map_meta_cap'}.
-	 *                                             Default empty array.
-	 *     @type string       $meta_key            User meta key. Default empty.
-	 *     @type string       $meta_value          User meta value. Default empty.
-	 *     @type string       $meta_compare        Comparison operator to test the `$meta_value`. Accepts '=', '!=',
-	 *                                             '>', '>=', '<', '<=', 'LIKE', 'NOT LIKE', 'IN', 'NOT IN',
-	 *                                             'BETWEEN', 'NOT BETWEEN', 'EXISTS', 'NOT EXISTS', 'REGEXP',
-	 *                                             'NOT REGEXP', or 'RLIKE'. Default '='.
-	 *     @type int[]        $include             An array of user IDs to include. Default empty array.
-	 *     @type int[]        $exclude             An array of user IDs to exclude. Default empty array.
-	 *     @type string       $search              Search keyword. Searches for possible string matches on columns.
-	 *                                             When `$search_columns` is left empty, it tries to determine which
-	 *                                             column to search in based on search string. Default empty.
-	 *     @type string[]     $search_columns      Array of column names to be searched. Accepts 'ID', 'user_login',
-	 *                                             'user_email', 'user_url', 'user_nicename', 'display_name'.
-	 *                                             Default empty array.
-	 *     @type string|array $orderby             Field(s) to sort the retrieved users by. May be a single value,
-	 *                                             an array of values, or a multi-dimensional array with fields as
-	 *                                             keys and orders ('ASC' or 'DESC') as values. Accepted values are
-	 *                                             'ID', 'display_name' (or 'name'), 'include', 'user_login'
-	 *                                             (or 'login'), 'login__in', 'user_nicename' (or 'nicename'),
-	 *                                             'nicename__in', 'user_email (or 'email'), 'user_url' (or 'url'),
-	 *                                             'user_registered' (or 'registered'), 'post_count', 'meta_value',
-	 *                                             'meta_value_num', the value of `$meta_key`, or an array key of
-	 *                                             `$meta_query`. To use 'meta_value' or 'meta_value_num', `$meta_key`
-	 *                                             must be also be defined. Default 'user_login'.
-	 *     @type string       $order               Designates ascending or descending order of users. Order values
-	 *                                             passed as part of an `$orderby` array take precedence over this
-	 *                                             parameter. Accepts 'ASC', 'DESC'. Default 'ASC'.
-	 *     @type int          $offset              Number of users to offset in retrieved results. Can be used in
-	 *                                             conjunction with pagination. Default 0.
-	 *     @type int          $number              Number of users to limit the query for. Can be used in
-	 *                                             conjunction with pagination. Value -1 (all) is supported, but
-	 *                                             should be used with caution on larger sites.
-	 *                                             Default -1 (all users).
-	 *     @type int          $paged               When used with number, defines the page of results to return.
-	 *                                             Default 1.
-	 *     @type bool         $count_total         Whether to count the total number of users found. If pagination
-	 *                                             is not needed, setting this to false can improve performance.
-	 *                                             Default true.
-	 *     @type string|array $fields              Which fields to return. Single or all fields (string), or array
-	 *                                             of fields. Accepts 'ID', 'display_name', 'user_login',
-	 *                                             'user_nicename', 'user_email', 'user_url', 'user_registered'.
-	 *                                             Use 'all' for all fields and 'all_with_meta' to include
-	 *                                             meta fields. Default 'all'.
-	 *     @type string       $who                 Type of users to query. Accepts 'authors'.
-	 *                                             Default empty (all users).
-	 *     @type bool|array   $has_published_posts Pass an array of post types to filter results to users who have
-	 *                                             published posts in those post types. `true` is an alias for all
-	 *                                             public post types.
-	 *     @type string       $nicename            The user nicename. Default empty.
-	 *     @type string[]     $nicename__in        An array of nicenames to include. Users matching one of these
-	 *                                             nicenames will be included in results. Default empty array.
-	 *     @type string[]     $nicename__not_in    An array of nicenames to exclude. Users matching one of these
-	 *                                             nicenames will not be included in results. Default empty array.
-	 *     @type string       $login               The user login. Default empty.
-	 *     @type string[]     $login__in           An array of logins to include. Users matching one of these
-	 *                                             logins will be included in results. Default empty array.
-	 *     @type string[]     $login__not_in       An array of logins to exclude. Users matching one of these
-	 *                                             logins will not be included in results. Default empty array.
+	 *     @type int             $blog_id             The site ID. Default is the current site.
+	 *     @type string|string[] $role                An array or a comma-separated list of role names that users must match
+	 *                                                to be included in results. Note that this is an inclusive list: users
+	 *                                                must match *each* role. Default empty.
+	 *     @type string[]        $role__in            An array of role names. Matched users must have at least one of these
+	 *                                                roles. Default empty array.
+	 *     @type string[]        $role__not_in        An array of role names to exclude. Users matching one or more of these
+	 *                                                roles will not be included in results. Default empty array.
+	 *     @type string|string[] $meta_key            Meta key or keys to filter by.
+	 *     @type string|string[] $meta_value          Meta value or values to filter by.
+	 *     @type string          $meta_compare        MySQL operator used for comparing the meta value.
+	 *                                                See WP_Meta_Query::__construct for accepted values and default value.
+	 *     @type string          $meta_compare_key    MySQL operator used for comparing the meta key.
+	 *                                                See WP_Meta_Query::__construct for accepted values and default value.
+	 *     @type string          $meta_type           MySQL data type that the meta_value column will be CAST to for comparisons.
+	 *                                                See WP_Meta_Query::__construct for accepted values and default value.
+	 *     @type string          $meta_type_key       MySQL data type that the meta_key column will be CAST to for comparisons.
+	 *                                                See WP_Meta_Query::__construct for accepted values and default value.
+	 *     @type array           $meta_query          An associative array of WP_Meta_Query arguments.
+	 *                                                See WP_Meta_Query::__construct for accepted values.
+	 *     @type string|string[] $capability          An array or a comma-separated list of capability names that users must match
+	 *                                                to be included in results. Note that this is an inclusive list: users
+	 *                                                must match *each* capability.
+	 *                                                Does NOT work for capabilities not in the database or filtered via {@see 'map_meta_cap'}.
+	 *                                                Default empty.
+	 *     @type string[]        $capability__in      An array of capability names. Matched users must have at least one of these
+	 *                                                capabilities.
+	 *                                                Does NOT work for capabilities not in the database or filtered via {@see 'map_meta_cap'}.
+	 *                                                Default empty array.
+	 *     @type string[]        $capability__not_in  An array of capability names to exclude. Users matching one or more of these
+	 *                                                capabilities will not be included in results.
+	 *                                                Does NOT work for capabilities not in the database or filtered via {@see 'map_meta_cap'}.
+	 *                                                Default empty array.
+	 *     @type int[]           $include             An array of user IDs to include. Default empty array.
+	 *     @type int[]           $exclude             An array of user IDs to exclude. Default empty array.
+	 *     @type string          $search              Search keyword. Searches for possible string matches on columns.
+	 *                                                When `$search_columns` is left empty, it tries to determine which
+	 *                                                column to search in based on search string. Default empty.
+	 *     @type string[]        $search_columns      Array of column names to be searched. Accepts 'ID', 'user_login',
+	 *                                                'user_email', 'user_url', 'user_nicename', 'display_name'.
+	 *                                                Default empty array.
+	 *     @type string|array    $orderby             Field(s) to sort the retrieved users by. May be a single value,
+	 *                                                an array of values, or a multi-dimensional array with fields as
+	 *                                                keys and orders ('ASC' or 'DESC') as values. Accepted values are:
+	 *                                                - 'ID'
+	 *                                                - 'display_name' (or 'name')
+	 *                                                - 'include'
+	 *                                                - 'user_login' (or 'login')
+	 *                                                - 'login__in'
+	 *                                                - 'user_nicename' (or 'nicename'),
+	 *                                                - 'nicename__in'
+	 *                                                - 'user_email (or 'email')
+	 *                                                - 'user_url' (or 'url'),
+	 *                                                - 'user_registered' (or 'registered')
+	 *                                                - 'post_count'
+	 *                                                - 'meta_value',
+	 *                                                - 'meta_value_num'
+	 *                                                - The value of `$meta_key`
+	 *                                                - An array key of `$meta_query`
+	 *                                                To use 'meta_value' or 'meta_value_num', `$meta_key`
+	 *                                                must be also be defined. Default 'user_login'.
+	 *     @type string          $order               Designates ascending or descending order of users. Order values
+	 *                                                passed as part of an `$orderby` array take precedence over this
+	 *                                                parameter. Accepts 'ASC', 'DESC'. Default 'ASC'.
+	 *     @type int             $offset              Number of users to offset in retrieved results. Can be used in
+	 *                                                conjunction with pagination. Default 0.
+	 *     @type int             $number              Number of users to limit the query for. Can be used in
+	 *                                                conjunction with pagination. Value -1 (all) is supported, but
+	 *                                                should be used with caution on larger sites.
+	 *                                                Default -1 (all users).
+	 *     @type int             $paged               When used with number, defines the page of results to return.
+	 *                                                Default 1.
+	 *     @type bool            $count_total         Whether to count the total number of users found. If pagination
+	 *                                                is not needed, setting this to false can improve performance.
+	 *                                                Default true.
+	 *     @type string|string[] $fields              Which fields to return. Single or all fields (string), or array
+	 *                                                of fields. Accepts:
+	 *                                                - 'ID'
+	 *                                                - 'display_name'
+	 *                                                - 'user_login'
+	 *                                                - 'user_nicename'
+	 *                                                - 'user_email'
+	 *                                                - 'user_url'
+	 *                                                - 'user_registered'
+	 *                                                - 'all' for all fields
+	 *                                                - 'all_with_meta' to include meta fields.
+	 *                                                Default 'all'.
+	 *     @type string          $who                 Type of users to query. Accepts 'authors'.
+	 *                                                Default empty (all users).
+	 *     @type bool|string[]   $has_published_posts Pass an array of post types to filter results to users who have
+	 *                                                published posts in those post types. `true` is an alias for all
+	 *                                                public post types.
+	 *     @type string          $nicename            The user nicename. Default empty.
+	 *     @type string[]        $nicename__in        An array of nicenames to include. Users matching one of these
+	 *                                                nicenames will be included in results. Default empty array.
+	 *     @type string[]        $nicename__not_in    An array of nicenames to exclude. Users matching one of these
+	 *                                                nicenames will not be included in results. Default empty array.
+	 *     @type string          $login               The user login. Default empty.
+	 *     @type string[]        $login__in           An array of logins to include. Users matching one of these
+	 *                                                logins will be included in results. Default empty array.
+	 *     @type string[]        $login__not_in       An array of logins to exclude. Users matching one of these
+	 *                                                logins will not be included in results. Default empty array.
 	 * }
 	 */
 	public function prepare_query( $query = array() ) {
diff --git a/src/wp-includes/class-wp-walker.php b/src/wp-includes/class-wp-walker.php
index b50c2d7505..1350730a30 100644
--- a/src/wp-includes/class-wp-walker.php
+++ b/src/wp-includes/class-wp-walker.php
@@ -24,7 +24,7 @@ class Walker {
 	 * DB fields to use.
 	 *
 	 * @since 2.1.0
-	 * @var array
+	 * @var string[]
 	 */
 	public $db_fields;
 
@@ -209,7 +209,7 @@ class Walker {
 		/*
 		 * Need to display in hierarchical order.
 		 * Separate elements into two buckets: top level and children elements.
-		 * Children_elements is two dimensional array, eg.
+		 * Children_elements is two dimensional array. Example:
 		 * Children_elements[10][] contains all sub-elements whose parent is 10.
 		 */
 		$top_level_elements = array();
diff --git a/src/wp-includes/class-wp-widget.php b/src/wp-includes/class-wp-widget.php
index fa206e7d35..e91f5cd9f9 100644
--- a/src/wp-includes/class-wp-widget.php
+++ b/src/wp-includes/class-wp-widget.php
@@ -365,7 +365,7 @@ class WP_Widget {
 		$this->_set( $widget_args['number'] );
 		$instances = $this->get_settings();
 
-		if ( array_key_exists( $this->number, $instances ) ) {
+		if ( isset( $instances[ $this->number ] ) ) {
 			$instance = $instances[ $this->number ];
 
 			/**
diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php
index 35d05357a0..58388dd3d4 100644
--- a/src/wp-includes/class-wp-xmlrpc-server.php
+++ b/src/wp-includes/class-wp-xmlrpc-server.php
@@ -2271,11 +2271,11 @@ class wp_xmlrpc_server extends IXR_Server {
 	 * @param array $args {
 	 *     Method arguments. Note: arguments must be ordered as documented.
 	 *
-	 *     @type int    $blog_id      Blog ID (unused).
-	 *     @type string $username     Username.
-	 *     @type string $password     Password.
-	 *     @type string $taxnomy_name Taxonomy name.
-	 *     @type int    $term_id      Term ID.
+	 *     @type int    $blog_id       Blog ID (unused).
+	 *     @type string $username      Username.
+	 *     @type string $password      Password.
+	 *     @type string $taxonomy_name Taxonomy name.
+	 *     @type int    $term_id       Term ID.
 	 * }
 	 * @return true|IXR_Error True on success, IXR_Error instance on failure.
 	 */
@@ -2344,7 +2344,7 @@ class wp_xmlrpc_server extends IXR_Server {
 	 *     @type int    $blog_id  Blog ID (unused).
 	 *     @type string $username Username.
 	 *     @type string $password Password.
-	 *     @type string $taxnomy  Taxonomy name.
+	 *     @type string $taxonomy Taxonomy name.
 	 *     @type string $term_id  Term ID.
 	 * }
 	 * @return array|IXR_Error IXR_Error on failure, array on success, containing:
@@ -2417,7 +2417,7 @@ class wp_xmlrpc_server extends IXR_Server {
 	 *     @type int    $blog_id  Blog ID (unused).
 	 *     @type string $username Username.
 	 *     @type string $password Password.
-	 *     @type string $taxnomy  Taxonomy name.
+	 *     @type string $taxonomy Taxonomy name.
 	 *     @type array  $filter   Optional. Modifies the query used to retrieve posts. Accepts 'number',
 	 *                            'offset', 'orderby', 'order', 'hide_empty', and 'search'. Default empty array.
 	 * }
@@ -2509,7 +2509,7 @@ class wp_xmlrpc_server extends IXR_Server {
 	 *     @type int    $blog_id  Blog ID (unused).
 	 *     @type string $username Username.
 	 *     @type string $password Password.
-	 *     @type string $taxnomy  Taxonomy name.
+	 *     @type string $taxonomy Taxonomy name.
 	 *     @type array  $fields   Optional. Array of taxonomy fields to limit to in the return.
 	 *                            Accepts 'labels', 'cap', 'menu', and 'object_type'.
 	 *                            Default empty array.
@@ -6399,7 +6399,7 @@ class wp_xmlrpc_server extends IXR_Server {
 		/**
 		 * Filters whether to preempt the XML-RPC media upload.
 		 *
-		 * Passing a truthy value will effectively short-circuit the media upload,
+		 * Returning a truthy value will effectively short-circuit the media upload,
 		 * returning that value as a 500 error instead.
 		 *
 		 * @since 2.1.0
diff --git a/src/wp-includes/class.wp-dependencies.php b/src/wp-includes/class.wp-dependencies.php
index e9f701b727..2157871ea5 100644
--- a/src/wp-includes/class.wp-dependencies.php
+++ b/src/wp-includes/class.wp-dependencies.php
@@ -94,6 +94,15 @@ class WP_Dependencies {
 	 */
 	private $all_queued_deps;
 
+	/**
+	 * List of assets enqueued before details were registered.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @var array
+	 */
+	private $queued_before_register = array();
+
 	/**
 	 * Processes the items and dependencies.
 	 *
@@ -248,6 +257,18 @@ class WP_Dependencies {
 			return false;
 		}
 		$this->registered[ $handle ] = new _WP_Dependency( $handle, $src, $deps, $ver, $args );
+
+		// If the item was enqueued before the details were registered, enqueue it now.
+		if ( array_key_exists( $handle, $this->queued_before_register ) ) {
+			if ( ! is_null( $this->queued_before_register[ $handle ] ) ) {
+				$this->enqueue( $handle . '?' . $this->queued_before_register[ $handle ] );
+			} else {
+				$this->enqueue( $handle );
+			}
+
+			unset( $this->queued_before_register[ $handle ] );
+		}
+
 		return true;
 	}
 
@@ -334,6 +355,12 @@ class WP_Dependencies {
 				if ( isset( $handle[1] ) ) {
 					$this->args[ $handle[0] ] = $handle[1];
 				}
+			} elseif ( ! isset( $this->registered[ $handle[0] ] ) ) {
+				$this->queued_before_register[ $handle[0] ] = null; // $args
+
+				if ( isset( $handle[1] ) ) {
+					$this->queued_before_register[ $handle[0] ] = $handle[1];
+				}
 			}
 		}
 	}
@@ -360,6 +387,8 @@ class WP_Dependencies {
 
 				unset( $this->queue[ $key ] );
 				unset( $this->args[ $handle[0] ] );
+			} elseif ( array_key_exists( $handle[0], $this->queued_before_register ) ) {
+				unset( $this->queued_before_register[ $handle[0] ] );
 			}
 		}
 	}
diff --git a/src/wp-includes/class.wp-scripts.php b/src/wp-includes/class.wp-scripts.php
index 0f38a48618..10104d6dfa 100644
--- a/src/wp-includes/class.wp-scripts.php
+++ b/src/wp-includes/class.wp-scripts.php
@@ -125,7 +125,7 @@ class WP_Scripts extends WP_Dependencies {
 	/**
 	 * Holds a string which contains the type attribute for script tag.
 	 *
-	 * If the current theme does not declare HTML5 support for 'script',
+	 * If the active theme does not declare HTML5 support for 'script',
 	 * then it initializes as `type='text/javascript'`.
 	 *
 	 * @since 5.3.0
diff --git a/src/wp-includes/class.wp-styles.php b/src/wp-includes/class.wp-styles.php
index 62def4575c..91e14aeffc 100644
--- a/src/wp-includes/class.wp-styles.php
+++ b/src/wp-includes/class.wp-styles.php
@@ -103,7 +103,7 @@ class WP_Styles extends WP_Dependencies {
 	/**
 	 * Holds a string which contains the type attribute for style tag.
 	 *
-	 * If the current theme does not declare HTML5 support for 'style',
+	 * If the active theme does not declare HTML5 support for 'style',
 	 * then it initializes as `type='text/css'`.
 	 *
 	 * @since 5.3.0
diff --git a/src/wp-includes/comment-template.php b/src/wp-includes/comment-template.php
index 1415dd1e2f..5a1b2e22eb 100644
--- a/src/wp-includes/comment-template.php
+++ b/src/wp-includes/comment-template.php
@@ -42,7 +42,7 @@ function get_comment_author( $comment_ID = 0 ) {
 	 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added.
 	 *
 	 * @param string     $author     The comment author's username.
-	 * @param int        $comment_ID The comment ID.
+	 * @param string     $comment_ID The comment ID as a numeric string.
 	 * @param WP_Comment $comment    The comment object.
 	 */
 	return apply_filters( 'get_comment_author', $author, $comment->comment_ID, $comment );
@@ -68,7 +68,7 @@ function comment_author( $comment_ID = 0 ) {
 	 * @since 4.1.0 The `$comment_ID` parameter was added.
 	 *
 	 * @param string $author     The comment author's username.
-	 * @param int    $comment_ID The comment ID.
+	 * @param string $comment_ID The comment ID as a numeric string.
 	 */
 	echo apply_filters( 'comment_author', $author, $comment->comment_ID );
 }
@@ -93,7 +93,7 @@ function get_comment_author_email( $comment_ID = 0 ) {
 	 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added.
 	 *
 	 * @param string     $comment_author_email The comment author's email address.
-	 * @param int        $comment_ID           The comment ID.
+	 * @param string     $comment_ID           The comment ID as a numeric string.
 	 * @param WP_Comment $comment              The comment object.
 	 */
 	return apply_filters( 'get_comment_author_email', $comment->comment_author_email, $comment->comment_ID, $comment );
@@ -125,7 +125,7 @@ function comment_author_email( $comment_ID = 0 ) {
 	 * @since 4.1.0 The `$comment_ID` parameter was added.
 	 *
 	 * @param string $author_email The comment author's email address.
-	 * @param int    $comment_ID   The comment ID.
+	 * @param string $comment_ID   The comment ID as a numeric string.
 	 */
 	echo apply_filters( 'author_email', $author_email, $comment->comment_ID );
 }
@@ -236,7 +236,7 @@ function get_comment_author_link( $comment_ID = 0 ) {
 	 * @param string $return     The HTML-formatted comment author link.
 	 *                           Empty for an invalid URL.
 	 * @param string $author     The comment author's username.
-	 * @param int    $comment_ID The comment ID.
+	 * @param string $comment_ID The comment ID as a numeric string.
 	 */
 	return apply_filters( 'get_comment_author_link', $return, $author, $comment->comment_ID );
 }
@@ -274,7 +274,7 @@ function get_comment_author_IP( $comment_ID = 0 ) { // phpcs:ignore WordPress.Na
 	 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added.
 	 *
 	 * @param string     $comment_author_IP The comment author's IP address, or an empty string if it's not available.
-	 * @param int        $comment_ID        The comment ID.
+	 * @param string     $comment_ID        The comment ID as a numeric string.
 	 * @param WP_Comment $comment           The comment object.
 	 */
 	return apply_filters( 'get_comment_author_IP', $comment->comment_author_IP, $comment->comment_ID, $comment );  // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
@@ -320,9 +320,9 @@ function get_comment_author_url( $comment_ID = 0 ) {
 	 * @since 1.5.0
 	 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added.
 	 *
-	 * @param string     $url        The comment author's URL.
-	 * @param int        $comment_ID The comment ID.
-	 * @param WP_Comment $comment    The comment object.
+	 * @param string          $url        The comment author's URL, or an empty string.
+	 * @param string|int      $comment_ID The comment ID as a numeric string, or 0 if not found.
+	 * @param WP_Comment|null $comment    The comment object, or null if not found.
 	 */
 	return apply_filters( 'get_comment_author_url', $url, $id, $comment );
 }
@@ -347,7 +347,7 @@ function comment_author_url( $comment_ID = 0 ) {
 	 * @since 4.1.0 The `$comment_ID` parameter was added.
 	 *
 	 * @param string $author_url The comment author's URL.
-	 * @param int    $comment_ID The comment ID.
+	 * @param string $comment_ID The comment ID as a numeric string.
 	 */
 	echo apply_filters( 'comment_url', $author_url, $comment->comment_ID );
 }
@@ -531,7 +531,7 @@ function get_comment_class( $class = '', $comment_id = null, $post_id = null ) {
 	 *
 	 * @param string[]    $classes    An array of comment classes.
 	 * @param string[]    $class      An array of additional classes added to the list.
-	 * @param int         $comment_id The comment ID.
+	 * @param string      $comment_id The comment ID as a numeric string.
 	 * @param WP_Comment  $comment    The comment object.
 	 * @param int|WP_Post $post_id    The post ID or WP_Post object.
 	 */
@@ -624,7 +624,7 @@ function get_comment_excerpt( $comment_ID = 0 ) {
 	 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added.
 	 *
 	 * @param string     $excerpt    The comment excerpt text.
-	 * @param int        $comment_ID The comment ID.
+	 * @param string     $comment_ID The comment ID as a numeric string.
 	 * @param WP_Comment $comment    The comment object.
 	 */
 	return apply_filters( 'get_comment_excerpt', $excerpt, $comment->comment_ID, $comment );
@@ -650,7 +650,7 @@ function comment_excerpt( $comment_ID = 0 ) {
 	 * @since 4.1.0 The `$comment_ID` parameter was added.
 	 *
 	 * @param string $comment_excerpt The comment excerpt text.
-	 * @param int    $comment_ID      The comment ID.
+	 * @param string $comment_ID      The comment ID as a numeric string.
 	 */
 	echo apply_filters( 'comment_excerpt', $comment_excerpt, $comment->comment_ID );
 }
@@ -660,7 +660,7 @@ function comment_excerpt( $comment_ID = 0 ) {
  *
  * @since 1.5.0
  *
- * @return int The comment ID.
+ * @return string The comment ID as a numeric string.
  */
 function get_comment_ID() { // phpcs:ignore WordPress.NamingConventions.ValidFunctionName.FunctionNameInvalid
 	$comment = get_comment();
@@ -669,9 +669,9 @@ function get_comment_ID() { // phpcs:ignore WordPress.NamingConventions.ValidFun
 	 * Filters the returned comment ID.
 	 *
 	 * @since 1.5.0
-	 * @since 4.1.0 The `$comment_ID` parameter was added.
+	 * @since 4.1.0 The `$comment` parameter was added.
 	 *
-	 * @param int        $comment_ID The current comment ID.
+	 * @param string     $comment_ID The current comment ID as a numeric string.
 	 * @param WP_Comment $comment    The comment object.
 	 */
 	return apply_filters( 'get_comment_ID', $comment->comment_ID, $comment );  // phpcs:ignore WordPress.NamingConventions.ValidHookName.NotLowercase
@@ -1097,7 +1097,7 @@ function get_comment_type( $comment_ID = 0 ) {
 	 * @since 4.1.0 The `$comment_ID` and `$comment` parameters were added.
 	 *
 	 * @param string     $comment_type The type of comment, such as 'comment', 'pingback', or 'trackback'.
-	 * @param int        $comment_ID   The comment ID.
+	 * @param string     $comment_ID   The comment ID as a numeric string.
 	 * @param WP_Comment $comment      The comment object.
 	 */
 	return apply_filters( 'get_comment_type', $comment->comment_type, $comment->comment_ID, $comment );
@@ -1241,7 +1241,7 @@ function comments_open( $post_id = null ) {
 	$_post = get_post( $post_id );
 
 	$post_id = $_post ? $_post->ID : 0;
-	$open    = ( 'open' === $_post->comment_status );
+	$open    = ( $_post && ( 'open' === $_post->comment_status ) );
 
 	/**
 	 * Filters whether the current post is open for comments.
@@ -1271,7 +1271,7 @@ function pings_open( $post_id = null ) {
 	$_post = get_post( $post_id );
 
 	$post_id = $_post ? $_post->ID : 0;
-	$open    = ( 'open' === $_post->ping_status );
+	$open    = ( $_post && ( 'open' === $_post->ping_status ) );
 
 	/**
 	 * Filters whether the current post is open for pings.
@@ -1736,7 +1736,7 @@ function get_comment_reply_link( $args = array(), $comment = null, $post = null
 			'postid'         => $post->ID,
 			'belowelement'   => $args['add_below'] . '-' . $comment->comment_ID,
 			'respondelement' => $args['respond_id'],
-			'replyto'        => sprintf( $args['reply_to_text'], $comment->comment_author ),
+			'replyto'        => sprintf( $args['reply_to_text'], get_comment_author( $comment ) ),
 		);
 
 		$data_attribute_string = '';
@@ -1760,7 +1760,7 @@ function get_comment_reply_link( $args = array(), $comment = null, $post = null
 				)
 			) . '#' . $args['respond_id'],
 			$data_attribute_string,
-			esc_attr( sprintf( $args['reply_to_text'], $comment->comment_author ) ),
+			esc_attr( sprintf( $args['reply_to_text'], get_comment_author( $comment ) ) ),
 			$args['reply_text']
 		);
 	}
@@ -2425,7 +2425,7 @@ function comment_form( $args = array(), $post_id = null ) {
 
 	$required_text = sprintf(
 		/* translators: %s: Asterisk symbol (*). */
-		' <span class="comment-required-message" aria-hidden="true">' . __( 'Required fields are marked %s' ) . '</span>',
+		' <span class="required-field-message" aria-hidden="true">' . __( 'Required fields are marked %s' ) . '</span>',
 		trim( $required_indicator )
 	);
 
@@ -2538,11 +2538,13 @@ function comment_form( $args = array(), $post_id = null ) {
 
 		comment_form_title( $args['title_reply'], $args['title_reply_to'] );
 
-		echo $args['cancel_reply_before'];
+		if ( get_option( 'thread_comments' ) ) {
+			echo $args['cancel_reply_before'];
 
-		cancel_comment_reply_link( $args['cancel_reply_link'] );
+			cancel_comment_reply_link( $args['cancel_reply_link'] );
 
-		echo $args['cancel_reply_after'];
+			echo $args['cancel_reply_after'];
+		}
 
 		echo $args['title_reply_after'];
 
diff --git a/src/wp-includes/comment.php b/src/wp-includes/comment.php
index c2892f16b1..be1fda4e7f 100644
--- a/src/wp-includes/comment.php
+++ b/src/wp-includes/comment.php
@@ -366,7 +366,7 @@ function get_lastcommentmodified( $timezone = 'server' ) {
  *
  * @param int $post_id Optional. Restrict the comment counts to the given post. Default 0, which indicates that
  *                     comment counts for the whole site will be retrieved.
- * @return array() {
+ * @return int[] {
  *     The number of comments keyed by their status.
  *
  *     @type int $approved            The number of approved comments.
@@ -1488,7 +1488,7 @@ function wp_delete_comment( $comment_id, $force_delete = false ) {
 	 * @since 1.2.0
 	 * @since 4.9.0 Added the `$comment` parameter.
 	 *
-	 * @param int        $comment_id The comment ID.
+	 * @param string     $comment_id The comment ID as a numeric string.
 	 * @param WP_Comment $comment    The comment to be deleted.
 	 */
 	do_action( 'delete_comment', $comment->comment_ID, $comment );
@@ -1516,7 +1516,7 @@ function wp_delete_comment( $comment_id, $force_delete = false ) {
 	 * @since 2.9.0
 	 * @since 4.9.0 Added the `$comment` parameter.
 	 *
-	 * @param int        $comment_id The comment ID.
+	 * @param string     $comment_id The comment ID as a numeric string.
 	 * @param WP_Comment $comment    The deleted comment.
 	 */
 	do_action( 'deleted_comment', $comment->comment_ID, $comment );
@@ -1562,7 +1562,7 @@ function wp_trash_comment( $comment_id ) {
 	 * @since 2.9.0
 	 * @since 4.9.0 Added the `$comment` parameter.
 	 *
-	 * @param int        $comment_id The comment ID.
+	 * @param string     $comment_id The comment ID as a numeric string.
 	 * @param WP_Comment $comment    The comment to be trashed.
 	 */
 	do_action( 'trash_comment', $comment->comment_ID, $comment );
@@ -1579,7 +1579,7 @@ function wp_trash_comment( $comment_id ) {
 		 * @since 2.9.0
 		 * @since 4.9.0 Added the `$comment` parameter.
 		 *
-		 * @param int        $comment_id The comment ID.
+		 * @param string     $comment_id The comment ID as a numeric string.
 		 * @param WP_Comment $comment    The trashed comment.
 		 */
 		do_action( 'trashed_comment', $comment->comment_ID, $comment );
@@ -1610,7 +1610,7 @@ function wp_untrash_comment( $comment_id ) {
 	 * @since 2.9.0
 	 * @since 4.9.0 Added the `$comment` parameter.
 	 *
-	 * @param int        $comment_id The comment ID.
+	 * @param string     $comment_id The comment ID as a numeric string.
 	 * @param WP_Comment $comment    The comment to be untrashed.
 	 */
 	do_action( 'untrash_comment', $comment->comment_ID, $comment );
@@ -1630,7 +1630,7 @@ function wp_untrash_comment( $comment_id ) {
 		 * @since 2.9.0
 		 * @since 4.9.0 Added the `$comment` parameter.
 		 *
-		 * @param int        $comment_id The comment ID.
+		 * @param string     $comment_id The comment ID as a numeric string.
 		 * @param WP_Comment $comment    The untrashed comment.
 		 */
 		do_action( 'untrashed_comment', $comment->comment_ID, $comment );
@@ -1709,7 +1709,7 @@ function wp_unspam_comment( $comment_id ) {
 	 * @since 2.9.0
 	 * @since 4.9.0 Added the `$comment` parameter.
 	 *
-	 * @param int        $comment_id The comment ID.
+	 * @param string     $comment_id The comment ID as a numeric string.
 	 * @param WP_Comment $comment    The comment to be unmarked as spam.
 	 */
 	do_action( 'unspam_comment', $comment->comment_ID, $comment );
@@ -1729,7 +1729,7 @@ function wp_unspam_comment( $comment_id ) {
 		 * @since 2.9.0
 		 * @since 4.9.0 Added the `$comment` parameter.
 		 *
-		 * @param int        $comment_id The comment ID.
+		 * @param string     $comment_id The comment ID as a numeric string.
 		 * @param WP_Comment $comment    The comment unmarked as spam.
 		 */
 		do_action( 'unspammed_comment', $comment->comment_ID, $comment );
@@ -1863,7 +1863,7 @@ function wp_transition_comment_status( $new_status, $old_status, $comment ) {
 	 *
 	 * @since 2.7.0
 	 *
-	 * @param int        $comment_ID The comment ID.
+	 * @param string     $comment_ID The comment ID as a numeric string.
 	 * @param WP_Comment $comment    Comment object.
 	 */
 	do_action( "comment_{$new_status}_{$comment->comment_type}", $comment->comment_ID, $comment );
@@ -2433,7 +2433,7 @@ function wp_set_comment_status( $comment_id, $comment_status, $wp_error = false
 	 *
 	 * @since 1.5.0
 	 *
-	 * @param int    $comment_id     Comment ID.
+	 * @param string $comment_id     Comment ID as a numeric string.
 	 * @param string $comment_status Current comment status. Possible values include
 	 *                               'hold', '0', 'approve', '1', 'spam', and 'trash'.
 	 */
diff --git a/src/wp-includes/compat.php b/src/wp-includes/compat.php
index b95275455c..ac78f7f9a3 100644
--- a/src/wp-includes/compat.php
+++ b/src/wp-includes/compat.php
@@ -375,6 +375,109 @@ if ( ! function_exists( 'is_iterable' ) ) {
 	}
 }
 
+if ( ! function_exists( 'array_key_first' ) ) {
+	/**
+	 * Polyfill for array_key_first() function added in PHP 7.3.
+	 *
+	 * Get the first key of the given array without affecting
+	 * the internal array pointer.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array $arr An array.
+	 * @return string|int|null The first key of array if the array
+	 *                         is not empty; `null` otherwise.
+	 */
+	function array_key_first( array $arr ) {
+		foreach ( $arr as $key => $value ) {
+			return $key;
+		}
+	}
+}
+
+if ( ! function_exists( 'array_key_last' ) ) {
+	/**
+	 * Polyfill for `array_key_last()` function added in PHP 7.3.
+	 *
+	 * Get the last key of the given array without affecting the
+	 * internal array pointer.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array $arr An array.
+	 * @return string|int|null The last key of array if the array
+	 *.                        is not empty; `null` otherwise.
+	 */
+	function array_key_last( array $arr ) {
+		if ( empty( $arr ) ) {
+			return null;
+		}
+		end( $arr );
+		return key( $arr );
+	}
+}
+
+if ( ! function_exists( 'str_contains' ) ) {
+	/**
+	 * Polyfill for `str_contains()` function added in PHP 8.0.
+	 *
+	 * Performs a case-sensitive check indicating if needle is
+	 * contained in haystack.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param string $haystack The string to search in.
+	 * @param string $needle   The substring to search for in the haystack.
+	 * @return bool True if `$needle` is in `$haystack`, otherwise false.
+	 */
+	function str_contains( $haystack, $needle ) {
+		return ( '' === $needle || false !== strpos( $haystack, $needle ) );
+	}
+}
+
+if ( ! function_exists( 'str_starts_with' ) ) {
+	/**
+	 * Polyfill for `str_starts_with()` function added in PHP 8.0.
+	 *
+	 * Performs a case-sensitive check indicating if
+	 * the haystack begins with needle.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param string $haystack The string to search in.
+	 * @param string $needle   The substring to search for in the `$haystack`.
+	 * @return bool True if `$haystack` starts with `$needle`, otherwise false.
+	 */
+	function str_starts_with( $haystack, $needle ) {
+		if ( '' === $needle ) {
+			return true;
+		}
+		return 0 === strpos( $haystack, $needle );
+	}
+}
+
+if ( ! function_exists( 'str_ends_with' ) ) {
+	/**
+	 * Polyfill for `str_ends_with()` function added in PHP 8.0.
+	 *
+	 * Performs a case-sensitive check indicating if
+	 * the haystack ends with needle.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param string $haystack The string to search in.
+	 * @param string $needle   The substring to search for in the `$haystack`.
+	 * @return bool True if `$haystack` ends with `$needle`, otherwise false.
+	 */
+	function str_ends_with( $haystack, $needle ) {
+		if ( '' === $haystack && '' !== $needle ) {
+			return false;
+		}
+		$len = strlen( $needle );
+		return 0 === substr_compare( $haystack, $needle, -$len, $len );
+	}
+}
+
 // IMAGETYPE_WEBP constant is only defined in PHP 7.1 or later.
 if ( ! defined( 'IMAGETYPE_WEBP' ) ) {
 	define( 'IMAGETYPE_WEBP', 18 );
@@ -382,5 +485,5 @@ if ( ! defined( 'IMAGETYPE_WEBP' ) ) {
 
 // IMG_WEBP constant is only defined in PHP 7.0.10 or later.
 if ( ! defined( 'IMG_WEBP' ) ) {
-	define( 'IMG_WEBP', IMAGETYPE_WEBP ); // phpcs:ignore PHPCompatibility.Constants.NewConstants.imagetype_webpFound
+	define( 'IMG_WEBP', IMAGETYPE_WEBP );
 }
diff --git a/src/wp-includes/cron.php b/src/wp-includes/cron.php
index 8e50349f5d..83cbb8b9d0 100644
--- a/src/wp-includes/cron.php
+++ b/src/wp-includes/cron.php
@@ -1113,7 +1113,7 @@ function wp_get_schedule( $hook, $args = array() ) {
  *
  * @since 5.1.0
  *
- * @return array Cron jobs ready to be run.
+ * @return array[] Array of cron job arrays ready to be run.
  */
 function wp_get_ready_cron_jobs() {
 	/**
@@ -1124,8 +1124,8 @@ function wp_get_ready_cron_jobs() {
 	 *
 	 * @since 5.1.0
 	 *
-	 * @param null|array $pre Array of ready cron tasks to return instead. Default null
-	 *                        to continue using results from _get_cron_array().
+	 * @param null|array[] $pre Array of ready cron tasks to return instead. Default null
+	 *                          to continue using results from _get_cron_array().
 	 */
 	$pre = apply_filters( 'pre_get_ready_cron_jobs', null );
 	if ( null !== $pre ) {
@@ -1164,7 +1164,7 @@ function wp_get_ready_cron_jobs() {
  * @since 2.1.0
  * @access private
  *
- * @return array|false Cron info array on success, false on failure.
+ * @return array[]|false Array of cron info arrays on success, false on failure.
  */
 function _get_cron_array() {
 	$cron = get_option( 'cron' );
@@ -1190,8 +1190,8 @@ function _get_cron_array() {
  *
  * @access private
  *
- * @param array $cron     Cron info array from _get_cron_array().
- * @param bool  $wp_error Optional. Whether to return a WP_Error on failure. Default false.
+ * @param array[] $cron     Array of cron info arrays from _get_cron_array().
+ * @param bool    $wp_error Optional. Whether to return a WP_Error on failure. Default false.
  * @return bool|WP_Error True if cron array updated. False or WP_Error on failure.
  */
 function _set_cron_array( $cron, $wp_error = false ) {
diff --git a/src/wp-includes/css/admin-bar.css b/src/wp-includes/css/admin-bar.css
index 5720af7b41..32b952082a 100644
--- a/src/wp-includes/css/admin-bar.css
+++ b/src/wp-includes/css/admin-bar.css
@@ -1,5 +1,6 @@
 html {
 	--wp-admin--admin-bar--height: 32px;
+	scroll-padding-top: var(--wp-admin--admin-bar--height);
 }
 
 #wpadminbar * {
@@ -548,12 +549,16 @@ html:lang(he-il) .rtl #wpadminbar * {
 	top: 2px;
 }
 
+#wpadminbar #wp-admin-bar-site-editor > .ab-item:before {
+	content: "\f100";
+	top: 2px;
+}
+
 #wpadminbar #wp-admin-bar-customize > .ab-item:before {
 	content: "\f540";
 	top: 2px;
 }
 
-
 #wpadminbar #wp-admin-bar-edit > .ab-item:before {
 	content: "\f464";
 	top: 2px;
@@ -790,7 +795,17 @@ html:lang(he-il) .rtl #wpadminbar * {
 	}
 
 	#wpadminbar .ab-label {
-		display: none;
+		border: 0;
+		clip: rect(1px, 1px, 1px, 1px);
+		-webkit-clip-path: inset(50%);
+		clip-path: inset(50%);
+		height: 1px;
+		margin: -1px;
+		overflow: hidden;
+		padding: 0;
+		position: absolute;
+		width: 1px;
+		word-wrap: normal !important;
 	}
 
 	#wpadminbar .menupop li:hover > .ab-sub-wrapper,
@@ -842,6 +857,7 @@ html:lang(he-il) .rtl #wpadminbar * {
 	/* My Sites and "Site Title" menu */
 	#wpadminbar #wp-admin-bar-my-sites > .ab-item,
 	#wpadminbar #wp-admin-bar-site-name > .ab-item,
+	#wpadminbar #wp-admin-bar-site-editor > .ab-item,
 	#wpadminbar #wp-admin-bar-customize > .ab-item,
 	#wpadminbar #wp-admin-bar-edit > .ab-item,
 	#wpadminbar #wp-admin-bar-my-account > .ab-item {
@@ -864,6 +880,7 @@ html:lang(he-il) .rtl #wpadminbar * {
 	#wpadminbar #wp-admin-bar-edit > .ab-item:before,
 	#wpadminbar #wp-admin-bar-my-sites > .ab-item:before,
 	#wpadminbar #wp-admin-bar-site-name > .ab-item:before,
+	#wpadminbar #wp-admin-bar-site-editor > .ab-item:before,
 	#wpadminbar #wp-admin-bar-customize > .ab-item:before,
 	#wpadminbar #wp-admin-bar-my-account > .ab-item:before {
 		display: block;
@@ -978,6 +995,7 @@ html:lang(he-il) .rtl #wpadminbar * {
 	#wpadminbar li#wp-admin-bar-my-sites,
 	#wpadminbar li#wp-admin-bar-updates,
 	#wpadminbar li#wp-admin-bar-site-name,
+	#wpadminbar li#wp-admin-bar-site-editor,
 	#wpadminbar li#wp-admin-bar-customize,
 	#wpadminbar li#wp-admin-bar-new-content,
 	#wpadminbar li#wp-admin-bar-edit,
diff --git a/src/wp-includes/css/media-views.css b/src/wp-includes/css/media-views.css
index 02c32c4998..3bcfcd6bc0 100644
--- a/src/wp-includes/css/media-views.css
+++ b/src/wp-includes/css/media-views.css
@@ -1437,36 +1437,10 @@
 }
 
 .media-uploader-status .upload-dismiss-errors {
-	position: absolute;
-	top: -3px;
-	right: -5px;
-	padding: 5px;
-	border-radius: 50%;
 	transition: none;
 	text-decoration: none;
 }
 
-.uploader-inline .media-uploader-status .upload-dismiss-errors {
-	top: 2px;
-	right: 2px;
-}
-
-.media-uploader-status .upload-dismiss-errors::before {
-	content: "\f153";
-	display: block;
-	font: normal 16px/1 dashicons;
-	color: #787c82;
-}
-
-.uploader-inline .errors.media-uploader-status .upload-dismiss-errors::before {
-	color: #646970;
-}
-
-.errors.media-uploader-status .upload-dismiss-errors:hover::before,
-.errors.media-uploader-status .upload-dismiss-errors:focus::before {
-	color: #d63638;
-}
-
 .upload-errors .upload-error {
 	padding: 12px;
 	margin-bottom: 12px;
@@ -2140,7 +2114,7 @@
 .embed-link-settings,
 .embed-media-settings {
 	position: absolute;
-	top: 70px;
+	top: 82px;
 	left: 0;
 	right: 0;
 	bottom: 0;
@@ -2148,6 +2122,10 @@
 	overflow: auto;
 }
 
+.media-embed .embed-link-settings .link-text {
+	margin-top: 0;
+}
+
 /*
  * Implementation of bottom padding in overflow content differs across browsers.
  * We need a different method. See https://github.com/w3c/csswg-drafts/issues/129
diff --git a/src/wp-includes/customize/class-wp-customize-date-time-control.php b/src/wp-includes/customize/class-wp-customize-date-time-control.php
index 607799768c..55bf64dbe2 100644
--- a/src/wp-includes/customize/class-wp-customize-date-time-control.php
+++ b/src/wp-includes/customize/class-wp-customize-date-time-control.php
@@ -28,7 +28,7 @@ class WP_Customize_Date_Time_Control extends WP_Customize_Control {
 	 * Minimum Year.
 	 *
 	 * @since 4.9.0
-	 * @var integer
+	 * @var int
 	 */
 	public $min_year = 1000;
 
@@ -36,7 +36,7 @@ class WP_Customize_Date_Time_Control extends WP_Customize_Control {
 	 * Maximum Year.
 	 *
 	 * @since 4.9.0
-	 * @var integer
+	 * @var int
 	 */
 	public $max_year = 9999;
 
@@ -44,7 +44,7 @@ class WP_Customize_Date_Time_Control extends WP_Customize_Control {
 	 * Allow past date, if set to false user can only select future date.
 	 *
 	 * @since 4.9.0
-	 * @var boolean
+	 * @var bool
 	 */
 	public $allow_past_date = true;
 
@@ -52,7 +52,7 @@ class WP_Customize_Date_Time_Control extends WP_Customize_Control {
 	 * Whether hours, minutes, and meridian should be shown.
 	 *
 	 * @since 4.9.0
-	 * @var boolean
+	 * @var bool
 	 */
 	public $include_time = true;
 
@@ -61,7 +61,7 @@ class WP_Customize_Date_Time_Control extends WP_Customize_Control {
 	 * the value will still be saved in Y-m-d H:i:s format.
 	 *
 	 * @since 4.9.0
-	 * @var boolean
+	 * @var bool
 	 */
 	public $twelve_hour_format = true;
 
@@ -217,7 +217,7 @@ class WP_Customize_Date_Time_Control extends WP_Customize_Control {
 	 * @return array {
 	 *     Timezone info. All properties are optional.
 	 *
-	 *     @type string $abbr        Timezone abbreviation, eg. PST or CEST.
+	 *     @type string $abbr        Timezone abbreviation. Examples: PST or CEST.
 	 *     @type string $description Human-readable timezone description as HTML.
 	 * }
 	 */
diff --git a/src/wp-includes/customize/class-wp-customize-nav-menu-item-control.php b/src/wp-includes/customize/class-wp-customize-nav-menu-item-control.php
index b842cab15d..d6cae27b95 100644
--- a/src/wp-includes/customize/class-wp-customize-nav-menu-item-control.php
+++ b/src/wp-includes/customize/class-wp-customize-nav-menu-item-control.php
@@ -130,7 +130,7 @@ class WP_Customize_Nav_Menu_Item_Control extends WP_Customize_Control {
 				<label for="edit-menu-item-description-{{ data.menu_item_id }}">
 					<?php _e( 'Description' ); ?><br />
 					<textarea id="edit-menu-item-description-{{ data.menu_item_id }}" class="widefat edit-menu-item-description" rows="3" cols="20" name="menu-item-description">{{ data.description }}</textarea>
-					<span class="description"><?php _e( 'The description will be displayed in the menu if the current theme supports it.' ); ?></span>
+					<span class="description"><?php _e( 'The description will be displayed in the menu if the active theme supports it.' ); ?></span>
 				</label>
 			</p>
 
diff --git a/src/wp-includes/customize/class-wp-customize-nav-menu-setting.php b/src/wp-includes/customize/class-wp-customize-nav-menu-setting.php
index c3dc1e9eb5..f01906c818 100644
--- a/src/wp-includes/customize/class-wp-customize-nav-menu-setting.php
+++ b/src/wp-includes/customize/class-wp-customize-nav-menu-setting.php
@@ -595,7 +595,7 @@ class WP_Customize_Nav_Menu_Setting extends WP_Customize_Setting {
 	 * @param array $nav_menu_options Array as returned by get_option( 'nav_menu_options' ).
 	 * @param int   $menu_id          The term ID for the given menu.
 	 * @param bool  $auto_add         Whether to auto-add or not.
-	 * @return array (Maybe) modified nav_menu_otions array.
+	 * @return array (Maybe) modified nav_menu_options array.
 	 */
 	protected function filter_nav_menu_options_value( $nav_menu_options, $menu_id, $auto_add ) {
 		$nav_menu_options = (array) $nav_menu_options;
diff --git a/src/wp-includes/customize/class-wp-customize-nav-menus-panel.php b/src/wp-includes/customize/class-wp-customize-nav-menus-panel.php
index c0d098bc7d..18328e5d3f 100644
--- a/src/wp-includes/customize/class-wp-customize-nav-menus-panel.php
+++ b/src/wp-includes/customize/class-wp-customize-nav-menus-panel.php
@@ -98,4 +98,27 @@ class WP_Customize_Nav_Menus_Panel extends WP_Customize_Panel {
 		<li class="customize-control-title customize-section-title-nav_menus-heading"><?php _e( 'Menus' ); ?></li>
 		<?php
 	}
+
+	/**
+	 * Checks required user capabilities and whether the theme has the
+	 * feature support required by the panel.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @return bool False if theme doesn't support the panel or the user doesn't have the capability.
+	 */
+	public function check_capabilities() {
+		/*
+		 * WP_Customize_Panel::$theme_supports only supports checking one
+		 * theme_supports, so instead we override check_capabilities().
+		 */
+		if (
+			! current_theme_supports( 'menus' ) &&
+			! current_theme_supports( 'widgets' )
+		) {
+			return false;
+		}
+
+		return parent::check_capabilities();
+	}
 }
diff --git a/src/wp-includes/customize/class-wp-customize-theme-control.php b/src/wp-includes/customize/class-wp-customize-theme-control.php
index a0a705d545..20f867e462 100644
--- a/src/wp-includes/customize/class-wp-customize-theme-control.php
+++ b/src/wp-includes/customize/class-wp-customize-theme-control.php
@@ -242,17 +242,47 @@ class WP_Customize_Theme_Control extends WP_Customize_Control {
 				</div>
 				<div class="notice notice-success notice-alt"><p><?php _ex( 'Installed', 'theme' ); ?></p></div>
 			<# } else if ( 'installed' === data.theme.type ) { #>
-				<div class="theme-id-container">
-					<h3 class="theme-name" id="{{ data.section }}-{{ data.theme.id }}-name">{{ data.theme.name }}</h3>
-					<div class="theme-actions">
-						<# if ( data.theme.compatibleWP && data.theme.compatiblePHP ) { #>
-							<button type="button" class="button button-primary preview-theme" aria-label="<?php echo esc_attr( $preview_label ); ?>" data-slug="{{ data.theme.id }}"><?php _e( 'Live Preview' ); ?></button>
-						<# } else { #>
-							<button type="button" class="button button-primary disabled" aria-label="<?php echo esc_attr( $preview_label ); ?>"><?php _e( 'Live Preview' ); ?></button>
-						<# } #>
+				<# if ( data.theme.blockTheme ) { #>
+					<div class="theme-id-container">
+						<h3 class="theme-name" id="{{ data.section }}-{{ data.theme.id }}-name">{{ data.theme.name }}</h3>
+						<div class="theme-actions">
+							<# if ( data.theme.actions.activate ) { #>
+								<?php
+									/* translators: %s: Theme name. */
+									$aria_label = sprintf( _x( 'Activate %s', 'theme' ), '{{ data.name }}' );
+								?>
+								<a href="{{{ data.theme.actions.activate }}}" class="button button-primary activate" aria-label="<?php echo esc_attr( $aria_label ); ?>"><?php _e( 'Activate' ); ?></a>
+							<# } #>
+						</div>
 					</div>
-				</div>
-				<div class="notice notice-success notice-alt"><p><?php _ex( 'Installed', 'theme' ); ?></p></div>
+					<div class="notice notice-error notice-alt"><p>
+					<?php
+						_e( 'This theme doesn\'t support Customizer.' );
+					?>
+					<# if ( data.theme.actions.activate ) { #>
+						<?php
+							echo ' ';
+							printf(
+								/* translators: %s: URL to the themes page (also it activates the theme). */
+								__( 'However, you can still <a href="%s">activate this theme</a>, and use the Site Editor to customize it.' ),
+								'{{{ data.theme.actions.activate }}}'
+							);
+						?>
+					<# } #>
+					</p></div>
+				<# } else { #>
+					<div class="theme-id-container">
+						<h3 class="theme-name" id="{{ data.section }}-{{ data.theme.id }}-name">{{ data.theme.name }}</h3>
+						<div class="theme-actions">
+							<# if ( data.theme.compatibleWP && data.theme.compatiblePHP ) { #>
+								<button type="button" class="button button-primary preview-theme" aria-label="<?php echo esc_attr( $preview_label ); ?>" data-slug="{{ data.theme.id }}"><?php _e( 'Live Preview' ); ?></button>
+							<# } else { #>
+								<button type="button" class="button button-primary disabled" aria-label="<?php echo esc_attr( $preview_label ); ?>"><?php _e( 'Live Preview' ); ?></button>
+							<# } #>
+						</div>
+					</div>
+					<div class="notice notice-success notice-alt"><p><?php _ex( 'Installed', 'theme' ); ?></p></div>
+				<# } #>
 			<# } else { #>
 				<div class="theme-id-container">
 					<h3 class="theme-name" id="{{ data.section }}-{{ data.theme.id }}-name">{{ data.theme.name }}</h3>
diff --git a/src/wp-includes/customize/class-wp-customize-themes-panel.php b/src/wp-includes/customize/class-wp-customize-themes-panel.php
index ebc02401f4..054396e7f7 100644
--- a/src/wp-includes/customize/class-wp-customize-themes-panel.php
+++ b/src/wp-includes/customize/class-wp-customize-themes-panel.php
@@ -27,7 +27,7 @@ class WP_Customize_Themes_Panel extends WP_Customize_Panel {
 	/**
 	 * An Underscore (JS) template for rendering this panel's container.
 	 *
-	 * The themes panel renders a custom panel heading with the current theme and a switch themes button.
+	 * The themes panel renders a custom panel heading with the active theme and a switch themes button.
 	 *
 	 * @see WP_Customize_Panel::print_template()
 	 *
diff --git a/src/wp-includes/default-constants.php b/src/wp-includes/default-constants.php
index 21a855ad25..64baf0d20c 100644
--- a/src/wp-includes/default-constants.php
+++ b/src/wp-includes/default-constants.php
@@ -402,14 +402,14 @@ function wp_templating_constants() {
 	/**
 	 * Slug of the default theme for this installation.
 	 * Used as the default theme when installing new sites.
-	 * It will be used as the fallback if the current theme doesn't exist.
+	 * It will be used as the fallback if the active theme doesn't exist.
 	 *
 	 * @since 3.0.0
 	 *
 	 * @see WP_Theme::get_core_default_theme()
 	 */
 	if ( ! defined( 'WP_DEFAULT_THEME' ) ) {
-		define( 'WP_DEFAULT_THEME', 'twentytwentyone' );
+		define( 'WP_DEFAULT_THEME', 'twentytwentytwo' );
 	}
 
 }
diff --git a/src/wp-includes/default-filters.php b/src/wp-includes/default-filters.php
index a446eed1c2..20559dd179 100644
--- a/src/wp-includes/default-filters.php
+++ b/src/wp-includes/default-filters.php
@@ -332,10 +332,10 @@ add_action( 'wp_footer', 'wp_print_footer_scripts', 20 );
 add_action( 'template_redirect', 'wp_shortlink_header', 11, 0 );
 add_action( 'wp_print_footer_scripts', '_wp_footer_scripts' );
 add_action( 'init', '_register_core_block_patterns_and_categories' );
-add_action( 'current_screen', '_load_remote_block_patterns' );
 add_action( 'init', 'check_theme_switched', 99 );
 add_action( 'init', array( 'WP_Block_Supports', 'init' ), 22 );
 add_action( 'switch_theme', array( 'WP_Theme_JSON_Resolver', 'clean_cached_data' ) );
+add_action( 'start_previewing_theme', array( 'WP_Theme_JSON_Resolver', 'clean_cached_data' ) );
 add_action( 'after_switch_theme', '_wp_menus_changed' );
 add_action( 'after_switch_theme', '_wp_sidebars_changed' );
 add_action( 'wp_print_styles', 'print_emoji_styles' );
@@ -513,6 +513,7 @@ add_action( 'init', 'wp_sitemaps_get_server' );
  */
 // Theme.
 add_action( 'setup_theme', 'create_initial_theme_features', 0 );
+add_action( 'setup_theme', '_add_default_theme_supports', 1 );
 add_action( 'wp_loaded', '_custom_header_background_just_in_time' );
 add_action( 'wp_head', '_custom_logo_header_styles' );
 add_action( 'plugins_loaded', '_wp_customize_include' );
@@ -562,6 +563,7 @@ add_action( 'enqueue_block_editor_assets', 'wp_enqueue_registered_block_scripts_
 add_action( 'enqueue_block_editor_assets', 'enqueue_editor_block_styles_assets' );
 add_action( 'enqueue_block_editor_assets', 'wp_enqueue_editor_block_directory_assets' );
 add_action( 'enqueue_block_editor_assets', 'wp_enqueue_editor_format_library_assets' );
+add_action( 'enqueue_block_editor_assets', 'wp_enqueue_global_styles_css_custom_properties' );
 add_action( 'admin_print_scripts-index.php', 'wp_localize_community_events' );
 add_filter( 'wp_print_scripts', 'wp_just_in_time_script_localization' );
 add_filter( 'print_scripts_array', 'wp_prototype_before_jquery' );
@@ -580,6 +582,19 @@ add_action( 'wp_footer', 'wp_maybe_inline_styles', 1 ); // Run for late-loaded s
 
 add_action( 'admin_footer-post.php', 'wp_add_iframed_editor_assets_html' );
 add_action( 'admin_footer-post-new.php', 'wp_add_iframed_editor_assets_html' );
+add_action( 'admin_footer-widgets.php', 'wp_add_iframed_editor_assets_html' );
+add_action( 'admin_footer-site-editor.php', 'wp_add_iframed_editor_assets_html' );
+
+add_action( 'use_block_editor_for_post_type', '_disable_block_editor_for_navigation_post_type', 10, 2 );
+add_action( 'edit_form_after_title', '_disable_content_editor_for_navigation_post_type' );
+add_action( 'edit_form_after_editor', '_enable_content_editor_for_navigation_post_type' );
+
+/*
+ * Disable "Post Attributes" for wp_navigation post type. The attributes are
+ * also conditionally enabled when a site has custom templates. Block Theme
+ * templates can be available for every post type.
+ */
+add_filter( 'theme_wp_navigation_templates', '__return_empty_array' );
 
 // Taxonomy.
 add_action( 'init', 'create_initial_taxonomies', 0 ); // Highest priority.
@@ -625,7 +640,8 @@ add_action( 'rest_api_init', 'wp_oembed_register_route' );
 add_filter( 'rest_pre_serve_request', '_oembed_rest_pre_serve_request', 10, 4 );
 
 add_action( 'wp_head', 'wp_oembed_add_discovery_links' );
-add_action( 'wp_head', 'wp_oembed_add_host_js' );
+add_action( 'wp_head', 'wp_oembed_add_host_js' ); // Back-compat for sites disabling oEmbed host JS by removing action.
+add_filter( 'embed_oembed_html', 'wp_maybe_enqueue_oembed_host_js' );
 
 add_action( 'embed_head', 'enqueue_embed_scripts', 1 );
 add_action( 'embed_head', 'print_emoji_detection_script' );
@@ -660,10 +676,12 @@ add_filter( 'user_has_cap', 'wp_maybe_grant_install_languages_cap', 1 );
 add_filter( 'user_has_cap', 'wp_maybe_grant_resume_extensions_caps', 1 );
 add_filter( 'user_has_cap', 'wp_maybe_grant_site_health_caps', 1, 4 );
 
-// Block Templates CPT and Rendering
+// Block templates post type and rendering.
 add_filter( 'render_block_context', '_block_template_render_without_post_block_context' );
 add_filter( 'pre_wp_unique_post_slug', 'wp_filter_wp_template_unique_post_slug', 10, 5 );
+add_action( 'save_post_wp_template_part', 'wp_set_unique_slug_on_create_template_part' );
 add_action( 'wp_footer', 'the_block_template_skip_link' );
 add_action( 'setup_theme', 'wp_enable_block_templates' );
+add_action( 'wp_loaded', '_add_template_loader_filters' );
 
 unset( $filter, $action );
diff --git a/src/wp-includes/deprecated.php b/src/wp-includes/deprecated.php
index dcce1c1cea..7f29f9dcb6 100644
--- a/src/wp-includes/deprecated.php
+++ b/src/wp-includes/deprecated.php
@@ -3325,7 +3325,7 @@ function gd_edit_image_support($mime_type) {
 			case 'image/gif':
 				return (imagetypes() & IMG_GIF) != 0;
 			case 'image/webp':
-				return (imagetypes() & IMG_WEBP) != 0; // phpcs:ignore PHPCompatibility.Constants.NewConstants.img_webpFound
+				return (imagetypes() & IMG_WEBP) != 0;
 		}
 	} else {
 		switch( $mime_type ) {
diff --git a/src/wp-includes/embed.php b/src/wp-includes/embed.php
index c30c7bcd2e..7efee7107d 100644
--- a/src/wp-includes/embed.php
+++ b/src/wp-includes/embed.php
@@ -57,7 +57,7 @@ function wp_embed_unregister_handler( $id, $priority = 10 ) {
  * @global int $content_width
  *
  * @param string $url Optional. The URL that should be embedded. Default empty.
- * @return array {
+ * @return int[] {
  *     Indexed array of the embed width and height in pixels.
  *
  *     @type int $0 The embed width.
@@ -356,10 +356,44 @@ function wp_oembed_add_discovery_links() {
 /**
  * Adds the necessary JavaScript to communicate with the embedded iframes.
  *
+ * This function is no longer used directly. For back-compat it exists exclusively as a way to indicate that the oEmbed
+ * host JS _should_ be added. In `default-filters.php` there remains this code:
+ *
+ *     add_action( 'wp_head', 'wp_oembed_add_host_js' )
+ *
+ * Historically a site has been able to disable adding the oEmbed host script by doing:
+ *
+ *     remove_action( 'wp_head', 'wp_oembed_add_host_js' )
+ *
+ * In order to ensure that such code still works as expected, this function remains. There is now a `has_action()` check
+ * in `wp_maybe_enqueue_oembed_host_js()` to see if `wp_oembed_add_host_js()` has not been unhooked from running at the
+ * `wp_head` action.
+ *
  * @since 4.4.0
+ * @deprecated 5.9.0 Use {@see wp_maybe_enqueue_oembed_host_js()} instead.
+ */
+function wp_oembed_add_host_js() {}
+
+/**
+ * Enqueue the wp-embed script if the provided oEmbed HTML contains a post embed.
+ *
+ * In order to only enqueue the wp-embed script on pages that actually contain post embeds, this function checks if the
+ * provided HTML contains post embed markup and if so enqueues the script so that it will get printed in the footer.
+ *
+ * @since 5.9.0
+ *
+ * @param string $html Embed markup.
+ * @return string Embed markup (without modifications).
  */
-function wp_oembed_add_host_js() {
-	wp_enqueue_script( 'wp-embed' );
+function wp_maybe_enqueue_oembed_host_js( $html ) {
+	if (
+		has_action( 'wp_head', 'wp_oembed_add_host_js' )
+		&&
+		preg_match( '/<blockquote\s[^>]*?wp-embedded-content/', $html )
+	) {
+		wp_enqueue_script( 'wp-embed' );
+	}
+	return $html;
 }
 
 /**
@@ -450,32 +484,18 @@ function get_post_embed_html( $width, $height, $post = null ) {
 
 	$embed_url = get_post_embed_url( $post );
 
-	$output = '<blockquote class="wp-embedded-content"><a href="' . esc_url( get_permalink( $post ) ) . '">' . get_the_title( $post ) . "</a></blockquote>\n";
+	$secret     = wp_generate_password( 10, false );
+	$embed_url .= "#?secret={$secret}";
 
-	$output .= "<script type='text/javascript'>\n";
-	$output .= "<!--//--><![CDATA[//><!--\n";
-	if ( SCRIPT_DEBUG ) {
-		$output .= file_get_contents( ABSPATH . WPINC . '/js/wp-embed.js' );
-	} else {
-		/*
-		 * If you're looking at a src version of this file, you'll see an "include"
-		 * statement below. This is used by the `npm run build` process to directly
-		 * include a minified version of wp-embed.js, instead of using the
-		 * file_get_contents() method from above.
-		 *
-		 * If you're looking at a build version of this file, you'll see a string of
-		 * minified JavaScript. If you need to debug it, please turn on SCRIPT_DEBUG
-		 * and edit wp-embed.js directly.
-		 */
-		$output .= <<<JS
-		include "js/wp-embed.min.js"
-JS;
-	}
-	$output .= "\n//--><!]]>";
-	$output .= "\n</script>";
+	$output = sprintf(
+		'<blockquote class="wp-embedded-content" data-secret="%1$s"><a href="%2$s">%3$s</a></blockquote>',
+		esc_attr( $secret ),
+		esc_url( get_permalink( $post ) ),
+		get_the_title( $post )
+	);
 
 	$output .= sprintf(
-		'<iframe sandbox="allow-scripts" security="restricted" src="%1$s" width="%2$d" height="%3$d" title="%4$s" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" class="wp-embedded-content"></iframe>',
+		'<iframe sandbox="allow-scripts" security="restricted" src="%1$s" width="%2$d" height="%3$d" title="%4$s" data-secret="%5$s" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" class="wp-embedded-content"></iframe>',
 		esc_url( $embed_url ),
 		absint( $width ),
 		absint( $height ),
@@ -486,7 +506,17 @@ JS;
 				get_the_title( $post ),
 				get_bloginfo( 'name' )
 			)
-		)
+		),
+		esc_attr( $secret )
+	);
+
+	// Note that the script must be placed after the <blockquote> and <iframe> due to a regexp parsing issue in
+	// `wp_filter_oembed_result()`. Because of the regex pattern starts with `|(<blockquote>.*?</blockquote>)?.*|`
+	// wherein the <blockquote> is marked as being optional, if it is not at the beginning of the string then the group
+	// will fail to match and everything will be matched by `.*` and not included in the group. This regex issue goes
+	// back to WordPress 4.4, so in order to not break older installs this script must come at the end.
+	$output .= wp_get_inline_script_tag(
+		file_get_contents( ABSPATH . WPINC . '/js/wp-embed' . wp_scripts_get_suffix() . '.js' )
 	);
 
 	/**
@@ -1033,27 +1063,10 @@ function enqueue_embed_scripts() {
  */
 function print_embed_styles() {
 	$type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"';
+	$suffix    = SCRIPT_DEBUG ? '' : '.min';
 	?>
 	<style<?php echo $type_attr; ?>>
-	<?php
-	if ( SCRIPT_DEBUG ) {
-		readfile( ABSPATH . WPINC . '/css/wp-embed-template.css' );
-	} else {
-		/*
-		 * If you're looking at a src version of this file, you'll see an "include"
-		 * statement below. This is used by the `npm run build` process to directly
-		 * include a minified version of wp-oembed-embed.css, instead of using the
-		 * readfile() method from above.
-		 *
-		 * If you're looking at a build version of this file, you'll see a string of
-		 * minified CSS. If you need to debug it, please turn on SCRIPT_DEBUG
-		 * and edit wp-embed-template.css directly.
-		 */
-		?>
-			include "css/wp-embed-template.min.css"
-		<?php
-	}
-	?>
+		<?php echo file_get_contents( ABSPATH . WPINC . "/css/wp-embed-template$suffix.css" ); ?>
 	</style>
 	<?php
 }
@@ -1064,30 +1077,9 @@ function print_embed_styles() {
  * @since 4.4.0
  */
 function print_embed_scripts() {
-	$type_attr = current_theme_supports( 'html5', 'script' ) ? '' : ' type="text/javascript"';
-	?>
-	<script<?php echo $type_attr; ?>>
-	<?php
-	if ( SCRIPT_DEBUG ) {
-		readfile( ABSPATH . WPINC . '/js/wp-embed-template.js' );
-	} else {
-		/*
-		 * If you're looking at a src version of this file, you'll see an "include"
-		 * statement below. This is used by the `npm run build` process to directly
-		 * include a minified version of wp-embed-template.js, instead of using the
-		 * readfile() method from above.
-		 *
-		 * If you're looking at a build version of this file, you'll see a string of
-		 * minified JavaScript. If you need to debug it, please turn on SCRIPT_DEBUG
-		 * and edit wp-embed-template.js directly.
-		 */
-		?>
-			include "js/wp-embed-template.min.js"
-		<?php
-	}
-	?>
-	</script>
-	<?php
+	wp_print_inline_script_tag(
+		file_get_contents( ABSPATH . WPINC . '/js/wp-embed-template' . wp_scripts_get_suffix() . '.js' )
+	);
 }
 
 /**
diff --git a/src/wp-includes/feed-atom.php b/src/wp-includes/feed-atom.php
index 6388fa3e47..e9e3f49528 100644
--- a/src/wp-includes/feed-atom.php
+++ b/src/wp-includes/feed-atom.php
@@ -17,7 +17,6 @@ do_action( 'rss_tag_pre', 'atom' );
 	xmlns="http://www.w3.org/2005/Atom"
 	xmlns:thr="http://purl.org/syndication/thread/1.0"
 	xml:lang="<?php bloginfo_rss( 'language' ); ?>"
-	xml:base="<?php bloginfo_rss( 'url' ); ?>/wp-atom.php"
 	<?php
 	/**
 	 * Fires at end of the Atom feed root to add namespaces.
diff --git a/src/wp-includes/formatting.php b/src/wp-includes/formatting.php
index 2e71cda202..118c8a8249 100644
--- a/src/wp-includes/formatting.php
+++ b/src/wp-includes/formatting.php
@@ -1138,12 +1138,14 @@ function wp_check_invalid_utf8( $string, $strip = false ) {
  * Encode the Unicode values to be used in the URI.
  *
  * @since 1.5.0
+ * @since 5.8.3 Added the `encode_ascii_characters` parameter.
  *
- * @param string $utf8_string
- * @param int    $length Max  length of the string
+ * @param string $utf8_string             String to encode.
+ * @param int    $length                  Max length of the string
+ * @param bool   $encode_ascii_characters Whether to encode ascii characters such as < " '
  * @return string String with Unicode encoded for URI.
  */
-function utf8_uri_encode( $utf8_string, $length = 0 ) {
+function utf8_uri_encode( $utf8_string, $length = 0, $encode_ascii_characters = false ) {
 	$unicode        = '';
 	$values         = array();
 	$num_octets     = 1;
@@ -1158,11 +1160,14 @@ function utf8_uri_encode( $utf8_string, $length = 0 ) {
 		$value = ord( $utf8_string[ $i ] );
 
 		if ( $value < 128 ) {
-			if ( $length && ( $unicode_length >= $length ) ) {
+			$char                = chr( $value );
+			$encoded_char        = $encode_ascii_characters ? rawurlencode( $char ) : $char;
+			$encoded_char_length = strlen( $encoded_char );
+			if ( $length && ( $unicode_length + $encoded_char_length ) > $length ) {
 				break;
 			}
-			$unicode .= chr( $value );
-			$unicode_length++;
+			$unicode        .= $encoded_char;
+			$unicode_length += $encoded_char_length;
 		} else {
 			if ( count( $values ) == 0 ) {
 				if ( $value < 224 ) {
@@ -2132,23 +2137,26 @@ function sanitize_user( $username, $strict = false ) {
  *
  * @since 3.0.0
  *
- * @param string $key String key
- * @return string Sanitized key
+ * @param string $key String key.
+ * @return string Sanitized key.
  */
 function sanitize_key( $key ) {
-	$raw_key = $key;
-	$key     = strtolower( $key );
-	$key     = preg_replace( '/[^a-z0-9_\-]/', '', $key );
+	$sanitized_key = '';
+
+	if ( is_scalar( $key ) ) {
+		$sanitized_key = strtolower( $key );
+		$sanitized_key = preg_replace( '/[^a-z0-9_\-]/', '', $sanitized_key );
+	}
 
 	/**
 	 * Filters a sanitized key string.
 	 *
 	 * @since 3.0.0
 	 *
-	 * @param string $key     Sanitized key.
-	 * @param string $raw_key The key prior to sanitization.
+	 * @param string $sanitized_key Sanitized key.
+	 * @param string $key           The key prior to sanitization.
 	 */
-	return apply_filters( 'sanitize_key', $key, $raw_key );
+	return apply_filters( 'sanitize_key', $sanitized_key, $key );
 }
 
 /**
@@ -2514,9 +2522,9 @@ function force_balance_tags( $text ) {
 	$tagqueue  = '';
 	$newtext   = '';
 	// Known single-entity/self-closing tags.
-	$single_tags = array( 'area', 'base', 'basefont', 'br', 'col', 'command', 'embed', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param', 'source' );
+	$single_tags = array( 'area', 'base', 'basefont', 'br', 'col', 'command', 'embed', 'frame', 'hr', 'img', 'input', 'isindex', 'link', 'meta', 'param', 'source', 'track', 'wbr' );
 	// Tags that can be immediately nested within themselves.
-	$nestable_tags = array( 'blockquote', 'div', 'object', 'q', 'span' );
+	$nestable_tags = array( 'article', 'aside', 'blockquote', 'details', 'div', 'figure', 'object', 'q', 'section', 'span' );
 
 	// WP bug fix for comments - in case you REALLY meant to type '< !--'.
 	$text = str_replace( '< !--', '<    !--', $text );
@@ -2754,15 +2762,15 @@ function untrailingslashit( $string ) {
 }
 
 /**
- * Adds slashes to escape strings.
+ * Adds slashes to a string or recursively adds slashes to strings within an array.
  *
  * Slashes will first be removed if magic_quotes_gpc is set, see {@link
  * https://www.php.net/magic_quotes} for more details.
  *
  * @since 0.71
  *
- * @param string $gpc The string returned from HTTP request data.
- * @return string Returns a string escaped with slashes.
+ * @param string|array $gpc String or array of data to slash.
+ * @return string|array Slashed `$gpc`.
  */
 function addslashes_gpc( $gpc ) {
 	return wp_slash( $gpc );
@@ -4687,7 +4695,7 @@ function wp_make_link_relative( $link ) {
 }
 
 /**
- * Sanitises various option values based on the nature of the option.
+ * Sanitizes various option values based on the nature of the option.
  *
  * This is basically a switch statement which will pass $value through a number
  * of functions depending on the $option.
@@ -4704,7 +4712,7 @@ function sanitize_option( $option, $value ) {
 	global $wpdb;
 
 	$original_value = $value;
-	$error          = '';
+	$error          = null;
 
 	switch ( $option ) {
 		case 'admin_email':
@@ -4912,7 +4920,9 @@ function sanitize_option( $option, $value ) {
 				$value = str_replace( 'http://', '', $value );
 			}
 
-			if ( 'permalink_structure' === $option && '' !== $value && ! preg_match( '/%[^\/%]+%/', $value ) ) {
+			if ( 'permalink_structure' === $option && null === $error
+				&& '' !== $value && ! preg_match( '/%[^\/%]+%/', $value )
+			) {
 				$error = sprintf(
 					/* translators: %s: Documentation URL. */
 					__( 'A structure tag is required when using custom permalinks. <a href="%s">Learn more</a>' ),
@@ -4941,7 +4951,12 @@ function sanitize_option( $option, $value ) {
 			break;
 	}
 
-	if ( ! empty( $error ) ) {
+	if ( null !== $error ) {
+		if ( '' === $error && is_wp_error( $value ) ) {
+			/* translators: 1: Option name, 2: Error code. */
+			$error = sprintf( __( 'Could not sanitize the %1$s option. Error code: %2$s' ), $option, $value->get_error_code() );
+		}
+
 		$value = get_option( $option );
 		if ( function_exists( 'add_settings_error' ) ) {
 			add_settings_error( $option, "invalid_{$option}", $error );
@@ -5578,7 +5593,7 @@ function sanitize_trackback_urls( $to_ping ) {
  * @since 5.5.0 Non-string values are left untouched.
  *
  * @param string|array $value String or array of data to slash.
- * @return string|array Slashed $value.
+ * @return string|array Slashed `$value`.
  */
 function wp_slash( $value ) {
 	if ( is_array( $value ) ) {
@@ -5601,7 +5616,7 @@ function wp_slash( $value ) {
  * @since 3.6.0
  *
  * @param string|array $value String or array of data to unslash.
- * @return string|array Unslashed $value.
+ * @return string|array Unslashed `$value`.
  */
 function wp_unslash( $value ) {
 	return stripslashes_deep( $value );
@@ -5756,8 +5771,7 @@ function _print_emoji_detection_script() {
 		'svgExt'  => apply_filters( 'emoji_svg_ext', '.svg' ),
 	);
 
-	$version   = 'ver=' . get_bloginfo( 'version' );
-	$type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/javascript"';
+	$version = 'ver=' . get_bloginfo( 'version' );
 
 	if ( SCRIPT_DEBUG ) {
 		$settings['source'] = array(
@@ -5766,36 +5780,17 @@ function _print_emoji_detection_script() {
 			/** This filter is documented in wp-includes/class.wp-scripts.php */
 			'twemoji' => apply_filters( 'script_loader_src', includes_url( "js/twemoji.js?$version" ), 'twemoji' ),
 		);
-
-		?>
-		<script<?php echo $type_attr; ?>>
-			window._wpemojiSettings = <?php echo wp_json_encode( $settings ); ?>;
-			<?php readfile( ABSPATH . WPINC . '/js/wp-emoji-loader.js' ); ?>
-		</script>
-		<?php
 	} else {
 		$settings['source'] = array(
 			/** This filter is documented in wp-includes/class.wp-scripts.php */
 			'concatemoji' => apply_filters( 'script_loader_src', includes_url( "js/wp-emoji-release.min.js?$version" ), 'concatemoji' ),
 		);
-
-		/*
-		 * If you're looking at a src version of this file, you'll see an "include"
-		 * statement below. This is used by the `npm run build` process to directly
-		 * include a minified version of wp-emoji-loader.js, instead of using the
-		 * readfile() method from above.
-		 *
-		 * If you're looking at a build version of this file, you'll see a string of
-		 * minified JavaScript. If you need to debug it, please turn on SCRIPT_DEBUG
-		 * and edit wp-emoji-loader.js directly.
-		 */
-		?>
-		<script<?php echo $type_attr; ?>>
-			window._wpemojiSettings = <?php echo wp_json_encode( $settings ); ?>;
-			include "js/wp-emoji-loader.min.js"
-		</script>
-		<?php
 	}
+
+	wp_print_inline_script_tag(
+		sprintf( 'window._wpemojiSettings = %s;', wp_json_encode( $settings ) ) . "\n" .
+			file_get_contents( sprintf( ABSPATH . WPINC . '/js/wp-emoji-loader' . wp_scripts_get_suffix() . '.js' ) )
+	);
 }
 
 /**
diff --git a/src/wp-includes/functions.php b/src/wp-includes/functions.php
index 667049aa3f..24cfbb7b33 100644
--- a/src/wp-includes/functions.php
+++ b/src/wp-includes/functions.php
@@ -1169,6 +1169,7 @@ function add_query_arg( ...$args ) {
 	$ret = preg_replace( '#=(&|$)#', '$1', $ret );
 	$ret = $protocol . $base . $ret . $frag;
 	$ret = rtrim( $ret, '?' );
+	$ret = str_replace( '?#', '#', $ret );
 	return $ret;
 }
 
@@ -2139,7 +2140,7 @@ function wp_normalize_path( $path ) {
 		$wrapper .= '://';
 	}
 
-	// Standardise all paths to use '/'.
+	// Standardize all paths to use '/'.
 	$path = str_replace( '\\', '/', $path );
 
 	// Replace multiple slashes down to a singular, allowing for network shares having two slashes.
@@ -2537,8 +2538,10 @@ function wp_unique_filename( $dir, $filename, $unique_filename_callback = null )
 			$filename = str_replace( "{$fname}{$ext}", "{$fname}-{$number}{$ext}", $filename );
 		}
 
-		// Get the mime type. Uploaded files were already checked with wp_check_filetype_and_ext()
-		// in _wp_handle_upload(). Using wp_check_filetype() would be sufficient here.
+		/*
+		 * Get the mime type. Uploaded files were already checked with wp_check_filetype_and_ext()
+		 * in _wp_handle_upload(). Using wp_check_filetype() would be sufficient here.
+		 */
 		$file_type = wp_check_filetype( $filename );
 		$mime_type = $file_type['type'];
 
@@ -2549,27 +2552,40 @@ function wp_unique_filename( $dir, $filename, $unique_filename_callback = null )
 		$lc_ext = strtolower( $ext );
 		$_dir   = trailingslashit( $dir );
 
-		// If the extension is uppercase add an alternate file name with lowercase extension. Both need to be tested
-		// for uniqueness as the extension will be changed to lowercase for better compatibility with different filesystems.
-		// Fixes an inconsistency in WP < 2.9 where uppercase extensions were allowed but image sub-sizes were created with
-		// lowercase extensions.
+		/*
+		 * If the extension is uppercase add an alternate file name with lowercase extension.
+		 * Both need to be tested for uniqueness as the extension will be changed to lowercase
+		 * for better compatibility with different filesystems. Fixes an inconsistency in WP < 2.9
+		 * where uppercase extensions were allowed but image sub-sizes were created with
+		 * lowercase extensions.
+		 */
 		if ( $ext && $lc_ext !== $ext ) {
 			$lc_filename = preg_replace( '|' . preg_quote( $ext ) . '$|', $lc_ext, $filename );
 		}
 
-		// Increment the number added to the file name if there are any files in $dir whose names match one of the
-		// possible name variations.
+		/*
+		 * Increment the number added to the file name if there are any files in $dir
+		 * whose names match one of the possible name variations.
+		 */
 		while ( file_exists( $_dir . $filename ) || ( $lc_filename && file_exists( $_dir . $lc_filename ) ) ) {
 			$new_number = (int) $number + 1;
 
 			if ( $lc_filename ) {
-				$lc_filename = str_replace( array( "-{$number}{$lc_ext}", "{$number}{$lc_ext}" ), "-{$new_number}{$lc_ext}", $lc_filename );
+				$lc_filename = str_replace(
+					array( "-{$number}{$lc_ext}", "{$number}{$lc_ext}" ),
+					"-{$new_number}{$lc_ext}",
+					$lc_filename
+				);
 			}
 
 			if ( '' === "{$number}{$ext}" ) {
 				$filename = "{$filename}-{$new_number}";
 			} else {
-				$filename = str_replace( array( "-{$number}{$ext}", "{$number}{$ext}" ), "-{$new_number}{$ext}", $filename );
+				$filename = str_replace(
+					array( "-{$number}{$ext}", "{$number}{$ext}" ),
+					"-{$new_number}{$ext}",
+					$filename
+				);
 			}
 
 			$number = $new_number;
@@ -2580,8 +2596,10 @@ function wp_unique_filename( $dir, $filename, $unique_filename_callback = null )
 			$filename = $lc_filename;
 		}
 
-		// Prevent collisions with existing file names that contain dimension-like strings
-		// (whether they are subsizes or originals uploaded prior to #42437).
+		/*
+		 * Prevent collisions with existing file names that contain dimension-like strings
+		 * (whether they are subsizes or originals uploaded prior to #42437).
+		 */
 
 		$files = array();
 		$count = 10000;
@@ -2616,15 +2634,21 @@ function wp_unique_filename( $dir, $filename, $unique_filename_callback = null )
 			if ( ! empty( $files ) ) {
 				$count = count( $files );
 
-				// Ensure this never goes into infinite loop
-				// as it uses pathinfo() and regex in the check, but string replacement for the changes.
+				/*
+				 * Ensure this never goes into infinite loop as it uses pathinfo() and regex in the check,
+				 * but string replacement for the changes.
+				 */
 				$i = 0;
 
 				while ( $i <= $count && _wp_check_existing_file_names( $filename, $files ) ) {
 					$new_number = (int) $number + 1;
 
 					// If $ext is uppercase it was replaced with the lowercase version after the previous loop.
-					$filename = str_replace( array( "-{$number}{$lc_ext}", "{$number}{$lc_ext}" ), "-{$new_number}{$lc_ext}", $filename );
+					$filename = str_replace(
+						array( "-{$number}{$lc_ext}", "{$number}{$lc_ext}" ),
+						"-{$new_number}{$lc_ext}",
+						$filename
+					);
 
 					$number = $new_number;
 					$i++;
@@ -2632,8 +2656,10 @@ function wp_unique_filename( $dir, $filename, $unique_filename_callback = null )
 			}
 		}
 
-		// Check if an image will be converted after uploading or some existing images sub-sizes file names may conflict
-		// when regenerated. If yes, ensure the new file name will be unique and will produce unique sub-sizes.
+		/*
+		 * Check if an image will be converted after uploading or some existing image sub-size file names may conflict
+		 * when regenerated. If yes, ensure the new file name will be unique and will produce unique sub-sizes.
+		 */
 		if ( $is_image ) {
 			/** This filter is documented in wp-includes/class-wp-image-editor.php */
 			$output_formats = apply_filters( 'image_editor_output_format', array(), $_dir . $filename, $mime_type );
@@ -2667,8 +2693,10 @@ function wp_unique_filename( $dir, $filename, $unique_filename_callback = null )
 			}
 
 			if ( ! empty( $alt_filenames ) ) {
-				// Add the original filename. It needs to be checked again together with the alternate filenames
-				// when $number is incremented.
+				/*
+				 * Add the original filename. It needs to be checked again
+				 * together with the alternate filenames when $number is incremented.
+				 */
 				$alt_filenames[ $lc_ext ] = $filename;
 
 				// Ensure no infinite loop.
@@ -2678,12 +2706,22 @@ function wp_unique_filename( $dir, $filename, $unique_filename_callback = null )
 					$new_number = (int) $number + 1;
 
 					foreach ( $alt_filenames as $alt_ext => $alt_filename ) {
-						$alt_filenames[ $alt_ext ] = str_replace( array( "-{$number}{$alt_ext}", "{$number}{$alt_ext}" ), "-{$new_number}{$alt_ext}", $alt_filename );
+						$alt_filenames[ $alt_ext ] = str_replace(
+							array( "-{$number}{$alt_ext}", "{$number}{$alt_ext}" ),
+							"-{$new_number}{$alt_ext}",
+							$alt_filename
+						);
 					}
 
-					// Also update the $number in (the output) $filename.
-					// If the extension was uppercase it was already replaced with the lowercase version.
-					$filename = str_replace( array( "-{$number}{$lc_ext}", "{$number}{$lc_ext}" ), "-{$new_number}{$lc_ext}", $filename );
+					/*
+					 * Also update the $number in (the output) $filename.
+					 * If the extension was uppercase it was already replaced with the lowercase version.
+					 */
+					$filename = str_replace(
+						array( "-{$number}{$lc_ext}", "{$number}{$lc_ext}" ),
+						"-{$new_number}{$lc_ext}",
+						$filename
+					);
 
 					$number = $new_number;
 					$i++;
@@ -2699,7 +2737,7 @@ function wp_unique_filename( $dir, $filename, $unique_filename_callback = null )
 	 * @since 5.8.1 The `$alt_filenames` and `$number` parameters were added.
 	 *
 	 * @param string        $filename                 Unique file name.
-	 * @param string        $ext                      File extension, eg. ".png".
+	 * @param string        $ext                      File extension. Example: ".png".
 	 * @param string        $dir                      Directory path.
 	 * @param callable|null $unique_filename_callback Callback function that generates the unique file name.
 	 * @param string[]      $alt_filenames            Array of alternate file names that were checked for collisions.
@@ -3469,12 +3507,17 @@ function get_allowed_mime_types( $user = null ) {
  * @param string $action The nonce action.
  */
 function wp_nonce_ays( $action ) {
+	// Default title and response code.
+	$title         = __( 'Something went wrong.' );
+	$response_code = 403;
+
 	if ( 'log-out' === $action ) {
-		$html = sprintf(
+		$title = sprintf(
 			/* translators: %s: Site title. */
 			__( 'You are attempting to log out of %s' ),
 			get_bloginfo( 'name' )
 		);
+		$html        = $title;
 		$html       .= '</p><p>';
 		$redirect_to = isset( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
 		$html       .= sprintf(
@@ -3494,7 +3537,7 @@ function wp_nonce_ays( $action ) {
 		}
 	}
 
-	wp_die( $html, __( 'Something went wrong.' ), 403 );
+	wp_die( $html, $title, $response_code );
 }
 
 /**
@@ -5047,6 +5090,7 @@ function wp_filter_object_list( $list, $args = array(), $operator = 'and', $fiel
  *
  * @since 3.1.0
  * @since 4.7.0 Uses `WP_List_Util` class.
+ * @since 5.9.0 Converted into a wrapper for `wp_filter_object_list()`.
  *
  * @param array  $list     An array of objects to filter.
  * @param array  $args     Optional. An array of key => value arguments to match
@@ -5058,17 +5102,11 @@ function wp_filter_object_list( $list, $args = array(), $operator = 'and', $fiel
  * @return array Array of found values.
  */
 function wp_list_filter( $list, $args = array(), $operator = 'AND' ) {
-	if ( ! is_array( $list ) ) {
-		return array();
-	}
-
-	$util = new WP_List_Util( $list );
-
-	return $util->filter( $args, $operator );
+	return wp_filter_object_list( $list, $args, $operator );
 }
 
 /**
- * Pluck a certain field out of each object in a list.
+ * Plucks a certain field out of each object or array in an array.
  *
  * This has the same functionality and prototype of
  * array_column() (PHP 5.5) but also supports objects.
@@ -5092,7 +5130,7 @@ function wp_list_pluck( $list, $field, $index_key = null ) {
 }
 
 /**
- * Sorts a list of objects, based on one or more orderby arguments.
+ * Sorts an array of objects or arrays based on one or more orderby arguments.
  *
  * @since 4.7.0
  *
@@ -5270,7 +5308,7 @@ function _deprecated_function( $function, $version, $replacement = '' ) {
 				trigger_error(
 					sprintf(
 						/* translators: 1: PHP function name, 2: Version number, 3: Alternative function name. */
-						__( '%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.' ),
+						__( 'Function %1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.' ),
 						$function,
 						$version,
 						$replacement
@@ -5281,7 +5319,7 @@ function _deprecated_function( $function, $version, $replacement = '' ) {
 				trigger_error(
 					sprintf(
 						/* translators: 1: PHP function name, 2: Version number. */
-						__( '%1$s is <strong>deprecated</strong> since version %2$s with no alternative available.' ),
+						__( 'Function %1$s is <strong>deprecated</strong> since version %2$s with no alternative available.' ),
 						$function,
 						$version
 					),
@@ -5292,7 +5330,7 @@ function _deprecated_function( $function, $version, $replacement = '' ) {
 			if ( $replacement ) {
 				trigger_error(
 					sprintf(
-						'%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.',
+						'Function %1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.',
 						$function,
 						$version,
 						$replacement
@@ -5302,7 +5340,7 @@ function _deprecated_function( $function, $version, $replacement = '' ) {
 			} else {
 				trigger_error(
 					sprintf(
-						'%1$s is <strong>deprecated</strong> since version %2$s with no alternative available.',
+						'Function %1$s is <strong>deprecated</strong> since version %2$s with no alternative available.',
 						$function,
 						$version
 					),
@@ -5362,7 +5400,7 @@ function _deprecated_constructor( $class, $version, $parent_class = '' ) {
 				trigger_error(
 					sprintf(
 						/* translators: 1: PHP class name, 2: PHP parent class name, 3: Version number, 4: __construct() method. */
-						__( 'The called constructor method for %1$s in %2$s is <strong>deprecated</strong> since version %3$s! Use %4$s instead.' ),
+						__( 'The called constructor method for %1$s class in %2$s is <strong>deprecated</strong> since version %3$s! Use %4$s instead.' ),
 						$class,
 						$parent_class,
 						$version,
@@ -5374,7 +5412,7 @@ function _deprecated_constructor( $class, $version, $parent_class = '' ) {
 				trigger_error(
 					sprintf(
 						/* translators: 1: PHP class name, 2: Version number, 3: __construct() method. */
-						__( 'The called constructor method for %1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.' ),
+						__( 'The called constructor method for %1$s class is <strong>deprecated</strong> since version %2$s! Use %3$s instead.' ),
 						$class,
 						$version,
 						'<code>__construct()</code>'
@@ -5386,7 +5424,7 @@ function _deprecated_constructor( $class, $version, $parent_class = '' ) {
 			if ( $parent_class ) {
 				trigger_error(
 					sprintf(
-						'The called constructor method for %1$s in %2$s is <strong>deprecated</strong> since version %3$s! Use %4$s instead.',
+						'The called constructor method for %1$s class in %2$s is <strong>deprecated</strong> since version %3$s! Use %4$s instead.',
 						$class,
 						$parent_class,
 						$version,
@@ -5397,7 +5435,7 @@ function _deprecated_constructor( $class, $version, $parent_class = '' ) {
 			} else {
 				trigger_error(
 					sprintf(
-						'The called constructor method for %1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.',
+						'The called constructor method for %1$s class is <strong>deprecated</strong> since version %2$s! Use %3$s instead.',
 						$class,
 						$version,
 						'<code>__construct()</code>'
@@ -5460,7 +5498,7 @@ function _deprecated_file( $file, $version, $replacement = '', $message = '' ) {
 				trigger_error(
 					sprintf(
 						/* translators: 1: PHP file name, 2: Version number, 3: Alternative file name. */
-						__( '%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.' ),
+						__( 'File %1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.' ),
 						$file,
 						$version,
 						$replacement
@@ -5471,7 +5509,7 @@ function _deprecated_file( $file, $version, $replacement = '', $message = '' ) {
 				trigger_error(
 					sprintf(
 						/* translators: 1: PHP file name, 2: Version number. */
-						__( '%1$s is <strong>deprecated</strong> since version %2$s with no alternative available.' ),
+						__( 'File %1$s is <strong>deprecated</strong> since version %2$s with no alternative available.' ),
 						$file,
 						$version
 					) . $message,
@@ -5482,7 +5520,7 @@ function _deprecated_file( $file, $version, $replacement = '', $message = '' ) {
 			if ( $replacement ) {
 				trigger_error(
 					sprintf(
-						'%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.',
+						'File %1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.',
 						$file,
 						$version,
 						$replacement
@@ -5492,7 +5530,7 @@ function _deprecated_file( $file, $version, $replacement = '', $message = '' ) {
 			} else {
 				trigger_error(
 					sprintf(
-						'%1$s is <strong>deprecated</strong> since version %2$s with no alternative available.',
+						'File %1$s is <strong>deprecated</strong> since version %2$s with no alternative available.',
 						$file,
 						$version
 					) . $message,
@@ -5554,7 +5592,7 @@ function _deprecated_argument( $function, $version, $message = '' ) {
 				trigger_error(
 					sprintf(
 						/* translators: 1: PHP function name, 2: Version number, 3: Optional message regarding the change. */
-						__( '%1$s was called with an argument that is <strong>deprecated</strong> since version %2$s! %3$s' ),
+						__( 'Function %1$s was called with an argument that is <strong>deprecated</strong> since version %2$s! %3$s' ),
 						$function,
 						$version,
 						$message
@@ -5565,7 +5603,7 @@ function _deprecated_argument( $function, $version, $message = '' ) {
 				trigger_error(
 					sprintf(
 						/* translators: 1: PHP function name, 2: Version number. */
-						__( '%1$s was called with an argument that is <strong>deprecated</strong> since version %2$s with no alternative available.' ),
+						__( 'Function %1$s was called with an argument that is <strong>deprecated</strong> since version %2$s with no alternative available.' ),
 						$function,
 						$version
 					),
@@ -5576,7 +5614,7 @@ function _deprecated_argument( $function, $version, $message = '' ) {
 			if ( $message ) {
 				trigger_error(
 					sprintf(
-						'%1$s was called with an argument that is <strong>deprecated</strong> since version %2$s! %3$s',
+						'Function %1$s was called with an argument that is <strong>deprecated</strong> since version %2$s! %3$s',
 						$function,
 						$version,
 						$message
@@ -5586,7 +5624,7 @@ function _deprecated_argument( $function, $version, $message = '' ) {
 			} else {
 				trigger_error(
 					sprintf(
-						'%1$s was called with an argument that is <strong>deprecated</strong> since version %2$s with no alternative available.',
+						'Function %1$s was called with an argument that is <strong>deprecated</strong> since version %2$s with no alternative available.',
 						$function,
 						$version
 					),
@@ -5645,7 +5683,7 @@ function _deprecated_hook( $hook, $version, $replacement = '', $message = '' ) {
 			trigger_error(
 				sprintf(
 					/* translators: 1: WordPress hook name, 2: Version number, 3: Alternative hook name. */
-					__( '%1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.' ),
+					__( 'Hook %1$s is <strong>deprecated</strong> since version %2$s! Use %3$s instead.' ),
 					$hook,
 					$version,
 					$replacement
@@ -5656,7 +5694,7 @@ function _deprecated_hook( $hook, $version, $replacement = '', $message = '' ) {
 			trigger_error(
 				sprintf(
 					/* translators: 1: WordPress hook name, 2: Version number. */
-					__( '%1$s is <strong>deprecated</strong> since version %2$s with no alternative available.' ),
+					__( 'Hook %1$s is <strong>deprecated</strong> since version %2$s with no alternative available.' ),
 					$hook,
 					$version
 				) . $message,
@@ -5722,7 +5760,7 @@ function _doing_it_wrong( $function, $message, $version ) {
 			trigger_error(
 				sprintf(
 					/* translators: Developer debugging message. 1: PHP function name, 2: Explanatory message, 3: WordPress version number. */
-					__( '%1$s was called <strong>incorrectly</strong>. %2$s %3$s' ),
+					__( 'Function %1$s was called <strong>incorrectly</strong>. %2$s %3$s' ),
 					$function,
 					$message,
 					$version
@@ -5741,7 +5779,7 @@ function _doing_it_wrong( $function, $message, $version ) {
 
 			trigger_error(
 				sprintf(
-					'%1$s was called <strong>incorrectly</strong>. %2$s %3$s',
+					'Function %1$s was called <strong>incorrectly</strong>. %2$s %3$s',
 					$function,
 					$message,
 					$version
@@ -5862,7 +5900,7 @@ function validate_file( $file, $allowed_files = array() ) {
 		return 1;
 	}
 
-	// More than one occurence of `../` is not allowed:
+	// More than one occurrence of `../` is not allowed:
 	if ( preg_match_all( '#\.\./#', $file, $matches, PREG_SET_ORDER ) && ( count( $matches ) > 1 ) ) {
 		return 1;
 	}
@@ -6528,16 +6566,10 @@ function wp_scheduled_delete() {
  * @return string[] Array of file header values keyed by header name.
  */
 function get_file_data( $file, $default_headers, $context = '' ) {
-	// We don't need to write to the file, so just open for reading.
-	$fp = fopen( $file, 'r' );
+	// Pull only the first 8 KB of the file in.
+	$file_data = file_get_contents( $file, false, null, 0, 8 * KB_IN_BYTES );
 
-	if ( $fp ) {
-		// Pull only the first 8 KB of the file in.
-		$file_data = fread( $fp, 8 * KB_IN_BYTES );
-
-		// PHP will close file handle, but we are good citizens.
-		fclose( $fp );
-	} else {
+	if ( false === $file_data ) {
 		$file_data = '';
 	}
 
@@ -8133,13 +8165,13 @@ function get_dirsize( $directory, $max_execution_time = null ) {
  * @since 5.2.0 The `$max_execution_time` parameter was added.
  * @since 5.6.0 The `$directory_cache` parameter was added.
  *
- * @param string       $directory          Full path of a directory.
- * @param string|array $exclude            Optional. Full path of a subdirectory to exclude from the total,
- *                                         or array of paths. Expected without trailing slash(es).
- * @param int          $max_execution_time Optional. Maximum time to run before giving up. In seconds.
- *                                         The timeout is global and is measured from the moment
- *                                         WordPress started to load.
- * @param array        $directory_cache    Optional. Array of cached directory paths.
+ * @param string          $directory          Full path of a directory.
+ * @param string|string[] $exclude            Optional. Full path of a subdirectory to exclude from the total,
+ *                                            or array of paths. Expected without trailing slash(es).
+ * @param int             $max_execution_time Optional. Maximum time to run before giving up. In seconds.
+ *                                            The timeout is global and is measured from the moment
+ *                                            WordPress started to load.
+ * @param array           $directory_cache    Optional. Array of cached directory paths.
  *
  * @return int|false|null Size in bytes if a valid directory. False if not. Null if timeout.
  */
@@ -8190,7 +8222,12 @@ function recurse_dirsize( $directory, $exclude = null, $max_execution_time = nul
 	 *
 	 * @since 5.6.0
 	 *
-	 * @param int|false $space_used The amount of used space, in bytes. Default false.
+	 * @param int|false            $space_used         The amount of used space, in bytes. Default false.
+	 * @param string               $directory          Full path of a directory.
+	 * @param string|string[]|null $exclude            Full path of a subdirectory to exclude from the total,
+	 *                                                 or array of paths.
+	 * @param int                  $max_execution_time Maximum time to run before giving up. In seconds.
+	 * @param array                $directory_cache    Array of cached directory paths.
 	 */
 	$size = apply_filters( 'pre_recurse_dirsize', false, $directory, $exclude, $max_execution_time, $directory_cache );
 
@@ -8299,11 +8336,18 @@ function clean_dirsize_cache( $path ) {
  *
  * @since 5.2.0
  *
+ * @global string $wp_version WordPress version.
+ *
  * @param string $required Minimum required WordPress version.
  * @return bool True if required version is compatible or empty, false if not.
  */
 function is_wp_version_compatible( $required ) {
-	return empty( $required ) || version_compare( get_bloginfo( 'version' ), $required, '>=' );
+	global $wp_version;
+
+	// Strip off any -alpha, -RC, -beta, -src suffixes.
+	list( $version ) = explode( '-', $wp_version );
+
+	return empty( $required ) || version_compare( $version, $required, '>=' );
 }
 
 /**
diff --git a/src/wp-includes/functions.wp-styles.php b/src/wp-includes/functions.wp-styles.php
index d82bb55925..823d88ce7a 100644
--- a/src/wp-includes/functions.wp-styles.php
+++ b/src/wp-includes/functions.wp-styles.php
@@ -225,14 +225,18 @@ function wp_style_is( $handle, $list = 'enqueued' ) {
  * 'suffix'      string      Optional suffix, used in combination with RTL.
  * 'alt'         bool        For rel="alternate stylesheet".
  * 'title'       string      For preferred/alternate stylesheets.
+ * 'path'        string      The absolute path to a stylesheet. Stylesheet will
+ *                           load inline when 'path'' is set.
  *
  * @see WP_Dependencies::add_data()
  *
  * @since 3.6.0
+ * @since 5.8.0 Added 'path' as an official value for $key.
+ *              See {@see wp_maybe_inline_styles()}.
  *
  * @param string $handle Name of the stylesheet.
  * @param string $key    Name of data point for which we're storing a value.
- *                       Accepts 'conditional', 'rtl' and 'suffix', 'alt' and 'title'.
+ *                       Accepts 'conditional', 'rtl' and 'suffix', 'alt', 'title' and 'path'.
  * @param mixed  $value  String containing the CSS data to be added.
  * @return bool True on success, false on failure.
  */
diff --git a/src/wp-includes/general-template.php b/src/wp-includes/general-template.php
index 4a9835a478..92496ce92b 100644
--- a/src/wp-includes/general-template.php
+++ b/src/wp-includes/general-template.php
@@ -1376,9 +1376,11 @@ function wp_title( $sep = '&raquo;', $display = true, $seplocation = '' ) {
 	// If there's a month.
 	if ( is_archive() && ! empty( $m ) ) {
 		$my_year  = substr( $m, 0, 4 );
-		$my_month = $wp_locale->get_month( substr( $m, 4, 2 ) );
+		$my_month = substr( $m, 4, 2 );
 		$my_day   = (int) substr( $m, 6, 2 );
-		$title    = $my_year . ( $my_month ? $t_sep . $my_month : '' ) . ( $my_day ? $t_sep . $my_day : '' );
+		$title    = $my_year .
+			( $my_month ? $t_sep . $wp_locale->get_month( $my_month ) : '' ) .
+			( $my_day ? $t_sep . $my_day : '' );
 	}
 
 	// If there's a year.
@@ -3576,8 +3578,8 @@ function wp_enqueue_editor() {
  *
  *     @type string   $type       The MIME type of the file to be edited.
  *     @type string   $file       Filename to be edited. Extension is used to sniff the type. Can be supplied as alternative to `$type` param.
- *     @type WP_Theme $theme      Theme being edited when on theme editor.
- *     @type string   $plugin     Plugin being edited when on plugin editor.
+ *     @type WP_Theme $theme      Theme being edited when on the theme file editor.
+ *     @type string   $plugin     Plugin being edited when on the plugin file editor.
  *     @type array    $codemirror Additional CodeMirror setting overrides.
  *     @type array    $csslint    CSSLint rule overrides.
  *     @type array    $jshint     JSHint rule overrides.
@@ -3667,8 +3669,8 @@ function wp_enqueue_code_editor( $args ) {
  *
  *     @type string   $type       The MIME type of the file to be edited.
  *     @type string   $file       Filename to be edited. Extension is used to sniff the type. Can be supplied as alternative to `$type` param.
- *     @type WP_Theme $theme      Theme being edited when on theme editor.
- *     @type string   $plugin     Plugin being edited when on plugin editor.
+ *     @type WP_Theme $theme      Theme being edited when on the theme file editor.
+ *     @type string   $plugin     Plugin being edited when on the plugin file editor.
  *     @type array    $codemirror Additional CodeMirror setting overrides.
  *     @type array    $csslint    CSSLint rule overrides.
  *     @type array    $jshint     JSHint rule overrides.
@@ -4004,8 +4006,8 @@ function wp_get_code_editor_settings( $args ) {
 	 *
 	 *     @type string   $type       The MIME type of the file to be edited.
 	 *     @type string   $file       Filename being edited.
-	 *     @type WP_Theme $theme      Theme being edited when on theme editor.
-	 *     @type string   $plugin     Plugin being edited when on plugin editor.
+	 *     @type WP_Theme $theme      Theme being edited when on the theme file editor.
+	 *     @type string   $plugin     Plugin being edited when on the plugin file editor.
 	 *     @type array    $codemirror Additional CodeMirror setting overrides.
 	 *     @type array    $csslint    CSSLint rule overrides.
 	 *     @type array    $jshint     JSHint rule overrides.
diff --git a/src/wp-includes/global-styles-and-settings.php b/src/wp-includes/global-styles-and-settings.php
new file mode 100644
index 0000000000..0e382fe483
--- /dev/null
+++ b/src/wp-includes/global-styles-and-settings.php
@@ -0,0 +1,152 @@
+<?php
+/**
+ * APIs to interact with global settings & styles.
+ *
+ * @package WordPress
+ */
+
+/**
+ * Function to get the settings resulting of merging core, theme, and user data.
+ *
+ * @since 5.9.0
+ *
+ * @param array $path    Path to the specific setting to retrieve. Optional.
+ *                       If empty, will return all settings.
+ * @param array $context {
+ *     Metadata to know where to retrieve the $path from. Optional.
+ *
+ *     @type string $block_name Which block to retrieve the settings from.
+ *                              If empty, it'll return the settings for the global context.
+ *     @type string $origin     Which origin to take data from.
+ *                              Valid values are 'all' (core, theme, and user) or 'base' (core and theme).
+ *                              If empty or unknown, 'all' is used.
+ * }
+ *
+ * @return array The settings to retrieve.
+ */
+function wp_get_global_settings( $path = array(), $context = array() ) {
+	if ( ! empty( $context['block_name'] ) ) {
+		$path = array_merge( array( 'blocks', $context['block_name'] ), $path );
+	}
+
+	$origin = 'custom';
+	if ( isset( $context['origin'] ) && 'base' === $context['origin'] ) {
+		$origin = 'theme';
+	}
+
+	$settings = WP_Theme_JSON_Resolver::get_merged_data( $origin )->get_settings();
+
+	return _wp_array_get( $settings, $path, $settings );
+}
+
+/**
+ * Function to get the styles resulting of merging core, theme, and user data.
+ *
+ * @since 5.9.0
+ *
+ * @param array $path    Path to the specific style to retrieve. Optional.
+ *                       If empty, will return all styles.
+ * @param array $context {
+ *     Metadata to know where to retrieve the $path from. Optional.
+ *
+ *     @type string $block_name Which block to retrieve the styles from.
+ *                              If empty, it'll return the styles for the global context.
+ *     @type string $origin     Which origin to take data from.
+ *                              Valid values are 'all' (core, theme, and user) or 'base' (core and theme).
+ *                              If empty or unknown, 'all' is used.
+ * }
+ *
+ * @return array The styles to retrieve.
+ */
+function wp_get_global_styles( $path = array(), $context = array() ) {
+	if ( ! empty( $context['block_name'] ) ) {
+		$path = array_merge( array( 'blocks', $context['block_name'] ), $path );
+	}
+
+	$origin = 'custom';
+	if ( isset( $context['origin'] ) && 'base' === $context['origin'] ) {
+		$origin = 'theme';
+	}
+
+	$styles = WP_Theme_JSON_Resolver::get_merged_data( $origin )->get_raw_data()['styles'];
+
+	return _wp_array_get( $styles, $path, $styles );
+}
+
+/**
+ * Returns the stylesheet resulting of merging core, theme, and user data.
+ *
+ * @since 5.9.0
+ *
+ * @param array $types Types of styles to load. Optional.
+ *                     It accepts 'variables', 'styles', 'presets' as values.
+ *                     If empty, it'll load all for themes with theme.json support
+ *                     and only [ 'variables', 'presets' ] for themes without theme.json support.
+ *
+ * @return string Stylesheet.
+ */
+function wp_get_global_stylesheet( $types = array() ) {
+	// Return cached value if it can be used and exists.
+	// It's cached by theme to make sure that theme switching clears the cache.
+	$can_use_cached = (
+		( empty( $types ) ) &&
+		( ! defined( 'WP_DEBUG' ) || ! WP_DEBUG ) &&
+		( ! defined( 'SCRIPT_DEBUG' ) || ! SCRIPT_DEBUG ) &&
+		( ! defined( 'REST_REQUEST' ) || ! REST_REQUEST ) &&
+		! is_admin()
+	);
+	$transient_name = 'global_styles_' . get_stylesheet();
+	if ( $can_use_cached ) {
+		$cached = get_transient( $transient_name );
+		if ( $cached ) {
+			return $cached;
+		}
+	}
+
+	$tree = WP_Theme_JSON_Resolver::get_merged_data();
+
+	$supports_theme_json = WP_Theme_JSON_Resolver::theme_has_support();
+	if ( empty( $types ) && ! $supports_theme_json ) {
+		$types = array( 'variables', 'presets' );
+	} elseif ( empty( $types ) ) {
+		$types = array( 'variables', 'styles', 'presets' );
+	}
+
+	/*
+	 * If variables are part of the stylesheet,
+	 * we add them for all origins (default, theme, user).
+	 * This is so themes without a theme.json still work as before 5.9:
+	 * they can override the default presets.
+	 * See https://core.trac.wordpress.org/ticket/54782
+	 */
+	$styles_variables = '';
+	if ( in_array( 'variables', $types, true ) ) {
+		$styles_variables = $tree->get_stylesheet( array( 'variables' ) );
+		$types            = array_diff( $types, array( 'variables' ) );
+	}
+
+	/*
+	 * For the remaining types (presets, styles), we do consider origins:
+	 *
+	 * - themes without theme.json: only the classes for the presets defined by core
+	 * - themes with theme.json: the presets and styles classes, both from core and the theme
+	 */
+	$styles_rest = '';
+	if ( ! empty( $types ) ) {
+		$origins = array( 'default', 'theme', 'custom' );
+		if ( ! $supports_theme_json ) {
+			$origins = array( 'default' );
+		}
+		$styles_rest = $tree->get_stylesheet( $types, $origins );
+	}
+
+	$stylesheet = $styles_variables . $styles_rest;
+
+	if ( $can_use_cached ) {
+		// Cache for a minute.
+		// This cache doesn't need to be any longer, we only want to avoid spikes on high-traffic sites.
+		set_transient( $transient_name, $stylesheet, MINUTE_IN_SECONDS );
+	}
+
+	return $stylesheet;
+}
diff --git a/src/wp-includes/http.php b/src/wp-includes/http.php
index fba9dd3bba..c543956947 100644
--- a/src/wp-includes/http.php
+++ b/src/wp-includes/http.php
@@ -222,7 +222,8 @@ function wp_remote_retrieve_headers( $response ) {
  *
  * @param array|WP_Error $response HTTP response.
  * @param string         $header   Header name to retrieve value from.
- * @return string The header value. Empty string on if incorrect parameter given, or if the header doesn't exist.
+ * @return array|string The header(s) value(s). Array if multiple headers with the same name are retrieved.
+ *                      Empty string if incorrect parameter given, or if the header doesn't exist.
  */
 function wp_remote_retrieve_header( $response, $header ) {
 	if ( is_wp_error( $response ) || ! isset( $response['headers'] ) ) {
@@ -239,7 +240,7 @@ function wp_remote_retrieve_header( $response, $header ) {
 /**
  * Retrieve only the response code from the raw response.
  *
- * Will return an empty array if incorrect parameter value is given.
+ * Will return an empty string if incorrect parameter value is given.
  *
  * @since 2.7.0
  *
@@ -257,7 +258,7 @@ function wp_remote_retrieve_response_code( $response ) {
 /**
  * Retrieve only the response message from the raw response.
  *
- * Will return an empty array if incorrect parameter value is given.
+ * Will return an empty string if incorrect parameter value is given.
  *
  * @since 2.7.0
  *
@@ -514,6 +515,10 @@ function send_origin_headers() {
  * @return string|false URL or false on failure.
  */
 function wp_http_validate_url( $url ) {
+	if ( ! is_string( $url ) || '' === $url || is_numeric( $url ) ) {
+		return false;
+	}
+
 	$original_url = $url;
 	$url          = wp_kses_bad_protocol( $url, array( 'http', 'https' ) );
 	if ( ! $url || strtolower( $url ) !== strtolower( $original_url ) ) {
@@ -534,15 +539,10 @@ function wp_http_validate_url( $url ) {
 	}
 
 	$parsed_home = parse_url( get_option( 'home' ) );
-
-	if ( isset( $parsed_home['host'] ) ) {
-		$same_host = strtolower( $parsed_home['host'] ) === strtolower( $parsed_url['host'] );
-	} else {
-		$same_host = false;
-	}
+	$same_host   = isset( $parsed_home['host'] ) && strtolower( $parsed_home['host'] ) === strtolower( $parsed_url['host'] );
+	$host        = trim( $parsed_url['host'], '.' );
 
 	if ( ! $same_host ) {
-		$host = trim( $parsed_url['host'], '.' );
 		if ( preg_match( '#^(([1-9]?\d|1\d\d|25[0-5]|2[0-4]\d)\.){3}([1-9]?\d|1\d\d|25[0-5]|2[0-4]\d)$#', $host ) ) {
 			$ip = $host;
 		} else {
@@ -581,7 +581,20 @@ function wp_http_validate_url( $url ) {
 	}
 
 	$port = $parsed_url['port'];
-	if ( 80 === $port || 443 === $port || 8080 === $port ) {
+
+	/**
+	 * Controls the list of ports considered safe in HTTP API.
+	 *
+	 * Allows to change and allow external requests for the HTTP request.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array  $allowed_ports Array of integers for valid ports.
+	 * @param string $host          Host name of the requested URL.
+	 * @param string $url           Requested URL.
+	 */
+	$allowed_ports = apply_filters( 'http_allowed_safe_ports', array( 80, 443, 8080 ), $host, $url );
+	if ( is_array( $allowed_ports ) && in_array( $port, $allowed_ports, true ) ) {
 		return $url;
 	}
 
diff --git a/src/wp-includes/https-detection.php b/src/wp-includes/https-detection.php
index 485bffeb00..a8af655a5b 100644
--- a/src/wp-includes/https-detection.php
+++ b/src/wp-includes/https-detection.php
@@ -179,7 +179,7 @@ function wp_schedule_https_detection() {
  * @access private
  *
  * @param array $request The Cron request arguments.
- * @return array $request The filtered Cron request arguments.
+ * @return array The filtered Cron request arguments.
  */
 function wp_cron_conditionally_prevent_sslverify( $request ) {
 	if ( 'https' === wp_parse_url( $request['url'], PHP_URL_SCHEME ) ) {
diff --git a/src/wp-includes/kses.php b/src/wp-includes/kses.php
index 3a7f99dd1a..2a197e200b 100644
--- a/src/wp-includes/kses.php
+++ b/src/wp-includes/kses.php
@@ -272,7 +272,10 @@ if ( ! CUSTOM_TAGS ) {
 			'xml:lang' => true,
 		),
 		'object'     => array(
-			'data' => true,
+			'data' => array(
+				'required'       => true,
+				'value_callback' => '_wp_kses_allow_pdf_objects',
+			),
 			'type' => array(
 				'required' => true,
 				'values'   => array( 'application/pdf' ),
@@ -459,7 +462,7 @@ if ( ! CUSTOM_TAGS ) {
 	);
 
 	/**
-	 * @var string[] $allowedentitynames Array of KSES allowed HTML entitity names.
+	 * @var string[] $allowedentitynames Array of KSES allowed HTML entity names.
 	 * @since 1.0.0
 	 */
 	$allowedentitynames = array(
@@ -719,10 +722,10 @@ if ( ! CUSTOM_TAGS ) {
 	);
 
 	/**
-	 * @var string[] $allowedxmlentitynames Array of KSES allowed XML entitity names.
+	 * @var string[] $allowedxmlentitynames Array of KSES allowed XML entity names.
 	 * @since 5.5.0
 	 */
-	$allowedxmlnamedentities = array(
+	$allowedxmlentitynames = array(
 		'amp',
 		'lt',
 		'gt',
@@ -1137,12 +1140,22 @@ function wp_kses_split2( $string, $allowed_html, $allowed_protocols ) {
  * Removes all attributes, if none are allowed for this element.
  *
  * If some are allowed it calls `wp_kses_hair()` to split them further, and then
- * it builds up new HTML code from the data that `kses_hair()` returns. It also
+ * it builds up new HTML code from the data that `wp_kses_hair()` returns. It also
  * removes `<` and `>` characters, if there are any left. One more thing it does
  * is to check if the tag has a closing XHTML slash, and if it does, it puts one
  * in the returned code as well.
  *
+ * An array of allowed values can be defined for attributes. If the attribute value
+ * doesn't fall into the list, the attribute will be removed from the tag.
+ *
+ * Attributes can be marked as required. If a required attribute is not present,
+ * KSES will remove all attributes from the tag. As KSES doesn't match opening and
+ * closing tags, it's not possible to safely remove the tag itself, the safest
+ * fallback is to strip all attributes from the tag, instead.
+ *
  * @since 1.0.0
+ * @since 5.9.0 Added support for an array of allowed values for attributes.
+ *              Added support for required attributes.
  *
  * @param string         $element           HTML element/tag.
  * @param string         $attr              HTML attributes from HTML element to closing HTML element tag.
@@ -1180,16 +1193,17 @@ function wp_kses_attr( $element, $attr, $allowed_html, $allowed_protocols ) {
 		}
 	);
 
-	// If a required attribute check fails, we can return nothing for a self-closing tag,
-	// but for a non-self-closing tag the best option is to return the element with attributes,
-	// as KSES doesn't handle matching the relevant closing tag.
+	/*
+	 * If a required attribute check fails, we can return nothing for a self-closing tag,
+	 * but for a non-self-closing tag the best option is to return the element with attributes,
+	 * as KSES doesn't handle matching the relevant closing tag.
+	 */
 	$stripped_tag = '';
 	if ( empty( $xhtml_slash ) ) {
 		$stripped_tag = "<$element>";
 	}
 
-	// Go through $attrarr, and save the allowed attributes for this element
-	// in $attr2.
+	// Go through $attrarr, and save the allowed attributes for this element in $attr2.
 	$attr2 = '';
 	foreach ( $attrarr as $arreach ) {
 		// Check if this attribute is required.
@@ -1650,6 +1664,17 @@ function wp_kses_check_attr_val( $value, $vless, $checkname, $checkvalue ) {
 				$ok = false;
 			}
 			break;
+
+		case 'value_callback':
+			/*
+			 * The value_callback check is used when you want to make sure that the attribute
+			 * value is accepted by the callback function.
+			 */
+
+			if ( ! call_user_func( $checkvalue, $value ) ) {
+				$ok = false;
+			}
+			break;
 	} // End switch.
 
 	return $ok;
@@ -1900,13 +1925,13 @@ function wp_kses_named_entities( $matches ) {
  * @since 5.5.0
  *
  * @global array $allowedentitynames
- * @global array $allowedxmlnamedentities
+ * @global array $allowedxmlentitynames
  *
  * @param array $matches preg_replace_callback() matches array.
  * @return string Correctly encoded entity.
  */
 function wp_kses_xml_named_entities( $matches ) {
-	global $allowedentitynames, $allowedxmlnamedentities;
+	global $allowedentitynames, $allowedxmlentitynames;
 
 	if ( empty( $matches[1] ) ) {
 		return '';
@@ -1914,7 +1939,7 @@ function wp_kses_xml_named_entities( $matches ) {
 
 	$i = $matches[1];
 
-	if ( in_array( $i, $allowedxmlnamedentities, true ) ) {
+	if ( in_array( $i, $allowedxmlentitynames, true ) ) {
 		return "&$i;";
 	} elseif ( in_array( $i, $allowedentitynames, true ) ) {
 		return html_entity_decode( "&$i;", ENT_HTML5 );
@@ -2081,6 +2106,33 @@ function wp_filter_post_kses( $data ) {
 	return addslashes( wp_kses( stripslashes( $data ), 'post' ) );
 }
 
+/**
+ * Sanitizes global styles user content removing unsafe rules.
+ *
+ * @since 5.9.0
+ *
+ * @param string $data Post content to filter.
+ * @return string Filtered post content with unsafe rules removed.
+ */
+function wp_filter_global_styles_post( $data ) {
+	$decoded_data        = json_decode( wp_unslash( $data ), true );
+	$json_decoding_error = json_last_error();
+	if (
+		JSON_ERROR_NONE === $json_decoding_error &&
+		is_array( $decoded_data ) &&
+		isset( $decoded_data['isGlobalStylesUserThemeJSON'] ) &&
+		$decoded_data['isGlobalStylesUserThemeJSON']
+	) {
+		unset( $decoded_data['isGlobalStylesUserThemeJSON'] );
+
+		$data_to_encode = WP_Theme_JSON::remove_insecure_properties( $decoded_data );
+
+		$data_to_encode['isGlobalStylesUserThemeJSON'] = true;
+		return wp_slash( wp_json_encode( $data_to_encode ) );
+	}
+	return $data;
+}
+
 /**
  * Sanitizes content for allowed HTML tags for post content.
  *
@@ -2151,8 +2203,10 @@ function kses_init_filters() {
 
 	// Post filtering.
 	add_filter( 'content_save_pre', 'wp_filter_post_kses' );
+	add_filter( 'content_save_pre', 'wp_filter_global_styles_post' );
 	add_filter( 'excerpt_save_pre', 'wp_filter_post_kses' );
 	add_filter( 'content_filtered_save_pre', 'wp_filter_post_kses' );
+	add_filter( 'content_filtered_save_pre', 'wp_filter_global_styles_post' );
 }
 
 /**
@@ -2177,8 +2231,10 @@ function kses_remove_filters() {
 
 	// Post filtering.
 	remove_filter( 'content_save_pre', 'wp_filter_post_kses' );
+	remove_filter( 'content_save_pre', 'wp_filter_global_styles_post' );
 	remove_filter( 'excerpt_save_pre', 'wp_filter_post_kses' );
 	remove_filter( 'content_filtered_save_pre', 'wp_filter_post_kses' );
+	remove_filter( 'content_filtered_save_pre', 'wp_filter_global_styles_post' );
 }
 
 /**
@@ -2258,16 +2314,24 @@ function safecss_filter_attr( $css, $deprecated = '' ) {
 			'border-right-width',
 			'border-bottom',
 			'border-bottom-color',
+			'border-bottom-left-radius',
+			'border-bottom-right-radius',
 			'border-bottom-style',
 			'border-bottom-width',
+			'border-bottom-right-radius',
+			'border-bottom-left-radius',
 			'border-left',
 			'border-left-color',
 			'border-left-style',
 			'border-left-width',
 			'border-top',
 			'border-top-color',
+			'border-top-left-radius',
+			'border-top-right-radius',
 			'border-top-style',
 			'border-top-width',
+			'border-top-left-radius',
+			'border-top-right-radius',
 
 			'border-spacing',
 			'border-collapse',
@@ -2282,6 +2346,7 @@ function safecss_filter_attr( $css, $deprecated = '' ) {
 			'column-width',
 
 			'color',
+			'filter',
 			'font',
 			'font-family',
 			'font-size',
@@ -2515,3 +2580,39 @@ function _wp_add_global_attributes( $value ) {
 
 	return $value;
 }
+
+/**
+ * Helper function to check if this is a safe PDF URL.
+ *
+ * @since 5.9.0
+ * @access private
+ * @ignore
+ *
+ * @param string $url The URL to check.
+ * @return bool True if the URL is safe, false otherwise.
+ */
+function _wp_kses_allow_pdf_objects( $url ) {
+	// We're not interested in URLs that contain query strings or fragments.
+	if ( str_contains( $url, '?' ) || str_contains( $url, '#' ) ) {
+		return false;
+	}
+
+	// If it doesn't have a PDF extension, it's not safe.
+	if ( ! str_ends_with( $url, '.pdf' ) ) {
+		return false;
+	}
+
+	// If the URL host matches the current site's media URL, it's safe.
+	$upload_info = wp_upload_dir( null, false );
+	$parsed_url  = wp_parse_url( $upload_info['url'] );
+	$upload_host = isset( $parsed_url['host'] ) ? $parsed_url['host'] : '';
+	$upload_port = isset( $parsed_url['port'] ) ? ':' . $parsed_url['port'] : '';
+
+	if ( str_starts_with( $url, "http://$upload_host$upload_port/" )
+		|| str_starts_with( $url, "https://$upload_host$upload_port/" )
+	) {
+		return true;
+	}
+
+	return false;
+}
diff --git a/src/wp-includes/l10n.php b/src/wp-includes/l10n.php
index 8347c226fa..794932a41f 100644
--- a/src/wp-includes/l10n.php
+++ b/src/wp-includes/l10n.php
@@ -144,8 +144,16 @@ function determine_locale() {
 		$determined_locale = get_user_locale();
 	}
 
-	if ( ! empty( $_GET['wp_lang'] ) && ! empty( $GLOBALS['pagenow'] ) && 'wp-login.php' === $GLOBALS['pagenow'] ) {
-		$determined_locale = sanitize_text_field( $_GET['wp_lang'] );
+	$wp_lang = '';
+
+	if ( ! empty( $_GET['wp_lang'] ) ) {
+		$wp_lang = sanitize_text_field( $_GET['wp_lang'] );
+	} elseif ( ! empty( $_COOKIE['wp_lang'] ) ) {
+		$wp_lang = sanitize_text_field( $_COOKIE['wp_lang'] );
+	}
+
+	if ( ! empty( $wp_lang ) && ! empty( $GLOBALS['pagenow'] ) && 'wp-login.php' === $GLOBALS['pagenow'] ) {
+		$determined_locale = $wp_lang;
 	}
 
 	/**
@@ -624,13 +632,13 @@ function _n_noop( $singular, $plural, $domain = null ) {
  * @return array {
  *     Array of translation information for the strings.
  *
- *     @type string $0        Singular form to be localized. No longer used.
- *     @type string $1        Plural form to be localized. No longer used.
- *     @type string $2        Context information for the translators. No longer used.
- *     @type string $singular Singular form to be localized.
- *     @type string $plural   Plural form to be localized.
- *     @type string $context  Context information for the translators.
- *     @type string $domain   Text domain.
+ *     @type string      $0        Singular form to be localized. No longer used.
+ *     @type string      $1        Plural form to be localized. No longer used.
+ *     @type string      $2        Context information for the translators. No longer used.
+ *     @type string      $singular Singular form to be localized.
+ *     @type string      $plural   Plural form to be localized.
+ *     @type string      $context  Context information for the translators.
+ *     @type string|null $domain   Text domain.
  * }
  */
 function _nx_noop( $singular, $plural, $context, $domain = null ) {
@@ -1480,6 +1488,7 @@ function wp_get_pomo_file_data( $po_file ) {
  * @since 4.3.0 Introduced the `echo` argument.
  * @since 4.7.0 Introduced the `show_option_site_default` argument.
  * @since 5.1.0 Introduced the `show_option_en_us` argument.
+ * @since 5.9.0 Introduced the `explicit_option_en_us` argument.
  *
  * @see get_available_languages()
  * @see wp_get_available_translations()
@@ -1499,6 +1508,8 @@ function wp_get_pomo_file_data( $po_file ) {
  *     @type bool     $show_available_translations  Whether to show available translations. Default true.
  *     @type bool     $show_option_site_default     Whether to show an option to fall back to the site's locale. Default false.
  *     @type bool     $show_option_en_us            Whether to show an option for English (United States). Default true.
+ *     @type bool     $explicit_option_en_us        Whether the English (United States) option uses an explicit value of en_US
+ *                                                  instead of an empty value. Default false.
  * }
  * @return string HTML dropdown list of languages.
  */
@@ -1516,6 +1527,7 @@ function wp_dropdown_languages( $args = array() ) {
 			'show_available_translations' => true,
 			'show_option_site_default'    => false,
 			'show_option_en_us'           => true,
+			'explicit_option_en_us'       => false,
 		)
 	);
 
@@ -1525,7 +1537,7 @@ function wp_dropdown_languages( $args = array() ) {
 	}
 
 	// English (United States) uses an empty string for the value attribute.
-	if ( 'en_US' === $parsed_args['selected'] ) {
+	if ( 'en_US' === $parsed_args['selected'] && ! $parsed_args['explicit_option_en_us'] ) {
 		$parsed_args['selected'] = '';
 	}
 
@@ -1580,8 +1592,10 @@ function wp_dropdown_languages( $args = array() ) {
 	}
 
 	if ( $parsed_args['show_option_en_us'] ) {
+		$value       = ( $parsed_args['explicit_option_en_us'] ) ? 'en_US' : '';
 		$structure[] = sprintf(
-			'<option value="" lang="en" data-installed="1"%s>English (United States)</option>',
+			'<option value="%s" lang="en" data-installed="1"%s>English (United States)</option>',
+			esc_attr( $value ),
 			selected( '', $parsed_args['selected'], false )
 		);
 	}
diff --git a/src/wp-includes/link-template.php b/src/wp-includes/link-template.php
index 31ffcf0a3c..b1ae4e2a35 100644
--- a/src/wp-includes/link-template.php
+++ b/src/wp-includes/link-template.php
@@ -904,13 +904,13 @@ function get_author_feed_link( $author_id, $feed = '' ) {
  *
  * @since 2.5.0
  *
- * @param int    $cat_id Category ID.
- * @param string $feed   Optional. Feed type. Possible values include 'rss2', 'atom'.
- *                       Default is the value of get_default_feed().
+ * @param int|WP_Term|object $cat  The ID or term object whose feed link will be retrieved.
+ * @param string             $feed Optional. Feed type. Possible values include 'rss2', 'atom'.
+ *                                 Default is the value of get_default_feed().
  * @return string Link to the feed for the category specified by $cat_id.
  */
-function get_category_feed_link( $cat_id, $feed = '' ) {
-	return get_term_feed_link( $cat_id, 'category', $feed );
+function get_category_feed_link( $cat, $feed = '' ) {
+	return get_term_feed_link( $cat, 'category', $feed );
 }
 
 /**
@@ -921,21 +921,25 @@ function get_category_feed_link( $cat_id, $feed = '' ) {
  *
  * @since 3.0.0
  *
- * @param int    $term_id  Term ID.
- * @param string $taxonomy Optional. Taxonomy of `$term_id`. Default 'category'.
- * @param string $feed     Optional. Feed type. Possible values include 'rss2', 'atom'.
- *                         Default is the value of get_default_feed().
+ * @param int|WP_Term|object $term     The ID or term object whose feed link will be retrieved.
+ * @param string             $taxonomy Optional. Taxonomy of `$term_id`.
+ * @param string             $feed     Optional. Feed type. Possible values include 'rss2', 'atom'.
+ *                                     Default is the value of get_default_feed().
  * @return string|false Link to the feed for the term specified by $term_id and $taxonomy.
  */
-function get_term_feed_link( $term_id, $taxonomy = 'category', $feed = '' ) {
-	$term_id = (int) $term_id;
+function get_term_feed_link( $term, $taxonomy = '', $feed = '' ) {
+	if ( ! is_object( $term ) ) {
+		$term = (int) $term;
+	}
 
-	$term = get_term( $term_id, $taxonomy );
+	$term = get_term( $term, $taxonomy );
 
 	if ( empty( $term ) || is_wp_error( $term ) ) {
 		return false;
 	}
 
+	$taxonomy = $term->taxonomy;
+
 	if ( empty( $feed ) ) {
 		$feed = get_default_feed();
 	}
@@ -944,7 +948,7 @@ function get_term_feed_link( $term_id, $taxonomy = 'category', $feed = '' ) {
 
 	if ( ! $permalink_structure ) {
 		if ( 'category' === $taxonomy ) {
-			$link = home_url( "?feed=$feed&amp;cat=$term_id" );
+			$link = home_url( "?feed=$feed&amp;cat=$term->term_id" );
 		} elseif ( 'post_tag' === $taxonomy ) {
 			$link = home_url( "?feed=$feed&amp;tag=$term->slug" );
 		} else {
@@ -952,7 +956,7 @@ function get_term_feed_link( $term_id, $taxonomy = 'category', $feed = '' ) {
 			$link = home_url( "?feed=$feed&amp;$t->query_var=$term->slug" );
 		}
 	} else {
-		$link = get_term_link( $term_id, $term->taxonomy );
+		$link = get_term_link( $term, $term->taxonomy );
 		if ( get_default_feed() == $feed ) {
 			$feed_link = 'feed';
 		} else {
@@ -1003,13 +1007,13 @@ function get_term_feed_link( $term_id, $taxonomy = 'category', $feed = '' ) {
  *
  * @since 2.3.0
  *
- * @param int    $tag_id Tag ID.
- * @param string $feed   Optional. Feed type. Possible values include 'rss2', 'atom'.
- *                       Default is the value of get_default_feed().
- * @return string The feed permalink for the given tag.
+ * @param int|WP_Term|object $tag  The ID or term object whose feed link will be retrieved.
+ * @param string             $feed Optional. Feed type. Possible values include 'rss2', 'atom'.
+ *                                 Default is the value of get_default_feed().
+ * @return string                  The feed permalink for the given tag.
  */
-function get_tag_feed_link( $tag_id, $feed = '' ) {
-	return get_term_feed_link( $tag_id, 'post_tag', $feed );
+function get_tag_feed_link( $tag, $feed = '' ) {
+	return get_term_feed_link( $tag, 'post_tag', $feed );
 }
 
 /**
@@ -1017,11 +1021,11 @@ function get_tag_feed_link( $tag_id, $feed = '' ) {
  *
  * @since 2.7.0
  *
- * @param int    $tag_id   Tag ID.
- * @param string $taxonomy Optional. Taxonomy slug. Default 'post_tag'.
+ * @param int|WP_Term|object $tag      The ID or term object whose edit link will be retrieved.
+ * @param string             $taxonomy Optional. Taxonomy slug. Default 'post_tag'.
  * @return string The edit tag link URL for the given tag.
  */
-function get_edit_tag_link( $tag_id, $taxonomy = 'post_tag' ) {
+function get_edit_tag_link( $tag, $taxonomy = 'post_tag' ) {
 	/**
 	 * Filters the edit link for a tag (or term in another taxonomy).
 	 *
@@ -1029,7 +1033,7 @@ function get_edit_tag_link( $tag_id, $taxonomy = 'post_tag' ) {
 	 *
 	 * @param string $link The term edit link.
 	 */
-	return apply_filters( 'get_edit_tag_link', get_edit_term_link( $tag_id, $taxonomy ) );
+	return apply_filters( 'get_edit_tag_link', get_edit_term_link( $tag, $taxonomy ) );
 }
 
 /**
@@ -1062,28 +1066,29 @@ function edit_tag_link( $link = '', $before = '', $after = '', $tag = null ) {
  * @since 3.1.0
  * @since 4.5.0 The `$taxonomy` parameter was made optional.
  *
- * @param int    $term_id     Term ID.
- * @param string $taxonomy    Optional. Taxonomy. Defaults to the taxonomy of the term identified
- *                            by `$term_id`.
- * @param string $object_type Optional. The object type. Used to highlight the proper post type
- *                            menu on the linked page. Defaults to the first object_type associated
- *                            with the taxonomy.
+ * @param int|WP_Term|object $term        The ID or term object whose edit link will be retrieved.
+ * @param string             $taxonomy    Optional. Taxonomy. Defaults to the taxonomy of the term identified
+ *                                        by `$term`.
+ * @param string             $object_type Optional. The object type. Used to highlight the proper post type
+ *                                        menu on the linked page. Defaults to the first object_type associated
+ *                                        with the taxonomy.
  * @return string|null The edit term link URL for the given term, or null on failure.
  */
-function get_edit_term_link( $term_id, $taxonomy = '', $object_type = '' ) {
-	$term = get_term( $term_id, $taxonomy );
+function get_edit_term_link( $term, $taxonomy = '', $object_type = '' ) {
+	$term = get_term( $term, $taxonomy );
 	if ( ! $term || is_wp_error( $term ) ) {
 		return;
 	}
 
-	$tax = get_taxonomy( $term->taxonomy );
-	if ( ! $tax || ! current_user_can( 'edit_term', $term->term_id ) ) {
+	$tax     = get_taxonomy( $term->taxonomy );
+	$term_id = $term->term_id;
+	if ( ! $tax || ! current_user_can( 'edit_term', $term_id ) ) {
 		return;
 	}
 
 	$args = array(
 		'taxonomy' => $taxonomy,
-		'tag_ID'   => $term->term_id,
+		'tag_ID'   => $term_id,
 	);
 
 	if ( $object_type ) {
@@ -1106,7 +1111,7 @@ function get_edit_term_link( $term_id, $taxonomy = '', $object_type = '' ) {
 	 * @param string $location    The edit link.
 	 * @param int    $term_id     Term ID.
 	 * @param string $taxonomy    Taxonomy name.
-	 * @param string $object_type The object type (eg. the post type).
+	 * @param string $object_type The object type.
 	 */
 	return apply_filters( 'get_edit_term_link', $location, $term_id, $taxonomy, $object_type );
 }
@@ -1116,16 +1121,18 @@ function get_edit_term_link( $term_id, $taxonomy = '', $object_type = '' ) {
  *
  * @since 3.1.0
  *
- * @param string  $link   Optional. Anchor text. If empty, default is 'Edit This'. Default empty.
- * @param string  $before Optional. Display before edit link. Default empty.
- * @param string  $after  Optional. Display after edit link. Default empty.
- * @param WP_Term $term   Optional. Term object. If null, the queried object will be inspected. Default null.
- * @param bool    $echo   Optional. Whether or not to echo the return. Default true.
+ * @param string           $link   Optional. Anchor text. If empty, default is 'Edit This'. Default empty.
+ * @param string           $before Optional. Display before edit link. Default empty.
+ * @param string           $after  Optional. Display after edit link. Default empty.
+ * @param int|WP_Term|null $term   Optional. Term ID or object. If null, the queried object will be inspected. Default null.
+ * @param bool             $echo   Optional. Whether or not to echo the return. Default true.
  * @return string|void HTML content.
  */
 function edit_term_link( $link = '', $before = '', $after = '', $term = null, $echo = true ) {
 	if ( is_null( $term ) ) {
 		$term = get_queried_object();
+	} else {
+		$term = get_term( $term );
 	}
 
 	if ( ! $term ) {
@@ -1619,7 +1626,7 @@ function edit_comment_link( $text = null, $before = '', $after = '' ) {
 	 * @since 2.3.0
 	 *
 	 * @param string $link       Anchor tag for the edit link.
-	 * @param int    $comment_id Comment ID.
+	 * @param string $comment_id Comment ID as a numeric string.
 	 * @param string $text       Anchor text.
 	 */
 	echo $before . apply_filters( 'edit_comment_link', $link, $comment->comment_ID, $text ) . $after;
@@ -1739,7 +1746,7 @@ function get_edit_user_link( $user_id = null ) {
  * @param bool         $in_same_term   Optional. Whether post should be in a same taxonomy term. Default false.
  * @param int[]|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs. Default empty.
  * @param string       $taxonomy       Optional. Taxonomy, if $in_same_term is true. Default 'category'.
- * @return null|string|WP_Post Post object if successful. Null if global $post is not set. Empty string if no
+ * @return WP_Post|null|string Post object if successful. Null if global $post is not set. Empty string if no
  *                             corresponding post exists.
  */
 function get_previous_post( $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {
@@ -1754,7 +1761,7 @@ function get_previous_post( $in_same_term = false, $excluded_terms = '', $taxono
  * @param bool         $in_same_term   Optional. Whether post should be in a same taxonomy term. Default false.
  * @param int[]|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs. Default empty.
  * @param string       $taxonomy       Optional. Taxonomy, if $in_same_term is true. Default 'category'.
- * @return null|string|WP_Post Post object if successful. Null if global $post is not set. Empty string if no
+ * @return WP_Post|null|string Post object if successful. Null if global $post is not set. Empty string if no
  *                             corresponding post exists.
  */
 function get_next_post( $in_same_term = false, $excluded_terms = '', $taxonomy = 'category' ) {
@@ -1774,7 +1781,7 @@ function get_next_post( $in_same_term = false, $excluded_terms = '', $taxonomy =
  * @param int[]|string $excluded_terms Optional. Array or comma-separated list of excluded term IDs. Default empty string.
  * @param bool         $previous       Optional. Whether to retrieve previous post. Default true
  * @param string       $taxonomy       Optional. Taxonomy, if $in_same_term is true. Default 'category'.
- * @return null|string|WP_Post Post object if successful. Null if global $post is not set. Empty string if no
+ * @return WP_Post|null|string Post object if successful. Null if global $post is not set. Empty string if no
  *                             corresponding post exists.
  */
 function get_adjacent_post( $in_same_term = false, $excluded_terms = '', $previous = true, $taxonomy = 'category' ) {
@@ -1830,7 +1837,7 @@ function get_adjacent_post( $in_same_term = false, $excluded_terms = '', $previo
 
 	if ( $in_same_term || ! empty( $excluded_terms ) ) {
 		if ( $in_same_term ) {
-			$join  .= " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy tt ON tr.term_taxonomy_id = tt.term_taxonomy_id";
+			$join  .= " INNER JOIN $wpdb->term_relationships AS tr ON p.ID = tr.object_id INNER JOIN $wpdb->term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id";
 			$where .= $wpdb->prepare( 'AND tt.taxonomy = %s', $taxonomy );
 
 			if ( ! is_object_in_taxonomy( $post->post_type, $taxonomy ) ) {
@@ -3980,7 +3987,7 @@ function rel_canonical() {
  * @since 3.0.0
  *
  * @param int    $id          Optional. A post or site ID. Default is 0, which means the current post or site.
- * @param string $context     Optional. Whether the ID is a 'site' id, 'post' id, or 'media' id. If 'post',
+ * @param string $context     Optional. Whether the ID is a 'site' ID, 'post' ID, or 'media' ID. If 'post',
  *                            the post_type of the post is consulted. If 'query', the current query is consulted
  *                            to determine the ID and context. Default 'post'.
  * @param bool   $allow_slugs Optional. Whether to allow post slugs in the shortlink. It is up to the plugin how
diff --git a/src/wp-includes/load.php b/src/wp-includes/load.php
index ffbc1d2290..7ef5171b4c 100644
--- a/src/wp-includes/load.php
+++ b/src/wp-includes/load.php
@@ -14,7 +14,7 @@
  */
 function wp_get_server_protocol() {
 	$protocol = isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : '';
-	if ( ! in_array( $protocol, array( 'HTTP/1.1', 'HTTP/2', 'HTTP/2.0' ), true ) ) {
+	if ( ! in_array( $protocol, array( 'HTTP/1.1', 'HTTP/2', 'HTTP/2.0', 'HTTP/3' ), true ) ) {
 		$protocol = 'HTTP/1.0';
 	}
 	return $protocol;
@@ -76,7 +76,7 @@ function wp_fix_server_vars() {
 	}
 
 	// Fix for Dreamhost and other PHP as CGI hosts.
-	if ( strpos( $_SERVER['SCRIPT_NAME'], 'php.cgi' ) !== false ) {
+	if ( isset( $_SERVER['SCRIPT_NAME'] ) && ( strpos( $_SERVER['SCRIPT_NAME'], 'php.cgi' ) !== false ) ) {
 		unset( $_SERVER['PATH_INFO'] );
 	}
 
@@ -191,7 +191,7 @@ function wp_check_php_mysql_versions() {
 function wp_get_environment_type() {
 	static $current_env = '';
 
-	if ( $current_env ) {
+	if ( ! defined( 'WP_RUN_CORE_TESTS' ) && $current_env ) {
 		return $current_env;
 	}
 
@@ -426,7 +426,7 @@ function wp_debug_mode() {
 	 * Filters whether to allow the debug mode check to occur.
 	 *
 	 * This filter runs before it can be used by plugins. It is designed for
-	 * non-web run-times. Returning false causes the `WP_DEBUG` and related
+	 * non-web runtimes. Returning false causes the `WP_DEBUG` and related
 	 * constants to not be checked and the default PHP values for errors
 	 * will be used unless you take care to update them yourself.
 	 *
@@ -673,7 +673,7 @@ function wp_start_object_cache() {
 	 * Filters whether to enable loading of the object-cache.php drop-in.
 	 *
 	 * This filter runs before it can be used by plugins. It is designed for non-web
-	 * run-times. If false is returned, object-cache.php will never be loaded.
+	 * runtimes. If false is returned, object-cache.php will never be loaded.
 	 *
 	 * @since 5.8.0
 	 *
diff --git a/src/wp-includes/media-template.php b/src/wp-includes/media-template.php
index f89945d45b..6aac196df9 100644
--- a/src/wp-includes/media-template.php
+++ b/src/wp-includes/media-template.php
@@ -320,7 +320,6 @@ function wp_print_media_templates() {
 	<?php // Template for the uploading status UI. ?>
 	<script type="text/html" id="tmpl-uploader-status">
 		<h2><?php _e( 'Uploading' ); ?></h2>
-		<button type="button" class="button-link upload-dismiss-errors"><span class="screen-reader-text"><?php _e( 'Dismiss Errors' ); ?></span></button>
 
 		<div class="media-progress-bar"><div></div></div>
 		<div class="upload-details">
@@ -331,6 +330,7 @@ function wp_print_media_templates() {
 			<span class="upload-filename"></span>
 		</div>
 		<div class="upload-errors"></div>
+		<button type="button" class="button upload-dismiss-errors"><?php _e( 'Dismiss errors' ); ?></button>
 	</script>
 
 	<?php // Template for the uploading status errors. ?>
diff --git a/src/wp-includes/media.php b/src/wp-includes/media.php
index 6e7f66760f..0daff31b37 100644
--- a/src/wp-includes/media.php
+++ b/src/wp-includes/media.php
@@ -882,7 +882,8 @@ function get_intermediate_image_sizes() {
  * @uses wp_get_additional_image_sizes()
  * @uses get_intermediate_image_sizes()
  *
- * @return array Associative array of the registered image sub-sizes.
+ * @return array[] Associative array of arrays of image sub-size information,
+ *                 keyed by image size name.
  */
 function wp_get_registered_image_subsizes() {
 	$additional_sizes = wp_get_additional_image_sizes();
@@ -1046,7 +1047,7 @@ function wp_get_attachment_image( $attachment_id, $size = 'thumbnail', $icon = f
 
 		// Add `loading` attribute.
 		if ( wp_lazy_loading_enabled( 'img', 'wp_get_attachment_image' ) ) {
-			$default_attr['loading'] = 'lazy';
+			$default_attr['loading'] = wp_get_loading_attr_default( 'wp_get_attachment_image' );
 		}
 
 		$attr = wp_parse_args( $attr, $default_attr );
@@ -1129,7 +1130,7 @@ function wp_get_attachment_image( $attachment_id, $size = 'thumbnail', $icon = f
  */
 function wp_get_attachment_image_url( $attachment_id, $size = 'thumbnail', $icon = false ) {
 	$image = wp_get_attachment_image_src( $attachment_id, $size, $icon );
-	return isset( $image['0'] ) ? $image['0'] : false;
+	return isset( $image[0] ) ? $image[0] : false;
 }
 
 /**
@@ -1820,39 +1821,45 @@ function wp_filter_content_tags( $content, $context = null ) {
 		_prime_post_caches( $attachment_ids, false, true );
 	}
 
-	foreach ( $images as $image => $attachment_id ) {
-		$filtered_image = $image;
-
-		// Add 'width' and 'height' attributes if applicable.
-		if ( $attachment_id > 0 && false === strpos( $filtered_image, ' width=' ) && false === strpos( $filtered_image, ' height=' ) ) {
-			$filtered_image = wp_img_tag_add_width_and_height_attr( $filtered_image, $context, $attachment_id );
-		}
+	// Iterate through the matches in order of occurrence as it is relevant for whether or not to lazy-load.
+	foreach ( $matches as $match ) {
+		// Filter an image match.
+		if ( isset( $images[ $match[0] ] ) ) {
+			$filtered_image = $match[0];
+			$attachment_id  = $images[ $match[0] ];
+
+			// Add 'width' and 'height' attributes if applicable.
+			if ( $attachment_id > 0 && false === strpos( $filtered_image, ' width=' ) && false === strpos( $filtered_image, ' height=' ) ) {
+				$filtered_image = wp_img_tag_add_width_and_height_attr( $filtered_image, $context, $attachment_id );
+			}
 
-		// Add 'srcset' and 'sizes' attributes if applicable.
-		if ( $attachment_id > 0 && false === strpos( $filtered_image, ' srcset=' ) ) {
-			$filtered_image = wp_img_tag_add_srcset_and_sizes_attr( $filtered_image, $context, $attachment_id );
-		}
+			// Add 'srcset' and 'sizes' attributes if applicable.
+			if ( $attachment_id > 0 && false === strpos( $filtered_image, ' srcset=' ) ) {
+				$filtered_image = wp_img_tag_add_srcset_and_sizes_attr( $filtered_image, $context, $attachment_id );
+			}
 
-		// Add 'loading' attribute if applicable.
-		if ( $add_img_loading_attr && false === strpos( $filtered_image, ' loading=' ) ) {
-			$filtered_image = wp_img_tag_add_loading_attr( $filtered_image, $context );
-		}
+			// Add 'loading' attribute if applicable.
+			if ( $add_img_loading_attr && false === strpos( $filtered_image, ' loading=' ) ) {
+				$filtered_image = wp_img_tag_add_loading_attr( $filtered_image, $context );
+			}
 
-		if ( $filtered_image !== $image ) {
-			$content = str_replace( $image, $filtered_image, $content );
+			if ( $filtered_image !== $match[0] ) {
+				$content = str_replace( $match[0], $filtered_image, $content );
+			}
 		}
-	}
 
-	foreach ( $iframes as $iframe => $attachment_id ) {
-		$filtered_iframe = $iframe;
+		// Filter an iframe match.
+		if ( isset( $iframes[ $match[0] ] ) ) {
+			$filtered_iframe = $match[0];
 
-		// Add 'loading' attribute if applicable.
-		if ( $add_iframe_loading_attr && false === strpos( $filtered_iframe, ' loading=' ) ) {
-			$filtered_iframe = wp_iframe_tag_add_loading_attr( $filtered_iframe, $context );
-		}
+			// Add 'loading' attribute if applicable.
+			if ( $add_iframe_loading_attr && false === strpos( $filtered_iframe, ' loading=' ) ) {
+				$filtered_iframe = wp_iframe_tag_add_loading_attr( $filtered_iframe, $context );
+			}
 
-		if ( $filtered_iframe !== $iframe ) {
-			$content = str_replace( $iframe, $filtered_iframe, $content );
+			if ( $filtered_iframe !== $match[0] ) {
+				$content = str_replace( $match[0], $filtered_iframe, $content );
+			}
 		}
 	}
 
@@ -1869,6 +1876,10 @@ function wp_filter_content_tags( $content, $context = null ) {
  * @return string Converted `img` tag with `loading` attribute added.
  */
 function wp_img_tag_add_loading_attr( $image, $context ) {
+	// Get loading attribute value to use. This must occur before the conditional check below so that even images that
+	// are ineligible for being lazy-loaded are considered.
+	$value = wp_get_loading_attr_default( $context );
+
 	// Images should have source and dimension attributes for the `loading` attribute to be added.
 	if ( false === strpos( $image, ' src="' ) || false === strpos( $image, ' width="' ) || false === strpos( $image, ' height="' ) ) {
 		return $image;
@@ -1883,11 +1894,11 @@ function wp_img_tag_add_loading_attr( $image, $context ) {
 	 * @since 5.5.0
 	 *
 	 * @param string|bool $value   The `loading` attribute value. Returning a falsey value will result in
-	 *                             the attribute being omitted for the image. Default 'lazy'.
+	 *                             the attribute being omitted for the image.
 	 * @param string      $image   The HTML `img` tag to be filtered.
 	 * @param string      $context Additional context about how the function was called or where the img tag is.
 	 */
-	$value = apply_filters( 'wp_img_tag_add_loading_attr', 'lazy', $image, $context );
+	$value = apply_filters( 'wp_img_tag_add_loading_attr', $value, $image, $context );
 
 	if ( $value ) {
 		if ( ! in_array( $value, array( 'lazy', 'eager' ), true ) ) {
@@ -1995,6 +2006,10 @@ function wp_iframe_tag_add_loading_attr( $iframe, $context ) {
 		return $iframe;
 	}
 
+	// Get loading attribute value to use. This must occur before the conditional check below so that even iframes that
+	// are ineligible for being lazy-loaded are considered.
+	$value = wp_get_loading_attr_default( $context );
+
 	// Iframes should have source and dimension attributes for the `loading` attribute to be added.
 	if ( false === strpos( $iframe, ' src="' ) || false === strpos( $iframe, ' width="' ) || false === strpos( $iframe, ' height="' ) ) {
 		return $iframe;
@@ -2009,11 +2024,11 @@ function wp_iframe_tag_add_loading_attr( $iframe, $context ) {
 	 * @since 5.7.0
 	 *
 	 * @param string|bool $value   The `loading` attribute value. Returning a falsey value will result in
-	 *                             the attribute being omitted for the iframe. Default 'lazy'.
+	 *                             the attribute being omitted for the iframe.
 	 * @param string      $iframe  The HTML `iframe` tag to be filtered.
 	 * @param string      $context Additional context about how the function was called or where the iframe tag is.
 	 */
-	$value = apply_filters( 'wp_iframe_tag_add_loading_attr', 'lazy', $iframe, $context );
+	$value = apply_filters( 'wp_iframe_tag_add_loading_attr', $value, $iframe, $context );
 
 	if ( $value ) {
 		if ( ! in_array( $value, array( 'lazy', 'eager' ), true ) ) {
@@ -4210,7 +4225,7 @@ function wp_prepare_attachment_for_js( $attachment ) {
  * @param array $args {
  *     Arguments for enqueuing media scripts.
  *
- *     @type int|WP_Post A post object or ID.
+ *     @type int|WP_Post $post A post object or ID.
  * }
  */
 function wp_enqueue_media( $args = array() ) {
@@ -4711,7 +4726,7 @@ function get_post_galleries( $post, $html = true ) {
 		return array();
 	}
 
-	if ( ! has_shortcode( $post->post_content, 'gallery' ) ) {
+	if ( ! has_shortcode( $post->post_content, 'gallery' ) && ! has_block( 'gallery', $post->post_content ) ) {
 		return array();
 	}
 
@@ -4753,6 +4768,95 @@ function get_post_galleries( $post, $html = true ) {
 		}
 	}
 
+	if ( has_block( 'gallery', $post->post_content ) ) {
+		$post_blocks = parse_blocks( $post->post_content );
+
+		while ( $block = array_shift( $post_blocks ) ) {
+			$has_inner_blocks = ! empty( $block['innerBlocks'] );
+
+			// Skip blocks with no blockName and no innerHTML.
+			if ( ! $block['blockName'] ) {
+				continue;
+			}
+
+			// All blocks nested inside non-Gallery blocks should be in the root array.
+			if ( $has_inner_blocks && 'core/gallery' !== $block['blockName'] ) {
+				array_push( $post_blocks, ...$block['innerBlocks'] );
+				continue;
+			}
+
+			// New Gallery block format as HTML.
+			if ( $has_inner_blocks && $html ) {
+				$block_html  = wp_list_pluck( $block['innerBlocks'], 'innerHTML' );
+				$galleries[] = '<figure>' . implode( ' ', $block_html ) . '</figure>';
+				continue;
+			}
+
+			$srcs = array();
+
+			// New Gallery block format as an array.
+			if ( $has_inner_blocks ) {
+				$attrs = wp_list_pluck( $block['innerBlocks'], 'attrs' );
+				$ids   = wp_list_pluck( $attrs, 'id' );
+
+				foreach ( $ids as $id ) {
+					$url = wp_get_attachment_url( $id );
+
+					if ( is_string( $url ) && ! in_array( $url, $srcs, true ) ) {
+						$srcs[] = $url;
+					}
+				}
+
+				$galleries[] = array(
+					'ids' => implode( ',', $ids ),
+					'src' => $srcs,
+				);
+
+				continue;
+			}
+
+			// Old Gallery block format as HTML.
+			if ( $html ) {
+				$galleries[] = $block['innerHTML'];
+				continue;
+			}
+
+			// Old Gallery block format as an array.
+			$ids = ! empty( $block['attrs']['ids'] ) ? $block['attrs']['ids'] : array();
+
+			// If present, use the image IDs from the JSON blob as canonical.
+			if ( ! empty( $ids ) ) {
+				foreach ( $ids as $id ) {
+					$url = wp_get_attachment_url( $id );
+
+					if ( is_string( $url ) && ! in_array( $url, $srcs, true ) ) {
+						$srcs[] = $url;
+					}
+				}
+
+				$galleries[] = array(
+					'ids' => implode( ',', $ids ),
+					'src' => $srcs,
+				);
+
+				continue;
+			}
+
+			// Otherwise, extract srcs from the innerHTML.
+			preg_match_all( '#src=([\'"])(.+?)\1#is', $block['innerHTML'], $found_srcs, PREG_SET_ORDER );
+
+			if ( ! empty( $found_srcs[0] ) ) {
+				foreach ( $found_srcs as $src ) {
+					if ( isset( $src[2] ) && ! in_array( $src[2], $srcs, true ) ) {
+						$srcs[] = $src[2];
+					}
+				}
+			}
+
+			$galleries[] = array( 'src' => $srcs );
+		}
+	}
+
 	/**
 	 * Filters the list of all found galleries in the given post.
 	 *
@@ -5092,7 +5196,7 @@ function wp_getimagesize( $filename, array &$image_info = null ) {
 			return array(
 				$width,
 				$height,
-				IMAGETYPE_WEBP, // phpcs:ignore PHPCompatibility.Constants.NewConstants.imagetype_webpFound
+				IMAGETYPE_WEBP,
 				sprintf(
 					'width="%d" height="%d"',
 					$width,
@@ -5108,20 +5212,19 @@ function wp_getimagesize( $filename, array &$image_info = null ) {
 }
 
 /**
- * Extracts meta information about a webp file: width, height and type.
+ * Extracts meta information about a WebP file: width, height, and type.
  *
  * @since 5.8.0
  *
  * @param string $filename Path to a WebP file.
- * @return array $webp_info {
+ * @return array {
  *     An array of WebP image information.
  *
- *     @type array $size {
- *         @type int|false    $width  Image width on success, false on failure.
- *         @type int|false    $height Image height on success, false on failure.
- *         @type string|false $type   The WebP type: one of 'lossy', 'lossless' or 'animated-alpha'.
- *                                    False on failure.
- *     }
+ *     @type int|false    $width  Image width on success, false on failure.
+ *     @type int|false    $height Image height on success, false on failure.
+ *     @type string|false $type   The WebP type: one of 'lossy', 'lossless' or 'animated-alpha'.
+ *                                False on failure.
+ * }
  */
 function wp_get_webp_info( $filename ) {
 	$width  = false;
@@ -5177,3 +5280,97 @@ function wp_get_webp_info( $filename ) {
 
 	return compact( 'width', 'height', 'type' );
 }
+
+/**
+ * Gets the default value to use for a `loading` attribute on an element.
+ *
+ * This function should only be called for a tag and context if lazy-loading is generally enabled.
+ *
+ * The function usually returns 'lazy', but uses certain heuristics to guess whether the current element is likely to
+ * appear above the fold, in which case it returns a boolean `false`, which will lead to the `loading` attribute being
+ * omitted on the element. The purpose of this refinement is to avoid lazy-loading elements that are within the initial
+ * viewport, which can have a negative performance impact.
+ *
+ * Under the hood, the function uses {@see wp_increase_content_media_count()} every time it is called for an element
+ * within the main content. If the element is the very first content element, the `loading` attribute will be omitted.
+ * This default threshold of 1 content element to omit the `loading` attribute for can be customized using the
+ * {@see 'wp_omit_loading_attr_threshold'} filter.
+ *
+ * @since 5.9.0
+ *
+ * @param string $context Context for the element for which the `loading` attribute value is requested.
+ * @return string|bool The default `loading` attribute value. Either 'lazy', 'eager', or a boolean `false`, to indicate
+ *                     that the `loading` attribute should be skipped.
+ */
+function wp_get_loading_attr_default( $context ) {
+	// Only elements with 'the_content' or 'the_post_thumbnail' context have special handling.
+	if ( 'the_content' !== $context && 'the_post_thumbnail' !== $context ) {
+		return 'lazy';
+	}
+
+	// Only elements within the main query loop have special handling.
+	if ( is_admin() || ! in_the_loop() || ! is_main_query() ) {
+		return 'lazy';
+	}
+
+	// Increase the counter since this is a main query content element.
+	$content_media_count = wp_increase_content_media_count();
+
+	// If the count so far is below the threshold, return `false` so that the `loading` attribute is omitted.
+	if ( $content_media_count <= wp_omit_loading_attr_threshold() ) {
+		return false;
+	}
+
+	// For elements after the threshold, lazy-load them as usual.
+	return 'lazy';
+}
+
+/**
+ * Gets the threshold for how many of the first content media elements to not lazy-load.
+ *
+ * This function runs the {@see 'wp_omit_loading_attr_threshold'} filter, which uses a default threshold value of 1.
+ * The filter is only run once per page load, unless the `$force` parameter is used.
+ *
+ * @since 5.9.0
+ *
+ * @param bool $force Optional. If set to true, the filter will be (re-)applied even if it already has been before.
+ *                    Default false.
+ * @return int The number of content media elements to not lazy-load.
+ */
+function wp_omit_loading_attr_threshold( $force = false ) {
+	static $omit_threshold;
+
+	// This function may be called multiple times. Run the filter only once per page load.
+	if ( ! isset( $omit_threshold ) || $force ) {
+		/**
+		 * Filters the threshold for how many of the first content media elements to not lazy-load.
+		 *
+		 * For these first content media elements, the `loading` attribute will be omitted. By default, this is the case
+		 * for only the very first content media element.
+		 *
+		 * @since 5.9.0
+		 *
+		 * @param int $omit_threshold The number of media elements where the `loading` attribute will not be added. Default 1.
+		 */
+		$omit_threshold = apply_filters( 'wp_omit_loading_attr_threshold', 1 );
+	}
+
+	return $omit_threshold;
+}
+
+/**
+ * Increases an internal content media count variable.
+ *
+ * @since 5.9.0
+ * @access private
+ *
+ * @param int $amount Optional. Amount to increase by. Default 1.
+ * @return int The latest content media count, after the increase.
+ */
+function wp_increase_content_media_count( $amount = 1 ) {
+	static $content_media_count = 0;
+
+	$content_media_count += $amount;
+
+	return $content_media_count;
+}
diff --git a/src/wp-includes/meta.php b/src/wp-includes/meta.php
index 310b10f933..ed53cf579b 100644
--- a/src/wp-includes/meta.php
+++ b/src/wp-includes/meta.php
@@ -110,7 +110,7 @@ function add_metadata( $meta_type, $object_id, $meta_key, $meta_value, $unique =
 	 *
 	 * @param int    $object_id   ID of the object metadata is for.
 	 * @param string $meta_key    Metadata key.
-	 * @param mixed  $_meta_value Metadata value. Serialized if non-scalar.
+	 * @param mixed  $_meta_value Metadata value.
 	 */
 	do_action( "add_{$meta_type}_meta", $object_id, $meta_key, $_meta_value );
 
@@ -149,7 +149,7 @@ function add_metadata( $meta_type, $object_id, $meta_key, $meta_value, $unique =
 	 * @param int    $mid         The meta ID after successful update.
 	 * @param int    $object_id   ID of the object metadata is for.
 	 * @param string $meta_key    Metadata key.
-	 * @param mixed  $_meta_value Metadata value. Serialized if non-scalar.
+	 * @param mixed  $_meta_value Metadata value.
 	 */
 	do_action( "added_{$meta_type}_meta", $mid, $object_id, $meta_key, $_meta_value );
 
@@ -283,7 +283,7 @@ function update_metadata( $meta_type, $object_id, $meta_key, $meta_value, $prev_
 		 * @param int    $meta_id     ID of the metadata entry to update.
 		 * @param int    $object_id   ID of the object metadata is for.
 		 * @param string $meta_key    Metadata key.
-		 * @param mixed  $_meta_value Metadata value. Serialized if non-scalar.
+		 * @param mixed  $_meta_value Metadata value.
 		 */
 		do_action( "update_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $_meta_value );
 
@@ -329,7 +329,7 @@ function update_metadata( $meta_type, $object_id, $meta_key, $meta_value, $prev_
 		 * @param int    $meta_id     ID of updated metadata entry.
 		 * @param int    $object_id   ID of the object metadata is for.
 		 * @param string $meta_key    Metadata key.
-		 * @param mixed  $_meta_value Metadata value. Serialized if non-scalar.
+		 * @param mixed  $_meta_value Metadata value.
 		 */
 		do_action( "updated_{$meta_type}_meta", $meta_id, $object_id, $meta_key, $_meta_value );
 
@@ -471,7 +471,7 @@ function delete_metadata( $meta_type, $object_id, $meta_key, $meta_value = '', $
 	 * @param string[] $meta_ids    An array of metadata entry IDs to delete.
 	 * @param int      $object_id   ID of the object metadata is for.
 	 * @param string   $meta_key    Metadata key.
-	 * @param mixed    $_meta_value Metadata value. Serialized if non-scalar.
+	 * @param mixed    $_meta_value Metadata value.
 	 */
 	do_action( "delete_{$meta_type}_meta", $meta_ids, $object_id, $meta_key, $_meta_value );
 
@@ -521,7 +521,7 @@ function delete_metadata( $meta_type, $object_id, $meta_key, $meta_value = '', $
 	 * @param string[] $meta_ids    An array of metadata entry IDs to delete.
 	 * @param int      $object_id   ID of the object metadata is for.
 	 * @param string   $meta_key    Metadata key.
-	 * @param mixed    $_meta_value Metadata value. Serialized if non-scalar.
+	 * @param mixed    $_meta_value Metadata value.
 	 */
 	do_action( "deleted_{$meta_type}_meta", $meta_ids, $object_id, $meta_key, $_meta_value );
 
diff --git a/src/wp-includes/ms-default-filters.php b/src/wp-includes/ms-default-filters.php
index 042751e491..1b32f7a32b 100644
--- a/src/wp-includes/ms-default-filters.php
+++ b/src/wp-includes/ms-default-filters.php
@@ -76,7 +76,7 @@ add_filter( 'allowed_redirect_hosts', 'redirect_this_site' );
 
 // Administration.
 add_filter( 'term_id_filter', 'global_terms', 10, 2 );
-add_action( 'delete_post', '_update_posts_count_on_delete' );
+add_action( 'after_delete_post', '_update_posts_count_on_delete' );
 add_action( 'delete_post', '_update_blog_date_on_post_delete' );
 add_action( 'transition_post_status', '_update_blog_date_on_post_publish', 10, 3 );
 add_action( 'transition_post_status', '_update_posts_count_on_transition_post_status', 10, 3 );
diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php
index 09b48be38a..4ba038cd00 100644
--- a/src/wp-includes/ms-functions.php
+++ b/src/wp-includes/ms-functions.php
@@ -538,7 +538,14 @@ function wpmu_validate_user_signup( $user_name, $user_email ) {
 
 	// Check if the email address has been used already.
 	if ( email_exists( $user_email ) ) {
-		$errors->add( 'user_email', __( 'Sorry, that email address is already used!' ) );
+		$errors->add(
+			'user_email',
+			sprintf(
+				/* translators: %s: Link to the login page. */
+				__( '<strong>Error:</strong> This email address is already registered. <a href="%s">Log in</a> with this address or choose another one.' ),
+				wp_login_url()
+			)
+		);
 	}
 
 	// Has someone already signed up for this username?
@@ -675,7 +682,7 @@ function wpmu_validate_blog_signup( $blogname, $blog_title, $user = '' ) {
 		$errors->add( 'blogname', sprintf( _n( 'Site name must be at least %s character.', 'Site name must be at least %s characters.', $minimum_site_name_length ), number_format_i18n( $minimum_site_name_length ) ) );
 	}
 
-	// Do not allow users to create a blog that conflicts with a page on the main blog.
+	// Do not allow users to create a site that conflicts with a page on the main blog.
 	if ( ! is_subdomain_install() && $wpdb->get_var( $wpdb->prepare( 'SELECT post_name FROM ' . $wpdb->get_blog_prefix( $current_network->site_id ) . "posts WHERE post_type = 'page' AND post_name = %s", $blogname ) ) ) {
 		$errors->add( 'blogname', __( 'Sorry, you may not use that site name.' ) );
 	}
@@ -715,6 +722,10 @@ function wpmu_validate_blog_signup( $blogname, $blog_title, $user = '' ) {
 		$errors->add( 'blogname', __( 'Sorry, that site already exists!' ) );
 	}
 
+	/*
+	 * Do not allow users to create a site that matches an existing user's login name,
+	 * unless it's the user's own username.
+	 */
 	if ( username_exists( $blogname ) ) {
 		if ( ! is_object( $user ) || ( is_object( $user ) && ( $user->user_login != $blogname ) ) ) {
 			$errors->add( 'blogname', __( 'Sorry, that site is reserved!' ) );
@@ -1264,7 +1275,7 @@ function wpmu_activate_signup( $key ) {
 	 *
 	 * @param int    $blog_id       Blog ID.
 	 * @param int    $user_id       User ID.
-	 * @param int    $password      User password.
+	 * @param string $password      User password.
 	 * @param string $signup_title  Site title.
 	 * @param array  $meta          Signup meta data. By default, contains the requested privacy setting and lang_id.
 	 */
@@ -1300,7 +1311,7 @@ function wp_delete_signup_on_user_delete( $id, $reassign, $user ) {
  * This function runs when a user self-registers as well as when
  * a Super Admin creates a new user. Hook to {@see 'wpmu_new_user'} for events
  * that should affect all new users, but only on Multisite (otherwise
- * use {@see'user_register'}).
+ * use {@see 'user_register'}).
  *
  * @since MU (3.0.0)
  *
@@ -1462,8 +1473,8 @@ Disable these notifications: %4$s'
 	 * @since MU (3.0.0)
 	 * @since 5.4.0 The `$blog_id` parameter was added.
 	 *
-	 * @param string $msg     Email body.
-	 * @param int    $blog_id The new site's ID.
+	 * @param string     $msg     Email body.
+	 * @param int|string $blog_id The new site's ID as an integer or numeric string.
 	 */
 	$msg = apply_filters( 'newblog_notify_siteadmin', $msg, $blog_id );
 
diff --git a/src/wp-includes/ms-site.php b/src/wp-includes/ms-site.php
index 2c8c93cb86..f71bbe1fee 100644
--- a/src/wp-includes/ms-site.php
+++ b/src/wp-includes/ms-site.php
@@ -977,7 +977,7 @@ function clean_blog_cache( $blog ) {
 	 *
 	 * @since 4.6.0
 	 *
-	 * @param int     $id              Blog ID.
+	 * @param string  $id              Site ID as a numeric string.
 	 * @param WP_Site $blog            Site object.
 	 * @param string  $domain_path_key md5 hash of domain and path.
 	 */
diff --git a/src/wp-includes/nav-menu-template.php b/src/wp-includes/nav-menu-template.php
index f4638ffadb..592522878f 100644
--- a/src/wp-includes/nav-menu-template.php
+++ b/src/wp-includes/nav-menu-template.php
@@ -599,13 +599,13 @@ function _wp_menu_item_classes_by_context( &$menu_items ) {
  *
  * @param array    $items The menu items, sorted by each menu item's menu order.
  * @param int      $depth Depth of the item in reference to parents.
- * @param stdClass $r     An object containing wp_nav_menu() arguments.
+ * @param stdClass $args  An object containing wp_nav_menu() arguments.
  * @return string The HTML list content for the menu items.
  */
-function walk_nav_menu_tree( $items, $depth, $r ) {
-	$walker = ( empty( $r->walker ) ) ? new Walker_Nav_Menu : $r->walker;
+function walk_nav_menu_tree( $items, $depth, $args ) {
+	$walker = ( empty( $args->walker ) ) ? new Walker_Nav_Menu : $args->walker;
 
-	return $walker->walk( $items, $depth, $r );
+	return $walker->walk( $items, $depth, $args );
 }
 
 /**
diff --git a/src/wp-includes/nav-menu.php b/src/wp-includes/nav-menu.php
index 2aa147f867..abfe4a0149 100644
--- a/src/wp-includes/nav-menu.php
+++ b/src/wp-includes/nav-menu.php
@@ -406,17 +406,19 @@ function wp_update_nav_menu_object( $menu_id = 0, $menu_data = array() ) {
 /**
  * Save the properties of a menu item or create a new one.
  *
- * The menu-item-title, menu-item-description, and menu-item-attr-title are expected
- * to be pre-slashed since they are passed directly into `wp_insert_post()`.
+ * The menu-item-title, menu-item-description and menu-item-attr-title are expected
+ * to be pre-slashed since they are passed directly to APIs that expect slashed data.
  *
  * @since 3.0.0
+ * @since 5.9.0 Added the `$fire_after_hooks` parameter.
  *
- * @param int   $menu_id         The ID of the menu. Required. If "0", makes the menu item a draft orphan.
- * @param int   $menu_item_db_id The ID of the menu item. If "0", creates a new menu item.
- * @param array $menu_item_data  The menu item's data.
+ * @param int   $menu_id          The ID of the menu. If 0, makes the menu item a draft orphan.
+ * @param int   $menu_item_db_id  The ID of the menu item. If 0, creates a new menu item.
+ * @param array $menu_item_data   The menu item's data.
+ * @param bool  $fire_after_hooks Whether to fire the after insert hooks. Default true.
  * @return int|WP_Error The menu item's database ID or WP_Error object on failure.
  */
-function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item_data = array() ) {
+function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item_data = array(), $fire_after_hooks = true ) {
 	$menu_id         = (int) $menu_id;
 	$menu_item_db_id = (int) $menu_item_db_id;
 
@@ -526,7 +528,7 @@ function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item
 	if ( ! $update ) {
 		$post['ID']          = 0;
 		$post['post_status'] = 'publish' === $args['menu-item-status'] ? 'publish' : 'draft';
-		$menu_item_db_id     = wp_insert_post( $post );
+		$menu_item_db_id     = wp_insert_post( $post, true, $fire_after_hooks );
 		if ( ! $menu_item_db_id || is_wp_error( $menu_item_db_id ) ) {
 			return $menu_item_db_id;
 		}
@@ -548,7 +550,10 @@ function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item
 	// Associate the menu item with the menu term.
 	// Only set the menu term if it isn't set to avoid unnecessary wp_get_object_terms().
 	if ( $menu_id && ( ! $update || ! is_object_in_term( $menu_item_db_id, 'nav_menu', (int) $menu->term_id ) ) ) {
-		wp_set_object_terms( $menu_item_db_id, array( $menu->term_id ), 'nav_menu' );
+		$update_terms = wp_set_object_terms( $menu_item_db_id, array( $menu->term_id ), 'nav_menu' );
+		if ( is_wp_error( $update_terms ) ) {
+			return $update_terms;
+		}
 	}
 
 	if ( 'custom' === $args['menu-item-type'] ) {
@@ -580,7 +585,11 @@ function wp_update_nav_menu_item( $menu_id = 0, $menu_item_db_id = 0, $menu_item
 	if ( $update ) {
 		$post['ID']          = $menu_item_db_id;
 		$post['post_status'] = ( 'draft' === $args['menu-item-status'] ) ? 'draft' : 'publish';
-		wp_update_post( $post );
+
+		$update_post = wp_update_post( $post, true );
+		if ( is_wp_error( $update_post ) ) {
+			return $update_post;
+		}
 	}
 
 	/**
diff --git a/src/wp-includes/option.php b/src/wp-includes/option.php
index f90e82017e..d0eb6f9c83 100644
--- a/src/wp-includes/option.php
+++ b/src/wp-includes/option.php
@@ -784,7 +784,7 @@ function delete_transient( $transient ) {
 	 */
 	do_action( "delete_transient_{$transient}", $transient );
 
-	if ( wp_using_ext_object_cache() ) {
+	if ( wp_using_ext_object_cache() || wp_installing() ) {
 		$result = wp_cache_delete( $transient, 'transient' );
 	} else {
 		$option_timeout = '_transient_timeout_' . $transient;
@@ -846,7 +846,7 @@ function get_transient( $transient ) {
 		return $pre;
 	}
 
-	if ( wp_using_ext_object_cache() ) {
+	if ( wp_using_ext_object_cache() || wp_installing() ) {
 		$value = wp_cache_get( $transient, 'transient' );
 	} else {
 		$transient_option = '_transient_' . $transient;
@@ -930,7 +930,7 @@ function set_transient( $transient, $value, $expiration = 0 ) {
 	 */
 	$expiration = apply_filters( "expiration_of_transient_{$transient}", $expiration, $value, $transient );
 
-	if ( wp_using_ext_object_cache() ) {
+	if ( wp_using_ext_object_cache() || wp_installing() ) {
 		$result = wp_cache_set( $transient, $value, 'transient', $expiration );
 	} else {
 		$transient_timeout = '_transient_timeout_' . $transient;
@@ -1858,7 +1858,7 @@ function delete_site_transient( $transient ) {
 	 */
 	do_action( "delete_site_transient_{$transient}", $transient );
 
-	if ( wp_using_ext_object_cache() ) {
+	if ( wp_using_ext_object_cache() || wp_installing() ) {
 		$result = wp_cache_delete( $transient, 'site-transient' );
 	} else {
 		$option_timeout = '_site_transient_timeout_' . $transient;
@@ -1922,7 +1922,7 @@ function get_site_transient( $transient ) {
 		return $pre;
 	}
 
-	if ( wp_using_ext_object_cache() ) {
+	if ( wp_using_ext_object_cache() || wp_installing() ) {
 		$value = wp_cache_get( $transient, 'site-transient' );
 	} else {
 		// Core transients that do not have a timeout. Listed here so querying timeouts can be avoided.
@@ -2003,7 +2003,7 @@ function set_site_transient( $transient, $value, $expiration = 0 ) {
 	 */
 	$expiration = apply_filters( "expiration_of_site_transient_{$transient}", $expiration, $value, $transient );
 
-	if ( wp_using_ext_object_cache() ) {
+	if ( wp_using_ext_object_cache() || wp_installing() ) {
 		$result = wp_cache_set( $transient, $value, 'site-transient', $expiration );
 	} else {
 		$transient_timeout = '_site_transient_timeout_' . $transient;
diff --git a/src/wp-includes/pluggable.php b/src/wp-includes/pluggable.php
index 4a5891b8fd..ffcd2bdcc3 100644
--- a/src/wp-includes/pluggable.php
+++ b/src/wp-includes/pluggable.php
@@ -20,9 +20,9 @@ if ( ! function_exists( 'wp_set_current_user' ) ) :
 	 *
 	 * @global WP_User $current_user The current user object which holds the user data.
 	 *
-	 * @param int    $id   User ID
-	 * @param string $name User's username
-	 * @return WP_User Current user User object
+	 * @param int|null $id   User ID.
+	 * @param string   $name User's username.
+	 * @return WP_User Current user User object.
 	 */
 	function wp_set_current_user( $id, $name = '' ) {
 		global $current_user;
@@ -537,13 +537,28 @@ if ( ! function_exists( 'wp_mail' ) ) :
 		 */
 		do_action_ref_array( 'phpmailer_init', array( &$phpmailer ) );
 
+		$mail_data = compact( 'to', 'subject', 'message', 'headers', 'attachments' );
+
 		// Send!
 		try {
-			return $phpmailer->send();
-		} catch ( PHPMailer\PHPMailer\Exception $e ) {
+			$send = $phpmailer->send();
 
-			$mail_error_data                             = compact( 'to', 'subject', 'message', 'headers', 'attachments' );
-			$mail_error_data['phpmailer_exception_code'] = $e->getCode();
+			/**
+			 * Fires after PHPMailer has successfully sent a mail.
+			 *
+			 * The firing of this action does not necessarily mean that the recipient received the
+			 * email successfully. It only means that the `send` method above was able to
+			 * process the request without any errors.
+			 *
+			 * @since 5.9.0
+			 *
+			 * @param array $mail_data An array containing the mail recipient, subject, message, headers, and attachments.
+			 */
+			do_action( 'wp_mail_succeeded', $mail_data );
+
+			return $send;
+		} catch ( PHPMailer\PHPMailer\Exception $e ) {
+			$mail_data['phpmailer_exception_code'] = $e->getCode();
 
 			/**
 			 * Fires after a PHPMailer\PHPMailer\Exception is caught.
@@ -553,7 +568,7 @@ if ( ! function_exists( 'wp_mail' ) ) :
 			 * @param WP_Error $error A WP_Error object with the PHPMailer\PHPMailer\Exception message, and an array
 			 *                        containing the mail recipient, subject, message, headers, and attachments.
 			 */
-			do_action( 'wp_mail_failed', new WP_Error( 'wp_mail_failed', $e->getMessage(), $mail_error_data ) );
+			do_action( 'wp_mail_failed', new WP_Error( 'wp_mail_failed', $e->getMessage(), $mail_data ) );
 
 			return false;
 		}
@@ -1569,7 +1584,7 @@ if ( ! function_exists( 'wp_notify_postauthor' ) ) :
 		 * @since 3.7.0
 		 *
 		 * @param string[] $emails     An array of email addresses to receive a comment notification.
-		 * @param int      $comment_id The comment ID.
+		 * @param string   $comment_id The comment ID as a numeric string.
 		 */
 		$emails = apply_filters( 'comment_notification_recipients', $emails, $comment->comment_ID );
 		$emails = array_filter( $emails );
@@ -1590,9 +1605,9 @@ if ( ! function_exists( 'wp_notify_postauthor' ) ) :
 		 *
 		 * @since 3.8.0
 		 *
-		 * @param bool $notify     Whether to notify the post author of their own comment.
-		 *                         Default false.
-		 * @param int  $comment_id The comment ID.
+		 * @param bool   $notify     Whether to notify the post author of their own comment.
+		 *                           Default false.
+		 * @param string $comment_id The comment ID as a numeric string.
 		 */
 		$notify_author = apply_filters( 'comment_notification_notify_author', false, $comment->comment_ID );
 
@@ -1725,7 +1740,7 @@ if ( ! function_exists( 'wp_notify_postauthor' ) ) :
 		 * @since 1.5.2
 		 *
 		 * @param string $notify_message The comment notification email text.
-		 * @param int    $comment_id     Comment ID.
+		 * @param string $comment_id     Comment ID as a numeric string.
 		 */
 		$notify_message = apply_filters( 'comment_notification_text', $notify_message, $comment->comment_ID );
 
@@ -1735,7 +1750,7 @@ if ( ! function_exists( 'wp_notify_postauthor' ) ) :
 		 * @since 1.5.2
 		 *
 		 * @param string $subject    The comment notification email subject.
-		 * @param int    $comment_id Comment ID.
+		 * @param string $comment_id Comment ID as a numeric string.
 		 */
 		$subject = apply_filters( 'comment_notification_subject', $subject, $comment->comment_ID );
 
@@ -1745,7 +1760,7 @@ if ( ! function_exists( 'wp_notify_postauthor' ) ) :
 		 * @since 1.5.2
 		 *
 		 * @param string $message_headers Headers for the comment notification email.
-		 * @param int    $comment_id      Comment ID.
+		 * @param string $comment_id      Comment ID as a numeric string.
 		 */
 		$message_headers = apply_filters( 'comment_notification_headers', $message_headers, $comment->comment_ID );
 
@@ -2678,7 +2693,7 @@ if ( ! function_exists( 'get_avatar' ) ) :
 		);
 
 		if ( wp_lazy_loading_enabled( 'img', 'get_avatar' ) ) {
-			$defaults['loading'] = 'lazy';
+			$defaults['loading'] = wp_get_loading_attr_default( 'get_avatar' );
 		}
 
 		if ( empty( $args ) ) {
@@ -2705,7 +2720,7 @@ if ( ! function_exists( 'get_avatar' ) ) :
 		/**
 		 * Allows the HTML for a user's avatar to be returned early.
 		 *
-		 * Passing a non-null value will effectively short-circuit get_avatar(), passing
+		 * Returning a non-null value will effectively short-circuit get_avatar(), passing
 		 * the value through the {@see 'get_avatar'} filter and returning early.
 		 *
 		 * @since 4.2.0
diff --git a/src/wp-includes/plugin.php b/src/wp-includes/plugin.php
index 5f4fa15986..81e0aa952d 100644
--- a/src/wp-includes/plugin.php
+++ b/src/wp-includes/plugin.php
@@ -247,8 +247,10 @@ function apply_filters_ref_array( $hook_name, $args ) {
  *
  * @global WP_Hook[] $wp_filter Stores all of the filters and actions.
  *
- * @param string         $hook_name The name of the filter hook.
- * @param callable|false $callback  Optional. The callback to check for. Default false.
+ * @param string                      $hook_name The name of the filter hook.
+ * @param callable|string|array|false $callback  Optional. The callback to check for.
+ *                                               This function can be called unconditionally to speculatively check
+ *                                               a callback that may or may not exist. Default false.
  * @return bool|int If `$callback` is omitted, returns boolean for whether the hook has
  *                  anything registered. When checking a specific function, the priority
  *                  of that hook is returned, or false if the function is not attached.
@@ -277,10 +279,12 @@ function has_filter( $hook_name, $callback = false ) {
  *
  * @global WP_Hook[] $wp_filter Stores all of the filters and actions.
  *
- * @param string   $hook_name The filter hook to which the function to be removed is hooked.
- * @param callable $callback  The name of the function which should be removed.
- * @param int      $priority  Optional. The exact priority used when adding the original
- *                            filter callback. Default 10.
+ * @param string                $hook_name The filter hook to which the function to be removed is hooked.
+ * @param callable|string|array $callback  The callback to be removed from running when the filter is applied.
+ *                                         This function can be called unconditionally to speculatively remove
+ *                                         a callback that may or may not exist.
+ * @param int                   $priority  Optional. The exact priority used when adding the original
+ *                                         filter callback. Default 10.
  * @return bool Whether the function existed before it was removed.
  */
 function remove_filter( $hook_name, $callback, $priority = 10 ) {
@@ -530,8 +534,10 @@ function do_action_ref_array( $hook_name, $args ) {
  *
  * @see has_filter() has_action() is an alias of has_filter().
  *
- * @param string         $hook_name The name of the action hook.
- * @param callable|false $callback  Optional. The callback to check for. Default false.
+ * @param string                      $hook_name The name of the action hook.
+ * @param callable|string|array|false $callback  Optional. The callback to check for.
+ *                                               This function can be called unconditionally to speculatively check
+ *                                               a callback that may or may not exist. Default false.
  * @return bool|int If `$callback` is omitted, returns boolean for whether the hook has
  *                  anything registered. When checking a specific function, the priority
  *                  of that hook is returned, or false if the function is not attached.
@@ -552,10 +558,12 @@ function has_action( $hook_name, $callback = false ) {
  *
  * @since 1.2.0
  *
- * @param string   $hook_name The action hook to which the function to be removed is hooked.
- * @param callable $callback  The name of the function which should be removed.
- * @param int      $priority  Optional. The exact priority used when adding the original
- *                            action callback. Default 10.
+ * @param string                $hook_name The action hook to which the function to be removed is hooked.
+ * @param callable|string|array $callback  The name of the function which should be removed.
+ *                                         This function can be called unconditionally to speculatively remove
+ *                                         a callback that may or may not exist.
+ * @param int                   $priority  Optional. The exact priority used when adding the original
+ *                                         action callback. Default 10.
  * @return bool Whether the function is removed.
  */
 function remove_action( $hook_name, $callback, $priority = 10 ) {
@@ -924,12 +932,14 @@ function _wp_call_all_hook( $args ) {
  * @since 5.3.0 Removed workarounds for spl_object_hash().
  *              `$hook_name` and `$priority` are no longer used,
  *              and the function always returns a string.
+ *
  * @access private
  *
- * @param string   $hook_name Unused. The name of the filter to build ID for.
- * @param callable $callback  The function to generate ID for.
- * @param int      $priority  Unused. The order in which the functions
- *                            associated with a particular action are executed.
+ * @param string                $hook_name Unused. The name of the filter to build ID for.
+ * @param callable|string|array $callback  The callback to generate ID for. The callback may
+ *                                         or may not exist.
+ * @param int                   $priority  Unused. The order in which the functions
+ *                                         associated with a particular action are executed.
  * @return string Unique function ID for usage as array key.
  */
 function _wp_filter_build_unique_id( $hook_name, $callback, $priority ) {
diff --git a/src/wp-includes/pomo/entry.php b/src/wp-includes/pomo/entry.php
index d30a4bda13..390941687a 100644
--- a/src/wp-includes/pomo/entry.php
+++ b/src/wp-includes/pomo/entry.php
@@ -16,7 +16,7 @@ if ( ! class_exists( 'Translation_Entry', false ) ) :
 		/**
 		 * Whether the entry contains a string and its plural form, default is false
 		 *
-		 * @var boolean
+		 * @var bool
 		 */
 		public $is_plural = false;
 
@@ -30,15 +30,23 @@ if ( ! class_exists( 'Translation_Entry', false ) ) :
 		public $flags               = array();
 
 		/**
-		 * @param array $args associative array, support following keys:
-		 *  - singular (string) -- the string to translate, if omitted and empty entry will be created
-		 *  - plural (string) -- the plural form of the string, setting this will set {@link $is_plural} to true
-		 *  - translations (array) -- translations of the string and possibly -- its plural forms
-		 *  - context (string) -- a string differentiating two equal strings used in different contexts
-		 *  - translator_comments (string) -- comments left by translators
-		 *  - extracted_comments (string) -- comments left by developers
-		 *  - references (array) -- places in the code this strings is used, in relative_to_root_path/file.php:linenum form
-		 *  - flags (array) -- flags like php-format
+		 * @param array $args {
+		 *     Arguments array, supports the following keys:
+		 *
+		 *     @type string $singular            The string to translate, if omitted an
+		 *                                       empty entry will be created.
+		 *     @type string $plural              The plural form of the string, setting
+		 *                                       this will set {@link $is_plural} to true.
+		 *     @type array  $translations        Translations of the string and possibly
+		 *                                       its plural forms.
+		 *     @type string $context             A string differentiating two equal strings
+		 *                                       used in different contexts.
+		 *     @type string $translator_comments Comments left by translators.
+		 *     @type string $extracted_comments  Comments left by developers.
+		 *     @type array  $references          Places in the code this string is used, in
+		 *                                       relative_to_root_path/file.php:linenum form.
+		 *     @type array  $flags               Flags like php-format.
+		 * }
 		 */
 		public function __construct( $args = array() ) {
 			// If no singular -- empty object.
diff --git a/src/wp-includes/pomo/po.php b/src/wp-includes/pomo/po.php
index 667ff65567..cfd8084ac6 100644
--- a/src/wp-includes/pomo/po.php
+++ b/src/wp-includes/pomo/po.php
@@ -171,7 +171,7 @@ if ( ! class_exists( 'PO', false ) ) :
 				}
 			}
 
-			// Standardise the line endings on imported content, technically PO files shouldn't contain \r.
+			// Standardize the line endings on imported content, technically PO files shouldn't contain \r.
 			$unpoified = str_replace( array( "\r\n", "\r" ), "\n", $unpoified );
 
 			return $unpoified;
diff --git a/src/wp-includes/pomo/streams.php b/src/wp-includes/pomo/streams.php
index e95dc17076..6a971af065 100644
--- a/src/wp-includes/pomo/streams.php
+++ b/src/wp-includes/pomo/streams.php
@@ -217,11 +217,7 @@ if ( ! class_exists( 'POMO_FileReader', false ) ) :
 		 * @return string
 		 */
 		public function read_all() {
-			$all = '';
-			while ( ! $this->feof() ) {
-				$all .= $this->read( 4096 );
-			}
-			return $all;
+			return stream_get_contents( $this->_f );
 		}
 	}
 endif;
diff --git a/src/wp-includes/post-template.php b/src/wp-includes/post-template.php
index 64df897518..1c8b3ba600 100644
--- a/src/wp-includes/post-template.php
+++ b/src/wp-includes/post-template.php
@@ -1005,9 +1005,9 @@ function wp_link_pages( $args = '' ) {
 	 *
 	 * @since 3.6.0
 	 *
-	 * @param string $output HTML output of paginated posts' page links.
-	 * @param array  $args   An array of arguments. See wp_link_pages()
-	 *                       for information on accepted arguments.
+	 * @param string       $output HTML output of paginated posts' page links.
+	 * @param array|string $args   An array or query string of arguments. See wp_link_pages()
+	 *                             for information on accepted arguments.
 	 */
 	$html = apply_filters( 'wp_link_pages', $output, $args );
 
@@ -1521,26 +1521,26 @@ function wp_page_menu( $args = array() ) {
  * @param array $pages
  * @param int   $depth
  * @param int   $current_page
- * @param array $r
+ * @param array $args
  * @return string
  */
-function walk_page_tree( $pages, $depth, $current_page, $r ) {
-	if ( empty( $r['walker'] ) ) {
+function walk_page_tree( $pages, $depth, $current_page, $args ) {
+	if ( empty( $args['walker'] ) ) {
 		$walker = new Walker_Page;
 	} else {
 		/**
 		 * @var Walker $walker
 		 */
-		$walker = $r['walker'];
+		$walker = $args['walker'];
 	}
 
 	foreach ( (array) $pages as $page ) {
 		if ( $page->post_parent ) {
-			$r['pages_with_children'][ $page->post_parent ] = true;
+			$args['pages_with_children'][ $page->post_parent ] = true;
 		}
 	}
 
-	return $walker->walk( $pages, $depth, $r, $current_page );
+	return $walker->walk( $pages, $depth, $args, $current_page );
 }
 
 /**
@@ -1646,7 +1646,7 @@ function wp_get_attachment_link( $id = 0, $size = 'thumbnail', $permalink = fals
 	 * @since 5.1.0 Added the `$attr` parameter.
 	 *
 	 * @param string       $link_html The page link HTML output.
-	 * @param int          $id        Post ID.
+	 * @param int|WP_Post  $id        Post ID or object. Can be 0 for the current global post.
 	 * @param string|int[] $size      Requested image size. Can be any registered image size name, or
 	 *                                an array of width and height values in pixels (in that order).
 	 * @param bool         $permalink Whether to add permalink to image. Default false.
diff --git a/src/wp-includes/post-thumbnail-template.php b/src/wp-includes/post-thumbnail-template.php
index 79b9a55d3a..58315bc60f 100644
--- a/src/wp-includes/post-thumbnail-template.php
+++ b/src/wp-includes/post-thumbnail-template.php
@@ -186,6 +186,19 @@ function get_the_post_thumbnail( $post = null, $size = 'post-thumbnail', $attr =
 			update_post_thumbnail_cache();
 		}
 
+		// Get the 'loading' attribute value to use as default, taking precedence over the default from
+		// `wp_get_attachment_image()`.
+		$loading = wp_get_loading_attr_default( 'the_post_thumbnail' );
+
+		// Add the default to the given attributes unless they already include a 'loading' directive.
+		if ( empty( $attr ) ) {
+			$attr = array( 'loading' => $loading );
+		} elseif ( is_array( $attr ) && ! array_key_exists( 'loading', $attr ) ) {
+			$attr['loading'] = $loading;
+		} elseif ( is_string( $attr ) && ! preg_match( '/(^|&)loading=/', $attr ) ) {
+			$attr .= '&loading=' . $loading;
+		}
+
 		$html = wp_get_attachment_image( $post_thumbnail_id, $size, false, $attr );
 
 		/**
@@ -211,10 +224,10 @@ function get_the_post_thumbnail( $post = null, $size = 'post-thumbnail', $attr =
 	 *
 	 * @param string       $html              The post thumbnail HTML.
 	 * @param int          $post_id           The post ID.
-	 * @param int          $post_thumbnail_id The post thumbnail ID.
+	 * @param int          $post_thumbnail_id The post thumbnail ID, or 0 if there isn't one.
 	 * @param string|int[] $size              Requested image size. Can be any registered image size name, or
 	 *                                        an array of width and height values in pixels (in that order).
-	 * @param string       $attr              Query string of attributes.
+	 * @param string|array $attr              Query string or array of attributes.
 	 */
 	return apply_filters( 'post_thumbnail_html', $html, $post->ID, $post_thumbnail_id, $size, $attr );
 }
diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php
index 91edacf76f..51752b5070 100644
--- a/src/wp-includes/post.php
+++ b/src/wp-includes/post.php
@@ -126,16 +126,39 @@ function create_initial_post_types() {
 	register_post_type(
 		'nav_menu_item',
 		array(
-			'labels'           => array(
+			'labels'                => array(
 				'name'          => __( 'Navigation Menu Items' ),
 				'singular_name' => __( 'Navigation Menu Item' ),
 			),
-			'public'           => false,
-			'_builtin'         => true, /* internal use only. don't use this when registering your own post type. */
-			'hierarchical'     => false,
-			'rewrite'          => false,
-			'delete_with_user' => false,
-			'query_var'        => false,
+			'public'                => false,
+			'_builtin'              => true, /* internal use only. don't use this when registering your own post type. */
+			'hierarchical'          => false,
+			'rewrite'               => false,
+			'delete_with_user'      => false,
+			'query_var'             => false,
+			'map_meta_cap'          => true,
+			'capability_type'       => array( 'edit_theme_options', 'edit_theme_options' ),
+			'capabilities'          => array(
+				// Meta Capabilities.
+				'edit_post'              => 'edit_post',
+				'read_post'              => 'read_post',
+				'delete_post'            => 'delete_post',
+				// Primitive Capabilities.
+				'edit_posts'             => 'edit_theme_options',
+				'edit_others_posts'      => 'edit_theme_options',
+				'delete_posts'           => 'edit_theme_options',
+				'publish_posts'          => 'edit_theme_options',
+				'read_private_posts'     => 'edit_theme_options',
+				'read'                   => 'read',
+				'delete_private_posts'   => 'edit_theme_options',
+				'delete_published_posts' => 'edit_theme_options',
+				'delete_others_posts'    => 'edit_theme_options',
+				'edit_private_posts'     => 'edit_theme_options',
+				'edit_published_posts'   => 'edit_theme_options',
+			),
+			'show_in_rest'          => true,
+			'rest_base'             => 'menu-items',
+			'rest_controller_class' => 'WP_REST_Menu_Items_Controller',
 		)
 	);
 
@@ -310,14 +333,14 @@ function create_initial_post_types() {
 		'wp_template',
 		array(
 			'labels'                => array(
-				'name'                  => __( 'Templates' ),
-				'singular_name'         => __( 'Template' ),
+				'name'                  => _x( 'Templates', 'post type general name' ),
+				'singular_name'         => _x( 'Template', 'post type singular name' ),
 				'add_new'               => _x( 'Add New', 'Template' ),
 				'add_new_item'          => __( 'Add New Template' ),
 				'new_item'              => __( 'New Template' ),
 				'edit_item'             => __( 'Edit Template' ),
 				'view_item'             => __( 'View Template' ),
-				'all_items'             => __( 'All Templates' ),
+				'all_items'             => __( 'Templates' ),
 				'search_items'          => __( 'Search Templates' ),
 				'parent_item_colon'     => __( 'Parent Template:' ),
 				'not_found'             => __( 'No templates found.' ),
@@ -361,6 +384,149 @@ function create_initial_post_types() {
 				'excerpt',
 				'editor',
 				'revisions',
+				'author',
+			),
+		)
+	);
+
+	register_post_type(
+		'wp_template_part',
+		array(
+			'labels'                => array(
+				'name'                  => _x( 'Template Parts', 'post type general name' ),
+				'singular_name'         => _x( 'Template Part', 'post type singular name' ),
+				'add_new'               => _x( 'Add New', 'Template Part' ),
+				'add_new_item'          => __( 'Add New Template Part' ),
+				'new_item'              => __( 'New Template Part' ),
+				'edit_item'             => __( 'Edit Template Part' ),
+				'view_item'             => __( 'View Template Part' ),
+				'all_items'             => __( 'Template Parts' ),
+				'search_items'          => __( 'Search Template Parts' ),
+				'parent_item_colon'     => __( 'Parent Template Part:' ),
+				'not_found'             => __( 'No template parts found.' ),
+				'not_found_in_trash'    => __( 'No template parts found in Trash.' ),
+				'archives'              => __( 'Template part archives' ),
+				'insert_into_item'      => __( 'Insert into template part' ),
+				'uploaded_to_this_item' => __( 'Uploaded to this template part' ),
+				'filter_items_list'     => __( 'Filter template parts list' ),
+				'items_list_navigation' => __( 'Template parts list navigation' ),
+				'items_list'            => __( 'Template parts list' ),
+			),
+			'description'           => __( 'Template parts to include in your templates.' ),
+			'public'                => false,
+			'_builtin'              => true, /* internal use only. don't use this when registering your own post type. */
+			'has_archive'           => false,
+			'show_ui'               => false,
+			'show_in_menu'          => false,
+			'show_in_rest'          => true,
+			'rewrite'               => false,
+			'rest_base'             => 'template-parts',
+			'rest_controller_class' => 'WP_REST_Templates_Controller',
+			'map_meta_cap'          => true,
+			'capabilities'          => array(
+				'create_posts'           => 'edit_theme_options',
+				'delete_posts'           => 'edit_theme_options',
+				'delete_others_posts'    => 'edit_theme_options',
+				'delete_private_posts'   => 'edit_theme_options',
+				'delete_published_posts' => 'edit_theme_options',
+				'edit_posts'             => 'edit_theme_options',
+				'edit_others_posts'      => 'edit_theme_options',
+				'edit_private_posts'     => 'edit_theme_options',
+				'edit_published_posts'   => 'edit_theme_options',
+				'publish_posts'          => 'edit_theme_options',
+				'read'                   => 'edit_theme_options',
+				'read_private_posts'     => 'edit_theme_options',
+			),
+			'supports'              => array(
+				'title',
+				'slug',
+				'excerpt',
+				'editor',
+				'revisions',
+				'author',
+			),
+		)
+	);
+
+	register_post_type(
+		'wp_global_styles',
+		array(
+			'label'        => _x( 'Global Styles', 'post type general name' ),
+			'description'  => __( 'Global styles to include in themes.' ),
+			'public'       => false,
+			'_builtin'     => true, /* internal use only. don't use this when registering your own post type. */
+			'show_ui'      => false,
+			'show_in_rest' => false,
+			'rewrite'      => false,
+			'capabilities' => array(
+				'read'                   => 'edit_theme_options',
+				'create_posts'           => 'edit_theme_options',
+				'edit_posts'             => 'edit_theme_options',
+				'edit_published_posts'   => 'edit_theme_options',
+				'delete_published_posts' => 'edit_theme_options',
+				'edit_others_posts'      => 'edit_theme_options',
+				'delete_others_posts'    => 'edit_theme_options',
+			),
+			'map_meta_cap' => true,
+			'supports'     => array(
+				'title',
+				'editor',
+				'revisions',
+			),
+		)
+	);
+
+	register_post_type(
+		'wp_navigation',
+		array(
+			'labels'                => array(
+				'name'                  => _x( 'Navigation Menus', 'post type general name' ),
+				'singular_name'         => _x( 'Navigation Menu', 'post type singular name' ),
+				'add_new'               => _x( 'Add New', 'Navigation Menu' ),
+				'add_new_item'          => __( 'Add New Navigation Menu' ),
+				'new_item'              => __( 'New Navigation Menu' ),
+				'edit_item'             => __( 'Edit Navigation Menu' ),
+				'view_item'             => __( 'View Navigation Menu' ),
+				'all_items'             => __( 'Navigation Menus' ),
+				'search_items'          => __( 'Search Navigation Menus' ),
+				'parent_item_colon'     => __( 'Parent Navigation Menu:' ),
+				'not_found'             => __( 'No Navigation Menu found.' ),
+				'not_found_in_trash'    => __( 'No Navigation Menu found in Trash.' ),
+				'archives'              => __( 'Navigation Menu archives' ),
+				'insert_into_item'      => __( 'Insert into Navigation Menu' ),
+				'uploaded_to_this_item' => __( 'Uploaded to this Navigation Menu' ),
+				'filter_items_list'     => __( 'Filter Navigation Menu list' ),
+				'items_list_navigation' => __( 'Navigation Menus list navigation' ),
+				'items_list'            => __( 'Navigation Menus list' ),
+			),
+			'description'           => __( 'Navigation menus that can be inserted into your site.' ),
+			'public'                => false,
+			'_builtin'              => true, /* internal use only. don't use this when registering your own post type. */
+			'has_archive'           => false,
+			'show_ui'               => wp_is_block_theme(),
+			'show_in_menu'          => false,
+			'show_in_admin_bar'     => false,
+			'show_in_rest'          => true,
+			'rewrite'               => false,
+			'map_meta_cap'          => true,
+			'capabilities'          => array(
+				'edit_others_posts'      => 'edit_theme_options',
+				'delete_posts'           => 'edit_theme_options',
+				'publish_posts'          => 'edit_theme_options',
+				'create_posts'           => 'edit_theme_options',
+				'read_private_posts'     => 'edit_theme_options',
+				'delete_private_posts'   => 'edit_theme_options',
+				'delete_published_posts' => 'edit_theme_options',
+				'delete_others_posts'    => 'edit_theme_options',
+				'edit_private_posts'     => 'edit_theme_options',
+				'edit_published_posts'   => 'edit_theme_options',
+			),
+			'rest_base'             => 'navigation',
+			'rest_controller_class' => 'WP_REST_Posts_Controller',
+			'supports'              => array(
+				'title',
+				'editor',
+				'revisions',
 			),
 		)
 	);
@@ -1409,8 +1575,8 @@ function get_post_types( $args = array(), $output = 'names', $operator = 'and' )
  *     @type bool|string  $show_in_menu          Where to show the post type in the admin menu. To work, $show_ui
  *                                               must be true. If true, the post type is shown in its own top level
  *                                               menu. If false, no menu is shown. If a string of an existing top
- *                                               level menu (eg. 'tools.php' or 'edit.php?post_type=page'), the post
- *                                               type will be placed as a sub-menu of that.
+ *                                               level menu ('tools.php' or 'edit.php?post_type=page', for example), the
+ *                                               post type will be placed as a sub-menu of that.
  *                                               Default is value of $show_ui.
  *     @type bool         $show_in_nav_menus     Makes this post type available for selection in navigation menus.
  *                                               Default is value of $public.
@@ -2108,28 +2274,28 @@ function is_post_type_viewable( $post_type ) {
 	/**
 	 * Filters whether a post type is considered "viewable".
 	 *
+	 * The returned filtered value must be a boolean type to ensure
+	 * `is_post_type_viewable()` only returns a boolean. This strictness
+	 * is by design to maintain backwards-compatibility and guard against
+	 * potential type errors in PHP 8.1+. Non-boolean values (even falsey
+	 * and truthy values) will result in the function returning false.
+	 *
 	 * @since 5.9.0
 	 *
-	 * @param bool         $is_viewable Whether the post type is "viewable".
+	 * @param bool         $is_viewable Whether the post type is "viewable" (strict type).
 	 * @param WP_Post_Type $post_type   Post type object.
 	 */
-	$is_viewable = apply_filters( 'is_post_type_viewable', $is_viewable, $post_type );
-
-	// Make sure the filtered value is a boolean type before returning it.
-	if ( ! is_bool( $is_viewable ) ) {
-		return false;
-	}
-
-	return $is_viewable;
+	return true === apply_filters( 'is_post_type_viewable', $is_viewable, $post_type );
 }
 
 /**
  * Determine whether a post status is considered "viewable".
  *
- * For built-in post statuses such as publish and private, the 'public' value will be evaluted.
+ * For built-in post statuses such as publish and private, the 'public' value will be evaluated.
  * For all others, the 'publicly_queryable' value will be used.
  *
  * @since 5.7.0
+ * @since 5.9.0 Added `is_post_status_viewable` hook to filter the result.
  *
  * @param string|stdClass $post_status Post status name or object.
  * @return bool Whether the post status should be considered viewable.
@@ -2150,7 +2316,23 @@ function is_post_status_viewable( $post_status ) {
 		return false;
 	}
 
-	return $post_status->publicly_queryable || ( $post_status->_builtin && $post_status->public );
+	$is_viewable = $post_status->publicly_queryable || ( $post_status->_builtin && $post_status->public );
+
+	/**
+	 * Filters whether a post status is considered "viewable".
+	 *
+	 * The returned filtered value must be a boolean type to ensure
+	 * `is_post_status_viewable()` only returns a boolean. This strictness
+	 * is by design to maintain backwards-compatibility and guard against
+	 * potential type errors in PHP 8.1+. Non-boolean values (even falsey
+	 * and truthy values) will result in the function returning false.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param bool     $is_viewable Whether the post status is "viewable" (strict type).
+	 * @param stdClass $post_status Post status object.
+	 */
+	return true === apply_filters( 'is_post_status_viewable', $is_viewable, $post_status );
 }
 
 /**
@@ -2293,7 +2475,7 @@ function add_post_meta( $post_id, $meta_key, $meta_value, $unique = false ) {
  * @return bool True on success, false on failure.
  */
 function delete_post_meta( $post_id, $meta_key, $meta_value = '' ) {
-	// Make sure meta is added to the post, not a revision.
+	// Make sure meta is deleted from the post, not from a revision.
 	$the_post = wp_is_post_revision( $post_id );
 	if ( $the_post ) {
 		$post_id = $the_post;
@@ -2345,7 +2527,7 @@ function get_post_meta( $post_id, $key = '', $single = false ) {
  *                  is the same as the one that is already in the database.
  */
 function update_post_meta( $post_id, $meta_key, $meta_value, $prev_value = '' ) {
-	// Make sure meta is added to the post, not a revision.
+	// Make sure meta is updated for the post, not for a revision.
 	$the_post = wp_is_post_revision( $post_id );
 	if ( $the_post ) {
 		$post_id = $the_post;
@@ -4182,27 +4364,31 @@ function wp_insert_post( $postarr, $wp_error = false, $fire_after_hooks = true )
 		 * Filters attachment post data before it is updated in or added to the database.
 		 *
 		 * @since 3.9.0
-		 * @since 5.4.1 `$unsanitized_postarr` argument added.
+		 * @since 5.4.1 The `$unsanitized_postarr` parameter was added.
+		 * @since 6.0.0 The `$update` parameter was added.
 		 *
 		 * @param array $data                An array of slashed, sanitized, and processed attachment post data.
 		 * @param array $postarr             An array of slashed and sanitized attachment post data, but not processed.
 		 * @param array $unsanitized_postarr An array of slashed yet *unsanitized* and unprocessed attachment post data
 		 *                                   as originally passed to wp_insert_post().
+		 * @param bool  $update              Whether this is an existing attachment post being updated.
 		 */
-		$data = apply_filters( 'wp_insert_attachment_data', $data, $postarr, $unsanitized_postarr );
+		$data = apply_filters( 'wp_insert_attachment_data', $data, $postarr, $unsanitized_postarr, $update );
 	} else {
 		/**
 		 * Filters slashed post data just before it is inserted into the database.
 		 *
 		 * @since 2.7.0
-		 * @since 5.4.1 `$unsanitized_postarr` argument added.
+		 * @since 5.4.1 The `$unsanitized_postarr` parameter was added.
+		 * @since 6.0.0 The `$update` parameter was added.
 		 *
 		 * @param array $data                An array of slashed, sanitized, and processed post data.
 		 * @param array $postarr             An array of sanitized (and slashed) but otherwise unmodified post data.
 		 * @param array $unsanitized_postarr An array of slashed yet *unsanitized* and unprocessed post data as
 		 *                                   originally passed to wp_insert_post().
+		 * @param bool  $update              Whether this is an existing post being updated.
 		 */
-		$data = apply_filters( 'wp_insert_post_data', $data, $postarr, $unsanitized_postarr );
+		$data = apply_filters( 'wp_insert_post_data', $data, $postarr, $unsanitized_postarr, $update );
 	}
 
 	$data  = wp_unslash( $data );
@@ -4960,7 +5146,7 @@ function _truncate_post_slug( $slug, $length = 200 ) {
 		if ( $decoded_slug === $slug ) {
 			$slug = substr( $slug, 0, $length );
 		} else {
-			$slug = utf8_uri_encode( $decoded_slug, $length );
+			$slug = utf8_uri_encode( $decoded_slug, $length, true );
 		}
 	}
 
@@ -5183,11 +5369,13 @@ function wp_transition_post_status( $new_status, $old_status, $post ) {
 	 * transitioned to a status, use the {@see 'transition_post_status'} hook instead.
 	 *
 	 * @since 2.3.0
+	 * @since 5.9.0 Added `$old_status` parameter.
 	 *
-	 * @param int     $post_id Post ID.
-	 * @param WP_Post $post    Post object.
+	 * @param int     $post_id    Post ID.
+	 * @param WP_Post $post       Post object.
+	 * @param string  $old_status Old post status.
 	 */
-	do_action( "{$new_status}_{$post->post_type}", $post->ID, $post );
+	do_action( "{$new_status}_{$post->post_type}", $post->ID, $post, $old_status );
 }
 
 /**
@@ -7472,12 +7660,13 @@ function _publish_post_hook( $post_id ) {
  * Returns the ID of the post's parent.
  *
  * @since 3.1.0
+ * @since 5.9.0 The `$post` parameter was made optional.
  *
- * @param int|WP_Post $post Post ID or post object.
+ * @param int|WP_Post|null $post Optional. Post ID or post object. Defaults to global $post.
  * @return int|false Post parent ID (which can be 0 if there is no parent),
  *                   or false if the post does not exist.
  */
-function wp_get_post_parent_id( $post ) {
+function wp_get_post_parent_id( $post = null ) {
 	$post = get_post( $post );
 	if ( ! $post || is_wp_error( $post ) ) {
 		return false;
diff --git a/src/wp-includes/rest-api.php b/src/wp-includes/rest-api.php
index 28187154e7..a7cd0178b0 100644
--- a/src/wp-includes/rest-api.php
+++ b/src/wp-includes/rest-api.php
@@ -294,13 +294,17 @@ function create_initial_rest_routes() {
 	$controller->register_routes();
 
 	// Block Renderer.
-	$controller = new WP_REST_Block_Renderer_Controller;
+	$controller = new WP_REST_Block_Renderer_Controller();
 	$controller->register_routes();
 
 	// Block Types.
 	$controller = new WP_REST_Block_Types_Controller();
 	$controller->register_routes();
 
+	// Global Styles.
+	$controller = new WP_REST_Global_Styles_Controller;
+	$controller->register_routes();
+
 	// Settings.
 	$controller = new WP_REST_Settings_Controller;
 	$controller->register_routes();
@@ -341,6 +345,14 @@ function create_initial_rest_routes() {
 	// URL Details.
 	$controller = new WP_REST_URL_Details_Controller();
 	$controller->register_routes();
+
+	// Menu Locations.
+	$controller = new WP_REST_Menu_Locations_Controller();
+	$controller->register_routes();
+
+	// Site Editor Export.
+	$controller = new WP_REST_Edit_Site_Export_Controller();
+	$controller->register_routes();
 }
 
 /**
@@ -3044,7 +3056,8 @@ function rest_default_additional_properties_to_false( $schema ) {
  * @since 5.5.0
  *
  * @param int|WP_Post $post Post ID or post object.
- * @return string The route path with a leading slash for the given post, or an empty string if there is not a route.
+ * @return string The route path with a leading slash for the given post,
+ *                or an empty string if there is not a route.
  */
 function rest_get_route_for_post( $post ) {
 	$post = get_post( $post );
@@ -3077,7 +3090,8 @@ function rest_get_route_for_post( $post ) {
  * @since 5.9.0
  *
  * @param string $post_type The name of a registered post type.
- * @return string The route path with a leading slash for the given post type, or an empty string if there is not a route.
+ * @return string The route path with a leading slash for the given post type,
+ *                or an empty string if there is not a route.
  */
 function rest_get_route_for_post_type_items( $post_type ) {
 	$post_type = get_post_type_object( $post_type );
@@ -3110,7 +3124,8 @@ function rest_get_route_for_post_type_items( $post_type ) {
  * @since 5.5.0
  *
  * @param int|WP_Term $term Term ID or term object.
- * @return string The route path with a leading slash for the given term, or an empty string if there is not a route.
+ * @return string The route path with a leading slash for the given term,
+ *                or an empty string if there is not a route.
  */
 function rest_get_route_for_term( $term ) {
 	$term = get_term( $term );
diff --git a/src/wp-includes/rest-api/class-wp-rest-response.php b/src/wp-includes/rest-api/class-wp-rest-response.php
index 846b55f32c..cb890f5b0b 100644
--- a/src/wp-includes/rest-api/class-wp-rest-response.php
+++ b/src/wp-includes/rest-api/class-wp-rest-response.php
@@ -144,7 +144,7 @@ class WP_REST_Response extends WP_HTTP_Response {
 	 *
 	 * @param string $rel   Link relation. Either an IANA registered type, or an absolute URL.
 	 * @param string $link  Target IRI for the link.
-	 * @param array  $other Optional. Other parameters to send, as an assocative array.
+	 * @param array  $other Optional. Other parameters to send, as an associative array.
 	 *                      Default empty array.
 	 */
 	public function link_header( $rel, $link, $other = array() ) {
@@ -278,7 +278,7 @@ class WP_REST_Response extends WP_HTTP_Response {
 		 * `http://w.org/{rel}` would transform a `http://w.org/term` relation
 		 * into `example:term`.
 		 *
-		 * Well-behaved clients should expand and normalise these back to their
+		 * Well-behaved clients should expand and normalize these back to their
 		 * full URI relation, however some naive clients may not resolve these
 		 * correctly, so adding new CURIEs may break backward compatibility.
 		 *
diff --git a/src/wp-includes/rest-api/class-wp-rest-server.php b/src/wp-includes/rest-api/class-wp-rest-server.php
index 3585aa7656..a14c20cfa4 100644
--- a/src/wp-includes/rest-api/class-wp-rest-server.php
+++ b/src/wp-includes/rest-api/class-wp-rest-server.php
@@ -849,7 +849,7 @@ class WP_REST_Server {
 		 */
 		$endpoints = apply_filters( 'rest_endpoints', $endpoints );
 
-		// Normalise the endpoints.
+		// Normalize the endpoints.
 		$defaults = array(
 			'methods'       => '',
 			'accept_json'   => false,
@@ -1229,6 +1229,7 @@ class WP_REST_Server {
 		$response->add_link( 'help', 'https://developer.wordpress.org/rest-api/' );
 		$this->add_active_theme_link_to_index( $response );
 		$this->add_site_logo_to_index( $response );
+		$this->add_site_icon_to_index( $response );
 
 		/**
 		 * Filters the REST API root index data.
@@ -1275,6 +1276,7 @@ class WP_REST_Server {
 
 	/**
 	 * Exposes the site logo through the WordPress REST API.
+	 *
 	 * This is used for fetching this information when user has no rights
 	 * to update settings.
 	 *
@@ -1283,14 +1285,47 @@ class WP_REST_Server {
 	 * @param WP_REST_Response $response REST API response.
 	 */
 	protected function add_site_logo_to_index( WP_REST_Response $response ) {
-		$site_logo_id                = get_theme_mod( 'custom_logo' );
-		$response->data['site_logo'] = $site_logo_id;
-		if ( $site_logo_id ) {
+		$site_logo_id = get_theme_mod( 'custom_logo', 0 );
+
+		$this->add_image_to_index( $response, $site_logo_id, 'site_logo' );
+	}
+
+	/**
+	 * Exposes the site icon through the WordPress REST API.
+	 *
+	 * This is used for fetching this information when user has no rights
+	 * to update settings.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Response $response REST API response.
+	 */
+	protected function add_site_icon_to_index( WP_REST_Response $response ) {
+		$site_icon_id = get_option( 'site_icon', 0 );
+
+		$this->add_image_to_index( $response, $site_icon_id, 'site_icon' );
+	}
+
+	/**
+	 * Exposes an image through the WordPress REST API.
+	 * This is used for fetching this information when user has no rights
+	 * to update settings.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Response $response REST API response.
+	 * @param int              $image_id Image attachment ID.
+	 * @param string           $type     Type of Image.
+	 */
+	protected function add_image_to_index( WP_REST_Response $response, $image_id, $type ) {
+		$response->data[ $type ] = (int) $image_id;
+		if ( $image_id ) {
 			$response->add_link(
 				'https://api.w.org/featuredmedia',
-				rest_url( rest_get_route_for_post( $site_logo_id ) ),
+				rest_url( rest_get_route_for_post( $image_id ) ),
 				array(
 					'embeddable' => true,
+					'type'       => $type,
 				)
 			);
 		}
@@ -1362,11 +1397,11 @@ class WP_REST_Server {
 			}
 
 			/**
-			 * Filters the REST API endpoint data.
+			 * Filters the publicly-visible data for a single REST API route.
 			 *
 			 * @since 4.4.0
 			 *
-			 * @param WP_REST_Request $request Request data. The namespace is passed as the 'namespace' parameter.
+			 * @param array $data Publicly-visible data for the route.
 			 */
 			$available[ $route ] = apply_filters( 'rest_endpoints_description', $data );
 		}
@@ -1403,6 +1438,8 @@ class WP_REST_Server {
 			'endpoints' => array(),
 		);
 
+		$allow_batch = false;
+
 		if ( isset( $this->route_options[ $route ] ) ) {
 			$options = $this->route_options[ $route ];
 
@@ -1410,6 +1447,8 @@ class WP_REST_Server {
 				$data['namespace'] = $options['namespace'];
 			}
 
+			$allow_batch = isset( $options['allow_batch'] ) ? $options['allow_batch'] : false;
+
 			if ( isset( $options['schema'] ) && 'help' === $context ) {
 				$data['schema'] = call_user_func( $options['schema'] );
 			}
@@ -1430,6 +1469,12 @@ class WP_REST_Server {
 				'methods' => array_keys( $callback['methods'] ),
 			);
 
+			$callback_batch = isset( $callback['allow_batch'] ) ? $callback['allow_batch'] : $allow_batch;
+
+			if ( $callback_batch ) {
+				$endpoint_data['allow_batch'] = $callback_batch;
+			}
+
 			if ( isset( $callback['args'] ) ) {
 				$endpoint_data['args'] = array();
 
diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php
index ad6a89b234..423347a721 100644
--- a/src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php
+++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-attachments-controller.php
@@ -16,6 +16,14 @@
  */
 class WP_REST_Attachments_Controller extends WP_REST_Posts_Controller {
 
+	/**
+	 * Whether the controller supports batching.
+	 *
+	 * @since 5.9.0
+	 * @var false
+	 */
+	protected $allow_batch = false;
+
 	/**
 	 * Registers the routes for attachments.
 	 *
diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php
index d054a814d4..4e90f4fba2 100644
--- a/src/wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php
+++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php
@@ -106,7 +106,7 @@ class WP_REST_Block_Directory_Controller extends WP_REST_Controller {
 	}
 
 	/**
-	 * Parse block metadata for a block, and prepare it for an API repsonse.
+	 * Parse block metadata for a block, and prepare it for an API response.
 	 *
 	 * @since 5.5.0
 	 * @since 5.9.0 Renamed `$plugin` to `$item` to match parent class for PHP 8 named parameter support.
diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-blocks-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-blocks-controller.php
index 7d5237fb37..4a316685e1 100644
--- a/src/wp-includes/rest-api/endpoints/class-wp-rest-blocks-controller.php
+++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-blocks-controller.php
@@ -41,7 +41,7 @@ class WP_REST_Blocks_Controller extends WP_REST_Posts_Controller {
 	 *
 	 * @since 5.0.0
 	 *
-	 * @param array  $data    Response data to fiter.
+	 * @param array  $data    Response data to filter.
 	 * @param string $context Context defined in the schema.
 	 * @return array Filtered response.
 	 */
diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-edit-site-export-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-edit-site-export-controller.php
new file mode 100644
index 0000000000..d5abfa5682
--- /dev/null
+++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-edit-site-export-controller.php
@@ -0,0 +1,93 @@
+<?php
+/**
+ * REST API: WP_REST_Edit_Site_Export_Controller class
+ *
+ * @package    WordPress
+ * @subpackage REST_API
+ */
+
+/**
+ * Controller which provides REST endpoint for exporting current templates
+ * and template parts.
+ *
+ * @since 5.9.0
+ *
+ * @see WP_REST_Controller
+ */
+class WP_REST_Edit_Site_Export_Controller extends WP_REST_Controller {
+
+	/**
+	 * Constructor.
+	 *
+	 * @since 5.9.0
+	 */
+	public function __construct() {
+		$this->namespace = 'wp-block-editor/v1';
+		$this->rest_base = 'export';
+	}
+
+	/**
+	 * Registers the site export route.
+	 *
+	 * @since 5.9.0
+	 */
+	public function register_routes() {
+		register_rest_route(
+			$this->namespace,
+			'/' . $this->rest_base,
+			array(
+				array(
+					'methods'             => WP_REST_Server::READABLE,
+					'callback'            => array( $this, 'export' ),
+					'permission_callback' => array( $this, 'permissions_check' ),
+				),
+			)
+		);
+	}
+
+	/**
+	 * Checks whether a given request has permission to export.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @return WP_Error|true True if the request has access, or WP_Error object.
+	 */
+	public function permissions_check() {
+		if ( ! current_user_can( 'edit_theme_options' ) ) {
+			return new WP_Error(
+				'rest_cannot_export_templates',
+				__( 'Sorry, you are not allowed to export templates and template parts.' ),
+				array( 'status' => rest_authorization_required_code() )
+			);
+		}
+
+		return true;
+	}
+
+	/**
+	 * Output a ZIP file with an export of the current templates
+	 * and template parts from the site editor, and close the connection.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @return WP_Error|void
+	 */
+	public function export() {
+		// Generate the export file.
+		$filename = wp_generate_block_templates_export_file();
+
+		if ( is_wp_error( $filename ) ) {
+			$filename->add_data( array( 'status' => 500 ) );
+
+			return $filename;
+		}
+
+		header( 'Content-Type: application/zip' );
+		header( 'Content-Disposition: attachment; filename=edit-site-export.zip' );
+		header( 'Content-Length: ' . filesize( $filename ) );
+		flush();
+		readfile( $filename );
+		unlink( $filename );
+		exit;
+	}
+}
diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-controller.php
new file mode 100644
index 0000000000..d9ff86e1fa
--- /dev/null
+++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-controller.php
@@ -0,0 +1,585 @@
+<?php
+/**
+ * REST API: WP_REST_Global_Styles_Controller class
+ *
+ * @package    WordPress
+ * @subpackage REST_API
+ * @since 5.9.0
+ */
+
+/**
+ * Base Global Styles REST API Controller.
+ */
+class WP_REST_Global_Styles_Controller extends WP_REST_Controller {
+
+	/**
+	 * Post type.
+	 *
+	 * @since 5.9.0
+	 * @var string
+	 */
+	protected $post_type;
+
+	/**
+	 * Constructor.
+	 * @since 5.9.0
+	 */
+	public function __construct() {
+		$this->namespace = 'wp/v2';
+		$this->rest_base = 'global-styles';
+		$this->post_type = 'wp_global_styles';
+	}
+
+	/**
+	 * Registers the controllers routes.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @return void
+	 */
+	public function register_routes() {
+		// List themes global styles.
+		register_rest_route(
+			$this->namespace,
+			// The route.
+			sprintf(
+				'/%s/themes/(?P<stylesheet>%s)',
+				$this->rest_base,
+				// Matches theme's directory: `/themes/<subdirectory>/<theme>/` or `/themes/<theme>/`.
+				// Excludes invalid directory name characters: `/:<>*?"|`.
+				'[^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?'
+			),
+			array(
+				array(
+					'methods'             => WP_REST_Server::READABLE,
+					'callback'            => array( $this, 'get_theme_item' ),
+					'permission_callback' => array( $this, 'get_theme_item_permissions_check' ),
+					'args'                => array(
+						'stylesheet' => array(
+							'description'       => __( 'The theme identifier' ),
+							'type'              => 'string',
+							'sanitize_callback' => array( $this, '_sanitize_global_styles_callback' ),
+						),
+					),
+				),
+			)
+		);
+
+		// Lists/updates a single global style variation based on the given id.
+		register_rest_route(
+			$this->namespace,
+			'/' . $this->rest_base . '/(?P<id>[\/\w-]+)',
+			array(
+				array(
+					'methods'             => WP_REST_Server::READABLE,
+					'callback'            => array( $this, 'get_item' ),
+					'permission_callback' => array( $this, 'get_item_permissions_check' ),
+					'args'                => array(
+						'id' => array(
+							'description'       => __( 'The id of a template' ),
+							'type'              => 'string',
+							'sanitize_callback' => array( $this, '_sanitize_global_styles_callback' ),
+						),
+					),
+				),
+				array(
+					'methods'             => WP_REST_Server::EDITABLE,
+					'callback'            => array( $this, 'update_item' ),
+					'permission_callback' => array( $this, 'update_item_permissions_check' ),
+					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::EDITABLE ),
+				),
+				'schema' => array( $this, 'get_public_item_schema' ),
+			)
+		);
+	}
+
+	/**
+	 * Sanitize the global styles ID or stylesheet to decode endpoint.
+	 * For example, `wp/v2/global-styles/twentytwentytwo%200.4.0`
+	 * would be decoded to `twentytwentytwo 0.4.0`.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param string $id_or_stylesheet Global styles ID or stylesheet.
+	 * @return string Sanitized global styles ID or stylesheet.
+	 */
+	public function _sanitize_global_styles_callback( $id_or_stylesheet ) {
+		return urldecode( $id_or_stylesheet );
+	}
+
+	/**
+	 * Checks if a given request has access to read a single global style.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
+	 */
+	public function get_item_permissions_check( $request ) {
+		$post = $this->get_post( $request['id'] );
+		if ( is_wp_error( $post ) ) {
+			return $post;
+		}
+
+		if ( 'edit' === $request['context'] && $post && ! $this->check_update_permission( $post ) ) {
+			return new WP_Error(
+				'rest_forbidden_context',
+				__( 'Sorry, you are not allowed to edit this global style.' ),
+				array( 'status' => rest_authorization_required_code() )
+			);
+		}
+
+		if ( ! $this->check_read_permission( $post ) ) {
+			return new WP_Error(
+				'rest_cannot_view',
+				__( 'Sorry, you are not allowed to view this global style.' ),
+				array( 'status' => rest_authorization_required_code() )
+			);
+		}
+
+		return true;
+	}
+
+	/**
+	 * Checks if a global style can be read.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_Post $post Post object.
+	 * @return bool Whether the post can be read.
+	 */
+	protected function check_read_permission( $post ) {
+		return current_user_can( 'read_post', $post->ID );
+	}
+
+	/**
+	 * Returns the given global styles config.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request The request instance.
+	 *
+	 * @return WP_REST_Response|WP_Error
+	 */
+	public function get_item( $request ) {
+		$post = $this->get_post( $request['id'] );
+		if ( is_wp_error( $post ) ) {
+			return $post;
+		}
+
+		return $this->prepare_item_for_response( $post, $request );
+	}
+
+	/**
+	 * Checks if a given request has access to write a single global styles config.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return true|WP_Error True if the request has write access for the item, WP_Error object otherwise.
+	 */
+	public function update_item_permissions_check( $request ) {
+		$post = $this->get_post( $request['id'] );
+		if ( is_wp_error( $post ) ) {
+			return $post;
+		}
+
+		if ( $post && ! $this->check_update_permission( $post ) ) {
+			return new WP_Error(
+				'rest_cannot_edit',
+				__( 'Sorry, you are not allowed to edit this global style.' ),
+				array( 'status' => rest_authorization_required_code() )
+			);
+		}
+
+		return true;
+	}
+
+	/**
+	 * Checks if a global style can be edited.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_Post $post Post object.
+	 * @return bool Whether the post can be edited.
+	 */
+	protected function check_update_permission( $post ) {
+		return current_user_can( 'edit_post', $post->ID );
+	}
+
+	/**
+	 * Updates a single global style config.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
+	 */
+	public function update_item( $request ) {
+		$post_before = $this->get_post( $request['id'] );
+		if ( is_wp_error( $post_before ) ) {
+			return $post_before;
+		}
+
+		$changes = $this->prepare_item_for_database( $request );
+		$result  = wp_update_post( wp_slash( (array) $changes ), true, false );
+		if ( is_wp_error( $result ) ) {
+			return $result;
+		}
+
+		$post          = get_post( $request['id'] );
+		$fields_update = $this->update_additional_fields_for_object( $post, $request );
+		if ( is_wp_error( $fields_update ) ) {
+			return $fields_update;
+		}
+
+		wp_after_insert_post( $post, true, $post_before );
+
+		$response = $this->prepare_item_for_response( $post, $request );
+
+		return rest_ensure_response( $response );
+	}
+
+	/**
+	 * Prepares a single global styles config for update.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Request object.
+	 * @return stdClass Changes to pass to wp_update_post.
+	 */
+	protected function prepare_item_for_database( $request ) {
+		$changes     = new stdClass();
+		$changes->ID = $request['id'];
+
+		$post            = get_post( $request['id'] );
+		$existing_config = array();
+		if ( $post ) {
+			$existing_config     = json_decode( $post->post_content, true );
+			$json_decoding_error = json_last_error();
+			if ( JSON_ERROR_NONE !== $json_decoding_error || ! isset( $existing_config['isGlobalStylesUserThemeJSON'] ) ||
+				! $existing_config['isGlobalStylesUserThemeJSON'] ) {
+				$existing_config = array();
+			}
+		}
+
+		if ( isset( $request['styles'] ) || isset( $request['settings'] ) ) {
+			$config = array();
+			if ( isset( $request['styles'] ) ) {
+				$config['styles'] = $request['styles'];
+			} elseif ( isset( $existing_config['styles'] ) ) {
+				$config['styles'] = $existing_config['styles'];
+			}
+			if ( isset( $request['settings'] ) ) {
+				$config['settings'] = $request['settings'];
+			} elseif ( isset( $existing_config['settings'] ) ) {
+				$config['settings'] = $existing_config['settings'];
+			}
+			$config['isGlobalStylesUserThemeJSON'] = true;
+			$config['version']                     = WP_Theme_JSON::LATEST_SCHEMA;
+			$changes->post_content                 = wp_json_encode( $config );
+		}
+
+		// Post title.
+		if ( isset( $request['title'] ) ) {
+			if ( is_string( $request['title'] ) ) {
+				$changes->post_title = $request['title'];
+			} elseif ( ! empty( $request['title']['raw'] ) ) {
+				$changes->post_title = $request['title']['raw'];
+			}
+		}
+
+		return $changes;
+	}
+
+	/**
+	 * Prepare a global styles config output for response.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_Post         $post    Global Styles post object.
+	 * @param WP_REST_Request $request Request object.
+	 * @return WP_REST_Response Response object.
+	 */
+	public function prepare_item_for_response( $post, $request ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
+		$raw_config                       = json_decode( $post->post_content, true );
+		$is_global_styles_user_theme_json = isset( $raw_config['isGlobalStylesUserThemeJSON'] ) && true === $raw_config['isGlobalStylesUserThemeJSON'];
+		$config                           = array();
+		if ( $is_global_styles_user_theme_json ) {
+			$config = ( new WP_Theme_JSON( $raw_config, 'custom' ) )->get_raw_data();
+		}
+
+		// Base fields for every post.
+		$data   = array();
+		$fields = $this->get_fields_for_response( $request );
+
+		if ( rest_is_field_included( 'id', $fields ) ) {
+			$data['id'] = $post->ID;
+		}
+
+		if ( rest_is_field_included( 'title', $fields ) ) {
+			$data['title'] = array();
+		}
+		if ( rest_is_field_included( 'title.raw', $fields ) ) {
+			$data['title']['raw'] = $post->post_title;
+		}
+		if ( rest_is_field_included( 'title.rendered', $fields ) ) {
+			add_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );
+
+			$data['title']['rendered'] = get_the_title( $post->ID );
+
+			remove_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );
+		}
+
+		if ( rest_is_field_included( 'settings', $fields ) ) {
+			$data['settings'] = ! empty( $config['settings'] ) && $is_global_styles_user_theme_json ? $config['settings'] : new stdClass();
+		}
+
+		if ( rest_is_field_included( 'styles', $fields ) ) {
+			$data['styles'] = ! empty( $config['styles'] ) && $is_global_styles_user_theme_json ? $config['styles'] : new stdClass();
+		}
+
+		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+		$data    = $this->add_additional_fields_to_object( $data, $request );
+		$data    = $this->filter_response_by_context( $data, $context );
+
+		// Wrap the data in a response object.
+		$response = rest_ensure_response( $data );
+
+		$links = $this->prepare_links( $post->ID );
+		$response->add_links( $links );
+		if ( ! empty( $links['self']['href'] ) ) {
+			$actions = $this->get_available_actions();
+			$self    = $links['self']['href'];
+			foreach ( $actions as $rel ) {
+				$response->add_link( $rel, $self );
+			}
+		}
+
+		return $response;
+	}
+
+	/**
+	 * Get the post, if the ID is valid.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param int $id Supplied ID.
+	 * @return WP_Post|WP_Error Post object if ID is valid, WP_Error otherwise.
+	 */
+	protected function get_post( $id ) {
+		$error = new WP_Error(
+			'rest_global_styles_not_found',
+			__( 'No global styles config exist with that id.' ),
+			array( 'status' => 404 )
+		);
+
+		$id = (int) $id;
+		if ( $id <= 0 ) {
+			return $error;
+		}
+
+		$post = get_post( $id );
+		if ( empty( $post ) || empty( $post->ID ) || $this->post_type !== $post->post_type ) {
+			return $error;
+		}
+
+		return $post;
+	}
+
+
+	/**
+	 * Prepares links for the request.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param integer $id ID.
+	 * @return array Links for the given post.
+	 */
+	protected function prepare_links( $id ) {
+		$base = sprintf( '%s/%s', $this->namespace, $this->rest_base );
+
+		$links = array(
+			'self' => array(
+				'href' => rest_url( trailingslashit( $base ) . $id ),
+			),
+		);
+
+		return $links;
+	}
+
+	/**
+	 * Get the link relations available for the post and current user.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @return array List of link relations.
+	 */
+	protected function get_available_actions() {
+		$rels = array();
+
+		$post_type = get_post_type_object( $this->post_type );
+		if ( current_user_can( $post_type->cap->publish_posts ) ) {
+			$rels[] = 'https://api.w.org/action-publish';
+		}
+
+		return $rels;
+	}
+
+	/**
+	 * Overwrites the default protected title format.
+	 *
+	 * By default, WordPress will show password protected posts with a title of
+	 * "Protected: %s", as the REST API communicates the protected status of a post
+	 * in a machine readable format, we remove the "Protected: " prefix.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @return string Protected title format.
+	 */
+	public function protected_title_format() {
+		return '%s';
+	}
+
+	/**
+	 * Retrieves the query params for the global styles collection.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @return array Collection parameters.
+	 */
+	public function get_collection_params() {
+		return array();
+	}
+
+	/**
+	 * Retrieves the global styles type' schema, conforming to JSON Schema.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @return array Item schema data.
+	 */
+	public function get_item_schema() {
+		if ( $this->schema ) {
+			return $this->add_additional_fields_schema( $this->schema );
+		}
+
+		$schema = array(
+			'$schema'    => 'http://json-schema.org/draft-04/schema#',
+			'title'      => $this->post_type,
+			'type'       => 'object',
+			'properties' => array(
+				'id'       => array(
+					'description' => __( 'ID of global styles config.' ),
+					'type'        => 'string',
+					'context'     => array( 'embed', 'view', 'edit' ),
+					'readonly'    => true,
+				),
+				'styles'   => array(
+					'description' => __( 'Global styles.' ),
+					'type'        => array( 'object' ),
+					'context'     => array( 'view', 'edit' ),
+				),
+				'settings' => array(
+					'description' => __( 'Global settings.' ),
+					'type'        => array( 'object' ),
+					'context'     => array( 'view', 'edit' ),
+				),
+				'title'    => array(
+					'description' => __( 'Title of the global styles variation.' ),
+					'type'        => array( 'object', 'string' ),
+					'default'     => '',
+					'context'     => array( 'embed', 'view', 'edit' ),
+					'properties'  => array(
+						'raw'      => array(
+							'description' => __( 'Title for the global styles variation, as it exists in the database.' ),
+							'type'        => 'string',
+							'context'     => array( 'view', 'edit', 'embed' ),
+						),
+						'rendered' => array(
+							'description' => __( 'HTML title for the post, transformed for display.' ),
+							'type'        => 'string',
+							'context'     => array( 'view', 'edit', 'embed' ),
+							'readonly'    => true,
+						),
+					),
+				),
+			),
+		);
+
+		$this->schema = $schema;
+
+		return $this->add_additional_fields_schema( $this->schema );
+	}
+
+	/**
+	 * Checks if a given request has access to read a single theme global styles config.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return true|WP_Error True if the request has read access for the item, WP_Error object otherwise.
+	 */
+	public function get_theme_item_permissions_check( $request ) {
+		// Verify if the current user has edit_theme_options capability.
+		// This capability is required to edit/view/delete templates.
+		if ( ! current_user_can( 'edit_theme_options' ) ) {
+			return new WP_Error(
+				'rest_cannot_manage_global_styles',
+				__( 'Sorry, you are not allowed to access the global styles on this site.' ),
+				array(
+					'status' => rest_authorization_required_code(),
+				)
+			);
+		}
+
+		return true;
+	}
+
+	/**
+	 * Returns the given theme global styles config.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request The request instance.
+	 * @return WP_REST_Response|WP_Error
+	 */
+	public function get_theme_item( $request ) {
+		if ( wp_get_theme()->get_stylesheet() !== $request['stylesheet'] ) {
+			// This endpoint only supports the active theme for now.
+			return new WP_Error(
+				'rest_theme_not_found',
+				__( 'Theme not found.' ),
+				array( 'status' => 404 )
+			);
+		}
+
+		$theme  = WP_Theme_JSON_Resolver::get_merged_data( 'theme' );
+		$data   = array();
+		$fields = $this->get_fields_for_response( $request );
+
+		if ( rest_is_field_included( 'settings', $fields ) ) {
+			$data['settings'] = $theme->get_settings();
+		}
+
+		if ( rest_is_field_included( 'styles', $fields ) ) {
+			$data['styles'] = $theme->get_raw_data()['styles'];
+		}
+
+		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+		$data    = $this->add_additional_fields_to_object( $data, $request );
+		$data    = $this->filter_response_by_context( $data, $context );
+
+		$response = rest_ensure_response( $data );
+
+		$links = array(
+			'self' => array(
+				'href' => rest_url( sprintf( '%s/%s/themes/%s', $this->namespace, $this->rest_base, $request['stylesheet'] ) ),
+			),
+		);
+
+		$response->add_links( $links );
+
+		return $response;
+	}
+}
diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php
new file mode 100644
index 0000000000..f25be71bef
--- /dev/null
+++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php
@@ -0,0 +1,1021 @@
+<?php
+/**
+ * REST API: WP_REST_Menu_Items_Controller class
+ *
+ * @package WordPress
+ * @subpackage REST_API
+ * @since 5.9.0
+ */
+
+/**
+ * Core class to access nav items via the REST API.
+ *
+ * @since 5.9.0
+ *
+ * @see WP_REST_Posts_Controller
+ */
+class WP_REST_Menu_Items_Controller extends WP_REST_Posts_Controller {
+
+	/**
+	 * Get the nav menu item, if the ID is valid.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param int $id Supplied ID.
+	 * @return object|WP_Error Post object if ID is valid, WP_Error otherwise.
+	 */
+	protected function get_nav_menu_item( $id ) {
+		$post = $this->get_post( $id );
+		if ( is_wp_error( $post ) ) {
+			return $post;
+		}
+
+		return wp_setup_nav_menu_item( $post );
+	}
+
+	/**
+	 * Checks if a given request has access to read menu items.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return true|WP_Error True if the request has read access, WP_Error object otherwise.
+	 */
+	public function get_items_permissions_check( $request ) {
+		$has_permission = parent::get_items_permissions_check( $request );
+
+		if ( true !== $has_permission ) {
+			return $has_permission;
+		}
+
+		return $this->check_has_read_only_access( $request );
+	}
+
+	/**
+	 * Checks if a given request has access to read a menu item if they have access to edit them.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return bool|WP_Error True if the request has read access for the item, WP_Error object otherwise.
+	 */
+	public function get_item_permissions_check( $request ) {
+		$permission_check = parent::get_item_permissions_check( $request );
+
+		if ( true !== $permission_check ) {
+			return $permission_check;
+		}
+
+		return $this->check_has_read_only_access( $request );
+	}
+
+	/**
+	 * Checks whether the current user has read permission for the endpoint.
+	 *
+	 * This allows for any user that can `edit_theme_options` or edit any REST API available post type.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return bool|WP_Error Whether the current user has permission.
+	 */
+	protected function check_has_read_only_access( $request ) {
+		if ( current_user_can( 'edit_theme_options' ) ) {
+			return true;
+		}
+
+		if ( current_user_can( 'edit_posts' ) ) {
+			return true;
+		}
+
+		foreach ( get_post_types( array( 'show_in_rest' => true ), 'objects' ) as $post_type ) {
+			if ( current_user_can( $post_type->cap->edit_posts ) ) {
+				return true;
+			}
+		}
+
+		return new WP_Error(
+			'rest_cannot_view',
+			__( 'Sorry, you are not allowed to view menu items.' ),
+			array( 'status' => rest_authorization_required_code() )
+		);
+	}
+
+	/**
+	 * Creates a single post.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 *
+	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
+	 */
+	public function create_item( $request ) {
+		if ( ! empty( $request['id'] ) ) {
+			return new WP_Error( 'rest_post_exists', __( 'Cannot create existing post.' ), array( 'status' => 400 ) );
+		}
+
+		$prepared_nav_item = $this->prepare_item_for_database( $request );
+
+		if ( is_wp_error( $prepared_nav_item ) ) {
+			return $prepared_nav_item;
+		}
+		$prepared_nav_item = (array) $prepared_nav_item;
+
+		$nav_menu_item_id = wp_update_nav_menu_item( $prepared_nav_item['menu-id'], $prepared_nav_item['menu-item-db-id'], wp_slash( $prepared_nav_item ), false );
+		if ( is_wp_error( $nav_menu_item_id ) ) {
+			if ( 'db_insert_error' === $nav_menu_item_id->get_error_code() ) {
+				$nav_menu_item_id->add_data( array( 'status' => 500 ) );
+			} else {
+				$nav_menu_item_id->add_data( array( 'status' => 400 ) );
+			}
+
+			return $nav_menu_item_id;
+		}
+
+		$nav_menu_item = $this->get_nav_menu_item( $nav_menu_item_id );
+		if ( is_wp_error( $nav_menu_item ) ) {
+			$nav_menu_item->add_data( array( 'status' => 404 ) );
+
+			return $nav_menu_item;
+		}
+
+		/**
+		 * Fires after a single menu item is created or updated via the REST API.
+		 *
+		 * @since 5.9.0
+		 *
+		 * @param object          $nav_menu_item Inserted or updated menu item object.
+		 * @param WP_REST_Request $request       Request object.
+		 * @param bool            $creating      True when creating a menu item, false when updating.
+		 */
+		do_action( 'rest_insert_nav_menu_item', $nav_menu_item, $request, true );
+
+		$schema = $this->get_item_schema();
+
+		if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
+			$meta_update = $this->meta->update_value( $request['meta'], $nav_menu_item_id );
+
+			if ( is_wp_error( $meta_update ) ) {
+				return $meta_update;
+			}
+		}
+
+		$nav_menu_item = $this->get_nav_menu_item( $nav_menu_item_id );
+		$fields_update = $this->update_additional_fields_for_object( $nav_menu_item, $request );
+
+		if ( is_wp_error( $fields_update ) ) {
+			return $fields_update;
+		}
+
+		$request->set_param( 'context', 'edit' );
+
+		/**
+		 * Fires after a single menu item is completely created or updated via the REST API.
+		 *
+		 * @since 5.9.0
+		 *
+		 * @param object          $nav_menu_item Inserted or updated menu item object.
+		 * @param WP_REST_Request $request       Request object.
+		 * @param bool            $creating      True when creating a menu item, false when updating.
+		 */
+		do_action( 'rest_after_insert_nav_menu_item', $nav_menu_item, $request, true );
+
+		$post = get_post( $nav_menu_item_id );
+		wp_after_insert_post( $post, false, null );
+
+		$response = $this->prepare_item_for_response( $post, $request );
+		$response = rest_ensure_response( $response );
+
+		$response->set_status( 201 );
+		$response->header( 'Location', rest_url( sprintf( '%s/%s/%d', $this->namespace, $this->rest_base, $nav_menu_item_id ) ) );
+
+		return $response;
+	}
+
+	/**
+	 * Updates a single nav menu item.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 *
+	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
+	 */
+	public function update_item( $request ) {
+		$valid_check = $this->get_nav_menu_item( $request['id'] );
+		if ( is_wp_error( $valid_check ) ) {
+			return $valid_check;
+		}
+		$post_before       = get_post( $request['id'] );
+		$prepared_nav_item = $this->prepare_item_for_database( $request );
+
+		if ( is_wp_error( $prepared_nav_item ) ) {
+			return $prepared_nav_item;
+		}
+
+		$prepared_nav_item = (array) $prepared_nav_item;
+
+		$nav_menu_item_id = wp_update_nav_menu_item( $prepared_nav_item['menu-id'], $prepared_nav_item['menu-item-db-id'], wp_slash( $prepared_nav_item ), false );
+
+		if ( is_wp_error( $nav_menu_item_id ) ) {
+			if ( 'db_update_error' === $nav_menu_item_id->get_error_code() ) {
+				$nav_menu_item_id->add_data( array( 'status' => 500 ) );
+			} else {
+				$nav_menu_item_id->add_data( array( 'status' => 400 ) );
+			}
+
+			return $nav_menu_item_id;
+		}
+
+		$nav_menu_item = $this->get_nav_menu_item( $nav_menu_item_id );
+		if ( is_wp_error( $nav_menu_item ) ) {
+			$nav_menu_item->add_data( array( 'status' => 404 ) );
+
+			return $nav_menu_item;
+		}
+
+		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php */
+		do_action( 'rest_insert_nav_menu_item', $nav_menu_item, $request, false );
+
+		$schema = $this->get_item_schema();
+
+		if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
+			$meta_update = $this->meta->update_value( $request['meta'], $nav_menu_item->ID );
+
+			if ( is_wp_error( $meta_update ) ) {
+				return $meta_update;
+			}
+		}
+
+		$post          = get_post( $nav_menu_item_id );
+		$nav_menu_item = $this->get_nav_menu_item( $nav_menu_item_id );
+		$fields_update = $this->update_additional_fields_for_object( $nav_menu_item, $request );
+
+		if ( is_wp_error( $fields_update ) ) {
+			return $fields_update;
+		}
+
+		$request->set_param( 'context', 'edit' );
+
+		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-menu-items-controller.php */
+		do_action( 'rest_after_insert_nav_menu_item', $nav_menu_item, $request, false );
+
+		wp_after_insert_post( $post, true, $post_before );
+
+		$response = $this->prepare_item_for_response( get_post( $nav_menu_item_id ), $request );
+
+		return rest_ensure_response( $response );
+	}
+
+	/**
+	 * Deletes a single menu item.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return WP_REST_Response|WP_Error True on success, or WP_Error object on failure.
+	 */
+	public function delete_item( $request ) {
+		$menu_item = $this->get_nav_menu_item( $request['id'] );
+		if ( is_wp_error( $menu_item ) ) {
+			return $menu_item;
+		}
+
+		// We don't support trashing for menu items.
+		if ( ! $request['force'] ) {
+			/* translators: %s: force=true */
+			return new WP_Error( 'rest_trash_not_supported', sprintf( __( "Menu items do not support trashing. Set '%s' to delete." ), 'force=true' ), array( 'status' => 501 ) );
+		}
+
+		$previous = $this->prepare_item_for_response( get_post( $request['id'] ), $request );
+
+		$result = wp_delete_post( $request['id'], true );
+
+		if ( ! $result ) {
+			return new WP_Error( 'rest_cannot_delete', __( 'The post cannot be deleted.' ), array( 'status' => 500 ) );
+		}
+
+		$response = new WP_REST_Response();
+		$response->set_data(
+			array(
+				'deleted'  => true,
+				'previous' => $previous->get_data(),
+			)
+		);
+
+		/**
+		 * Fires immediately after a single menu item is deleted via the REST API.
+		 *
+		 * @since 5.9.0
+		 *
+		 * @param object          $nav_menu_item Inserted or updated menu item object.
+		 * @param WP_REST_Response $response The response data.
+		 * @param WP_REST_Request $request       Request object.
+		 */
+		do_action( 'rest_delete_nav_menu_item', $menu_item, $response, $request );
+
+		return $response;
+	}
+
+	/**
+	 * Prepares a single post for create or update.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Request object.
+	 *
+	 * @return object|WP_Error
+	 */
+	protected function prepare_item_for_database( $request ) {
+		$menu_item_db_id = $request['id'];
+		$menu_item_obj   = $this->get_nav_menu_item( $menu_item_db_id );
+		// Need to persist the menu item data. See https://core.trac.wordpress.org/ticket/28138
+		if ( ! is_wp_error( $menu_item_obj ) ) {
+			// Correct the menu position if this was the first item. See https://core.trac.wordpress.org/ticket/28140
+			$position = ( 0 === $menu_item_obj->menu_order ) ? 1 : $menu_item_obj->menu_order;
+
+			$prepared_nav_item = array(
+				'menu-item-db-id'       => $menu_item_db_id,
+				'menu-item-object-id'   => $menu_item_obj->object_id,
+				'menu-item-object'      => $menu_item_obj->object,
+				'menu-item-parent-id'   => $menu_item_obj->menu_item_parent,
+				'menu-item-position'    => $position,
+				'menu-item-type'        => $menu_item_obj->type,
+				'menu-item-title'       => $menu_item_obj->title,
+				'menu-item-url'         => $menu_item_obj->url,
+				'menu-item-description' => $menu_item_obj->description,
+				'menu-item-attr-title'  => $menu_item_obj->attr_title,
+				'menu-item-target'      => $menu_item_obj->target,
+				'menu-item-classes'     => $menu_item_obj->classes,
+				// Stored in the database as a string.
+				'menu-item-xfn'         => explode( ' ', $menu_item_obj->xfn ),
+				'menu-item-status'      => $menu_item_obj->post_status,
+				'menu-id'               => $this->get_menu_id( $menu_item_db_id ),
+			);
+		} else {
+			$prepared_nav_item = array(
+				'menu-id'               => 0,
+				'menu-item-db-id'       => 0,
+				'menu-item-object-id'   => 0,
+				'menu-item-object'      => '',
+				'menu-item-parent-id'   => 0,
+				'menu-item-position'    => 1,
+				'menu-item-type'        => 'custom',
+				'menu-item-title'       => '',
+				'menu-item-url'         => '',
+				'menu-item-description' => '',
+				'menu-item-attr-title'  => '',
+				'menu-item-target'      => '',
+				'menu-item-classes'     => array(),
+				'menu-item-xfn'         => array(),
+				'menu-item-status'      => 'publish',
+			);
+		}
+
+		$mapping = array(
+			'menu-item-db-id'       => 'id',
+			'menu-item-object-id'   => 'object_id',
+			'menu-item-object'      => 'object',
+			'menu-item-parent-id'   => 'parent',
+			'menu-item-position'    => 'menu_order',
+			'menu-item-type'        => 'type',
+			'menu-item-url'         => 'url',
+			'menu-item-description' => 'description',
+			'menu-item-attr-title'  => 'attr_title',
+			'menu-item-target'      => 'target',
+			'menu-item-classes'     => 'classes',
+			'menu-item-xfn'         => 'xfn',
+			'menu-item-status'      => 'status',
+		);
+
+		$schema = $this->get_item_schema();
+
+		foreach ( $mapping as $original => $api_request ) {
+			if ( isset( $request[ $api_request ] ) ) {
+				$prepared_nav_item[ $original ] = $request[ $api_request ];
+			}
+		}
+
+		$taxonomy = get_taxonomy( 'nav_menu' );
+		$base     = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;
+		// If menus submitted, cast to int.
+		if ( ! empty( $request[ $base ] ) ) {
+			$prepared_nav_item['menu-id'] = absint( $request[ $base ] );
+		}
+
+		// Nav menu title.
+		if ( ! empty( $schema['properties']['title'] ) && isset( $request['title'] ) ) {
+			if ( is_string( $request['title'] ) ) {
+				$prepared_nav_item['menu-item-title'] = $request['title'];
+			} elseif ( ! empty( $request['title']['raw'] ) ) {
+				$prepared_nav_item['menu-item-title'] = $request['title']['raw'];
+			}
+		}
+
+		$error = new WP_Error();
+
+		// Check if object id exists before saving.
+		if ( ! $prepared_nav_item['menu-item-object'] ) {
+			// If taxonomy, check if term exists.
+			if ( 'taxonomy' === $prepared_nav_item['menu-item-type'] ) {
+				$original = get_term( absint( $prepared_nav_item['menu-item-object-id'] ) );
+				if ( empty( $original ) || is_wp_error( $original ) ) {
+					$error->add( 'rest_term_invalid_id', __( 'Invalid term ID.' ), array( 'status' => 400 ) );
+				} else {
+					$prepared_nav_item['menu-item-object'] = get_term_field( 'taxonomy', $original );
+				}
+				// If post, check if post object exists.
+			} elseif ( 'post_type' === $prepared_nav_item['menu-item-type'] ) {
+				$original = get_post( absint( $prepared_nav_item['menu-item-object-id'] ) );
+				if ( empty( $original ) ) {
+					$error->add( 'rest_post_invalid_id', __( 'Invalid post ID.' ), array( 'status' => 400 ) );
+				} else {
+					$prepared_nav_item['menu-item-object'] = get_post_type( $original );
+				}
+			}
+		}
+
+		// If post type archive, check if post type exists.
+		if ( 'post_type_archive' === $prepared_nav_item['menu-item-type'] ) {
+			$post_type = $prepared_nav_item['menu-item-object'] ? $prepared_nav_item['menu-item-object'] : false;
+			$original  = get_post_type_object( $post_type );
+			if ( ! $original ) {
+				$error->add( 'rest_post_invalid_type', __( 'Invalid post type.' ), array( 'status' => 400 ) );
+			}
+		}
+
+		// Check if menu item is type custom, then title and url are required.
+		if ( 'custom' === $prepared_nav_item['menu-item-type'] ) {
+			if ( '' === $prepared_nav_item['menu-item-title'] ) {
+				$error->add( 'rest_title_required', __( 'The title is required when using a custom menu item type.' ), array( 'status' => 400 ) );
+			}
+			if ( empty( $prepared_nav_item['menu-item-url'] ) ) {
+				$error->add( 'rest_url_required', __( 'The url is required when using a custom menu item type.' ), array( 'status' => 400 ) );
+			}
+		}
+
+		if ( $error->has_errors() ) {
+			return $error;
+		}
+
+		// The xfn and classes properties are arrays, but passed to wp_update_nav_menu_item as a string.
+		foreach ( array( 'menu-item-xfn', 'menu-item-classes' ) as $key ) {
+			$prepared_nav_item[ $key ] = implode( ' ', $prepared_nav_item[ $key ] );
+		}
+
+		// Only draft / publish are valid post status for menu items.
+		if ( 'publish' !== $prepared_nav_item['menu-item-status'] ) {
+			$prepared_nav_item['menu-item-status'] = 'draft';
+		}
+
+		$prepared_nav_item = (object) $prepared_nav_item;
+
+		/**
+		 * Filters a menu item before it is inserted via the REST API.
+		 *
+		 * @since 5.9.0
+		 *
+		 * @param object          $prepared_nav_item An object representing a single menu item prepared
+		 *                                           for inserting or updating the database.
+		 * @param WP_REST_Request $request           Request object.
+		 */
+		return apply_filters( 'rest_pre_insert_nav_menu_item', $prepared_nav_item, $request );
+	}
+
+	/**
+	 * Prepares a single post output for response.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_Post          $item   Post object.
+	 * @param WP_REST_Request $request Request object.
+	 * @return WP_REST_Response Response object.
+	 */
+	public function prepare_item_for_response( $item, $request ) {
+		// Base fields for every post.
+		$fields    = $this->get_fields_for_response( $request );
+		$menu_item = $this->get_nav_menu_item( $item->ID );
+		$data      = array();
+
+		if ( rest_is_field_included( 'id', $fields ) ) {
+			$data['id'] = $menu_item->ID;
+		}
+
+		if ( rest_is_field_included( 'title', $fields ) ) {
+			$data['title'] = array();
+		}
+
+		if ( rest_is_field_included( 'title.raw', $fields ) ) {
+			$data['title']['raw'] = $menu_item->title;
+		}
+
+		if ( rest_is_field_included( 'title.rendered', $fields ) ) {
+			add_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );
+
+			/** This filter is documented in wp-includes/post-template.php */
+			$title = apply_filters( 'the_title', $menu_item->title, $menu_item->ID );
+
+			$data['title']['rendered'] = $title;
+
+			remove_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );
+		}
+
+		if ( rest_is_field_included( 'status', $fields ) ) {
+			$data['status'] = $menu_item->post_status;
+		}
+
+		if ( rest_is_field_included( 'url', $fields ) ) {
+			$data['url'] = $menu_item->url;
+		}
+
+		if ( rest_is_field_included( 'attr_title', $fields ) ) {
+			// Same as post_excerpt.
+			$data['attr_title'] = $menu_item->attr_title;
+		}
+
+		if ( rest_is_field_included( 'description', $fields ) ) {
+			// Same as post_content.
+			$data['description'] = $menu_item->description;
+		}
+
+		if ( rest_is_field_included( 'type', $fields ) ) {
+			$data['type'] = $menu_item->type;
+		}
+
+		if ( rest_is_field_included( 'type_label', $fields ) ) {
+			$data['type_label'] = $menu_item->type_label;
+		}
+
+		if ( rest_is_field_included( 'object', $fields ) ) {
+			$data['object'] = $menu_item->object;
+		}
+
+		if ( rest_is_field_included( 'object_id', $fields ) ) {
+			// It is stored as a string, but should be exposed as an integer.
+			$data['object_id'] = absint( $menu_item->object_id );
+		}
+
+		if ( rest_is_field_included( 'parent', $fields ) ) {
+			// Same as post_parent, exposed as an integer.
+			$data['parent'] = (int) $menu_item->menu_item_parent;
+		}
+
+		if ( rest_is_field_included( 'menu_order', $fields ) ) {
+			// Same as post_parent, exposed as an integer.
+			$data['menu_order'] = (int) $menu_item->menu_order;
+		}
+
+		if ( rest_is_field_included( 'target', $fields ) ) {
+			$data['target'] = $menu_item->target;
+		}
+
+		if ( rest_is_field_included( 'classes', $fields ) ) {
+			$data['classes'] = (array) $menu_item->classes;
+		}
+
+		if ( rest_is_field_included( 'xfn', $fields ) ) {
+			$data['xfn'] = array_map( 'sanitize_html_class', explode( ' ', $menu_item->xfn ) );
+		}
+
+		if ( rest_is_field_included( 'invalid', $fields ) ) {
+			$data['invalid'] = (bool) $menu_item->_invalid;
+		}
+
+		if ( rest_is_field_included( 'meta', $fields ) ) {
+			$data['meta'] = $this->meta->get_value( $menu_item->ID, $request );
+		}
+
+		$taxonomies = wp_list_filter( get_object_taxonomies( $this->post_type, 'objects' ), array( 'show_in_rest' => true ) );
+
+		foreach ( $taxonomies as $taxonomy ) {
+			$base = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;
+
+			if ( rest_is_field_included( $base, $fields ) ) {
+				$terms = get_the_terms( $item, $taxonomy->name );
+				if ( ! is_array( $terms ) ) {
+					continue;
+				}
+				$term_ids = $terms ? array_values( wp_list_pluck( $terms, 'term_id' ) ) : array();
+				if ( 'nav_menu' === $taxonomy->name ) {
+					$data[ $base ] = $term_ids ? array_shift( $term_ids ) : 0;
+				} else {
+					$data[ $base ] = $term_ids;
+				}
+			}
+		}
+
+		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+		$data    = $this->add_additional_fields_to_object( $data, $request );
+		$data    = $this->filter_response_by_context( $data, $context );
+
+		// Wrap the data in a response object.
+		$response = rest_ensure_response( $data );
+
+		$links = $this->prepare_links( $item );
+		$response->add_links( $links );
+
+		if ( ! empty( $links['self']['href'] ) ) {
+			$actions = $this->get_available_actions( $item, $request );
+
+			$self = $links['self']['href'];
+
+			foreach ( $actions as $rel ) {
+				$response->add_link( $rel, $self );
+			}
+		}
+
+		/**
+		 * Filters the menu item data for a REST API response.
+		 *
+		 * @since 5.9.0
+		 *
+		 * @param WP_REST_Response $response  The response object.
+		 * @param object           $menu_item Menu item setup by {@see wp_setup_nav_menu_item()}.
+		 * @param WP_REST_Request  $request   Request object.
+		 */
+		return apply_filters( 'rest_prepare_nav_menu_item', $response, $menu_item, $request );
+	}
+
+	/**
+	 * Prepares links for the request.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_Post $post Post object.
+	 * @return array Links for the given post.
+	 */
+	protected function prepare_links( $post ) {
+		$links     = parent::prepare_links( $post );
+		$menu_item = $this->get_nav_menu_item( $post->ID );
+
+		if ( empty( $menu_item->object_id ) ) {
+			return $links;
+		}
+
+		$path = '';
+		$type = '';
+		$key  = $menu_item->type;
+		if ( 'post_type' === $menu_item->type ) {
+			$path = rest_get_route_for_post( $menu_item->object_id );
+			$type = get_post_type( $menu_item->object_id );
+		} elseif ( 'taxonomy' === $menu_item->type ) {
+			$path = rest_get_route_for_term( $menu_item->object_id );
+			$type = get_term_field( 'taxonomy', $menu_item->object_id );
+		}
+
+		if ( $path && $type ) {
+			$links['https://api.w.org/menu-item-object'][] = array(
+				'href'       => rest_url( $path ),
+				$key         => $type,
+				'embeddable' => true,
+			);
+		}
+
+		return $links;
+	}
+
+	/**
+	 * Retrieve Link Description Objects that should be added to the Schema for the posts collection.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @return array
+	 */
+	protected function get_schema_links() {
+		$links   = parent::get_schema_links();
+		$href    = rest_url( "{$this->namespace}/{$this->rest_base}/{id}" );
+		$links[] = array(
+			'rel'          => 'https://api.w.org/menu-item-object',
+			'title'        => __( 'Get linked object.' ),
+			'href'         => $href,
+			'targetSchema' => array(
+				'type'       => 'object',
+				'properties' => array(
+					'object' => array(
+						'type' => 'integer',
+					),
+				),
+			),
+		);
+
+		return $links;
+	}
+
+	/**
+	 * Retrieves the term's schema, conforming to JSON Schema.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @return array Item schema data.
+	 */
+	public function get_item_schema() {
+		$schema = array(
+			'$schema' => 'http://json-schema.org/draft-04/schema#',
+			'title'   => $this->post_type,
+			'type'    => 'object',
+		);
+
+		$schema['properties']['title'] = array(
+			'description' => __( 'The title for the object.' ),
+			'type'        => array( 'string', 'object' ),
+			'context'     => array( 'view', 'edit', 'embed' ),
+			'properties'  => array(
+				'raw'      => array(
+					'description' => __( 'Title for the object, as it exists in the database.' ),
+					'type'        => 'string',
+					'context'     => array( 'edit' ),
+				),
+				'rendered' => array(
+					'description' => __( 'HTML title for the object, transformed for display.' ),
+					'type'        => 'string',
+					'context'     => array( 'view', 'edit', 'embed' ),
+					'readonly'    => true,
+				),
+			),
+		);
+
+		$schema['properties']['id'] = array(
+			'description' => __( 'Unique identifier for the object.' ),
+			'type'        => 'integer',
+			'default'     => 0,
+			'minimum'     => 0,
+			'context'     => array( 'view', 'edit', 'embed' ),
+			'readonly'    => true,
+		);
+
+		$schema['properties']['type_label'] = array(
+			'description' => __( 'Name of type.' ),
+			'type'        => 'string',
+			'context'     => array( 'view', 'edit', 'embed' ),
+			'readonly'    => true,
+		);
+
+		$schema['properties']['type'] = array(
+			'description' => __( 'The family of objects originally represented, such as "post_type" or "taxonomy".' ),
+			'type'        => 'string',
+			'enum'        => array( 'taxonomy', 'post_type', 'post_type_archive', 'custom' ),
+			'context'     => array( 'view', 'edit', 'embed' ),
+			'default'     => 'custom',
+		);
+
+		$schema['properties']['status'] = array(
+			'description' => __( 'A named status for the object.' ),
+			'type'        => 'string',
+			'enum'        => array_keys( get_post_stati( array( 'internal' => false ) ) ),
+			'default'     => 'publish',
+			'context'     => array( 'view', 'edit', 'embed' ),
+		);
+
+		$schema['properties']['parent'] = array(
+			'description' => __( 'The ID for the parent of the object.' ),
+			'type'        => 'integer',
+			'minimum'     => 0,
+			'default'     => 0,
+			'context'     => array( 'view', 'edit', 'embed' ),
+		);
+
+		$schema['properties']['attr_title'] = array(
+			'description' => __( 'Text for the title attribute of the link element for this menu item.' ),
+			'type'        => 'string',
+			'context'     => array( 'view', 'edit', 'embed' ),
+			'arg_options' => array(
+				'sanitize_callback' => 'sanitize_text_field',
+			),
+		);
+
+		$schema['properties']['classes'] = array(
+			'description' => __( 'Class names for the link element of this menu item.' ),
+			'type'        => 'array',
+			'items'       => array(
+				'type' => 'string',
+			),
+			'context'     => array( 'view', 'edit', 'embed' ),
+			'arg_options' => array(
+				'sanitize_callback' => function ( $value ) {
+					return array_map( 'sanitize_html_class', wp_parse_list( $value ) );
+				},
+			),
+		);
+
+		$schema['properties']['description'] = array(
+			'description' => __( 'The description of this menu item.' ),
+			'type'        => 'string',
+			'context'     => array( 'view', 'edit', 'embed' ),
+			'arg_options' => array(
+				'sanitize_callback' => 'sanitize_text_field',
+			),
+		);
+
+		$schema['properties']['menu_order'] = array(
+			'description' => __( 'The DB ID of the nav_menu_item that is this item\'s menu parent, if any, otherwise 0.' ),
+			'context'     => array( 'view', 'edit', 'embed' ),
+			'type'        => 'integer',
+			'minimum'     => 1,
+			'default'     => 1,
+		);
+
+		$schema['properties']['object'] = array(
+			'description' => __( 'The type of object originally represented, such as "category", "post", or "attachment".' ),
+			'context'     => array( 'view', 'edit', 'embed' ),
+			'type'        => 'string',
+			'arg_options' => array(
+				'sanitize_callback' => 'sanitize_key',
+			),
+		);
+
+		$schema['properties']['object_id'] = array(
+			'description' => __( 'The database ID of the original object this menu item represents, for example the ID for posts or the term_id for categories.' ),
+			'context'     => array( 'view', 'edit', 'embed' ),
+			'type'        => 'integer',
+			'minimum'     => 0,
+			'default'     => 0,
+		);
+
+		$schema['properties']['target'] = array(
+			'description' => __( 'The target attribute of the link element for this menu item.' ),
+			'type'        => 'string',
+			'context'     => array( 'view', 'edit', 'embed' ),
+			'enum'        => array(
+				'_blank',
+				'',
+			),
+		);
+
+		$schema['properties']['type_label'] = array(
+			'description' => __( 'The singular label used to describe this type of menu item.' ),
+			'context'     => array( 'view', 'edit', 'embed' ),
+			'type'        => 'string',
+			'readonly'    => true,
+		);
+
+		$schema['properties']['url'] = array(
+			'description' => __( 'The URL to which this menu item points.' ),
+			'type'        => 'string',
+			'format'      => 'uri',
+			'context'     => array( 'view', 'edit', 'embed' ),
+			'arg_options' => array(
+				'validate_callback' => static function ( $url ) {
+					if ( '' === $url ) {
+						return true;
+					}
+
+					if ( esc_url_raw( $url ) ) {
+						return true;
+					}
+
+					return new WP_Error(
+						'rest_invalid_url',
+						__( 'Invalid URL.' )
+					);
+				},
+			),
+		);
+
+		$schema['properties']['xfn'] = array(
+			'description' => __( 'The XFN relationship expressed in the link of this menu item.' ),
+			'type'        => 'array',
+			'items'       => array(
+				'type' => 'string',
+			),
+			'context'     => array( 'view', 'edit', 'embed' ),
+			'arg_options' => array(
+				'sanitize_callback' => function ( $value ) {
+					return array_map( 'sanitize_html_class', wp_parse_list( $value ) );
+				},
+			),
+		);
+
+		$schema['properties']['invalid'] = array(
+			'description' => __( 'Whether the menu item represents an object that no longer exists.' ),
+			'context'     => array( 'view', 'edit', 'embed' ),
+			'type'        => 'boolean',
+			'readonly'    => true,
+		);
+
+		$taxonomies = wp_list_filter( get_object_taxonomies( $this->post_type, 'objects' ), array( 'show_in_rest' => true ) );
+
+		foreach ( $taxonomies as $taxonomy ) {
+			$base                          = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;
+			$schema['properties'][ $base ] = array(
+				/* translators: %s: taxonomy name */
+				'description' => sprintf( __( 'The terms assigned to the object in the %s taxonomy.' ), $taxonomy->name ),
+				'type'        => 'array',
+				'items'       => array(
+					'type' => 'integer',
+				),
+				'context'     => array( 'view', 'edit' ),
+			);
+
+			if ( 'nav_menu' === $taxonomy->name ) {
+				$schema['properties'][ $base ]['type'] = 'integer';
+				unset( $schema['properties'][ $base ]['items'] );
+			}
+		}
+
+		$schema['properties']['meta'] = $this->meta->get_field_schema();
+
+		$schema_links = $this->get_schema_links();
+
+		if ( $schema_links ) {
+			$schema['links'] = $schema_links;
+		}
+
+		return $this->add_additional_fields_schema( $schema );
+	}
+
+	/**
+	 * Retrieves the query params for the posts collection.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @return array Collection parameters.
+	 */
+	public function get_collection_params() {
+		$query_params = parent::get_collection_params();
+
+		$query_params['menu_order'] = array(
+			'description' => __( 'Limit result set to posts with a specific menu_order value.' ),
+			'type'        => 'integer',
+		);
+
+		$query_params['order'] = array(
+			'description' => __( 'Order sort attribute ascending or descending.' ),
+			'type'        => 'string',
+			'default'     => 'asc',
+			'enum'        => array( 'asc', 'desc' ),
+		);
+
+		$query_params['orderby'] = array(
+			'description' => __( 'Sort collection by object attribute.' ),
+			'type'        => 'string',
+			'default'     => 'menu_order',
+			'enum'        => array(
+				'author',
+				'date',
+				'id',
+				'include',
+				'modified',
+				'parent',
+				'relevance',
+				'slug',
+				'include_slugs',
+				'title',
+				'menu_order',
+			),
+		);
+		// Change default to 100 items.
+		$query_params['per_page']['default'] = 100;
+
+		return $query_params;
+	}
+
+	/**
+	 * Determines the allowed query_vars for a get_items() response and prepares
+	 * them for WP_Query.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array           $prepared_args Optional. Prepared WP_Query arguments. Default empty array.
+	 * @param WP_REST_Request $request       Optional. Full details about the request.
+	 * @return array Items query arguments.
+	 */
+	protected function prepare_items_query( $prepared_args = array(), $request = null ) {
+		$query_args = parent::prepare_items_query( $prepared_args, $request );
+
+		// Map to proper WP_Query orderby param.
+		if ( isset( $query_args['orderby'], $request['orderby'] ) ) {
+			$orderby_mappings = array(
+				'id'            => 'ID',
+				'include'       => 'post__in',
+				'slug'          => 'post_name',
+				'include_slugs' => 'post_name__in',
+				'menu_order'    => 'menu_order',
+			);
+
+			if ( isset( $orderby_mappings[ $request['orderby'] ] ) ) {
+				$query_args['orderby'] = $orderby_mappings[ $request['orderby'] ];
+			}
+		}
+
+		return $query_args;
+	}
+
+	/**
+	 * Gets the id of the menu that the given menu item belongs to.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param int $menu_item_id Menu item id.
+	 * @return int
+	 */
+	protected function get_menu_id( $menu_item_id ) {
+		$menu_ids = wp_get_post_terms( $menu_item_id, 'nav_menu', array( 'fields' => 'ids' ) );
+		$menu_id  = 0;
+		if ( $menu_ids && ! is_wp_error( $menu_ids ) ) {
+			$menu_id = array_shift( $menu_ids );
+		}
+
+		return $menu_id;
+	}
+}
diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-menu-locations-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-menu-locations-controller.php
new file mode 100644
index 0000000000..17903fcd33
--- /dev/null
+++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-menu-locations-controller.php
@@ -0,0 +1,301 @@
+<?php
+/**
+ * REST API: WP_REST_Menu_Locations_Controller class
+ *
+ * @package WordPress
+ * @subpackage REST_API
+ * @since 5.9.0
+ */
+
+/**
+ * Core class used to access menu locations via the REST API.
+ *
+ * @since 5.9.0
+ *
+ * @see WP_REST_Controller
+ */
+class WP_REST_Menu_Locations_Controller extends WP_REST_Controller {
+
+	/**
+	 * Menu Locations Constructor.
+	 *
+	 * @since 5.9.0
+	 */
+	public function __construct() {
+		$this->namespace = 'wp/v2';
+		$this->rest_base = 'menu-locations';
+	}
+
+	/**
+	 * Registers the routes for the objects of the controller.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @see register_rest_route()
+	 */
+	public function register_routes() {
+		register_rest_route(
+			$this->namespace,
+			'/' . $this->rest_base,
+			array(
+				array(
+					'methods'             => WP_REST_Server::READABLE,
+					'callback'            => array( $this, 'get_items' ),
+					'permission_callback' => array( $this, 'get_items_permissions_check' ),
+					'args'                => $this->get_collection_params(),
+				),
+				'schema' => array( $this, 'get_public_item_schema' ),
+			)
+		);
+
+		register_rest_route(
+			$this->namespace,
+			'/' . $this->rest_base . '/(?P<location>[\w-]+)',
+			array(
+				'args'   => array(
+					'location' => array(
+						'description' => __( 'An alphanumeric identifier for the menu location.' ),
+						'type'        => 'string',
+					),
+				),
+				array(
+					'methods'             => WP_REST_Server::READABLE,
+					'callback'            => array( $this, 'get_item' ),
+					'permission_callback' => array( $this, 'get_item_permissions_check' ),
+					'args'                => array(
+						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
+					),
+				),
+				'schema' => array( $this, 'get_public_item_schema' ),
+			)
+		);
+	}
+
+	/**
+	 * Checks whether a given request has permission to read menu locations.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return WP_Error|bool True if the request has read access, WP_Error object otherwise.
+	 */
+	public function get_items_permissions_check( $request ) {
+		if ( ! current_user_can( 'edit_theme_options' ) ) {
+			return new WP_Error(
+				'rest_cannot_view',
+				__( 'Sorry, you are not allowed to view menu locations.' ),
+				array( 'status' => rest_authorization_required_code() )
+			);
+		}
+
+		return true;
+	}
+
+	/**
+	 * Retrieves all menu locations, depending on user context.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return WP_Error|WP_REST_Response Response object on success, or WP_Error object on failure.
+	 */
+	public function get_items( $request ) {
+		$data = array();
+
+		foreach ( get_registered_nav_menus() as $name => $description ) {
+			$location              = new stdClass();
+			$location->name        = $name;
+			$location->description = $description;
+
+			$location      = $this->prepare_item_for_response( $location, $request );
+			$data[ $name ] = $this->prepare_response_for_collection( $location );
+		}
+
+		return rest_ensure_response( $data );
+	}
+
+	/**
+	 * Checks if a given request has access to read a menu location.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return WP_Error|bool True if the request has read access for the item, WP_Error object otherwise.
+	 */
+	public function get_item_permissions_check( $request ) {
+		if ( ! current_user_can( 'edit_theme_options' ) ) {
+			return new WP_Error(
+				'rest_cannot_view',
+				__( 'Sorry, you are not allowed to view menu locations.' ),
+				array( 'status' => rest_authorization_required_code() )
+			);
+		}
+
+		return true;
+	}
+
+	/**
+	 * Retrieves a specific menu location.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return WP_Error|WP_REST_Response Response object on success, or WP_Error object on failure.
+	 */
+	public function get_item( $request ) {
+		$registered_menus = get_registered_nav_menus();
+		if ( ! array_key_exists( $request['location'], $registered_menus ) ) {
+			return new WP_Error( 'rest_menu_location_invalid', __( 'Invalid menu location.' ), array( 'status' => 404 ) );
+		}
+
+		$location              = new stdClass();
+		$location->name        = $request['location'];
+		$location->description = $registered_menus[ $location->name ];
+
+		$data = $this->prepare_item_for_response( $location, $request );
+
+		return rest_ensure_response( $data );
+	}
+
+	/**
+	 * Prepares a menu location object for serialization.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param stdClass        $item    Post status data.
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return WP_REST_Response Menu location data.
+	 */
+	public function prepare_item_for_response( $item, $request ) {
+		// Restores the more descriptive, specific name for use within this method.
+		$location  = $item;
+		$locations = get_nav_menu_locations();
+		$menu      = isset( $locations[ $location->name ] ) ? $locations[ $location->name ] : 0;
+
+		$fields = $this->get_fields_for_response( $request );
+		$data   = array();
+
+		if ( rest_is_field_included( 'name', $fields ) ) {
+			$data['name'] = $location->name;
+		}
+
+		if ( rest_is_field_included( 'description', $fields ) ) {
+			$data['description'] = $location->description;
+		}
+
+		if ( rest_is_field_included( 'menu', $fields ) ) {
+			$data['menu'] = (int) $menu;
+		}
+
+		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+		$data    = $this->add_additional_fields_to_object( $data, $request );
+		$data    = $this->filter_response_by_context( $data, $context );
+
+		$response = rest_ensure_response( $data );
+
+		$response->add_links( $this->prepare_links( $location ) );
+
+		/**
+		 * Filters menu location data returned from the REST API.
+		 *
+		 * @since 5.9.0
+		 *
+		 * @param WP_REST_Response $response The response object.
+		 * @param object           $location The original location object.
+		 * @param WP_REST_Request  $request  Request used to generate the response.
+		 */
+		return apply_filters( 'rest_prepare_menu_location', $response, $location, $request );
+	}
+
+	/**
+	 * Retrieves the menu location's schema, conforming to JSON Schema.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @return array Item schema data.
+	 */
+	public function get_item_schema() {
+		if ( $this->schema ) {
+			return $this->add_additional_fields_schema( $this->schema );
+		}
+
+		$this->schema = array(
+			'$schema'    => 'http://json-schema.org/draft-04/schema#',
+			'title'      => 'menu-location',
+			'type'       => 'object',
+			'properties' => array(
+				'name'        => array(
+					'description' => __( 'The name of the menu location.' ),
+					'type'        => 'string',
+					'context'     => array( 'embed', 'view', 'edit' ),
+					'readonly'    => true,
+				),
+				'description' => array(
+					'description' => __( 'The description of the menu location.' ),
+					'type'        => 'string',
+					'context'     => array( 'embed', 'view', 'edit' ),
+					'readonly'    => true,
+				),
+				'menu'        => array(
+					'description' => __( 'The ID of the assigned menu.' ),
+					'type'        => 'integer',
+					'context'     => array( 'embed', 'view', 'edit' ),
+					'readonly'    => true,
+				),
+			),
+		);
+
+		return $this->add_additional_fields_schema( $this->schema );
+	}
+
+	/**
+	 * Retrieves the query params for collections.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @return array Collection parameters.
+	 */
+	public function get_collection_params() {
+		return array(
+			'context' => $this->get_context_param( array( 'default' => 'view' ) ),
+		);
+	}
+
+	/**
+	 * Prepares links for the request.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param stdClass $location Menu location.
+	 * @return array Links for the given menu location.
+	 */
+	protected function prepare_links( $location ) {
+		$base = sprintf( '%s/%s', $this->namespace, $this->rest_base );
+
+		// Entity meta.
+		$links = array(
+			'self'       => array(
+				'href' => rest_url( trailingslashit( $base ) . $location->name ),
+			),
+			'collection' => array(
+				'href' => rest_url( $base ),
+			),
+		);
+
+		$locations = get_nav_menu_locations();
+		$menu      = isset( $locations[ $location->name ] ) ? $locations[ $location->name ] : 0;
+		if ( $menu ) {
+			$path = rest_get_route_for_term( $menu );
+			if ( $path ) {
+				$url = rest_url( $path );
+
+				$links['https://api.w.org/menu'][] = array(
+					'href'       => $url,
+					'embeddable' => true,
+				);
+			}
+		}
+
+		return $links;
+	}
+}
diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-menus-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-menus-controller.php
new file mode 100644
index 0000000000..9f723c473d
--- /dev/null
+++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-menus-controller.php
@@ -0,0 +1,568 @@
+<?php
+/**
+ * REST API: WP_REST_Menus_Controller class
+ *
+ * @package WordPress
+ * @subpackage REST_API
+ * @since 5.9.0
+ */
+
+/**
+ * Core class used to managed menu terms associated via the REST API.
+ *
+ * @since 5.9.0
+ *
+ * @see WP_REST_Controller
+ */
+class WP_REST_Menus_Controller extends WP_REST_Terms_Controller {
+
+	/**
+	 * Checks if a request has access to read menus.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return bool|WP_Error True if the request has read access, otherwise false or WP_Error object.
+	 */
+	public function get_items_permissions_check( $request ) {
+		$has_permission = parent::get_items_permissions_check( $request );
+
+		if ( true !== $has_permission ) {
+			return $has_permission;
+		}
+
+		return $this->check_has_read_only_access( $request );
+	}
+
+	/**
+	 * Checks if a request has access to read or edit the specified menu.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return bool|WP_Error True if the request has read access for the item, otherwise false or WP_Error object.
+	 */
+	public function get_item_permissions_check( $request ) {
+		$has_permission = parent::get_item_permissions_check( $request );
+
+		if ( true !== $has_permission ) {
+			return $has_permission;
+		}
+
+		return $this->check_has_read_only_access( $request );
+	}
+
+	/**
+	 * Gets the term, if the ID is valid.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param int $id Supplied ID.
+	 * @return WP_Term|WP_Error Term object if ID is valid, WP_Error otherwise.
+	 */
+	protected function get_term( $id ) {
+		$term = parent::get_term( $id );
+
+		if ( is_wp_error( $term ) ) {
+			return $term;
+		}
+
+		$nav_term           = wp_get_nav_menu_object( $term );
+		$nav_term->auto_add = $this->get_menu_auto_add( $nav_term->term_id );
+
+		return $nav_term;
+	}
+
+	/**
+	 * Checks whether the current user has read permission for the endpoint.
+	 *
+	 * This allows for any user that can `edit_theme_options` or edit any REST API available post type.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return bool|WP_Error Whether the current user has permission.
+	 */
+	protected function check_has_read_only_access( $request ) {
+		if ( current_user_can( 'edit_theme_options' ) ) {
+			return true;
+		}
+
+		if ( current_user_can( 'edit_posts' ) ) {
+			return true;
+		}
+
+		foreach ( get_post_types( array( 'show_in_rest' => true ), 'objects' ) as $post_type ) {
+			if ( current_user_can( $post_type->cap->edit_posts ) ) {
+				return true;
+			}
+		}
+
+		return new WP_Error(
+			'rest_cannot_view',
+			__( 'Sorry, you are not allowed to view menus.' ),
+			array( 'status' => rest_authorization_required_code() )
+		);
+	}
+
+	/**
+	 * Prepares a single term output for response.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_Term         $term    Term object.
+	 * @param WP_REST_Request $request Request object.
+	 * @return WP_REST_Response Response object.
+	 */
+	public function prepare_item_for_response( $term, $request ) {
+		$nav_menu = wp_get_nav_menu_object( $term );
+		$response = parent::prepare_item_for_response( $nav_menu, $request );
+
+		$fields = $this->get_fields_for_response( $request );
+		$data   = $response->get_data();
+
+		if ( rest_is_field_included( 'locations', $fields ) ) {
+			$data['locations'] = $this->get_menu_locations( $nav_menu->term_id );
+		}
+
+		if ( rest_is_field_included( 'auto_add', $fields ) ) {
+			$data['auto_add'] = $this->get_menu_auto_add( $nav_menu->term_id );
+		}
+
+		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+		$data    = $this->add_additional_fields_to_object( $data, $request );
+		$data    = $this->filter_response_by_context( $data, $context );
+
+		$response = rest_ensure_response( $data );
+		$response->add_links( $this->prepare_links( $term ) );
+
+		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php */
+		return apply_filters( "rest_prepare_{$this->taxonomy}", $response, $term, $request );
+	}
+
+	/**
+	 * Prepares links for the request.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_Term $term Term object.
+	 * @return array Links for the given term.
+	 */
+	protected function prepare_links( $term ) {
+		$links = parent::prepare_links( $term );
+
+		$locations = $this->get_menu_locations( $term->term_id );
+		foreach ( $locations as $location ) {
+			$url = rest_url( sprintf( 'wp/v2/menu-locations/%s', $location ) );
+
+			$links['https://api.w.org/menu-location'][] = array(
+				'href'       => $url,
+				'embeddable' => true,
+			);
+		}
+
+		return $links;
+	}
+
+	/**
+	 * Prepares a single term for create or update.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Request object.
+	 * @return object Prepared term data.
+	 */
+	public function prepare_item_for_database( $request ) {
+		$prepared_term = parent::prepare_item_for_database( $request );
+
+		$schema = $this->get_item_schema();
+
+		if ( isset( $request['name'] ) && ! empty( $schema['properties']['name'] ) ) {
+			$prepared_term->{'menu-name'} = $request['name'];
+		}
+
+		return $prepared_term;
+	}
+
+	/**
+	 * Creates a single term in a taxonomy.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
+	 */
+	public function create_item( $request ) {
+		if ( isset( $request['parent'] ) ) {
+			if ( ! is_taxonomy_hierarchical( $this->taxonomy ) ) {
+				return new WP_Error( 'rest_taxonomy_not_hierarchical', __( 'Cannot set parent term, taxonomy is not hierarchical.' ), array( 'status' => 400 ) );
+			}
+
+			$parent = wp_get_nav_menu_object( (int) $request['parent'] );
+
+			if ( ! $parent ) {
+				return new WP_Error( 'rest_term_invalid', __( 'Parent term does not exist.' ), array( 'status' => 400 ) );
+			}
+		}
+
+		$prepared_term = $this->prepare_item_for_database( $request );
+
+		$term = wp_update_nav_menu_object( 0, wp_slash( (array) $prepared_term ) );
+
+		if ( is_wp_error( $term ) ) {
+			/*
+			 * If we're going to inform the client that the term already exists,
+			 * give them the identifier for future use.
+			 */
+
+			if ( in_array( 'menu_exists', $term->get_error_codes(), true ) ) {
+				$existing_term = get_term_by( 'name', $prepared_term->{'menu-name'}, $this->taxonomy );
+				$term->add_data( $existing_term->term_id, 'menu_exists' );
+				$term->add_data(
+					array(
+						'status'  => 400,
+						'term_id' => $existing_term->term_id,
+					)
+				);
+			} else {
+				$term->add_data( array( 'status' => 400 ) );
+			}
+
+			return $term;
+		}
+
+		$term = $this->get_term( $term );
+
+		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php */
+		do_action( "rest_insert_{$this->taxonomy}", $term, $request, true );
+
+		$schema = $this->get_item_schema();
+		if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
+			$meta_update = $this->meta->update_value( $request['meta'], $term->term_id );
+
+			if ( is_wp_error( $meta_update ) ) {
+				return $meta_update;
+			}
+		}
+
+		$locations_update = $this->handle_locations( $term->term_id, $request );
+
+		if ( is_wp_error( $locations_update ) ) {
+			return $locations_update;
+		}
+
+		$this->handle_auto_add( $term->term_id, $request );
+
+		$fields_update = $this->update_additional_fields_for_object( $term, $request );
+
+		if ( is_wp_error( $fields_update ) ) {
+			return $fields_update;
+		}
+
+		$request->set_param( 'context', 'view' );
+
+		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php */
+		do_action( "rest_after_insert_{$this->taxonomy}", $term, $request, true );
+
+		$response = $this->prepare_item_for_response( $term, $request );
+		$response = rest_ensure_response( $response );
+
+		$response->set_status( 201 );
+		$response->header( 'Location', rest_url( $this->namespace . '/' . $this->rest_base . '/' . $term->term_id ) );
+
+		return $response;
+	}
+
+	/**
+	 * Updates a single term from a taxonomy.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
+	 */
+	public function update_item( $request ) {
+		$term = $this->get_term( $request['id'] );
+		if ( is_wp_error( $term ) ) {
+			return $term;
+		}
+
+		if ( isset( $request['parent'] ) ) {
+			if ( ! is_taxonomy_hierarchical( $this->taxonomy ) ) {
+				return new WP_Error( 'rest_taxonomy_not_hierarchical', __( 'Cannot set parent term, taxonomy is not hierarchical.' ), array( 'status' => 400 ) );
+			}
+
+			$parent = get_term( (int) $request['parent'], $this->taxonomy );
+
+			if ( ! $parent ) {
+				return new WP_Error( 'rest_term_invalid', __( 'Parent term does not exist.' ), array( 'status' => 400 ) );
+			}
+		}
+
+		$prepared_term = $this->prepare_item_for_database( $request );
+
+		// Only update the term if we have something to update.
+		if ( ! empty( $prepared_term ) ) {
+			if ( ! isset( $prepared_term->{'menu-name'} ) ) {
+				// wp_update_nav_menu_object() requires that the menu-name is always passed.
+				$prepared_term->{'menu-name'} = $term->name;
+			}
+
+			$update = wp_update_nav_menu_object( $term->term_id, wp_slash( (array) $prepared_term ) );
+
+			if ( is_wp_error( $update ) ) {
+				return $update;
+			}
+		}
+
+		$term = get_term( $term->term_id, $this->taxonomy );
+
+		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php */
+		do_action( "rest_insert_{$this->taxonomy}", $term, $request, false );
+
+		$schema = $this->get_item_schema();
+		if ( ! empty( $schema['properties']['meta'] ) && isset( $request['meta'] ) ) {
+			$meta_update = $this->meta->update_value( $request['meta'], $term->term_id );
+
+			if ( is_wp_error( $meta_update ) ) {
+				return $meta_update;
+			}
+		}
+
+		$locations_update = $this->handle_locations( $term->term_id, $request );
+
+		if ( is_wp_error( $locations_update ) ) {
+			return $locations_update;
+		}
+
+		$this->handle_auto_add( $term->term_id, $request );
+
+		$fields_update = $this->update_additional_fields_for_object( $term, $request );
+
+		if ( is_wp_error( $fields_update ) ) {
+			return $fields_update;
+		}
+
+		$request->set_param( 'context', 'view' );
+
+		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php */
+		do_action( "rest_after_insert_{$this->taxonomy}", $term, $request, false );
+
+		$response = $this->prepare_item_for_response( $term, $request );
+
+		return rest_ensure_response( $response );
+	}
+
+	/**
+	 * Deletes a single term from a taxonomy.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
+	 */
+	public function delete_item( $request ) {
+		$term = $this->get_term( $request['id'] );
+		if ( is_wp_error( $term ) ) {
+			return $term;
+		}
+
+		// We don't support trashing for terms.
+		if ( ! $request['force'] ) {
+			/* translators: %s: force=true */
+			return new WP_Error( 'rest_trash_not_supported', sprintf( __( "Menus do not support trashing. Set '%s' to delete." ), 'force=true' ), array( 'status' => 501 ) );
+		}
+
+		$request->set_param( 'context', 'view' );
+
+		$previous = $this->prepare_item_for_response( $term, $request );
+
+		$result = wp_delete_nav_menu( $term );
+
+		if ( ! $result || is_wp_error( $result ) ) {
+			return new WP_Error( 'rest_cannot_delete', __( 'The menu cannot be deleted.' ), array( 'status' => 500 ) );
+		}
+
+		$response = new WP_REST_Response();
+		$response->set_data(
+			array(
+				'deleted'  => true,
+				'previous' => $previous->get_data(),
+			)
+		);
+
+		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php */
+		do_action( "rest_delete_{$this->taxonomy}", $term, $response, $request );
+
+		return $response;
+	}
+
+	/**
+	 * Returns the value of a menu's auto_add setting.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param int $menu_id The menu id to query.
+	 * @return bool The value of auto_add.
+	 */
+	protected function get_menu_auto_add( $menu_id ) {
+		$nav_menu_option = (array) get_option( 'nav_menu_options', array( 'auto_add' => array() ) );
+
+		return in_array( $menu_id, $nav_menu_option['auto_add'], true );
+	}
+
+	/**
+	 * Updates the menu's auto add from a REST request.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param int             $menu_id The menu id to update.
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return bool True if the auto add setting was successfully updated.
+	 */
+	protected function handle_auto_add( $menu_id, $request ) {
+		if ( ! isset( $request['auto_add'] ) ) {
+			return true;
+		}
+
+		$nav_menu_option = (array) get_option( 'nav_menu_options', array( 'auto_add' => array() ) );
+
+		if ( ! isset( $nav_menu_option['auto_add'] ) ) {
+			$nav_menu_option['auto_add'] = array();
+		}
+
+		$auto_add = $request['auto_add'];
+
+		$i = array_search( $menu_id, $nav_menu_option['auto_add'], true );
+
+		if ( $auto_add && false === $i ) {
+			$nav_menu_option['auto_add'][] = $menu_id;
+		} elseif ( ! $auto_add && false !== $i ) {
+			array_splice( $nav_menu_option['auto_add'], $i, 1 );
+		}
+
+		$update = update_option( 'nav_menu_options', $nav_menu_option );
+
+		/** This action is documented in wp-includes/nav-menu.php */
+		do_action( 'wp_update_nav_menu', $menu_id );
+
+		return $update;
+	}
+
+	/**
+	 * Returns the names of the locations assigned to the menu.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param int $menu_id The menu id.
+	 * @return string[] The locations assigned to the menu.
+	 */
+	protected function get_menu_locations( $menu_id ) {
+		$locations      = get_nav_menu_locations();
+		$menu_locations = array();
+
+		foreach ( $locations as $location => $assigned_menu_id ) {
+			if ( $menu_id === $assigned_menu_id ) {
+				$menu_locations[] = $location;
+			}
+		}
+
+		return $menu_locations;
+	}
+
+	/**
+	 * Updates the menu's locations from a REST request.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param int             $menu_id The menu id to update.
+	 * @param WP_REST_Request $request Full details about the request.
+	 * @return true|WP_Error True on success, a WP_Error on an error updating any of the locations.
+	 */
+	protected function handle_locations( $menu_id, $request ) {
+		if ( ! isset( $request['locations'] ) ) {
+			return true;
+		}
+
+		$menu_locations = get_registered_nav_menus();
+		$menu_locations = array_keys( $menu_locations );
+		$new_locations  = array();
+		foreach ( $request['locations'] as $location ) {
+			if ( ! in_array( $location, $menu_locations, true ) ) {
+				return new WP_Error(
+					'rest_invalid_menu_location',
+					__( 'Invalid menu location.' ),
+					array(
+						'status'   => 400,
+						'location' => $location,
+					)
+				);
+			}
+			$new_locations[ $location ] = $menu_id;
+		}
+		$assigned_menu = get_nav_menu_locations();
+		foreach ( $assigned_menu as $location => $term_id ) {
+			if ( $term_id === $menu_id ) {
+				unset( $assigned_menu[ $location ] );
+			}
+		}
+		$new_assignments = array_merge( $assigned_menu, $new_locations );
+		set_theme_mod( 'nav_menu_locations', $new_assignments );
+
+		return true;
+	}
+
+	/**
+	 * Retrieves the term's schema, conforming to JSON Schema.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @return array Item schema data.
+	 */
+	public function get_item_schema() {
+		$schema = parent::get_item_schema();
+		unset( $schema['properties']['count'], $schema['properties']['link'], $schema['properties']['taxonomy'] );
+
+		$schema['properties']['locations'] = array(
+			'description' => __( 'The locations assigned to the menu.' ),
+			'type'        => 'array',
+			'items'       => array(
+				'type' => 'string',
+			),
+			'context'     => array( 'view', 'edit' ),
+			'arg_options' => array(
+				'validate_callback' => function ( $locations, $request, $param ) {
+					$valid = rest_validate_request_arg( $locations, $request, $param );
+
+					if ( true !== $valid ) {
+						return $valid;
+					}
+
+					$locations = rest_sanitize_request_arg( $locations, $request, $param );
+
+					foreach ( $locations as $location ) {
+						if ( ! array_key_exists( $location, get_registered_nav_menus() ) ) {
+							return new WP_Error(
+								'rest_invalid_menu_location',
+								__( 'Invalid menu location.' ),
+								array(
+									'location' => $location,
+								)
+							);
+						}
+					}
+
+					return true;
+				},
+			),
+		);
+
+		$schema['properties']['auto_add'] = array(
+			'description' => __( 'Whether to automatically add top level pages to this menu.' ),
+			'context'     => array( 'view', 'edit' ),
+			'type'        => 'boolean',
+		);
+
+		return $schema;
+	}
+}
diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-pattern-directory-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-pattern-directory-controller.php
index 0c26c20ae0..186387d8c0 100644
--- a/src/wp-includes/rest-api/endpoints/class-wp-rest-pattern-directory-controller.php
+++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-pattern-directory-controller.php
@@ -51,7 +51,7 @@ class WP_REST_Pattern_Directory_Controller extends WP_REST_Controller {
 	}
 
 	/**
-	 * Checks whether a given request has permission to view the local pattern directory.
+	 * Checks whether a given request has permission to view the local block pattern directory.
 	 *
 	 * @since 5.8.0
 	 *
@@ -196,7 +196,7 @@ class WP_REST_Pattern_Directory_Controller extends WP_REST_Controller {
 	}
 
 	/**
-	 * Prepare a raw pattern before it's output in an API response.
+	 * Prepare a raw block pattern before it gets output in a REST API response.
 	 *
 	 * @since 5.8.0
 	 * @since 5.9.0 Renamed `$raw_pattern` to `$item` to match parent class for PHP 8 named parameter support.
@@ -223,19 +223,19 @@ class WP_REST_Pattern_Directory_Controller extends WP_REST_Controller {
 		$response = new WP_REST_Response( $prepared_pattern );
 
 		/**
-		 * Filters the REST API response for a pattern.
+		 * Filters the REST API response for a block pattern.
 		 *
 		 * @since 5.8.0
 		 *
 		 * @param WP_REST_Response $response    The response object.
-		 * @param object           $raw_pattern The unprepared pattern.
+		 * @param object           $raw_pattern The unprepared block pattern.
 		 * @param WP_REST_Request  $request     The request object.
 		 */
 		return apply_filters( 'rest_prepare_block_pattern', $response, $raw_pattern, $request );
 	}
 
 	/**
-	 * Retrieves the pattern's schema, conforming to JSON Schema.
+	 * Retrieves the block pattern's schema, conforming to JSON Schema.
 	 *
 	 * @since 5.8.0
 	 *
@@ -307,7 +307,7 @@ class WP_REST_Pattern_Directory_Controller extends WP_REST_Controller {
 	}
 
 	/**
-	 * Retrieves the search params for the patterns collection.
+	 * Retrieves the search parameters for the block pattern's collection.
 	 *
 	 * @since 5.8.0
 	 *
@@ -336,7 +336,7 @@ class WP_REST_Pattern_Directory_Controller extends WP_REST_Controller {
 		);
 
 		/**
-		 * Filter collection parameters for the pattern directory controller.
+		 * Filter collection parameters for the block pattern directory controller.
 		 *
 		 * @since 5.8.0
 		 *
diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
index ffb4466892..dfb97f7b60 100644
--- a/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
+++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
@@ -39,6 +39,14 @@ class WP_REST_Posts_Controller extends WP_REST_Controller {
 	 */
 	protected $password_check_passed = array();
 
+	/**
+	 * Whether the controller supports batching.
+	 *
+	 * @since 5.9.0
+	 * @var array
+	 */
+	protected $allow_batch = array( 'v1' => true );
+
 	/**
 	 * Constructor.
 	 *
@@ -80,7 +88,8 @@ class WP_REST_Posts_Controller extends WP_REST_Controller {
 					'permission_callback' => array( $this, 'create_item_permissions_check' ),
 					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
 				),
-				'schema' => array( $this, 'get_public_item_schema' ),
+				'allow_batch' => $this->allow_batch,
+				'schema'      => array( $this, 'get_public_item_schema' ),
 			)
 		);
 
@@ -98,7 +107,7 @@ class WP_REST_Posts_Controller extends WP_REST_Controller {
 			$this->namespace,
 			'/' . $this->rest_base . '/(?P<id>[\d]+)',
 			array(
-				'args'   => array(
+				'args'        => array(
 					'id' => array(
 						'description' => __( 'Unique identifier for the post.' ),
 						'type'        => 'integer',
@@ -128,7 +137,8 @@ class WP_REST_Posts_Controller extends WP_REST_Controller {
 						),
 					),
 				),
-				'schema' => array( $this, 'get_public_item_schema' ),
+				'allow_batch' => $this->allow_batch,
+				'schema'      => array( $this, 'get_public_item_schema' ),
 			)
 		);
 	}
@@ -1541,7 +1551,7 @@ class WP_REST_Posts_Controller extends WP_REST_Controller {
 				continue;
 			}
 
-			foreach ( $request[ $base ] as $term_id ) {
+			foreach ( (array) $request[ $base ] as $term_id ) {
 				// Invalid terms will be rejected later.
 				if ( ! get_term( $term_id, $taxonomy->name ) ) {
 					continue;
@@ -2029,7 +2039,7 @@ class WP_REST_Posts_Controller extends WP_REST_Controller {
 
 		if ( $post_type_obj->hierarchical && ! empty( $post->post_parent ) ) {
 			$links['up'] = array(
-				'href'       => rest_url( trailingslashit( $base ) . (int) $post->post_parent ),
+				'href'       => rest_url( rest_get_route_for_post( $post->post_parent ) ),
 				'embeddable' => true,
 			);
 		}
diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-sidebars-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-sidebars-controller.php
index fbc70fe331..3ce3beded2 100644
--- a/src/wp-includes/rest-api/endpoints/class-wp-rest-sidebars-controller.php
+++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-sidebars-controller.php
@@ -219,12 +219,12 @@ class WP_REST_Sidebars_Controller extends WP_REST_Controller {
 
 			foreach ( $sidebars as $sidebar_id => $widgets ) {
 				foreach ( $widgets as $i => $widget_id ) {
-					// This automatically removes the passed widget ids from any other sidebars in use.
+					// This automatically removes the passed widget IDs from any other sidebars in use.
 					if ( $sidebar_id !== $request['id'] && in_array( $widget_id, $request['widgets'], true ) ) {
 						unset( $sidebars[ $sidebar_id ][ $i ] );
 					}
 
-					// This automatically removes omitted widget ids to the inactive sidebar.
+					// This automatically removes omitted widget IDs to the inactive sidebar.
 					if ( $sidebar_id === $request['id'] && ! in_array( $widget_id, $request['widgets'], true ) ) {
 						$sidebars['wp_inactive_widgets'][] = $widget_id;
 					}
diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-templates-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-templates-controller.php
index e7712363f7..1108fbeec7 100644
--- a/src/wp-includes/rest-api/endpoints/class-wp-rest-templates-controller.php
+++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-templates-controller.php
@@ -68,17 +68,30 @@ class WP_REST_Templates_Controller extends WP_REST_Controller {
 		// Lists/updates a single template based on the given id.
 		register_rest_route(
 			$this->namespace,
-			'/' . $this->rest_base . '/(?P<id>[\/\w-]+)',
+			// The route.
+			sprintf(
+				'/%s/(?P<id>%s%s)',
+				$this->rest_base,
+				// Matches theme's directory: `/themes/<subdirectory>/<theme>/` or `/themes/<theme>/`.
+				// Excludes invalid directory name characters: `/:<>*?"|`.
+				'([^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?)',
+				// Matches the template name.
+				'[\/\w-]+'
+			),
 			array(
+				'args'   => array(
+					'id' => array(
+						'description'       => __( 'The id of a template' ),
+						'type'              => 'string',
+						'sanitize_callback' => array( $this, '_sanitize_template_id' ),
+					),
+				),
 				array(
 					'methods'             => WP_REST_Server::READABLE,
 					'callback'            => array( $this, 'get_item' ),
 					'permission_callback' => array( $this, 'get_item_permissions_check' ),
 					'args'                => array(
-						'id' => array(
-							'description' => __( 'The id of a template' ),
-							'type'        => 'string',
-						),
+						'context' => $this->get_context_param( array( 'default' => 'view' ) ),
 					),
 				),
 				array(
@@ -128,6 +141,41 @@ class WP_REST_Templates_Controller extends WP_REST_Controller {
 		return true;
 	}
 
+	/**
+	 * Requesting this endpoint for a template like 'twentytwentytwo//home'
+	 * requires using a path like /wp/v2/templates/twentytwentytwo//home. There
+	 * are special cases when WordPress routing corrects the name to contain
+	 * only a single slash like 'twentytwentytwo/home'.
+	 *
+	 * This method doubles the last slash if it's not already doubled. It relies
+	 * on the template ID format {theme_name}//{template_slug} and the fact that
+	 * slugs cannot contain slashes.
+	 *
+	 * @since 5.9.0
+	 * @see https://core.trac.wordpress.org/ticket/54507
+	 *
+	 * @param string $id Template ID.
+	 * @return string Sanitized template ID.
+	 */
+	public function _sanitize_template_id( $id ) {
+		$id = urldecode( $id );
+
+		$last_slash_pos = strrpos( $id, '/' );
+		if ( false === $last_slash_pos ) {
+			return $id;
+		}
+
+		$is_double_slashed = substr( $id, $last_slash_pos - 1, 1 ) === '/';
+		if ( $is_double_slashed ) {
+			return $id;
+		}
+		return (
+			substr( $id, 0, $last_slash_pos )
+			. '/'
+			. substr( $id, $last_slash_pos )
+		);
+	}
+
 	/**
 	 * Checks if a given request has access to read templates.
 	 *
@@ -156,6 +204,9 @@ class WP_REST_Templates_Controller extends WP_REST_Controller {
 		if ( isset( $request['area'] ) ) {
 			$query['area'] = $request['area'];
 		}
+		if ( isset( $request['post_type'] ) ) {
+			$query['post_type'] = $request['post_type'];
+		}
 
 		$templates = array();
 		foreach ( get_block_templates( $query, $this->post_type ) as $template ) {
@@ -187,7 +238,11 @@ class WP_REST_Templates_Controller extends WP_REST_Controller {
 	 * @return WP_REST_Response|WP_Error
 	 */
 	public function get_item( $request ) {
-		$template = get_block_template( $request['id'], $this->post_type );
+		if ( isset( $request['source'] ) && 'theme' === $request['source'] ) {
+			$template = get_block_file_template( $request['id'], $this->post_type );
+		} else {
+			$template = get_block_template( $request['id'], $this->post_type );
+		}
 
 		if ( ! $template ) {
 			return new WP_Error( 'rest_template_not_found', __( 'No templates exist with that id.' ), array( 'status' => 404 ) );
@@ -222,14 +277,39 @@ class WP_REST_Templates_Controller extends WP_REST_Controller {
 			return new WP_Error( 'rest_template_not_found', __( 'No templates exist with that id.' ), array( 'status' => 404 ) );
 		}
 
+		$post_before = get_post( $template->wp_id );
+
+		if ( isset( $request['source'] ) && 'theme' === $request['source'] ) {
+			wp_delete_post( $template->wp_id, true );
+			$request->set_param( 'context', 'edit' );
+
+			$template = get_block_template( $request['id'], $this->post_type );
+			$response = $this->prepare_item_for_response( $template, $request );
+
+			return rest_ensure_response( $response );
+		}
+
 		$changes = $this->prepare_item_for_database( $request );
 
+		if ( is_wp_error( $changes ) ) {
+			return $changes;
+		}
+
 		if ( 'custom' === $template->source ) {
-			$result = wp_update_post( wp_slash( (array) $changes ), true );
+			$update = true;
+			$result = wp_update_post( wp_slash( (array) $changes ), false );
 		} else {
-			$result = wp_insert_post( wp_slash( (array) $changes ), true );
+			$update      = false;
+			$post_before = null;
+			$result      = wp_insert_post( wp_slash( (array) $changes ), false );
 		}
+
 		if ( is_wp_error( $result ) ) {
+			if ( 'db_update_error' === $result->get_error_code() ) {
+				$result->add_data( array( 'status' => 500 ) );
+			} else {
+				$result->add_data( array( 'status' => 400 ) );
+			}
 			return $result;
 		}
 
@@ -239,10 +319,17 @@ class WP_REST_Templates_Controller extends WP_REST_Controller {
 			return $fields_update;
 		}
 
-		return $this->prepare_item_for_response(
-			get_block_template( $request['id'], $this->post_type ),
-			$request
-		);
+		$request->set_param( 'context', 'edit' );
+
+		$post = get_post( $template->wp_id );
+		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php */
+		do_action( "rest_after_insert_{$this->post_type}", $post, $request, false );
+
+		wp_after_insert_post( $post, $update, $post_before );
+
+		$response = $this->prepare_item_for_response( $template, $request );
+
+		return rest_ensure_response( $response );
 	}
 
 	/**
@@ -266,27 +353,47 @@ class WP_REST_Templates_Controller extends WP_REST_Controller {
 	 * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure.
 	 */
 	public function create_item( $request ) {
-		$changes            = $this->prepare_item_for_database( $request );
-		$changes->post_name = $request['slug'];
-		$result             = wp_insert_post( wp_slash( (array) $changes ), true );
-		if ( is_wp_error( $result ) ) {
-			return $result;
+		$prepared_post = $this->prepare_item_for_database( $request );
+
+		if ( is_wp_error( $prepared_post ) ) {
+			return $prepared_post;
+		}
+
+		$prepared_post->post_name = $request['slug'];
+		$post_id                  = wp_insert_post( wp_slash( (array) $prepared_post ), true );
+		if ( is_wp_error( $post_id ) ) {
+			if ( 'db_insert_error' === $post_id->get_error_code() ) {
+				$post_id->add_data( array( 'status' => 500 ) );
+			} else {
+				$post_id->add_data( array( 'status' => 400 ) );
+			}
+
+			return $post_id;
 		}
-		$posts = get_block_templates( array( 'wp_id' => $result ), $this->post_type );
+		$posts = get_block_templates( array( 'wp_id' => $post_id ), $this->post_type );
 		if ( ! count( $posts ) ) {
-			return new WP_Error( 'rest_template_insert_error', __( 'No templates exist with that id.' ) );
+			return new WP_Error( 'rest_template_insert_error', __( 'No templates exist with that id.' ), array( 'status' => 400 ) );
 		}
 		$id            = $posts[0]->id;
+		$post          = get_post( $post_id );
 		$template      = get_block_template( $id, $this->post_type );
 		$fields_update = $this->update_additional_fields_for_object( $template, $request );
 		if ( is_wp_error( $fields_update ) ) {
 			return $fields_update;
 		}
 
-		return $this->prepare_item_for_response(
-			get_block_template( $id, $this->post_type ),
-			$request
-		);
+		/** This action is documented in wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php */
+		do_action( "rest_after_insert_{$this->post_type}", $post, $request, true );
+
+		wp_after_insert_post( $post, false, null );
+
+		$response = $this->prepare_item_for_response( $template, $request );
+		$response = rest_ensure_response( $response );
+
+		$response->set_status( 201 );
+		$response->header( 'Location', rest_url( sprintf( '%s/%s/%s', $this->namespace, $this->rest_base, $template->id ) ) );
+
+		return $response;
 	}
 
 	/**
@@ -321,10 +428,12 @@ class WP_REST_Templates_Controller extends WP_REST_Controller {
 		$id    = $template->wp_id;
 		$force = (bool) $request['force'];
 
+		$request->set_param( 'context', 'edit' );
+
 		// If we're forcing, then delete permanently.
 		if ( $force ) {
 			$previous = $this->prepare_item_for_response( $template, $request );
-			wp_delete_post( $id, true );
+			$result   = wp_delete_post( $id, true );
 			$response = new WP_REST_Response();
 			$response->set_data(
 				array(
@@ -332,22 +441,32 @@ class WP_REST_Templates_Controller extends WP_REST_Controller {
 					'previous' => $previous->get_data(),
 				)
 			);
+		} else {
+			// Otherwise, only trash if we haven't already.
+			if ( 'trash' === $template->status ) {
+				return new WP_Error(
+					'rest_template_already_trashed',
+					__( 'The template has already been deleted.' ),
+					array( 'status' => 410 )
+				);
+			}
 
-			return $response;
+			// (Note that internally this falls through to `wp_delete_post()`
+			// if the Trash is disabled.)
+			$result           = wp_trash_post( $id );
+			$template->status = 'trash';
+			$response         = $this->prepare_item_for_response( $template, $request );
 		}
 
-		// Otherwise, only trash if we haven't already.
-		if ( 'trash' === $template->status ) {
+		if ( ! $result ) {
 			return new WP_Error(
-				'rest_template_already_trashed',
-				__( 'The template has already been deleted.' ),
-				array( 'status' => 410 )
+				'rest_cannot_delete',
+				__( 'The template cannot be deleted.' ),
+				array( 'status' => 500 )
 			);
 		}
 
-		wp_trash_post( $id );
-		$template->status = 'trash';
-		return $this->prepare_item_for_response( $template, $request );
+		return $response;
 	}
 
 	/**
@@ -374,18 +493,29 @@ class WP_REST_Templates_Controller extends WP_REST_Controller {
 			$changes->tax_input   = array(
 				'wp_theme' => $template->theme,
 			);
+			$changes->meta_input  = array(
+				'origin' => $template->source,
+			);
 		} else {
 			$changes->post_name   = $template->slug;
 			$changes->ID          = $template->wp_id;
 			$changes->post_status = 'publish';
 		}
 		if ( isset( $request['content'] ) ) {
-			$changes->post_content = $request['content'];
+			if ( is_string( $request['content'] ) ) {
+				$changes->post_content = $request['content'];
+			} elseif ( isset( $request['content']['raw'] ) ) {
+				$changes->post_content = $request['content']['raw'];
+			}
 		} elseif ( null !== $template && 'custom' !== $template->source ) {
 			$changes->post_content = $template->content;
 		}
 		if ( isset( $request['title'] ) ) {
-			$changes->post_title = $request['title'];
+			if ( is_string( $request['title'] ) ) {
+				$changes->post_title = $request['title'];
+			} elseif ( ! empty( $request['title']['raw'] ) ) {
+				$changes->post_title = $request['title']['raw'];
+			}
 		} elseif ( null !== $template && 'custom' !== $template->source ) {
 			$changes->post_title = $template->title;
 		}
@@ -395,6 +525,34 @@ class WP_REST_Templates_Controller extends WP_REST_Controller {
 			$changes->post_excerpt = $template->description;
 		}
 
+		if ( 'wp_template_part' === $this->post_type ) {
+			if ( isset( $request['area'] ) ) {
+				$changes->tax_input['wp_template_part_area'] = _filter_block_template_part_area( $request['area'] );
+			} elseif ( null !== $template && 'custom' !== $template->source && $template->area ) {
+				$changes->tax_input['wp_template_part_area'] = _filter_block_template_part_area( $template->area );
+			} elseif ( ! $template->area ) {
+				$changes->tax_input['wp_template_part_area'] = WP_TEMPLATE_PART_AREA_UNCATEGORIZED;
+			}
+		}
+
+		if ( ! empty( $request['author'] ) ) {
+			$post_author = (int) $request['author'];
+
+			if ( get_current_user_id() !== $post_author ) {
+				$user_obj = get_userdata( $post_author );
+
+				if ( ! $user_obj ) {
+					return new WP_Error(
+						'rest_invalid_author',
+						__( 'Invalid author ID.' ),
+						array( 'status' => 400 )
+					);
+				}
+			}
+
+			$changes->post_author = $post_author;
+		}
+
 		return $changes;
 	}
 
@@ -406,36 +564,105 @@ class WP_REST_Templates_Controller extends WP_REST_Controller {
 	 *
 	 * @param WP_Block_Template $item    Template instance.
 	 * @param WP_REST_Request   $request Request object.
-	 * @return WP_REST_Response $data
+	 * @return WP_REST_Response Response object.
 	 */
 	public function prepare_item_for_response( $item, $request ) { // phpcs:ignore VariableAnalysis.CodeAnalysis.VariableAnalysis.UnusedVariable
 		// Restores the more descriptive, specific name for use within this method.
 		$template = $item;
-		$result   = array(
-			'id'             => $template->id,
-			'theme'          => $template->theme,
-			'content'        => array( 'raw' => $template->content ),
-			'slug'           => $template->slug,
-			'source'         => $template->source,
-			'type'           => $template->type,
-			'description'    => $template->description,
-			'title'          => array(
-				'raw'      => $template->title,
-				'rendered' => $template->title,
-			),
-			'status'         => $template->status,
-			'wp_id'          => $template->wp_id,
-			'has_theme_file' => $template->has_theme_file,
-		);
 
-		if ( 'wp_template_part' === $template->type ) {
-			$result['area'] = $template->area;
+		$fields = $this->get_fields_for_response( $request );
+
+		// Base fields for every template.
+		$data = array();
+
+		if ( rest_is_field_included( 'id', $fields ) ) {
+			$data['id'] = $template->id;
+		}
+
+		if ( rest_is_field_included( 'theme', $fields ) ) {
+			$data['theme'] = $template->theme;
+		}
+
+		if ( rest_is_field_included( 'content', $fields ) ) {
+			$data['content'] = array();
+		}
+		if ( rest_is_field_included( 'content.raw', $fields ) ) {
+			$data['content']['raw'] = $template->content;
+		}
+
+		if ( rest_is_field_included( 'content.block_version', $fields ) ) {
+			$data['content']['block_version'] = block_version( $template->content );
+		}
+
+		if ( rest_is_field_included( 'slug', $fields ) ) {
+			$data['slug'] = $template->slug;
+		}
+
+		if ( rest_is_field_included( 'source', $fields ) ) {
+			$data['source'] = $template->source;
+		}
+
+		if ( rest_is_field_included( 'origin', $fields ) ) {
+			$data['origin'] = $template->origin;
+		}
+
+		if ( rest_is_field_included( 'type', $fields ) ) {
+			$data['type'] = $template->type;
+		}
+
+		if ( rest_is_field_included( 'description', $fields ) ) {
+			$data['description'] = $template->description;
+		}
+
+		if ( rest_is_field_included( 'title', $fields ) ) {
+			$data['title'] = array();
+		}
+
+		if ( rest_is_field_included( 'title.raw', $fields ) ) {
+			$data['title']['raw'] = $template->title;
+		}
+
+		if ( rest_is_field_included( 'title.rendered', $fields ) ) {
+			if ( $template->wp_id ) {
+				/** This filter is documented in wp-includes/post-template.php */
+				$data['title']['rendered'] = apply_filters( 'the_title', $template->title, $template->wp_id );
+			} else {
+				$data['title']['rendered'] = $template->title;
+			}
+		}
+
+		if ( rest_is_field_included( 'status', $fields ) ) {
+			$data['status'] = $template->status;
+		}
+
+		if ( rest_is_field_included( 'wp_id', $fields ) ) {
+			$data['wp_id'] = (int) $template->wp_id;
+		}
+
+		if ( rest_is_field_included( 'has_theme_file', $fields ) ) {
+			$data['has_theme_file'] = (bool) $template->has_theme_file;
 		}
 
-		$result = $this->add_additional_fields_to_object( $result, $request );
+		if ( rest_is_field_included( 'is_custom', $fields ) && 'wp_template' === $template->type ) {
+			$data['is_custom'] = $template->is_custom;
+		}
+
+		if ( rest_is_field_included( 'author', $fields ) ) {
+			$data['author'] = (int) $template->author;
+		}
+
+		if ( rest_is_field_included( 'area', $fields ) && 'wp_template_part' === $template->type ) {
+			$data['area'] = $template->area;
+		}
 
-		$response = rest_ensure_response( $result );
-		$links    = $this->prepare_links( $template->id );
+		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
+		$data    = $this->add_additional_fields_to_object( $data, $request );
+		$data    = $this->filter_response_by_context( $data, $context );
+
+		// Wrap the data in a response object.
+		$response = rest_ensure_response( $data );
+
+		$links = $this->prepare_links( $template->id );
 		$response->add_links( $links );
 		if ( ! empty( $links['self']['href'] ) ) {
 			$actions = $this->get_available_actions();
@@ -502,16 +729,25 @@ class WP_REST_Templates_Controller extends WP_REST_Controller {
 	 * Retrieves the query params for the posts collection.
 	 *
 	 * @since 5.8.0
+	 * @since 5.9.0 Added `'area'` and `'post_type'`.
 	 *
 	 * @return array Collection parameters.
 	 */
 	public function get_collection_params() {
 		return array(
-			'context' => $this->get_context_param(),
-			'wp_id'   => array(
+			'context'   => $this->get_context_param( array( 'default' => 'view' ) ),
+			'wp_id'     => array(
 				'description' => __( 'Limit to the specified post id.' ),
 				'type'        => 'integer',
 			),
+			'area'      => array(
+				'description' => __( 'Limit to the specified template part area.' ),
+				'type'        => 'string',
+			),
+			'post_type' => array(
+				'description' => __( 'Post type to get the templates for.' ),
+				'type'        => 'string',
+			),
 		);
 	}
 
@@ -519,6 +755,7 @@ class WP_REST_Templates_Controller extends WP_REST_Controller {
 	 * Retrieves the block type' schema, conforming to JSON Schema.
 	 *
 	 * @since 5.8.0
+	 * @since 5.9.0 Added `'area'`.
 	 *
 	 * @return array Item schema data.
 	 */
@@ -544,30 +781,67 @@ class WP_REST_Templates_Controller extends WP_REST_Controller {
 					'context'     => array( 'embed', 'view', 'edit' ),
 					'required'    => true,
 					'minLength'   => 1,
-					'pattern'     => '[a-zA-Z_\-]+',
+					'pattern'     => '[a-zA-Z0-9_\-]+',
 				),
 				'theme'          => array(
 					'description' => __( 'Theme identifier for the template.' ),
 					'type'        => 'string',
 					'context'     => array( 'embed', 'view', 'edit' ),
 				),
+				'type'           => array(
+					'description' => __( 'Type of template.' ),
+					'type'        => 'string',
+					'context'     => array( 'embed', 'view', 'edit' ),
+				),
 				'source'         => array(
 					'description' => __( 'Source of template' ),
 					'type'        => 'string',
 					'context'     => array( 'embed', 'view', 'edit' ),
 					'readonly'    => true,
 				),
+				'origin'         => array(
+					'description' => __( 'Source of a customized template' ),
+					'type'        => 'string',
+					'context'     => array( 'embed', 'view', 'edit' ),
+					'readonly'    => true,
+				),
 				'content'        => array(
 					'description' => __( 'Content of template.' ),
 					'type'        => array( 'object', 'string' ),
 					'default'     => '',
 					'context'     => array( 'embed', 'view', 'edit' ),
+					'properties'  => array(
+						'raw'           => array(
+							'description' => __( 'Content for the template, as it exists in the database.' ),
+							'type'        => 'string',
+							'context'     => array( 'view', 'edit' ),
+						),
+						'block_version' => array(
+							'description' => __( 'Version of the content block format used by the template.' ),
+							'type'        => 'integer',
+							'context'     => array( 'edit' ),
+							'readonly'    => true,
+						),
+					),
 				),
 				'title'          => array(
 					'description' => __( 'Title of template.' ),
 					'type'        => array( 'object', 'string' ),
 					'default'     => '',
 					'context'     => array( 'embed', 'view', 'edit' ),
+					'properties'  => array(
+						'raw'      => array(
+							'description' => __( 'Title for the template, as it exists in the database.' ),
+							'type'        => 'string',
+							'context'     => array( 'view', 'edit', 'embed' ),
+						),
+						'rendered' => array(
+							'description' => __( 'HTML title for the template, transformed for display.' ),
+							'type'        => 'string',
+							'context'     => array( 'view', 'edit', 'embed' ),
+							'readonly'    => true,
+						),
+					),
 				),
 				'description'    => array(
 					'description' => __( 'Description of template.' ),
@@ -578,6 +852,7 @@ class WP_REST_Templates_Controller extends WP_REST_Controller {
 				'status'         => array(
 					'description' => __( 'Status of template.' ),
 					'type'        => 'string',
+					'enum'        => array_keys( get_post_stati( array( 'internal' => false ) ) ),
 					'default'     => 'publish',
 					'context'     => array( 'embed', 'view', 'edit' ),
 				),
@@ -593,9 +868,31 @@ class WP_REST_Templates_Controller extends WP_REST_Controller {
 					'context'     => array( 'embed', 'view', 'edit' ),
 					'readonly'    => true,
 				),
+				'author'         => array(
+					'description' => __( 'The ID for the author of the template.' ),
+					'type'        => 'integer',
+					'context'     => array( 'view', 'edit', 'embed' ),
+				),
 			),
 		);
 
+		if ( 'wp_template' === $this->post_type ) {
+			$schema['properties']['is_custom'] = array(
+				'description' => __( 'Whether a template is a custom template.' ),
+				'type'        => 'bool',
+				'context'     => array( 'embed', 'view', 'edit' ),
+				'readonly'    => true,
+			);
+		}
+
+		if ( 'wp_template_part' === $this->post_type ) {
+			$schema['properties']['area'] = array(
+				'description' => __( 'Where the template part is intended for use (header, footer, etc.)' ),
+				'type'        => 'string',
+				'context'     => array( 'embed', 'view', 'edit' ),
+			);
+		}
+
 		$this->schema = $schema;
 
 		return $this->add_additional_fields_schema( $this->schema );
diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php
index 3a92b774f0..8856609375 100644
--- a/src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php
+++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php
@@ -48,6 +48,14 @@ class WP_REST_Terms_Controller extends WP_REST_Controller {
 	 */
 	protected $total_terms;
 
+	/**
+	 * Whether the controller supports batching.
+	 *
+	 * @since 5.9.0
+	 * @var array
+	 */
+	protected $allow_batch = array( 'v1' => true );
+
 	/**
 	 * Constructor.
 	 *
@@ -89,7 +97,8 @@ class WP_REST_Terms_Controller extends WP_REST_Controller {
 					'permission_callback' => array( $this, 'create_item_permissions_check' ),
 					'args'                => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
 				),
-				'schema' => array( $this, 'get_public_item_schema' ),
+				'allow_batch' => $this->allow_batch,
+				'schema'      => array( $this, 'get_public_item_schema' ),
 			)
 		);
 
@@ -97,7 +106,7 @@ class WP_REST_Terms_Controller extends WP_REST_Controller {
 			$this->namespace,
 			'/' . $this->rest_base . '/(?P<id>[\d]+)',
 			array(
-				'args'   => array(
+				'args'        => array(
 					'id' => array(
 						'description' => __( 'Unique identifier for the term.' ),
 						'type'        => 'integer',
@@ -129,7 +138,8 @@ class WP_REST_Terms_Controller extends WP_REST_Controller {
 						),
 					),
 				),
-				'schema' => array( $this, 'get_public_item_schema' ),
+				'allow_batch' => $this->allow_batch,
+				'schema'      => array( $this, 'get_public_item_schema' ),
 			)
 		);
 	}
diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php
index b34bc317e1..e1083eaa41 100644
--- a/src/wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php
+++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-themes-controller.php
@@ -16,7 +16,11 @@
  */
 class WP_REST_Themes_Controller extends WP_REST_Controller {
 
-	const PATTERN = '[^.\/]+(?:\/[^.\/]+)?';
+	/**
+	 * Matches theme's directory: `/themes/<subdirectory>/<theme>/` or `/themes/<theme>/`.
+	 * Excludes invalid directory name characters: `/:<>*?"|`.
+	 */
+	const PATTERN = '[^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?';
 
 	/**
 	 * Constructor.
@@ -56,8 +60,9 @@ class WP_REST_Themes_Controller extends WP_REST_Controller {
 			array(
 				'args'   => array(
 					'stylesheet' => array(
-						'description' => __( "The theme's stylesheet. This uniquely identifies the theme." ),
-						'type'        => 'string',
+						'description'       => __( "The theme's stylesheet. This uniquely identifies the theme." ),
+						'type'              => 'string',
+						'sanitize_callback' => array( $this, '_sanitize_stylesheet_callback' ),
 					),
 				),
 				array(
@@ -70,6 +75,18 @@ class WP_REST_Themes_Controller extends WP_REST_Controller {
 		);
 	}
 
+	/**
+	 * Sanitize the stylesheet to decode endpoint.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param string $stylesheet The stylesheet name.
+	 * @return string Sanitized stylesheet.
+	 */
+	public function _sanitize_stylesheet_callback( $stylesheet ) {
+		return urldecode( $stylesheet );
+	}
+
 	/**
 	 * Checks if a given request has access to read the theme.
 	 *
@@ -316,6 +333,21 @@ class WP_REST_Themes_Controller extends WP_REST_Controller {
 
 		$response->add_links( $this->prepare_links( $theme ) );
 
+		if ( $theme->get_stylesheet() === wp_get_theme()->get_stylesheet() ) {
+			// This creates a record for the active theme if not existent.
+			$id = WP_Theme_JSON_Resolver::get_user_global_styles_post_id();
+		} else {
+			$user_cpt = WP_Theme_JSON_Resolver::get_user_data_from_wp_global_styles( $theme );
+			$id       = isset( $user_cpt['ID'] ) ? $user_cpt['ID'] : null;
+		}
+
+		if ( $id ) {
+			$response->add_link(
+				'https://api.w.org/user-global-styles',
+				rest_url( 'wp/v2/global-styles/' . $id )
+			);
+		}
+
 		/**
 		 * Filters theme data returned from the REST API.
 		 *
diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-url-details-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-url-details-controller.php
index 27d8a9c6bf..609177463c 100644
--- a/src/wp-includes/rest-api/endpoints/class-wp-rest-url-details-controller.php
+++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-url-details-controller.php
@@ -451,7 +451,7 @@ class WP_REST_URL_Details_Controller extends WP_REST_Controller {
 	 * @return mixed The value from the cache.
 	 */
 	private function get_cache( $key ) {
-		return get_transient( $key );
+		return get_site_transient( $key );
 	}
 
 	/**
@@ -478,7 +478,7 @@ class WP_REST_URL_Details_Controller extends WP_REST_Controller {
 		 */
 		$cache_expiration = apply_filters( 'rest_url_details_cache_expiration', $ttl );
 
-		return set_transient( $key, $data, $cache_expiration );
+		return set_site_transient( $key, $data, $cache_expiration );
 	}
 
 	/**
@@ -557,7 +557,7 @@ class WP_REST_URL_Details_Controller extends WP_REST_Controller {
 		$pattern = '#<meta\s' .
 
 				/*
-				 * Alows for additional attributes before the content attribute.
+				 * Allows for additional attributes before the content attribute.
 				 * Searches for anything other than > symbol.
 				 */
 				'[^>]*' .
@@ -643,7 +643,7 @@ class WP_REST_URL_Details_Controller extends WP_REST_Controller {
 				 */
 				'#isU';
 
-		// Find the metdata element.
+		// Find the metadata element.
 		foreach ( $meta_elements[0] as $index => $element ) {
 			preg_match( $pattern, $element, $match );
 
diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php
index e3e5d935d7..a299580be1 100644
--- a/src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php
+++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php
@@ -311,6 +311,12 @@ class WP_REST_Users_Controller extends WP_REST_Controller {
 			$prepared_args['has_published_posts'] = get_post_types( array( 'show_in_rest' => true ), 'names' );
 		}
 
+		if ( ! empty( $request['has_published_posts'] ) ) {
+			$prepared_args['has_published_posts'] = ( true === $request['has_published_posts'] )
+				? get_post_types( array( 'show_in_rest' => true ), 'names' )
+				: (array) $request['has_published_posts'];
+		}
+
 		if ( ! empty( $prepared_args['search'] ) ) {
 			$prepared_args['search'] = '*' . $prepared_args['search'] . '*';
 		}
@@ -1580,6 +1586,15 @@ class WP_REST_Users_Controller extends WP_REST_Controller {
 			),
 		);
 
+		$query_params['has_published_posts'] = array(
+			'description' => __( 'Limit result set to users who have published posts.' ),
+			'type'        => array( 'boolean', 'array' ),
+			'items'       => array(
+				'type' => 'string',
+				'enum' => get_post_types( array( 'show_in_rest' => true ), 'names' ),
+			),
+		);
+
 		/**
 		 * Filters REST API collection parameters for the users controller.
 		 *
diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-widget-types-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-widget-types-controller.php
index 82c3a5255e..e38d46b918 100644
--- a/src/wp-includes/rest-api/endpoints/class-wp-rest-widget-types-controller.php
+++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-widget-types-controller.php
@@ -99,6 +99,29 @@ class WP_REST_Widget_Types_Controller extends WP_REST_Controller {
 				),
 			)
 		);
+
+		register_rest_route(
+			$this->namespace,
+			'/' . $this->rest_base . '/(?P<id>[a-zA-Z0-9_-]+)/render',
+			array(
+				array(
+					'methods'             => WP_REST_Server::CREATABLE,
+					'permission_callback' => array( $this, 'get_item_permissions_check' ),
+					'callback'            => array( $this, 'render' ),
+					'args'                => array(
+						'id'       => array(
+							'description' => __( 'The widget type id.' ),
+							'type'        => 'string',
+							'required'    => true,
+						),
+						'instance' => array(
+							'description' => __( 'Current instance settings of the widget.' ),
+							'type'        => 'object',
+						),
+					),
+				),
+			)
+		);
 	}
 
 	/**
@@ -559,6 +582,78 @@ class WP_REST_Widget_Types_Controller extends WP_REST_Controller {
 		return ob_get_clean();
 	}
 
+	/**
+	 * Renders a single Legacy Widget and wraps it in a JSON-encodable array.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_REST_Request $request Full details about the request.
+	 *
+	 * @return array An array with rendered Legacy Widget HTML.
+	 */
+	public function render( $request ) {
+		return array(
+			'preview' => $this->render_legacy_widget_preview_iframe(
+				$request['id'],
+				isset( $request['instance'] ) ? $request['instance'] : null
+			),
+		);
+	}
+
+	/**
+	 * Renders a page containing a preview of the requested Legacy Widget block.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param string $id_base The id base of the requested widget.
+	 * @param array  $instance The widget instance attributes.
+	 *
+	 * @return string Rendered Legacy Widget block preview.
+	 */
+	private function render_legacy_widget_preview_iframe( $id_base, $instance ) {
+		if ( ! defined( 'IFRAME_REQUEST' ) ) {
+			define( 'IFRAME_REQUEST', true );
+		}
+
+		ob_start();
+		?>
+		<!doctype html>
+		<html <?php language_attributes(); ?>>
+		<head>
+			<meta charset="<?php bloginfo( 'charset' ); ?>" />
+			<meta name="viewport" content="width=device-width, initial-scale=1" />
+			<link rel="profile" href="https://gmpg.org/xfn/11" />
+			<?php wp_head(); ?>
+			<style>
+				/* Reset theme styles */
+				html, body, #page, #content {
+					padding: 0 !important;
+					margin: 0 !important;
+				}
+			</style>
+		</head>
+		<body <?php body_class(); ?>>
+		<div id="page" class="site">
+			<div id="content" class="site-content">
+				<?php
+				$registry = WP_Block_Type_Registry::get_instance();
+				$block    = $registry->get_registered( 'core/legacy-widget' );
+				echo $block->render(
+					array(
+						'idBase'   => $id_base,
+						'instance' => $instance,
+					)
+				);
+				?>
+			</div><!-- #content -->
+		</div><!-- #page -->
+		<?php wp_footer(); ?>
+		</body>
+		</html>
+		<?php
+		return ob_get_clean();
+	}
+
 	/**
 	 * Retrieves the query params for collections.
 	 *
diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-widgets-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-widgets-controller.php
index 6385be8ef8..079f18cc1f 100644
--- a/src/wp-includes/rest-api/endpoints/class-wp-rest-widgets-controller.php
+++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-widgets-controller.php
@@ -24,6 +24,14 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller {
 	 */
 	protected $widgets_retrieved = false;
 
+	/**
+	 * Whether the controller supports batching.
+	 *
+	 * @since 5.9.0
+	 * @var array
+	 */
+	protected $allow_batch = array( 'v1' => true );
+
 	/**
 	 * Widgets controller constructor.
 	 *
@@ -56,7 +64,7 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller {
 					'permission_callback' => array( $this, 'create_item_permissions_check' ),
 					'args'                => $this->get_endpoint_args_for_item_schema(),
 				),
-				'allow_batch' => array( 'v1' => true ),
+				'allow_batch' => $this->allow_batch,
 				'schema'      => array( $this, 'get_public_item_schema' ),
 			)
 		);
@@ -90,7 +98,7 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller {
 						),
 					),
 				),
-				'allow_batch' => array( 'v1' => true ),
+				'allow_batch' => $this->allow_batch,
 				'schema'      => array( $this, 'get_public_item_schema' ),
 			)
 		);
@@ -180,7 +188,7 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller {
 	 *
 	 * @since 5.9.0
 	 *
-	 * @param string $sidebar_id The sidebar id.
+	 * @param string $sidebar_id The sidebar ID.
 	 * @return bool Whether the sidebar can be read.
 	 */
 	protected function check_read_sidebar_permission( $sidebar_id ) {
@@ -452,10 +460,10 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller {
 		 *
 		 * @since 5.8.0
 		 *
-		 * @param string           $widget_id  ID of the widget marked for deletion.
-		 * @param string           $sidebar_id ID of the sidebar the widget was deleted from.
-		 * @param WP_REST_Response $response   The response data.
-		 * @param WP_REST_Request  $request    The request sent to the API.
+		 * @param string                    $widget_id  ID of the widget marked for deletion.
+		 * @param string                    $sidebar_id ID of the sidebar the widget was deleted from.
+		 * @param WP_REST_Response|WP_Error $response   The response data, or WP_Error object on failure.
+		 * @param WP_REST_Request           $request    The request sent to the API.
 		 */
 		do_action( 'rest_delete_widget', $widget_id, $sidebar_id, $response, $request );
 
@@ -725,9 +733,9 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller {
 		 *
 		 * @since 5.8.0
 		 *
-		 * @param WP_REST_Response $response The response object.
-		 * @param array            $widget   The registered widget data.
-		 * @param WP_REST_Request  $request  Request used to generate the response.
+		 * @param WP_REST_Response|WP_Error $response The response object, or WP_Error object on failure.
+		 * @param array                     $widget   The registered widget data.
+		 * @param WP_REST_Request           $request  Request used to generate the response.
 		 */
 		return apply_filters( 'rest_prepare_widget', $response, $widget, $request );
 	}
diff --git a/src/wp-includes/revision.php b/src/wp-includes/revision.php
index 70051a07da..06701eb89c 100644
--- a/src/wp-includes/revision.php
+++ b/src/wp-includes/revision.php
@@ -516,6 +516,40 @@ function wp_get_post_revisions( $post_id = 0, $args = null ) {
 	return $revisions;
 }
 
+/**
+ * Returns the url for viewing and potentially restoring revisions of a given post.
+ *
+ * @since 5.9.0
+ *
+ * @param int|WP_Post $post_id Optional. Post ID or WP_Post object. Default is global `$post`.
+ * @return null|string The URL for editing revisions on the given post, otherwise null.
+ */
+function wp_get_post_revisions_url( $post_id = 0 ) {
+	$post = get_post( $post_id );
+
+	if ( ! $post instanceof WP_Post ) {
+		return null;
+	}
+
+	// If the post is a revision, return early.
+	if ( 'revision' === $post->post_type ) {
+		return get_edit_post_link( $post );
+	}
+
+	if ( ! wp_revisions_enabled( $post ) ) {
+		return null;
+	}
+
+	$revisions = wp_get_post_revisions( $post->ID, array( 'posts_per_page' => 1 ) );
+
+	if ( 0 === count( $revisions ) ) {
+		return null;
+	}
+
+	$revision = reset( $revisions );
+	return get_edit_post_link( $revision );
+}
+
 /**
  * Determine if revisions are enabled for a given post.
  *
@@ -604,15 +638,14 @@ function _set_preview( $post ) {
 	}
 
 	$preview = wp_get_post_autosave( $post->ID );
-	if ( ! is_object( $preview ) ) {
-		return $post;
-	}
 
-	$preview = sanitize_post( $preview );
+	if ( is_object( $preview ) ) {
+		$preview = sanitize_post( $preview );
 
-	$post->post_content = $preview->post_content;
-	$post->post_title   = $preview->post_title;
-	$post->post_excerpt = $preview->post_excerpt;
+		$post->post_content = $preview->post_content;
+		$post->post_title   = $preview->post_title;
+		$post->post_excerpt = $preview->post_excerpt;
+	}
 
 	add_filter( 'get_the_terms', '_wp_preview_terms_filter', 10, 3 );
 	add_filter( 'get_post_metadata', '_wp_preview_post_thumbnail_filter', 10, 3 );
diff --git a/src/wp-includes/script-loader.php b/src/wp-includes/script-loader.php
index 801da32c21..d351a502d6 100644
--- a/src/wp-includes/script-loader.php
+++ b/src/wp-includes/script-loader.php
@@ -103,9 +103,9 @@ function wp_default_packages_vendor( $scripts ) {
 	);
 
 	$vendor_scripts_versions = array(
-		'react'                       => '16.13.1',
-		'react-dom'                   => '16.13.1',
-		'regenerator-runtime'         => '0.13.7',
+		'react'                       => '17.0.1',
+		'react-dom'                   => '17.0.1',
+		'regenerator-runtime'         => '0.13.9',
 		'moment'                      => '2.29.1',
 		'lodash'                      => '4.17.19',
 		'wp-polyfill-fetch'           => '3.6.2',
@@ -309,7 +309,7 @@ function wp_default_packages_inline_scripts( $scripts ) {
 			array(
 				sprintf(
 					'wp.apiFetch.nonceMiddleware = wp.apiFetch.createNonceMiddleware( "%s" );',
-					( wp_installing() && ! is_multisite() ) ? '' : wp_create_nonce( 'wp_rest' )
+					wp_installing() ? '' : wp_create_nonce( 'wp_rest' )
 				),
 				'wp.apiFetch.use( wp.apiFetch.nonceMiddleware );',
 				'wp.apiFetch.use( wp.apiFetch.mediaUploadMiddleware );',
@@ -711,7 +711,7 @@ function wp_default_scripts( $scripts ) {
 		'wpApiSettings',
 		array(
 			'root'          => esc_url_raw( get_rest_url() ),
-			'nonce'         => ( wp_installing() && ! is_multisite() ) ? '' : wp_create_nonce( 'wp_rest' ),
+			'nonce'         => wp_installing() ? '' : wp_create_nonce( 'wp_rest' ),
 			'versionString' => 'wp/v2/',
 		)
 	);
@@ -765,55 +765,55 @@ function wp_default_scripts( $scripts ) {
 	// In order to keep backwards compatibility, and to keep the optimized loading,
 	// the source files were flattened and included with some modifications for AMD loading.
 	// A notable change is that 'jquery-ui-core' now contains 'jquery-ui-position' and 'jquery-ui-widget'.
-	$scripts->add( 'jquery-ui-core', "/wp-includes/js/jquery/ui/core$suffix.js", array( 'jquery' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-effects-core', "/wp-includes/js/jquery/ui/effect$suffix.js", array( 'jquery' ), '1.13.0', 1 );
-
-	$scripts->add( 'jquery-effects-blind', "/wp-includes/js/jquery/ui/effect-blind$suffix.js", array( 'jquery-effects-core' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-effects-bounce', "/wp-includes/js/jquery/ui/effect-bounce$suffix.js", array( 'jquery-effects-core' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-effects-clip', "/wp-includes/js/jquery/ui/effect-clip$suffix.js", array( 'jquery-effects-core' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-effects-drop', "/wp-includes/js/jquery/ui/effect-drop$suffix.js", array( 'jquery-effects-core' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-effects-explode', "/wp-includes/js/jquery/ui/effect-explode$suffix.js", array( 'jquery-effects-core' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-effects-fade', "/wp-includes/js/jquery/ui/effect-fade$suffix.js", array( 'jquery-effects-core' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-effects-fold', "/wp-includes/js/jquery/ui/effect-fold$suffix.js", array( 'jquery-effects-core' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-effects-highlight', "/wp-includes/js/jquery/ui/effect-highlight$suffix.js", array( 'jquery-effects-core' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-effects-puff', "/wp-includes/js/jquery/ui/effect-puff$suffix.js", array( 'jquery-effects-core', 'jquery-effects-scale' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-effects-pulsate', "/wp-includes/js/jquery/ui/effect-pulsate$suffix.js", array( 'jquery-effects-core' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-effects-scale', "/wp-includes/js/jquery/ui/effect-scale$suffix.js", array( 'jquery-effects-core', 'jquery-effects-size' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-effects-shake', "/wp-includes/js/jquery/ui/effect-shake$suffix.js", array( 'jquery-effects-core' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-effects-size', "/wp-includes/js/jquery/ui/effect-size$suffix.js", array( 'jquery-effects-core' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-effects-slide', "/wp-includes/js/jquery/ui/effect-slide$suffix.js", array( 'jquery-effects-core' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-effects-transfer', "/wp-includes/js/jquery/ui/effect-transfer$suffix.js", array( 'jquery-effects-core' ), '1.13.0', 1 );
+	$scripts->add( 'jquery-ui-core', "/wp-includes/js/jquery/ui/core$suffix.js", array( 'jquery' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-effects-core', "/wp-includes/js/jquery/ui/effect$suffix.js", array( 'jquery' ), '1.13.1', 1 );
+
+	$scripts->add( 'jquery-effects-blind', "/wp-includes/js/jquery/ui/effect-blind$suffix.js", array( 'jquery-effects-core' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-effects-bounce', "/wp-includes/js/jquery/ui/effect-bounce$suffix.js", array( 'jquery-effects-core' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-effects-clip', "/wp-includes/js/jquery/ui/effect-clip$suffix.js", array( 'jquery-effects-core' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-effects-drop', "/wp-includes/js/jquery/ui/effect-drop$suffix.js", array( 'jquery-effects-core' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-effects-explode', "/wp-includes/js/jquery/ui/effect-explode$suffix.js", array( 'jquery-effects-core' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-effects-fade', "/wp-includes/js/jquery/ui/effect-fade$suffix.js", array( 'jquery-effects-core' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-effects-fold', "/wp-includes/js/jquery/ui/effect-fold$suffix.js", array( 'jquery-effects-core' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-effects-highlight', "/wp-includes/js/jquery/ui/effect-highlight$suffix.js", array( 'jquery-effects-core' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-effects-puff', "/wp-includes/js/jquery/ui/effect-puff$suffix.js", array( 'jquery-effects-core', 'jquery-effects-scale' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-effects-pulsate', "/wp-includes/js/jquery/ui/effect-pulsate$suffix.js", array( 'jquery-effects-core' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-effects-scale', "/wp-includes/js/jquery/ui/effect-scale$suffix.js", array( 'jquery-effects-core', 'jquery-effects-size' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-effects-shake', "/wp-includes/js/jquery/ui/effect-shake$suffix.js", array( 'jquery-effects-core' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-effects-size', "/wp-includes/js/jquery/ui/effect-size$suffix.js", array( 'jquery-effects-core' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-effects-slide', "/wp-includes/js/jquery/ui/effect-slide$suffix.js", array( 'jquery-effects-core' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-effects-transfer', "/wp-includes/js/jquery/ui/effect-transfer$suffix.js", array( 'jquery-effects-core' ), '1.13.1', 1 );
 
 	// Widgets
-	$scripts->add( 'jquery-ui-accordion', "/wp-includes/js/jquery/ui/accordion$suffix.js", array( 'jquery-ui-core' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-ui-autocomplete', "/wp-includes/js/jquery/ui/autocomplete$suffix.js", array( 'jquery-ui-menu', 'wp-a11y' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-ui-button', "/wp-includes/js/jquery/ui/button$suffix.js", array( 'jquery-ui-core', 'jquery-ui-controlgroup', 'jquery-ui-checkboxradio' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-ui-datepicker', "/wp-includes/js/jquery/ui/datepicker$suffix.js", array( 'jquery-ui-core' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-ui-dialog', "/wp-includes/js/jquery/ui/dialog$suffix.js", array( 'jquery-ui-resizable', 'jquery-ui-draggable', 'jquery-ui-button' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-ui-menu', "/wp-includes/js/jquery/ui/menu$suffix.js", array( 'jquery-ui-core' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-ui-mouse', "/wp-includes/js/jquery/ui/mouse$suffix.js", array( 'jquery-ui-core' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-ui-progressbar', "/wp-includes/js/jquery/ui/progressbar$suffix.js", array( 'jquery-ui-core' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-ui-selectmenu', "/wp-includes/js/jquery/ui/selectmenu$suffix.js", array( 'jquery-ui-menu' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-ui-slider', "/wp-includes/js/jquery/ui/slider$suffix.js", array( 'jquery-ui-mouse' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-ui-spinner', "/wp-includes/js/jquery/ui/spinner$suffix.js", array( 'jquery-ui-button' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-ui-tabs', "/wp-includes/js/jquery/ui/tabs$suffix.js", array( 'jquery-ui-core' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-ui-tooltip', "/wp-includes/js/jquery/ui/tooltip$suffix.js", array( 'jquery-ui-core' ), '1.13.0', 1 );
+	$scripts->add( 'jquery-ui-accordion', "/wp-includes/js/jquery/ui/accordion$suffix.js", array( 'jquery-ui-core' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-ui-autocomplete', "/wp-includes/js/jquery/ui/autocomplete$suffix.js", array( 'jquery-ui-menu', 'wp-a11y' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-ui-button', "/wp-includes/js/jquery/ui/button$suffix.js", array( 'jquery-ui-core', 'jquery-ui-controlgroup', 'jquery-ui-checkboxradio' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-ui-datepicker', "/wp-includes/js/jquery/ui/datepicker$suffix.js", array( 'jquery-ui-core' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-ui-dialog', "/wp-includes/js/jquery/ui/dialog$suffix.js", array( 'jquery-ui-resizable', 'jquery-ui-draggable', 'jquery-ui-button' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-ui-menu', "/wp-includes/js/jquery/ui/menu$suffix.js", array( 'jquery-ui-core' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-ui-mouse', "/wp-includes/js/jquery/ui/mouse$suffix.js", array( 'jquery-ui-core' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-ui-progressbar', "/wp-includes/js/jquery/ui/progressbar$suffix.js", array( 'jquery-ui-core' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-ui-selectmenu', "/wp-includes/js/jquery/ui/selectmenu$suffix.js", array( 'jquery-ui-menu' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-ui-slider', "/wp-includes/js/jquery/ui/slider$suffix.js", array( 'jquery-ui-mouse' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-ui-spinner', "/wp-includes/js/jquery/ui/spinner$suffix.js", array( 'jquery-ui-button' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-ui-tabs', "/wp-includes/js/jquery/ui/tabs$suffix.js", array( 'jquery-ui-core' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-ui-tooltip', "/wp-includes/js/jquery/ui/tooltip$suffix.js", array( 'jquery-ui-core' ), '1.13.1', 1 );
 
 	// New in 1.12.1
-	$scripts->add( 'jquery-ui-checkboxradio', "/wp-includes/js/jquery/ui/checkboxradio$suffix.js", array( 'jquery-ui-core' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-ui-controlgroup', "/wp-includes/js/jquery/ui/controlgroup$suffix.js", array( 'jquery-ui-core' ), '1.13.0', 1 );
+	$scripts->add( 'jquery-ui-checkboxradio', "/wp-includes/js/jquery/ui/checkboxradio$suffix.js", array( 'jquery-ui-core' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-ui-controlgroup', "/wp-includes/js/jquery/ui/controlgroup$suffix.js", array( 'jquery-ui-core' ), '1.13.1', 1 );
 
 	// Interactions
-	$scripts->add( 'jquery-ui-draggable', "/wp-includes/js/jquery/ui/draggable$suffix.js", array( 'jquery-ui-mouse' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-ui-droppable', "/wp-includes/js/jquery/ui/droppable$suffix.js", array( 'jquery-ui-draggable' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-ui-resizable', "/wp-includes/js/jquery/ui/resizable$suffix.js", array( 'jquery-ui-mouse' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-ui-selectable', "/wp-includes/js/jquery/ui/selectable$suffix.js", array( 'jquery-ui-mouse' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-ui-sortable', "/wp-includes/js/jquery/ui/sortable$suffix.js", array( 'jquery-ui-mouse' ), '1.13.0', 1 );
+	$scripts->add( 'jquery-ui-draggable', "/wp-includes/js/jquery/ui/draggable$suffix.js", array( 'jquery-ui-mouse' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-ui-droppable', "/wp-includes/js/jquery/ui/droppable$suffix.js", array( 'jquery-ui-draggable' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-ui-resizable', "/wp-includes/js/jquery/ui/resizable$suffix.js", array( 'jquery-ui-mouse' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-ui-selectable', "/wp-includes/js/jquery/ui/selectable$suffix.js", array( 'jquery-ui-mouse' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-ui-sortable', "/wp-includes/js/jquery/ui/sortable$suffix.js", array( 'jquery-ui-mouse' ), '1.13.1', 1 );
 
 	// As of 1.12.1 `jquery-ui-position` and `jquery-ui-widget` are part of `jquery-ui-core`.
 	// Listed here for back-compat.
-	$scripts->add( 'jquery-ui-position', false, array( 'jquery-ui-core' ), '1.13.0', 1 );
-	$scripts->add( 'jquery-ui-widget', false, array( 'jquery-ui-core' ), '1.13.0', 1 );
+	$scripts->add( 'jquery-ui-position', false, array( 'jquery-ui-core' ), '1.13.1', 1 );
+	$scripts->add( 'jquery-ui-widget', false, array( 'jquery-ui-core' ), '1.13.1', 1 );
 
 	// Strings for 'jquery-ui-autocomplete' live region messages.
 	did_action( 'init' ) && $scripts->localize(
@@ -833,7 +833,7 @@ function wp_default_scripts( $scripts ) {
 	$scripts->add( 'jquery-form', "/wp-includes/js/jquery/jquery.form$suffix.js", array( 'jquery' ), '4.3.0', 1 );
 
 	// jQuery plugins.
-	$scripts->add( 'jquery-color', '/wp-includes/js/jquery/jquery.color.min.js', array( 'jquery' ), '2.1.2', 1 );
+	$scripts->add( 'jquery-color', '/wp-includes/js/jquery/jquery.color.min.js', array( 'jquery' ), '2.2.0', 1 );
 	$scripts->add( 'schedule', '/wp-includes/js/jquery/jquery.schedule.js', array( 'jquery' ), '20m', 1 );
 	$scripts->add( 'jquery-query', '/wp-includes/js/jquery/jquery.query.js', array( 'jquery' ), '2.1.7', 1 );
 	$scripts->add( 'jquery-serialize-object', '/wp-includes/js/jquery/jquery.serialize-object.js', array( 'jquery' ), '0.2-wp', 1 );
@@ -883,7 +883,7 @@ function wp_default_scripts( $scripts ) {
 		'missing_upload_url'        => __( 'There was a configuration error. Please contact the server administrator.' ),
 		'upload_limit_exceeded'     => __( 'You may only upload 1 file.' ),
 		'http_error'                => __( 'Unexpected response from the server. The file may have been uploaded successfully. Check in the Media Library or reload the page.' ),
-		'http_error_image'          => __( 'Post-processing of the image failed likely because the server is busy or does not have enough resources. Uploading a smaller image may help. Suggested maximum size is 2500 pixels.' ),
+		'http_error_image'          => __( 'The server cannot process the image. This can happen if the server is busy or does not have enough resources to complete the task. Uploading a smaller image may help. Suggested maximum size is 2560 pixels.' ),
 		'upload_failed'             => __( 'Upload failed.' ),
 		/* translators: 1: Opening link tag, 2: Closing link tag. */
 		'big_upload_failed'         => __( 'Please try uploading this file with the %1$sbrowser uploader%2$s.' ),
@@ -1109,7 +1109,7 @@ function wp_default_scripts( $scripts ) {
 		'userProfileL10n',
 		array(
 			'user_id' => $user_id,
-			'nonce'   => ( wp_installing() && ! is_multisite() ) ? '' : wp_create_nonce( 'reset-password-for-' . $user_id ),
+			'nonce'   => wp_installing() ? '' : wp_create_nonce( 'reset-password-for-' . $user_id ),
 		)
 	);
 
@@ -1142,7 +1142,7 @@ function wp_default_scripts( $scripts ) {
 
 	$scripts->add( 'media-upload', "/wp-admin/js/media-upload$suffix.js", array( 'thickbox', 'shortcode' ), false, 1 );
 
-	$scripts->add( 'hoverIntent', "/wp-includes/js/hoverIntent$suffix.js", array( 'jquery' ), '1.10.1', 1 );
+	$scripts->add( 'hoverIntent', "/wp-includes/js/hoverIntent$suffix.js", array( 'jquery' ), '1.10.2', 1 );
 
 	// JS-only version of hoverintent (no dependencies).
 	$scripts->add( 'hoverintent-js', '/wp-includes/js/hoverintent-js.min.js', array(), '2.2.1', 1 );
@@ -1247,7 +1247,7 @@ function wp_default_scripts( $scripts ) {
 		)
 	);
 
-	$scripts->add( 'wp-embed', "/wp-includes/js/wp-embed$suffix.js" );
+	$scripts->add( 'wp-embed', "/wp-includes/js/wp-embed$suffix.js", array(), false, 1 );
 
 	// To enqueue media-views or media-editor, call wp_enqueue_media().
 	// Both rely on numerous settings, styles, and templates to operate correctly.
@@ -1335,7 +1335,7 @@ function wp_default_scripts( $scripts ) {
 			'updates',
 			'_wpUpdatesSettings',
 			array(
-				'ajax_nonce' => wp_create_nonce( 'updates' ),
+				'ajax_nonce' => wp_installing() ? '' : wp_create_nonce( 'updates' ),
 			)
 		);
 
@@ -1598,6 +1598,11 @@ function wp_default_styles( $styles ) {
 			'wp-block-library',
 			'wp-reusable-blocks',
 		),
+		'edit-site'            => array(
+			'wp-components',
+			'wp-block-editor',
+			'wp-edit-blocks',
+		),
 	);
 
 	foreach ( $package_styles as $package => $dependencies ) {
@@ -1655,6 +1660,7 @@ function wp_default_styles( $styles ) {
 		'wp-components',
 		'wp-customize-widgets',
 		'wp-edit-post',
+		'wp-edit-site',
 		'wp-edit-widgets',
 		'wp-editor',
 		'wp-format-library',
@@ -1810,7 +1816,7 @@ function wp_localize_jquery_ui_datepicker() {
 		)
 	);
 
-	wp_add_inline_script( 'jquery-ui-datepicker', "jQuery(document).ready(function(jQuery){jQuery.datepicker.setDefaults({$datepicker_defaults});});" );
+	wp_add_inline_script( 'jquery-ui-datepicker', "jQuery(function(jQuery){jQuery.datepicker.setDefaults({$datepicker_defaults});});" );
 }
 
 /**
@@ -2229,6 +2235,8 @@ function script_concat_settings() {
 
 	$compressed_output = ( ini_get( 'zlib.output_compression' ) || 'ob_gzhandler' === ini_get( 'output_handler' ) );
 
+	$can_compress_scripts = ! wp_installing() && get_site_option( 'can_compress_scripts' );
+
 	if ( ! isset( $concatenate_scripts ) ) {
 		$concatenate_scripts = defined( 'CONCATENATE_SCRIPTS' ) ? CONCATENATE_SCRIPTS : true;
 		if ( ( ! is_admin() && ! did_action( 'login_init' ) ) || ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ) {
@@ -2238,14 +2246,14 @@ function script_concat_settings() {
 
 	if ( ! isset( $compress_scripts ) ) {
 		$compress_scripts = defined( 'COMPRESS_SCRIPTS' ) ? COMPRESS_SCRIPTS : true;
-		if ( $compress_scripts && ( ! get_site_option( 'can_compress_scripts' ) || $compressed_output ) ) {
+		if ( $compress_scripts && ( ! $can_compress_scripts || $compressed_output ) ) {
 			$compress_scripts = false;
 		}
 	}
 
 	if ( ! isset( $compress_css ) ) {
 		$compress_css = defined( 'COMPRESS_CSS' ) ? COMPRESS_CSS : true;
-		if ( $compress_css && ( ! get_site_option( 'can_compress_scripts' ) || $compressed_output ) ) {
+		if ( $compress_css && ( ! $can_compress_scripts || $compressed_output ) ) {
 			$compress_css = false;
 		}
 	}
@@ -2265,7 +2273,19 @@ function wp_common_block_scripts_and_styles() {
 	wp_enqueue_style( 'wp-block-library' );
 
 	if ( current_theme_supports( 'wp-block-styles' ) ) {
-		wp_enqueue_style( 'wp-block-library-theme' );
+		if ( wp_should_load_separate_core_block_assets() ) {
+			$suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? 'css' : 'min.css';
+			$files  = glob( __DIR__ . "/blocks/**/theme.$suffix" );
+			foreach ( $files as $path ) {
+				$block_name = basename( dirname( $path ) );
+				if ( is_rtl() && file_exists( __DIR__ . "/blocks/$block_name/theme-rtl.$suffix" ) ) {
+					$path = __DIR__ . "/blocks/$block_name/theme-rtl.$suffix";
+				}
+				wp_add_inline_style( "wp-block-{$block_name}", file_get_contents( $path ) );
+			}
+		} else {
+			wp_enqueue_style( 'wp-block-library-theme' );
+		}
 	}
 
 	/**
@@ -2287,10 +2307,6 @@ function wp_common_block_scripts_and_styles() {
  * @since 5.8.0
  */
 function wp_enqueue_global_styles() {
-	if ( ! WP_Theme_JSON_Resolver::theme_has_support() ) {
-		return;
-	}
-
 	$separate_assets = wp_should_load_separate_core_block_assets();
 
 	/*
@@ -2303,32 +2319,7 @@ function wp_enqueue_global_styles() {
 		return;
 	}
 
-	$can_use_cache = (
-		( ! defined( 'WP_DEBUG' ) || ! WP_DEBUG ) &&
-		( ! defined( 'SCRIPT_DEBUG' ) || ! SCRIPT_DEBUG ) &&
-		( ! defined( 'REST_REQUEST' ) || ! REST_REQUEST ) &&
-		! is_admin()
-	);
-
-	$stylesheet     = null;
-	$transient_name = 'global_styles_' . get_stylesheet();
-
-	if ( $can_use_cache ) {
-		$cache = get_transient( $transient_name );
-		if ( $cache ) {
-			$stylesheet = $cache;
-		}
-	}
-
-	if ( null === $stylesheet ) {
-		$settings   = get_default_block_editor_settings();
-		$theme_json = WP_Theme_JSON_Resolver::get_merged_data( $settings );
-		$stylesheet = $theme_json->get_stylesheet();
-
-		if ( $can_use_cache ) {
-			set_transient( $transient_name, $stylesheet, MINUTE_IN_SECONDS );
-		}
-	}
+	$stylesheet = wp_get_global_stylesheet();
 
 	if ( empty( $stylesheet ) ) {
 		return;
@@ -2466,10 +2457,14 @@ function enqueue_block_styles_assets() {
 				if ( wp_should_load_separate_core_block_assets() ) {
 					add_filter(
 						'render_block',
-						function( $html ) use ( $style_properties ) {
-							wp_enqueue_style( $style_properties['style_handle'] );
+						function( $html, $block ) use ( $block_name, $style_properties ) {
+							if ( $block['blockName'] === $block_name ) {
+								wp_enqueue_style( $style_properties['style_handle'] );
+							}
 							return $html;
-						}
+						},
+						10,
+						2
 					);
 				} else {
 					wp_enqueue_style( $style_properties['style_handle'] );
@@ -2631,7 +2626,7 @@ function wp_print_script_tag( $attributes ) {
  * @since 5.7.0
  *
  * @param string $javascript Inline JavaScript code.
- * @param array  $attributes  Optional. Key-value pairs representing `<script>` tag attributes.
+ * @param array  $attributes Optional. Key-value pairs representing `<script>` tag attributes.
  * @return string String containing inline JavaScript code wrapped around `<script>` tag.
  */
 function wp_get_inline_script_tag( $javascript, $attributes = array() ) {
@@ -2643,9 +2638,10 @@ function wp_get_inline_script_tag( $javascript, $attributes = array() ) {
 	 *
 	 * @since 5.7.0
 	 *
-	 * @param array $attributes Key-value pairs representing `<script>` tag attributes.
-	 *                          Only the attribute name is added to the `<script>` tag for
-	 *                          entries with a boolean value, and that are true.
+	 * @param array  $attributes Key-value pairs representing `<script>` tag attributes.
+	 *                           Only the attribute name is added to the `<script>` tag for
+	 *                           entries with a boolean value, and that are true.
+	 * @param string $javascript Inline JavaScript code.
 	 */
 	$attributes = apply_filters( 'wp_inline_script_attributes', $attributes, $javascript );
 
@@ -2701,6 +2697,7 @@ function wp_maybe_inline_styles() {
 		if ( wp_styles()->get_data( $handle, 'path' ) && file_exists( $wp_styles->registered[ $handle ]->extra['path'] ) ) {
 			$styles[] = array(
 				'handle' => $handle,
+				'src'    => $wp_styles->registered[ $handle ]->src,
 				'path'   => $wp_styles->registered[ $handle ]->extra['path'],
 				'size'   => filesize( $wp_styles->registered[ $handle ]->extra['path'] ),
 			);
@@ -2735,6 +2732,10 @@ function wp_maybe_inline_styles() {
 			// Get the styles if we don't already have them.
 			$style['css'] = file_get_contents( $style['path'] );
 
+			// Check if the style contains relative URLs that need to be modified.
+			// URLs relative to the stylesheet's path should be converted to relative to the site's root.
+			$style['css'] = _wp_normalize_relative_css_links( $style['css'], $style['src'] );
+
 			// Set `src` to `false` and add styles inline.
 			$wp_styles->registered[ $style['handle'] ]->src = false;
 			if ( empty( $wp_styles->registered[ $style['handle'] ]->extra['after'] ) ) {
@@ -2748,12 +2749,58 @@ function wp_maybe_inline_styles() {
 	}
 }
 
+/**
+ * Make URLs relative to the WordPress installation.
+ *
+ * @since 5.9.0
+ * @access private
+ *
+ * @param string $css            The CSS to make URLs relative to the WordPress installation.
+ * @param string $stylesheet_url The URL to the stylesheet.
+ *
+ * @return string The CSS with URLs made relative to the WordPress installation.
+ */
+function _wp_normalize_relative_css_links( $css, $stylesheet_url ) {
+	$has_src_results = preg_match_all( '#url\s*\(\s*[\'"]?\s*([^\'"\)]+)#', $css, $src_results );
+	if ( $has_src_results ) {
+		// Loop through the URLs to find relative ones.
+		foreach ( $src_results[1] as $src_index => $src_result ) {
+			// Skip if this is an absolute URL.
+			if ( 0 === strpos( $src_result, 'http' ) || 0 === strpos( $src_result, '//' ) ) {
+				continue;
+			}
+
+			// Skip if the URL is an HTML ID.
+			if ( str_starts_with( $src_result, '#' ) ) {
+				continue;
+			}
+
+			// Build the absolute URL.
+			$absolute_url = dirname( $stylesheet_url ) . '/' . $src_result;
+			$absolute_url = str_replace( '/./', '/', $absolute_url );
+			// Convert to URL related to the site root.
+			$relative_url = wp_make_link_relative( $absolute_url );
+
+			// Replace the URL in the CSS.
+			$css = str_replace(
+				$src_results[0][ $src_index ],
+				str_replace( $src_result, $relative_url, $src_results[0][ $src_index ] ),
+				$css
+			);
+		}
+	}
+
+	return $css;
+}
+
 /**
  * Inject the block editor assets that need to be loaded into the editor's iframe as an inline script.
  *
  * @since 5.8.0
  */
 function wp_add_iframed_editor_assets_html() {
+	global $pagenow;
+
 	if ( ! wp_should_load_block_editor_scripts_and_styles() ) {
 		return;
 	}
@@ -2766,6 +2813,11 @@ function wp_add_iframed_editor_assets_html() {
 		'wp-edit-blocks',
 	);
 
+	if ( 'widgets.php' === $pagenow || 'customize.php' === $pagenow ) {
+		$style_handles[] = 'wp-widgets';
+		$style_handles[] = 'wp-edit-widgets';
+	}
+
 	$block_registry = WP_Block_Type_Registry::get_instance();
 
 	foreach ( $block_registry->get_all_registered() as $block_type ) {
@@ -2787,7 +2839,8 @@ function wp_add_iframed_editor_assets_html() {
 
 	ob_start();
 
-	wp_styles()->done = array();
+	// We do not need reset styles for the iframed editor.
+	wp_styles()->done = array( 'wp-reset-editor-styles' );
 	wp_styles()->do_items( $style_handles );
 	wp_styles()->done = $done;
 
@@ -2813,3 +2866,14 @@ function wp_add_iframed_editor_assets_html() {
 
 	echo "<script>window.__editorAssets = $editor_assets</script>";
 }
+
+/**
+ * Function that enqueues the CSS Custom Properties coming from theme.json.
+ *
+ * @since 5.9.0
+ */
+function wp_enqueue_global_styles_css_custom_properties() {
+	wp_register_style( 'global-styles-css-custom-properties', false, array(), true, true );
+	wp_add_inline_style( 'global-styles-css-custom-properties', wp_get_global_stylesheet( array( 'variables' ) ) );
+	wp_enqueue_style( 'global-styles-css-custom-properties' );
+}
diff --git a/src/wp-includes/sitemaps/class-wp-sitemaps-index.php b/src/wp-includes/sitemaps/class-wp-sitemaps-index.php
index 9449b4b6a4..10348494f3 100644
--- a/src/wp-includes/sitemaps/class-wp-sitemaps-index.php
+++ b/src/wp-includes/sitemaps/class-wp-sitemaps-index.php
@@ -27,7 +27,7 @@ class WP_Sitemaps_Index {
 	/**
 	 * Maximum number of sitemaps to include in an index.
 	 *
-	 * @sincee 5.5.0
+	 * @since 5.5.0
 	 *
 	 * @var int Maximum number of sitemaps.
 	 */
diff --git a/src/wp-includes/sitemaps/class-wp-sitemaps-provider.php b/src/wp-includes/sitemaps/class-wp-sitemaps-provider.php
index e77681d721..415ce66ebc 100644
--- a/src/wp-includes/sitemaps/class-wp-sitemaps-provider.php
+++ b/src/wp-includes/sitemaps/class-wp-sitemaps-provider.php
@@ -42,7 +42,7 @@ abstract class WP_Sitemaps_Provider {
 	 *
 	 * @param int    $page_num       Page of results.
 	 * @param string $object_subtype Optional. Object subtype name. Default empty.
-	 * @return array Array of URLs for a sitemap.
+	 * @return array[] Array of URL information for a sitemap.
 	 */
 	abstract public function get_url_list( $page_num, $object_subtype = '' );
 
diff --git a/src/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php b/src/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php
index 701d170a6a..61dffdbd79 100644
--- a/src/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php
+++ b/src/wp-includes/sitemaps/providers/class-wp-sitemaps-posts.php
@@ -59,7 +59,7 @@ class WP_Sitemaps_Posts extends WP_Sitemaps_Provider {
 	 * @param int    $page_num       Page of results.
 	 * @param string $object_subtype Optional. Post type name. Default empty.
 	 *
-	 * @return array Array of URLs for a sitemap.
+	 * @return array[] Array of URL information for a sitemap.
 	 */
 	public function get_url_list( $page_num, $object_subtype = '' ) {
 		// Restores the more descriptive, specific name for use within this method.
@@ -75,14 +75,14 @@ class WP_Sitemaps_Posts extends WP_Sitemaps_Provider {
 		/**
 		 * Filters the posts URL list before it is generated.
 		 *
-		 * Passing a non-null value will effectively short-circuit the generation,
+		 * Returning a non-null value will effectively short-circuit the generation,
 		 * returning that value instead.
 		 *
 		 * @since 5.5.0
 		 *
-		 * @param array  $url_list  The URL list. Default null.
-		 * @param string $post_type Post type name.
-		 * @param int    $page_num  Page of results.
+		 * @param array[]|null $url_list  The URL list. Default null.
+		 * @param string       $post_type Post type name.
+		 * @param int          $page_num  Page of results.
 		 */
 		$url_list = apply_filters(
 			'wp_sitemaps_posts_pre_url_list',
diff --git a/src/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php b/src/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php
index 636815397e..a7a752a080 100644
--- a/src/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php
+++ b/src/wp-includes/sitemaps/providers/class-wp-sitemaps-taxonomies.php
@@ -56,7 +56,7 @@ class WP_Sitemaps_Taxonomies extends WP_Sitemaps_Provider {
 	 *
 	 * @param int    $page_num       Page of results.
 	 * @param string $object_subtype Optional. Taxonomy name. Default empty.
-	 * @return array Array of URLs for a sitemap.
+	 * @return array[] Array of URL information for a sitemap.
 	 */
 	public function get_url_list( $page_num, $object_subtype = '' ) {
 		// Restores the more descriptive, specific name for use within this method.
@@ -71,14 +71,14 @@ class WP_Sitemaps_Taxonomies extends WP_Sitemaps_Provider {
 		/**
 		 * Filters the taxonomies URL list before it is generated.
 		 *
-		 * Passing a non-null value will effectively short-circuit the generation,
+		 * Returning a non-null value will effectively short-circuit the generation,
 		 * returning that value instead.
 		 *
 		 * @since 5.5.0
 		 *
-		 * @param array  $url_list The URL list. Default null.
-		 * @param string $taxonomy Taxonomy name.
-		 * @param int    $page_num Page of results.
+		 * @param array[]|null $url_list The URL list. Default null.
+		 * @param string       $taxonomy Taxonomy name.
+		 * @param int          $page_num Page of results.
 		 */
 		$url_list = apply_filters(
 			'wp_sitemaps_taxonomies_pre_url_list',
@@ -149,15 +149,15 @@ class WP_Sitemaps_Taxonomies extends WP_Sitemaps_Provider {
 		$taxonomy = $object_subtype;
 
 		/**
-		 * Filters the max number of pages before it is generated.
+		 * Filters the max number of pages for a taxonomy sitemap before it is generated.
 		 *
 		 * Passing a non-null value will short-circuit the generation,
 		 * returning that value instead.
 		 *
 		 * @since 5.5.0
 		 *
-		 * @param int    $max_num_pages The maximum number of pages. Default null.
-		 * @param string $taxonomy      Taxonomy name.
+		 * @param int|null $max_num_pages The maximum number of pages. Default null.
+		 * @param string   $taxonomy      Taxonomy name.
 		 */
 		$max_num_pages = apply_filters( 'wp_sitemaps_taxonomies_pre_max_num_pages', null, $taxonomy );
 
diff --git a/src/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php b/src/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php
index 93e63a3b51..a241f2468e 100644
--- a/src/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php
+++ b/src/wp-includes/sitemaps/providers/class-wp-sitemaps-users.php
@@ -34,19 +34,19 @@ class WP_Sitemaps_Users extends WP_Sitemaps_Provider {
 	 * @param string $object_subtype Optional. Not applicable for Users but
 	 *                               required for compatibility with the parent
 	 *                               provider class. Default empty.
-	 * @return array Array of URLs for a sitemap.
+	 * @return array[] Array of URL information for a sitemap.
 	 */
 	public function get_url_list( $page_num, $object_subtype = '' ) {
 		/**
 		 * Filters the users URL list before it is generated.
 		 *
-		 * Passing a non-null value will effectively short-circuit the generation,
+		 * Returning a non-null value will effectively short-circuit the generation,
 		 * returning that value instead.
 		 *
 		 * @since 5.5.0
 		 *
-		 * @param array  $url_list The URL list. Default null.
-		 * @param int    $page_num Page of results.
+		 * @param array[]|null $url_list The URL list. Default null.
+		 * @param int        $page_num Page of results.
 		 */
 		$url_list = apply_filters(
 			'wp_sitemaps_users_pre_url_list',
@@ -99,14 +99,14 @@ class WP_Sitemaps_Users extends WP_Sitemaps_Provider {
 	 */
 	public function get_max_num_pages( $object_subtype = '' ) {
 		/**
-		 * Filters the max number of pages before it is generated.
+		 * Filters the max number of pages for a user sitemap before it is generated.
 		 *
-		 * Passing a non-null value will effectively short-circuit the generation,
+		 * Returning a non-null value will effectively short-circuit the generation,
 		 * returning that value instead.
 		 *
 		 * @since 5.5.0
 		 *
-		 * @param int $max_num_pages The maximum number of pages. Default null.
+		 * @param int|null $max_num_pages The maximum number of pages. Default null.
 		 */
 		$max_num_pages = apply_filters( 'wp_sitemaps_users_pre_max_num_pages', null );
 
diff --git a/src/wp-includes/taxonomy.php b/src/wp-includes/taxonomy.php
index 5b1acb4fc6..201864cbc1 100644
--- a/src/wp-includes/taxonomy.php
+++ b/src/wp-includes/taxonomy.php
@@ -18,6 +18,7 @@
  * avoid registering rewrite rules before the {@see 'init'} action.
  *
  * @since 2.8.0
+ * @since 5.9.0 Added `'wp_template_part_area'` taxonomy.
  *
  * @global WP_Rewrite $wp_rewrite WordPress rewrite component.
  */
@@ -107,17 +108,26 @@ function create_initial_taxonomies() {
 		'nav_menu',
 		'nav_menu_item',
 		array(
-			'public'            => false,
-			'hierarchical'      => false,
-			'labels'            => array(
+			'public'                => false,
+			'hierarchical'          => false,
+			'labels'                => array(
 				'name'          => __( 'Navigation Menus' ),
 				'singular_name' => __( 'Navigation Menu' ),
 			),
-			'query_var'         => false,
-			'rewrite'           => false,
-			'show_ui'           => false,
-			'_builtin'          => true,
-			'show_in_nav_menus' => false,
+			'query_var'             => false,
+			'rewrite'               => false,
+			'show_ui'               => false,
+			'_builtin'              => true,
+			'show_in_nav_menus'     => false,
+			'capabilities'          => array(
+				'manage_terms' => 'edit_theme_options',
+				'edit_terms'   => 'edit_theme_options',
+				'delete_terms' => 'edit_theme_options',
+				'assign_terms' => 'edit_theme_options',
+			),
+			'show_in_rest'          => true,
+			'rest_base'             => 'menus',
+			'rest_controller_class' => 'WP_REST_Menus_Controller',
 		)
 	);
 
@@ -175,7 +185,7 @@ function create_initial_taxonomies() {
 
 	register_taxonomy(
 		'wp_theme',
-		array( 'wp_template' ),
+		array( 'wp_template', 'wp_template_part', 'wp_global_styles' ),
 		array(
 			'public'            => false,
 			'hierarchical'      => false,
@@ -191,6 +201,25 @@ function create_initial_taxonomies() {
 			'show_in_rest'      => false,
 		)
 	);
+
+	register_taxonomy(
+		'wp_template_part_area',
+		array( 'wp_template_part' ),
+		array(
+			'public'            => false,
+			'hierarchical'      => false,
+			'labels'            => array(
+				'name'          => __( 'Template Part Areas' ),
+				'singular_name' => __( 'Template Part Area' ),
+			),
+			'query_var'         => false,
+			'rewrite'           => false,
+			'show_ui'           => false,
+			'_builtin'          => true,
+			'show_in_nav_menus' => false,
+			'show_in_rest'      => false,
+		)
+	);
 }
 
 /**
@@ -560,6 +589,8 @@ function unregister_taxonomy( $taxonomy ) {
  * @since 4.9.0 Added the `most_used` and `back_to_items` labels.
  * @since 5.7.0 Added the `filter_by_item` label.
  * @since 5.8.0 Added the `item_link` and `item_link_description` labels.
+ * @since 5.9.0 Added the `name_field_description`, `slug_field_description`,
+ *              `parent_field_description`, and `desc_field_description` labels.
  *
  * @param WP_Taxonomy $tax Taxonomy object.
  * @return object {
@@ -576,6 +607,19 @@ function unregister_taxonomy( $taxonomy ) {
  *     @type string $parent_item                This label is only used for hierarchical taxonomies. Default
  *                                              'Parent Category'.
  *     @type string $parent_item_colon          The same as `parent_item`, but with colon `:` in the end.
+ *     @type string $name_field_description     Description for the Name field on Edit Tags screen.
+ *                                              Default 'The name is how it appears on your site'.
+ *     @type string $slug_field_description     Description for the Slug field on Edit Tags screen.
+ *                                              Default 'The &#8220;slug&#8221; is the URL-friendly version
+ *                                              of the name. It is usually all lowercase and contains
+ *                                              only letters, numbers, and hyphens'.
+ *     @type string $parent_field_description   Description for the Parent field on Edit Tags screen.
+ *                                              Default 'Assign a parent term to create a hierarchy.
+ *                                              The term Jazz, for example, would be the parent
+ *                                              of Bebop and Big Band'.
+ *     @type string $desc_field_description     Description for the Description field on Edit Tags screen.
+ *                                              Default 'The description is not prominent by default;
+ *                                              however, some themes may show it'.
  *     @type string $edit_item                  Default 'Edit Tag'/'Edit Category'.
  *     @type string $view_item                  Default 'View Tag'/'View Category'.
  *     @type string $update_item                Default 'Update Tag'/'Update Category'.
@@ -615,6 +659,11 @@ function get_taxonomy_labels( $tax ) {
 		$tax->labels['not_found'] = $tax->no_tagcloud;
 	}
 
+	$name_field_description   = __( 'The name is how it appears on your site.' );
+	$slug_field_description   = __( 'The &#8220;slug&#8221; is the URL-friendly version of the name. It is usually all lowercase and contains only letters, numbers, and hyphens.' );
+	$parent_field_description = __( 'Assign a parent term to create a hierarchy. The term Jazz, for example, would be the parent of Bebop and Big Band.' );
+	$desc_field_description   = __( 'The description is not prominent by default; however, some themes may show it.' );
+
 	$nohier_vs_hier_defaults = array(
 		'name'                       => array( _x( 'Tags', 'taxonomy general name' ), _x( 'Categories', 'taxonomy general name' ) ),
 		'singular_name'              => array( _x( 'Tag', 'taxonomy singular name' ), _x( 'Category', 'taxonomy singular name' ) ),
@@ -623,6 +672,10 @@ function get_taxonomy_labels( $tax ) {
 		'all_items'                  => array( __( 'All Tags' ), __( 'All Categories' ) ),
 		'parent_item'                => array( null, __( 'Parent Category' ) ),
 		'parent_item_colon'          => array( null, __( 'Parent Category:' ) ),
+		'name_field_description'     => array( $name_field_description, $name_field_description ),
+		'slug_field_description'     => array( $slug_field_description, $slug_field_description ),
+		'parent_field_description'   => array( null, $parent_field_description ),
+		'desc_field_description'     => array( $desc_field_description, $desc_field_description ),
 		'edit_item'                  => array( __( 'Edit Tag' ), __( 'Edit Category' ) ),
 		'view_item'                  => array( __( 'View Tag' ), __( 'View Category' ) ),
 		'update_item'                => array( __( 'Update Tag' ), __( 'Update Category' ) ),
@@ -641,7 +694,7 @@ function get_taxonomy_labels( $tax ) {
 		'back_to_items'              => array( __( '&larr; Go to Tags' ), __( '&larr; Go to Categories' ) ),
 		'item_link'                  => array(
 			_x( 'Tag Link', 'navigation link block title' ),
-			_x( 'Category Link', 'navigation link block description' ),
+			_x( 'Category Link', 'navigation link block title' ),
 		),
 		'item_link_description'      => array(
 			_x( 'A link to a tag.', 'navigation link block description' ),
@@ -770,28 +823,26 @@ function unregister_taxonomy_for_object_type( $taxonomy, $object_type ) {
 //
 
 /**
- * Retrieve object_ids of valid taxonomy and term.
+ * Retrieve object IDs of valid taxonomy and term.
  *
- * The strings of $taxonomies must exist before this function will continue.
- * On failure of finding a valid taxonomy, it will return a WP_Error class,
- * kind of like Exceptions in PHP 5, except you can't catch them. Even so,
- * you can still test for the WP_Error class and get the error message.
+ * The strings of `$taxonomies` must exist before this function will continue.
+ * On failure of finding a valid taxonomy, it will return a WP_Error.
  *
- * The $terms aren't checked the same as $taxonomies, but still need to exist
- * for $object_ids to be returned.
+ * The `$terms` aren't checked the same as `$taxonomies`, but still need to exist
+ * for object IDs to be returned.
  *
- * It is possible to change the order that object_ids is returned by either
- * using PHP sort family functions or using the database by using $args with
- * either ASC or DESC array. The value should be in the key named 'order'.
+ * It is possible to change the order that object IDs are returned by using `$args`
+ * with either ASC or DESC array. The value should be in the key named 'order'.
  *
  * @since 2.3.0
  *
  * @global wpdb $wpdb WordPress database abstraction object.
  *
- * @param int|array    $term_ids   Term ID or array of term IDs of terms that will be used.
- * @param string|array $taxonomies String of taxonomy name or Array of string values of taxonomy names.
- * @param array|string $args       Change the order of the object_ids, either ASC or DESC.
- * @return array|WP_Error An array of $object_ids on success, WP_Error if the taxonomy does not exist.
+ * @param int|int[]       $term_ids   Term ID or array of term IDs of terms that will be used.
+ * @param string|string[] $taxonomies String of taxonomy name or Array of string values of taxonomy names.
+ * @param array|string    $args       Change the order of the object IDs, either ASC or DESC.
+ * @return string[]|WP_Error An array of object IDs as numeric strings on success,
+ *                           WP_Error if the taxonomy does not exist.
  */
 function get_objects_in_term( $term_ids, $taxonomies, $args = array() ) {
 	global $wpdb;
@@ -846,7 +897,7 @@ function get_objects_in_term( $term_ids, $taxonomies, $args = array() ) {
  * @param array  $tax_query         A compact tax query
  * @param string $primary_table
  * @param string $primary_id_column
- * @return array
+ * @return string[]
  */
 function get_tax_sql( $tax_query, $primary_table, $primary_id_column ) {
 	$tax_query_obj = new WP_Tax_Query( $tax_query );
@@ -1091,8 +1142,8 @@ function get_term_by( $field, $value, $taxonomy = '', $output = OBJECT, $filter
  *
  * @since 2.3.0
  *
- * @param int    $term_id  ID of Term to get children.
- * @param string $taxonomy Taxonomy Name.
+ * @param int    $term_id  ID of term to get children.
+ * @param string $taxonomy Taxonomy name.
  * @return array|WP_Error List of Term IDs. WP_Error returned if `$taxonomy` does not exist.
  */
 function get_term_children( $term_id, $taxonomy ) {
@@ -1135,7 +1186,7 @@ function get_term_children( $term_id, $taxonomy ) {
  *
  * @param string      $field    Term field to fetch.
  * @param int|WP_Term $term     Term ID or object.
- * @param string      $taxonomy Optional. Taxonomy Name. Default empty.
+ * @param string      $taxonomy Optional. Taxonomy name. Default empty.
  * @param string      $context  Optional. How to sanitize term fields. Look at sanitize_term_field() for available options.
  *                              Default 'display'.
  * @return string|int|null|WP_Error Will return an empty string if $term is not an object or if $field is not set in $term.
@@ -1297,7 +1348,7 @@ function get_terms( $args = array(), $deprecated = '' ) {
 	 * @since 4.6.0 Added the `$term_query` parameter.
 	 *
 	 * @param array         $terms      Array of found terms.
-	 * @param array         $taxonomies An array of taxonomies.
+	 * @param array|null    $taxonomies An array of taxonomies if known.
 	 * @param array         $args       An array of get_terms() arguments.
 	 * @param WP_Term_Query $term_query The WP_Term_Query object.
 	 */
@@ -1635,7 +1686,7 @@ function sanitize_term( $term, $taxonomy, $context = 'display' ) {
  * @param string $field    Term field to sanitize.
  * @param string $value    Search for this term value.
  * @param int    $term_id  Term ID.
- * @param string $taxonomy Taxonomy Name.
+ * @param string $taxonomy Taxonomy name.
  * @param string $context  Context in which to sanitize the term field.
  *                         Accepts 'raw', 'edit', 'db', 'display', 'rss',
  *                         'attribute', or 'js'. Default 'display'.
@@ -1858,8 +1909,8 @@ function wp_count_terms( $args = array(), $deprecated = '' ) {
  *
  * @since 2.3.0
  *
- * @param int          $object_id  The term Object Id that refers to the term.
- * @param string|array $taxonomies List of Taxonomy Names or single Taxonomy name.
+ * @param int          $object_id  The term object ID that refers to the term.
+ * @param string|array $taxonomies List of taxonomy names or single taxonomy name.
  */
 function wp_delete_object_term_relationships( $object_id, $taxonomies ) {
 	$object_id = (int) $object_id;
@@ -1888,7 +1939,7 @@ function wp_delete_object_term_relationships( $object_id, $taxonomies ) {
  * @global wpdb $wpdb WordPress database abstraction object.
  *
  * @param int          $term     Term ID.
- * @param string       $taxonomy Taxonomy Name.
+ * @param string       $taxonomy Taxonomy name.
  * @param array|string $args {
  *     Optional. Array of arguments to override the default term ID. Default empty array.
  *
@@ -1954,7 +2005,7 @@ function wp_delete_term( $term, $taxonomy, $args = array() ) {
 	 * @since 4.1.0
 	 *
 	 * @param int    $term     Term ID.
-	 * @param string $taxonomy Taxonomy Name.
+	 * @param string $taxonomy Taxonomy name.
 	 */
 	do_action( 'pre_delete_term', $term, $taxonomy );
 
@@ -2482,7 +2533,7 @@ function wp_insert_term( $term, $taxonomy, $args = array() ) {
 	 * and term_taxonomy_id of the older term instead. Then return out of the function so that the "create" hooks
 	 * are not fired.
 	 */
-	$duplicate_term = $wpdb->get_row( $wpdb->prepare( "SELECT t.term_id, t.slug, tt.term_taxonomy_id, tt.taxonomy FROM $wpdb->terms t INNER JOIN $wpdb->term_taxonomy tt ON ( tt.term_id = t.term_id ) WHERE t.slug = %s AND tt.parent = %d AND tt.taxonomy = %s AND t.term_id < %d AND tt.term_taxonomy_id != %d", $slug, $parent, $taxonomy, $term_id, $tt_id ) );
+	$duplicate_term = $wpdb->get_row( $wpdb->prepare( "SELECT t.term_id, t.slug, tt.term_taxonomy_id, tt.taxonomy FROM $wpdb->terms AS t INNER JOIN $wpdb->term_taxonomy AS tt ON ( tt.term_id = t.term_id ) WHERE t.slug = %s AND tt.parent = %d AND tt.taxonomy = %s AND t.term_id < %d AND tt.term_taxonomy_id != %d", $slug, $parent, $taxonomy, $term_id, $tt_id ) );
 
 	/**
 	 * Filters the duplicate term check that takes place during term creation.
@@ -2839,7 +2890,7 @@ function wp_add_object_terms( $object_id, $terms, $taxonomy ) {
  *
  * @param int              $object_id The ID of the object from which the terms will be removed.
  * @param string|int|array $terms     The slug(s) or ID(s) of the term(s) to remove.
- * @param array|string     $taxonomy  Taxonomy name.
+ * @param string           $taxonomy  Taxonomy name.
  * @return bool|WP_Error True on success, false or WP_Error on failure.
  */
 function wp_remove_object_terms( $object_id, $terms, $taxonomy ) {
@@ -3467,6 +3518,8 @@ function clean_object_term_cache( $object_ids, $object_type ) {
 		}
 	}
 
+	wp_cache_delete( 'last_changed', 'terms' );
+
 	/**
 	 * Fires after the object term cache has been cleaned.
 	 *
@@ -3559,6 +3612,7 @@ function clean_term_cache( $ids, $taxonomy = '', $clean_taxonomy = true ) {
 function clean_taxonomy_cache( $taxonomy ) {
 	wp_cache_delete( 'all_ids', $taxonomy );
 	wp_cache_delete( 'get', $taxonomy );
+	wp_cache_delete( 'last_changed', 'terms' );
 
 	// Regenerate cached hierarchy.
 	delete_option( "{$taxonomy}_children" );
@@ -4583,10 +4637,10 @@ function get_term_link( $term, $taxonomy = '' ) {
  *     Arguments about which post to use and how to format the output. Shares all of the arguments
  *     supported by get_the_taxonomies(), in addition to the following.
  *
- *     @type  int|WP_Post $post   Post ID or object to get taxonomies of. Default current post.
- *     @type  string      $before Displays before the taxonomies. Default empty string.
- *     @type  string      $sep    Separates each taxonomy. Default is a space.
- *     @type  string      $after  Displays after the taxonomies. Default empty string.
+ *     @type int|WP_Post $post   Post ID or object to get taxonomies of. Default current post.
+ *     @type string      $before Displays before the taxonomies. Default empty string.
+ *     @type string      $sep    Separates each taxonomy. Default is a space.
+ *     @type string      $after  Displays after the taxonomies. Default empty string.
  * }
  */
 function the_taxonomies( $args = array() ) {
diff --git a/src/wp-includes/template-canvas.php b/src/wp-includes/template-canvas.php
index 2ce5b12ca6..55f03267c8 100644
--- a/src/wp-includes/template-canvas.php
+++ b/src/wp-includes/template-canvas.php
@@ -5,13 +5,12 @@
  * @package WordPress
  */
 
-/**
+/*
  * Get the template HTML.
  * This needs to run before <head> so that blocks can add scripts and styles in wp_head().
  */
 $template_html = get_the_block_template_html();
-?>
-<!DOCTYPE html>
+?><!DOCTYPE html>
 <html <?php language_attributes(); ?>>
 <head>
 	<meta charset="<?php bloginfo( 'charset' ); ?>" />
diff --git a/src/wp-includes/theme-compat/embed-content.php b/src/wp-includes/theme-compat/embed-content.php
index 25a45f2cfe..42884fec0c 100644
--- a/src/wp-includes/theme-compat/embed-content.php
+++ b/src/wp-includes/theme-compat/embed-content.php
@@ -27,7 +27,7 @@
 		 *
 		 * @since 4.9.0
 		 *
-		 * @param int $thumbnail_id Attachment ID.
+		 * @param int|false $thumbnail_id Attachment ID, or false if there is none.
 		 */
 		$thumbnail_id = apply_filters( 'embed_thumbnail_id', $thumbnail_id );
 
diff --git a/src/wp-includes/theme-i18n.json b/src/wp-includes/theme-i18n.json
index a01a5aa566..98b2680792 100644
--- a/src/wp-includes/theme-i18n.json
+++ b/src/wp-includes/theme-i18n.json
@@ -5,6 +5,11 @@
 					{
 						"name": "Font size name"
 					}
+				],
+				"fontFamilies": [
+					{
+						"name": "Font family name"
+					}
 				]
 		},
 		"color": {
@@ -31,6 +36,11 @@
 						{
 							"name": "Font size name"
 						}
+					],
+					"fontFamilies": [
+						{
+							"name": "Font family name"
+						}
 					]
 				},
 				"color": {
@@ -47,5 +57,15 @@
 				}
 			}
 		}
-	}
+	},
+	"customTemplates": [
+		{
+			"title": "Custom template name"
+		}
+	],
+	"templateParts": [
+		{
+			"title": "Template part name"
+		}
+	]
 }
diff --git a/src/wp-includes/theme-templates.php b/src/wp-includes/theme-templates.php
index c7466312cb..e837a2fad5 100644
--- a/src/wp-includes/theme-templates.php
+++ b/src/wp-includes/theme-templates.php
@@ -1,5 +1,36 @@
 <?php
 
+/**
+ * Sets a custom slug when creating auto-draft template parts.
+ *
+ * This is only needed for auto-drafts created by the regular WP editor.
+ * If this page is to be removed, this will not be necessary.
+ *
+ * @since 5.9.0
+ *
+ * @param int $post_id Post ID.
+ */
+function wp_set_unique_slug_on_create_template_part( $post_id ) {
+	$post = get_post( $post_id );
+	if ( 'auto-draft' !== $post->post_status ) {
+		return;
+	}
+
+	if ( ! $post->post_name ) {
+		wp_update_post(
+			array(
+				'ID'        => $post_id,
+				'post_name' => 'custom_slug_' . uniqid(),
+			)
+		);
+	}
+
+	$terms = get_the_terms( $post_id, 'wp_theme' );
+	if ( ! is_array( $terms ) || ! count( $terms ) ) {
+		wp_set_post_terms( $post_id, wp_get_theme()->get_stylesheet(), 'wp_theme' );
+	}
+}
+
 /**
  * Generates a unique slug for templates.
  *
@@ -14,7 +45,7 @@
  * @return string The original, desired slug.
  */
 function wp_filter_wp_template_unique_post_slug( $override_slug, $slug, $post_ID, $post_status, $post_type ) {
-	if ( 'wp_template' !== $post_type ) {
+	if ( 'wp_template' !== $post_type && 'wp_template_part' !== $post_type ) {
 		return $override_slug;
 	}
 
@@ -68,7 +99,7 @@ function wp_filter_wp_template_unique_post_slug( $override_slug, $slug, $post_ID
 }
 
 /**
- * Print the skip-link script & styles.
+ * Prints the skip-link script & styles.
  *
  * @access private
  * @since 5.8.0
@@ -135,7 +166,7 @@ function the_block_template_skip_link() {
 	<script>
 	( function() {
 		var skipLinkTarget = document.querySelector( 'main' ),
-			parentEl,
+			sibling,
 			skipLinkTargetID,
 			skipLink;
 
@@ -146,10 +177,10 @@ function the_block_template_skip_link() {
 
 		// Get the site wrapper.
 		// The skip-link will be injected in the beginning of it.
-		parentEl = document.querySelector( '.wp-site-blocks' );
+		sibling = document.querySelector( '.wp-site-blocks' );
 
 		// Early exit if the root element was not found.
-		if ( ! parentEl ) {
+		if ( ! sibling ) {
 			return;
 		}
 
@@ -167,20 +198,20 @@ function the_block_template_skip_link() {
 		skipLink.innerHTML = '<?php esc_html_e( 'Skip to content' ); ?>';
 
 		// Inject the skip link.
-		parentEl.insertAdjacentElement( 'afterbegin', skipLink );
+		sibling.parentElement.insertBefore( skipLink, sibling );
 	}() );
 	</script>
 	<?php
 }
 
 /**
- * Enable the block templates (editor mode) for themes with theme.json by default.
+ * Enables the block templates (editor mode) for themes with theme.json by default.
  *
  * @access private
  * @since 5.8.0
  */
 function wp_enable_block_templates() {
-	if ( WP_Theme_JSON_Resolver::theme_has_support() ) {
+	if ( wp_is_block_theme() || WP_Theme_JSON_Resolver::theme_has_support() ) {
 		add_theme_support( 'block-templates' );
 	}
 }
diff --git a/src/wp-includes/theme.json b/src/wp-includes/theme.json
index 17389579ea..5c1404ccdd 100644
--- a/src/wp-includes/theme.json
+++ b/src/wp-includes/theme.json
@@ -1,14 +1,20 @@
 {
-	"version": 1,
+	"version": 2,
 	"settings": {
+		"appearanceTools": false,
 		"border": {
-			"customRadius": false
+			"color": false,
+			"radius": false,
+			"style": false,
+			"width": false
 		},
 		"color": {
+			"background": true,
 			"custom": true,
 			"customDuotone": true,
  			"customGradient": true,
- 			"link": false,
+			"defaultGradients": true,
+			"defaultPalette": true,
 			"duotone": [
 				{
 					"name":  "Dark grayscale" ,
@@ -113,6 +119,7 @@
 					"slug": "midnight"
 				}
 			],
+			"link": false,
 			"palette": [
 				{
 					"name": "Black",
@@ -174,16 +181,17 @@
 					"slug": "vivid-purple",
 					"color": "#9b51e0"
 				}
-			]
+			],
+			"text": true
 		},
 		"spacing": {
-			"customMargin": false,
-			"customPadding": false,
+			"blockGap": null,
+			"margin": false,
+			"padding": false,
 			"units": [ "px", "em", "rem", "vh", "vw", "%" ]
 		},
 		"typography": {
 			"customFontSize": true,
-			"customLineHeight": false,
 			"dropCap": true,
 			"fontSizes": [
 				{
@@ -191,11 +199,6 @@
 					"slug": "small",
 					"size": "13px"
 				},
-				{
-					"name": "Normal",
-					"slug": "normal",
-					"size": "16px"
-				},
 				{
 					"name": "Medium",
 					"slug": "medium",
@@ -207,18 +210,35 @@
 					"size": "36px"
 				},
 				{
-					"name": "Huge",
-					"slug": "huge",
+					"name": "Extra Large",
+					"slug": "x-large",
 					"size": "42px"
 				}
-			]
+			],
+			"fontStyle": true,
+			"fontWeight": true,
+			"letterSpacing": true,
+			"lineHeight": false,
+			"textDecoration": true,
+			"textTransform": true
 		},
 		"blocks": {
 			"core/button": {
 				"border": {
-					"customRadius": true
+					"radius": true
+				}
+			},
+			"core/pullquote": {
+				"border": {
+					"color": true,
+					"radius": true,
+					"style": true,
+					"width": true
 				}
 			}
 		}
+	},
+	"styles": {
+		"spacing": { "blockGap": "24px" }
 	}
 }
diff --git a/src/wp-includes/theme.php b/src/wp-includes/theme.php
index a7bc431c37..f28acc8d15 100644
--- a/src/wp-includes/theme.php
+++ b/src/wp-includes/theme.php
@@ -45,7 +45,7 @@ function wp_get_themes( $args = array() ) {
 	$theme_directories = search_theme_directories();
 
 	if ( is_array( $wp_theme_directories ) && count( $wp_theme_directories ) > 1 ) {
-		// Make sure the current theme wins out, in case search_theme_directories() picks the wrong
+		// Make sure the active theme wins out, in case search_theme_directories() picks the wrong
 		// one in the case of a conflict. (Normally, last registered theme root wins.)
 		$current_theme = get_stylesheet();
 		if ( isset( $theme_directories[ $current_theme ] ) ) {
@@ -105,10 +105,10 @@ function wp_get_themes( $args = array() ) {
  *
  * @global array $wp_theme_directories
  *
- * @param string $stylesheet Optional. Directory name for the theme. Defaults to current theme.
+ * @param string $stylesheet Optional. Directory name for the theme. Defaults to active theme.
  * @param string $theme_root Optional. Absolute path of the theme root to look in.
  *                           If not specified, get_raw_theme_root() is used to calculate
- *                           the theme root for the $stylesheet provided (or current theme).
+ *                           the theme root for the $stylesheet provided (or active theme).
  * @return WP_Theme Theme object. Be sure to check the object's exists() method
  *                  if you need to confirm the theme's existence.
  */
@@ -182,11 +182,11 @@ function get_stylesheet() {
 }
 
 /**
- * Retrieves stylesheet directory path for current theme.
+ * Retrieves stylesheet directory path for the active theme.
  *
  * @since 1.5.0
  *
- * @return string Path to current theme's stylesheet directory.
+ * @return string Path to active theme's stylesheet directory.
  */
 function get_stylesheet_directory() {
 	$stylesheet     = get_stylesheet();
@@ -194,23 +194,23 @@ function get_stylesheet_directory() {
 	$stylesheet_dir = "$theme_root/$stylesheet";
 
 	/**
-	 * Filters the stylesheet directory path for current theme.
+	 * Filters the stylesheet directory path for the active theme.
 	 *
 	 * @since 1.5.0
 	 *
-	 * @param string $stylesheet_dir Absolute path to the current theme.
-	 * @param string $stylesheet     Directory name of the current theme.
+	 * @param string $stylesheet_dir Absolute path to the active theme.
+	 * @param string $stylesheet     Directory name of the active theme.
 	 * @param string $theme_root     Absolute path to themes directory.
 	 */
 	return apply_filters( 'stylesheet_directory', $stylesheet_dir, $stylesheet, $theme_root );
 }
 
 /**
- * Retrieves stylesheet directory URI for current theme.
+ * Retrieves stylesheet directory URI for the active theme.
  *
  * @since 1.5.0
  *
- * @return string URI to current theme's stylesheet directory.
+ * @return string URI to active theme's stylesheet directory.
  */
 function get_stylesheet_directory_uri() {
 	$stylesheet         = str_replace( '%2F', '/', rawurlencode( get_stylesheet() ) );
@@ -230,25 +230,25 @@ function get_stylesheet_directory_uri() {
 }
 
 /**
- * Retrieves stylesheet URI for current theme.
+ * Retrieves stylesheet URI for the active theme.
  *
  * The stylesheet file name is 'style.css' which is appended to the stylesheet directory URI path.
  * See get_stylesheet_directory_uri().
  *
  * @since 1.5.0
  *
- * @return string URI to current theme's stylesheet.
+ * @return string URI to active theme's stylesheet.
  */
 function get_stylesheet_uri() {
 	$stylesheet_dir_uri = get_stylesheet_directory_uri();
 	$stylesheet_uri     = $stylesheet_dir_uri . '/style.css';
 	/**
-	 * Filters the URI of the current theme stylesheet.
+	 * Filters the URI of the active theme stylesheet.
 	 *
 	 * @since 1.5.0
 	 *
-	 * @param string $stylesheet_uri     Stylesheet URI for the current theme/child theme.
-	 * @param string $stylesheet_dir_uri Stylesheet directory URI for the current theme/child theme.
+	 * @param string $stylesheet_uri     Stylesheet URI for the active theme/child theme.
+	 * @param string $stylesheet_dir_uri Stylesheet directory URI for the active theme/child theme.
 	 */
 	return apply_filters( 'stylesheet_uri', $stylesheet_uri, $stylesheet_dir_uri );
 }
@@ -272,7 +272,7 @@ function get_stylesheet_uri() {
  *
  * @global WP_Locale $wp_locale WordPress date and time locale object.
  *
- * @return string URI to current theme's localized stylesheet.
+ * @return string URI to active theme's localized stylesheet.
  */
 function get_locale_stylesheet_uri() {
 	global $wp_locale;
@@ -298,7 +298,7 @@ function get_locale_stylesheet_uri() {
 }
 
 /**
- * Retrieves name of the current theme.
+ * Retrieves name of the active theme.
  *
  * @since 1.5.0
  *
@@ -306,21 +306,21 @@ function get_locale_stylesheet_uri() {
  */
 function get_template() {
 	/**
-	 * Filters the name of the current theme.
+	 * Filters the name of the active theme.
 	 *
 	 * @since 1.5.0
 	 *
-	 * @param string $template Current theme's directory name.
+	 * @param string $template active theme's directory name.
 	 */
 	return apply_filters( 'template', get_option( 'template' ) );
 }
 
 /**
- * Retrieves template directory path for current theme.
+ * Retrieves template directory path for the active theme.
  *
  * @since 1.5.0
  *
- * @return string Path to current theme's template directory.
+ * @return string Path to active theme's template directory.
  */
 function get_template_directory() {
 	$template     = get_template();
@@ -328,23 +328,23 @@ function get_template_directory() {
 	$template_dir = "$theme_root/$template";
 
 	/**
-	 * Filters the current theme directory path.
+	 * Filters the active theme directory path.
 	 *
 	 * @since 1.5.0
 	 *
-	 * @param string $template_dir The path of the current theme directory.
-	 * @param string $template     Directory name of the current theme.
+	 * @param string $template_dir The path of the active theme directory.
+	 * @param string $template     Directory name of the active theme.
 	 * @param string $theme_root   Absolute path to the themes directory.
 	 */
 	return apply_filters( 'template_directory', $template_dir, $template, $theme_root );
 }
 
 /**
- * Retrieves template directory URI for current theme.
+ * Retrieves template directory URI for the active theme.
  *
  * @since 1.5.0
  *
- * @return string URI to current theme's template directory.
+ * @return string URI to active theme's template directory.
  */
 function get_template_directory_uri() {
 	$template         = str_replace( '%2F', '/', rawurlencode( get_template() ) );
@@ -352,12 +352,12 @@ function get_template_directory_uri() {
 	$template_dir_uri = "$theme_root_uri/$template";
 
 	/**
-	 * Filters the current theme directory URI.
+	 * Filters the active theme directory URI.
 	 *
 	 * @since 1.5.0
 	 *
-	 * @param string $template_dir_uri The URI of the current theme directory.
-	 * @param string $template         Directory name of the current theme.
+	 * @param string $template_dir_uri The URI of the active theme directory.
+	 * @param string $template         Directory name of the active theme.
 	 * @param string $theme_root_uri   The themes root URI.
 	 */
 	return apply_filters( 'template_directory_uri', $template_dir_uri, $template, $theme_root_uri );
@@ -499,7 +499,7 @@ function search_theme_directories( $force = false ) {
 	/* Loop the registered theme directories and extract all themes */
 	foreach ( $wp_theme_directories as $theme_root ) {
 
-		// Start with directories in the root of the current theme directory.
+		// Start with directories in the root of the active theme directory.
 		$dirs = @ scandir( $theme_root );
 		if ( ! $dirs ) {
 			trigger_error( "$theme_root is not readable", E_USER_NOTICE );
@@ -683,7 +683,7 @@ function get_raw_theme_root( $stylesheet_or_template, $skip_cache = false ) {
 
 	$theme_root = false;
 
-	// If requesting the root for the current theme, consult options to avoid calling get_theme_roots().
+	// If requesting the root for the active theme, consult options to avoid calling get_theme_roots().
 	if ( ! $skip_cache ) {
 		if ( get_option( 'stylesheet' ) == $stylesheet_or_template ) {
 			$theme_root = get_option( 'stylesheet_root' );
@@ -830,11 +830,11 @@ function switch_theme( $stylesheet ) {
 }
 
 /**
- * Checks that the current theme has 'index.php' and 'style.css' files.
+ * Checks that the active theme has 'index.php' and 'style.css' files.
  *
  * Does not initially check the default theme, which is the fallback and should always exist.
  * But if it doesn't exist, it'll fall back to the latest core default theme that does exist.
- * Will switch theme to the fallback theme if current theme does not validate.
+ * Will switch theme to the fallback theme if active theme does not validate.
  *
  * You can use the {@see 'validate_current_theme'} filter to return false to disable
  * this functionality.
@@ -847,11 +847,11 @@ function switch_theme( $stylesheet ) {
  */
 function validate_current_theme() {
 	/**
-	 * Filters whether to validate the current theme.
+	 * Filters whether to validate the active theme.
 	 *
 	 * @since 2.7.0
 	 *
-	 * @param bool $validate Whether to validate the current theme. Default true.
+	 * @param bool $validate Whether to validate the active theme. Default true.
 	 */
 	if ( wp_installing() || ! apply_filters( 'validate_current_theme', true ) ) {
 		return true;
@@ -908,20 +908,6 @@ function validate_current_theme() {
 function validate_theme_requirements( $stylesheet ) {
 	$theme = wp_get_theme( $stylesheet );
 
-	// If the theme is a Full Site Editing theme, check for the presence of the Gutenberg plugin.
-	$theme_tags = $theme->get( 'Tags' );
-
-	if ( ! empty( $theme_tags ) && in_array( 'full-site-editing', $theme_tags, true ) && ! function_exists( 'gutenberg_is_fse_theme' ) ) {
-		return new WP_Error(
-			'theme_requires_gutenberg_plugin',
-			sprintf(
-					/* translators: %s: Theme name. */
-				_x( '<strong>Error:</strong> This theme (%s) uses Full Site Editing, which requires the Gutenberg plugin to be activated.', 'theme' ),
-				$theme->display( 'Name' )
-			)
-		);
-	}
-
 	$requirements = array(
 		'requires'     => ! empty( $theme->get( 'RequiresWP' ) ) ? $theme->get( 'RequiresWP' ) : '',
 		'requires_php' => ! empty( $theme->get( 'RequiresPHP' ) ) ? $theme->get( 'RequiresPHP' ) : '',
@@ -995,7 +981,7 @@ function get_theme_mods() {
 }
 
 /**
- * Retrieves theme modification value for the current theme.
+ * Retrieves theme modification value for the active theme.
  *
  * If the modification name does not exist and `$default` is a string, then the
  * default will be passed through the {@link https://www.php.net/sprintf sprintf()}
@@ -1021,7 +1007,7 @@ function get_theme_mod( $name, $default = false ) {
 		 *
 		 * @since 2.2.0
 		 *
-		 * @param mixed $current_mod The value of the current theme modification.
+		 * @param mixed $current_mod The value of the active theme modification.
 		 */
 		return apply_filters( "theme_mod_{$name}", $mods[ $name ] );
 	}
@@ -1040,7 +1026,7 @@ function get_theme_mod( $name, $default = false ) {
 }
 
 /**
- * Updates theme modification value for the current theme.
+ * Updates theme modification value for the active theme.
  *
  * @since 2.1.0
  * @since 5.6.0 A return value was added.
@@ -1073,7 +1059,7 @@ function set_theme_mod( $name, $value ) {
 }
 
 /**
- * Removes theme modification name from current theme list.
+ * Removes theme modification name from active theme list.
  *
  * If removing the name also removes all elements, then the entire option
  * will be removed.
@@ -1102,7 +1088,7 @@ function remove_theme_mod( $name ) {
 }
 
 /**
- * Removes theme modifications option for current theme.
+ * Removes theme modifications option for the active theme.
  *
  * @since 2.1.0
  */
@@ -1207,6 +1193,16 @@ function get_header_image_tag( $attr = array() ) {
 
 	$width  = absint( $header->width );
 	$height = absint( $header->height );
+	$alt    = '';
+
+	// Use alternative text assigned to the image, if available. Otherwise, leave it empty.
+	if ( ! empty( $header->attachment_id ) ) {
+		$image_alt = get_post_meta( $header->attachment_id, '_wp_attachment_image_alt', true );
+
+		if ( is_string( $image_alt ) ) {
+			$alt = $image_alt;
+		}
+	}
 
 	$attr = wp_parse_args(
 		$attr,
@@ -1214,7 +1210,7 @@ function get_header_image_tag( $attr = array() ) {
 			'src'    => $header->url,
 			'width'  => $width,
 			'height' => $height,
-			'alt'    => get_bloginfo( 'name' ),
+			'alt'    => $alt,
 		)
 	);
 
@@ -1225,7 +1221,12 @@ function get_header_image_tag( $attr = array() ) {
 
 		if ( is_array( $image_meta ) ) {
 			$srcset = wp_calculate_image_srcset( $size_array, $header->url, $image_meta, $header->attachment_id );
-			$sizes  = ! empty( $attr['sizes'] ) ? $attr['sizes'] : wp_calculate_image_sizes( $size_array, $header->url, $image_meta, $header->attachment_id );
+
+			if ( ! empty( $attr['sizes'] ) ) {
+				$sizes = $attr['sizes'];
+			} else {
+				$sizes = wp_calculate_image_sizes( $size_array, $header->url, $image_meta, $header->attachment_id );
+			}
 
 			if ( $srcset && $sizes ) {
 				$attr['srcset'] = $srcset;
@@ -1288,10 +1289,10 @@ function the_header_image_tag( $attr = array() ) {
  * @return object
  */
 function _get_random_header_data() {
+	global $_wp_default_headers;
 	static $_wp_random_header = null;
 
 	if ( empty( $_wp_random_header ) ) {
-		global $_wp_default_headers;
 		$header_image_mod = get_theme_mod( 'header_image', '' );
 		$headers          = array();
 
@@ -1313,8 +1314,17 @@ function _get_random_header_data() {
 
 		$_wp_random_header = (object) $headers[ array_rand( $headers ) ];
 
-		$_wp_random_header->url           = sprintf( $_wp_random_header->url, get_template_directory_uri(), get_stylesheet_directory_uri() );
-		$_wp_random_header->thumbnail_url = sprintf( $_wp_random_header->thumbnail_url, get_template_directory_uri(), get_stylesheet_directory_uri() );
+		$_wp_random_header->url = sprintf(
+			$_wp_random_header->url,
+			get_template_directory_uri(),
+			get_stylesheet_directory_uri()
+		);
+
+		$_wp_random_header->thumbnail_url = sprintf(
+			$_wp_random_header->thumbnail_url,
+			get_template_directory_uri(),
+			get_stylesheet_directory_uri()
+		);
 	}
 
 	return $_wp_random_header;
@@ -1385,7 +1395,7 @@ function header_image() {
 }
 
 /**
- * Gets the header images uploaded for the current theme.
+ * Gets the header images uploaded for the active theme.
  *
  * @since 3.2.0
  *
@@ -1414,12 +1424,17 @@ function get_uploaded_header_images() {
 		$header_data  = wp_get_attachment_metadata( $header->ID );
 		$header_index = $header->ID;
 
-		$header_images[ $header_index ]                      = array();
-		$header_images[ $header_index ]['attachment_id']     = $header->ID;
-		$header_images[ $header_index ]['url']               = $url;
-		$header_images[ $header_index ]['thumbnail_url']     = $url;
-		$header_images[ $header_index ]['alt_text']          = get_post_meta( $header->ID, '_wp_attachment_image_alt', true );
-		$header_images[ $header_index ]['attachment_parent'] = isset( $header_data['attachment_parent'] ) ? $header_data['attachment_parent'] : '';
+		$header_images[ $header_index ]                  = array();
+		$header_images[ $header_index ]['attachment_id'] = $header->ID;
+		$header_images[ $header_index ]['url']           = $url;
+		$header_images[ $header_index ]['thumbnail_url'] = $url;
+		$header_images[ $header_index ]['alt_text']      = get_post_meta( $header->ID, '_wp_attachment_image_alt', true );
+
+		if ( isset( $header_data['attachment_parent'] ) ) {
+			$header_images[ $header_index ]['attachment_parent'] = $header_data['attachment_parent'];
+		} else {
+			$header_images[ $header_index ]['attachment_parent'] = '';
+		}
 
 		if ( isset( $header_data['width'] ) ) {
 			$header_images[ $header_index ]['width'] = $header_data['width'];
@@ -1510,6 +1525,7 @@ function register_default_headers( $headers ) {
  */
 function unregister_default_headers( $header ) {
 	global $_wp_default_headers;
+
 	if ( is_array( $header ) ) {
 		array_map( 'unregister_default_headers', $header );
 	} elseif ( isset( $_wp_default_headers[ $header ] ) ) {
@@ -1845,7 +1861,10 @@ function wp_custom_css_cb() {
 		$type_attr = current_theme_supports( 'html5', 'style' ) ? '' : ' type="text/css"';
 		?>
 		<style<?php echo $type_attr; ?> id="wp-custom-css">
-			<?php echo strip_tags( $styles ); // Note that esc_html() cannot be used because `div &gt; span` is not interpreted properly. ?>
+			<?php
+			// Note that esc_html() cannot be used because `div &gt; span` is not interpreted properly.
+			echo strip_tags( $styles );
+			?>
 		</style>
 		<?php
 	endif;
@@ -1856,7 +1875,7 @@ function wp_custom_css_cb() {
  *
  * @since 4.7.0
  *
- * @param string $stylesheet Optional. A theme object stylesheet name. Defaults to the current theme.
+ * @param string $stylesheet Optional. A theme object stylesheet name. Defaults to the active theme.
  * @return WP_Post|null The custom_css post or null if none exists.
  */
 function wp_get_custom_css_post( $stylesheet = '' ) {
@@ -1907,7 +1926,7 @@ function wp_get_custom_css_post( $stylesheet = '' ) {
  *
  * @since 4.7.0
  *
- * @param string $stylesheet Optional. A theme object stylesheet name. Defaults to the current theme.
+ * @param string $stylesheet Optional. A theme object stylesheet name. Defaults to the active theme.
  * @return string The Custom CSS Post content.
  */
 function wp_get_custom_css( $stylesheet = '' ) {
@@ -1927,7 +1946,7 @@ function wp_get_custom_css( $stylesheet = '' ) {
 	 *
 	 * @since 4.7.0
 	 *
-	 * @param string $css        CSS pulled in from the Custom CSS CPT.
+	 * @param string $css        CSS pulled in from the Custom CSS post type.
 	 * @param string $stylesheet The theme stylesheet name.
 	 */
 	$css = apply_filters( 'wp_get_custom_css', $css, $stylesheet );
@@ -1946,8 +1965,10 @@ function wp_get_custom_css( $stylesheet = '' ) {
  * @param array  $args {
  *     Args.
  *
- *     @type string $preprocessed Pre-processed CSS, stored in `post_content_filtered`. Normally empty string. Optional.
- *     @type string $stylesheet   Stylesheet (child theme) to update. Optional, defaults to current theme/stylesheet.
+ *     @type string $preprocessed Optional. Pre-processed CSS, stored in `post_content_filtered`.
+ *                                Normally empty string.
+ *     @type string $stylesheet   Optional. Stylesheet (child theme) to update.
+ *                                Defaults to active theme/stylesheet.
  * }
  * @return WP_Post|WP_Error Post on success, error on failure.
  */
@@ -1966,7 +1987,8 @@ function wp_update_custom_css_post( $css, $args = array() ) {
 	);
 
 	/**
-	 * Filters the `css` (`post_content`) and `preprocessed` (`post_content_filtered`) args for a `custom_css` post being updated.
+	 * Filters the `css` (`post_content`) and `preprocessed` (`post_content_filtered`) args
+	 * for a `custom_css` post being updated.
 	 *
 	 * This filter can be used by plugin that offer CSS pre-processors, to store the original
 	 * pre-processed CSS in `post_content_filtered` and then store processed CSS in `post_content`.
@@ -1988,7 +2010,8 @@ function wp_update_custom_css_post( $css, $args = array() ) {
 	 *     Custom CSS data.
 	 *
 	 *     @type string $css          CSS stored in `post_content`.
-	 *     @type string $preprocessed Pre-processed CSS stored in `post_content_filtered`. Normally empty string.
+	 *     @type string $preprocessed Pre-processed CSS stored in `post_content_filtered`.
+	 *                                Normally empty string.
 	 * }
 	 * @param array $args {
 	 *     The args passed into `wp_update_custom_css_post()` merged with defaults.
@@ -2104,7 +2127,7 @@ function remove_editor_styles() {
  */
 function get_editor_stylesheets() {
 	$stylesheets = array();
-	// Load editor_style.css if the current theme supports it.
+	// Load editor_style.css if the active theme supports it.
 	if ( ! empty( $GLOBALS['editor_styles'] ) && is_array( $GLOBALS['editor_styles'] ) ) {
 		$editor_styles = $GLOBALS['editor_styles'];
 
@@ -2174,9 +2197,11 @@ function get_theme_starter_content() {
 						'',
 						array(
 							'<strong>' . _x( 'Address', 'Theme starter content' ) . "</strong>\n",
-							_x( '123 Main Street', 'Theme starter content' ) . "\n" . _x( 'New York, NY 10001', 'Theme starter content' ) . "\n\n",
+							_x( '123 Main Street', 'Theme starter content' ) . "\n",
+							_x( 'New York, NY 10001', 'Theme starter content' ) . "\n\n",
 							'<strong>' . _x( 'Hours', 'Theme starter content' ) . "</strong>\n",
-							_x( 'Monday&ndash;Friday: 9:00AM&ndash;5:00PM', 'Theme starter content' ) . "\n" . _x( 'Saturday &amp; Sunday: 11:00AM&ndash;3:00PM', 'Theme starter content' ),
+							_x( 'Monday&ndash;Friday: 9:00AM&ndash;5:00PM', 'Theme starter content' ) . "\n",
+							_x( 'Saturday &amp; Sunday: 11:00AM&ndash;3:00PM', 'Theme starter content' ),
 						)
 					),
 					'filter' => true,
@@ -2378,7 +2403,10 @@ function get_theme_starter_content() {
 							}
 
 							$content[ $type ][ $sidebar_id ][] = $widget;
-						} elseif ( is_string( $widget ) && ! empty( $core_content[ $type ] ) && ! empty( $core_content[ $type ][ $widget ] ) ) {
+						} elseif ( is_string( $widget )
+							&& ! empty( $core_content[ $type ] )
+							&& ! empty( $core_content[ $type ][ $widget ] )
+						) {
 							$content[ $type ][ $sidebar_id ][] = $core_content[ $type ][ $widget ];
 						}
 					}
@@ -2405,7 +2433,10 @@ function get_theme_starter_content() {
 							}
 
 							$content[ $type ][ $nav_menu_location ]['items'][] = $nav_menu_item;
-						} elseif ( is_string( $nav_menu_item ) && ! empty( $core_content[ $type ] ) && ! empty( $core_content[ $type ][ $nav_menu_item ] ) ) {
+						} elseif ( is_string( $nav_menu_item )
+							&& ! empty( $core_content[ $type ] )
+							&& ! empty( $core_content[ $type ][ $nav_menu_item ] )
+						) {
 							$content[ $type ][ $nav_menu_location ]['items'][] = $core_content[ $type ][ $nav_menu_item ];
 						}
 					}
@@ -2565,7 +2596,11 @@ function add_theme_support( $feature, ...$args ) {
 
 				$args[0] = array_intersect( $args[0], array_keys( $post_formats ) );
 			} else {
-				_doing_it_wrong( "add_theme_support( 'post-formats' )", __( 'You need to pass an array of post formats.' ), '5.6.0' );
+				_doing_it_wrong(
+					"add_theme_support( 'post-formats' )",
+					__( 'You need to pass an array of post formats.' ),
+					'5.6.0'
+				);
 				return false;
 			}
 			break;
@@ -2576,7 +2611,11 @@ function add_theme_support( $feature, ...$args ) {
 				// Build an array of types for back-compat.
 				$args = array( 0 => array( 'comment-list', 'comment-form', 'search-form' ) );
 			} elseif ( ! isset( $args[0] ) || ! is_array( $args[0] ) ) {
-				_doing_it_wrong( "add_theme_support( 'html5' )", __( 'You need to pass an array of types.' ), '3.6.1' );
+				_doing_it_wrong(
+					"add_theme_support( 'html5' )",
+					__( 'You need to pass an array of types.' ),
+					'3.6.1'
+				);
 				return false;
 			}
 
@@ -2817,7 +2856,10 @@ function _custom_header_background_just_in_time() {
  * @access private
  */
 function _custom_logo_header_styles() {
-	if ( ! current_theme_supports( 'custom-header', 'header-text' ) && get_theme_support( 'custom-logo', 'header-text' ) && ! get_theme_mod( 'header_text', true ) ) {
+	if ( ! current_theme_supports( 'custom-header', 'header-text' )
+		&& get_theme_support( 'custom-logo', 'header-text' )
+		&& ! get_theme_mod( 'header_text', true )
+	) {
 		$classes = (array) get_theme_support( 'custom-logo', 'header-text' );
 		$classes = array_map( 'sanitize_html_class', $classes );
 		$classes = '.' . implode( ', .', $classes );
@@ -2856,6 +2898,7 @@ function _custom_logo_header_styles() {
  */
 function get_theme_support( $feature, ...$args ) {
 	global $_wp_theme_features;
+
 	if ( ! isset( $_wp_theme_features[ $feature ] ) ) {
 		return false;
 	}
@@ -2981,7 +3024,7 @@ function _remove_theme_support( $feature ) {
  * @param string $feature The feature being checked. See add_theme_support() for the list
  *                        of possible values.
  * @param mixed  ...$args Optional extra arguments to be checked against certain features.
- * @return bool True if the current theme supports the feature, false otherwise.
+ * @return bool True if the active theme supports the feature, false otherwise.
  */
 function current_theme_supports( $feature, ...$args ) {
 	global $_wp_theme_features;
@@ -3031,14 +3074,14 @@ function current_theme_supports( $feature, ...$args ) {
 	}
 
 	/**
-	 * Filters whether the current theme supports a specific feature.
+	 * Filters whether the active theme supports a specific feature.
 	 *
 	 * The dynamic portion of the hook name, `$feature`, refers to the specific
 	 * theme feature. See add_theme_support() for the list of possible values.
 	 *
 	 * @since 3.4.0
 	 *
-	 * @param bool   $supports Whether the current theme supports the given feature. Default true.
+	 * @param bool   $supports Whether the active theme supports the given feature. Default true.
 	 * @param array  $args     Array of arguments for the feature.
 	 * @param string $feature  The theme feature.
 	 */
@@ -3053,7 +3096,7 @@ function current_theme_supports( $feature, ...$args ) {
  * @param string $feature The feature being checked. See add_theme_support() for the list
  *                        of possible values.
  * @param string $include Path to the file.
- * @return bool True if the current theme supports the supplied feature, false otherwise.
+ * @return bool True if the active theme supports the supplied feature, false otherwise.
  */
 function require_if_theme_supports( $feature, $include ) {
 	if ( current_theme_supports( $feature ) ) {
@@ -3066,7 +3109,7 @@ function require_if_theme_supports( $feature, $include ) {
 /**
  * Registers a theme feature for use in add_theme_support().
  *
- * This does not indicate that the current theme supports the feature, it only describes
+ * This does not indicate that the active theme supports the feature, it only describes
  * the feature's supported options.
  *
  * @since 5.5.0
@@ -3173,7 +3216,9 @@ function register_theme_feature( $feature, $args = array() ) {
 	}
 
 	if ( is_array( $args['show_in_rest'] ) ) {
-		if ( isset( $args['show_in_rest']['prepare_callback'] ) && ! is_callable( $args['show_in_rest']['prepare_callback'] ) ) {
+		if ( isset( $args['show_in_rest']['prepare_callback'] )
+			&& ! is_callable( $args['show_in_rest']['prepare_callback'] )
+		) {
 			return new WP_Error(
 				'invalid_rest_prepare_callback',
 				sprintf(
@@ -3292,6 +3337,7 @@ function _delete_attachment_theme_mod( $id ) {
  */
 function check_theme_switched() {
 	$stylesheet = get_option( 'theme_switched' );
+
 	if ( $stylesheet ) {
 		$old_theme = wp_get_theme( $stylesheet );
 
@@ -3321,6 +3367,7 @@ function check_theme_switched() {
 			/** This action is documented in wp-includes/theme.php */
 			do_action( 'after_switch_theme', $stylesheet, $old_theme );
 		}
+
 		flush_rewrite_rules();
 
 		update_option( 'theme_switched', false );
@@ -3360,7 +3407,14 @@ function _wp_customize_include() {
 	 * called before wp_magic_quotes() gets called. Besides this fact, none of
 	 * the values should contain any characters needing slashes anyway.
 	 */
-	$keys       = array( 'changeset_uuid', 'customize_changeset_uuid', 'customize_theme', 'theme', 'customize_messenger_channel', 'customize_autosaved' );
+	$keys       = array(
+		'changeset_uuid',
+		'customize_changeset_uuid',
+		'customize_theme',
+		'theme',
+		'customize_messenger_channel',
+		'customize_autosaved',
+	);
 	$input_vars = array_merge(
 		wp_array_slice_assoc( $_GET, $keys ),
 		wp_array_slice_assoc( $_POST, $keys )
@@ -3416,7 +3470,16 @@ function _wp_customize_include() {
 	$settings_previewed       = ! $is_customize_save_action;
 
 	require_once ABSPATH . WPINC . '/class-wp-customize-manager.php';
-	$GLOBALS['wp_customize'] = new WP_Customize_Manager( compact( 'changeset_uuid', 'theme', 'messenger_channel', 'settings_previewed', 'autosaved', 'branching' ) );
+	$GLOBALS['wp_customize'] = new WP_Customize_Manager(
+		compact(
+			'changeset_uuid',
+			'theme',
+			'messenger_channel',
+			'settings_previewed',
+			'autosaved',
+			'branching'
+		)
+	);
 }
 
 /**
@@ -3559,7 +3622,7 @@ function _wp_customize_loader_settings() {
  *
  * @since 3.4.0
  *
- * @param string $stylesheet Optional. Theme to customize. Defaults to current theme.
+ * @param string $stylesheet Optional. Theme to customize. Defaults to active theme.
  *                           The theme's stylesheet will be urlencoded if necessary.
  * @return string
  */
@@ -3628,7 +3691,8 @@ function is_customize_preview() {
 }
 
 /**
- * Makes sure that auto-draft posts get their post_date bumped or status changed to draft to prevent premature garbage-collection.
+ * Makes sure that auto-draft posts get their post_date bumped or status changed
+ * to draft to prevent premature garbage-collection.
  *
  * When a changeset is updated but remains an auto-draft, ensure the post_date
  * for the auto-draft posts remains the same so that it will be
@@ -4089,3 +4153,41 @@ function create_initial_theme_features() {
 		)
 	);
 }
+
+/**
+ * Returns whether the active theme is a block-based theme or not.
+ *
+ * @since 5.9.0
+ *
+ * @return boolean Whether the active theme is a block-based theme or not.
+ */
+function wp_is_block_theme() {
+	return wp_get_theme()->is_block_theme();
+}
+
+/**
+ * Adds default theme supports for block themes when the 'setup_theme' action fires.
+ *
+ * See {@see 'setup_theme'}.
+ *
+ * @since 5.9.0
+ * @access private
+ */
+function _add_default_theme_supports() {
+	if ( ! wp_is_block_theme() ) {
+		return;
+	}
+
+	add_theme_support( 'post-thumbnails' );
+	add_theme_support( 'responsive-embeds' );
+	add_theme_support( 'editor-styles' );
+	/*
+	 * Makes block themes support HTML5 by default for the comment block and search form
+	 * (which use default template functions) and `[caption]` and `[gallery]` shortcodes.
+	 * Other blocks contain their own HTML5 markup.
+	 */
+	add_theme_support( 'html5', array( 'comment-form', 'comment-list', 'search-form', 'gallery', 'caption', 'style', 'script' ) );
+	add_theme_support( 'automatic-feed-links' );
+
+	add_filter( 'should_load_separate_core_block_assets', '__return_true' );
+}
diff --git a/src/wp-includes/update.php b/src/wp-includes/update.php
index 42ae3ecf3a..e30da7358e 100644
--- a/src/wp-includes/update.php
+++ b/src/wp-includes/update.php
@@ -568,7 +568,7 @@ function wp_update_themes( $extra_stats = array() ) {
 	$checked = array();
 	$request = array();
 
-	// Put slug of current theme into request.
+	// Put slug of active theme into request.
 	$request['active'] = get_option( 'stylesheet' );
 
 	foreach ( $installed_themes as $theme ) {
diff --git a/src/wp-includes/user.php b/src/wp-includes/user.php
index 018c960c03..81944eda0e 100644
--- a/src/wp-includes/user.php
+++ b/src/wp-includes/user.php
@@ -765,6 +765,126 @@ function get_users( $args = array() ) {
 	return (array) $user_search->get_results();
 }
 
+/**
+ * List all the users of the site, with several options available.
+ *
+ * @since 5.9.0
+ *
+ * @param string|array $args {
+ *     Optional. Array or string of default arguments.
+ *
+ *     @type string $orderby       How to sort the users. Accepts 'nicename', 'email', 'url', 'registered',
+ *                                 'user_nicename', 'user_email', 'user_url', 'user_registered', 'name',
+ *                                 'display_name', 'post_count', 'ID', 'meta_value', 'user_login'. Default 'name'.
+ *     @type string $order         Sorting direction for $orderby. Accepts 'ASC', 'DESC'. Default 'ASC'.
+ *     @type int    $number        Maximum users to return or display. Default empty (all users).
+ *     @type bool   $exclude_admin Whether to exclude the 'admin' account, if it exists. Default false.
+ *     @type bool   $show_fullname Whether to show the user's full name. Default false.
+ *     @type string $feed          If not empty, show a link to the user's feed and use this text as the alt
+ *                                 parameter of the link. Default empty.
+ *     @type string $feed_image    If not empty, show a link to the user's feed and use this image URL as
+ *                                 clickable anchor. Default empty.
+ *     @type string $feed_type     The feed type to link to, such as 'rss2'. Defaults to default feed type.
+ *     @type bool   $echo          Whether to output the result or instead return it. Default true.
+ *     @type string $style         If 'list', each user is wrapped in an `<li>` element, otherwise the users
+ *                                 will be separated by commas.
+ *     @type bool   $html          Whether to list the items in HTML form or plaintext. Default true.
+ *     @type string $exclude       An array, comma-, or space-separated list of user IDs to exclude. Default empty.
+ *     @type string $include       An array, comma-, or space-separated list of user IDs to include. Default empty.
+ * }
+ * @return string|null The output if echo is false. Otherwise null.
+ */
+function wp_list_users( $args = array() ) {
+	$defaults = array(
+		'orderby'       => 'name',
+		'order'         => 'ASC',
+		'number'        => '',
+		'exclude_admin' => true,
+		'show_fullname' => false,
+		'feed'          => '',
+		'feed_image'    => '',
+		'feed_type'     => '',
+		'echo'          => true,
+		'style'         => 'list',
+		'html'          => true,
+		'exclude'       => '',
+		'include'       => '',
+	);
+
+	$args = wp_parse_args( $args, $defaults );
+
+	$return = '';
+
+	$query_args           = wp_array_slice_assoc( $args, array( 'orderby', 'order', 'number', 'exclude', 'include' ) );
+	$query_args['fields'] = 'ids';
+	$users                = get_users( $query_args );
+
+	foreach ( $users as $user_id ) {
+		$user = get_userdata( $user_id );
+
+		if ( $args['exclude_admin'] && 'admin' === $user->display_name ) {
+			continue;
+		}
+
+		if ( $args['show_fullname'] && '' !== $user->first_name && '' !== $user->last_name ) {
+			$name = "$user->first_name $user->last_name";
+		} else {
+			$name = $user->display_name;
+		}
+
+		if ( ! $args['html'] ) {
+			$return .= $name . ', ';
+
+			continue; // No need to go further to process HTML.
+		}
+
+		if ( 'list' === $args['style'] ) {
+			$return .= '<li>';
+		}
+
+		$row = $name;
+
+		if ( ! empty( $args['feed_image'] ) || ! empty( $args['feed'] ) ) {
+			$row .= ' ';
+			if ( empty( $args['feed_image'] ) ) {
+				$row .= '(';
+			}
+
+			$row .= '<a href="' . get_author_feed_link( $user->ID, $args['feed_type'] ) . '"';
+
+			$alt = '';
+			if ( ! empty( $args['feed'] ) ) {
+				$alt  = ' alt="' . esc_attr( $args['feed'] ) . '"';
+				$name = $args['feed'];
+			}
+
+			$row .= '>';
+
+			if ( ! empty( $args['feed_image'] ) ) {
+				$row .= '<img src="' . esc_url( $args['feed_image'] ) . '" style="border: none;"' . $alt . ' />';
+			} else {
+				$row .= $name;
+			}
+
+			$row .= '</a>';
+
+			if ( empty( $args['feed_image'] ) ) {
+				$row .= ')';
+			}
+		}
+
+		$return .= $row;
+		$return .= ( 'list' === $args['style'] ) ? '</li>' : ', ';
+	}
+
+	$return = rtrim( $return, ', ' );
+
+	if ( ! $args['echo'] ) {
+		return $return;
+	}
+	echo $return;
+}
+
 /**
  * Get the sites a user belongs to.
  *
@@ -1923,6 +2043,10 @@ function wp_insert_user( $userdata ) {
 	 */
 	$user_url = apply_filters( 'pre_user_url', $raw_user_url );
 
+	if ( mb_strlen( $user_url ) > 100 ) {
+		return new WP_Error( 'user_url_too_long', __( 'User URL may not be longer than 100 characters.' ) );
+	}
+
 	$user_registered = empty( $userdata['user_registered'] ) ? gmdate( 'Y-m-d H:i:s' ) : $userdata['user_registered'];
 
 	$user_activation_key = empty( $userdata['user_activation_key'] ) ? '' : $userdata['user_activation_key'];
@@ -2038,7 +2162,7 @@ function wp_insert_user( $userdata ) {
 	 * It only includes data in the users table, not any user metadata.
 	 *
 	 * @since 4.9.0
-	 * @since 5.8.0 The $userdata parameter was added.
+	 * @since 5.8.0 The `$userdata` parameter was added.
 	 *
 	 * @param array    $data {
 	 *     Values and keys for the user.
@@ -2083,7 +2207,7 @@ function wp_insert_user( $userdata ) {
 	 * For custom meta fields, see the {@see 'insert_custom_user_meta'} filter.
 	 *
 	 * @since 4.4.0
-	 * @since 5.8.0 The $userdata parameter was added.
+	 * @since 5.8.0 The `$userdata` parameter was added.
 	 *
 	 * @param array $meta {
 	 *     Default meta values and keys for the user.
@@ -2154,7 +2278,7 @@ function wp_insert_user( $userdata ) {
 		 * Fires immediately after an existing user is updated.
 		 *
 		 * @since 2.0.0
-		 * @since 5.8.0 The $userdata parameter was added.
+		 * @since 5.8.0 The `$userdata` parameter was added.
 		 *
 		 * @param int     $user_id       User ID.
 		 * @param WP_User $old_user_data Object containing user's data prior to update.
@@ -2188,7 +2312,7 @@ function wp_insert_user( $userdata ) {
 		 * Fires immediately after a new user is registered.
 		 *
 		 * @since 1.5.0
-		 * @since 5.8.0 The $userdata parameter was added.
+		 * @since 5.8.0 The `$userdata` parameter was added.
 		 *
 		 * @param int   $user_id  User ID.
 		 * @param array $userdata The raw array of data passed to wp_insert_user().
@@ -2818,6 +2942,19 @@ function retrieve_password( $user_login = null ) {
 		return $errors;
 	}
 
+	/**
+	 * Filters whether to send the retrieve password email.
+	 *
+	 * Return false to disable sending the email.
+	 *
+	 * @since 6.0.0
+	 *
+	 * @param bool $send Whether to send the email.
+	 */
+	if ( ! apply_filters( 'send_retrieve_password_email', true ) ) {
+		return true;
+	}
+
 	// Redefining user_login ensures we return the right case in the email.
 	$user_login = $user_data->user_login;
 	$user_email = $user_data->user_email;
@@ -2892,11 +3029,63 @@ function retrieve_password( $user_login = null ) {
 	 */
 	$message = apply_filters( 'retrieve_password_message', $message, $key, $user_login, $user_data );
 
+	// Short-circuit on falsey $message value for backwards compatibility.
+	if ( ! $message ) {
+		return true;
+	}
+
+	/*
+	 * Wrap the single notification email arguments in an array
+	 * to pass them to the retrieve_password_notification_email filter.
+	 */
+	$defaults = array(
+		'to'      => $user_email,
+		'subject' => $title,
+		'message' => $message,
+		'headers' => '',
+	);
+
+	$data = compact( 'key', 'user_login', 'user_data' );
+
+	/**
+	 * Filters the contents of the reset password notification email sent to the user.
+	 *
+	 * @since 6.0.0
+	 *
+	 * @param array $defaults {
+	 *     The default notification email arguments. Used to build wp_mail().
+	 *
+	 *     @type string $to      The intended recipient - user email address.
+	 *     @type string $subject The subject of the email.
+	 *     @type string $message The body of the email.
+	 *     @type string $headers The headers of the email.
+	 * }
+	 * @param array $data {
+	 *     Additional information for extenders.
+	 *
+	 *     @type string  $key        The activation key.
+	 *     @type string  $user_login The username for the user.
+	 *     @type WP_User $user_data  WP_User object.
+	 * }
+	 */
+	$notification_email = apply_filters( 'retrieve_password_notification_email', $defaults, $data );
+
 	if ( $switched_locale ) {
 		restore_previous_locale();
 	}
 
-	if ( $message && ! wp_mail( $user_email, wp_specialchars_decode( $title ), $message ) ) {
+	if ( is_array( $notification_email ) ) {
+		// Force key order and merge defaults in case any value is missing in the filtered array.
+		$notification_email = array_merge( $defaults, $notification_email );
+	} else {
+		$notification_email = $defaults;
+	}
+
+	list( $to, $subject, $message, $headers ) = array_values( $notification_email );
+
+	$subject = wp_specialchars_decode( $subject );
+
+	if ( ! wp_mail( $to, $subject, $message, $headers ) ) {
 		$errors->add(
 			'retrieve_password_email_failure',
 			sprintf(
@@ -2990,7 +3179,14 @@ function register_new_user( $user_login, $user_email ) {
 		$errors->add( 'invalid_email', __( '<strong>Error</strong>: The email address isn&#8217;t correct.' ) );
 		$user_email = '';
 	} elseif ( email_exists( $user_email ) ) {
-		$errors->add( 'email_exists', __( '<strong>Error</strong>: This email is already registered. Please choose another one.' ) );
+		$errors->add(
+			'email_exists',
+			sprintf(
+				/* translators: %s: Link to the login page. */
+				__( '<strong>Error:</strong> This email address is already registered. <a href="%s">Log in</a> with this address or choose another one.' ),
+				wp_login_url()
+			)
+		);
 	}
 
 	/**
@@ -3044,6 +3240,13 @@ function register_new_user( $user_login, $user_email ) {
 
 	update_user_meta( $user_id, 'default_password_nag', true ); // Set up the password change nag.
 
+	if ( ! empty( $_COOKIE['wp_lang'] ) ) {
+		$wp_lang = sanitize_text_field( $_COOKIE['wp_lang'] );
+		if ( in_array( $wp_lang, get_available_languages(), true ) ) {
+			update_user_meta( $user_id, 'locale', $wp_lang ); // Set user locale if defined on registration.
+		}
+	}
+
 	/**
 	 * Fires after a new user registration has been recorded.
 	 *
@@ -4523,19 +4726,31 @@ function wp_get_user_request( $request_id ) {
 	return new WP_User_Request( $post );
 }
 
+/**
+ * Checks if Application Passwords is supported.
+ *
+ * Application Passwords is supported only by sites using SSL or local environments
+ * but may be made available using the {@see 'wp_is_application_passwords_available'} filter.
+ *
+ * @since 5.9.0
+ *
+ * @return bool
+ */
+function wp_is_application_passwords_supported() {
+	return is_ssl() || 'local' === wp_get_environment_type();
+}
+
 /**
  * Checks if Application Passwords is globally available.
  *
  * By default, Application Passwords is available to all sites using SSL or to local environments.
- * Use {@see 'wp_is_application_passwords_available'} to adjust its availability.
+ * Use the {@see 'wp_is_application_passwords_available'} filter to adjust its availability.
  *
  * @since 5.6.0
  *
  * @return bool
  */
 function wp_is_application_passwords_available() {
-	$available = is_ssl() || 'local' === wp_get_environment_type();
-
 	/**
 	 * Filters whether Application Passwords is available.
 	 *
@@ -4543,7 +4758,7 @@ function wp_is_application_passwords_available() {
 	 *
 	 * @param bool $available True if available, false otherwise.
 	 */
-	return apply_filters( 'wp_is_application_passwords_available', $available );
+	return apply_filters( 'wp_is_application_passwords_available', wp_is_application_passwords_supported() );
 }
 
 /**
diff --git a/src/wp-includes/version.php b/src/wp-includes/version.php
index 87b8638c0a..b94cf80c30 100644
--- a/src/wp-includes/version.php
+++ b/src/wp-includes/version.php
@@ -16,7 +16,7 @@
  *
  * @global string $wp_version
  */
-$wp_version = '5.9-alpha-51272-src';
+$wp_version = '6.0-alpha-52448-src';
 
 /**
  * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.
diff --git a/src/wp-includes/widgets.php b/src/wp-includes/widgets.php
index 56087c32f3..4aaa6112b2 100644
--- a/src/wp-includes/widgets.php
+++ b/src/wp-includes/widgets.php
@@ -489,7 +489,7 @@ function wp_unregister_sidebar_widget( $id ) {
 	 *
 	 * @since 3.0.0
 	 *
-	 * @param int $id The widget ID.
+	 * @param int|string $id The widget ID.
 	 */
 	do_action( 'wp_unregister_sidebar_widget', $id );
 
@@ -519,7 +519,7 @@ function wp_unregister_sidebar_widget( $id ) {
  *     @type int        $width   Width of the fully expanded control form (but try hard to use the default width).
  *                               Default 250.
  *     @type int|string $id_base Required for multi-widgets, i.e widgets that allow multiple instances such as the
- *                               text widget. The widget id will end up looking like `{$id_base}-{$unique_number}`.
+ *                               text widget. The widget ID will end up looking like `{$id_base}-{$unique_number}`.
  * }
  * @param mixed      ...$params        Optional additional parameters to pass to the callback function when it's called.
  */
@@ -1040,13 +1040,13 @@ function wp_get_sidebars_widgets( $deprecated = true ) {
 }
 
 /**
- * Retrieves the registered sidebar with the given id.
+ * Retrieves the registered sidebar with the given ID.
  *
  * @since 5.9.0
  *
  * @global array $wp_registered_sidebars The registered sidebars.
  *
- * @param string $id The sidebar id.
+ * @param string $id The sidebar ID.
  * @return array|null The discovered sidebar, or null if it is not registered.
  */
 function wp_get_sidebar( $id ) {
@@ -1916,8 +1916,8 @@ function wp_parse_widget_id( $id ) {
  *
  * @since 5.8.0
  *
- * @param string $widget_id The widget id to look for.
- * @return string|null The found sidebar's id, or null if it was not found.
+ * @param string $widget_id The widget ID to look for.
+ * @return string|null The found sidebar's ID, or null if it was not found.
  */
 function wp_find_widgets_sidebar( $widget_id ) {
 	foreach ( wp_get_sidebars_widgets() as $sidebar_id => $widget_ids ) {
@@ -1936,8 +1936,8 @@ function wp_find_widgets_sidebar( $widget_id ) {
  *
  * @since 5.8.0
  *
- * @param string $widget_id  The widget id to assign.
- * @param string $sidebar_id The sidebar id to assign to. If empty, the widget won't be added to any sidebar.
+ * @param string $widget_id  The widget ID to assign.
+ * @param string $sidebar_id The sidebar ID to assign to. If empty, the widget won't be added to any sidebar.
  */
 function wp_assign_widget_to_sidebar( $widget_id, $sidebar_id ) {
 	$sidebars = wp_get_sidebars_widgets();
@@ -1946,7 +1946,7 @@ function wp_assign_widget_to_sidebar( $widget_id, $sidebar_id ) {
 		foreach ( $widgets as $i => $maybe_widget_id ) {
 			if ( $widget_id === $maybe_widget_id && $sidebar_id !== $maybe_sidebar_id ) {
 				unset( $sidebars[ $maybe_sidebar_id ][ $i ] );
-				// We could technically break 2 here, but continue looping in case the id is duplicated.
+				// We could technically break 2 here, but continue looping in case the ID is duplicated.
 				continue 2;
 			}
 		}
diff --git a/src/wp-includes/widgets/class-wp-widget-search.php b/src/wp-includes/widgets/class-wp-widget-search.php
index 33837c5013..fe5686654d 100644
--- a/src/wp-includes/widgets/class-wp-widget-search.php
+++ b/src/wp-includes/widgets/class-wp-widget-search.php
@@ -51,7 +51,7 @@ class WP_Widget_Search extends WP_Widget {
 			echo $args['before_title'] . $title . $args['after_title'];
 		}
 
-		// Use current theme search form if it exists.
+		// Use active theme search form if it exists.
 		get_search_form();
 
 		echo $args['after_widget'];
diff --git a/src/wp-includes/wp-db.php b/src/wp-includes/wp-db.php
index 53ba207203..a3942735ce 100644
--- a/src/wp-includes/wp-db.php
+++ b/src/wp-includes/wp-db.php
@@ -132,16 +132,25 @@ class wpdb {
 	 *
 	 * @since 0.71
 	 *
-	 * @var array|null
+	 * @var stdClass[]|null
 	 */
 	public $last_result;
 
 	/**
-	 * MySQL result, which is either a resource or boolean.
+	 * Database query result.
+	 *
+	 * Possible values:
+	 *
+	 * - For successful SELECT, SHOW, DESCRIBE, or EXPLAIN queries:
+	 *   - `mysqli_result` instance when the `mysqli` driver is in use
+	 *   - `resource` when the older `mysql` driver is in use
+	 * - `true` for other query types that were successful
+	 * - `null` if a query is yet to be made or if the result has since been flushed
+	 * - `false` if the query returned an error
 	 *
 	 * @since 0.71
 	 *
-	 * @var mixed
+	 * @var mysqli_result|resource|bool|null
 	 */
 	protected $result;
 
@@ -155,16 +164,16 @@ class wpdb {
 	protected $col_meta = array();
 
 	/**
-	 * Calculated character sets on tables.
+	 * Calculated character sets keyed by table name.
 	 *
 	 * @since 4.2.0
 	 *
-	 * @var array
+	 * @var string[]
 	 */
 	protected $table_charset = array();
 
 	/**
-	 * Whether text fields in the current query need to be sanity checked. Default false.
+	 * Whether text fields in the current query need to be sanity checked.
 	 *
 	 * @since 4.2.0
 	 *
@@ -200,7 +209,7 @@ class wpdb {
 	 * @since 5.3.0 The fifth element in each query log was added to record custom data.
 	 *
 	 * @var array[] {
-	 *     Array of queries that were executed.
+	 *     Array of arrays containing information about queries that were executed.
 	 *
 	 *     @type array ...$0 {
 	 *         Data for each query.
@@ -226,7 +235,7 @@ class wpdb {
 	protected $reconnect_retries = 5;
 
 	/**
-	 * WordPress table prefix
+	 * WordPress table prefix.
 	 *
 	 * You can set this to have multiple WordPress installations in a single database.
 	 * The second reason is for possible security precautions.
@@ -274,12 +283,12 @@ class wpdb {
 	public $siteid = 0;
 
 	/**
-	 * List of WordPress per-blog tables.
+	 * List of WordPress per-site tables.
 	 *
 	 * @since 2.5.0
 	 *
 	 * @see wpdb::tables()
-	 * @var array
+	 * @var string[]
 	 */
 	public $tables = array(
 		'posts',
@@ -302,7 +311,7 @@ class wpdb {
 	 * @since 2.9.0
 	 *
 	 * @see wpdb::tables()
-	 * @var array
+	 * @var string[]
 	 */
 	public $old_tables = array( 'categories', 'post2cat', 'link2cat' );
 
@@ -312,7 +321,7 @@ class wpdb {
 	 * @since 3.0.0
 	 *
 	 * @see wpdb::tables()
-	 * @var array
+	 * @var string[]
 	 */
 	public $global_tables = array( 'users', 'usermeta' );
 
@@ -322,7 +331,7 @@ class wpdb {
 	 * @since 3.0.0
 	 *
 	 * @see wpdb::tables()
-	 * @var array
+	 * @var string[]
 	 */
 	public $ms_global_tables = array(
 		'blogs',
@@ -581,11 +590,18 @@ class wpdb {
 	protected $dbhost;
 
 	/**
-	 * Database Handle.
+	 * Database handle.
+	 *
+	 * Possible values:
+	 *
+	 * - `mysqli` instance when the `mysqli` driver is in use
+	 * - `resource` when the older `mysql` driver is in use
+	 * - `null` if the connection is yet to be made or has been closed
+	 * - `false` if the connection has failed
 	 *
 	 * @since 0.71
 	 *
-	 * @var string
+	 * @var mysqli|resource|false|null
 	 */
 	protected $dbh;
 
@@ -617,7 +633,7 @@ class wpdb {
 	 *
 	 * @since 3.9.0
 	 *
-	 * @var array
+	 * @var string[]
 	 */
 	protected $incompatible_modes = array(
 		'NO_ZERO_DATE',
@@ -669,24 +685,24 @@ class wpdb {
 	/**
 	 * Connects to the database server and selects a database.
 	 *
-	 * PHP5 style constructor for compatibility with PHP5. Does the actual setting up
+	 * Does the actual setting up
 	 * of the class properties and connection to the database.
 	 *
 	 * @since 2.0.8
 	 *
 	 * @link https://core.trac.wordpress.org/ticket/3354
 	 *
-	 * @param string $dbuser     MySQL database user.
-	 * @param string $dbpassword MySQL database password.
-	 * @param string $dbname     MySQL database name.
-	 * @param string $dbhost     MySQL database host.
+	 * @param string $dbuser     Database user.
+	 * @param string $dbpassword Database password.
+	 * @param string $dbname     Database name.
+	 * @param string $dbhost     Database host.
 	 */
 	public function __construct( $dbuser, $dbpassword, $dbname, $dbhost ) {
 		if ( WP_DEBUG && WP_DEBUG_DISPLAY ) {
 			$this->show_errors();
 		}
 
-		// Use ext/mysqli if it exists unless WP_USE_EXT_MYSQL is defined as true.
+		// Use the `mysqli` extension if it exists unless `WP_USE_EXT_MYSQL` is defined as true.
 		if ( function_exists( 'mysqli_connect' ) ) {
 			$this->use_mysqli = true;
 
@@ -849,9 +865,9 @@ class wpdb {
 	 *
 	 * @since 3.1.0
 	 *
-	 * @param resource $dbh     The resource given by mysql_connect.
-	 * @param string   $charset Optional. The character set. Default null.
-	 * @param string   $collate Optional. The collation. Default null.
+	 * @param mysqli|resource $dbh     The connection returned by `mysqli_connect()` or `mysql_connect()`.
+	 * @param string          $charset Optional. The character set. Default null.
+	 * @param string          $collate Optional. The collation. Default null.
 	 */
 	public function set_charset( $dbh, $charset = null, $collate = null ) {
 		if ( ! isset( $charset ) ) {
@@ -1059,16 +1075,16 @@ class wpdb {
 	/**
 	 * Returns an array of WordPress tables.
 	 *
-	 * Also allows for the CUSTOM_USER_TABLE and CUSTOM_USER_META_TABLE to override the WordPress users
+	 * Also allows for the `CUSTOM_USER_TABLE` and `CUSTOM_USER_META_TABLE` to override the WordPress users
 	 * and usermeta tables that would otherwise be determined by the prefix.
 	 *
-	 * The $scope argument can take one of the following:
+	 * The `$scope` argument can take one of the following:
 	 *
-	 * 'all' - returns 'all' and 'global' tables. No old tables are returned.
-	 * 'blog' - returns the blog-level tables for the queried blog.
-	 * 'global' - returns the global tables for the installation, returning multisite tables only on multisite.
-	 * 'ms_global' - returns the multisite global tables, regardless if current installation is multisite.
-	 * 'old' - returns tables which are deprecated.
+	 * - 'all' - returns 'all' and 'global' tables. No old tables are returned.
+	 * - 'blog' - returns the blog-level tables for the queried blog.
+	 * - 'global' - returns the global tables for the installation, returning multisite tables only on multisite.
+	 * - 'ms_global' - returns the multisite global tables, regardless if current installation is multisite.
+	 * - 'old' - returns tables which are deprecated.
 	 *
 	 * @since 3.0.0
 	 *
@@ -1082,7 +1098,7 @@ class wpdb {
 	 * @param bool   $prefix  Optional. Whether to include table prefixes. If blog prefix is requested,
 	 *                        then the custom users and usermeta tables will be mapped. Default true.
 	 * @param int    $blog_id Optional. The blog_id to prefix. Used only when prefix is requested.
-	 *                        Defaults to wpdb::$blogid.
+	 *                        Defaults to `wpdb::$blogid`.
 	 * @return string[] Table names. When a prefix is requested, the key is the unprefixed table name.
 	 */
 	public function tables( $scope = 'all', $prefix = true, $blog_id = 0 ) {
@@ -1141,15 +1157,15 @@ class wpdb {
 	}
 
 	/**
-	 * Selects a database using the current database connection.
+	 * Selects a database using the current or provided database connection.
 	 *
 	 * The database name will be changed based on the current database connection.
 	 * On failure, the execution will bail and display a DB error.
 	 *
 	 * @since 0.71
 	 *
-	 * @param string        $db  MySQL database name.
-	 * @param resource|null $dbh Optional link identifier.
+	 * @param string          $db  Database name.
+	 * @param mysqli|resource $dbh Optional database connection.
 	 */
 	public function select( $db, $dbh = null ) {
 		if ( is_null( $dbh ) ) {
@@ -1247,12 +1263,11 @@ class wpdb {
 			}
 		} else {
 			$class = get_class( $this );
-			if ( function_exists( '__' ) ) {
-				/* translators: %s: Database access abstraction class, usually wpdb or a class extending wpdb. */
-				_doing_it_wrong( $class, sprintf( __( '%s must set a database connection for use with escaping.' ), $class ), '3.6.0' );
-			} else {
-				_doing_it_wrong( $class, sprintf( '%s must set a database connection for use with escaping.', $class ), '3.6.0' );
-			}
+
+			wp_load_translations_early();
+			/* translators: %s: Database access abstraction class, usually wpdb or a class extending wpdb. */
+			_doing_it_wrong( $class, sprintf( __( '%s must set a database connection for use with escaping.' ), $class ), '3.6.0' );
+
 			$escaped = addslashes( $string );
 		}
 
@@ -1336,18 +1351,19 @@ class wpdb {
 	 * Prepares a SQL query for safe execution.
 	 *
 	 * Uses sprintf()-like syntax. The following placeholders can be used in the query string:
-	 *   %d (integer)
-	 *   %f (float)
-	 *   %s (string)
+	 *
+	 * - %d (integer)
+	 * - %f (float)
+	 * - %s (string)
 	 *
 	 * All placeholders MUST be left unquoted in the query string. A corresponding argument
 	 * MUST be passed for each placeholder.
 	 *
 	 * Note: There is one exception to the above: for compatibility with old behavior,
-	 * numbered or formatted string placeholders (eg, %1$s, %5s) will not have quotes
+	 * numbered or formatted string placeholders (eg, `%1$s`, `%5s`) will not have quotes
 	 * added by this function, so should be passed with appropriate quotes around them.
 	 *
-	 * Literal percentage signs (%) in the query string must be written as %%. Percentage wildcards
+	 * Literal percentage signs (`%`) in the query string must be written as `%%`. Percentage wildcards
 	 * (for example, to use in LIKE syntax) must be passed via a substitution argument containing
 	 * the complete LIKE string, these cannot be inserted directly in the query string.
 	 * Also see wpdb::esc_like().
@@ -1356,6 +1372,7 @@ class wpdb {
 	 * containing all arguments. A combination of the two is not supported.
 	 *
 	 * Examples:
+	 *
 	 *     $wpdb->prepare( "SELECT * FROM `table` WHERE `column` = %s AND `field` = %d OR `other_field` LIKE %s", array( 'foo', 1337, '%bar' ) );
 	 *     $wpdb->prepare( "SELECT DATE_FORMAT(`field`, '%%c') FROM `table` WHERE `column` = %s", 'foo' );
 	 *
@@ -1396,7 +1413,7 @@ class wpdb {
 
 		// If args were passed as an array (as in vsprintf), move them up.
 		$passed_as_array = false;
-		if ( is_array( $args[0] ) && count( $args ) === 1 ) {
+		if ( isset( $args[0] ) && is_array( $args[0] ) && 1 === count( $args ) ) {
 			$passed_as_array = true;
 			$args            = $args[0];
 		}
@@ -1496,7 +1513,7 @@ class wpdb {
 	}
 
 	/**
-	 * First half of escaping for LIKE special characters % and _ before preparing for MySQL.
+	 * First half of escaping for `LIKE` special characters `%` and `_` before preparing for SQL.
 	 *
 	 * Use this only before wpdb::prepare() or esc_sql(). Reversing the order is very bad for security.
 	 *
@@ -1685,7 +1702,7 @@ class wpdb {
 	/**
 	 * Connects to and selects database.
 	 *
-	 * If $allow_bail is false, the lack of database connection will need to be handled manually.
+	 * If `$allow_bail` is false, the lack of database connection will need to be handled manually.
 	 *
 	 * @since 3.0.0
 	 * @since 3.9.0 $allow_bail parameter added.
@@ -1884,7 +1901,7 @@ class wpdb {
 	 * If this function is unable to reconnect, it will forcibly die, or if called
 	 * after the {@see 'template_redirect'} hook has been fired, return false instead.
 	 *
-	 * If $allow_bail is false, the lack of database connection will need to be handled manually.
+	 * If `$allow_bail` is false, the lack of database connection will need to be handled manually.
 	 *
 	 * @since 3.9.0
 	 *
@@ -1968,7 +1985,7 @@ class wpdb {
 	}
 
 	/**
-	 * Performs a MySQL database query, using current database connection.
+	 * Performs a database query, using current database connection.
 	 *
 	 * More information can be found on the documentation page.
 	 *
@@ -2015,7 +2032,13 @@ class wpdb {
 			// to flush again, just to make sure everything is clear.
 			$this->flush();
 			if ( $stripped_query !== $query ) {
-				$this->insert_id = 0;
+				$this->insert_id  = 0;
+				$this->last_query = $query;
+
+				wp_load_translations_early();
+
+				$this->last_error = __( 'WordPress database error: Could not perform query because it contains invalid data.' );
+
 				return false;
 			}
 		}
@@ -2027,7 +2050,7 @@ class wpdb {
 
 		$this->_do_query( $query );
 
-		// MySQL server has gone away, try to reconnect.
+		// Database server has gone away, try to reconnect.
 		$mysql_errno = 0;
 		if ( ! empty( $this->dbh ) ) {
 			if ( $this->use_mysqli ) {
@@ -2252,6 +2275,7 @@ class wpdb {
 	 * Inserts a row into the table.
 	 *
 	 * Examples:
+	 *
 	 *     wpdb::insert( 'table', array( 'column' => 'foo', 'field' => 'bar' ) )
 	 *     wpdb::insert( 'table', array( 'column' => 'foo', 'field' => 1337 ), array( '%s', '%d' ) )
 	 *
@@ -2281,6 +2305,7 @@ class wpdb {
 	 * Replaces a row in the table.
 	 *
 	 * Examples:
+	 *
 	 *     wpdb::replace( 'table', array( 'column' => 'foo', 'field' => 'bar' ) )
 	 *     wpdb::replace( 'table', array( 'column' => 'foo', 'field' => 1337 ), array( '%s', '%d' ) )
 	 *
@@ -2368,6 +2393,7 @@ class wpdb {
 	 * Updates a row in the table.
 	 *
 	 * Examples:
+	 *
 	 *     wpdb::update( 'table', array( 'column' => 'foo', 'field' => 'bar' ), array( 'ID' => 1 ) )
 	 *     wpdb::update( 'table', array( 'column' => 'foo', 'field' => 1337 ), array( 'ID' => 1 ), array( '%s', '%d' ), array( '%d' ) )
 	 *
@@ -2447,6 +2473,7 @@ class wpdb {
 	 * Deletes a row in the table.
 	 *
 	 * Examples:
+	 *
 	 *     wpdb::delete( 'table', array( 'ID' => 1 ) )
 	 *     wpdb::delete( 'table', array( 'ID' => 1 ), array( '%d' ) )
 	 *
@@ -2535,6 +2562,30 @@ class wpdb {
 		$converted_data = $this->strip_invalid_text( $data );
 
 		if ( $data !== $converted_data ) {
+
+			$problem_fields = array();
+			foreach ( $data as $field => $value ) {
+				if ( $value !== $converted_data[ $field ] ) {
+					$problem_fields[] = $field;
+				}
+			}
+
+			wp_load_translations_early();
+
+			if ( 1 === count( $problem_fields ) ) {
+				$this->last_error = sprintf(
+					/* translators: %s: Database field where the error occurred. */
+					__( 'WordPress database error: Processing the value for the following field failed: %s. The supplied value may be too long or contains invalid data.' ),
+					reset( $problem_fields )
+				);
+			} else {
+				$this->last_error = sprintf(
+					/* translators: %s: Database fields where the error occurred. */
+					__( 'WordPress database error: Processing the values for the following fields failed: %s. The supplied values may be too long or contain invalid data.' ),
+					implode( ', ', $problem_fields )
+				);
+			}
+
 			return false;
 		}
 
@@ -2832,13 +2883,14 @@ class wpdb {
 		/**
 		 * Filters the table charset value before the DB is checked.
 		 *
-		 * Passing a non-null value to the filter will effectively short-circuit
+		 * Returning a non-null value from the filter will effectively short-circuit
 		 * checking the DB for the charset, returning that value instead.
 		 *
 		 * @since 4.2.0
 		 *
-		 * @param string|null $charset The character set to use. Default null.
-		 * @param string      $table   The name of the table being checked.
+		 * @param string|WP_Error|null $charset The character set to use, WP_Error object
+		 *                                      if it couldn't be found. Default null.
+		 * @param string               $table   The name of the table being checked.
 		 */
 		$charset = apply_filters( 'pre_get_table_charset', null, $table );
 		if ( null !== $charset ) {
@@ -2856,7 +2908,7 @@ class wpdb {
 		$table       = '`' . implode( '`.`', $table_parts ) . '`';
 		$results     = $this->get_results( "SHOW FULL COLUMNS FROM $table" );
 		if ( ! $results ) {
-			return new WP_Error( 'wpdb_get_table_charset_failure' );
+			return new WP_Error( 'wpdb_get_table_charset_failure', __( 'Could not retrieve table charset.' ) );
 		}
 
 		foreach ( $results as $column ) {
@@ -3298,7 +3350,7 @@ class wpdb {
 			$this->check_current_query = false;
 			$row                       = $this->get_row( 'SELECT ' . implode( ', ', $sql ), ARRAY_A );
 			if ( ! $row ) {
-				return new WP_Error( 'wpdb_strip_invalid_text_failure' );
+				return new WP_Error( 'wpdb_strip_invalid_text_failure', __( 'Could not strip invalid text.' ) );
 			}
 
 			foreach ( array_keys( $data ) as $column ) {
@@ -3593,7 +3645,6 @@ class wpdb {
 		}
 	}
 
-
 	/**
 	 * Closes the current database connection.
 	 *
@@ -3739,7 +3790,7 @@ class wpdb {
 	}
 
 	/**
-	 * Retrieves the MySQL server version.
+	 * Retrieves the database server version.
 	 *
 	 * @since 2.7.0
 	 *
@@ -3750,7 +3801,7 @@ class wpdb {
 	}
 
 	/**
-	 * Retrieves full MySQL server information.
+	 * Retrieves full database server information.
 	 *
 	 * @since 5.5.0
 	 *
diff --git a/src/wp-login.php b/src/wp-login.php
index b7c14b4c83..01c553ffdf 100644
--- a/src/wp-login.php
+++ b/src/wp-login.php
@@ -58,7 +58,7 @@ function login_header( $title = 'Log In', $message = '', $wp_error = null ) {
 	 *
 	 * @since 3.0.0
 	 *
-	 * @param array $shake_error_codes Error codes that shake the login form.
+	 * @param string[] $shake_error_codes Error codes that shake the login form.
 	 */
 	$shake_error_codes = apply_filters( 'shake_error_codes', $shake_error_codes );
 
@@ -185,8 +185,8 @@ function login_header( $title = 'Log In', $message = '', $wp_error = null ) {
 	 *
 	 * @since 3.5.0
 	 *
-	 * @param array  $classes An array of body classes.
-	 * @param string $action  The action that brought the visitor to the login page.
+	 * @param string[] $classes An array of body classes.
+	 * @param string   $action  The action that brought the visitor to the login page.
 	 */
 	$classes = apply_filters( 'login_body_class', $classes, $action );
 
@@ -228,14 +228,16 @@ function login_header( $title = 'Log In', $message = '', $wp_error = null ) {
 	}
 
 	if ( $wp_error->has_errors() ) {
-		$errors   = '';
-		$messages = '';
+		$errors    = '';
+		$messages  = '';
+		$aria_code = '';
 
 		foreach ( $wp_error->get_error_codes() as $code ) {
 			$severity = $wp_error->get_error_data( $code );
 			foreach ( $wp_error->get_error_messages( $code ) as $error_message ) {
 				if ( 'message' === $severity ) {
 					$messages .= '	' . $error_message . "<br />\n";
+					$aria_code = ' aria-describedby="' . $code . '"';
 				} else {
 					$errors .= '	' . $error_message . "<br />\n";
 				}
@@ -261,7 +263,7 @@ function login_header( $title = 'Log In', $message = '', $wp_error = null ) {
 			 *
 			 * @param string $messages Login messages.
 			 */
-			echo '<p class="message">' . apply_filters( 'login_messages', $messages ) . "</p>\n";
+			echo '<p class="message" ' . $aria_code . '>' . apply_filters( 'login_messages', $messages ) . "</p>\n";
 		}
 	}
 } // End of login_header().
@@ -311,6 +313,68 @@ function login_footer( $input_id = '' ) {
 	?>
 	</div><?php // End of <div id="login">. ?>
 
+	<?php
+	if (
+		! $interim_login &&
+		/**
+		 * Filters the Languages select input activation on the login screen.
+		 *
+		 * @since 5.9.0
+		 *
+		 * @param bool Whether to display the Languages select input on the login screen.
+		 */
+		apply_filters( 'login_display_language_dropdown', true )
+	) {
+		$languages = get_available_languages();
+
+		if ( ! empty( $languages ) ) {
+			?>
+			<div class="language-switcher">
+				<form id="language-switcher" action="" method="get">
+
+					<label for="language-switcher-locales">
+						<span class="dashicons dashicons-translation" aria-hidden="true"></span>
+						<span class="screen-reader-text"><?php _e( 'Language' ); ?></span>
+					</label>
+
+					<?php
+					$args = array(
+						'id'                          => 'language-switcher-locales',
+						'name'                        => 'wp_lang',
+						'selected'                    => determine_locale(),
+						'show_available_translations' => false,
+						'explicit_option_en_us'       => true,
+						'languages'                   => $languages,
+					);
+
+					/**
+					 * Filters default arguments for the Languages select input on the login screen.
+					 *
+					 * @since 5.9.0
+					 *
+					 * @param array $args Arguments for the Languages select input on the login screen.
+					 */
+					wp_dropdown_languages( apply_filters( 'login_language_dropdown_args', $args ) );
+					?>
+
+					<?php if ( $interim_login ) { ?>
+						<input type="hidden" name="interim-login" value="1" />
+					<?php } ?>
+
+					<?php if ( isset( $_GET['redirect_to'] ) && '' !== $_GET['redirect_to'] ) { ?>
+						<input type="hidden" name="redirect_to" value="<?php echo esc_url_raw( $_GET['redirect_to'] ); ?>" />
+					<?php } ?>
+
+					<?php if ( isset( $_GET['action'] ) && '' !== $_GET['action'] ) { ?>
+						<input type="hidden" name="action" value="<?php echo esc_attr( $_GET['action'] ); ?>" />
+					<?php } ?>
+
+						<input type="submit" class="button" value="<?php esc_attr_e( 'Change' ); ?>">
+
+					</form>
+				</div>
+		<?php } ?>
+	<?php } ?>
 	<?php
 
 	if ( ! empty( $input_id ) ) {
@@ -419,6 +483,10 @@ if ( SITECOOKIEPATH !== COOKIEPATH ) {
 	setcookie( TEST_COOKIE, 'WP Cookie check', 0, SITECOOKIEPATH, COOKIE_DOMAIN, $secure );
 }
 
+if ( isset( $_GET['wp_lang'] ) ) {
+	setcookie( 'wp_lang', sanitize_text_field( $_GET['wp_lang'] ), 0, COOKIEPATH, COOKIE_DOMAIN, $secure );
+}
+
 /**
  * Fires when the login form is initialized.
  *
@@ -913,7 +981,7 @@ switch ( $action ) {
 			?>
 			<input type="hidden" name="rp_key" value="<?php echo esc_attr( $rp_key ); ?>" />
 			<p class="submit reset-pass-submit">
-				<button type="button" class="button wp-generate-pw hide-if-no-js" aria-expanded="true"><?php _e( 'Generate Password' ); ?></button>
+				<button type="button" class="button wp-generate-pw hide-if-no-js skip-aria-expanded"><?php _e( 'Generate Password' ); ?></button>
 				<input type="submit" name="wp-submit" id="wp-submit" class="button button-primary button-large" value="<?php esc_attr_e( 'Save Password' ); ?>" />
 			</p>
 		</form>
@@ -935,7 +1003,7 @@ switch ( $action ) {
 		</p>
 		<?php
 
-		login_footer( 'user_pass' );
+		login_footer( 'pass1' );
 		break;
 
 	case 'register':
@@ -983,10 +1051,13 @@ switch ( $action ) {
 		 * Filters the registration redirect URL.
 		 *
 		 * @since 3.0.0
+		 * @since 5.9.0 Added the `$errors` parameter.
 		 *
-		 * @param string $registration_redirect The redirect destination URL.
+		 * @param string       $registration_redirect The redirect destination URL.
+		 * @param int|WP_Error $errors                User id if registration was successful,
+		 *                                            WP_Error object otherwise.
 		 */
-		$redirect_to = apply_filters( 'registration_redirect', $registration_redirect );
+		$redirect_to = apply_filters( 'registration_redirect', $registration_redirect, $errors );
 
 		login_header( __( 'Registration Form' ), '<p class="message register">' . __( 'Register For This Site' ) . '</p>', $errors );
 
@@ -1308,7 +1379,11 @@ switch ( $action ) {
 		$rememberme = ! empty( $_POST['rememberme'] );
 
 		if ( $errors->has_errors() ) {
-			$aria_describedby_error = ' aria-describedby="login_error"';
+			if( isset( $_GET['loggedout'] ) ) {
+				$aria_describedby_error = ' aria-describedby="loggedout"';
+			} else {
+				$aria_describedby_error = ' aria-describedby="login_error"';
+			}
 		} else {
 			$aria_describedby_error = '';
 		}
diff --git a/src/wp-settings.php b/src/wp-settings.php
index 33fe2bfcb3..85b2f2146a 100644
--- a/src/wp-settings.php
+++ b/src/wp-settings.php
@@ -170,8 +170,10 @@ require ABSPATH . WPINC . '/query.php';
 require ABSPATH . WPINC . '/class-wp-date-query.php';
 require ABSPATH . WPINC . '/theme.php';
 require ABSPATH . WPINC . '/class-wp-theme.php';
+require ABSPATH . WPINC . '/class-wp-theme-json-schema.php';
 require ABSPATH . WPINC . '/class-wp-theme-json.php';
 require ABSPATH . WPINC . '/class-wp-theme-json-resolver.php';
+require ABSPATH . WPINC . '/global-styles-and-settings.php';
 require ABSPATH . WPINC . '/class-wp-block-template.php';
 require ABSPATH . WPINC . '/block-template-utils.php';
 require ABSPATH . WPINC . '/block-template.php';
@@ -242,8 +244,8 @@ require ABSPATH . WPINC . '/class-wp-http-requests-hooks.php';
 require ABSPATH . WPINC . '/widgets.php';
 require ABSPATH . WPINC . '/class-wp-widget.php';
 require ABSPATH . WPINC . '/class-wp-widget-factory.php';
-require ABSPATH . WPINC . '/nav-menu.php';
 require ABSPATH . WPINC . '/nav-menu-template.php';
+require ABSPATH . WPINC . '/nav-menu.php';
 require ABSPATH . WPINC . '/admin-bar.php';
 require ABSPATH . WPINC . '/class-wp-application-passwords.php';
 require ABSPATH . WPINC . '/rest-api.php';
@@ -253,12 +255,16 @@ require ABSPATH . WPINC . '/rest-api/class-wp-rest-request.php';
 require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-controller.php';
 require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-posts-controller.php';
 require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-attachments-controller.php';
+require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-global-styles-controller.php';
 require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-post-types-controller.php';
 require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-post-statuses-controller.php';
 require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-revisions-controller.php';
 require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-autosaves-controller.php';
 require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-taxonomies-controller.php';
 require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-terms-controller.php';
+require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-menu-items-controller.php';
+require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-menus-controller.php';
+require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-menu-locations-controller.php';
 require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-users-controller.php';
 require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-comments-controller.php';
 require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-search-controller.php';
@@ -269,6 +275,7 @@ require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-settings-controller
 require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-themes-controller.php';
 require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-plugins-controller.php';
 require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-block-directory-controller.php';
+require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-edit-site-export-controller.php';
 require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-pattern-directory-controller.php';
 require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-application-passwords-controller.php';
 require ABSPATH . WPINC . '/rest-api/endpoints/class-wp-rest-site-health-controller.php';
@@ -314,6 +321,7 @@ require ABSPATH . WPINC . '/block-supports/align.php';
 require ABSPATH . WPINC . '/block-supports/border.php';
 require ABSPATH . WPINC . '/block-supports/colors.php';
 require ABSPATH . WPINC . '/block-supports/custom-classname.php';
+require ABSPATH . WPINC . '/block-supports/dimensions.php';
 require ABSPATH . WPINC . '/block-supports/duotone.php';
 require ABSPATH . WPINC . '/block-supports/elements.php';
 require ABSPATH . WPINC . '/block-supports/generated-classname.php';
diff --git a/tests/e2e/config/bootstrap.js b/tests/e2e/config/bootstrap.js
index 18fb153465..a9642034f5 100644
--- a/tests/e2e/config/bootstrap.js
+++ b/tests/e2e/config/bootstrap.js
@@ -129,6 +129,9 @@ beforeAll( async () => {
 	capturePageEventsForTearDown();
 	enablePageDialogAccept();
 	observeConsoleLogging();
+	await page.emulateMediaFeatures( [
+		{ name: 'prefers-reduced-motion', value: 'reduce' },
+	] );
 	await setBrowserViewport( 'large' );
 } );
 
diff --git a/tests/e2e/specs/dashboard.test.js b/tests/e2e/specs/dashboard.test.js
index 549fca0e73..21da4dba0b 100644
--- a/tests/e2e/specs/dashboard.test.js
+++ b/tests/e2e/specs/dashboard.test.js
@@ -57,20 +57,20 @@ describe( 'Quick Draft', () => {
 		await saveDraftButton.click();
 
 		// Check that new draft appears in Your Recent Drafts section
-		const newDraft = await page.waitForSelector( '.drafts .draft-title' );
+		const newDraft = await page.waitForSelector( '.drafts .draft-title a' );
 
 		expect(
 			await newDraft.evaluate( ( element ) => element.innerText )
-		).toContain( 'Untitled' );
+		).toContain( '(no title)' );
 
 		// Check that new draft appears in Posts page
 		await visitAdminPage( '/edit.php' );
 		const postsListDraft = await page.waitForSelector(
-			'.type-post.status-draft .title'
+			'.type-post.status-draft .title a'
 		);
 
 		expect(
 			await postsListDraft.evaluate( ( element ) => element.innerText )
-		).toContain( 'Untitled' );
+		).toContain( '(no title)' );
 	} );
 } );
diff --git a/tests/e2e/specs/edit-posts.test.js b/tests/e2e/specs/edit-posts.test.js
index 613828aab7..51d8824bb5 100644
--- a/tests/e2e/specs/edit-posts.test.js
+++ b/tests/e2e/specs/edit-posts.test.js
@@ -62,7 +62,7 @@ describe( 'Edit Posts', () => {
 
 		// Expect to now be in the editor with the correct post title shown.
 		const editorPostTitleInput = await page.$x(
-			`//textarea[contains(@class, "editor-post-title__input")][contains(text(), "${ title }")]`
+			`//h1[contains(@class, "editor-post-title__input")][contains(text(), "${ title }")]`
 		);
 		expect( editorPostTitleInput.length ).toBe( 1 );
 	} );
diff --git a/tests/phpunit/data/images/sugarloaf-mountain.jpg b/tests/phpunit/data/images/sugarloaf-mountain.jpg
new file mode 100644
index 0000000000..fee025b86b
Binary files /dev/null and b/tests/phpunit/data/images/sugarloaf-mountain.jpg differ
diff --git a/tests/phpunit/data/languages/themes/block-theme-pl_PL.mo b/tests/phpunit/data/languages/themes/block-theme-pl_PL.mo
index 0ff620e64a..ff89f87f12 100644
Binary files a/tests/phpunit/data/languages/themes/block-theme-pl_PL.mo and b/tests/phpunit/data/languages/themes/block-theme-pl_PL.mo differ
diff --git a/tests/phpunit/data/languages/themes/block-theme-pl_PL.po b/tests/phpunit/data/languages/themes/block-theme-pl_PL.po
index d55e02b8b5..0aa4bbd52d 100644
--- a/tests/phpunit/data/languages/themes/block-theme-pl_PL.po
+++ b/tests/phpunit/data/languages/themes/block-theme-pl_PL.po
@@ -22,6 +22,10 @@ msgctxt "Custom template name"
 msgid "Homepage template"
 msgstr "Szablon strony głównej"
 
+msgctxt "Template part name"
+msgid "Small Header"
+msgstr "Mały nagłówek"
+
 msgctxt "Color name"
 msgid "Light"
 msgstr "Jasny"
diff --git a/tests/phpunit/data/templates/template.html b/tests/phpunit/data/templates/template.html
new file mode 100644
index 0000000000..f792c12b5c
--- /dev/null
+++ b/tests/phpunit/data/templates/template.html
@@ -0,0 +1,3 @@
+<!-- wp:paragraph -->
+<p>Just a paragraph</p>
+<!-- /wp:paragraph -->
\ No newline at end of file
diff --git a/tests/phpunit/data/themedir1/block-theme-child/page-home.php b/tests/phpunit/data/themedir1/block-theme-child/page-home.php
new file mode 100644
index 0000000000..86efe80db6
--- /dev/null
+++ b/tests/phpunit/data/themedir1/block-theme-child/page-home.php
@@ -0,0 +1,3 @@
+<?php
+
+echo 'PHP template for page with slug "home"';
diff --git a/tests/phpunit/data/themedir1/block-theme-child/style.css b/tests/phpunit/data/themedir1/block-theme-child/style.css
new file mode 100644
index 0000000000..18c25ab78e
--- /dev/null
+++ b/tests/phpunit/data/themedir1/block-theme-child/style.css
@@ -0,0 +1,8 @@
+/*
+Theme Name: Block Theme Child Theme
+Theme URI: https://wordpress.org/
+Description: For testing purposes only.
+Template: block-theme
+Version: 1.0.0
+Text Domain: block-theme-child
+*/
diff --git a/tests/phpunit/data/themedir1/block-theme-child/templates/page-1.html b/tests/phpunit/data/themedir1/block-theme-child/templates/page-1.html
new file mode 100644
index 0000000000..c3e788b393
--- /dev/null
+++ b/tests/phpunit/data/themedir1/block-theme-child/templates/page-1.html
@@ -0,0 +1,3 @@
+<!-- wp:paragraph -->
+<p>Page (ID 1) Template</p>
+<!-- /wp:paragraph -->
\ No newline at end of file
diff --git a/tests/phpunit/data/themedir1/block-theme-child/theme.json b/tests/phpunit/data/themedir1/block-theme-child/theme.json
new file mode 100644
index 0000000000..90fe35e758
--- /dev/null
+++ b/tests/phpunit/data/themedir1/block-theme-child/theme.json
@@ -0,0 +1,51 @@
+{
+	"version": 1,
+	"settings": {
+		"color": {
+			"palette": [
+				{
+					"slug": "light",
+					"name": "Light",
+					"color": "#f3f4f6"
+				},
+				{
+					"slug": "primary",
+					"name": "Primary",
+					"color": "#3858e9"
+				},
+				{
+					"slug": "dark",
+					"name": "Dark",
+					"color": "#111827"
+				}
+			],
+			"link": true
+		},
+		"blocks": {
+			"core/post-title": {
+				"color": {
+					"palette": [
+						{
+							"slug": "light",
+							"name": "Light",
+							"color": "#f3f4f6"
+						}
+					]
+				}
+			}
+		}
+	},
+	"customTemplates": [
+		{
+			"name": "page-home",
+			"title": "Homepage"
+		}
+	],
+	"templateParts": [
+		{
+			"name": "small-header",
+			"title": "Small Header",
+			"area": "header"
+		}
+	]
+}
diff --git a/tests/phpunit/data/themedir1/block-theme/page-1.php b/tests/phpunit/data/themedir1/block-theme/page-1.php
new file mode 100644
index 0000000000..eafbb1b6e8
--- /dev/null
+++ b/tests/phpunit/data/themedir1/block-theme/page-1.php
@@ -0,0 +1,3 @@
+<?php
+
+echo 'PHP template for page with ID 1';
diff --git a/tests/phpunit/data/themedir1/block-theme/parts/small-header.html b/tests/phpunit/data/themedir1/block-theme/parts/small-header.html
new file mode 100644
index 0000000000..5c18e98125
--- /dev/null
+++ b/tests/phpunit/data/themedir1/block-theme/parts/small-header.html
@@ -0,0 +1,3 @@
+<!-- wp:paragraph -->
+<p>Small Header Template Part</p>
+<!-- /wp:paragraph -->
\ No newline at end of file
diff --git a/tests/phpunit/data/themedir1/block-theme/templates/index.html b/tests/phpunit/data/themedir1/block-theme/templates/index.html
new file mode 100644
index 0000000000..e76bcaaf3a
--- /dev/null
+++ b/tests/phpunit/data/themedir1/block-theme/templates/index.html
@@ -0,0 +1,3 @@
+<!-- wp:paragraph -->
+<p>Index Template</p>
+<!-- /wp:paragraph -->
\ No newline at end of file
diff --git a/tests/phpunit/data/themedir1/block-theme/templates/page-home.html b/tests/phpunit/data/themedir1/block-theme/templates/page-home.html
new file mode 100644
index 0000000000..6be0c70fb2
--- /dev/null
+++ b/tests/phpunit/data/themedir1/block-theme/templates/page-home.html
@@ -0,0 +1,3 @@
+<!-- wp:paragraph -->
+<p>Page (Home) Template</p>
+<!-- /wp:paragraph -->
\ No newline at end of file
diff --git a/tests/phpunit/data/themedir1/block-theme/templates/page.html b/tests/phpunit/data/themedir1/block-theme/templates/page.html
new file mode 100644
index 0000000000..61c493e1bd
--- /dev/null
+++ b/tests/phpunit/data/themedir1/block-theme/templates/page.html
@@ -0,0 +1,3 @@
+<!-- wp:paragraph -->
+<p>Page Template</p>
+<!-- /wp:paragraph -->
\ No newline at end of file
diff --git a/tests/phpunit/data/themedir1/block-theme/theme.json b/tests/phpunit/data/themedir1/block-theme/theme.json
index b6452a9369..38fcb1d9dd 100644
--- a/tests/phpunit/data/themedir1/block-theme/theme.json
+++ b/tests/phpunit/data/themedir1/block-theme/theme.json
@@ -64,6 +64,7 @@
 	"templateParts": [
 		{
 			"name": "small-header",
+			"title": "Small Header",
 			"area": "header"
 		}
 	]
diff --git a/tests/phpunit/data/themedir1/block_theme-[0.4.0]/index.php b/tests/phpunit/data/themedir1/block_theme-[0.4.0]/index.php
new file mode 100644
index 0000000000..589adcefcd
--- /dev/null
+++ b/tests/phpunit/data/themedir1/block_theme-[0.4.0]/index.php
@@ -0,0 +1,4 @@
+<?php
+/**
+ * Block theme.
+ */
diff --git a/tests/phpunit/data/themedir1/block_theme-[0.4.0]/page-1.php b/tests/phpunit/data/themedir1/block_theme-[0.4.0]/page-1.php
new file mode 100644
index 0000000000..eafbb1b6e8
--- /dev/null
+++ b/tests/phpunit/data/themedir1/block_theme-[0.4.0]/page-1.php
@@ -0,0 +1,3 @@
+<?php
+
+echo 'PHP template for page with ID 1';
diff --git a/tests/phpunit/data/themedir1/block_theme-[0.4.0]/parts/large-header.html b/tests/phpunit/data/themedir1/block_theme-[0.4.0]/parts/large-header.html
new file mode 100644
index 0000000000..a006f0f494
--- /dev/null
+++ b/tests/phpunit/data/themedir1/block_theme-[0.4.0]/parts/large-header.html
@@ -0,0 +1,3 @@
+<!-- wp:paragraph -->
+<p>Large Héader Témplaté Part</p>
+<!-- /wp:paragraph -->
diff --git a/tests/phpunit/data/themedir1/block_theme-[0.4.0]/style.css b/tests/phpunit/data/themedir1/block_theme-[0.4.0]/style.css
new file mode 100644
index 0000000000..fe3ff14ba9
--- /dev/null
+++ b/tests/phpunit/data/themedir1/block_theme-[0.4.0]/style.css
@@ -0,0 +1,7 @@
+/*
+Theme Name: Block Theme [0.4.0]
+Theme URI: https://wordpress.org/
+Description: Has different characters in theme directory name for testing purposes.
+Version: 0.4.0
+Text Domain: block-theme
+*/
diff --git a/tests/phpunit/data/themedir1/block_theme-[0.4.0]/templates/page-large-header.html b/tests/phpunit/data/themedir1/block_theme-[0.4.0]/templates/page-large-header.html
new file mode 100644
index 0000000000..c5218f8739
--- /dev/null
+++ b/tests/phpunit/data/themedir1/block_theme-[0.4.0]/templates/page-large-header.html
@@ -0,0 +1,9 @@
+<!-- wp:template-part {"slug":"header-large-dark","tagName":"header"} /-->
+
+<!-- wp:group {"tagName":"main"} -->
+<main class="wp-block-group">
+<!-- wp:post-content {"layout":{"inherit":true}} /-->
+</main>
+<!-- /wp:group -->
+
+<!-- wp:template-part {"slug":"footer","tagName":"footer"} /-->
diff --git a/tests/phpunit/data/themedir1/block_theme-[0.4.0]/theme.json b/tests/phpunit/data/themedir1/block_theme-[0.4.0]/theme.json
new file mode 100644
index 0000000000..38fcb1d9dd
--- /dev/null
+++ b/tests/phpunit/data/themedir1/block_theme-[0.4.0]/theme.json
@@ -0,0 +1,71 @@
+{
+	"version": 1,
+	"settings": {
+		"color": {
+			"palette": [
+				{
+					"slug": "light",
+					"name": "Light",
+					"color": "#f5f7f9"
+				},
+				{
+					"slug": "dark",
+					"name": "Dark",
+					"color": "#000"
+				}
+			],
+			"gradients": [
+				{
+					"name": "Custom gradient",
+					"gradient": "linear-gradient(135deg,rgba(0,0,0) 0%,rgb(0,0,0) 100%)",
+					"slug": "custom-gradient"
+				}
+			],
+			"custom": false,
+			"customGradient": false
+		},
+		"typography": {
+			"fontSizes": [
+				{
+					"name": "Custom",
+					"slug": "custom",
+					"size": "100px"
+				}
+			],
+			"customFontSize": false,
+			"customLineHeight": true
+		},
+		"spacing": {
+			"units": [
+				"rem"
+			],
+			"customPadding": true
+		},
+		"blocks": {
+			"core/paragraph": {
+				"color": {
+					"palette": [
+						{
+							"slug": "light",
+							"name": "Light",
+							"color": "#f5f7f9"
+						}
+					]
+				}
+			}
+		}
+	},
+	"customTemplates": [
+		{
+			"name": "page-home",
+			"title": "Homepage template"
+		}
+	],
+	"templateParts": [
+		{
+			"name": "small-header",
+			"title": "Small Header",
+			"area": "header"
+		}
+	]
+}
diff --git a/tests/phpunit/data/themedir1/subdir/block_theme-[1.0.0]/index.php b/tests/phpunit/data/themedir1/subdir/block_theme-[1.0.0]/index.php
new file mode 100644
index 0000000000..589adcefcd
--- /dev/null
+++ b/tests/phpunit/data/themedir1/subdir/block_theme-[1.0.0]/index.php
@@ -0,0 +1,4 @@
+<?php
+/**
+ * Block theme.
+ */
diff --git a/tests/phpunit/data/themedir1/subdir/block_theme-[1.0.0]/style.css b/tests/phpunit/data/themedir1/subdir/block_theme-[1.0.0]/style.css
new file mode 100644
index 0000000000..1e9c38f409
--- /dev/null
+++ b/tests/phpunit/data/themedir1/subdir/block_theme-[1.0.0]/style.css
@@ -0,0 +1,7 @@
+/*
+Theme Name: Block Theme [1.0.0] in subdirectory
+Theme URI: https://wordpress.org/
+Description: Has different characters in theme directory name for testing purposes.
+Version: 0.4.0
+Text Domain: block-theme
+*/
diff --git a/tests/phpunit/data/themedir1/subdir/block_theme-[1.0.0]/theme.json b/tests/phpunit/data/themedir1/subdir/block_theme-[1.0.0]/theme.json
new file mode 100644
index 0000000000..38fcb1d9dd
--- /dev/null
+++ b/tests/phpunit/data/themedir1/subdir/block_theme-[1.0.0]/theme.json
@@ -0,0 +1,71 @@
+{
+	"version": 1,
+	"settings": {
+		"color": {
+			"palette": [
+				{
+					"slug": "light",
+					"name": "Light",
+					"color": "#f5f7f9"
+				},
+				{
+					"slug": "dark",
+					"name": "Dark",
+					"color": "#000"
+				}
+			],
+			"gradients": [
+				{
+					"name": "Custom gradient",
+					"gradient": "linear-gradient(135deg,rgba(0,0,0) 0%,rgb(0,0,0) 100%)",
+					"slug": "custom-gradient"
+				}
+			],
+			"custom": false,
+			"customGradient": false
+		},
+		"typography": {
+			"fontSizes": [
+				{
+					"name": "Custom",
+					"slug": "custom",
+					"size": "100px"
+				}
+			],
+			"customFontSize": false,
+			"customLineHeight": true
+		},
+		"spacing": {
+			"units": [
+				"rem"
+			],
+			"customPadding": true
+		},
+		"blocks": {
+			"core/paragraph": {
+				"color": {
+					"palette": [
+						{
+							"slug": "light",
+							"name": "Light",
+							"color": "#f5f7f9"
+						}
+					]
+				}
+			}
+		}
+	},
+	"customTemplates": [
+		{
+			"name": "page-home",
+			"title": "Homepage template"
+		}
+	],
+	"templateParts": [
+		{
+			"name": "small-header",
+			"title": "Small Header",
+			"area": "header"
+		}
+	]
+}
diff --git a/tests/phpunit/data/widgets/custom-widget-classes.php b/tests/phpunit/data/widgets/custom-widget-classes.php
index 8d079f3693..f8d4d88573 100644
--- a/tests/phpunit/data/widgets/custom-widget-classes.php
+++ b/tests/phpunit/data/widgets/custom-widget-classes.php
@@ -1,14 +1,12 @@
 <?php
 namespace Test\Sub\Sub {
 
-	class Namespaced_Widget extends \WP_Widget {
-	}
+	class Namespaced_Widget extends \WP_Widget {}
 
 }
 
 namespace {
 
-	class Non_Namespaced_Widget extends \WP_Widget {
-	}
+	class Non_Namespaced_Widget extends \WP_Widget {}
 
 }
diff --git a/tests/phpunit/includes/class-wp-sitemaps-empty-test-provider.php b/tests/phpunit/includes/class-wp-sitemaps-empty-test-provider.php
index c772c3941c..750c4c8d67 100644
--- a/tests/phpunit/includes/class-wp-sitemaps-empty-test-provider.php
+++ b/tests/phpunit/includes/class-wp-sitemaps-empty-test-provider.php
@@ -20,7 +20,7 @@ class WP_Sitemaps_Empty_Test_Provider extends WP_Sitemaps_Provider {
 	 *
 	 * @param int    $page_num       Page of results.
 	 * @param string $object_subtype Optional. Object subtype name. Default empty.
-	 * @return array List of URLs for a sitemap.
+	 * @return array[] Array of URL information for a sitemap.
 	 */
 	public function get_url_list( $page_num, $object_subtype = '' ) {
 		return array();
diff --git a/tests/phpunit/includes/class-wp-sitemaps-large-test-provider.php b/tests/phpunit/includes/class-wp-sitemaps-large-test-provider.php
index 67563c654d..76acb6c7d8 100644
--- a/tests/phpunit/includes/class-wp-sitemaps-large-test-provider.php
+++ b/tests/phpunit/includes/class-wp-sitemaps-large-test-provider.php
@@ -30,7 +30,7 @@ class WP_Sitemaps_Large_Test_Provider extends WP_Sitemaps_Provider {
 	 *
 	 * @param int    $page_num       Page of results.
 	 * @param string $object_subtype Optional. Object subtype name. Default empty.
-	 * @return array List of URLs for a sitemap.
+	 * @return array[] Array of URL information for a sitemap.
 	 */
 	public function get_url_list( $page_num, $object_subtype = '' ) {
 		return array_fill( 0, $this->num_entries, array( 'loc' => home_url( '/' ) ) );
diff --git a/tests/phpunit/includes/class-wp-sitemaps-test-provider.php b/tests/phpunit/includes/class-wp-sitemaps-test-provider.php
index 389bb6c7bf..cf980923f1 100644
--- a/tests/phpunit/includes/class-wp-sitemaps-test-provider.php
+++ b/tests/phpunit/includes/class-wp-sitemaps-test-provider.php
@@ -34,7 +34,7 @@ class WP_Sitemaps_Test_Provider extends WP_Sitemaps_Provider {
 	 *
 	 * @param int    $page_num       Page of results.
 	 * @param string $object_subtype Optional. Object subtype name. Default empty.
-	 * @return array List of URLs for a sitemap.
+	 * @return array[] Array of URL information for a sitemap.
 	 */
 	public function get_url_list( $page_num, $object_subtype = '' ) {
 		return array();
diff --git a/tests/phpunit/includes/functions.php b/tests/phpunit/includes/functions.php
index a2ad83c7de..1434096067 100644
--- a/tests/phpunit/includes/functions.php
+++ b/tests/phpunit/includes/functions.php
@@ -307,20 +307,28 @@ function _unhook_block_registration() {
 	remove_action( 'init', 'register_block_core_calendar' );
 	remove_action( 'init', 'register_block_core_categories' );
 	remove_action( 'init', 'register_block_core_file' );
-	remove_action( 'init', 'register_block_core_loginout' );
+	remove_action( 'init', 'register_block_core_gallery' );
+	remove_action( 'init', 'register_block_core_image' );
 	remove_action( 'init', 'register_block_core_latest_comments' );
 	remove_action( 'init', 'register_block_core_latest_posts' );
+	remove_action( 'init', 'register_block_core_legacy_widget' );
+	remove_action( 'init', 'register_block_core_loginout' );
+	remove_action( 'init', 'register_block_core_navigation' );
+	remove_action( 'init', 'register_block_core_navigation_link' );
+	remove_action( 'init', 'register_block_core_navigation_submenu' );
 	remove_action( 'init', 'register_block_core_page_list' );
+	remove_action( 'init', 'register_block_core_pattern' );
 	remove_action( 'init', 'register_block_core_post_author' );
+	remove_action( 'init', 'register_block_core_post_comments' );
 	remove_action( 'init', 'register_block_core_post_content' );
 	remove_action( 'init', 'register_block_core_post_date' );
 	remove_action( 'init', 'register_block_core_post_excerpt' );
 	remove_action( 'init', 'register_block_core_post_featured_image' );
+	remove_action( 'init', 'register_block_core_post_navigation_link' );
+	remove_action( 'init', 'register_block_core_post_template' );
 	remove_action( 'init', 'register_block_core_post_terms' );
 	remove_action( 'init', 'register_block_core_post_title' );
 	remove_action( 'init', 'register_block_core_query' );
-	remove_action( 'init', 'register_block_core_post_template' );
-	remove_action( 'init', 'gutenberg_register_legacy_query_loop_block' );
 	remove_action( 'init', 'register_block_core_query_pagination' );
 	remove_action( 'init', 'register_block_core_query_pagination_next' );
 	remove_action( 'init', 'register_block_core_query_pagination_numbers' );
@@ -329,13 +337,14 @@ function _unhook_block_registration() {
 	remove_action( 'init', 'register_block_core_rss' );
 	remove_action( 'init', 'register_block_core_search' );
 	remove_action( 'init', 'register_block_core_shortcode' );
-	remove_action( 'init', 'register_block_core_site_tagline' );
 	remove_action( 'init', 'register_block_core_site_logo' );
+	remove_action( 'init', 'register_block_core_site_tagline' );
 	remove_action( 'init', 'register_block_core_site_title' );
 	remove_action( 'init', 'register_block_core_social_link' );
 	remove_action( 'init', 'register_block_core_social_link' );
 	remove_action( 'init', 'register_block_core_tag_cloud' );
+	remove_action( 'init', 'register_block_core_template_part' );
+	remove_action( 'init', 'register_block_core_term_description' );
 	remove_action( 'init', 'register_core_block_types_from_metadata' );
-	remove_action( 'init', 'register_block_core_legacy_widget' );
 }
 tests_add_filter( 'init', '_unhook_block_registration', 1000 );
diff --git a/tests/phpunit/includes/install.php b/tests/phpunit/includes/install.php
index 8ce307818d..723206d7df 100644
--- a/tests/phpunit/includes/install.php
+++ b/tests/phpunit/includes/install.php
@@ -14,6 +14,13 @@ if ( ! defined( 'WP_RUN_CORE_TESTS' ) && in_array( 'run_core_tests', $argv, true
 }
 
 define( 'WP_INSTALLING', true );
+
+/*
+ * Cron tries to make an HTTP request to the site, which always fails,
+ * because tests are run in CLI mode only.
+ */
+define( 'DISABLE_WP_CRON', true );
+
 require_once $config_file_path;
 require_once __DIR__ . '/functions.php';
 
diff --git a/tests/phpunit/includes/mock-invokable.php b/tests/phpunit/includes/mock-invokable.php
new file mode 100644
index 0000000000..c809046bd3
--- /dev/null
+++ b/tests/phpunit/includes/mock-invokable.php
@@ -0,0 +1,17 @@
+<?php
+/**
+ * File for Mock_Invokable class.
+ *
+ * @package WordPress
+ * @subpackage UnitTests
+ */
+
+/**
+ * Class Mock_Invokable.
+ *
+ * This class is used to mock a class that has an `__invoke` method.
+ */
+class Mock_Invokable {
+
+	public function __invoke() {}
+}
diff --git a/tests/phpunit/includes/spy-rest-server.php b/tests/phpunit/includes/spy-rest-server.php
index 5bfd1d2dba..0702ebbb23 100644
--- a/tests/phpunit/includes/spy-rest-server.php
+++ b/tests/phpunit/includes/spy-rest-server.php
@@ -38,14 +38,6 @@ class Spy_REST_Server extends WP_REST_Server {
 		$this->sent_headers[ $header ] = $value;
 	}
 
-	/**
-	 * Stores last set status.
-	 * @param int $code HTTP status.
-	 */
-	public function set_status( $status ) {
-		$this->status = $status;
-	}
-
 	/**
 	 * Removes a header from the list of sent headers.
 	 *
@@ -55,6 +47,15 @@ class Spy_REST_Server extends WP_REST_Server {
 		unset( $this->sent_headers[ $header ] );
 	}
 
+	/**
+	 * Stores last set status.
+	 *
+	 * @param int $code HTTP status.
+	 */
+	public function set_status( $status ) {
+		$this->status = $status;
+	}
+
 	/**
 	 * Overrides the dispatch method so we can get a handle on the request object.
 	 *
diff --git a/tests/phpunit/includes/testcase-rest-controller.php b/tests/phpunit/includes/testcase-rest-controller.php
index a0b96545bf..67a7970b66 100644
--- a/tests/phpunit/includes/testcase-rest-controller.php
+++ b/tests/phpunit/includes/testcase-rest-controller.php
@@ -45,7 +45,14 @@ abstract class WP_Test_REST_Controller_Testcase extends WP_Test_REST_TestCase {
 		}
 
 		// Make sure path for rest_url has a leading slash for proper resolution.
-		$this->assertTrue( 0 === strpos( $path, '/' ), 'REST API URL should have a leading slash.' );
+		if ( 0 !== strpos( $path, '/' ) ) {
+			$this->fail(
+				sprintf(
+					'REST API URL "%s" should have a leading slash.',
+					$path
+				)
+			);
+		}
 
 		return $url;
 	}
diff --git a/tests/phpunit/tests/actions.php b/tests/phpunit/tests/actions.php
index 51225f12dd..1db3fd463f 100644
--- a/tests/phpunit/tests/actions.php
+++ b/tests/phpunit/tests/actions.php
@@ -240,8 +240,8 @@ class Tests_Actions extends WP_UnitTestCase {
 		$this->assertSame( 1, did_action( $tag1 ) );
 		$this->assertSame( 0, did_action( $tag2 ) );
 
-		// Do action $tag2 a random number of times.
-		$count = rand( 0, 10 );
+		// Do action $tag2 10 times.
+		$count = 10;
 		for ( $i = 0; $i < $count; $i++ ) {
 			do_action( $tag2 );
 		}
diff --git a/tests/phpunit/tests/admin/includesFile.php b/tests/phpunit/tests/admin/includesFile.php
index 9ac46ad333..421137bc14 100644
--- a/tests/phpunit/tests/admin/includesFile.php
+++ b/tests/phpunit/tests/admin/includesFile.php
@@ -88,7 +88,7 @@ class Tests_Admin_IncludesFile extends WP_UnitTestCase {
 	 *
 	 * @covers ::download_url
 	 *
-	 * @param $filter  A callback containing a fake Content-Disposition header.
+	 * @param $filter A callback containing a fake Content-Disposition header.
 	 */
 	public function test_download_url_should_respect_filename_from_content_disposition_header( $filter ) {
 		add_filter( 'pre_http_request', array( $this, $filter ), 10, 3 );
@@ -174,7 +174,7 @@ class Tests_Admin_IncludesFile extends WP_UnitTestCase {
 	 *
 	 * @covers ::download_url
 	 *
-	 * @param $filter  A callback containing a fake Content-Disposition header.
+	 * @param $filter A callback containing a fake Content-Disposition header.
 	 */
 	public function test_download_url_should_reject_filename_from_invalid_content_disposition_header( $filter ) {
 		add_filter( 'pre_http_request', array( $this, $filter ), 10, 3 );
@@ -291,6 +291,9 @@ class Tests_Admin_IncludesFile extends WP_UnitTestCase {
 	 * @covers ::download_url
 	 */
 	public function test_download_url_no_warning_for_url_without_path() {
+		// Hook a mocked HTTP request response.
+		add_filter( 'pre_http_request', array( $this, 'mock_http_request' ), 10, 3 );
+
 		$result = download_url( 'https://example.com' );
 
 		$this->assertIsString( $result );
@@ -306,6 +309,9 @@ class Tests_Admin_IncludesFile extends WP_UnitTestCase {
 	 * @covers ::download_url
 	 */
 	public function test_download_url_no_warning_for_url_without_path_with_signature_verification() {
+		// Hook a mocked HTTP request response.
+		add_filter( 'pre_http_request', array( $this, 'mock_http_request' ), 10, 3 );
+
 		add_filter(
 			'wp_signature_hosts',
 			static function( $urls ) {
@@ -326,4 +332,24 @@ class Tests_Admin_IncludesFile extends WP_UnitTestCase {
 		$this->assertWPError( $error );
 		$this->assertSame( 'signature_verification_no_signature', $error->get_error_code() );
 	}
+
+	/**
+	 * Mock the HTTP request response.
+	 *
+	 * @param bool   $false     False.
+	 * @param array  $arguments Request arguments.
+	 * @param string $url       Request URL.
+	 * @return array|bool
+	 */
+	public function mock_http_request( $false, $arguments, $url ) {
+		if ( 'https://example.com' === $url ) {
+			return array(
+				'response' => array(
+					'code' => 200,
+				),
+			);
+		}
+
+		return $false;
+	}
 }
diff --git a/tests/phpunit/tests/admin/includesPlugin.php b/tests/phpunit/tests/admin/includesPlugin.php
index 9a3b4e5cd9..18e08ec03c 100644
--- a/tests/phpunit/tests/admin/includesPlugin.php
+++ b/tests/phpunit/tests/admin/includesPlugin.php
@@ -296,11 +296,11 @@ class Tests_Admin_IncludesPlugin extends WP_UnitTestCase {
 	}
 
 	/**
-	 * Passing a string as position will fail.
+	 * Passing a string as position will fail in submenu.
 	 *
 	 * @ticket 48599
 	 */
-	public function test_passing_string_as_position_fires_doing_it_wrong() {
+	public function test_passing_string_as_position_fires_doing_it_wrong_submenu() {
 		$this->setExpectedIncorrectUsage( 'add_submenu_page' );
 		global $submenu, $menu;
 
@@ -324,6 +324,37 @@ class Tests_Admin_IncludesPlugin extends WP_UnitTestCase {
 		$this->assertSame( 'submenu_page_1', $submenu['main_slug'][1][2] );
 	}
 
+	/**
+	 * Passing a string as position will fail in menu.
+	 *
+	 * @ticket 54798
+	 */
+	public function test_passing_string_as_position_fires_doing_it_wrong_menu() {
+		$this->setExpectedIncorrectUsage( 'add_menu_page' );
+		global $submenu, $menu;
+
+		// Reset menus.
+		$submenu      = array();
+		$menu         = array();
+		$current_user = get_current_user_id();
+		$admin_user   = self::factory()->user->create( array( 'role' => 'administrator' ) );
+		wp_set_current_user( $admin_user );
+		set_current_screen( 'dashboard' );
+
+		// Setup a menu with some items.
+		add_menu_page( 'Main Menu', 'Main Menu', 'manage_options', 'main_slug', 'main_page_callback', 'icon_url', '1' );
+		add_menu_page( 'Main Menu 1', 'Main Menu 1', 'manage_options', 'main1_slug', 'main1_page_callback', 'icon_url1', 1.5 );
+
+		// Clean up the temporary user.
+		wp_set_current_user( $current_user );
+		wp_delete_user( $admin_user );
+
+		// Verify the menu was inserted.
+		$this->assertSame( 'main_slug', $menu[1][2] );
+		// Verify the menu was inserted correctly on passing float as position.
+		$this->assertSame( 'main1_slug', $menu['1.5'][2] );
+	}
+
 	public function test_is_plugin_active_true() {
 		activate_plugin( 'hello.php' );
 		$test = is_plugin_active( 'hello.php' );
@@ -487,11 +518,12 @@ class Tests_Admin_IncludesPlugin extends WP_UnitTestCase {
 		$p2 = $this->_create_plugin( "<?php\n//Test", 'not-a-dropin.php', WP_CONTENT_DIR );
 
 		$dropins = get_dropins();
-		$this->assertSame( array( 'advanced-cache.php' ), array_keys( $dropins ) );
 
 		unlink( $p1[1] );
 		unlink( $p2[1] );
 
+		$this->assertSame( array( 'advanced-cache.php' ), array_keys( $dropins ) );
+
 		// Clean up.
 		$this->_restore_drop_ins();
 	}
@@ -509,9 +541,11 @@ class Tests_Admin_IncludesPlugin extends WP_UnitTestCase {
 	public function test_is_network_only_plugin() {
 		$p = $this->_create_plugin( "<?php\n/*\nPlugin Name: test\nNetwork: true" );
 
-		$this->assertTrue( is_network_only_plugin( $p[0] ) );
+		$network_only = is_network_only_plugin( $p[0] );
 
 		unlink( $p[1] );
+
+		$this->assertTrue( $network_only );
 	}
 
 	/**
@@ -571,12 +605,14 @@ class Tests_Admin_IncludesPlugin extends WP_UnitTestCase {
 		$uninstallable_plugins[ $plugin[0] ] = true;
 		update_option( 'uninstall_plugins', $uninstallable_plugins );
 
-		$this->assertTrue( is_uninstallable_plugin( $plugin[0] ) );
+		$is_uninstallable = is_uninstallable_plugin( $plugin[0] );
 
 		unset( $uninstallable_plugins[ $plugin[0] ] );
 		update_option( 'uninstall_plugins', $uninstallable_plugins );
 
 		unlink( $plugin[1] );
+
+		$this->assertTrue( $is_uninstallable );
 	}
 
 	/**
@@ -595,14 +631,15 @@ class Tests_Admin_IncludesPlugin extends WP_UnitTestCase {
 	 */
 	private function _create_plugin( $data = "<?php\n/*\nPlugin Name: Test\n*/", $filename = false, $dir_path = false ) {
 		if ( false === $filename ) {
-			$filename = rand_str() . '.php';
+			$filename = __FUNCTION__ . '.php';
 		}
 
 		if ( false === $dir_path ) {
 			$dir_path = WP_PLUGIN_DIR;
 		}
 
-		$full_name = $dir_path . '/' . wp_unique_filename( $dir_path, $filename );
+		$filename  = wp_unique_filename( $dir_path, $filename );
+		$full_name = $dir_path . '/' . $filename;
 
 		$file = fopen( $full_name, 'w' );
 		fwrite( $file, $data );
diff --git a/tests/phpunit/tests/ajax/AddTag.php b/tests/phpunit/tests/ajax/AddTag.php
new file mode 100755
index 0000000000..48b5fc5f24
--- /dev/null
+++ b/tests/phpunit/tests/ajax/AddTag.php
@@ -0,0 +1,145 @@
+<?php
+
+/**
+ * Admin ajax functions to be tested.
+ */
+require_once ABSPATH . 'wp-admin/includes/ajax-actions.php';
+
+/**
+ * Class for testing ajax add tag functionality.
+ *
+ * @group ajax
+ */
+class Tests_Ajax_AddTag extends WP_Ajax_UnitTestCase {
+
+	/**
+	 * @dataProvider data_add_tag
+	 *
+	 * @ticket 42937
+	 *
+	 * @param array                 $post_data Data to populate $_POST.
+	 * @param string                $expected  Expected response.
+	 * @param array|string|callable $callback  Optional. Callback to register to 'term_updated_messages'
+	 *                                         filter. Default empty string (no callback).
+	 */
+	public function test_add_tag( array $post_data, $expected, $callback = '' ) {
+		$this->_setRole( 'administrator' );
+
+		$_POST                     = $post_data;
+		$_POST['_wpnonce_add-tag'] = wp_create_nonce( 'add-tag' );
+
+		if ( ! empty( $callback ) ) {
+			add_filter( 'term_updated_messages', $callback );
+		}
+
+		try {
+			$this->_handleAjax( 'add-tag' );
+		} catch ( WPAjaxDieContinueException $e ) {
+			unset( $e );
+		}
+
+		$this->assertSame( $expected, (string) $this->get_xml_response_taxonomy()->response_data );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_add_tag() {
+		return array(
+			'add a category'                        => array(
+				'post_data' => array(
+					'taxonomy'  => 'category',
+					'post_type' => 'post',
+					'screen'    => 'edit-category',
+					'action'    => 'add-tag',
+					'tag-name'  => 'blues',
+				),
+				'expected'  => 'Category added.',
+			),
+			'add a category with message filtering' => array(
+				'post_data' => array(
+					'taxonomy'  => 'category',
+					'post_type' => 'post',
+					'screen'    => 'edit-category',
+					'action'    => 'add-tag',
+					'tag-name'  => 'techno',
+				),
+				'expected'  => 'A new category added.',
+				'callback'  => static function( array $messages ) {
+					$messages['category'][1] = 'A new category added.';
+					return $messages;
+				},
+			),
+			'add a post_tag'                        => array(
+				'post_data' => array(
+					'taxonomy'  => 'post_tag',
+					'post_type' => 'post',
+					'screen'    => 'edit-post_tag',
+					'action'    => 'add-tag',
+					'tag-name'  => 'Louis Armstrong',
+				),
+				'expected'  => 'Tag added.',
+			),
+		);
+	}
+
+	/**
+	 * @ticket 42937
+	 */
+	public function test_adding_category_without_capability_should_error() {
+		$this->_setRole( 'subscriber' );
+
+		$_POST['taxonomy']         = 'category';
+		$_POST['post_type']        = 'post';
+		$_POST['screen']           = 'edit-category';
+		$_POST['action']           = 'add-tag';
+		$_POST['tag - name']       = 'disco';
+		$_POST['_wpnonce_add-tag'] = wp_create_nonce( 'add-tag' );
+
+		$this->expectException( 'WPAjaxDieStopException' );
+		$this->expectExceptionMessage( '-1' );
+		$this->_handleAjax( 'add-tag' );
+	}
+
+	/**
+	 * @ticket 42937
+	 */
+	public function test_adding_existing_category_should_error() {
+		$this->_setRole( 'administrator' );
+
+		wp_insert_term( 'testcat', 'category' );
+
+		$_POST = array(
+			'taxonomy'         => 'category',
+			'post_type'        => 'post',
+			'screen'           => 'edit-category',
+			'action'           => 'add-tag',
+			'tag-name'         => 'testcat',
+			'_wpnonce_add-tag' => wp_create_nonce( 'add-tag' ),
+		);
+
+		try {
+			$this->_handleAjax( 'add-tag' );
+		} catch ( WPAjaxDieContinueException $e ) {
+			unset( $e );
+		}
+
+		$expected = 'A term with the name provided already exists with this parent.';
+		$this->assertSame( $expected, (string) $this->get_xml_response_taxonomy()->wp_error );
+	}
+
+	/**
+	 * Helper method to get the taxonomy's response or error.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @return SimpleXMLElement Response or error object.
+	 */
+	private function get_xml_response_taxonomy() {
+		$xml = simplexml_load_string( $this->_last_response, 'SimpleXMLElement', LIBXML_NOCDATA );
+
+		return $xml->response->taxonomy;
+	}
+}
diff --git a/tests/phpunit/tests/ajax/CustomizeManager.php b/tests/phpunit/tests/ajax/CustomizeManager.php
index 16a029c4f4..82dcc13c67 100644
--- a/tests/phpunit/tests/ajax/CustomizeManager.php
+++ b/tests/phpunit/tests/ajax/CustomizeManager.php
@@ -714,4 +714,49 @@ class Tests_Ajax_CustomizeManager extends WP_Ajax_UnitTestCase {
 		$this->assertFalse( $this->_last_response_parsed['success'] );
 		$this->assertSame( 'no_autosave_revision_to_delete', $this->_last_response_parsed['data'] );
 	}
+
+	/**
+	 * Test request for retrieving installed themes.
+	 *
+	 * @ticket 54549
+	 * @covers WP_Customize_Manager::handle_load_themes_request
+	 */
+	public function test_wp_ajax_customize_load_themes_action() {
+		$arguments = array(
+			'changeset_uuid'     => false,
+			'settings_previewed' => true,
+			'branching'          => false,
+		);
+		new WP_Customize_Manager( $arguments );
+		wp_set_current_user( self::$admin_user_id );
+		$nonce                 = wp_create_nonce( 'switch_themes' );
+		$_POST['nonce']        = $nonce;
+		$_GET['nonce']         = $nonce;
+		$_REQUEST['nonce']     = $nonce;
+		$_POST['theme_action'] = 'installed';
+		$this->make_ajax_call( 'customize_load_themes' );
+		$response = $this->_last_response_parsed;
+		$this->assertIsArray( $response, 'Response is not an array' );
+
+		$this->assertArrayHasKey( 'success', $response, 'Response must have a "success" key' );
+		$this->assertTrue( $response['success'], 'Response was not "success"' );
+
+		$this->assertArrayHasKey( 'data', $response, 'Response must have a "data" key' );
+		$this->assertIsArray( $response['data'], 'The response "data" is not an array' );
+		$this->assertArrayHasKey( 'themes', $response['data'], 'The response data must have a "themes" key' );
+		$this->assertIsArray( $response['data']['themes'], 'Themes data is not an array' );
+		$this->assertNotEmpty( $response['data']['themes'], 'Themes data must not be empty' );
+
+		foreach ( $response['data']['themes'] as $theme ) {
+			$this->assertIsArray( $theme, 'Theme is not an array' );
+			$this->assertNotEmpty( $theme, 'Theme data must not be empty' );
+			$this->assertArrayHasKey( 'id', $theme, 'Theme data must have an "id" key' );
+			$this->assertNotEmpty( $theme['id'], 'Theme id cannot be empty' );
+
+			$this->assertArrayHasKey( 'name', $theme, 'Theme data must have a "name" key' );
+			$this->assertNotEmpty( $theme['name'], 'Theme name cannot be empty' );
+
+			$this->assertArrayHasKey( 'blockTheme', $theme, 'Themes data must include information about blocks support' );
+		}
+	}
 }
diff --git a/tests/phpunit/tests/auth.php b/tests/phpunit/tests/auth.php
index 3567a8bba5..3936f0772d 100644
--- a/tests/phpunit/tests/auth.php
+++ b/tests/phpunit/tests/auth.php
@@ -635,4 +635,44 @@ class Tests_Auth extends WP_UnitTestCase {
 
 		$this->assertNull( wp_validate_application_password( null ) );
 	}
+
+	/**
+	 * @ticket 53386
+	 * @dataProvider data_application_passwords_can_use_capability_checks_to_determine_feature_availability
+	 */
+	public function test_application_passwords_can_use_capability_checks_to_determine_feature_availability( $role, $authenticated ) {
+		$user = self::factory()->user->create_and_get( array( 'role' => $role ) );
+
+		list( $password ) = WP_Application_Passwords::create_new_application_password( $user->ID, array( 'name' => 'phpunit' ) );
+
+		add_filter( 'application_password_is_api_request', '__return_true' );
+		add_filter( 'wp_is_application_passwords_available', '__return_true' );
+		add_filter(
+			'wp_is_application_passwords_available_for_user',
+			static function ( $available, WP_User $user ) {
+				return user_can( $user, 'edit_posts' );
+			},
+			10,
+			2
+		);
+
+		$_SERVER['PHP_AUTH_USER'] = $user->user_login;
+		$_SERVER['PHP_AUTH_PW']   = $password;
+
+		unset( $GLOBALS['current_user'] );
+		$current = get_current_user_id();
+
+		if ( $authenticated ) {
+			$this->assertSame( $user->ID, $current );
+		} else {
+			$this->assertSame( 0, $current );
+		}
+	}
+
+	public function data_application_passwords_can_use_capability_checks_to_determine_feature_availability() {
+		return array(
+			'allowed'     => array( 'editor', true ),
+			'not allowed' => array( 'subscriber', false ),
+		);
+	}
 }
diff --git a/tests/phpunit/tests/block-supports/colors.php b/tests/phpunit/tests/block-supports/colors.php
new file mode 100644
index 0000000000..f9afa76d3d
--- /dev/null
+++ b/tests/phpunit/tests/block-supports/colors.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * @group block-supports
+ */
+class Tests_Block_Supports_Colors extends WP_UnitTestCase {
+
+	function test_color_slugs_with_numbers_are_kebab_cased_properly() {
+		register_block_type(
+			'test/color-slug-with-numbers',
+			array(
+				'api_version' => 2,
+				'attributes'  => array(
+					'textColor'       => array(
+						'type' => 'string',
+					),
+					'backgroundColor' => array(
+						'type' => 'string',
+					),
+					'gradient'        => array(
+						'type' => 'string',
+					),
+				),
+				'supports'    => array(
+					'color' => array(
+						'text'       => true,
+						'background' => true,
+						'gradients'  => true,
+					),
+				),
+			)
+		);
+		$registry   = WP_Block_Type_Registry::get_instance();
+		$block_type = $registry->get_registered( 'test/color-slug-with-numbers' );
+
+		$block_atts = array(
+			'textColor'       => 'fg1',
+			'backgroundColor' => 'bg2',
+			'gradient'        => 'gr3',
+		);
+
+		$actual   = wp_apply_colors_support( $block_type, $block_atts );
+		$expected = array( 'class' => 'has-text-color has-fg-1-color has-background has-bg-2-background-color has-background has-gr-3-gradient-background' );
+
+		$this->assertSame( $expected, $actual );
+		unregister_block_type( 'test/color-slug-with-numbers' );
+	}
+}
diff --git a/tests/phpunit/tests/block-supports/elements.php b/tests/phpunit/tests/block-supports/elements.php
new file mode 100644
index 0000000000..84e7446f14
--- /dev/null
+++ b/tests/phpunit/tests/block-supports/elements.php
@@ -0,0 +1,104 @@
+<?php
+/**
+ * @group block-supports
+ */
+class Tests_Block_Supports_Elements extends WP_UnitTestCase {
+	/**
+	 * Given a string containing a class prefixed by "wp-elements-" followed by a unique id,
+	 * this function returns a string where the id is one instead of being unique.
+	 *
+	 * @param  string $string String containing unique id classes.
+	 * @return string                String where the unique id classes were replaced with "wp-elements-1".
+	 */
+	private static function make_unique_id_one( $string ) {
+		return preg_replace( '/wp-elements-.{13}/', 'wp-elements-1', $string );
+	}
+
+	/**
+	 * Test wp_render_elements_support() with a simple paragraph and link color preset.
+	 */
+	public function test_simple_paragraph_link_color() {
+		$result = self::make_unique_id_one(
+			wp_render_elements_support(
+				'<p>Hello <a href="http://www.wordpress.org/">WordPress</a>!</p>',
+				array(
+					'blockName' => 'core/paragraph',
+					'attrs'     => array(
+						'style' => array(
+							'elements' => array(
+								'link' => array(
+									'color' => array(
+										'text' => 'var:preset|color|subtle-background',
+									),
+								),
+							),
+						),
+					),
+				)
+			)
+		);
+		$this->assertSame(
+			$result,
+			'<p class="wp-elements-1">Hello <a href="http://www.wordpress.org/">WordPress</a>!</p>'
+		);
+	}
+
+	/**
+	 * Test wp_render_elements_support() with a paragraph containing a class.
+	 */
+	public function test_class_paragraph_link_color() {
+		$result = self::make_unique_id_one(
+			wp_render_elements_support(
+				'<p class="has-dark-gray-background-color has-background">Hello <a href="http://www.wordpress.org/">WordPress</a>!</p>',
+				array(
+					'blockName' => 'core/paragraph',
+					'attrs'     => array(
+						'style'           => array(
+							'elements' => array(
+								'link' => array(
+									'color' => array(
+										'text' => 'red',
+									),
+								),
+							),
+						),
+						'backgroundColor' => 'dark-gray',
+					),
+				)
+			)
+		);
+		$this->assertSame(
+			$result,
+			'<p class="wp-elements-1 has-dark-gray-background-color has-background">Hello <a href="http://www.wordpress.org/">WordPress</a>!</p>'
+		);
+	}
+
+	/**
+	 * Test wp_render_elements_support() with a paragraph containing a anchor.
+	 */
+	public function test_anchor_paragraph_link_color() {
+		$result = self::make_unique_id_one(
+			wp_render_elements_support(
+				'<p id="anchor">Hello <a href="http://www.wordpress.org/">WordPress</a>!</p>',
+				array(
+					'blockName' => 'core/paragraph',
+					'attrs'     => array(
+						'style' => array(
+							'elements' => array(
+								'link' => array(
+									'color' => array(
+										'text' => '#fff000',
+									),
+								),
+							),
+						),
+					),
+				)
+			)
+		);
+		$this->assertSame(
+			$result,
+			'<p id="anchor" class="wp-elements-1">Hello <a href="http://www.wordpress.org/">WordPress</a>!</p>'
+		);
+	}
+}
diff --git a/tests/phpunit/tests/block-supports/typography.php b/tests/phpunit/tests/block-supports/typography.php
new file mode 100644
index 0000000000..38d618f980
--- /dev/null
+++ b/tests/phpunit/tests/block-supports/typography.php
@@ -0,0 +1,123 @@
+<?php
+/**
+ * @group block-supports
+ */
+class Tests_Block_Supports_Typography extends WP_UnitTestCase {
+
+	function test_font_size_slug_with_numbers_is_kebab_cased_properly() {
+		register_block_type(
+			'test/font-size-slug-with-numbers',
+			array(
+				'api_version' => 2,
+				'attributes'  => array(
+					'fontSize' => array(
+						'type' => 'string',
+					),
+				),
+				'supports'    => array(
+					'typography' => array(
+						'fontSize' => true,
+					),
+				),
+			)
+		);
+		$registry   = WP_Block_Type_Registry::get_instance();
+		$block_type = $registry->get_registered( 'test/font-size-slug-with-numbers' );
+
+		$block_atts = array( 'fontSize' => 'h1' );
+
+		$actual   = wp_apply_typography_support( $block_type, $block_atts );
+		$expected = array( 'class' => 'has-h-1-font-size' );
+
+		$this->assertSame( $expected, $actual );
+		unregister_block_type( 'test/font-size-slug-with-numbers' );
+	}
+
+	function test_font_family_with_legacy_inline_styles_using_a_value() {
+		$block_name = 'test/font-family-with-inline-styles-using-value';
+		register_block_type(
+			$block_name,
+			array(
+				'api_version' => 2,
+				'attributes'  => array(
+					'style' => array(
+						'type' => 'object',
+					),
+				),
+				'supports'    => array(
+					'typography' => array(
+						'__experimentalFontFamily' => true,
+					),
+				),
+			)
+		);
+		$registry   = WP_Block_Type_Registry::get_instance();
+		$block_type = $registry->get_registered( $block_name );
+		$block_atts = array( 'style' => array( 'typography' => array( 'fontFamily' => 'serif' ) ) );
+
+		$actual   = wp_apply_typography_support( $block_type, $block_atts );
+		$expected = array( 'style' => 'font-family: serif;' );
+
+		$this->assertSame( $expected, $actual );
+		unregister_block_type( $block_name );
+	}
+
+	function test_font_family_with_legacy_inline_styles_using_a_css_var() {
+		$block_name = 'test/font-family-with-inline-styles-using-css-var';
+		register_block_type(
+			$block_name,
+			array(
+				'api_version' => 2,
+				'attributes'  => array(
+					'style' => array(
+						'type' => 'object',
+					),
+				),
+				'supports'    => array(
+					'typography' => array(
+						'__experimentalFontFamily' => true,
+					),
+				),
+			)
+		);
+		$registry   = WP_Block_Type_Registry::get_instance();
+		$block_type = $registry->get_registered( $block_name );
+		$block_atts = array( 'style' => array( 'typography' => array( 'fontFamily' => 'var:preset|font-family|h1' ) ) );
+
+		$actual   = wp_apply_typography_support( $block_type, $block_atts );
+		$expected = array( 'style' => 'font-family: var(--wp--preset--font-family--h-1);' );
+
+		$this->assertSame( $expected, $actual );
+		unregister_block_type( $block_name );
+	}
+
+	function test_font_family_with_class() {
+		$block_name = 'test/font-family-with-class';
+		register_block_type(
+			$block_name,
+			array(
+				'api_version' => 2,
+				'attributes'  => array(
+					'style' => array(
+						'type' => 'object',
+					),
+				),
+				'supports'    => array(
+					'typography' => array(
+						'__experimentalFontFamily' => true,
+					),
+				),
+			)
+		);
+		$registry   = WP_Block_Type_Registry::get_instance();
+		$block_type = $registry->get_registered( $block_name );
+		$block_atts = array( 'fontFamily' => 'h1' );
+
+		$actual   = wp_apply_typography_support( $block_type, $block_atts );
+		$expected = array( 'class' => 'has-h-1-font-family' );
+
+		$this->assertSame( $expected, $actual );
+		unregister_block_type( $block_name );
+	}
+
+}
diff --git a/tests/phpunit/tests/block-template-utils.php b/tests/phpunit/tests/block-template-utils.php
index a6242de614..c7745eaa82 100644
--- a/tests/phpunit/tests/block-template-utils.php
+++ b/tests/phpunit/tests/block-template-utils.php
@@ -1,17 +1,39 @@
 <?php
 /**
- * Block_Template_Utils_Test class
+ * Tests_Block_Template_Utils class
  *
- * @package    WordPress
+ * @package WordPress
  */
 
 /**
- * Tests for the Block Template Loader abstraction layer.
+ * Tests for the Block Templates abstraction layer.
+ *
+ * @group block-templates
  */
-class Block_Template_Utils_Test extends WP_UnitTestCase {
+class Tests_Block_Template_Utils extends WP_UnitTestCase {
 	private static $post;
+	private static $template_part_post;
+	private static $test_theme = 'block-theme';
 
 	public static function wpSetUpBeforeClass() {
+		// Set up a template post corresponding to a different theme.
+		// We do this to ensure resolution and slug creation works as expected,
+		// even with another post of that same name present for another theme.
+		$args       = array(
+			'post_type'    => 'wp_template',
+			'post_name'    => 'my_template',
+			'post_title'   => 'My Template',
+			'post_content' => 'Content',
+			'post_excerpt' => 'Description of my template',
+			'tax_input'    => array(
+				'wp_theme' => array(
+					'this-theme-should-not-resolve',
+				),
+			),
+		);
+		self::$post = self::factory()->post->create_and_get( $args );
+		wp_set_post_terms( self::$post->ID, 'this-theme-should-not-resolve', 'wp_theme' );
+
 		// Set up template post.
 		$args       = array(
 			'post_type'    => 'wp_template',
@@ -21,20 +43,45 @@ class Block_Template_Utils_Test extends WP_UnitTestCase {
 			'post_excerpt' => 'Description of my template',
 			'tax_input'    => array(
 				'wp_theme' => array(
-					get_stylesheet(),
+					self::$test_theme,
 				),
 			),
 		);
 		self::$post = self::factory()->post->create_and_get( $args );
-		wp_set_post_terms( self::$post->ID, get_stylesheet(), 'wp_theme' );
+		wp_set_post_terms( self::$post->ID, self::$test_theme, 'wp_theme' );
+
+		// Set up template part post.
+		$template_part_args       = array(
+			'post_type'    => 'wp_template_part',
+			'post_name'    => 'my_template_part',
+			'post_title'   => 'My Template Part',
+			'post_content' => 'Content',
+			'post_excerpt' => 'Description of my template part',
+			'tax_input'    => array(
+				'wp_theme'              => array(
+					self::$test_theme,
+				),
+				'wp_template_part_area' => array(
+					WP_TEMPLATE_PART_AREA_HEADER,
+				),
+			),
+		);
+		self::$template_part_post = self::factory()->post->create_and_get( $template_part_args );
+		wp_set_post_terms( self::$template_part_post->ID, WP_TEMPLATE_PART_AREA_HEADER, 'wp_template_part_area' );
+		wp_set_post_terms( self::$template_part_post->ID, self::$test_theme, 'wp_theme' );
+	}
+
+	public function set_up() {
+		parent::set_up();
+		switch_theme( self::$test_theme );
 	}
 
 	public static function wpTearDownAfterClass() {
 		wp_delete_post( self::$post->ID );
 	}
 
-	public function test_build_template_result_from_post() {
-		$template = _build_template_result_from_post(
+	public function test_build_block_template_result_from_post() {
+		$template = _build_block_template_result_from_post(
 			self::$post,
 			'wp_template'
 		);
@@ -48,6 +95,158 @@ class Block_Template_Utils_Test extends WP_UnitTestCase {
 		$this->assertSame( 'My Template', $template->title );
 		$this->assertSame( 'Description of my template', $template->description );
 		$this->assertSame( 'wp_template', $template->type );
+
+		// Test template parts.
+		$template_part = _build_block_template_result_from_post(
+			self::$template_part_post,
+			'wp_template_part'
+		);
+		$this->assertNotWPError( $template_part );
+		$this->assertSame( get_stylesheet() . '//my_template_part', $template_part->id );
+		$this->assertSame( get_stylesheet(), $template_part->theme );
+		$this->assertSame( 'my_template_part', $template_part->slug );
+		$this->assertSame( 'publish', $template_part->status );
+		$this->assertSame( 'custom', $template_part->source );
+		$this->assertSame( 'My Template Part', $template_part->title );
+		$this->assertSame( 'Description of my template part', $template_part->description );
+		$this->assertSame( 'wp_template_part', $template_part->type );
+		$this->assertSame( WP_TEMPLATE_PART_AREA_HEADER, $template_part->area );
+	}
+
+	function test_build_block_template_result_from_file() {
+		$template = _build_block_template_result_from_file(
+			array(
+				'slug' => 'single',
+				'path' => __DIR__ . '/../data/templates/template.html',
+			),
+			'wp_template'
+		);
+
+		$this->assertSame( get_stylesheet() . '//single', $template->id );
+		$this->assertSame( get_stylesheet(), $template->theme );
+		$this->assertSame( 'single', $template->slug );
+		$this->assertSame( 'publish', $template->status );
+		$this->assertSame( 'theme', $template->source );
+		$this->assertSame( 'Single Post', $template->title );
+		$this->assertSame( 'Displays a single post.', $template->description );
+		$this->assertSame( 'wp_template', $template->type );
+
+		// Test template parts.
+		$template_part = _build_block_template_result_from_file(
+			array(
+				'slug' => 'header',
+				'path' => __DIR__ . '/../data/templates/template.html',
+				'area' => WP_TEMPLATE_PART_AREA_HEADER,
+			),
+			'wp_template_part'
+		);
+		$this->assertSame( get_stylesheet() . '//header', $template_part->id );
+		$this->assertSame( get_stylesheet(), $template_part->theme );
+		$this->assertSame( 'header', $template_part->slug );
+		$this->assertSame( 'publish', $template_part->status );
+		$this->assertSame( 'theme', $template_part->source );
+		$this->assertSame( 'header', $template_part->title );
+		$this->assertSame( '', $template_part->description );
+		$this->assertSame( 'wp_template_part', $template_part->type );
+		$this->assertSame( WP_TEMPLATE_PART_AREA_HEADER, $template_part->area );
+	}
+
+	function test_inject_theme_attribute_in_block_template_content() {
+		$theme                           = get_stylesheet();
+		$content_without_theme_attribute = '<!-- wp:template-part {"slug":"header","align":"full", "tagName":"header","className":"site-header"} /-->';
+		$template_content                = _inject_theme_attribute_in_block_template_content(
+			$content_without_theme_attribute,
+			$theme
+		);
+		$expected                        = sprintf(
+			'<!-- wp:template-part {"slug":"header","align":"full","tagName":"header","className":"site-header","theme":"%s"} /-->',
+			get_stylesheet()
+		);
+		$this->assertSame( $expected, $template_content );
+
+		$content_without_theme_attribute_nested = '<!-- wp:group --><!-- wp:template-part {"slug":"header","align":"full", "tagName":"header","className":"site-header"} /--><!-- /wp:group -->';
+		$template_content                       = _inject_theme_attribute_in_block_template_content(
+			$content_without_theme_attribute_nested,
+			$theme
+		);
+		$expected                               = sprintf(
+			'<!-- wp:group --><!-- wp:template-part {"slug":"header","align":"full","tagName":"header","className":"site-header","theme":"%s"} /--><!-- /wp:group -->',
+			get_stylesheet()
+		);
+		$this->assertSame( $expected, $template_content );
+
+		// Does not inject theme when there is an existing theme attribute.
+		$content_with_existing_theme_attribute = '<!-- wp:template-part {"slug":"header","theme":"fake-theme","align":"full", "tagName":"header","className":"site-header"} /-->';
+		$template_content                      = _inject_theme_attribute_in_block_template_content(
+			$content_with_existing_theme_attribute,
+			$theme
+		);
+		$this->assertSame( $content_with_existing_theme_attribute, $template_content );
+
+		// Does not inject theme when there is no template part.
+		$content_with_no_template_part = '<!-- wp:post-content /-->';
+		$template_content              = _inject_theme_attribute_in_block_template_content(
+			$content_with_no_template_part,
+			$theme
+		);
+		$this->assertSame( $content_with_no_template_part, $template_content );
+	}
+
+	/**
+	 * @ticket 54448
+	 *
+	 * @dataProvider data_remove_theme_attribute_in_block_template_content
+	 */
+	function test_remove_theme_attribute_in_block_template_content( $template_content, $expected ) {
+		$this->assertEquals( $expected, _remove_theme_attribute_in_block_template_content( $template_content ) );
+	}
+
+	function data_remove_theme_attribute_in_block_template_content() {
+		return array(
+			array(
+				'<!-- wp:template-part {"slug":"header","theme":"tt1-blocks","align":"full","tagName":"header","className":"site-header"} /-->',
+				'<!-- wp:template-part {"slug":"header","align":"full","tagName":"header","className":"site-header"} /-->',
+			),
+			array(
+				'<!-- wp:group --><!-- wp:template-part {"slug":"header","theme":"tt1-blocks","align":"full","tagName":"header","className":"site-header"} /--><!-- /wp:group -->',
+				'<!-- wp:group --><!-- wp:template-part {"slug":"header","align":"full","tagName":"header","className":"site-header"} /--><!-- /wp:group -->',
+			),
+			// Does not modify content when there is no existing theme attribute.
+			array(
+				'<!-- wp:template-part {"slug":"header","align":"full","tagName":"header","className":"site-header"} /-->',
+				'<!-- wp:template-part {"slug":"header","align":"full","tagName":"header","className":"site-header"} /-->',
+			),
+			// Does not remove theme when there is no template part.
+			array(
+				'<!-- wp:post-content /-->',
+				'<!-- wp:post-content /-->',
+			),
+		);
+	}
+
+	/**
+	 * Should retrieve the template from the theme files.
+	 */
+	function test_get_block_template_from_file() {
+		$id       = get_stylesheet() . '//' . 'index';
+		$template = get_block_template( $id, 'wp_template' );
+		$this->assertSame( $id, $template->id );
+		$this->assertSame( get_stylesheet(), $template->theme );
+		$this->assertSame( 'index', $template->slug );
+		$this->assertSame( 'publish', $template->status );
+		$this->assertSame( 'theme', $template->source );
+		$this->assertSame( 'wp_template', $template->type );
+
+		// Test template parts.
+		$id       = get_stylesheet() . '//' . 'small-header';
+		$template = get_block_template( $id, 'wp_template_part' );
+		$this->assertSame( $id, $template->id );
+		$this->assertSame( get_stylesheet(), $template->theme );
+		$this->assertSame( 'small-header', $template->slug );
+		$this->assertSame( 'publish', $template->status );
+		$this->assertSame( 'theme', $template->source );
+		$this->assertSame( 'wp_template_part', $template->type );
+		$this->assertSame( WP_TEMPLATE_PART_AREA_HEADER, $template->area );
 	}
 
 	/**
@@ -62,10 +261,21 @@ class Block_Template_Utils_Test extends WP_UnitTestCase {
 		$this->assertSame( 'publish', $template->status );
 		$this->assertSame( 'custom', $template->source );
 		$this->assertSame( 'wp_template', $template->type );
+
+		// Test template parts.
+		$id       = get_stylesheet() . '//' . 'my_template_part';
+		$template = get_block_template( $id, 'wp_template_part' );
+		$this->assertSame( $id, $template->id );
+		$this->assertSame( get_stylesheet(), $template->theme );
+		$this->assertSame( 'my_template_part', $template->slug );
+		$this->assertSame( 'publish', $template->status );
+		$this->assertSame( 'custom', $template->source );
+		$this->assertSame( 'wp_template_part', $template->type );
+		$this->assertSame( WP_TEMPLATE_PART_AREA_HEADER, $template->area );
 	}
 
 	/**
-	 * Should retrieve block templates.
+	 * Should retrieve block templates (file and CPT)
 	 */
 	public function test_get_block_templates() {
 		function get_template_ids( $templates ) {
@@ -84,6 +294,9 @@ class Block_Template_Utils_Test extends WP_UnitTestCase {
 		// Avoid testing the entire array because the theme might add/remove templates.
 		$this->assertContains( get_stylesheet() . '//' . 'my_template', $template_ids );
 
+		// The result might change in a block theme.
+		// $this->assertContains( get_stylesheet() . '//' . 'index', $template_ids );
+
 		// Filter by slug.
 		$templates    = get_block_templates( array( 'slug__in' => array( 'my_template' ) ), 'wp_template' );
 		$template_ids = get_template_ids( $templates );
@@ -93,5 +306,74 @@ class Block_Template_Utils_Test extends WP_UnitTestCase {
 		$templates    = get_block_templates( array( 'wp_id' => self::$post->ID ), 'wp_template' );
 		$template_ids = get_template_ids( $templates );
 		$this->assertSame( array( get_stylesheet() . '//' . 'my_template' ), $template_ids );
+
+		// Filter template part by area.
+		// Requires a block theme.
+		/*$templates    = get_block_templates( array( 'area' => WP_TEMPLATE_PART_AREA_HEADER ), 'wp_template_part' );
+		$template_ids = get_template_ids( $templates );
+		$this->assertSame(
+			array(
+				get_stylesheet() . '//' . 'my_template_part',
+				get_stylesheet() . '//' . 'header',
+			),
+			$template_ids
+		);
+		*/
+	}
+
+	/**
+	 * Should flatten nested blocks
+	 */
+	function test_flatten_blocks() {
+		$content_template_part_inside_group = '<!-- wp:group --><!-- wp:template-part {"slug":"header"} /--><!-- /wp:group -->';
+		$blocks                             = parse_blocks( $content_template_part_inside_group );
+		$actual                             = _flatten_blocks( $blocks );
+		$expected                           = array( $blocks[0], $blocks[0]['innerBlocks'][0] );
+		$this->assertSame( $expected, $actual );
+
+		$content_template_part_inside_group_inside_group = '<!-- wp:group --><!-- wp:group --><!-- wp:template-part {"slug":"header"} /--><!-- /wp:group --><!-- /wp:group -->';
+		$blocks   = parse_blocks( $content_template_part_inside_group_inside_group );
+		$actual   = _flatten_blocks( $blocks );
+		$expected = array( $blocks[0], $blocks[0]['innerBlocks'][0], $blocks[0]['innerBlocks'][0]['innerBlocks'][0] );
+		$this->assertSame( $expected, $actual );
+
+		$content_without_inner_blocks = '<!-- wp:group /-->';
+		$blocks                       = parse_blocks( $content_without_inner_blocks );
+		$actual                       = _flatten_blocks( $blocks );
+		$expected                     = array( $blocks[0] );
+		$this->assertSame( $expected, $actual );
+	}
+
+	/**
+	 * Should generate block templates export file.
+	 *
+	 * @ticket 54448
+	 */
+	function test_wp_generate_block_templates_export_file() {
+		$filename = wp_generate_block_templates_export_file();
+		$this->assertFileExists( $filename, 'zip file is created at the specified path' );
+		$this->assertTrue( filesize( $filename ) > 0, 'zip file is larger than 0 bytes' );
+
+		// Open ZIP file and make sure the directories exist.
+		$zip = new ZipArchive();
+		$zip->open( $filename );
+		$has_theme_dir                = $zip->locateName( 'theme/' ) !== false;
+		$has_block_templates_dir      = $zip->locateName( 'theme/templates/' ) !== false;
+		$has_block_template_parts_dir = $zip->locateName( 'theme/parts/' ) !== false;
+		$this->assertTrue( $has_theme_dir, 'theme directory exists' );
+		$this->assertTrue( $has_block_templates_dir, 'theme/templates directory exists' );
+		$this->assertTrue( $has_block_template_parts_dir, 'theme/parts directory exists' );
+
+		// ZIP file contains at least one HTML file.
+		$has_html_files = false;
+		$num_files      = $zip->numFiles;
+		for ( $i = 0; $i < $num_files; $i++ ) {
+			$filename = $zip->getNameIndex( $i );
+			if ( '.html' === substr( $filename, -5 ) ) {
+				$has_html_files = true;
+				break;
+			}
+		}
+		$this->assertTrue( $has_html_files, 'contains at least one html file' );
 	}
 }
diff --git a/tests/phpunit/tests/block-template.php b/tests/phpunit/tests/block-template.php
index 5b475567bd..7163fea70a 100644
--- a/tests/phpunit/tests/block-template.php
+++ b/tests/phpunit/tests/block-template.php
@@ -1,43 +1,129 @@
 <?php
 /**
- * Block_Template_Test class
+ * Tests_Block_Template class
  *
  * @package WordPress
  */
 
 /**
  * Tests for the block template loading algorithm.
+ *
+ * @group block-templates
  */
-class Block_Template_Test extends WP_UnitTestCase {
+class Tests_Block_Template extends WP_UnitTestCase {
 	private static $post;
 
 	private static $template_canvas_path = ABSPATH . WPINC . '/template-canvas.php';
 
-	public static function wpSetUpBeforeClass() {
-		// Set up custom template post.
-		$args       = array(
-			'post_type'    => 'wp_template',
-			'post_name'    => 'wp-custom-template-my-block-template',
-			'post_title'   => 'My Custom Block Template',
-			'post_content' => 'Content',
-			'post_excerpt' => 'Description of my block template',
-			'tax_input'    => array(
-				'wp_theme' => array(
-					get_stylesheet(),
-				),
-			),
+	public function set_up() {
+		parent::set_up();
+		switch_theme( 'block-theme' );
+		do_action( 'setup_theme' );
+	}
+
+	public function tear_down() {
+		global $_wp_current_template_content;
+		unset( $_wp_current_template_content );
+
+		parent::tear_down();
+	}
+
+	function test_page_home_block_template_takes_precedence_over_less_specific_block_templates() {
+		global $_wp_current_template_content;
+		$type                   = 'page';
+		$templates              = array(
+			'page-home.php',
+			'page-1.php',
+			'page.php',
 		);
-		self::$post = self::factory()->post->create_and_get( $args );
-		wp_set_post_terms( self::$post->ID, get_stylesheet(), 'wp_theme' );
+		$resolved_template_path = locate_block_template( get_stylesheet_directory() . '/page-home.php', $type, $templates );
+		$this->assertSame( self::$template_canvas_path, $resolved_template_path );
+		$this->assertStringEqualsFile( get_stylesheet_directory() . '/templates/page-home.html', $_wp_current_template_content );
 	}
 
-	public static function wpTearDownAfterClass() {
-		wp_delete_post( self::$post->ID );
+	function test_page_block_template_takes_precedence() {
+		global $_wp_current_template_content;
+		$type                   = 'page';
+		$templates              = array(
+			'page-slug-doesnt-exist.php',
+			'page-1.php',
+			'page.php',
+		);
+		$resolved_template_path = locate_block_template( get_stylesheet_directory() . '/page.php', $type, $templates );
+		$this->assertSame( self::$template_canvas_path, $resolved_template_path );
+		$this->assertStringEqualsFile( get_stylesheet_directory() . '/templates/page.html', $_wp_current_template_content );
 	}
 
-	public function tear_down() {
+	function test_block_template_takes_precedence_over_equally_specific_php_template() {
 		global $_wp_current_template_content;
-		unset( $_wp_current_template_content );
+		$type                   = 'index';
+		$templates              = array(
+			'index.php',
+		);
+		$resolved_template_path = locate_block_template( get_stylesheet_directory() . '/index.php', $type, $templates );
+		$this->assertSame( self::$template_canvas_path, $resolved_template_path );
+		$this->assertStringEqualsFile( get_stylesheet_directory() . '/templates/index.html', $_wp_current_template_content );
+	}
+
+	/**
+	 * In a hybrid theme, a PHP template of higher specificity will take precedence over a block template
+	 * with lower specificity.
+	 *
+	 * Covers https://github.com/WordPress/gutenberg/pull/29026.
+	 */
+	function test_more_specific_php_template_takes_precedence_over_less_specific_block_template() {
+		$page_id_template       = 'page-1.php';
+		$page_id_template_path  = get_stylesheet_directory() . '/' . $page_id_template;
+		$type                   = 'page';
+		$templates              = array(
+			'page-slug-doesnt-exist.php',
+			'page-1.php',
+			'page.php',
+		);
+		$resolved_template_path = locate_block_template( $page_id_template_path, $type, $templates );
+		$this->assertSame( $page_id_template_path, $resolved_template_path );
+	}
+
+	/**
+	 * If a theme is a child of a block-based parent theme but has php templates for some of its pages,
+	 * a php template of the child will take precedence over the parent's block template if they have
+	 * otherwise equal specificity.
+	 *
+	 * Covers https://github.com/WordPress/gutenberg/pull/31123.
+	 * Covers https://core.trac.wordpress.org/ticket/54515.
+	 *
+	 */
+	function test_child_theme_php_template_takes_precedence_over_equally_specific_parent_theme_block_template() {
+		switch_theme( 'block-theme-child' );
+
+		$page_slug_template      = 'page-home.php';
+		$page_slug_template_path = get_stylesheet_directory() . '/' . $page_slug_template;
+		$type                    = 'page';
+		$templates               = array(
+			'page-home.php',
+			'page-1.php',
+			'page.php',
+		);
+		$resolved_template_path  = locate_block_template( $page_slug_template_path, $type, $templates );
+		$this->assertSame( $page_slug_template_path, $resolved_template_path );
+	}
+
+	function test_child_theme_block_template_takes_precedence_over_equally_specific_parent_theme_php_template() {
+		global $_wp_current_template_content;
+
+		switch_theme( 'block-theme-child' );
+
+		$page_template                   = 'page-1.php';
+		$parent_theme_page_template_path = get_template_directory() . '/' . $page_template;
+		$type                            = 'page';
+		$templates                       = array(
+			'page-slug-doesnt-exist.php',
+			'page-1.php',
+			'page.php',
+		);
+		$resolved_template_path          = locate_block_template( $parent_theme_page_template_path, $type, $templates );
+		$this->assertSame( self::$template_canvas_path, $resolved_template_path );
+		$this->assertStringEqualsFile( get_stylesheet_directory() . '/templates/page-1.html', $_wp_current_template_content );
 	}
 
 	/**
@@ -63,6 +149,22 @@ class Block_Template_Test extends WP_UnitTestCase {
 	public function test_custom_page_block_template_takes_precedence_over_all_other_templates() {
 		global $_wp_current_template_content;
 
+		// Set up custom template post.
+		$args = array(
+			'post_type'    => 'wp_template',
+			'post_name'    => 'wp-custom-template-my-block-template',
+			'post_title'   => 'My Custom Block Template',
+			'post_content' => 'Content',
+			'post_excerpt' => 'Description of my block template',
+			'tax_input'    => array(
+				'wp_theme' => array(
+					get_stylesheet(),
+				),
+			),
+		);
+		$post = self::factory()->post->create_and_get( $args );
+		wp_set_post_terms( $post->ID, get_stylesheet(), 'wp_theme' );
+
 		$custom_page_block_template = 'wp-custom-template-my-block-template';
 		$page_template_path         = get_stylesheet_directory() . '/' . 'page.php';
 		$type                       = 'page';
@@ -74,7 +176,9 @@ class Block_Template_Test extends WP_UnitTestCase {
 		);
 		$resolved_template_path     = locate_block_template( $page_template_path, $type, $templates );
 		$this->assertSame( self::$template_canvas_path, $resolved_template_path );
-		$this->assertSame( self::$post->post_content, $_wp_current_template_content );
+		$this->assertSame( $post->post_content, $_wp_current_template_content );
+
+		wp_delete_post( $post->ID );
 	}
 
 	/**
diff --git a/tests/phpunit/tests/blocks/editor.php b/tests/phpunit/tests/blocks/editor.php
index 410f6777ed..a7277d5966 100644
--- a/tests/phpunit/tests/blocks/editor.php
+++ b/tests/phpunit/tests/blocks/editor.php
@@ -170,7 +170,7 @@ class Tests_Blocks_Editor extends WP_UnitTestCase {
 	public function test_get_default_block_editor_settings() {
 		$settings = get_default_block_editor_settings();
 
-		$this->assertCount( 16, $settings );
+		$this->assertCount( 18, $settings );
 		$this->assertFalse( $settings['alignWide'] );
 		$this->assertIsArray( $settings['allowedMimeTypes'] );
 		$this->assertTrue( $settings['allowedBlockTypes'] );
@@ -265,6 +265,7 @@ class Tests_Blocks_Editor extends WP_UnitTestCase {
 			$settings['imageSizes']
 		);
 		$this->assertIsInt( $settings['maxUploadFileSize'] );
+		$this->assertTrue( $settings['__unstableGalleryWithImageBlocks'] );
 	}
 
 	/**
@@ -495,17 +496,51 @@ class Tests_Blocks_Editor extends WP_UnitTestCase {
 	}
 
 	/**
-	 * @ticket 53344
+	 * @ticket 54558
+	 * @dataProvider data_block_editor_rest_api_preload_adds_missing_leading_slash
+	 *
+	 * @covers ::block_editor_rest_api_preload
+	 *
+	 * @param array  $preload_paths The paths to preload.
+	 * @param string $expected      The expected substring.
 	 */
-	public function test_get_block_editor_theme_styles() {
-		$theme_styles = get_block_editor_theme_styles();
-		$this->assertCount( 1, $theme_styles );
-		$this->assertSameSets(
-			array(
-				'css'            => 'body { font-family: -apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen-Sans,Ubuntu,Cantarell,"Helvetica Neue",sans-serif }',
-				'__unstableType' => 'core',
+	public function test_block_editor_rest_api_preload_adds_missing_leading_slash( array $preload_paths, $expected ) {
+		block_editor_rest_api_preload( $preload_paths, new WP_Block_Editor_Context() );
+		$haystack = implode( '', wp_scripts()->registered['wp-api-fetch']->extra['after'] );
+		$this->assertStringContainsString( $expected, $haystack );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_block_editor_rest_api_preload_adds_missing_leading_slash() {
+		return array(
+			'a string without a slash'               => array(
+				'preload_paths' => array( 'wp/v2/blocks' ),
+				'expected'      => '\/wp\/v2\/blocks',
+			),
+			'a string with a slash'                  => array(
+				'preload_paths' => array( '/wp/v2/blocks' ),
+				'expected'      => '\/wp\/v2\/blocks',
+			),
+			'a string starting with a question mark' => array(
+				'preload_paths' => array( '?context=edit' ),
+				'expected'      => '/?context=edit',
+			),
+			'an array with a string without a slash' => array(
+				'preload_paths' => array( array( 'wp/v2/blocks', 'OPTIONS' ) ),
+				'expected'      => '\/wp\/v2\/blocks',
+			),
+			'an array with a string with a slash'    => array(
+				'preload_paths' => array( array( '/wp/v2/blocks', 'OPTIONS' ) ),
+				'expected'      => '\/wp\/v2\/blocks',
+			),
+			'an array with a string starting with a question mark' => array(
+				'preload_paths' => array( array( '?context=edit', 'OPTIONS' ) ),
+				'expected'      => '\/?context=edit',
 			),
-			$theme_styles[0]
 		);
 	}
 }
diff --git a/tests/phpunit/tests/blocks/register.php b/tests/phpunit/tests/blocks/register.php
index 18463671d4..07800a98a3 100644
--- a/tests/phpunit/tests/blocks/register.php
+++ b/tests/phpunit/tests/blocks/register.php
@@ -8,7 +8,7 @@
  */
 
 /**
- * Tests for register_block_type(), unregister_block_type(), get_dynamic_block_names().
+ * Tests for register_block_type(), unregister_block_type(), get_dynamic_block_names(), and register_block_style().
  *
  * @since 5.0.0
  *
@@ -559,4 +559,61 @@ class Tests_Blocks_Register extends WP_UnitTestCase {
 
 		$this->assertSame( 3, $result->api_version );
 	}
+
+	/**
+	 * Test case to validate `_doing_it_wrong()` when block style name attribute
+	 * contains one or more spaces.
+	 *
+	 * @dataProvider data_register_block_style_name_contains_spaces
+	 *
+	 * @ticket 54296
+	 *
+	 * @covers ::register_block_style
+	 *
+	 * @expectedIncorrectUsage WP_Block_Styles_Registry::register
+	 * @param array $block_styles Array of block styles to test.
+	 */
+	public function test_register_block_style_name_contains_spaces( array $block_styles ) {
+		register_block_style( 'core/query', $block_styles );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_register_block_style_name_contains_spaces() {
+		return array(
+			'multiple spaces' => array(
+				array(
+					'name'  => 'style-class-1    style-class-2',
+					'label' => 'Custom Style Label',
+				),
+			),
+			'single space'    => array(
+				array(
+					'name'  => 'style-class-1 style-class-2',
+					'label' => 'Custom Style Label',
+				),
+			),
+		);
+	}
+
+	/**
+	 * Test case to validate no `_doing_it_wrong()` happens when there is
+	 * no empty space.
+	 *
+	 * @ticket 54296
+	 *
+	 * @covers ::register_block_style
+	 */
+	public function test_register_block_style_name_without_spaces() {
+		$block_styles = array(
+			'name'  => 'style-class-1',
+			'label' => 'Custom Style Label',
+		);
+
+		$actual = register_block_style( 'core/query', $block_styles );
+		$this->assertTrue( $actual );
+	}
 }
diff --git a/tests/phpunit/tests/bookmark/wpListBookmarks.php b/tests/phpunit/tests/bookmark/wpListBookmarks.php
new file mode 100644
index 0000000000..ba0121fd00
--- /dev/null
+++ b/tests/phpunit/tests/bookmark/wpListBookmarks.php
@@ -0,0 +1,108 @@
+<?php
+
+/**
+ * Test wp_list_bookmarks().
+ *
+ * @group bookmark
+ * @covers ::wp_list_bookmarks
+ */
+class Tests_Functions_wpListBookmarks extends WP_UnitTestCase {
+
+	/**
+	 * Test that wp_list_bookmarks adds "noopener" to the "rel" attribute.
+	 *
+	 * @dataProvider data_wp_list_bookmarks_adds_noopener
+	 *
+	 * @ticket 53839
+	 *
+	 * @param array $args      The arguments to create the bookmark.
+	 * @param string $expected Expected string to test.
+	 */
+	public function test_wp_list_bookmarks_adds_noopener( $args, $expected ) {
+		self::factory()->bookmark->create( $args );
+		$this->assertStringContainsString( $expected, wp_list_bookmarks( 'echo=0' ) );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_wp_list_bookmarks_adds_noopener() {
+		return array(
+			'target as "_blank"'                         => array(
+				'args'     => array(
+					'link_name'   => 'With _blank',
+					'link_url'    => 'https://www.wordpress.org',
+					'link_target' => '_blank',
+				),
+				'expected' => 'rel="noopener"',
+			),
+			'target as "_blank" and a link relationship' => array(
+				'args'     => array(
+					'link_name'   => 'With _blank and a link relationship',
+					'link_url'    => 'https://www.wordpress.org',
+					'link_target' => '_blank',
+					'link_rel'    => 'me',
+				),
+				'expected' => 'rel="me noopener"',
+			),
+			'target as "_top"'                           => array(
+				'args'     => array(
+					'link_name'   => 'With _top',
+					'link_url'    => 'https://www.wordpress.org',
+					'link_target' => '_top',
+				),
+				'expected' => 'rel="noopener"',
+			),
+			'target as "_top" and a link relationship'   => array(
+				'args'     => array(
+					'link_name'   => 'With _top and a link relationship',
+					'link_url'    => 'https://www.wordpress.org',
+					'link_target' => '_top',
+					'link_rel'    => 'me',
+				),
+				'expected' => 'rel="me noopener"',
+			),
+		);
+	}
+
+	/**
+	 * Test that wp_list_bookmarks does not add "noopener" to the "rel" attribute.
+	 *
+	 * @dataProvider data_wp_list_bookmarks_does_not_add_noopener
+	 *
+	 * @ticket 53839
+	 *
+	 * @param array $args The arguments to create the bookmark.
+	 */
+	public function test_wp_list_bookmarks_does_not_add_noopener( $args ) {
+		self::factory()->bookmark->create( $args );
+		$this->assertStringNotContainsString( 'noopener', wp_list_bookmarks( 'echo=0' ) );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_wp_list_bookmarks_does_not_add_noopener() {
+		return array(
+			'target as "_none"'                         => array(
+				'args' => array(
+					'link_name'   => 'With _blank',
+					'link_url'    => 'https://www.wordpress.org',
+					'link_target' => '_none',
+				),
+			),
+			'target as "_none" and a link relationship' => array(
+				'args' => array(
+					'link_name'   => 'With _blank and a link relationship',
+					'link_url'    => 'https://www.wordpress.org',
+					'link_target' => '_none',
+					'link_rel'    => 'me',
+				),
+			),
+		);
+	}
+}
diff --git a/tests/phpunit/tests/comment/commentForm.php b/tests/phpunit/tests/comment/commentForm.php
index c5cdf5849b..eef2e9ac7c 100644
--- a/tests/phpunit/tests/comment/commentForm.php
+++ b/tests/phpunit/tests/comment/commentForm.php
@@ -1,9 +1,16 @@
 <?php
 
 /**
- * @group comment
+ * @group  comment
+ * @covers ::comment_form
  */
 class Tests_Comment_CommentForm extends WP_UnitTestCase {
+	public static $post_id;
+
+	public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) {
+		self::$post_id = $factory->post->create();
+	}
+
 	public function test_default_markup_for_submit_button_and_wrapper() {
 		$p = self::factory()->post->create();
 
@@ -123,4 +130,26 @@ class Tests_Comment_CommentForm extends WP_UnitTestCase {
 
 		$this->assertStringNotContainsString( 'aria-describedby="email-notes"', $form_without_aria );
 	}
+
+	/**
+	 * @ticket 32767
+	 */
+	public function test_when_thread_comments_enabled() {
+		update_option( 'thread_comments', true );
+
+		$form     = get_echo( 'comment_form', array( array(), self::$post_id ) );
+		$expected = '<a rel="nofollow" id="cancel-comment-reply-link" href="#respond" style="display:none;">Cancel reply</a>';
+		$this->assertStringContainsString( $expected, $form );
+	}
+
+	/**
+	 * @ticket 32767
+	 */
+	public function test_when_thread_comments_disabled() {
+		delete_option( 'thread_comments' );
+
+		$form     = get_echo( 'comment_form', array( array(), self::$post_id ) );
+		$expected = '<a rel="nofollow" id="cancel-comment-reply-link" href="#respond" style="display:none;">Cancel reply</a>';
+		$this->assertStringNotContainsString( $expected, $form );
+	}
 }
diff --git a/tests/phpunit/tests/comment/commentsOpen.php b/tests/phpunit/tests/comment/commentsOpen.php
new file mode 100644
index 0000000000..54e08ea8ed
--- /dev/null
+++ b/tests/phpunit/tests/comment/commentsOpen.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @group  comment
+ * @covers ::comments_open
+ */
+class Tests_Comment_CommentsOpen extends WP_UnitTestCase {
+
+	/**
+	 * @ticket 54159
+	 */
+	public function test_post_does_not_exist() {
+		$this->assertFalse( comments_open( 99999 ) );
+	}
+
+	/**
+	 * @ticket 54159
+	 */
+	public function test_post_exist_status_open() {
+		$post = $this->factory->post->create_and_get();
+		$this->assertTrue( comments_open( $post ) );
+	}
+
+	/**
+	 * @ticket 54159
+	 */
+	public function test_post_exist_status_closed() {
+		$post                 = $this->factory->post->create_and_get();
+		$post->comment_status = 'closed';
+
+		$this->assertFalse( comments_open( $post ) );
+	}
+}
diff --git a/tests/phpunit/tests/comment/pingsOpen.php b/tests/phpunit/tests/comment/pingsOpen.php
new file mode 100644
index 0000000000..2ef7029804
--- /dev/null
+++ b/tests/phpunit/tests/comment/pingsOpen.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @group  comment
+ * @covers ::pings_open
+ */
+class Tests_Comment_PingsOpen extends WP_UnitTestCase {
+
+	/**
+	 * @ticket 54159
+	 */
+	public function test_post_does_not_exist() {
+		$this->assertFalse( pings_open( 99999 ) );
+	}
+
+	/**
+	 * @ticket 54159
+	 */
+	public function test_post_exist_status_open() {
+		$post = $this->factory->post->create_and_get();
+		$this->assertTrue( pings_open( $post ) );
+	}
+
+	/**
+	 * @ticket 54159
+	 */
+	public function test_post_exist_status_closed() {
+		$post              = $this->factory->post->create_and_get();
+		$post->ping_status = 'closed';
+
+		$this->assertFalse( pings_open( $post ) );
+	}
+}
diff --git a/tests/phpunit/tests/compat/arrayKeyFirst.php b/tests/phpunit/tests/compat/arrayKeyFirst.php
new file mode 100644
index 0000000000..613845aba0
--- /dev/null
+++ b/tests/phpunit/tests/compat/arrayKeyFirst.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * @group compat
+ *
+ * @covers ::array_key_first
+ */
+class Tests_Compat_arrayKeyFirst extends WP_UnitTestCase {
+
+	/**
+	 * Test that array_key_first() is always available (either from PHP or WP).
+	 * @ticket 45055
+	 */
+	public function test_array_key_first_availability() {
+		$this->assertTrue( function_exists( 'array_key_first' ) );
+	}
+
+	/**
+	 * @dataProvider data_array_key_first
+	 *
+	 * @ticket 45055
+	 *
+	 * @param bool $expected The value of the key extracted to extracted from given array.
+	 * @param array $arr     The array to get first key from.
+	 */
+	public function test_array_key_first( $expected, $arr ) {
+		if ( ! function_exists( 'array_key_first' ) ) {
+			$this->markTestSkipped( 'array_key_first() is not available.' );
+		} else {
+			$this->assertSame(
+				$expected,
+				array_key_first( $arr )
+			);
+		}
+
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array[]
+	 */
+	public function data_array_key_first() {
+		return array(
+			'string key'  => array(
+				'expected' => 'key1',
+				'arr'      => array(
+					'key1' => 'val1',
+					'key2' => 'val2',
+				),
+			),
+			'int key'     => array(
+				'expected' => 99,
+				'arr'      => array(
+					99 => 'val1',
+					1  => 'val2',
+				),
+			),
+			'no key'      => array(
+				'expected' => 0,
+				'arr'      => array( 'val1', 'val2' ),
+			),
+			'multi array' => array(
+				'expected' => 99,
+				'arr'      => array(
+					99 => array( 22 => 'val1' ),
+					1  => 'val2',
+				),
+			),
+			'empty array' => array(
+				'expected' => null,
+				'arr'      => array(),
+			),
+		);
+	}
+}
diff --git a/tests/phpunit/tests/compat/arrayKeyLast.php b/tests/phpunit/tests/compat/arrayKeyLast.php
new file mode 100644
index 0000000000..77510c8320
--- /dev/null
+++ b/tests/phpunit/tests/compat/arrayKeyLast.php
@@ -0,0 +1,81 @@
+<?php
+
+/**
+ * @group compat
+ *
+ * @covers ::array_key_last
+ */
+class Tests_Compat_ArrayKeyLast extends WP_UnitTestCase {
+
+	/**
+	 * Test that array_key_last() is always available (either from PHP or WP).
+	 *
+	 * @ticket 45055
+	 */
+	public function test_array_key_last_availability() {
+		$this->assertTrue( function_exists( 'array_key_last' ) );
+	}
+
+	/**
+	 * @dataProvider data_array_key_last
+	 *
+	 * @ticket 45055
+	 *
+	 * @param bool  $expected The value of the key extracted to extracted from given array.
+	 * @param array $arr      The array to get last key from.
+	 */
+	public function test_array_key_last( $expected, $arr ) {
+		if ( ! function_exists( 'array_key_last' ) ) {
+			$this->markTestSkipped( 'array_key_last() is not available.' );
+		} else {
+			$this->assertSame( $expected, array_key_last( $arr ) );
+		}
+	}
+
+	/**
+	 * Data provider for test_array_key_last().
+	 *
+	 * @return array
+	 */
+	public function data_array_key_last() {
+		return array(
+			'string key'  => array(
+				'expected' => 'key2',
+				'arr'      => array(
+					'key1' => 'val1',
+					'key2' => 'val2',
+				),
+			),
+			'int key'     => array(
+				'expected' => 1,
+				'arr'      => array(
+					99 => 'val1',
+					1  => 'val2',
+				),
+			),
+			'no key'      => array(
+				'expected' => 1,
+				'arr'      => array( 'val1', 'val2' ),
+			),
+			'multi array' => array(
+				'expected' => 1,
+				'arr'      => array(
+					99 => array( 22 => 'val1' ),
+					1  => 'val2',
+				),
+			),
+			'mixed keys'  => array(
+				'expected' => 1,
+				'arr'      => array(
+					'val1',
+					'key2' => 'val2',
+					'val3',
+				),
+			),
+			'empty array' => array(
+				'expected' => null,
+				'arr'      => array(),
+			),
+		);
+	}
+}
diff --git a/tests/phpunit/tests/compat/strContains.php b/tests/phpunit/tests/compat/strContains.php
new file mode 100644
index 0000000000..c49cb19f23
--- /dev/null
+++ b/tests/phpunit/tests/compat/strContains.php
@@ -0,0 +1,104 @@
+<?php
+
+/**
+ * @group compat
+ *
+ * @covers ::str_contains
+ */
+class Tests_Compat_strContains extends WP_UnitTestCase {
+
+	/**
+	 * Test that str_contains() is always available (either from PHP or WP).
+	 *
+	 * @ticket 49652
+	 */
+	public function test_is_str_contains_availability() {
+		$this->assertTrue( function_exists( 'str_contains' ) );
+	}
+
+	/**
+	 * @dataProvider data_str_contains
+	 *
+	 * @ticket 49652
+	 *
+	 * @param bool   $expected Whether or not `$haystack` is expected to contain `$needle`.
+	 * @param string $haystack The string to search in.
+	 * @param string $needle   The substring to search for in `$haystack`.
+	 */
+	public function test_str_contains( $expected, $haystack, $needle ) {
+		if ( ! function_exists( 'str_contains' ) ) {
+			$this->markTestSkipped( 'str_contains() is not available.' );
+		} else {
+			$this->assertSame(
+				$expected,
+				str_contains( $haystack, $needle )
+			);
+		}
+
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_str_contains() {
+		return array(
+			'empty needle'              => array(
+				'expected' => true,
+				'haystack' => 'This is a Test',
+				'needle'   => '',
+			),
+			'empty haystack and needle' => array(
+				'expected' => true,
+				'haystack' => '',
+				'needle'   => '',
+			),
+			'empty haystack'            => array(
+				'expected' => false,
+				'haystack' => '',
+				'needle'   => 'test',
+			),
+			'start of string'           => array(
+				'expected' => true,
+				'haystack' => 'This is a Test',
+				'needle'   => 'This',
+			),
+			'middle of string'          => array(
+				'expected' => true,
+				'haystack' => 'The needle in middle of string.',
+				'needle'   => 'middle',
+			),
+			'end of string'             => array(
+				'expected' => true,
+				'string'   => 'The needle is at end.',
+				'needle'   => 'end',
+			),
+			'lowercase'                 => array(
+				'expected' => true,
+				'string'   => 'This is a test',
+				'needle'   => 'test',
+			),
+			'uppercase'                 => array(
+				'expected' => true,
+				'string'   => 'This is a TEST',
+				'needle'   => 'TEST',
+			),
+			'camelCase'                 => array(
+				'expected' => true,
+				'string'   => 'String contains camelCase.',
+				'needle'   => 'camelCase',
+			),
+			'with hyphen'               => array(
+				'expected' => true,
+				'string'   => 'String contains foo-bar needle.',
+				'needle'   => 'foo-bar',
+			),
+			'missing'                   => array(
+				'expected' => false,
+				'haystack' => 'This is a camelcase',
+				'needle'   => 'camelCase',
+			),
+		);
+	}
+}
diff --git a/tests/phpunit/tests/compat/strEndsWith.php b/tests/phpunit/tests/compat/strEndsWith.php
new file mode 100644
index 0000000000..75522d6f49
--- /dev/null
+++ b/tests/phpunit/tests/compat/strEndsWith.php
@@ -0,0 +1,115 @@
+<?php
+
+/**
+ * @group compat
+ *
+ * @covers ::str_ends_with
+ */
+class Tests_Compat_StrEndsWith extends WP_UnitTestCase {
+
+	/**
+	 * Test that str_ends_with() is always available (either from PHP or WP).
+	 *
+	 * @ticket 54377
+	 */
+	public function test_str_ends_with_availability() {
+		$this->assertTrue( function_exists( 'str_ends_with' ) );
+	}
+
+	/**
+	 * @dataProvider data_str_ends_with
+	 *
+	 * @ticket 54377
+	 *
+	 * @param bool   $expected Whether or not `$haystack` is expected to end with `$needle`.
+	 * @param string $haystack The string to search in.
+	 * @param string $needle   The substring to search for at the end of `$haystack`.
+	 */
+	public function test_str_ends_with( $expected, $haystack, $needle ) {
+		if ( ! function_exists( 'str_ends_with' ) ) {
+			$this->markTestSkipped( 'str_ends_with() is not available.' );
+		} else {
+			$this->assertSame(
+				$expected,
+				str_ends_with( $haystack, $needle )
+			);
+		}
+
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array[]
+	 */
+	public function data_str_ends_with() {
+		return array(
+			'empty needle'              => array(
+				'expected' => true,
+				'haystack' => 'This is a test',
+				'needle'   => '',
+			),
+			'empty haystack and needle' => array(
+				'expected' => true,
+				'haystack' => '',
+				'needle'   => '',
+			),
+			'empty haystack'            => array(
+				'expected' => false,
+				'haystack' => '',
+				'needle'   => 'test',
+			),
+			'lowercase'                 => array(
+				'expected' => true,
+				'haystack' => 'This is a test',
+				'needle'   => 'test',
+			),
+			'uppercase'                 => array(
+				'expected' => true,
+				'haystack' => 'This is a TEST',
+				'needle'   => 'TEST',
+			),
+			'first letter uppercase'    => array(
+				'expected' => true,
+				'haystack' => 'This is a Test',
+				'needle'   => 'Test',
+			),
+			'camelCase'                 => array(
+				'expected' => true,
+				'haystack' => 'This is a camelCase',
+				'needle'   => 'camelCase',
+			),
+			'null'                      => array(
+				'expected' => true,
+				'haystack' => 'This is a null \x00test',
+				'needle'   => '\x00test',
+			),
+			'trademark'                 => array(
+				'expected' => true,
+				'haystack' => 'This is a trademark\x2122',
+				'needle'   => 'trademark\x2122',
+			),
+			'not camelCase'             => array(
+				'expected' => false,
+				'haystack' => 'This is a cammelcase',
+				'needle'   => 'cammelCase',
+			),
+			'missing'                   => array(
+				'expected' => false,
+				'haystack' => 'This is a cammelcase',
+				'needle'   => 'cammelCase',
+			),
+			'not end'                   => array(
+				'expected' => false,
+				'haystack' => 'This is a test extra',
+				'needle'   => 'test',
+			),
+			'extra space'               => array(
+				'expected' => false,
+				'haystack' => 'This is a test ',
+				'needle'   => 'test',
+			),
+
+		);
+	}
+}
diff --git a/tests/phpunit/tests/compat/strStartsWith.php b/tests/phpunit/tests/compat/strStartsWith.php
new file mode 100644
index 0000000000..9e12ced33b
--- /dev/null
+++ b/tests/phpunit/tests/compat/strStartsWith.php
@@ -0,0 +1,119 @@
+<?php
+
+/**
+ * @group compat
+ *
+ * @covers ::str_starts_with
+ */
+class Tests_Compat_StrStartsWith extends WP_UnitTestCase {
+
+	/**
+	 * Test that str_starts_with() is always available (either from PHP or WP).
+	 *
+	 * @ticket 54377
+	 */
+	public function test_str_starts_with_availability() {
+		$this->assertTrue( function_exists( 'str_starts_with' ) );
+	}
+
+	/**
+	 * @dataProvider data_str_starts_with
+	 *
+	 * @ticket 54377
+	 *
+	 * @param bool   $expected Whether or not `$haystack` is expected to start with `$needle`.
+	 * @param string $haystack The string to search in.
+	 * @param string $needle   The substring to search for at the start of `$haystack`.
+	 */
+	public function test_str_starts_with( $expected, $haystack, $needle ) {
+		if ( ! function_exists( 'str_starts_with' ) ) {
+			$this->markTestSkipped( 'str_starts_with() is not available.' );
+		} else {
+			$this->assertSame(
+				$expected,
+				str_starts_with( $haystack, $needle )
+			);
+		}
+
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array[]
+	 */
+	public function data_str_starts_with() {
+		return array(
+			'empty needle'              => array(
+				'expected' => true,
+				'haystack' => 'This is a test',
+				'needle'   => '',
+			),
+			'empty haystack and needle' => array(
+				'expected' => true,
+				'haystack' => '',
+				'needle'   => '',
+			),
+			'empty haystack'            => array(
+				'expected' => false,
+				'haystack' => '',
+				'needle'   => 'test',
+			),
+			'lowercase'                 => array(
+				'expected' => true,
+				'haystack' => 'this is a test',
+				'needle'   => 'this',
+			),
+			'uppercase'                 => array(
+				'expected' => true,
+				'haystack' => 'THIS is a TEST',
+				'needle'   => 'THIS',
+			),
+			'first letter uppercase'    => array(
+				'expected' => true,
+				'haystack' => 'This is a Test',
+				'needle'   => 'This',
+			),
+			'case mismatch'             => array(
+				'expected' => false,
+				'haystack' => 'This is a test',
+				'needle'   => 'this',
+			),
+			'camelCase'                 => array(
+				'expected' => true,
+				'haystack' => 'camelCase is the start',
+				'needle'   => 'camelCase',
+			),
+			'null'                      => array(
+				'expected' => true,
+				'haystack' => 'This\x00is a null test ',
+				'needle'   => 'This\x00is',
+			),
+			'trademark'                 => array(
+				'expected' => true,
+				'haystack' => 'trademark\x2122 is a null test ',
+				'needle'   => 'trademark\x2122',
+			),
+			'not camelCase'             => array(
+				'expected' => false,
+				'haystack' => ' cammelcase is the start',
+				'needle'   => 'cammelCase',
+			),
+			'missing'                   => array(
+				'expected' => false,
+				'haystack' => 'This is a test',
+				'needle'   => 'camelCase',
+			),
+			'not start'                 => array(
+				'expected' => false,
+				'haystack' => 'This is a test extra',
+				'needle'   => 'test',
+			),
+			'extra_space'               => array(
+				'expected' => false,
+				'haystack' => ' This is a test',
+				'needle'   => 'This',
+			),
+		);
+	}
+}
diff --git a/tests/phpunit/tests/cron.php b/tests/phpunit/tests/cron.php
index 36d5edd7dd..04665b000e 100644
--- a/tests/phpunit/tests/cron.php
+++ b/tests/phpunit/tests/cron.php
@@ -270,7 +270,7 @@ class Tests_Cron extends WP_UnitTestCase {
 	 */
 	public function test_unschedule_hook() {
 		$hook = __FUNCTION__;
-		$args = array( rand_str() );
+		$args = array( 'foo' );
 
 		// Schedule several events with and without arguments.
 		wp_schedule_single_event( strtotime( '+1 hour' ), $hook );
diff --git a/tests/phpunit/tests/date/currentDatetime.php b/tests/phpunit/tests/date/currentDatetime.php
new file mode 100644
index 0000000000..21ef037897
--- /dev/null
+++ b/tests/phpunit/tests/date/currentDatetime.php
@@ -0,0 +1,16 @@
+<?php
+
+/**
+ * @group date
+ * @group datetime
+ * @covers ::current_datetime
+ */
+class Tests_Date_CurrentDatetime extends WP_UnitTestCase {
+
+	/**
+	 * @ticket 53484
+	 */
+	public function test_current_datetime_return_type() {
+		$this->assertInstanceOf( 'DateTimeImmutable', current_datetime() );
+	}
+}
diff --git a/tests/phpunit/tests/date/xmlrpc.php b/tests/phpunit/tests/date/xmlrpc.php
index 8f8fb2859d..8a4efaf46d 100644
--- a/tests/phpunit/tests/date/xmlrpc.php
+++ b/tests/phpunit/tests/date/xmlrpc.php
@@ -228,7 +228,7 @@ class Tests_Date_XMLRPC extends WP_XMLRPC_UnitTestCase {
 			'comment_author'       => 'Test commenter',
 			'comment_author_url'   => 'http://example.com/',
 			'comment_author_email' => 'example@example.com',
-			'comment_content'      => rand_str( 100 ),
+			'comment_content'      => 'Hello, world!',
 			'comment_approved'     => '1',
 		);
 		$comment_id   = wp_insert_comment( $comment_data );
diff --git a/tests/phpunit/tests/db.php b/tests/phpunit/tests/db.php
index e10de7126e..25c674510c 100644
--- a/tests/phpunit/tests/db.php
+++ b/tests/phpunit/tests/db.php
@@ -33,6 +33,8 @@ class Tests_DB extends WP_UnitTestCase {
 		parent::set_up();
 		$this->_queries = array();
 		add_filter( 'query', array( $this, 'query_filter' ) );
+		self::$_wpdb->last_error     = null;
+		$GLOBALS['wpdb']->last_error = null;
 	}
 
 	/**
@@ -1095,6 +1097,170 @@ class Tests_DB extends WP_UnitTestCase {
 		return 'fake_col_charset';
 	}
 
+	/**
+	 * @dataProvider data_process_single_field_invalid_data
+	 * @dataProvider data_process_multiple_fields_invalid_data
+	 *
+	 * @ticket 32315
+	 *
+	 * @covers wpdb::process_fields
+	 *
+	 * @param array  $data           Data to process.
+	 * @param string $errored_fields Expected fields in the error message.
+	 */
+	public function test_process_fields_value_too_long_for_field( array $data, $errored_fields ) {
+		global $wpdb;
+
+		$this->assertFalse( self::$_wpdb->process_fields( $wpdb->posts, $data, null ) );
+		$this->assertSame( $this->get_db_error_value_too_long( $errored_fields ), self::$_wpdb->last_error );
+	}
+
+	/**
+	 * @dataProvider data_process_single_field_invalid_data
+	 *
+	 * @ticket 32315
+	 *
+	 * @covers wpdb::insert
+	 *
+	 * @param array  $data           Data to process.
+	 * @param string $errored_fields Expected fields in the error message.
+	 */
+	public function test_insert_value_too_long_for_field( array $data, $errored_fields ) {
+		global $wpdb;
+
+		$this->assertFalse( $wpdb->insert( $wpdb->posts, $data ) );
+		$this->assertSame( $this->get_db_error_value_too_long( $errored_fields ), $wpdb->last_error );
+	}
+
+	/**
+	 * @dataProvider data_process_single_field_invalid_data
+	 *
+	 * @ticket 32315
+	 *
+	 * @covers wpdb::replace
+	 *
+	 * @param array  $data           Data to process.
+	 * @param string $errored_fields Expected fields in the error message.
+	 */
+	public function test_replace_value_too_long_for_field( array $data, $errored_fields ) {
+		global $wpdb;
+
+		$this->assertFalse( $wpdb->replace( $wpdb->posts, $data ) );
+		$this->assertSame( $this->get_db_error_value_too_long( $errored_fields ), $wpdb->last_error );
+	}
+
+	/**
+	 * @dataProvider data_process_single_field_invalid_data
+	 *
+	 * @ticket 32315
+	 *
+	 * @covers wpdb::update
+	 *
+	 * @param array  $data           Data to process.
+	 * @param string $errored_fields Expected fields in the error message.
+	 */
+	public function test_update_value_too_long_for_field( array $data, $errored_fields ) {
+		global $wpdb;
+
+		$this->assertFalse( $wpdb->update( $wpdb->posts, $data, array() ) );
+		$this->assertSame( $this->get_db_error_value_too_long( $errored_fields ), $wpdb->last_error );
+	}
+
+	/**
+	 * @dataProvider data_process_single_field_invalid_data
+	 *
+	 * @ticket 32315
+	 *
+	 * @covers wpdb::delete
+	 *
+	 * @param array  $data           Data to process.
+	 * @param string $errored_fields Expected fields in the error message.
+	 */
+	public function test_delete_value_too_long_for_field( array $data, $errored_fields ) {
+		global $wpdb;
+
+		$this->assertFalse( $wpdb->delete( $wpdb->posts, $data, array() ) );
+		$this->assertSame( $this->get_db_error_value_too_long( $errored_fields ), $wpdb->last_error );
+	}
+
+	/**
+	 * Assert the error message matches the fields.
+	 *
+	 * @param string $errored_fields Expected fields in the error message.
+	 */
+	private function get_db_error_value_too_long( $errored_fields ) {
+		if ( str_contains( $errored_fields, ', ' ) ) {
+			return sprintf(
+				'WordPress database error: Processing the values for the following fields failed: %s. ' .
+				'The supplied values may be too long or contain invalid data.',
+				$errored_fields
+			);
+		}
+		return sprintf(
+			'WordPress database error: Processing the value for the following field failed: %s. ' .
+			'The supplied value may be too long or contains invalid data.',
+			$errored_fields
+		);
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_process_single_field_invalid_data() {
+		return array(
+			'too long'      => array(
+				'data'           => array( 'post_status' => str_repeat( 'a', 21 ) ),
+				'errored_fields' => 'post_status',
+			),
+			'invalid chars' => array(
+				'data'           => array( 'post_status' => "\xF5" ),
+				'errored_fields' => 'post_status',
+			),
+		);
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_process_multiple_fields_invalid_data() {
+		return array(
+			'too long'      => array(
+				'data'           => array(
+					'post_status'  => str_repeat( 'a', 21 ),
+					'post_content' => "\xF5",
+				),
+				'errored_fields' => 'post_status, post_content',
+			),
+			'invalid chars' => array(
+				'data'           => array(
+					'post_status' => "\xF5",
+					'post_name'   => str_repeat( "\xF5", 21 ),
+				),
+				'errored_fields' => 'post_status, post_name',
+			),
+		);
+	}
+
+	/**
+	 * @ticket 32315
+	 */
+	public function test_query_value_contains_invalid_chars() {
+		global $wpdb;
+
+		$this->assertFalse(
+			$wpdb->query( "INSERT INTO {$wpdb->posts} (post_status) VALUES ('\xF5')" )
+		);
+
+		$this->assertSame(
+			'WordPress database error: Could not perform query because it contains invalid data.',
+			$wpdb->last_error
+		);
+	}
+
 	/**
 	 * @ticket 15158
 	 */
diff --git a/tests/phpunit/tests/db/charset.php b/tests/phpunit/tests/db/charset.php
index 146ede65d1..1ccdf183ce 100644
--- a/tests/phpunit/tests/db/charset.php
+++ b/tests/phpunit/tests/db/charset.php
@@ -767,10 +767,10 @@ class Tests_DB_Charset extends WP_UnitTestCase {
 		self::$_wpdb->query( $create );
 
 		$charset = self::$_wpdb->get_table_charset( $table );
-		$this->assertSame( $charset, $expected_charset );
+		$this->assertSame( $expected_charset, $charset );
 
 		$charset = self::$_wpdb->get_table_charset( strtoupper( $table ) );
-		$this->assertSame( $charset, $expected_charset );
+		$this->assertSame( $expected_charset, $charset );
 
 		self::$_wpdb->query( $drop );
 	}
diff --git a/tests/phpunit/tests/dependencies.php b/tests/phpunit/tests/dependencies.php
index 354bfd376e..0087a0c143 100644
--- a/tests/phpunit/tests/dependencies.php
+++ b/tests/phpunit/tests/dependencies.php
@@ -136,4 +136,18 @@ class Tests_Dependencies extends WP_UnitTestCase {
 		$this->assertFalse( $dep->query( 'one' ) );
 
 	}
+
+	function test_enqueue_before_register() {
+		$dep = new WP_Dependencies;
+
+		$this->assertArrayNotHasKey( 'one', $dep->registered );
+
+		$dep->enqueue( 'one' );
+
+		$this->assertNotContains( 'one', $dep->queue );
+
+		$this->assertTrue( $dep->add( 'one', '' ) );
+
+		$this->assertContains( 'one', $dep->queue );
+	}
 }
diff --git a/tests/phpunit/tests/dependencies/styles.php b/tests/phpunit/tests/dependencies/styles.php
index f5eed18758..6af0b09866 100644
--- a/tests/phpunit/tests/dependencies/styles.php
+++ b/tests/phpunit/tests/dependencies/styles.php
@@ -189,6 +189,56 @@ class Tests_Dependencies_Styles extends WP_UnitTestCase {
 
 	}
 
+	/**
+	 * Test normalizing relative links in CSS.
+	 *
+	 * @dataProvider data_normalize_relative_css_links
+	 *
+	 * @ticket 54243
+	 * @ticket 54922
+	 *
+	 * @covers ::_wp_normalize_relative_css_links
+	 *
+	 * @param string $css      Given CSS to test.
+	 * @param string $expected Expected result.
+	 */
+	public function test_normalize_relative_css_links( $css, $expected ) {
+		$this->assertSame(
+			$expected,
+			_wp_normalize_relative_css_links( $css, site_url( 'wp-content/themes/test/style.css' ) )
+		);
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_normalize_relative_css_links() {
+		return array(
+			'Double quotes, same path'                     => array(
+				'css'      => 'p {background:url( "image0.svg" );}',
+				'expected' => 'p {background:url( "/wp-content/themes/test/image0.svg" );}',
+			),
+			'Single quotes, same path, prefixed with "./"' => array(
+				'css'      => 'p {background-image: url(\'./image2.png\');}',
+				'expected' => 'p {background-image: url(\'/wp-content/themes/test/image2.png\');}',
+			),
+			'Single quotes, one level up, prefixed with "../"' => array(
+				'css'      => 'p {background-image: url(\'../image1.jpg\');}',
+				'expected' => 'p {background-image: url(\'/wp-content/themes/test/../image1.jpg\');}',
+			),
+			'External URLs, shouldn\'t change'             => array(
+				'css'      => 'p {background-image: url(\'http://foo.com/image2.png\');}',
+				'expected' => 'p {background-image: url(\'http://foo.com/image2.png\');}',
+			),
+			'An HTML ID'                                   => array(
+				'css'      => 'clip-path: url(#image1);',
+				'expected' => 'clip-path: url(#image1);',
+			),
+		);
+	}
+
 	/**
 	 * Test if multiple inline styles work
 	 *
diff --git a/tests/phpunit/tests/external-http/basic.php b/tests/phpunit/tests/external-http/basic.php
index 61f1f2d129..b160e2b56f 100644
--- a/tests/phpunit/tests/external-http/basic.php
+++ b/tests/phpunit/tests/external-http/basic.php
@@ -9,7 +9,7 @@ class Tests_External_HTTP_Basic extends WP_UnitTestCase {
 	 * @covers ::wp_remote_retrieve_response_code
 	 * @covers ::wp_remote_retrieve_body
 	 */
-	public function test_readme() {
+	public function test_readme_php_version() {
 		// This test is designed to only run on trunk/master.
 		$this->skipOnAutomatedBranches();
 
@@ -17,34 +17,79 @@ class Tests_External_HTTP_Basic extends WP_UnitTestCase {
 
 		preg_match( '#Recommendations.*PHP</a> version <strong>([0-9.]*)#s', $readme, $matches );
 
-		$response = wp_remote_get( 'https://www.php.net/supported-versions.php' );
+		$response_body = $this->get_response_body( 'https://www.php.net/supported-versions.php' );
 
-		$this->skipTestOnTimeout( $response );
+		preg_match_all( '#<tr class="stable">\s*<td>\s*<a [^>]*>\s*([0-9.]*)#s', $response_body, $php_matches );
 
-		$response_code = wp_remote_retrieve_response_code( $response );
-		$response_body = wp_remote_retrieve_body( $response );
+		// TODO: Enable this check once PHP 8.0 compatibility is achieved.
+		// $this->assertContains( $matches[1], $php_matches[1], "readme.html's Recommended PHP version is too old. Remember to update the WordPress.org Requirements page, too." );
+	}
 
-		if ( 200 !== $response_code ) {
-			$error_message = sprintf(
-				'Could not contact PHP.net to check versions. Response code: %s. Response body: %s',
-				$response_code,
-				$response_body
-			);
+	/**
+	 * @covers ::wp_remote_get
+	 * @covers ::wp_remote_retrieve_response_code
+	 * @covers ::wp_remote_retrieve_body
+	 */
+	public function test_readme_mysql_version() {
+		// This test is designed to only run on trunk/master.
+		$this->skipOnAutomatedBranches();
 
-			if ( 503 === $response_code ) {
-				$this->markTestSkipped( $error_message );
-			}
+		$readme = file_get_contents( ABSPATH . 'readme.html' );
 
-			$this->fail( $error_message );
-		}
+		preg_match( '#Recommendations.*MySQL</a> version <strong>([0-9.]*)#s', $readme, $matches );
 
-		preg_match_all( '#<tr class="stable">\s*<td>\s*<a [^>]*>\s*([0-9.]*)#s', $response_body, $phpmatches );
+		$response_body = $this->get_response_body( "https://dev.mysql.com/doc/relnotes/mysql/{$matches[1]}/en/" );
 
-		$this->assertContains( $matches[1], $phpmatches[1], "readme.html's Recommended PHP version is too old. Remember to update the WordPress.org Requirements page, too." );
+		// Retrieve the date of the first GA release for the recommended branch.
+		preg_match( '#.*(\d{4}-\d{2}-\d{2}), General Availability#s', $response_body, $mysql_matches );
 
-		preg_match( '#Recommendations.*MySQL</a> version <strong>([0-9.]*)#s', $readme, $matches );
+		/*
+		 * Per https://www.mysql.com/support/, Oracle actively supports MySQL releases for 5 years from GA release.
+		 *
+		 * The currently recommended MySQL 5.7 branch moved from active support to extended support on 2020-10-21.
+		 * As WordPress core is not fully compatible with MySQL 8.0 at this time, the "supported" period here
+		 * is increased to 8 years to include extended support.
+		 *
+		 * TODO: Reduce this back to 5 years once MySQL 8.0 compatibility is achieved.
+		 */
+		$mysql_eol = strtotime( $mysql_matches[1] . ' +8 years' );
 
-		$response = wp_remote_get( "https://dev.mysql.com/doc/relnotes/mysql/{$matches[1]}/en/" );
+		$this->assertLessThan( $mysql_eol, time(), "readme.html's Recommended MySQL version is too old. Remember to update the WordPress.org Requirements page, too." );
+	}
+
+	/**
+	 * @covers ::wp_remote_get
+	 * @covers ::wp_remote_retrieve_response_code
+	 * @covers ::wp_remote_retrieve_body
+	 */
+	public function test_readme_mariadb_version() {
+		// This test is designed to only run on trunk/master.
+		$this->skipOnAutomatedBranches();
+
+		$readme = file_get_contents( ABSPATH . 'readme.html' );
+
+		preg_match( '#Recommendations.*MariaDB</a> version <strong>([0-9.]*)#s', $readme, $matches );
+		$matches[1] = str_replace( '.', '', $matches[1] );
+
+		$response_body = $this->get_response_body( "https://mariadb.com/kb/en/release-notes-mariadb-{$matches[1]}-series/" );
+
+		// Retrieve the date of the first stable release for the recommended branch.
+		preg_match( '#.*Stable.*?(\d{2} [A-Za-z]{3} \d{4})#s', $response_body, $mariadb_matches );
+
+		// Per https://mariadb.org/about/#maintenance-policy, MariaDB releases are supported for 5 years.
+		$mariadb_eol = strtotime( $mariadb_matches[1] . ' +5 years' );
+
+		$this->assertLessThan( $mariadb_eol, time(), "readme.html's Recommended MariaDB version is too old. Remember to update the WordPress.org Requirements page, too." );
+	}
+
+	/**
+	 * Helper function to retrieve the response body or skip the test on HTTP timeout.
+	 *
+	 * @param string $url The URL to retrieve the response from.
+	 * @return string The response body.
+	 */
+	public function get_response_body( $url ) {
+		$response = wp_remote_get( $url );
 
 		$this->skipTestOnTimeout( $response );
 
@@ -52,8 +97,11 @@ class Tests_External_HTTP_Basic extends WP_UnitTestCase {
 		$response_body = wp_remote_retrieve_body( $response );
 
 		if ( 200 !== $response_code ) {
+			$parsed_url = parse_url( $url );
+
 			$error_message = sprintf(
-				'Could not contact dev.MySQL.com to check versions. Response code: %s. Response body: %s',
+				'Could not contact %1$s to check versions. Response code: %2$s. Response body: %3$s',
+				$parsed_url['host'],
 				$response_code,
 				$response_body
 			);
@@ -65,11 +113,6 @@ class Tests_External_HTTP_Basic extends WP_UnitTestCase {
 			$this->fail( $error_message );
 		}
 
-		preg_match( '#(\d{4}-\d{2}-\d{2}), General Availability#', $response_body, $mysqlmatches );
-
-		// Per https://www.mysql.com/support/, Oracle actively supports MySQL releases for 5 years from GA release.
-		$mysql_eol = strtotime( $mysqlmatches[1] . ' +5 years' );
-
-		$this->assertLessThan( $mysql_eol, time(), "readme.html's Recommended MySQL version is too old. Remember to update the WordPress.org Requirements page, too." );
+		return $response_body;
 	}
 }
diff --git a/tests/phpunit/tests/feed/atom.php b/tests/phpunit/tests/feed/atom.php
index 0b26c7cb57..7b9ca4c405 100644
--- a/tests/phpunit/tests/feed/atom.php
+++ b/tests/phpunit/tests/feed/atom.php
@@ -99,7 +99,6 @@ class Tests_Feed_Atom extends WP_UnitTestCase {
 		// Verify attributes.
 		$this->assertSame( 'http://www.w3.org/2005/Atom', $atom[0]['attributes']['xmlns'] );
 		$this->assertSame( 'http://purl.org/syndication/thread/1.0', $atom[0]['attributes']['xmlns:thr'] );
-		$this->assertSame( site_url( '/wp-atom.php' ), $atom[0]['attributes']['xml:base'] );
 
 		// Verify the <feed> element is present and contains a <title> child element.
 		$title = xml_find( $xml, 'feed', 'title' );
diff --git a/tests/phpunit/tests/file.php b/tests/phpunit/tests/file.php
index eb6168d9af..311ba30339 100644
--- a/tests/phpunit/tests/file.php
+++ b/tests/phpunit/tests/file.php
@@ -96,8 +96,8 @@ class Tests_File extends WP_UnitTestCase {
 			return false;
 		}
 
-		// Write some random contents.
-		$c = rand_str();
+		// Write some contents.
+		$c = 'foo';
 		fwrite( $fp, $c );
 		fclose( $fp );
 
diff --git a/tests/phpunit/tests/formatting/balanceTags.php b/tests/phpunit/tests/formatting/balanceTags.php
index 4726cf24db..11740c98a3 100644
--- a/tests/phpunit/tests/formatting/balanceTags.php
+++ b/tests/phpunit/tests/formatting/balanceTags.php
@@ -7,10 +7,15 @@ class Tests_Formatting_BalanceTags extends WP_UnitTestCase {
 
 	public function nestable_tags() {
 		return array(
+			array( 'article' ),
+			array( 'aside' ),
 			array( 'blockquote' ),
+			array( 'details' ),
 			array( 'div' ),
+			array( 'figure' ),
 			array( 'object' ),
 			array( 'q' ),
+			array( 'section' ),
 			array( 'span' ),
 		);
 	}
@@ -34,6 +39,8 @@ class Tests_Formatting_BalanceTags extends WP_UnitTestCase {
 			array( 'meta' ),
 			array( 'param' ),
 			array( 'source' ),
+			array( 'track' ),
+			array( 'wbr' ),
 		);
 	}
 
diff --git a/tests/phpunit/tests/formatting/sanitizeKey.php b/tests/phpunit/tests/formatting/sanitizeKey.php
new file mode 100644
index 0000000000..0fb5d905df
--- /dev/null
+++ b/tests/phpunit/tests/formatting/sanitizeKey.php
@@ -0,0 +1,140 @@
+<?php
+
+/**
+ * @group formatting
+ * @covers ::sanitize_key
+ */
+class Tests_Formatting_SanitizeKey extends WP_UnitTestCase {
+
+	/**
+	 * @ticket       54160
+	 * @dataProvider data_sanitize_key
+	 *
+	 * @param string $key      The key to sanitize.
+	 * @param string $expected The expected value.
+	 */
+	public function test_sanitize_key( $key, $expected ) {
+		$this->assertSame( $expected, sanitize_key( $key ) );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_sanitize_key() {
+		return array(
+			'an empty string key'            => array(
+				'key'      => '',
+				'expected' => '',
+			),
+			'a lowercase key with commas'    => array(
+				'key'      => 'howdy,admin',
+				'expected' => 'howdyadmin',
+			),
+			'a lowercase key with commas'    => array(
+				'key'      => 'HOWDY,ADMIN',
+				'expected' => 'howdyadmin',
+			),
+			'a mixed case key with commas'   => array(
+				'key'      => 'HoWdY,aDmIn',
+				'expected' => 'howdyadmin',
+			),
+			'a key with dashes'              => array(
+				'key'      => 'howdy-admin',
+				'expected' => 'howdy-admin',
+			),
+			'a key with spaces'              => array(
+				'key'      => 'howdy admin',
+				'expected' => 'howdyadmin',
+			),
+			'a key with a HTML entity'       => array(
+				'key'      => 'howdy&nbsp;admin',
+				'expected' => 'howdynbspadmin',
+			),
+			'a key with a unicode character' => array(
+				'key'      => 'howdy' . chr( 140 ) . 'admin',
+				'expected' => 'howdyadmin',
+			),
+		);
+	}
+
+	/**
+	 * @ticket       54160
+	 * @dataProvider data_sanitize_key_nonstring_scalar
+	 *
+	 * @param mixed  $key      The key to sanitize.
+	 * @param string $expected The expected value.
+	 */
+	public function test_sanitize_key_nonstring_scalar( $key, $expected ) {
+		$this->assertSame( $expected, sanitize_key( $key ) );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_sanitize_key_nonstring_scalar() {
+		return array(
+			'integer type'  => array(
+				'key'      => 0,
+				'expected' => '0',
+			),
+			'boolean true'  => array(
+				'key'      => true,
+				'expected' => '1',
+			),
+			'boolean false' => array(
+				'key'      => false,
+				'expected' => '',
+			),
+			'float type'    => array(
+				'key'      => 0.123,
+				'expected' => '0123',
+			),
+		);
+	}
+
+	/**
+	 * @ticket       54160
+	 * @dataProvider data_sanitize_key_with_non_scalars
+	 *
+	 * @param mixed $nonscalar_key A non-scalar data type given as a key.
+	 */
+	public function test_sanitize_key_with_non_scalars( $nonscalar_key ) {
+		add_filter(
+			'sanitize_key',
+			function ( $sanitized_key, $key ) use ( $nonscalar_key ) {
+				$this->assertEmpty( $sanitized_key, 'Empty string not passed as first filtered argument' );
+				$this->assertSame( $nonscalar_key, $key, 'Given unsanitized key not passed as second filtered argument' );
+				return $sanitized_key;
+			},
+			10,
+			2
+		);
+		$this->assertEmpty( sanitize_key( $nonscalar_key ), 'Non-scalar key did not return empty string' );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_sanitize_key_with_non_scalars() {
+		return array(
+			'array type' => array(
+				'key'      => array( 'key' ),
+				'expected' => '',
+			),
+			'null'       => array(
+				'key'      => null,
+				'expected' => '',
+			),
+			'object'     => array(
+				'key'      => new stdClass(),
+				'expected' => '',
+			),
+		);
+	}
+}
diff --git a/tests/phpunit/tests/functions.php b/tests/phpunit/tests/functions.php
index bcf8525216..96dee380ec 100644
--- a/tests/phpunit/tests/functions.php
+++ b/tests/phpunit/tests/functions.php
@@ -665,6 +665,62 @@ class Tests_Functions extends WP_UnitTestCase {
 		$this->assertSame( 'foo=bar&1=2', $url );
 	}
 
+	/**
+	 * Tests that add_query_arg removes the question mark when
+	 * a parameter is set to false.
+	 *
+	 * @dataProvider data_add_query_arg_removes_question_mark
+	 *
+	 * @ticket 44499
+	 * @group  add_query_arg
+	 *
+	 * @covers ::add_query_arg
+	 *
+	 * @param string $url      Url to test.
+	 * @param string $expected Expected URL.
+	 */
+	public function test_add_query_arg_removes_question_mark( $url, $expected, $key = 'param', $value = false ) {
+		$this->assertSame( $expected, add_query_arg( $key, $value, $url ) );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_add_query_arg_removes_question_mark() {
+		return array(
+			'anchor'                                     => array(
+				'url'      => 'http://example.org?#anchor',
+				'expected' => 'http://example.org#anchor',
+			),
+			'/ then anchor'                              => array(
+				'url'      => 'http://example.org/?#anchor',
+				'expected' => 'http://example.org/#anchor',
+			),
+			'invalid query param and anchor'             => array(
+				'url'      => 'http://example.org?param=value#anchor',
+				'expected' => 'http://example.org#anchor',
+			),
+			'/ then invalid query param and anchor'      => array(
+				'url'      => 'http://example.org/?param=value#anchor',
+				'expected' => 'http://example.org/#anchor',
+			),
+			'?#anchor when adding valid key/value args'  => array(
+				'url'      => 'http://example.org?#anchor',
+				'expected' => 'http://example.org?foo=bar#anchor',
+				'key'      => 'foo',
+				'value'    => 'bar',
+			),
+			'/?#anchor when adding valid key/value args' => array(
+				'url'      => 'http://example.org/?#anchor',
+				'expected' => 'http://example.org/?foo=bar#anchor',
+				'key'      => 'foo',
+				'value'    => 'bar',
+			),
+		);
+	}
+
 	/**
 	 * @ticket 21594
 	 */
diff --git a/tests/phpunit/tests/functions/doEnclose.php b/tests/phpunit/tests/functions/doEnclose.php
index 5c8a42089f..a72b603061 100644
--- a/tests/phpunit/tests/functions/doEnclose.php
+++ b/tests/phpunit/tests/functions/doEnclose.php
@@ -25,7 +25,7 @@ class Tests_Functions_DoEnclose extends WP_UnitTestCase {
 	 */
 	public function set_up() {
 		parent::set_up();
-		add_filter( 'pre_http_request', array( $this, 'fake_http_request' ), 10, 3 );
+		add_filter( 'pre_http_request', array( $this, 'mock_http_request' ), 10, 3 );
 	}
 
 	/**
@@ -250,17 +250,16 @@ class Tests_Functions_DoEnclose extends WP_UnitTestCase {
 	}
 
 	/**
-	 * Fake the HTTP request response.
+	 * Mock the HTTP request response.
 	 *
 	 * @since 5.3.0
 	 *
 	 * @param bool   $false     False.
 	 * @param array  $arguments Request arguments.
 	 * @param string $url       Request URL.
-	 *
 	 * @return array            Header.
 	 */
-	public function fake_http_request( $false, $arguments, $url ) {
+	public function mock_http_request( $false, $arguments, $url ) {
 
 		// Video and audio headers.
 		$fake_headers = array(
diff --git a/tests/phpunit/tests/functions/wpIsNumericArray.php b/tests/phpunit/tests/functions/wpIsNumericArray.php
new file mode 100644
index 0000000000..309f901e35
--- /dev/null
+++ b/tests/phpunit/tests/functions/wpIsNumericArray.php
@@ -0,0 +1,70 @@
+<?php
+
+/**
+ * @group functions.php
+ * @covers ::wp_is_numeric_array
+ */
+class Tests_Functions_wpIsNumericArray extends WP_UnitTestCase {
+
+	/**
+	 * @dataProvider data_wp_is_numeric_array
+	 *
+	 * @ticket 53971
+	 *
+	 * @param mixed $input    Input to test.
+	 * @param array $expected Expected result.
+	 */
+	public function test_wp_is_numeric_array( $input, $expected ) {
+		$this->assertSame( $expected, wp_is_numeric_array( $input ) );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array[]
+	 */
+	public function data_wp_is_numeric_array() {
+		return array(
+			'no index'             => array(
+				'test_array' => array( 'www', 'eee' ),
+				'expected'   => true,
+			),
+			'text index'           => array(
+				'test_array' => array( 'www' => 'eee' ),
+				'expected'   => false,
+			),
+			'numeric index'        => array(
+				'test_array' => array( 99 => 'eee' ),
+				'expected'   => true,
+			),
+			'- numeric index'      => array(
+				'test_array' => array( -11 => 'eee' ),
+				'expected'   => true,
+			),
+			'numeric string index' => array(
+				'test_array' => array( '11' => 'eee' ),
+				'expected'   => true,
+			),
+			'nested number index'  => array(
+				'test_array' => array(
+					'next' => array(
+						11 => 'vvv',
+					),
+				),
+				'expected'   => false,
+			),
+			'nested string index'  => array(
+				'test_array' => array(
+					'11' => array(
+						'eee' => 'vvv',
+					),
+				),
+				'expected'   => true,
+			),
+			'not an array'         => array(
+				'test_array' => null,
+				'expected'   => false,
+			),
+		);
+	}
+}
diff --git a/tests/phpunit/tests/general/wpTitle.php b/tests/phpunit/tests/general/wpTitle.php
new file mode 100644
index 0000000000..272441a968
--- /dev/null
+++ b/tests/phpunit/tests/general/wpTitle.php
@@ -0,0 +1,62 @@
+<?php
+
+/**
+ * @group general
+ * @group template
+ * @covers ::wp_title
+ */
+class Tests_General_WpTitle extends WP_UnitTestCase {
+
+	/**
+	 * @ticket 31521
+	 *
+	 * @dataProvider data_wp_title_archive
+	 */
+	public function test_wp_title_archive( $query, $expected ) {
+		self::factory()->post->create(
+			array(
+				'post_status' => 'publish',
+				'post_title'  => 'Test Post',
+				'post_type'   => 'post',
+				'post_date'   => '2021-11-01 18:52:17',
+			)
+		);
+		$this->go_to( '?m=' . $query );
+
+		$this->assertSame( $expected, wp_title( '&raquo;', false ) );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_wp_title_archive() {
+		return array(
+			'year with posts'                => array(
+				'query'    => '2021',
+				'expected' => ' &raquo; 2021',
+			),
+			'year without posts'             => array(
+				'query'    => '1910',
+				'expected' => ' &raquo; Page not found',
+			),
+			'year and month with posts'      => array(
+				'query'    => '202111',
+				'expected' => ' &raquo; 2021 &raquo; November',
+			),
+			'year and month without posts'   => array(
+				'query'    => '202101',
+				'expected' => ' &raquo; Page not found',
+			),
+			'year, month, day with posts'    => array(
+				'query'    => '20211101',
+				'expected' => ' &raquo; 2021 &raquo; November &raquo; 1',
+			),
+			'year, month, day without posts' => array(
+				'query'    => '20210101',
+				'expected' => ' &raquo; Page not found',
+			),
+		);
+	}
+}
diff --git a/tests/phpunit/tests/hooks/addFilter.php b/tests/phpunit/tests/hooks/addFilter.php
index 5890f22044..593ba509b8 100644
--- a/tests/phpunit/tests/hooks/addFilter.php
+++ b/tests/phpunit/tests/hooks/addFilter.php
@@ -15,8 +15,8 @@ class Tests_Hooks_AddFilter extends WP_UnitTestCase {
 		$callback      = '__return_null';
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
 
@@ -30,8 +30,8 @@ class Tests_Hooks_AddFilter extends WP_UnitTestCase {
 		$callback      = array( $a, 'action' );
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
 
@@ -44,8 +44,8 @@ class Tests_Hooks_AddFilter extends WP_UnitTestCase {
 		$callback      = array( 'MockAction', 'action' );
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
 
@@ -59,8 +59,8 @@ class Tests_Hooks_AddFilter extends WP_UnitTestCase {
 		$callback_two  = '__return_false';
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback_one, $priority, $accepted_args );
 		$this->assertCount( 1, $hook->callbacks[ $priority ] );
@@ -74,8 +74,8 @@ class Tests_Hooks_AddFilter extends WP_UnitTestCase {
 		$callback_two  = '__return_false';
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback_one, $priority, $accepted_args );
 		$this->assertCount( 1, $hook->callbacks[ $priority ] );
@@ -89,8 +89,8 @@ class Tests_Hooks_AddFilter extends WP_UnitTestCase {
 		$callback      = '__return_null';
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
 		$this->assertCount( 1, $hook->callbacks[ $priority ] );
@@ -103,8 +103,8 @@ class Tests_Hooks_AddFilter extends WP_UnitTestCase {
 		$callback      = '__return_null';
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
 		$this->assertCount( 1, $hook->callbacks[ $priority ] );
diff --git a/tests/phpunit/tests/hooks/applyFilters.php b/tests/phpunit/tests/hooks/applyFilters.php
index fcb8e3b126..388f85c5c2 100644
--- a/tests/phpunit/tests/hooks/applyFilters.php
+++ b/tests/phpunit/tests/hooks/applyFilters.php
@@ -13,8 +13,8 @@ class Tests_Hooks_ApplyFilters extends WP_UnitTestCase {
 		$callback      = array( $a, 'filter' );
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 		$arg           = __FUNCTION__ . '_arg';
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
@@ -30,8 +30,8 @@ class Tests_Hooks_ApplyFilters extends WP_UnitTestCase {
 		$callback      = array( $a, 'filter' );
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 		$arg           = __FUNCTION__ . '_arg';
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
diff --git a/tests/phpunit/tests/hooks/doAction.php b/tests/phpunit/tests/hooks/doAction.php
index 0fb5652f3b..5ac1d4d4b9 100644
--- a/tests/phpunit/tests/hooks/doAction.php
+++ b/tests/phpunit/tests/hooks/doAction.php
@@ -21,8 +21,8 @@ class Tests_Hooks_DoAction extends WP_UnitTestCase {
 		$callback      = array( $a, 'action' );
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 		$arg           = __FUNCTION__ . '_arg';
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
@@ -36,8 +36,8 @@ class Tests_Hooks_DoAction extends WP_UnitTestCase {
 		$callback      = array( $a, 'filter' );
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 		$arg           = __FUNCTION__ . '_arg';
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
@@ -54,8 +54,8 @@ class Tests_Hooks_DoAction extends WP_UnitTestCase {
 		$callback_two  = array( $b, 'filter' );
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 		$arg           = __FUNCTION__ . '_arg';
 
 		$hook->add_filter( $tag, $callback_one, $priority, $accepted_args );
@@ -73,8 +73,8 @@ class Tests_Hooks_DoAction extends WP_UnitTestCase {
 		$callback_two  = array( $b, 'filter' );
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 		$arg           = __FUNCTION__ . '_arg';
 
 		$hook->add_filter( $tag, $callback_one, $priority, $accepted_args );
@@ -89,7 +89,7 @@ class Tests_Hooks_DoAction extends WP_UnitTestCase {
 		$callback      = array( $this, '_action_callback' );
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
+		$priority      = 1;
 		$accepted_args = 0;
 		$arg           = __FUNCTION__ . '_arg';
 
@@ -103,7 +103,7 @@ class Tests_Hooks_DoAction extends WP_UnitTestCase {
 		$callback      = array( $this, '_action_callback' );
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
+		$priority      = 1;
 		$accepted_args = 1;
 		$arg           = __FUNCTION__ . '_arg';
 
@@ -117,7 +117,7 @@ class Tests_Hooks_DoAction extends WP_UnitTestCase {
 		$callback      = array( $this, '_action_callback' );
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
+		$priority      = 100;
 		$accepted_args = 1000;
 		$arg           = __FUNCTION__ . '_arg';
 
diff --git a/tests/phpunit/tests/hooks/doAllHook.php b/tests/phpunit/tests/hooks/doAllHook.php
index 29eec96428..776c3e4576 100644
--- a/tests/phpunit/tests/hooks/doAllHook.php
+++ b/tests/phpunit/tests/hooks/doAllHook.php
@@ -13,8 +13,8 @@ class Tests_Hooks_DoAllHook extends WP_UnitTestCase {
 		$callback      = array( $a, 'action' );
 		$hook          = new WP_Hook();
 		$tag           = 'all';
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 		$arg           = 'all_arg';
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
diff --git a/tests/phpunit/tests/hooks/hasFilter.php b/tests/phpunit/tests/hooks/hasFilter.php
index f9d48b3d4e..f6dde3a0f8 100644
--- a/tests/phpunit/tests/hooks/hasFilter.php
+++ b/tests/phpunit/tests/hooks/hasFilter.php
@@ -12,8 +12,8 @@ class Tests_Hooks_HasFilter extends WP_UnitTestCase {
 		$callback      = '__return_null';
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
 
@@ -25,8 +25,8 @@ class Tests_Hooks_HasFilter extends WP_UnitTestCase {
 		$callback      = array( $a, 'action' );
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
 
@@ -37,8 +37,8 @@ class Tests_Hooks_HasFilter extends WP_UnitTestCase {
 		$callback      = array( 'MockAction', 'action' );
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
 
@@ -49,8 +49,8 @@ class Tests_Hooks_HasFilter extends WP_UnitTestCase {
 		$callback      = '__return_null';
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
 
@@ -74,8 +74,8 @@ class Tests_Hooks_HasFilter extends WP_UnitTestCase {
 		$callback      = '__return_null';
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
 
diff --git a/tests/phpunit/tests/hooks/hasFilters.php b/tests/phpunit/tests/hooks/hasFilters.php
index f5c1e657fc..068ec88e52 100644
--- a/tests/phpunit/tests/hooks/hasFilters.php
+++ b/tests/phpunit/tests/hooks/hasFilters.php
@@ -12,8 +12,8 @@ class Tests_Hooks_HasFilters extends WP_UnitTestCase {
 		$callback      = '__return_null';
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
 
@@ -29,8 +29,8 @@ class Tests_Hooks_HasFilters extends WP_UnitTestCase {
 		$callback      = '__return_null';
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
 		$hook->remove_filter( $tag, $callback, $priority );
@@ -41,8 +41,8 @@ class Tests_Hooks_HasFilters extends WP_UnitTestCase {
 		$callback      = '__return_null';
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
 		$function_key = _wp_filter_build_unique_id( $tag, $callback, $priority );
diff --git a/tests/phpunit/tests/hooks/iterator.php b/tests/phpunit/tests/hooks/iterator.php
index 4840aa3d4d..0bfdcab36b 100644
--- a/tests/phpunit/tests/hooks/iterator.php
+++ b/tests/phpunit/tests/hooks/iterator.php
@@ -13,8 +13,8 @@ class Tests_Hooks_Iterator extends WP_UnitTestCase {
 		$callback_two  = '__return_false';
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback_one, $priority, $accepted_args );
 		$hook->add_filter( $tag, $callback_two, $priority + 1, $accepted_args );
diff --git a/tests/phpunit/tests/hooks/preinitHooks.php b/tests/phpunit/tests/hooks/preinitHooks.php
index 551d64400f..18afaf6992 100644
--- a/tests/phpunit/tests/hooks/preinitHooks.php
+++ b/tests/phpunit/tests/hooks/preinitHooks.php
@@ -10,9 +10,9 @@ class Tests_Hooks_PreinitHooks extends WP_UnitTestCase {
 
 	public function test_array_to_hooks() {
 		$tag1      = __FUNCTION__ . '_1';
-		$priority1 = rand( 1, 100 );
+		$priority1 = 1;
 		$tag2      = __FUNCTION__ . '_2';
-		$priority2 = rand( 1, 100 );
+		$priority2 = 2;
 		$filters   = array(
 			$tag1 => array(
 				$priority1 => array(
diff --git a/tests/phpunit/tests/hooks/removeAllFilters.php b/tests/phpunit/tests/hooks/removeAllFilters.php
index cfaf81f4c8..90b8a06cda 100644
--- a/tests/phpunit/tests/hooks/removeAllFilters.php
+++ b/tests/phpunit/tests/hooks/removeAllFilters.php
@@ -12,8 +12,8 @@ class Tests_Hooks_RemoveAllFilters extends WP_UnitTestCase {
 		$callback      = '__return_null';
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
 
@@ -27,8 +27,8 @@ class Tests_Hooks_RemoveAllFilters extends WP_UnitTestCase {
 		$callback_two  = '__return_false';
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback_one, $priority, $accepted_args );
 		$hook->add_filter( $tag, $callback_two, $priority + 1, $accepted_args );
diff --git a/tests/phpunit/tests/hooks/removeFilter.php b/tests/phpunit/tests/hooks/removeFilter.php
index 793cd02b3c..adf8b6ad75 100644
--- a/tests/phpunit/tests/hooks/removeFilter.php
+++ b/tests/phpunit/tests/hooks/removeFilter.php
@@ -12,8 +12,8 @@ class Tests_Hooks_RemoveFilter extends WP_UnitTestCase {
 		$callback      = '__return_null';
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
 		$hook->remove_filter( $tag, $callback, $priority );
@@ -26,8 +26,8 @@ class Tests_Hooks_RemoveFilter extends WP_UnitTestCase {
 		$callback      = array( $a, 'action' );
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
 		$hook->remove_filter( $tag, $callback, $priority );
@@ -39,8 +39,8 @@ class Tests_Hooks_RemoveFilter extends WP_UnitTestCase {
 		$callback      = array( 'MockAction', 'action' );
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback, $priority, $accepted_args );
 		$hook->remove_filter( $tag, $callback, $priority );
@@ -53,8 +53,8 @@ class Tests_Hooks_RemoveFilter extends WP_UnitTestCase {
 		$callback_two  = '__return_false';
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback_one, $priority, $accepted_args );
 		$hook->add_filter( $tag, $callback_two, $priority, $accepted_args );
@@ -69,8 +69,8 @@ class Tests_Hooks_RemoveFilter extends WP_UnitTestCase {
 		$callback_two  = '__return_false';
 		$hook          = new WP_Hook();
 		$tag           = __FUNCTION__;
-		$priority      = rand( 1, 100 );
-		$accepted_args = rand( 1, 100 );
+		$priority      = 1;
+		$accepted_args = 2;
 
 		$hook->add_filter( $tag, $callback_one, $priority, $accepted_args );
 		$hook->add_filter( $tag, $callback_two, $priority + 1, $accepted_args );
diff --git a/tests/phpunit/tests/http/http.php b/tests/phpunit/tests/http/http.php
index c22c87d55c..23a28f4d75 100644
--- a/tests/phpunit/tests/http/http.php
+++ b/tests/phpunit/tests/http/http.php
@@ -392,4 +392,179 @@ class Tests_HTTP_HTTP extends WP_UnitTestCase {
 		);
 	}
 
+	/**
+	 * Test that wp_http_validate_url validates URLs.
+	 *
+	 * @ticket 54331
+	 *
+	 * @dataProvider data_wp_http_validate_url_should_validate
+	 *
+	 * @covers ::wp_http_validate_url
+	 *
+	 * @param string       $url            The URL to validate.
+	 * @param false|string $cb_safe_ports  The name of the callback to http_allowed_safe_ports or false if none.
+	 *                                     Default false.
+	 * @param bool         $external_host  Whether or not the host is external.
+	 *                                     Default false.
+	 */
+	public function test_wp_http_validate_url_should_validate( $url, $cb_safe_ports = false, $external_host = false ) {
+		if ( $external_host ) {
+			add_filter( 'http_request_host_is_external', '__return_true' );
+		}
+
+		if ( $cb_safe_ports ) {
+			add_filter( 'http_allowed_safe_ports', array( $this, $cb_safe_ports ) );
+		}
+
+		$this->assertSame( $url, wp_http_validate_url( $url ) );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_wp_http_validate_url_should_validate() {
+		return array(
+			'no port specified'                 => array(
+				'url' => 'http://example.com/caniload.php',
+			),
+			'an external request when allowed'  => array(
+				'url'           => 'http://172.20.0.123/caniload.php',
+				'cb_safe_ports' => false,
+				'external_host' => true,
+			),
+			'a port considered safe by default' => array(
+				'url' => 'https://example.com:8080/caniload.php',
+			),
+			'a port considered safe by filter'  => array(
+				'url'           => 'https://example.com:81/caniload.php',
+				'cb_safe_ports' => 'callback_custom_safe_ports',
+			),
+		);
+	}
+
+	/**
+	 * Tests that wp_http_validate_url validates a url that uses an unsafe port
+	 * but which matches the host and port used by the site's home url.
+	 *
+	 * @ticket 54331
+	 *
+	 * @covers ::wp_http_validate_url
+	 */
+	public function test_wp_http_validate_url_should_validate_with_an_unsafe_port_when_the_host_and_port_match_the_home_url() {
+		$original_home    = get_option( 'home' );
+		$home_parsed      = parse_url( $original_home );
+		$home_scheme_host = implode( '://', array_slice( $home_parsed, 0, 2 ) );
+		$home_modified    = $home_scheme_host . ':83';
+
+		update_option( 'home', $home_modified );
+
+		$url = $home_modified . '/caniload.php';
+		$this->assertSame( $url, wp_http_validate_url( $url ) );
+
+		update_option( 'home', $original_home );
+	}
+
+	/**
+	 * Test that wp_http_validate_url does not validate invalid URLs.
+	 *
+	 * @ticket 54331
+	 *
+	 * @dataProvider data_wp_http_validate_url_should_not_validate
+	 *
+	 * @covers ::wp_http_validate_url
+	 *
+	 * @param string       $url            The URL to validate.
+	 * @param false|string $cb_safe_ports  The name of the callback to http_allowed_safe_ports or false if none.
+	 *                                     Default false.
+	 * @param bool         $external_host  Whether or not the host is external.
+	 *                                     Default false.
+	 */
+	public function test_wp_http_validate_url_should_not_validate( $url, $cb_safe_ports = false, $external_host = false ) {
+		if ( $external_host ) {
+			add_filter( 'http_request_host_is_external', '__return_true' );
+		}
+
+		if ( $cb_safe_ports ) {
+			add_filter( 'http_allowed_safe_ports', array( $this, $cb_safe_ports ) );
+		}
+
+		$this->assertFalse( wp_http_validate_url( $url ) );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_wp_http_validate_url_should_not_validate() {
+		return array(
+			'url as false'                                 => array(
+				'url' => false,
+			),
+			'url as null'                                  => array(
+				'url' => null,
+			),
+			'url as int 0'                                 => array(
+				'url' => 0,
+			),
+			'url as string 0'                              => array(
+				'url' => '0',
+			),
+			'url as int 1'                                 => array(
+				'url' => 1,
+			),
+			'url as string 1'                              => array(
+				'url' => '1',
+			),
+			'url as array()'                               => array(
+				'url' => array(),
+			),
+			'an empty url'                                 => array(
+				'url' => '',
+			),
+			'a url with a non-http/https protocol'         => array(
+				'url' => 'ftp://example.com:81/caniload.php',
+			),
+			'a malformed url'                              => array(
+				'url' => 'http:///example.com:81/caniload.php',
+			),
+			'a host that cannot be parsed'                 => array(
+				'url' => 'http:example.com/caniload.php',
+			),
+			'login information'                            => array(
+				'url' => 'http://user:pass@example.com/caniload.php',
+			),
+			'a host with invalid characters'               => array(
+				'url' => 'http://[exam]ple.com/caniload.php',
+			),
+			'a host whose IPv4 address cannot be resolved' => array(
+				'url' => 'http://exampleeeee.com/caniload.php',
+			),
+			'an external request when not allowed'         => array(
+				'url'           => 'http://192.168.0.1/caniload.php',
+				'external_host' => false,
+			),
+			'a port not considered safe by default'        => array(
+				'url' => 'https://example.com:81/caniload.php',
+			),
+			'a port not considered safe by filter'         => array(
+				'url'           => 'https://example.com:82/caniload.php',
+				'cb_safe_ports' => 'callback_custom_safe_ports',
+			),
+			'all safe ports removed by filter'             => array(
+				'url'           => 'https://example.com:81/caniload.php',
+				'cb_safe_ports' => 'callback_remove_safe_ports',
+			),
+		);
+	}
+
+	public function callback_custom_safe_ports( $ports ) {
+		return array( 81, 444, 8081 );
+	}
+
+	public function callback_remove_safe_ports( $ports ) {
+		return array();
+	}
 }
diff --git a/tests/phpunit/tests/http/wpGetHttpHeaders.php b/tests/phpunit/tests/http/wpGetHttpHeaders.php
index 4b7b867a49..b462d7d8da 100644
--- a/tests/phpunit/tests/http/wpGetHttpHeaders.php
+++ b/tests/phpunit/tests/http/wpGetHttpHeaders.php
@@ -12,8 +12,8 @@ class Tests_HTTP_wpGetHttpHeaders extends WP_UnitTestCase {
 	public function set_up() {
 		parent::set_up();
 
-		// Hook a fake HTTP request response.
-		add_filter( 'pre_http_request', array( $this, 'fake_http_request' ), 10, 3 );
+		// Hook a mocked HTTP request response.
+		add_filter( 'pre_http_request', array( $this, 'mock_http_request' ), 10, 3 );
 	}
 
 	/**
@@ -47,10 +47,9 @@ class Tests_HTTP_wpGetHttpHeaders extends WP_UnitTestCase {
 	 * @param bool   $false     False.
 	 * @param array  $arguments Request arguments.
 	 * @param string $url       Request URL.
-	 *
 	 * @return array|bool
 	 */
-	public function fake_http_request( $false, $arguments, $url ) {
+	public function mock_http_request( $false, $arguments, $url ) {
 		if ( 'http://example.com' === $url ) {
 			return array( 'headers' => true );
 		}
diff --git a/tests/phpunit/tests/image/editor.php b/tests/phpunit/tests/image/editor.php
index a35f8af9f2..487dad0664 100644
--- a/tests/phpunit/tests/image/editor.php
+++ b/tests/phpunit/tests/image/editor.php
@@ -297,7 +297,7 @@ class Tests_Image_Editor extends WP_Image_UnitTestCase {
 		}
 
 		$file_data = wp_get_webp_info( $file );
-		$this->assertSame( $file_data, $expected );
+		$this->assertSame( $expected, $file_data );
 	}
 
 	/**
diff --git a/tests/phpunit/tests/image/functions.php b/tests/phpunit/tests/image/functions.php
index 488731a0e8..8cd42a13b5 100644
--- a/tests/phpunit/tests/image/functions.php
+++ b/tests/phpunit/tests/image/functions.php
@@ -626,7 +626,7 @@ class Tests_Image_Functions extends WP_UnitTestCase {
 
 		$metadata = wp_generate_attachment_metadata( $attachment_id, $test_file );
 		$this->assertArrayHasKey( 'test-size', $metadata['sizes'], 'The `test-size` was not added to the metadata.' );
-		$this->assertSame( $metadata['sizes']['test-size'], $expected );
+		$this->assertSame( $expected, $metadata['sizes']['test-size'] );
 
 		remove_image_size( 'test-size' );
 		remove_filter( 'fallback_intermediate_image_sizes', array( $this, 'filter_fallback_intermediate_image_sizes' ), 10 );
@@ -700,4 +700,130 @@ class Tests_Image_Functions extends WP_UnitTestCase {
 			unlink( $temp_dir . $size['file'] );
 		}
 	}
+
+	/**
+	 * Test for wp_exif_frac2dec verified that it properly handles edge cases
+	 * and always returns an int or float, or 0 for failures.
+	 *
+	 * @param mixed     $fraction The fraction to convert.
+	 * @param int|float $expect   The expected result.
+	 *
+	 * @ticket 54385
+	 * @dataProvider data_wp_exif_frac2dec
+	 *
+	 * @covers ::wp_exif_frac2dec
+	 */
+	public function test_wp_exif_frac2dec( $fraction, $expect ) {
+		$this->assertSame( $expect, wp_exif_frac2dec( $fraction ) );
+	}
+
+	/**
+	 * Data provider for testing `wp_exif_frac2dec()`.
+	 *
+	 * @return array
+	 */
+	public function data_wp_exif_frac2dec() {
+		return array(
+			'invalid input: null'              => array(
+				'fraction' => null,
+				'expect'   => 0,
+			),
+			'invalid input: boolean true'      => array(
+				'fraction' => null,
+				'expect'   => 0,
+			),
+			'invalid input: empty array value' => array(
+				'fraction' => array(),
+				'expect'   => 0,
+			),
+			'input is already integer'         => array(
+				'fraction' => 12,
+				'expect'   => 12,
+			),
+			'input is already float'           => array(
+				'fraction' => 10.123,
+				'expect'   => 10.123,
+			),
+			'string input is not a fraction - no slash, not numeric' => array(
+				'fraction' => '123notafraction',
+				'expect'   => 0,
+			),
+			'string input is not a fraction - no slash, numeric integer' => array(
+				'fraction' => '48',
+				'expect'   => 48.0,
+			),
+			'string input is not a fraction - no slash, numeric integer (integer 0)' => array(
+				'fraction' => '0',
+				'expect'   => 0.0,
+			),
+			'string input is not a fraction - no slash, octal numeric integer' => array(
+				'fraction' => '010',
+				'expect'   => 10.0,
+			),
+			'string input is not a fraction - no slash, numeric float (float 0)' => array(
+				'fraction' => '0.0',
+				'expect'   => 0.0,
+			),
+			'string input is not a fraction - no slash, numeric float (typical fnumber)' => array(
+				'fraction' => '4.8',
+				'expect'   => 4.8,
+			),
+			'string input is not a fraction - more than 1 slash with text' => array(
+				'fraction' => 'path/to/file',
+				'expect'   => 0,
+			),
+			'string input is not a fraction - more than 1 slash with numbers' => array(
+				'fraction' => '1/2/3',
+				'expect'   => 0,
+			),
+			'string input is not a fraction - only a slash' => array(
+				'fraction' => '/',
+				'expect'   => 0,
+			),
+			'string input is not a fraction - only slashes' => array(
+				'fraction' => '///',
+				'expect'   => 0,
+			),
+			'string input is not a fraction - left/right is not numeric' => array(
+				'fraction' => 'path/to',
+				'expect'   => 0,
+			),
+			'string input is not a fraction - left is not numeric' => array(
+				'fraction' => 'path/10',
+				'expect'   => 0,
+			),
+			'string input is not a fraction - right is not numeric' => array(
+				'fraction' => '0/abc',
+				'expect'   => 0,
+			),
+			'division by zero is prevented 1'  => array(
+				'fraction' => '0/0',
+				'expect'   => 0,
+			),
+			'division by zero is prevented 2'  => array(
+				'fraction' => '100/0.0',
+				'expect'   => 0,
+			),
+			'typical focal length'             => array(
+				'fraction' => '37 mm',
+				'expect'   => 0,
+			),
+			'typical exposure time'            => array(
+				'fraction' => '1/350',
+				'expect'   => 0.002857142857142857,
+			),
+			'valid fraction 1'                 => array(
+				'fraction' => '50/100',
+				'expect'   => 0.5,
+			),
+			'valid fraction 2'                 => array(
+				'fraction' => '25/100',
+				'expect'   => .25,
+			),
+			'valid fraction 3'                 => array(
+				'fraction' => '4/2',
+				'expect'   => 2,
+			),
+		);
+	}
 }
diff --git a/tests/phpunit/tests/image/intermediateSize.php b/tests/phpunit/tests/image/intermediateSize.php
index b67e795163..830359427a 100644
--- a/tests/phpunit/tests/image/intermediateSize.php
+++ b/tests/phpunit/tests/image/intermediateSize.php
@@ -181,23 +181,23 @@ class Tests_Image_Intermediate_Size extends WP_UnitTestCase {
 	 * @requires function imagejpeg
 	 */
 	public function test_get_intermediate_sizes_by_array_zero_height() {
-		// Generate random width.
-		$random_w = rand( 300, 400 );
+		// Use this width.
+		$width = 300;
 
 		// Only one dimention match shouldn't return false positive (see: #17626).
-		add_image_size( 'test-size', $random_w, 0, false );
-		add_image_size( 'false-height', $random_w, 100, true );
+		add_image_size( 'test-size', $width, 0, false );
+		add_image_size( 'false-height', $width, 100, true );
 
 		$file = DIR_TESTDATA . '/images/waffles.jpg';
 		$id   = $this->_make_attachment( $file, 0 );
 
 		$original = wp_get_attachment_metadata( $id );
-		$image_w  = $random_w;
+		$image_w  = $width;
 		$image_h  = round( ( $image_w / $original['width'] ) * $original['height'] );
 
 		// Look for a size by array that exists.
 		// Note: Staying larger than 300px to miss default medium crop.
-		$image = image_get_intermediate_size( $id, array( $random_w, 0 ) );
+		$image = image_get_intermediate_size( $id, array( $width, 0 ) );
 
 		// Test for the expected string because the array will by definition
 		// return with the correct height and width attributes.
diff --git a/tests/phpunit/tests/image/meta.php b/tests/phpunit/tests/image/meta.php
index 39e68b33c3..b362cf1f20 100644
--- a/tests/phpunit/tests/image/meta.php
+++ b/tests/phpunit/tests/image/meta.php
@@ -32,32 +32,32 @@ class Tests_Image_Meta extends WP_UnitTestCase {
 		// Exif from a Nikon D70.
 		$out = wp_read_image_metadata( DIR_TESTDATA . '/images/2004-07-22-DSC_0008.jpg' );
 
-		$this->assertEquals( 6.3, $out['aperture'] );
-		$this->assertSame( '', $out['credit'] );
-		$this->assertSame( 'NIKON D70', $out['camera'] );
-		$this->assertSame( '', $out['caption'] );
-		$this->assertEquals( strtotime( '2004-07-22 17:14:59' ), $out['created_timestamp'] );
-		$this->assertSame( '', $out['copyright'] );
-		$this->assertEquals( 27, $out['focal_length'] );
-		$this->assertEquals( 400, $out['iso'] );
-		$this->assertEquals( 1 / 40, $out['shutter_speed'] );
-		$this->assertSame( '', $out['title'] );
+		$this->assertEquals( 6.3, $out['aperture'], 'Aperture value not equivalent' );
+		$this->assertSame( '', $out['credit'], 'Credit value not the same' );
+		$this->assertSame( 'NIKON D70', $out['camera'], 'Camera value not the same' );
+		$this->assertSame( '', $out['caption'], 'Caption value not the same' );
+		$this->assertEquals( strtotime( '2004-07-22 17:14:59' ), $out['created_timestamp'], 'Timestamp value not equivalent' );
+		$this->assertSame( '', $out['copyright'], 'Copyright value not the same' );
+		$this->assertEquals( 27, $out['focal_length'], 'Focal length value not equivalent' );
+		$this->assertEquals( 400, $out['iso'], 'Iso value not equivalent' );
+		$this->assertEquals( 1 / 40, $out['shutter_speed'], 'Shutter speed value not equivalent' );
+		$this->assertSame( '', $out['title'], 'Title value not the same' );
 	}
 
 	public function test_exif_d70_mf() {
 		// Exif from a Nikon D70 - manual focus lens, so some data is unavailable.
 		$out = wp_read_image_metadata( DIR_TESTDATA . '/images/2007-06-17DSC_4173.JPG' );
 
-		$this->assertSame( '0', $out['aperture'] );
-		$this->assertSame( '', $out['credit'] );
-		$this->assertSame( 'NIKON D70', $out['camera'] );
-		$this->assertSame( '', $out['caption'] );
-		$this->assertEquals( strtotime( '2007-06-17 21:18:00' ), $out['created_timestamp'] );
-		$this->assertSame( '', $out['copyright'] );
-		$this->assertEquals( 0, $out['focal_length'] );
-		$this->assertEquals( 0, $out['iso'] ); // Interesting - a Nikon bug?
-		$this->assertEquals( 1 / 500, $out['shutter_speed'] );
-		$this->assertSame( '', $out['title'] );
+		$this->assertSame( '0', $out['aperture'], 'Aperture value not the same' );
+		$this->assertSame( '', $out['credit'], 'Credit value not the same' );
+		$this->assertSame( 'NIKON D70', $out['camera'], 'Camera value not the same' );
+		$this->assertSame( '', $out['caption'], 'Caption value not the same' );
+		$this->assertEquals( strtotime( '2007-06-17 21:18:00' ), $out['created_timestamp'], 'Timestamp value not equivalent' );
+		$this->assertSame( '', $out['copyright'], 'Copyright value not the same' );
+		$this->assertEquals( 0, $out['focal_length'], 'Focal length value not equivalent' );
+		$this->assertEquals( 0, $out['iso'], 'Iso value not equivalent' ); // Interesting - a Nikon bug?
+		$this->assertEquals( 1 / 500, $out['shutter_speed'], 'Shutter speed value not equivalent' );
+		$this->assertSame( '', $out['title'], 'Title value not the same' );
 		// $this->assertSame( array( 'Flowers' ), $out['keywords'] );
 	}
 
@@ -65,33 +65,32 @@ class Tests_Image_Meta extends WP_UnitTestCase {
 		// Exif from a Nikon D70 with IPTC data added later.
 		$out = wp_read_image_metadata( DIR_TESTDATA . '/images/2004-07-22-DSC_0007.jpg' );
 
-		$this->assertEquals( 6.3, $out['aperture'] );
-		$this->assertSame( 'IPTC Creator', $out['credit'] );
-		$this->assertSame( 'NIKON D70', $out['camera'] );
-		$this->assertSame( 'IPTC Caption', $out['caption'] );
-		$this->assertEquals( strtotime( '2004-07-22 17:14:35' ), $out['created_timestamp'] );
-		$this->assertSame( 'IPTC Copyright', $out['copyright'] );
-		$this->assertEquals( 18, $out['focal_length'] );
-		$this->assertEquals( 200, $out['iso'] );
-		$this->assertEquals( 1 / 25, $out['shutter_speed'] );
-		$this->assertSame( 'IPTC Headline', $out['title'] );
+		$this->assertEquals( 6.3, $out['aperture'], 'Aperture value not equivalent' );
+		$this->assertSame( 'IPTC Creator', $out['credit'], 'Credit value not the same' );
+		$this->assertSame( 'NIKON D70', $out['camera'], 'Camera value not the same' );
+		$this->assertSame( 'IPTC Caption', $out['caption'], 'Caption value not the same' );
+		$this->assertEquals( strtotime( '2004-07-22 17:14:35' ), $out['created_timestamp'], 'Timestamp value not equivalent' );
+		$this->assertSame( 'IPTC Copyright', $out['copyright'], 'Copyright value not the same' );
+		$this->assertEquals( 18, $out['focal_length'], 'Focal length value not equivalent' );
+		$this->assertEquals( 200, $out['iso'], 'Iso value not equivalent' );
+		$this->assertEquals( 1 / 25, $out['shutter_speed'], 'Shutter speed value not equivalent' );
+		$this->assertSame( 'IPTC Headline', $out['title'], 'Title value not the same' );
 	}
 
 	public function test_exif_fuji() {
 		// Exif from a Fuji FinePix S5600 (thanks Mark).
 		$out = wp_read_image_metadata( DIR_TESTDATA . '/images/a2-small.jpg' );
 
-		$this->assertEquals( 4.5, $out['aperture'] );
-		$this->assertSame( '', $out['credit'] );
-		$this->assertSame( 'FinePix S5600', $out['camera'] );
-		$this->assertSame( '', $out['caption'] );
-		$this->assertEquals( strtotime( '2007-09-03 10:17:03' ), $out['created_timestamp'] );
-		$this->assertSame( '', $out['copyright'] );
-		$this->assertEquals( 6.3, $out['focal_length'] );
-		$this->assertEquals( 64, $out['iso'] );
-		$this->assertEquals( 1 / 320, $out['shutter_speed'] );
-		$this->assertSame( '', $out['title'] );
-
+		$this->assertEquals( 4.5, $out['aperture'], 'Aperture value not equivalent' );
+		$this->assertSame( '', $out['credit'], 'Credit value not the same' );
+		$this->assertSame( 'FinePix S5600', $out['camera'], 'Camera value not the same' );
+		$this->assertSame( '', $out['caption'], 'Caption value not the same' );
+		$this->assertEquals( strtotime( '2007-09-03 10:17:03' ), $out['created_timestamp'], 'Timestamp value not equivalent' );
+		$this->assertSame( '', $out['copyright'], 'Copyright value not the same' );
+		$this->assertEquals( 6.3, $out['focal_length'], 'Focal length value not equivalent' );
+		$this->assertEquals( 64, $out['iso'], 'Iso value not equivalent' );
+		$this->assertEquals( 1 / 320, $out['shutter_speed'], 'Shutter speed value not equivalent' );
+		$this->assertSame( '', $out['title'], 'Title value not the same' );
 	}
 
 	/**
@@ -102,32 +101,32 @@ class Tests_Image_Meta extends WP_UnitTestCase {
 		// This triggers a warning mesage when reading the Exif block.
 		$out = wp_read_image_metadata( DIR_TESTDATA . '/images/waffles.jpg' );
 
-		$this->assertEquals( 0, $out['aperture'] );
-		$this->assertSame( '', $out['credit'] );
-		$this->assertSame( '', $out['camera'] );
-		$this->assertSame( '', $out['caption'] );
-		$this->assertEquals( 0, $out['created_timestamp'] );
-		$this->assertSame( '', $out['copyright'] );
-		$this->assertEquals( 0, $out['focal_length'] );
-		$this->assertEquals( 0, $out['iso'] );
-		$this->assertEquals( 0, $out['shutter_speed'] );
-		$this->assertSame( '', $out['title'] );
+		$this->assertEquals( 0, $out['aperture'], 'Aperture value not equivalent' );
+		$this->assertSame( '', $out['credit'], 'Credit value not the same' );
+		$this->assertSame( '', $out['camera'], 'Camera value not the same' );
+		$this->assertSame( '', $out['caption'], 'Caption value not the same' );
+		$this->assertEquals( 0, $out['created_timestamp'], 'Timestamp value not equivalent' );
+		$this->assertSame( '', $out['copyright'], 'Copyright value not the same' );
+		$this->assertEquals( 0, $out['focal_length'], 'Focal length value not equivalent' );
+		$this->assertEquals( 0, $out['iso'], 'Iso value not equivalent' );
+		$this->assertEquals( 0, $out['shutter_speed'], 'Shutter speed value not equivalent' );
+		$this->assertSame( '', $out['title'], 'Title value not the same' );
 	}
 
 	public function test_exif_no_data() {
 		// No Exif data in this image (from burningwell.org).
 		$out = wp_read_image_metadata( DIR_TESTDATA . '/images/canola.jpg' );
 
-		$this->assertEquals( 0, $out['aperture'] );
-		$this->assertSame( '', $out['credit'] );
-		$this->assertSame( '', $out['camera'] );
-		$this->assertSame( '', $out['caption'] );
-		$this->assertEquals( 0, $out['created_timestamp'] );
-		$this->assertSame( '', $out['copyright'] );
-		$this->assertEquals( 0, $out['focal_length'] );
-		$this->assertEquals( 0, $out['iso'] );
-		$this->assertEquals( 0, $out['shutter_speed'] );
-		$this->assertSame( '', $out['title'] );
+		$this->assertEquals( 0, $out['aperture'], 'Aperture value not equivalent' );
+		$this->assertSame( '', $out['credit'], 'Credit value not the same' );
+		$this->assertSame( '', $out['camera'], 'Camera value not the same' );
+		$this->assertSame( '', $out['caption'], 'Caption value not the same' );
+		$this->assertEquals( 0, $out['created_timestamp'], 'Timestamp value not equivalent' );
+		$this->assertSame( '', $out['copyright'], 'Copyright value not the same' );
+		$this->assertEquals( 0, $out['focal_length'], 'Focal length value not equivalent' );
+		$this->assertEquals( 0, $out['iso'], 'Iso value not equivalent' );
+		$this->assertEquals( 0, $out['shutter_speed'], 'Shutter speed value not equivalent' );
+		$this->assertSame( '', $out['title'], 'Title value not the same' );
 	}
 
 	/**
@@ -155,18 +154,18 @@ class Tests_Image_Meta extends WP_UnitTestCase {
 	public function test_exif_keywords() {
 		$out = wp_read_image_metadata( DIR_TESTDATA . '/images/33772.jpg' );
 
-		$this->assertSame( '8', $out['aperture'] );
-		$this->assertSame( 'Photoshop Author', $out['credit'] );
-		$this->assertSame( 'DMC-LX2', $out['camera'] );
-		$this->assertSame( 'Photoshop Description', $out['caption'] );
-		$this->assertEquals( 1306315327, $out['created_timestamp'] );
-		$this->assertSame( 'Photoshop Copyrright Notice', $out['copyright'] );
-		$this->assertSame( '6.3', $out['focal_length'] );
-		$this->assertSame( '100', $out['iso'] );
-		$this->assertSame( '0.0025', $out['shutter_speed'] );
-		$this->assertSame( 'Photoshop Document Ttitle', $out['title'] );
-		$this->assertEquals( 1, $out['orientation'] );
-		$this->assertSame( array( 'beach', 'baywatch', 'LA', 'sunset' ), $out['keywords'] );
+		$this->assertSame( '8', $out['aperture'], 'Aperture value not the same' );
+		$this->assertSame( 'Photoshop Author', $out['credit'], 'Credit value not the same' );
+		$this->assertSame( 'DMC-LX2', $out['camera'], 'Camera value not the same' );
+		$this->assertSame( 'Photoshop Description', $out['caption'], 'Caption value not the same' );
+		$this->assertEquals( 1306315327, $out['created_timestamp'], 'Timestamp value not equivalent' );
+		$this->assertSame( 'Photoshop Copyrright Notice', $out['copyright'], 'Copyright value not the same' );
+		$this->assertSame( '6.3', $out['focal_length'], 'Focal length value not the same' );
+		$this->assertSame( '100', $out['iso'], 'Iso value not the same' );
+		$this->assertSame( '0.0025', $out['shutter_speed'], 'Shutter speed value not the same' );
+		$this->assertSame( 'Photoshop Document Ttitle', $out['title'], 'Title value not the same' );
+		$this->assertEquals( 1, $out['orientation'], 'Orientation value not equivalent' );
+		$this->assertSame( array( 'beach', 'baywatch', 'LA', 'sunset' ), $out['keywords'], 'Keywords not the same' );
 	}
 
 	/**
@@ -239,4 +238,23 @@ class Tests_Image_Meta extends WP_UnitTestCase {
 			),
 		);
 	}
+
+	/**
+	 * @ticket 54385
+	 */
+	public function test_exif_unexpected_data() {
+		// Unexpected Exif data: FNumber is "0/0", aperture should be 0.
+		$out = wp_read_image_metadata( DIR_TESTDATA . '/images/sugarloaf-mountain.jpg' );
+
+		$this->assertEquals( 0, $out['aperture'], 'Aperture value not equivalent' );
+		$this->assertSame( '', $out['credit'], 'Credit value not the same' );
+		$this->assertSame( 'X-T1', $out['camera'], 'Camera value not the same' );
+		$this->assertSame( '', $out['caption'], 'Caption value not the same' );
+		$this->assertEquals( 0, $out['created_timestamp'], 'Timestamp value not equivalent' );
+		$this->assertSame( '', $out['copyright'], 'Copyright value not the same' );
+		$this->assertEquals( 50, $out['focal_length'], 'Focal length value not equivalent' );
+		$this->assertEquals( 200, $out['iso'], 'Iso value not equivalent' );
+		$this->assertEquals( 2, $out['shutter_speed'], 'Shutter speed value not equivalent' );
+		$this->assertSame( 'Sugarloaf Panorama', $out['title'], 'Title value not the same' );
+	}
 }
diff --git a/tests/phpunit/tests/includes/factory.php b/tests/phpunit/tests/includes/factory.php
index c1ab1c2a0d..ac5410cf55 100644
--- a/tests/phpunit/tests/includes/factory.php
+++ b/tests/phpunit/tests/includes/factory.php
@@ -8,12 +8,12 @@ class TestFactoryFor extends WP_UnitTestCase {
 
 	public function test_create_creates_a_category() {
 		$id = $this->category_factory->create();
-		$this->assertTrue( (bool) get_term_by( 'id', $id, 'category' ) );
+		$this->assertInstanceOf( 'WP_Term', get_term_by( 'id', $id, 'category' ) );
 	}
 
 	public function test_get_object_by_id_gets_an_object() {
 		$id = $this->category_factory->create();
-		$this->assertTrue( (bool) $this->category_factory->get_object_by_id( $id ) );
+		$this->assertInstanceOf( 'WP_Term', $this->category_factory->get_object_by_id( $id ) );
 	}
 
 	public function test_get_object_by_id_gets_an_object_with_the_same_name() {
diff --git a/tests/phpunit/tests/kses.php b/tests/phpunit/tests/kses.php
index 7f5bb646d1..7968dbecaa 100644
--- a/tests/phpunit/tests/kses.php
+++ b/tests/phpunit/tests/kses.php
@@ -1517,64 +1517,147 @@ EOF;
 	function data_wp_kses_object_tag_allowed() {
 		return array(
 			'valid value for type'                    => array(
-				'<object type="application/pdf" data="https://wordpress.org/foo.pdf" />',
-				'<object type="application/pdf" data="https://wordpress.org/foo.pdf" />',
+				'<object type="application/pdf" data="https://example.org/foo.pdf" />',
+				'<object type="application/pdf" data="https://example.org/foo.pdf" />',
 			),
 			'invalid value for type'                  => array(
-				'<object type="application/exe" data="https://wordpress.org/foo.exe" />',
+				'<object type="application/exe" data="https://example.org/foo.exe" />',
 				'',
 			),
 			'multiple type attributes, last invalid'  => array(
-				'<object type="application/pdf" type="application/exe" data="https://wordpress.org/foo.pdf" />',
-				'<object type="application/pdf" data="https://wordpress.org/foo.pdf" />',
+				'<object type="application/pdf" type="application/exe" data="https://example.org/foo.pdf" />',
+				'<object type="application/pdf" data="https://example.org/foo.pdf" />',
 			),
 			'multiple type attributes, first uppercase, last invalid' => array(
-				'<object TYPE="application/pdf" type="application/exe" data="https://wordpress.org/foo.pdf" />',
-				'<object TYPE="application/pdf" data="https://wordpress.org/foo.pdf" />',
+				'<object TYPE="application/pdf" type="application/exe" data="https://example.org/foo.pdf" />',
+				'<object TYPE="application/pdf" data="https://example.org/foo.pdf" />',
 			),
 			'multiple type attributes, last upper case and invalid' => array(
-				'<object type="application/pdf" TYPE="application/exe" data="https://wordpress.org/foo.pdf" />',
-				'<object type="application/pdf" data="https://wordpress.org/foo.pdf" />',
+				'<object type="application/pdf" TYPE="application/exe" data="https://example.org/foo.pdf" />',
+				'<object type="application/pdf" data="https://example.org/foo.pdf" />',
 			),
 			'multiple type attributes, first invalid' => array(
-				'<object type="application/exe" type="application/pdf" data="https://wordpress.org/foo.pdf" />',
+				'<object type="application/exe" type="application/pdf" data="https://example.org/foo.pdf" />',
 				'',
 			),
 			'multiple type attributes, first upper case and invalid' => array(
-				'<object TYPE="application/exe" type="application/pdf" data="https://wordpress.org/foo.pdf" />',
+				'<object TYPE="application/exe" type="application/pdf" data="https://example.org/foo.pdf" />',
 				'',
 			),
 			'multiple type attributes, first invalid, last uppercase' => array(
-				'<object type="application/exe" TYPE="application/pdf" data="https://wordpress.org/foo.pdf" />',
+				'<object type="application/exe" TYPE="application/pdf" data="https://example.org/foo.pdf" />',
 				'',
 			),
 			'multiple object tags, last invalid'      => array(
-				'<object type="application/pdf" data="https://wordpress.org/foo.pdf" /><object type="application/exe" data="https://wordpress.org/foo.exe" />',
-				'<object type="application/pdf" data="https://wordpress.org/foo.pdf" />',
+				'<object type="application/pdf" data="https://example.org/foo.pdf" /><object type="application/exe" data="https://example.org/foo.exe" />',
+				'<object type="application/pdf" data="https://example.org/foo.pdf" />',
 			),
 			'multiple object tags, first invalid'     => array(
-				'<object type="application/exe" data="https://wordpress.org/foo.exe" /><object type="application/pdf" data="https://wordpress.org/foo.pdf" />',
-				'<object type="application/pdf" data="https://wordpress.org/foo.pdf" />',
+				'<object type="application/exe" data="https://example.org/foo.exe" /><object type="application/pdf" data="https://example.org/foo.pdf" />',
+				'<object type="application/pdf" data="https://example.org/foo.pdf" />',
 			),
 			'type attribute with partially incorrect value' => array(
-				'<object type="application/pdfa" data="https://wordpress.org/foo.pdf" />',
+				'<object type="application/pdfa" data="https://example.org/foo.pdf" />',
 				'',
 			),
 			'type attribute with empty value'         => array(
-				'<object type="" data="https://wordpress.org/foo.pdf" />',
+				'<object type="" data="https://example.org/foo.pdf" />',
 				'',
 			),
 			'type attribute with no value'            => array(
-				'<object type data="https://wordpress.org/foo.pdf" />',
+				'<object type data="https://example.org/foo.pdf" />',
 				'',
 			),
 			'no type attribute'                       => array(
-				'<object data="https://wordpress.org/foo.pdf" />',
+				'<object data="https://example.org/foo.pdf" />',
+				'',
+			),
+			'different protocol in url'               => array(
+				'<object type="application/pdf" data="http://example.org/foo.pdf" />',
+				'<object type="application/pdf" data="http://example.org/foo.pdf" />',
+			),
+			'query string on url'                     => array(
+				'<object type="application/pdf" data="https://example.org/foo.pdf?lol=.pdf" />',
+				'',
+			),
+			'fragment on url'                         => array(
+				'<object type="application/pdf" data="https://example.org/foo.pdf#lol.pdf" />',
+				'',
+			),
+			'wrong extension'                         => array(
+				'<object type="application/pdf" data="https://example.org/foo.php" />',
+				'',
+			),
+			'protocol-relative url'                   => array(
+				'<object type="application/pdf" data="//example.org/foo.pdf" />',
+				'',
+			),
+			'unsupported protocol'                    => array(
+				'<object type="application/pdf" data="ftp://example.org/foo.pdf" />',
+				'',
+			),
+			'relative url'                            => array(
+				'<object type="application/pdf" data="/cat/foo.pdf" />',
+				'',
+			),
+			'url with port number-like path'          => array(
+				'<object type="application/pdf" data="https://example.org/cat:8888/foo.pdf" />',
+				'<object type="application/pdf" data="https://example.org/cat:8888/foo.pdf" />',
+			),
+		);
+	}
+
+	/**
+	 * Test that object tags are allowed when there is a port number in the URL.
+	 *
+	 * @ticket 54261
+	 *
+	 * @dataProvider data_wp_kses_object_data_url_with_port_number_allowed
+	 *
+	 * @param string $html     A string of HTML to test.
+	 * @param string $expected The expected result from KSES.
+	 */
+	function test_wp_kses_object_data_url_with_port_number_allowed( $html, $expected ) {
+		add_filter( 'upload_dir', array( $this, 'wp_kses_upload_dir_filter' ), 10, 2 );
+		$this->assertSame( $expected, wp_kses_post( $html ) );
+	}
+
+	/**
+	 * Data provider for test_wp_kses_object_data_url_with_port_number_allowed().
+	 */
+	function data_wp_kses_object_data_url_with_port_number_allowed() {
+		return array(
+			'url with port number'                   => array(
+				'<object type="application/pdf" data="https://example.org:8888/cat/foo.pdf" />',
+				'<object type="application/pdf" data="https://example.org:8888/cat/foo.pdf" />',
+			),
+			'url with port number and http protocol' => array(
+				'<object type="application/pdf" data="http://example.org:8888/cat/foo.pdf" />',
+				'<object type="application/pdf" data="http://example.org:8888/cat/foo.pdf" />',
+			),
+			'url with wrong port number'             => array(
+				'<object type="application/pdf" data="http://example.org:3333/cat/foo.pdf" />',
+				'',
+			),
+			'url without port number'                => array(
+				'<object type="application/pdf" data="http://example.org/cat/foo.pdf" />',
 				'',
 			),
 		);
 	}
 
+	/**
+	 * Filter upload directory for tests using port number.
+	 *
+	 * @param  array $param See wp_upload_dir()
+	 * @return array        $param with a modified `url`.
+	 */
+	public function wp_kses_upload_dir_filter( $param ) {
+		$url_with_port_number = is_string( $param['url'] ) ? str_replace( 'example.org', 'example.org:8888', $param['url'] ) : $param['url'];
+		$param['url']         = $url_with_port_number;
+		return $param;
+	}
+
 	/**
 	 * Test that object tags will continue to function if they've been added using the
 	 * 'wp_kses_allowed_html' filter.
@@ -1790,4 +1873,110 @@ HTML;
 
 		return $return_data;
 	}
+
+	/**
+	 * Test that XML named entities are encoded correctly.
+	 *
+	 * @dataProvider data_wp_kses_xml_named_entities
+	 *
+	 * @ticket 54060
+	 * @covers ::wp_kses_xml_named_entities
+	 *
+	 * @param array  $input    The input to wp_kses_xml_named_entities().
+	 * @param string $expected The expected output.
+	 */
+	public function test_wp_kses_xml_named_entities( $input, $expected ) {
+		$this->assertSame( $expected, wp_kses_xml_named_entities( $input ) );
+	}
+
+	/**
+	 * Data provider for test_wp_kses_xml_named_entities().
+	 *
+	 * @return array Nested array of input, expected pairs.
+	 */
+	public function data_wp_kses_xml_named_entities() {
+		return array(
+			// Empty string value testing.
+			'empty string'       => array(
+				'input'    => '',
+				'expected' => '',
+			),
+
+			// Empty string array value testing.
+			'empty string array' => array(
+				'input'    => array( '', '' ),
+				'expected' => '',
+			),
+
+			// $allowedxmlentitynames values testing.
+			'amp'                => array(
+				'input'    => array( '', 'amp' ),
+				'expected' => '&amp;',
+			),
+			'lt'                 => array(
+				'input'    => array( '', 'lt' ),
+				'expected' => '&lt;',
+			),
+			'gt'                 => array(
+				'input'    => array( '', 'gt' ),
+				'expected' => '&gt;',
+			),
+
+			// $allowedentitynames values testing.
+			'nbsp'               => array(
+				'input'    => array( '', 'nbsp' ),
+				'expected' => utf8_encode( chr( 160 ) ),
+			),
+			'iexcl'              => array(
+				'input'    => array( '', 'iexcl' ),
+				'expected' => '¡',
+			),
+			'cent'               => array(
+				'input'    => array( '', 'cent' ),
+				'expected' => '¢',
+			),
+
+			// Some other value testing.
+			'test'               => array(
+				'input'    => array( '', 'test' ),
+				'expected' => '&amp;test;',
+			),
+
+		);
+	}
+
+	/**
+	 * Test that KSES globals are defined.
+	 *
+	 * @dataProvider data_kses_globals_are_defined
+	 *
+	 * @ticket 54060
+	 *
+	 * @param string $global The name of the global variable.
+	 */
+	public function test_kses_globals_are_defined( $global ) {
+		$this->assertArrayHasKey( $global, $GLOBALS );
+	}
+
+	/**
+	 * Data provider for test_kses_globals_are_defined().
+	 *
+	 * @return array
+	 */
+	public function data_kses_globals_are_defined() {
+		return array(
+			'allowedposttags'       => array(
+				'global' => 'allowedposttags',
+			),
+			'allowedtags'           => array(
+				'global' => 'allowedtags',
+			),
+			'allowedentitynames'    => array(
+				'global' => 'allowedentitynames',
+			),
+			'allowedxmlentitynames' => array(
+				'global' => 'allowedxmlentitynames',
+			),
+		);
+	}
 }
diff --git a/tests/phpunit/tests/l10n.php b/tests/phpunit/tests/l10n.php
index 09c4ddfd62..b31c165692 100644
--- a/tests/phpunit/tests/l10n.php
+++ b/tests/phpunit/tests/l10n.php
@@ -408,11 +408,11 @@ class Tests_L10n extends WP_UnitTestCase {
 		$this->factory()->post->create( $args );
 
 		$expect = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do&hellip;';
+		$this->expectOutputRegex( '/' . $expect . '/' );
+
 		wp_dashboard_recent_drafts();
 
 		restore_previous_locale();
-
-		$this->expectOutputRegex( '/' . $expect . '/' );
 	}
 
 	/**
@@ -432,11 +432,11 @@ class Tests_L10n extends WP_UnitTestCase {
 		$post = $this->factory()->post->create( $args );
 
 		$expect = 'Lorem ipsum dolor sit amet, consectetur &hellip;';
+		$this->expectOutputRegex( '/' . $expect . '/' );
+
 		wp_dashboard_recent_drafts();
 
 		restore_previous_locale();
-
-		$this->expectOutputRegex( '/' . $expect . '/' );
 	}
 
 	/**
@@ -456,11 +456,11 @@ class Tests_L10n extends WP_UnitTestCase {
 		$this->factory()->post->create( $args );
 
 		$expect = str_repeat( 'あ', 40 ) . '&hellip;';
+		$this->expectOutputRegex( '/' . $expect . '/' );
+
 		wp_dashboard_recent_drafts();
 
 		restore_previous_locale();
-
-		$this->expectOutputRegex( '/' . $expect . '/' );
 	}
 
 	/**
diff --git a/tests/phpunit/tests/l10n/loadTextdomainJustInTime.php b/tests/phpunit/tests/l10n/loadTextdomainJustInTime.php
index 0f0ecf5272..eafcb134d4 100644
--- a/tests/phpunit/tests/l10n/loadTextdomainJustInTime.php
+++ b/tests/phpunit/tests/l10n/loadTextdomainJustInTime.php
@@ -69,13 +69,13 @@ class Tests_L10n_LoadTextdomainJustInTime extends WP_UnitTestCase {
 		require_once DIR_TESTDATA . '/plugins/internationalized-plugin.php';
 
 		$is_textdomain_loaded_before = is_textdomain_loaded( 'internationalized-plugin' );
-		$expected_output             = i18n_plugin_test();
+		$actual_output               = i18n_plugin_test();
 		$is_textdomain_loaded_after  = is_textdomain_loaded( 'internationalized-plugin' );
 
 		remove_filter( 'locale', array( $this, 'filter_set_locale_to_german' ) );
 
 		$this->assertFalse( $is_textdomain_loaded_before );
-		$this->assertSame( 'Das ist ein Dummy Plugin', $expected_output );
+		$this->assertSame( 'Das ist ein Dummy Plugin', $actual_output );
 		$this->assertTrue( $is_textdomain_loaded_after );
 	}
 
@@ -90,13 +90,13 @@ class Tests_L10n_LoadTextdomainJustInTime extends WP_UnitTestCase {
 		require_once get_stylesheet_directory() . '/functions.php';
 
 		$is_textdomain_loaded_before = is_textdomain_loaded( 'internationalized-theme' );
-		$expected_output             = i18n_theme_test();
+		$actual_output               = i18n_theme_test();
 		$is_textdomain_loaded_after  = is_textdomain_loaded( 'internationalized-theme' );
 
 		remove_filter( 'locale', array( $this, 'filter_set_locale_to_german' ) );
 
 		$this->assertFalse( $is_textdomain_loaded_before );
-		$this->assertSame( 'Das ist ein Dummy Theme', $expected_output );
+		$this->assertSame( 'Das ist ein Dummy Theme', $actual_output );
 		$this->assertTrue( $is_textdomain_loaded_after );
 	}
 
@@ -121,34 +121,34 @@ class Tests_L10n_LoadTextdomainJustInTime extends WP_UnitTestCase {
 
 		require_once DIR_TESTDATA . '/plugins/internationalized-plugin.php';
 
-		$expected_output_before      = i18n_plugin_test();
+		$actual_output_before        = i18n_plugin_test();
 		$is_textdomain_loaded_before = is_textdomain_loaded( 'internationalized-plugin' );
 
 		unload_textdomain( 'internationalized-plugin' );
 		remove_filter( 'locale', array( $this, 'filter_set_locale_to_german' ) );
 
-		$expected_output_after      = i18n_plugin_test();
+		$actual_output_after        = i18n_plugin_test();
 		$is_textdomain_loaded_after = is_textdomain_loaded( 'internationalized-plugin' );
 
 		add_filter( 'locale', array( $this, 'filter_set_locale_to_german' ) );
 		load_textdomain( 'internationalized-plugin', WP_LANG_DIR . '/plugins/internationalized-plugin-de_DE.mo' );
 
-		$expected_output_final      = i18n_plugin_test();
+		$actual_output_final        = i18n_plugin_test();
 		$is_textdomain_loaded_final = is_textdomain_loaded( 'internationalized-plugin' );
 
 		unload_textdomain( 'internationalized-plugin' );
 		remove_filter( 'locale', array( $this, 'filter_set_locale_to_german' ) );
 
 		// Text domain loaded just in time.
-		$this->assertSame( 'Das ist ein Dummy Plugin', $expected_output_before );
+		$this->assertSame( 'Das ist ein Dummy Plugin', $actual_output_before );
 		$this->assertTrue( $is_textdomain_loaded_before );
 
 		// Text domain unloaded.
-		$this->assertSame( 'This is a dummy plugin', $expected_output_after );
+		$this->assertSame( 'This is a dummy plugin', $actual_output_after );
 		$this->assertFalse( $is_textdomain_loaded_after );
 
 		// Text domain loaded manually again.
-		$this->assertSame( 'Das ist ein Dummy Plugin', $expected_output_final );
+		$this->assertSame( 'Das ist ein Dummy Plugin', $actual_output_final );
 		$this->assertTrue( $is_textdomain_loaded_final );
 	}
 
@@ -159,10 +159,10 @@ class Tests_L10n_LoadTextdomainJustInTime extends WP_UnitTestCase {
 		require_once DIR_TESTDATA . '/plugins/internationalized-plugin.php';
 
 		switch_to_locale( 'de_DE' );
-		$expected = i18n_plugin_test();
+		$actual = i18n_plugin_test();
 		restore_previous_locale();
 
-		$this->assertSame( 'Das ist ein Dummy Plugin', $expected );
+		$this->assertSame( 'Das ist ein Dummy Plugin', $actual );
 	}
 
 	/**
@@ -172,15 +172,15 @@ class Tests_L10n_LoadTextdomainJustInTime extends WP_UnitTestCase {
 		require_once DIR_TESTDATA . '/plugins/internationalized-plugin.php';
 
 		switch_to_locale( 'de_DE' );
-		$expected_de_de = i18n_plugin_test();
+		$actual_de_de = i18n_plugin_test();
 
 		switch_to_locale( 'es_ES' );
-		$expected_es_es = i18n_plugin_test();
+		$actual_es_es = i18n_plugin_test();
 
 		restore_current_locale();
 
-		$this->assertSame( 'Das ist ein Dummy Plugin', $expected_de_de );
-		$this->assertSame( 'This is a dummy plugin', $expected_es_es );
+		$this->assertSame( 'Das ist ein Dummy Plugin', $actual_de_de );
+		$this->assertSame( 'This is a dummy plugin', $actual_es_es );
 	}
 
 	/**
@@ -192,12 +192,12 @@ class Tests_L10n_LoadTextdomainJustInTime extends WP_UnitTestCase {
 		require_once get_stylesheet_directory() . '/functions.php';
 
 		switch_to_locale( 'de_DE' );
-		$expected = i18n_theme_test();
+		$actual = i18n_theme_test();
 		restore_previous_locale();
 
 		switch_theme( WP_DEFAULT_THEME );
 
-		$this->assertSame( 'Das ist ein Dummy Theme', $expected );
+		$this->assertSame( 'Das ist ein Dummy Theme', $actual );
 	}
 
 	/**
@@ -209,9 +209,9 @@ class Tests_L10n_LoadTextdomainJustInTime extends WP_UnitTestCase {
 		set_current_screen( 'dashboard' );
 		wp_set_current_user( self::$user_id );
 
-		$expected = i18n_plugin_test();
+		$actual = i18n_plugin_test();
 
-		$this->assertSame( 'Das ist ein Dummy Plugin', $expected );
+		$this->assertSame( 'Das ist ein Dummy Plugin', $actual );
 	}
 
 	/**
@@ -224,11 +224,11 @@ class Tests_L10n_LoadTextdomainJustInTime extends WP_UnitTestCase {
 
 		require_once get_stylesheet_directory() . '/functions.php';
 
-		$expected = i18n_theme_test();
+		$actual = i18n_theme_test();
 
 		switch_theme( WP_DEFAULT_THEME );
 
-		$this->assertSame( 'Das ist ein Dummy Theme', $expected );
+		$this->assertSame( 'Das ist ein Dummy Theme', $actual );
 	}
 
 	/**
diff --git a/tests/phpunit/tests/l10n/wpLocaleSwitcher.php b/tests/phpunit/tests/l10n/wpLocaleSwitcher.php
index 3b3661790f..7f769d4ea6 100644
--- a/tests/phpunit/tests/l10n/wpLocaleSwitcher.php
+++ b/tests/phpunit/tests/l10n/wpLocaleSwitcher.php
@@ -372,14 +372,14 @@ class Tests_L10n_wpLocaleSwitcher extends WP_UnitTestCase {
 		switch_to_locale( 'de_DE' );
 		switch_to_locale( $site_locale );
 
-		$expected = i18n_plugin_test();
+		$actual = i18n_plugin_test();
 
 		restore_current_locale();
 
 		$wp_locale_switcher = $locale_switcher;
 
 		$this->assertSame( 'en_US', get_locale() );
-		$this->assertSame( 'This is a dummy plugin', $expected );
+		$this->assertSame( 'This is a dummy plugin', $actual );
 	}
 
 	public function filter_locale() {
diff --git a/tests/phpunit/tests/link/editTermLink.php b/tests/phpunit/tests/link/editTermLink.php
new file mode 100644
index 0000000000..906014f067
--- /dev/null
+++ b/tests/phpunit/tests/link/editTermLink.php
@@ -0,0 +1,180 @@
+<?php
+
+/**
+ * @group  link
+ * @covers ::edit_term_link
+ */
+class Tests_Link_EditTermLink extends WP_UnitTestCase {
+
+	private static $terms;
+	private static $user_ids;
+
+	public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) {
+		self::register_custom_taxonomy();
+
+		$taxonomies = array( 'category', 'post_tag', 'custom_taxonomy' );
+		foreach ( $taxonomies as $taxonomy ) {
+			self::$terms[ $taxonomy ] = $factory->term->create_and_get( array( 'taxonomy' => $taxonomy ) );
+		}
+
+		self::$user_ids['admin']      = $factory->user->create( array( 'role' => 'administrator' ) );
+		self::$user_ids['subscriber'] = $factory->user->create( array( 'role' => 'subscriber' ) );
+	}
+
+	public function set_up() {
+		parent::set_up();
+		self::register_custom_taxonomy();
+	}
+
+	/**
+	 * @dataProvider data_edit_term_link
+	 *
+	 * @ticket 50225
+	 *
+	 * @param string $taxonomy Taxonomy being tested (used for index of term keys).
+	 * @param bool   $use_id   When true, pass term ID. Else, pass term object.
+	 * @param string $expected Expected URL within admin of edit link.
+	 */
+	public function test_edit_term_link_for_permitted_user( $taxonomy, $use_id, $expected ) {
+		wp_set_current_user( self::$user_ids['admin'] );
+		$term = $this->get_term( $taxonomy, $use_id );
+
+		// Term IDs are not known by the data provider so need to be replaced.
+		$expected = str_replace( '%ID%', $use_id ? $term : $term->term_id, $expected );
+		$expected = '"' . admin_url( $expected ) . '"';
+
+		$this->assertStringContainsString( $expected, edit_term_link( '', '', '', $term, false ) );
+		$this->assertStringContainsString( $expected, edit_term_link( '', '', '', get_term( $term, $taxonomy ), false ) );
+	}
+
+	/**
+	 * @dataProvider data_edit_term_link
+	 *
+	 * @ticket 50225
+	 *
+	 * @param string $taxonomy Taxonomy being tested (used for index of term keys).
+	 * @param bool   $use_id   When true, pass term ID. Else, pass term object.
+	 */
+	public function test_edit_term_link_for_denied_user( $taxonomy, $use_id ) {
+		wp_set_current_user( self::$user_ids['subscriber'] );
+		$term = $this->get_term( $taxonomy, $use_id );
+
+		$this->assertNull( edit_term_link( '', '', '', $term, false ) );
+		$this->assertNull( edit_term_link( '', '', '', get_term( $term, $taxonomy ), false ) );
+	}
+
+	/**
+	 * @dataProvider data_edit_term_link
+	 *
+	 * @ticket 50225
+	 *
+	 * @param string $taxonomy Taxonomy being tested (used for index of term keys).
+	 * @param bool   $use_id   When true, pass term ID. Else, pass term object.
+	 */
+	public function test_edit_term_link_filter_is_int_by_term_id( $taxonomy, $use_id ) {
+		wp_set_current_user( self::$user_ids['admin'] );
+		$term = $this->get_term( $taxonomy, $use_id );
+
+		add_filter(
+			'edit_term_link',
+			function( $location, $term ) {
+				$this->assertIsInt( $term );
+			},
+			10,
+			2
+		);
+
+		edit_term_link( '', '', '', $term, false );
+	}
+
+	/**
+	 * @dataProvider data_edit_term_link
+	 *
+	 * @ticket 50225
+	 *
+	 * @param string $taxonomy Taxonomy being tested (used for index of term keys).
+	 * @param bool   $use_id   When true, pass term ID. Else, pass term object.
+	 */
+	public function test_edit_term_link_filter_is_int_by_term_object( $taxonomy, $use_id ) {
+		wp_set_current_user( self::$user_ids['admin'] );
+		$term = $this->get_term( $taxonomy, $use_id );
+
+		add_filter(
+			'edit_term_link',
+			function( $location, $term ) {
+				$this->assertIsInt( $term );
+			},
+			10,
+			2
+		);
+
+		edit_term_link( '', '', '', get_term( $term, $taxonomy ), false );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_edit_term_link() {
+		return array(
+			'category passing term_id'          => array(
+				'taxonomy' => 'category',
+				'use_id'   => false,
+				'expected' => 'term.php?taxonomy=category&tag_ID=%ID%&post_type=post',
+			),
+			'category passing term object'      => array(
+				'taxonomy' => 'category',
+				'use_id'   => true,
+				'expected' => 'term.php?taxonomy=category&tag_ID=%ID%&post_type=post',
+			),
+			'post_tag passing term_id'          => array(
+				'taxonomy' => 'post_tag',
+				'use_id'   => false,
+				'expected' => 'term.php?taxonomy=post_tag&tag_ID=%ID%&post_type=post',
+			),
+			'post_tag passing term object'      => array(
+				'taxonomy' => 'post_tag',
+				'use_id'   => true,
+				'expected' => 'term.php?taxonomy=post_tag&tag_ID=%ID%&post_type=post',
+			),
+			'a custom taxonomy passing term_id' => array(
+				'taxonomy' => 'custom_taxonomy',
+				'use_id'   => false,
+				'expected' => 'term.php?taxonomy=custom_taxonomy&tag_ID=%ID%&post_type=post',
+			),
+			'a custom taxonomy passing term_id' => array(
+				'taxonomy' => 'custom_taxonomy',
+				'use_id'   => true,
+				'expected' => 'term.php?taxonomy=custom_taxonomy&tag_ID=%ID%&post_type=post',
+			),
+		);
+	}
+
+	/**
+	 * Helper to register a custom taxonomy for use in tests.
+	 *
+	 * @since 5.9.0
+	 */
+	private static function register_custom_taxonomy() {
+		register_taxonomy( 'custom_taxonomy', 'post' );
+	}
+
+	/**
+	 * Helper to get the term for the given taxonomy.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param string $taxonomy Taxonomy being tested (used for index of term keys).
+	 * @param bool   $use_id   When true, pass term ID. Else, pass term object.
+	 * @return WP_Term|int If $use_id is true, term ID is returned; else instance of WP_Term.
+	 */
+	private function get_term( $taxonomy, $use_id ) {
+		$term = self::$terms[ $taxonomy ];
+		if ( $use_id ) {
+			$term = $term->term_id;
+		}
+
+		return $term;
+	}
+}
diff --git a/tests/phpunit/tests/link/getEditTermLink.php b/tests/phpunit/tests/link/getEditTermLink.php
new file mode 100644
index 0000000000..29a0466b24
--- /dev/null
+++ b/tests/phpunit/tests/link/getEditTermLink.php
@@ -0,0 +1,180 @@
+<?php
+
+/**
+ * @group link
+ * @covers ::get_edit_term_link
+ */
+class Tests_Link_GetEditTermLink extends WP_UnitTestCase {
+
+	public static $terms;
+	public static $user_ids;
+
+	public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) {
+		self::register_custom_taxonomy();
+
+		$taxonomies = array( 'category', 'post_tag', 'custom_taxonomy' );
+		foreach ( $taxonomies as $taxonomy ) {
+			self::$terms[ $taxonomy ] = $factory->term->create_and_get( array( 'taxonomy' => $taxonomy ) );
+		}
+
+		self::$user_ids['admin']      = $factory->user->create( array( 'role' => 'administrator' ) );
+		self::$user_ids['subscriber'] = $factory->user->create( array( 'role' => 'subscriber' ) );
+	}
+
+	public function set_up() {
+		parent::set_up();
+		self::register_custom_taxonomy();
+	}
+
+	/**
+	 * @dataProvider data_get_edit_term_link
+	 *
+	 * @ticket 50225
+	 *
+	 * @param string $taxonomy Taxonomy being tested (used for index of term keys).
+	 * @param bool   $use_id   When true, pass term ID. Else, pass term object.
+	 * @param string $expected Expected URL within admin of edit link.
+	 */
+	public function test_get_edit_term_link_for_permitted_user( $taxonomy, $use_id, $expected ) {
+		wp_set_current_user( self::$user_ids['admin'] );
+		$term = $this->get_term( $taxonomy, $use_id );
+
+		// Term IDs are not known by the data provider so need to be replaced.
+		$expected = str_replace( '%ID%', $use_id ? $term : $term->term_id, $expected );
+		$expected = admin_url( $expected );
+
+		$this->assertSame( $expected, get_edit_term_link( $term, $taxonomy ) );
+		$this->assertSame( $expected, get_edit_term_link( get_term( $term, $taxonomy ), $taxonomy ) );
+	}
+
+	/**
+	 * @dataProvider data_get_edit_term_link
+	 *
+	 * @ticket 50225
+	 *
+	 * @param string $taxonomy Taxonomy being tested (used for index of term keys).
+	 * @param bool   $use_id   When true, pass term ID. Else, pass term object.
+	 */
+	public function test_get_edit_term_link_for_denied_user( $taxonomy, $use_id ) {
+		wp_set_current_user( self::$user_ids['subscriber'] );
+		$term = $this->get_term( $taxonomy, $use_id );
+
+		$this->assertNull( get_edit_term_link( $term, $taxonomy ) );
+		$this->assertNull( get_edit_term_link( get_term( $term, $taxonomy ), $taxonomy ) );
+	}
+
+	/**
+	 * @dataProvider data_get_edit_term_link
+	 *
+	 * @ticket 50225
+	 *
+	 * @param string $taxonomy Taxonomy being tested (used for index of term keys).
+	 * @param bool   $use_id   When true, pass term ID. Else, pass term object.
+	 */
+	public function test_get_edit_term_link_filter_is_int_by_term_id( $taxonomy, $use_id ) {
+		wp_set_current_user( self::$user_ids['admin'] );
+		$term = $this->get_term( $taxonomy, $use_id );
+
+		add_filter(
+			'get_edit_term_link',
+			function( $location, $term ) {
+				$this->assertIsInt( $term );
+			},
+			10,
+			2
+		);
+
+		get_edit_term_link( $term, $taxonomy );
+	}
+
+	/**
+	 * @dataProvider data_get_edit_term_link
+	 *
+	 * @ticket 50225
+	 *
+	 * @param string $taxonomy Taxonomy being tested (used for index of term keys).
+	 * @param bool   $use_id   When true, pass term ID. Else, pass term object.
+	 */
+	public function test_get_edit_term_link_filter_is_int_by_term_object( $taxonomy, $use_id ) {
+		wp_set_current_user( self::$user_ids['admin'] );
+		$term = $this->get_term( $taxonomy, $use_id );
+
+		add_filter(
+			'get_edit_term_link',
+			function( $location, $term ) {
+				$this->assertIsInt( $term );
+			},
+			10,
+			2
+		);
+
+		get_edit_term_link( get_term( $term, $taxonomy ), $taxonomy );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_get_edit_term_link() {
+		return array(
+			'category passing term_id'          => array(
+				'taxonomy' => 'category',
+				'use_id'   => false,
+				'expected' => 'term.php?taxonomy=category&tag_ID=%ID%&post_type=post',
+			),
+			'category passing term object'      => array(
+				'taxonomy' => 'category',
+				'use_id'   => true,
+				'expected' => 'term.php?taxonomy=category&tag_ID=%ID%&post_type=post',
+			),
+			'post_tag passing term_id'          => array(
+				'taxonomy' => 'post_tag',
+				'use_id'   => false,
+				'expected' => 'term.php?taxonomy=post_tag&tag_ID=%ID%&post_type=post',
+			),
+			'post_tag passing term object'      => array(
+				'taxonomy' => 'post_tag',
+				'use_id'   => true,
+				'expected' => 'term.php?taxonomy=post_tag&tag_ID=%ID%&post_type=post',
+			),
+			'a custom taxonomy passing term_id' => array(
+				'taxonomy' => 'custom_taxonomy',
+				'use_id'   => false,
+				'expected' => 'term.php?taxonomy=custom_taxonomy&tag_ID=%ID%&post_type=post',
+			),
+			'a custom taxonomy passing term_id' => array(
+				'taxonomy' => 'custom_taxonomy',
+				'use_id'   => true,
+				'expected' => 'term.php?taxonomy=custom_taxonomy&tag_ID=%ID%&post_type=post',
+			),
+		);
+	}
+
+	/**
+	 * Helper to register a custom taxonomy for use in tests.
+	 *
+	 * @since 5.9.0
+	 */
+	private static function register_custom_taxonomy() {
+		register_taxonomy( 'custom_taxonomy', 'post' );
+	}
+
+	/**
+	 * Helper to get the term for the given taxonomy.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param string $taxonomy Taxonomy being tested (used for index of term keys).
+	 * @param bool   $use_id   When true, pass term ID. Else, pass term object.
+	 * @return WP_Term|int If $use_id is true, term ID is returned; else instance of WP_Term.
+	 */
+	private function get_term( $taxonomy, $use_id ) {
+		$term = self::$terms[ $taxonomy ];
+		if ( $use_id ) {
+			$term = $term->term_id;
+		}
+
+		return $term;
+	}
+}
diff --git a/tests/phpunit/tests/media.php b/tests/phpunit/tests/media.php
index 0483f0c084..5d92d9718b 100644
--- a/tests/phpunit/tests/media.php
+++ b/tests/phpunit/tests/media.php
@@ -510,6 +510,57 @@ https://w.org</a>',
 	 * @ticket 22960
 	 */
 	public function test_post_galleries_images() {
+		$ids1      = array();
+		$ids1_srcs = array();
+		foreach ( range( 1, 6 ) as $i ) {
+			$attachment_id = self::factory()->attachment->create_object(
+				"image$i.jpg",
+				0,
+				array(
+					'post_mime_type' => 'image/jpeg',
+					'post_type'      => 'attachment',
+				)
+			);
+			$metadata      = array_merge( array( 'file' => "image$i.jpg" ), $this->img_meta );
+			wp_update_attachment_metadata( $attachment_id, $metadata );
+			$ids1[]      = $attachment_id;
+			$ids1_srcs[] = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . "image$i.jpg";
+		}
+
+		$ids2      = array();
+		$ids2_srcs = array();
+		foreach ( range( 4, 6 ) as $i ) {
+			$attachment_id = self::factory()->attachment->create_object(
+				"image$i.jpg",
+				0,
+				array(
+					'post_mime_type' => 'image/jpeg',
+					'post_type'      => 'attachment',
+				)
+			);
+			$metadata      = array_merge( array( 'file' => "image$i.jpg" ), $this->img_meta );
+			wp_update_attachment_metadata( $attachment_id, $metadata );
+			$ids2[]      = $attachment_id;
+			$ids2_srcs[] = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . "image$i.jpg";
+		}
+
+		$ids1_joined = join( ',', array_slice( $ids1, 0, 3 ) );
+		$ids2_joined = join( ',', array_slice( $ids2, 3, 3 ) );
+
+		$blob    = <<<BLOB
+[gallery ids="$ids1_joined"]
+
+[gallery ids="$ids2_joined"]
+BLOB;
+		$post_id = self::factory()->post->create( array( 'post_content' => $blob ) );
+		$srcs    = get_post_galleries_images( $post_id );
+		$this->assertSameSetsWithIndex( $srcs, array( array_slice( $ids1_srcs, 0, 3 ), array_slice( $ids2_srcs, 3, 3 ) ) );
+	}
+
+	/**
+	 * @ticket 22960
+	 */
+	public function test_post_gallery_images() {
 		$ids1      = array();
 		$ids1_srcs = array();
 		foreach ( range( 1, 3 ) as $i ) {
@@ -553,115 +604,138 @@ https://w.org</a>',
 [gallery ids="$ids2_joined"]
 BLOB;
 		$post_id = self::factory()->post->create( array( 'post_content' => $blob ) );
-		$srcs    = get_post_galleries_images( $post_id );
-		$this->assertSame( $srcs, array( $ids1_srcs, $ids2_srcs ) );
+		$srcs    = get_post_gallery_images( $post_id );
+		$this->assertSame( $srcs, $ids1_srcs );
 	}
 
 	/**
-	 * @ticket 39304
+	 * @ticket 43826
+	 * @group blocks
 	 */
-	public function test_post_galleries_images_without_global_post() {
-		// Set up an unattached image.
-		$this->factory->attachment->create_object(
-			array(
-				'file'           => 'test.jpg',
-				'post_parent'    => 0,
-				'post_mime_type' => 'image/jpeg',
-				'post_type'      => 'attachment',
-			)
-		);
-
-		$post_id = $this->factory->post->create(
-			array(
-				'post_content' => '[gallery]',
-			)
-		);
+	public function test_block_post_gallery_images() {
+		// Similar to test_post_gallery_images but with blocks instead of shortcodes
+		$ids      = array();
+		$imgs     = array();
+		$ids_srcs = array();
+		foreach ( range( 1, 6 ) as $i ) {
+			$attachment_id = self::factory()->attachment->create_object(
+				"image$i.jpg",
+				0
+			);
+			$metadata      = array_merge( array( 'file' => "image$i.jpg" ), $this->img_meta );
+			wp_update_attachment_metadata( $attachment_id, $metadata );
+			$ids[]      = $attachment_id;
+			$url        = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . "image$i.jpg";
+			$ids_srcs[] = $url;
+			$imgs[]     = '<figure><img src="' . $url . '" data-id="' . $i . '" /></figure>';
+		}
 
-		$galleries = get_post_galleries( $post_id, false );
+		$imgs1_joined = join( "\n", array_slice( $imgs, 0, 3 ) );
+		$imgs2_joined = join( "\n", array_slice( $imgs, 3, 3 ) );
 
-		$this->assertEmpty( $galleries[0]['src'] );
+		$blob    = <<<BLOB
+<!-- wp:gallery -->
+$imgs1_joined
+<!-- /wp:gallery -->
+<!-- wp:gallery -->
+$imgs2_joined
+<!-- /wp:gallery -->
+BLOB;
+		$post_id = self::factory()->post->create( array( 'post_content' => $blob ) );
+		$srcs    = get_post_gallery_images( $post_id );
+		$this->assertSameSetsWithIndex( array_slice( $ids_srcs, 0, 3 ), $srcs );
 	}
 
 	/**
-	 * @ticket 39304
+	 * @ticket 43826
+	 * @group blocks
 	 */
-	public function test_post_galleries_ignores_global_post() {
-		$global_post_id = $this->factory->post->create(
-			array(
-				'post_content' => 'Global Post',
-			)
-		);
-		$post_id        = $this->factory->post->create(
-			array(
-				'post_content' => '[gallery]',
-			)
-		);
-		$this->factory->attachment->create_object(
-			array(
-				'file'           => 'test.jpg',
-				'post_parent'    => $post_id,
-				'post_mime_type' => 'image/jpeg',
-				'post_type'      => 'attachment',
-			)
-		);
-		$expected_srcs = array(
-			'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/test.jpg',
-		);
+	public function test_block_post_gallery_images_json() {
+		// Similar to test_block_post_gallery_images, with IDs in the json blob
+		$ids      = array();
+		$imgs     = array();
+		$ids_srcs = array();
+		foreach ( range( 1, 6 ) as $i ) {
+			$attachment_id = self::factory()->attachment->create_object(
+				"image$i.jpg",
+				0
+			);
+			$metadata      = array_merge( array( 'file' => "image$i.jpg" ), $this->img_meta );
+			wp_update_attachment_metadata( $attachment_id, $metadata );
+			$ids[]      = $attachment_id;
+			$url        = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . "image$i.jpg";
+			$ids_srcs[] = $url;
+			$imgs[]     = '<figure><img src="' . $url . '" data-id="' . $i . '" /></figure>';
+
+		}
 
-		// Set the global $post context to the other post.
-		$GLOBALS['post'] = get_post( $global_post_id );
+		$ids1_joined = join( ',', array_slice( $ids, 0, 3 ) );
+		$ids2_joined = join( ',', array_slice( $ids, 3, 3 ) );
 
-		$galleries = get_post_galleries( $post_id, false );
+		$blob    = <<<BLOB
+<!-- wp:gallery {"ids":[$ids1_joined]} -->
+<!-- /wp:gallery -->
 
-		$this->assertNotEmpty( $galleries[0]['src'] );
-		$this->assertSame( $galleries[0]['src'], $expected_srcs );
+<!-- wp:gallery {"ids":[$ids2_joined]} -->
+<!-- /wp:gallery -->
+BLOB;
+		$post_id = self::factory()->post->create( array( 'post_content' => $blob ) );
+		$srcs    = get_post_gallery_images( $post_id );
+		$this->assertSameSetsWithIndex( array_slice( $ids_srcs, 0, 3 ), $srcs );
 	}
 
 	/**
-	 * @ticket 39304
+	 * @ticket 43826
+	 * @group blocks
 	 */
-	public function test_post_galleries_respects_id_attrs() {
-		$post_id     = $this->factory->post->create(
-			array(
-				'post_content' => 'No gallery defined',
-			)
-		);
-		$post_id_two = $this->factory->post->create(
-			array(
-				'post_content' => "[gallery id='$post_id']",
-			)
-		);
-		$this->factory->attachment->create_object(
-			array(
-				'file'           => 'test.jpg',
-				'post_parent'    => $post_id,
-				'post_mime_type' => 'image/jpeg',
-				'post_type'      => 'attachment',
-			)
-		);
-		$expected_srcs = array(
-			'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/test.jpg',
-		);
-
-		$galleries = get_post_galleries( $post_id_two, false );
+	public function test_mixed_post_gallery_images() {
+		// Similar to test_post_gallery_images but with a shortcode and a block in the same post
+		$ids      = array();
+		$imgs     = array();
+		$ids_srcs = array();
+		foreach ( range( 1, 6 ) as $i ) {
+			$attachment_id = self::factory()->attachment->create_object(
+				"image$i.jpg",
+				0,
+				array(
+					'post_mime_type' => 'image/jpeg',
+					'post_type'      => 'attachment',
+				)
+			);
+			$metadata      = array_merge( array( 'file' => "image$i.jpg" ), $this->img_meta );
+			wp_update_attachment_metadata( $attachment_id, $metadata );
+			$ids[]      = $attachment_id;
+			$url        = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . "image$i.jpg";
+			$ids_srcs[] = $url;
+			$imgs[]     = '<figure><img src="' . $url . '" data-id="' . $i . '" /></figure>';
+		}
 
-		// Set the global $post context.
-		$GLOBALS['post']               = get_post( $post_id_two );
-		$galleries_with_global_context = get_post_galleries( $post_id_two, false );
+		$ids1_joined  = join( "\n", array_slice( $ids, 0, 3 ) );
+		$ids2_joined  = join( "\n", array_slice( $ids, 3, 3 ) );
+		$imgs2_joined = join( "\n", array_slice( $imgs, 3, 3 ) );
 
-		// Check that the global post state doesn't affect the results.
-		$this->assertSame( $galleries, $galleries_with_global_context );
+		$blob    = <<<BLOB
+[gallery ids="$ids1_joined"]
 
-		$this->assertNotEmpty( $galleries[0]['src'] );
-		$this->assertSame( $galleries[0]['src'], $expected_srcs );
+[gallery ids="$ids2_joined"]
+<!-- wp:gallery -->
+$imgs2_joined
+<!-- /wp:gallery -->
+BLOB;
+		$post_id = self::factory()->post->create( array( 'post_content' => $blob ) );
+		$srcs    = get_post_gallery_images( $post_id );
+		$this->assertSameSetsWithIndex( array_slice( $ids_srcs, 0, 3 ), $srcs );
 	}
 
 	/**
-	 * @ticket 22960
+	 * @ticket 43826
+	 * @group blocks
 	 */
-	public function test_post_gallery_images() {
-		$ids1      = array();
-		$ids1_srcs = array();
+	public function test_block_inner_post_gallery_images() {
+		// Make sure get_post_gallery_images() works with gallery blocks that are nested inside something else
+		$ids      = array();
+		$imgs     = array();
+		$ids_srcs = array();
 		foreach ( range( 1, 3 ) as $i ) {
 			$attachment_id = self::factory()->attachment->create_object(
 				"image$i.jpg",
@@ -673,13 +747,39 @@ BLOB;
 			);
 			$metadata      = array_merge( array( 'file' => "image$i.jpg" ), $this->img_meta );
 			wp_update_attachment_metadata( $attachment_id, $metadata );
-			$ids1[]      = $attachment_id;
-			$ids1_srcs[] = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . "image$i.jpg";
+			$ids[]      = $attachment_id;
+			$url        = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . "image$i.jpg";
+			$ids_srcs[] = $url;
+			$imgs[]     = '<figure><img src="' . $url . '" data-id="' . $i . '" /></figure>';
+
 		}
 
-		$ids2      = array();
-		$ids2_srcs = array();
-		foreach ( range( 4, 6 ) as $i ) {
+		$imgs_joined = join( "\n", $imgs );
+
+		$blob    = <<<BLOB
+<!-- wp:columns -->
+<!-- wp:column -->
+<!-- wp:gallery -->
+$imgs_joined
+<!-- /wp:gallery -->
+<!-- /wp:column -->
+<!-- /wp:columns -->
+BLOB;
+		$post_id = self::factory()->post->create( array( 'post_content' => $blob ) );
+		$srcs    = get_post_gallery_images( $post_id );
+		$this->assertSameSetsWithIndex( $ids_srcs, $srcs );
+	}
+
+	/**
+	 * @ticket 43826
+	 * @group blocks
+	 */
+	public function test_block_post_gallery_innerblock_images() {
+		// Make sure get_post_gallery_images() works with new version of gallery block with nested image blocks.
+		$ids      = array();
+		$imgs     = array();
+		$ids_srcs = array();
+		foreach ( range( 1, 3 ) as $i ) {
 			$attachment_id = self::factory()->attachment->create_object(
 				"image$i.jpg",
 				0,
@@ -690,21 +790,25 @@ BLOB;
 			);
 			$metadata      = array_merge( array( 'file' => "image$i.jpg" ), $this->img_meta );
 			wp_update_attachment_metadata( $attachment_id, $metadata );
-			$ids2[]      = $attachment_id;
-			$ids2_srcs[] = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . "image$i.jpg";
+			$ids[]      = $attachment_id;
+			$url        = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . "image$i.jpg";
+			$ids_srcs[] = $url;
+			$imgs[]     = '<!-- wp:image {"id":' . $attachment_id . ',"sizeSlug":"large","linkDestination":"none"} --><figure class="wp-block-image size-large"><img src="' . $url . '" /></figure><!-- /wp:image -->';
+
 		}
 
-		$ids1_joined = implode( ',', $ids1 );
-		$ids2_joined = implode( ',', $ids2 );
+		$imgs_joined = join( "\n", $imgs );
 
 		$blob    = <<<BLOB
-[gallery ids="$ids1_joined"]
-
-[gallery ids="$ids2_joined"]
+<!-- wp:gallery -->
+<figure class="wp-block-gallery has-nested-images columns-default is-cropped">
+$imgs_joined
+</figure>
+<!-- /wp:gallery -->
 BLOB;
 		$post_id = self::factory()->post->create( array( 'post_content' => $blob ) );
 		$srcs    = get_post_gallery_images( $post_id );
-		$this->assertSame( $srcs, $ids1_srcs );
+		$this->assertSameSetsWithIndex( $ids_srcs, $srcs );
 	}
 
 	public function test_get_media_embedded_in_content() {
@@ -3024,6 +3128,7 @@ EOF;
 	/**
 	 * @ticket 50425
 	 * @ticket 53463
+	 * @ticket 53675
 	 * @dataProvider data_wp_lazy_loading_enabled_context_defaults
 	 *
 	 * @param string $context  Function context.
@@ -3046,6 +3151,7 @@ EOF;
 			'widget_block_content => true'    => array( 'widget_block_content', true ),
 			'get_avatar => true'              => array( 'get_avatar', true ),
 			'arbitrary context => true'       => array( 'something_completely_arbitrary', true ),
+			'the_post_thumbnail => true'      => array( 'the_post_thumbnail', true ),
 		);
 	}
 
@@ -3186,6 +3292,178 @@ EOF;
 			array( 'trash-attachment', '/?attachment_id=%ID%', false ),
 		);
 	}
+
+	/**
+	 * @ticket 53675
+	 * @dataProvider data_wp_get_loading_attr_default
+	 *
+	 * @param string $context
+	 */
+	function test_wp_get_loading_attr_default( $context ) {
+		global $wp_query, $wp_the_query;
+
+		// Return 'lazy' by default.
+		$this->assertSame( 'lazy', wp_get_loading_attr_default( 'test' ) );
+		$this->assertSame( 'lazy', wp_get_loading_attr_default( 'wp_get_attachment_image' ) );
+
+		// Return 'lazy' if not in the loop or the main query.
+		$this->assertSame( 'lazy', wp_get_loading_attr_default( $context ) );
+
+		$wp_query = new WP_Query( array( 'post__in' => array( self::$post_ids['publish'] ) ) );
+		$this->reset_content_media_count();
+		$this->reset_omit_loading_attr_filter();
+
+		while ( have_posts() ) {
+			the_post();
+
+			// Return 'lazy' if in the loop but not in the main query.
+			$this->assertSame( 'lazy', wp_get_loading_attr_default( $context ) );
+
+			// Set as main query.
+			$wp_the_query = $wp_query;
+
+			// For contexts other than for the main content, still return 'lazy' even in the loop
+			// and in the main query, and do not increase the content media count.
+			$this->assertSame( 'lazy', wp_get_loading_attr_default( 'wp_get_attachment_image' ) );
+
+			// Return `false` if in the loop and in the main query and it is the first element.
+			$this->assertFalse( wp_get_loading_attr_default( $context ) );
+
+			// Return 'lazy' if in the loop and in the main query for any subsequent elements.
+			$this->assertSame( 'lazy', wp_get_loading_attr_default( $context ) );
+
+			// Yes, for all subsequent elements.
+			$this->assertSame( 'lazy', wp_get_loading_attr_default( $context ) );
+		}
+	}
+
+	function data_wp_get_loading_attr_default() {
+		return array(
+			array( 'the_content' ),
+			array( 'the_post_thumbnail' ),
+		);
+	}
+
+	/**
+	 * @ticket 53675
+	 */
+	function test_wp_omit_loading_attr_threshold_filter() {
+		global $wp_query, $wp_the_query;
+
+		$wp_query     = new WP_Query( array( 'post__in' => array( self::$post_ids['publish'] ) ) );
+		$wp_the_query = $wp_query;
+		$this->reset_content_media_count();
+		$this->reset_omit_loading_attr_filter();
+
+		// Use the filter to alter the threshold for not lazy-loading to the first three elements.
+		add_filter(
+			'wp_omit_loading_attr_threshold',
+			function() {
+				return 3;
+			}
+		);
+
+		while ( have_posts() ) {
+			the_post();
+
+			// Due to the filter, now the first three elements should not be lazy-loaded, i.e. return `false`.
+			for ( $i = 0; $i < 3; $i++ ) {
+				$this->assertFalse( wp_get_loading_attr_default( 'the_content' ) );
+			}
+
+			// For following elements, lazy-load them again.
+			$this->assertSame( 'lazy', wp_get_loading_attr_default( 'the_content' ) );
+		}
+	}
+
+	/**
+	 * @ticket 53675
+	 */
+	function test_wp_filter_content_tags_with_wp_get_loading_attr_default() {
+		global $wp_query, $wp_the_query;
+
+		$img1         = get_image_tag( self::$large_id, '', '', '', 'large' );
+		$iframe1      = '<iframe src="https://www.example.com" width="640" height="360"></iframe>';
+		$img2         = get_image_tag( self::$large_id, '', '', '', 'medium' );
+		$img3         = get_image_tag( self::$large_id, '', '', '', 'thumbnail' );
+		$iframe2      = '<iframe src="https://wordpress.org" width="640" height="360"></iframe>';
+		$lazy_img2    = wp_img_tag_add_loading_attr( $img2, 'the_content' );
+		$lazy_img3    = wp_img_tag_add_loading_attr( $img3, 'the_content' );
+		$lazy_iframe2 = wp_iframe_tag_add_loading_attr( $iframe2, 'the_content' );
+
+		// Use a threshold of 2.
+		add_filter(
+			'wp_omit_loading_attr_threshold',
+			function() {
+				return 2;
+			}
+		);
+
+		// Following the threshold of 2, the first two content media elements should not be lazy-loaded.
+		$content_unfiltered = $img1 . $iframe1 . $img2 . $img3 . $iframe2;
+		$content_expected   = $img1 . $iframe1 . $lazy_img2 . $lazy_img3 . $lazy_iframe2;
+
+		$wp_query     = new WP_Query( array( 'post__in' => array( self::$post_ids['publish'] ) ) );
+		$wp_the_query = $wp_query;
+		$this->reset_content_media_count();
+		$this->reset_omit_loading_attr_filter();
+
+		while ( have_posts() ) {
+			the_post();
+
+			add_filter( 'wp_img_tag_add_srcset_and_sizes_attr', '__return_false' );
+			$content_filtered = wp_filter_content_tags( $content_unfiltered, 'the_content' );
+			remove_filter( 'wp_img_tag_add_srcset_and_sizes_attr', '__return_false' );
+		}
+
+		// After filtering, the first image should not be lazy-loaded while the other ones should be.
+		$this->assertSame( $content_expected, $content_filtered );
+	}
+
+	/**
+	 * @ticket 53675
+	 */
+	public function test_wp_omit_loading_attr_threshold() {
+		$this->reset_omit_loading_attr_filter();
+
+		// Apply filter, ensure default value of 1.
+		$omit_threshold = wp_omit_loading_attr_threshold();
+		$this->assertSame( 1, $omit_threshold );
+
+		// Add a filter that changes the value to 3. However, the filter is not applied a subsequent time in a single
+		// page load by default, so the value is still 1.
+		add_filter(
+			'wp_omit_loading_attr_threshold',
+			function() {
+				return 3;
+			}
+		);
+		$omit_threshold = wp_omit_loading_attr_threshold();
+		$this->assertSame( 1, $omit_threshold );
+
+		// Only by enforcing a fresh check, the filter gets re-applied.
+		$omit_threshold = wp_omit_loading_attr_threshold( true );
+		$this->assertSame( 3, $omit_threshold );
+	}
+
+	private function reset_content_media_count() {
+		// Get current value without increasing.
+		$content_media_count = wp_increase_content_media_count( 0 );
+
+		// Decrease it by its current value to "reset" it back to 0.
+		wp_increase_content_media_count( - $content_media_count );
+	}
+
+	private function reset_omit_loading_attr_filter() {
+		// Add filter to "reset" omit threshold back to null (unset).
+		add_filter( 'wp_omit_loading_attr_threshold', '__return_null', 100 );
+
+		// Force filter application to re-run.
+		wp_omit_loading_attr_threshold( true );
+
+		// Clean up the above filter.
+		remove_filter( 'wp_omit_loading_attr_threshold', '__return_null', 100 );
+	}
 }
 
 /**
diff --git a/tests/phpunit/tests/media/getPostGalleries.php b/tests/phpunit/tests/media/getPostGalleries.php
new file mode 100644
index 0000000000..bd114b899f
--- /dev/null
+++ b/tests/phpunit/tests/media/getPostGalleries.php
@@ -0,0 +1,969 @@
+<?php
+/**
+ * @group media
+ *
+ * @covers ::get_post_galleries
+ */
+class Tests_Functions_getPostGalleries extends WP_UnitTestCase {
+
+	public function set_up() {
+		parent::set_up();
+		$this->img_meta = array(
+			'width'  => 100,
+			'height' => 100,
+			'sizes'  => '',
+		);
+	}
+
+	/**
+	 * Test that an empty array is returned for a post that does not exist.
+	 *
+	 * @ticket 43826
+	 */
+	public function test_returns_empty_array_with_non_existent_post() {
+		$galleries = get_post_galleries( 99999, false );
+		$this->assertEmpty( $galleries );
+	}
+
+	/**
+	 * Test that an empty array is returned for a post that has no gallery.
+	 *
+	 * @ticket 43826
+	 */
+	public function test_returns_empty_array_with_post_with_no_gallery() {
+		$post_id = $this->factory->post->create(
+			array(
+				'post_content' => '<p>A post with no gallery</p>',
+			)
+		);
+
+		$galleries = get_post_galleries( $post_id, false );
+		$this->assertEmpty( $galleries );
+	}
+
+	/**
+	 * Test that no srcs are returned for a shortcode gallery
+	 * in a post with no attached images.
+	 *
+	 * @ticket 39304
+	 *
+	 * @group shortcode
+	 */
+	public function test_returns_no_srcs_with_shortcode_in_post_with_no_attached_images() {
+		// Set up an unattached image.
+		$this->factory->attachment->create_object(
+			array(
+				'file'           => 'test.jpg',
+				'post_parent'    => 0,
+				'post_mime_type' => 'image/jpeg',
+				'post_type'      => 'attachment',
+			)
+		);
+
+		$post_id = $this->factory->post->create(
+			array(
+				'post_content' => '[gallery]',
+			)
+		);
+
+		$galleries = get_post_galleries( $post_id, false );
+
+		// The method can return an empty array.
+		$this->assertNotEmpty(
+			$galleries,
+			'The galleries array is empty.'
+		);
+
+		// This prevents future changes from causing
+		// backwards compatibility breaks.
+		$this->assertArrayHasKey(
+			'src',
+			$galleries[0],
+			'A src key does not exist.'
+		);
+
+		$this->assertEmpty(
+			$galleries[0]['src'],
+			'The src key is not empty.'
+		);
+	}
+
+	/**
+	 * Test that no srcs are returned for a gallery block
+	 * in a post with no attached images.
+	 *
+	 * @ticket 43826
+	 *
+	 * @group blocks
+	 */
+	public function test_returns_no_srcs_with_block_in_post_with_no_attached_images() {
+		// Set up an unattached image.
+		$this->factory->attachment->create_object(
+			array(
+				'file'           => 'test.jpg',
+				'post_parent'    => 0,
+				'post_mime_type' => 'image/jpeg',
+				'post_type'      => 'attachment',
+			)
+		);
+
+		$post_id = $this->factory->post->create(
+			array(
+				'post_content' => '<!-- wp:gallery -->',
+			)
+		);
+
+		$galleries = get_post_galleries( $post_id, false );
+
+		// The method can return an empty array.
+		$this->assertNotEmpty(
+			$galleries,
+			'The galleries array is empty.'
+		);
+
+		// The method can return an array of strings
+		// instead of an array of arrays.
+		$this->assertIsArray(
+			$galleries[0],
+			'The returned data does not contain an array.'
+		);
+
+		// This prevents future changes from causing
+		// backwards compatibility breaks.
+		$this->assertArrayHasKey(
+			'src',
+			$galleries[0],
+			'A src key does not exist.'
+		);
+
+		$this->assertEmpty(
+			$galleries[0]['src'],
+			'The src key of the first gallery is not empty.'
+		);
+	}
+
+	/**
+	 * Test that no srcs are returned for a gallery block v2
+	 * in a post with no attached images.
+	 *
+	 * @ticket 43826
+	 *
+	 * @group blocks
+	 */
+	public function test_returns_no_srcs_with_block_v2_in_post_with_no_attached_images() {
+		// Set up an unattached image.
+		$image_id = $this->factory->attachment->create_object(
+			array(
+				'file'           => 'test.jpg',
+				'post_parent'    => 0,
+				'post_mime_type' => 'image/jpeg',
+				'post_type'      => 'attachment',
+			)
+		);
+
+		$image_url = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/test.jpg';
+
+		$blob = <<< BLOB
+<!-- wp:gallery {"linkTo":"none","className":"columns-2"} -->
+<figure
+	class="wp-block-gallery has-nested-images columns-default is-cropped columns-2"
+>
+	<!-- wp:image {"id":$image_id,"sizeSlug":"large","linkDestination":"none"} -->
+	<figure class="wp-block-image size-large">
+		<img
+			src="$image_url"
+			alt="Image gallery image"
+			class="wp-image-$image_id"
+		/>
+	</figure>
+	<!-- /wp:image -->
+</figure>
+<!-- /wp:gallery -->
+BLOB;
+
+		$post_id = $this->factory->post->create(
+			array(
+				'post_content' => $blob,
+			)
+		);
+
+		$expected_srcs = array( $image_url );
+		$galleries     = get_post_galleries( $post_id, false );
+
+		// The method can return an empty array.
+		$this->assertNotEmpty(
+			$galleries,
+			'The galleries array is empty.'
+		);
+
+		// The method can return an array of strings
+		// instead of an array of arrays.
+		$this->assertIsArray(
+			$galleries[0],
+			'The returned data does not contain an array.'
+		);
+
+		// This prevents future changes from causing
+		// backwards compatibility breaks.
+		$this->assertArrayHasKey(
+			'src',
+			$galleries[0],
+			'A src key does not exist.'
+		);
+
+		$this->assertSameSetsWithIndex(
+			$expected_srcs,
+			$galleries[0]['src'],
+			'The expected and actual srcs are not the same.'
+		);
+	}
+
+	/**
+	 * Test that HTML is returned for a shortcode gallery.
+	 *
+	 * @ticket 43826
+	 *
+	 * @group shortcode
+	 */
+	public function test_returns_html_with_shortcode_gallery() {
+		$post_id = $this->factory->post->create(
+			array(
+				'post_content' => 'I have no gallery',
+			)
+		);
+
+		$post_id_two = $this->factory->post->create(
+			array(
+				'post_content' => "[gallery id='$post_id']",
+			)
+		);
+
+		$this->factory->attachment->create_object(
+			array(
+				'file'           => 'test.jpg',
+				'post_parent'    => $post_id,
+				'post_mime_type' => 'image/jpeg',
+				'post_type'      => 'attachment',
+			)
+		);
+
+		$expected  = 'src="http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/test.jpg"';
+		$galleries = get_post_galleries( $post_id_two );
+
+		// The method can return an empty array.
+		$this->assertNotEmpty(
+			$galleries,
+			'The galleries array is empty.'
+		);
+
+		// The method can return an array of arrays
+		// instead of an array of strings.
+		$this->assertIsString(
+			$galleries[0],
+			'Did not return the data as a string.'
+		);
+
+		$this->assertStringContainsString(
+			$expected,
+			$galleries[0],
+			'The returned data did not contain a src attribute with the expected image URL.'
+		);
+	}
+
+	/**
+	 * Test that HTML is returned for a block gallery.
+	 *
+	 * @ticket 43826
+	 *
+	 * @group blocks
+	 */
+	public function test_returns_html_with_block_gallery() {
+		$post_id = $this->factory->post->create(
+			array(
+				'post_content' => 'I have no gallery.',
+			)
+		);
+
+		// Set up an unattached image.
+		$image_id = $this->factory->attachment->create(
+			array(
+				'file'           => 'test.jpg',
+				'post_parent'    => $post_id,
+				'post_mime_type' => 'image/jpeg',
+				'post_type'      => 'attachment',
+			)
+		);
+
+		$image_url = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/test.jpg';
+
+		$blob = <<< BLOB
+<!-- wp:gallery -->
+<figure><img src="$image_url" data-id="$image_id" /></figure>
+<!-- /wp:gallery -->
+BLOB;
+
+		$post_id_two = $this->factory->post->create(
+			array(
+				'post_content' => $blob,
+			)
+		);
+
+		$expected  = 'src="http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/test.jpg"';
+		$galleries = get_post_galleries( $post_id_two );
+
+		// The method can return an empty array.
+		$this->assertNotEmpty(
+			$galleries,
+			'The galleries array is empty.'
+		);
+
+		// The method can return an array of arrays
+		// instead of an array of strings.
+		$this->assertIsString(
+			$galleries[0],
+			'Did not return the data as a string.'
+		);
+
+		$this->assertStringContainsString(
+			$expected,
+			$galleries[0],
+			'The returned data did not contain a src attribute with the expected image URL.'
+		);
+	}
+
+	/**
+	 * Test that HTML is returned for a block gallery v2.
+	 *
+	 * @ticket 43826
+	 *
+	 * @group blocks
+	 */
+	public function test_returns_html_with_block_gallery_v2() {
+		$image_id = $this->factory->attachment->create_object(
+			array(
+				'file'           => 'test.jpg',
+				'post_parent'    => 0,
+				'post_mime_type' => 'image/jpeg',
+				'post_type'      => 'attachment',
+			)
+		);
+
+		$image_url = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/test.jpg';
+
+		$blob = <<< BLOB
+<!-- wp:gallery {"linkTo":"none","className":"columns-2"} -->
+<figure
+	class="wp-block-gallery has-nested-images columns-default is-cropped columns-2"
+>
+	<!-- wp:image {"id":$image_id,"sizeSlug":"large","linkDestination":"none"} -->
+	<figure class="wp-block-image size-large">
+		<img
+			src="$image_url"
+			alt="Image gallery image"
+			class="wp-image-$image_id"
+		/>
+	</figure>
+	<!-- /wp:image -->
+</figure>
+<!-- /wp:gallery -->
+BLOB;
+
+		$post_id = $this->factory->post->create(
+			array(
+				'post_content' => $blob,
+			)
+		);
+
+		$expected  = 'src="http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/test.jpg"';
+		$galleries = get_post_galleries( $post_id );
+
+		// The method can return an empty array.
+		$this->assertNotEmpty(
+			$galleries,
+			'The galleries array is empty.'
+		);
+
+		// The method can return an array of arrays
+		// instead of an array of strings.
+		$this->assertIsString(
+			$galleries[0],
+			'Did not return the data as a string.'
+		);
+
+		$this->assertStringContainsString(
+			$expected,
+			$galleries[0],
+			'The returned data did not contain a src attribute with the expected image URL.'
+		);
+	}
+
+	/**
+	 * Test that the global post object does not override
+	 * a provided post ID with a shortcode gallery.
+	 *
+	 * @ticket 39304
+	 *
+	 * @group shortcode
+	 */
+	public function test_respects_post_id_with_shortcode_gallery() {
+		$global_post_id = $this->factory->post->create(
+			array(
+				'post_content' => 'Global Post',
+			)
+		);
+		$post_id        = $this->factory->post->create(
+			array(
+				'post_content' => '[gallery]',
+			)
+		);
+		$this->factory->attachment->create_object(
+			array(
+				'file'           => 'test.jpg',
+				'post_parent'    => $post_id,
+				'post_mime_type' => 'image/jpeg',
+				'post_type'      => 'attachment',
+			)
+		);
+		$expected_srcs = array(
+			'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/test.jpg',
+		);
+
+		// Set the global $post context to the other post.
+		$GLOBALS['post'] = get_post( $global_post_id );
+
+		$galleries = get_post_galleries( $post_id, false );
+
+		// The method can return an empty array.
+		$this->assertNotEmpty(
+			$galleries,
+			'The galleries array is empty.'
+		);
+
+		// This prevents future changes from causing
+		// backwards compatibility breaks.
+		$this->assertArrayHasKey(
+			'src',
+			$galleries[0],
+			'A src key does not exist.'
+		);
+
+		$this->assertSameSetsWithIndex(
+			$expected_srcs,
+			$galleries[0]['src'],
+			'The expected and actual srcs are not the same.'
+		);
+	}
+
+	/**
+	 * Test that the global post object does not override
+	 * a provided post ID with a block gallery.
+	 *
+	 * @ticket 43826
+	 *
+	 * @group block
+	 */
+	public function test_respects_post_id_with_block_gallery() {
+		$ids      = array();
+		$imgs     = array();
+		$ids_srcs = array();
+		foreach ( range( 1, 3 ) as $i ) {
+			$attachment_id = self::factory()->attachment->create_object(
+				"image$i.jpg",
+				0,
+				array(
+					'post_mime_type' => 'image/jpeg',
+					'post_type'      => 'attachment',
+				)
+			);
+			$metadata      = array_merge( array( 'file' => "image$i.jpg" ), $this->img_meta );
+			wp_update_attachment_metadata( $attachment_id, $metadata );
+			$ids[]      = $attachment_id;
+			$url        = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . "image$i.jpg";
+			$ids_srcs[] = $url;
+			$imgs[]     = '<figure><img src="' . $url . '" data-id="' . $i . '" /></figure>';
+
+		}
+
+		$ids_joined = join( ',', $ids );
+
+		$global_post_id = $this->factory->post->create(
+			array(
+				'post_content' => 'Global Post',
+			)
+		);
+
+		$blob = <<< BLOB
+<!-- wp:gallery {"ids":[$ids_joined]} -->
+<!-- /wp:gallery -->
+BLOB;
+
+		$post_id = $this->factory->post->create(
+			array(
+				'post_content' => $blob,
+			)
+		);
+		$this->factory->attachment->create_object(
+			array(
+				'file'           => 'test.jpg',
+				'post_parent'    => $post_id,
+				'post_mime_type' => 'image/jpeg',
+				'post_type'      => 'attachment',
+			)
+		);
+		$expected_srcs = array(
+			'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/test.jpg',
+		);
+
+		// Set the global $post context to the other post.
+		$GLOBALS['post'] = get_post( $global_post_id );
+
+		$galleries = get_post_galleries( $post_id, false );
+
+		// The method can return an empty array.
+		$this->assertNotEmpty(
+			$galleries,
+			'The galleries array is empty.'
+		);
+
+		// This prevents future changes from causing
+		// backwards compatibility breaks.
+		$this->assertArrayHasKey(
+			'src',
+			$galleries[0],
+			'A src key does not exist.'
+		);
+
+		$this->assertSameSetsWithIndex(
+			array(
+				array(
+					'ids' => $ids_joined,
+					'src' => $ids_srcs,
+				),
+			),
+			$galleries,
+			'The expected and actual srcs are not the same.'
+		);
+	}
+
+	/**
+	 * Test that the global post object does not override
+	 * a provided post ID with a block gallery v2.
+	 *
+	 * @ticket 43826
+	 *
+	 * @group block
+	 */
+	public function test_respects_post_id_with_block_gallery_v2() {
+		$attachment_id  = self::factory()->attachment->create_object(
+			'image1.jpg',
+			0,
+			array(
+				'post_mime_type' => 'image/jpeg',
+				'post_type'      => 'attachment',
+			)
+		);
+		$metadata       = array_merge( array( 'file' => 'image1.jpg' ), $this->img_meta );
+		$url            = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . 'image1.jpg';
+		$global_post_id = $this->factory->post->create(
+			array(
+				'post_content' => 'Global Post',
+			)
+		);
+
+		wp_update_attachment_metadata( $attachment_id, $metadata );
+
+		$blob = <<< BLOB
+<!-- wp:gallery {"linkTo":"none","className":"columns-2"} -->
+<figure
+	class="wp-block-gallery has-nested-images columns-default is-cropped columns-2"
+>
+	<!-- wp:image {"id":$attachment_id,"sizeSlug":"large","linkDestination":"none"} -->
+	<figure class="wp-block-image size-large">
+		<img
+			src="$url"
+			alt="Image gallery image"
+			class="wp-image-$attachment_id"
+		/>
+	</figure>
+	<!-- /wp:image -->
+</figure>
+<!-- /wp:gallery -->
+BLOB;
+
+		$post_id = $this->factory->post->create(
+			array(
+				'post_content' => $blob,
+			)
+		);
+		$this->factory->attachment->create_object(
+			array(
+				'file'           => 'test.jpg',
+				'post_parent'    => $post_id,
+				'post_mime_type' => 'image/jpeg',
+				'post_type'      => 'attachment',
+			)
+		);
+		$expected_srcs = array(
+			'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/test.jpg',
+		);
+
+		// Set the global $post context to the other post.
+		$GLOBALS['post'] = get_post( $global_post_id );
+
+		$galleries = get_post_galleries( $post_id, false );
+
+		// The method can return an empty array.
+		$this->assertNotEmpty(
+			$galleries,
+			'The galleries array is empty.'
+		);
+
+		// This prevents future changes from causing
+		// backwards compatibility breaks.
+		$this->assertArrayHasKey(
+			'src',
+			$galleries[0],
+			'A src key does not exist.'
+		);
+
+		$this->assertSameSetsWithIndex(
+			array(
+				array(
+					'ids' => (string) $attachment_id,
+					'src' => array( $url ),
+				),
+			),
+			$galleries,
+			'The expected and actual srcs are not the same.'
+		);
+	}
+
+	/**
+	 * Test that the gallery only contains images specified in
+	 * the shortcode's id attribute.
+	 *
+	 * @ticket 39304
+	 *
+	 * @group shortcode
+	 */
+	public function test_respects_shortcode_id_attribute() {
+		$post_id     = $this->factory->post->create(
+			array(
+				'post_content' => 'No gallery defined',
+			)
+		);
+		$post_id_two = $this->factory->post->create(
+			array(
+				'post_content' => "[gallery id='$post_id']",
+			)
+		);
+		$this->factory->attachment->create_object(
+			array(
+				'file'           => 'test.jpg',
+				'post_parent'    => $post_id,
+				'post_mime_type' => 'image/jpeg',
+				'post_type'      => 'attachment',
+			)
+		);
+		$expected_srcs = array(
+			'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/test.jpg',
+		);
+
+		$galleries = get_post_galleries( $post_id_two, false );
+
+		// Set the global $post context.
+		$GLOBALS['post']               = get_post( $post_id_two );
+		$galleries_with_global_context = get_post_galleries( $post_id_two, false );
+
+		// Check that the global post state doesn't affect the results.
+		$this->assertSameSetsWithIndex(
+			$galleries,
+			$galleries_with_global_context,
+			'The global post state affected the results.'
+		);
+
+		// The method can return an empty array.
+		$this->assertNotEmpty(
+			$galleries,
+			'The galleries array is empty.'
+		);
+
+		// The method can return an array of strings
+		// instead of an array of arrays.
+		$this->assertIsArray(
+			$galleries[0],
+			'The returned data does not contain an array.'
+		);
+
+		// This prevents future changes from causing
+		// backwards compatibility breaks.
+		$this->assertArrayHasKey(
+			'src',
+			$galleries[0],
+			'A src key does not exist.'
+		);
+
+		$this->assertSameSetsWithIndex(
+			$expected_srcs,
+			$galleries[0]['src'],
+			'The expected and actual srcs are not the same.'
+		);
+	}
+
+	/**
+	 * Test that galleries only contain images specified in the
+	 * id attribute of their respective shortcode and block.
+	 *
+	 * @ticket 43826
+	 *
+	 * @group blocks
+	 * @group shortcode
+	 */
+	public function test_respects_shortcode_and_block_id_attributes() {
+		// Test the get_post_galleries() function in $html=false mode, with both shortcode and block galleries
+		$ids      = array();
+		$imgs     = array();
+		$ids_srcs = array();
+		foreach ( range( 1, 6 ) as $i ) {
+			$attachment_id = self::factory()->attachment->create_object(
+				"image$i.jpg",
+				0,
+				array(
+					'post_mime_type' => 'image/jpeg',
+					'post_type'      => 'attachment',
+				)
+			);
+			$metadata      = array_merge( array( 'file' => "image$i.jpg" ), $this->img_meta );
+			wp_update_attachment_metadata( $attachment_id, $metadata );
+			$ids[]      = $attachment_id;
+			$url        = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . "image$i.jpg";
+			$ids_srcs[] = $url;
+			$imgs[]     = '<figure><img src="' . $url . '" data-id="' . $i . '" /></figure>';
+
+		}
+
+		$ids1_joined = join( ',', array_slice( $ids, 0, 3 ) );
+		$ids2_joined = join( ',', array_slice( $ids, 3, 3 ) );
+
+		$blob = <<<BLOB
+[gallery ids="$ids1_joined"]
+
+<!-- wp:gallery {"ids":[$ids2_joined]} -->
+<!-- /wp:gallery -->
+BLOB;
+
+		$post_id = self::factory()->post->create( array( 'post_content' => $blob ) );
+
+		$galleries = get_post_galleries( $post_id, false );
+		$this->assertSameSetsWithIndex(
+			array(
+				array(
+					'ids' => $ids1_joined,
+					'src' => array_slice( $ids_srcs, 0, 3 ),
+				),
+				array(
+					'ids' => $ids2_joined,
+					'src' => array_slice( $ids_srcs, 3, 3 ),
+				),
+			),
+			$galleries
+		);
+
+	}
+
+	/**
+	 * Test that galleries contain the additional attributes
+	 * specified for their respective shortcode and block.
+	 *
+	 * @ticket 43826
+	 *
+	 * @group blocks
+	 * @group shortcode
+	 */
+	public function test_respects_additional_shortcode_and_block_attributes() {
+		// Test attributes returned by get_post_galleries() function in $html=false mode, with both shortcode and block galleries
+		$ids      = array();
+		$imgs     = array();
+		$ids_srcs = array();
+		foreach ( range( 1, 6 ) as $i ) {
+			$attachment_id = self::factory()->attachment->create_object(
+				"image$i.jpg",
+				0,
+				array(
+					'post_mime_type' => 'image/jpeg',
+					'post_type'      => 'attachment',
+				)
+			);
+			$metadata      = array_merge( array( 'file' => "image$i.jpg" ), $this->img_meta );
+			wp_update_attachment_metadata( $attachment_id, $metadata );
+			$ids[]      = $attachment_id;
+			$url        = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/' . "image$i.jpg";
+			$ids_srcs[] = $url;
+			$imgs[]     = '<figure><img src="' . $url . '" data-id="' . $i . '" /></figure>';
+
+		}
+
+		$ids1_joined = join( ',', array_slice( $ids, 0, 3 ) );
+		$ids2_joined = join( ',', array_slice( $ids, 3, 3 ) );
+		$blob        = <<<BLOB
+[gallery ids="$ids1_joined" type="type" foo="bar"]
+
+<!-- wp:gallery {"ids":[$ids2_joined],"columns":3,"imageCrop":false,"linkTo":"media"} -->
+<!-- /wp:gallery -->
+BLOB;
+
+		$post_id = self::factory()->post->create( array( 'post_content' => $blob ) );
+
+		$galleries = get_post_galleries( $post_id, false );
+		$this->assertSameSetsWithIndex(
+			array(
+				array(
+					'ids'  => $ids1_joined,
+					// The shortcode code passes arbitrary attributes
+					'type' => 'type',
+					'foo'  => 'bar',
+					'src'  => array_slice( $ids_srcs, 0, 3 ),
+				),
+				array(
+					'ids' => $ids2_joined,
+					// The block only passes ids, no other attributes
+					'src' => array_slice( $ids_srcs, 3, 3 ),
+				),
+			),
+			$galleries
+		);
+
+	}
+
+	/**
+	 * Test that srcs are retrieved from the HTML of a block gallery
+	 * that has no JSON blob.
+	 *
+	 * @ticket 43826
+	 *
+	 * @group blocks
+	 */
+	public function test_returns_srcs_from_html_with_block_with_no_json_blob() {
+		// Set up an unattached image.
+		$image_id = $this->factory->attachment->create_object(
+			array(
+				'file'           => 'test.jpg',
+				'post_parent'    => 0,
+				'post_mime_type' => 'image/jpeg',
+				'post_type'      => 'attachment',
+			)
+		);
+
+		$image_url = 'http://' . WP_TESTS_DOMAIN . '/wp-content/uploads/test.jpg';
+
+		$blob = <<< BLOB
+<!-- wp:gallery -->
+<ul class="wp-block-gallery columns-2 is-cropped"><li class="blocks-gallery-item">
+<figure>
+<img src="$image_url" alt="title"/>
+</figure>
+</li>
+</ul>
+<!-- /wp:gallery -->
+BLOB;
+
+		$post_id = $this->factory->post->create(
+			array(
+				'post_content' => $blob,
+			)
+		);
+
+		$expected_srcs = array( $image_url );
+		$galleries     = get_post_galleries( $post_id, false );
+
+		// The method can return an empty array.
+		$this->assertNotEmpty(
+			$galleries,
+			'The galleries array is empty.'
+		);
+
+		// The method can return an array of strings
+		// instead of an array of arrays.
+		$this->assertIsArray(
+			$galleries[0],
+			'The returned data does not contain an array.'
+		);
+
+		// This prevents future changes from causing
+		// backwards compatibility breaks.
+		$this->assertArrayHasKey(
+			'src',
+			$galleries[0],
+			'A src key does not exist.'
+		);
+
+		$this->assertSameSetsWithIndex(
+			$expected_srcs,
+			$galleries[0]['src'],
+			'The expected and actual srcs are not the same.'
+		);
+	}
+
+	/**
+	 * Test that srcs are returned for a block gallery nested within
+	 * other blocks.
+	 *
+	 * @ticket 43826
+	 *
+	 * @group blocks
+	 */
+	public function test_returns_srcs_with_nested_block_gallery() {
+		$post_id  = $this->factory->post->create(
+			array(
+				'post_content' => 'I have no gallery.',
+			)
+		);
+		$image_id = $this->factory->attachment->create_object(
+			array(
+				'file'           => 'test.jpg',
+				'post_parent'    => $post_id,
+				'post_mime_type' => 'image/jpeg',
+				'post_type'      => 'attachment',
+			)
+		);
+
+		$blob = <<<BLOB
+<!-- wp:columns -->
+<!-- wp:column -->
+<!-- wp:gallery {"ids":[$image_id]} -->
+<!-- /wp:gallery -->
+<!-- /wp:column -->
+<!-- /wp:columns -->
+BLOB;
+
+		$post_id_two = $this->factory->post->create( array( 'post_content' => $blob ) );
+
+		$galleries = get_post_galleries( $post_id_two, false );
+
+		// The method can return an empty array.
+		$this->assertNotEmpty(
+			$galleries,
+			'The galleries array is empty.'
+		);
+
+		// The method can return an array of strings
+		// instead of an array of arrays.
+		$this->assertIsArray(
+			$galleries[0],
+			'The returned data does not contain an array.'
+		);
+
+		// This prevents future changes from causing
+		// backwards compatibility breaks.
+		$this->assertArrayHasKey(
+			'src',
+			$galleries[0],
+			'A src key does not exist.'
+		);
+
+		$this->assertNotEmpty(
+			$galleries[0]['src'],
+			'The src key of the first gallery is empty.'
+		);
+	}
+}
diff --git a/tests/phpunit/tests/menu/walker-nav-menu.php b/tests/phpunit/tests/menu/walker-nav-menu.php
index 1811284b50..b004819134 100644
--- a/tests/phpunit/tests/menu/walker-nav-menu.php
+++ b/tests/phpunit/tests/menu/walker-nav-menu.php
@@ -41,7 +41,7 @@ class Tests_Menu_Walker_Nav_Menu extends WP_UnitTestCase {
 	 * @ticket 43290
 	 */
 	public function test_noopener_no_referrer_for_target_blank() {
-		$expected   = '';
+		$actual     = '';
 		$post_id    = $this->factory->post->create();
 		$post_title = get_the_title( $post_id );
 
@@ -61,9 +61,9 @@ class Tests_Menu_Walker_Nav_Menu extends WP_UnitTestCase {
 			'link_after'  => '',
 		);
 
-		$this->walker->start_el( $expected, (object) $item, 0, (object) $args );
+		$this->walker->start_el( $actual, (object) $item, 0, (object) $args );
 
-		$this->assertSame( "<li id=\"menu-item-{$post_id}\" class=\"menu-item-{$post_id}\"><a target=\"_blank\" rel=\"noopener\">{$post_title}</a>", $expected );
+		$this->assertSame( "<li id=\"menu-item-{$post_id}\" class=\"menu-item-{$post_id}\"><a target=\"_blank\" rel=\"noopener\">{$post_title}</a>", $actual );
 	}
 
 	/**
diff --git a/tests/phpunit/tests/meta/registerMeta.php b/tests/phpunit/tests/meta/registerMeta.php
index 720f4deaef..ae2c1d6e63 100644
--- a/tests/phpunit/tests/meta/registerMeta.php
+++ b/tests/phpunit/tests/meta/registerMeta.php
@@ -179,7 +179,7 @@ class Tests_Meta_Register_Meta extends WP_UnitTestCase {
 				),
 			),
 		);
-		$this->assertSame( $actual, $expected );
+		$this->assertSame( $expected, $actual );
 	}
 
 	public function test_register_meta_with_current_sanitize_callback_returns_true() {
@@ -521,11 +521,11 @@ class Tests_Meta_Register_Meta extends WP_UnitTestCase {
 		$object_property_name = $object_type . '_id';
 		$object_id            = self::$$object_property_name;
 		$default_value        = get_metadata_default( $object_type, $object_id, $meta_key, $single );
-		$this->assertSame( $default_value, $expected );
+		$this->assertSame( $expected, $default_value );
 
 		// Check for default value.
 		$value = get_metadata( $object_type, $object_id, $meta_key, $single );
-		$this->assertSame( $value, $expected );
+		$this->assertSame( $expected, $value );
 
 		// Set value to check default is not being returned by mistake.
 		$meta_value = 'dibble';
@@ -536,7 +536,7 @@ class Tests_Meta_Register_Meta extends WP_UnitTestCase {
 		// Delete meta, make sure the default is returned.
 		delete_metadata( $object_type, $object_id, $meta_key );
 		$value = get_metadata( $object_type, $object_id, $meta_key, $single );
-		$this->assertSame( $value, $expected );
+		$this->assertSame( $expected, $value );
 
 		// Set other meta key, to make sure other keys are not effects.
 		$meta_value = 'hibble';
@@ -568,7 +568,7 @@ class Tests_Meta_Register_Meta extends WP_UnitTestCase {
 		$object_property_name = $object_type . '_id';
 		$object_id            = self::$$object_property_name;
 		$default_value        = get_metadata_default( $object_type, $object_id, $meta_key, $single );
-		$this->assertSame( $default_value, $expected );
+		$this->assertSame( $expected, $default_value );
 	}
 
 	public function filter_get_object_subtype_for_customtype( $subtype, $object_id ) {
diff --git a/tests/phpunit/tests/multisite/updatePostsCount.php b/tests/phpunit/tests/multisite/updatePostsCount.php
new file mode 100644
index 0000000000..2806aaedd5
--- /dev/null
+++ b/tests/phpunit/tests/multisite/updatePostsCount.php
@@ -0,0 +1,56 @@
+<?php
+
+if ( is_multisite() ) :
+	/**
+	 * Test update_posts_count() get called via filters of WP_Site in multisite.
+	 *
+	 * @group ms-site
+	 * @group multisite
+	 *
+	 * @covers ::_update_posts_count_on_delete
+	 */
+	class Tests_update_posts_count_on_delete extends WP_UnitTestCase {
+
+		/**
+		 * Test that the posts count is updated correctly when a posts are added and deleted.
+		 * @ticket 53443
+		 */
+		public function test_update_posts_count_on_delete() {
+
+			$blog_id = self::factory()->blog->create();
+			switch_to_blog( $blog_id );
+
+			$current_post_count = (int) get_option( 'post_count' );
+
+			$post_id = self::factory()->post->create(
+				array(
+					'post_type'   => 'post',
+					'post_author' => '1',
+					'post_date'   => '2012-10-23 19:34:42',
+					'post_status' => 'publish',
+				)
+			);
+
+			/**
+			 * Check that add_action( 'deleted_post', '_update_posts_count_on_delete' ) is called when a post is created.
+			 * Check that _update_posts_count_on_transition_post_status() is called on that filter which then calls
+			 * update_posts_count to update the count.
+			 */
+			$this->assertEquals( $current_post_count + 1, (int) get_option( 'post_count' ), 'post added' );
+
+			wp_delete_post( $post_id );
+
+			/**
+			 * Check that add_action( 'transition_post_status', '_update_posts_count_on_transition_post_status', 10, 3 )
+			 * is called when a post is deleted.
+			 * Check that _update_posts_count_on_delete() is called on that filter which then calls update_posts_count
+			 * to update the count.
+			 */
+			$this->assertEquals( $current_post_count, (int) get_option( 'post_count' ), 'post deleted' );
+
+			restore_current_blog();
+
+		}
+	}
+
+endif;
diff --git a/tests/phpunit/tests/oembed/getResponseData.php b/tests/phpunit/tests/oembed/getResponseData.php
index 5cec227d99..d782014b25 100644
--- a/tests/phpunit/tests/oembed/getResponseData.php
+++ b/tests/phpunit/tests/oembed/getResponseData.php
@@ -12,6 +12,24 @@ class Tests_oEmbed_Response_Data extends WP_UnitTestCase {
 		self::touch( ABSPATH . WPINC . '/js/wp-embed.js' );
 	}
 
+	private function normalize_secret_attribute( $data ) {
+		if ( is_array( $data ) ) {
+			$html = $data['html'];
+		} else {
+			$html = $data;
+		}
+
+		$html = preg_replace( '/secret=("?)\w+\1/', 'secret=__SECRET__', $html );
+
+		if ( is_array( $data ) ) {
+			$data['html'] = $html;
+		} else {
+			$data = $html;
+		}
+
+		return $data;
+	}
+
 	public function test_get_oembed_response_data_non_existent_post() {
 		$this->assertFalse( get_oembed_response_data( 0, 100 ) );
 	}
@@ -36,9 +54,9 @@ class Tests_oEmbed_Response_Data extends WP_UnitTestCase {
 				'type'          => 'rich',
 				'width'         => 400,
 				'height'        => 225,
-				'html'          => get_post_embed_html( 400, 225, $post ),
+				'html'          => $this->normalize_secret_attribute( get_post_embed_html( 400, 225, $post ) ),
 			),
-			$data
+			$this->normalize_secret_attribute( $data )
 		);
 	}
 
@@ -72,9 +90,9 @@ class Tests_oEmbed_Response_Data extends WP_UnitTestCase {
 				'type'          => 'rich',
 				'width'         => 400,
 				'height'        => 225,
-				'html'          => get_post_embed_html( 400, 225, $post ),
+				'html'          => $this->normalize_secret_attribute( get_post_embed_html( 400, 225, $post ) ),
 			),
-			$data
+			$this->normalize_secret_attribute( $data )
 		);
 	}
 
diff --git a/tests/phpunit/tests/oembed/template.php b/tests/phpunit/tests/oembed/template.php
index b330ae70cf..28a14ceac4 100644
--- a/tests/phpunit/tests/oembed/template.php
+++ b/tests/phpunit/tests/oembed/template.php
@@ -4,6 +4,21 @@
  * @group oembed
  */
 class Tests_Embed_Template extends WP_UnitTestCase {
+
+	public function set_up() {
+		parent::set_up();
+
+		global $wp_scripts;
+		$wp_scripts = null;
+	}
+
+	public function tear_down() {
+		parent::tear_down();
+
+		global $wp_scripts;
+		$wp_scripts = null;
+	}
+
 	public function test_oembed_output_post() {
 		$user = self::factory()->user->create_and_get(
 			array(
@@ -281,15 +296,52 @@ class Tests_Embed_Template extends WP_UnitTestCase {
 			)
 		);
 
-		$expected = '<iframe sandbox="allow-scripts" security="restricted" src="' . esc_url( get_post_embed_url( $post_id ) ) . '" width="200" height="200" title="' . $title . '" frameborder="0" marginwidth="0" marginheight="0" scrolling="no" class="wp-embedded-content"></iframe>';
+		$expected = '<iframe sandbox="allow-scripts" security="restricted" src="' . esc_url( get_post_embed_url( $post_id ) ) . '#?secret=__SECRET__" width="200" height="200" title="' . $title . '" data-secret=__SECRET__ frameborder="0" marginwidth="0" marginheight="0" scrolling="no" class="wp-embedded-content"></iframe>';
+		$actual   = get_post_embed_html( 200, 200, $post_id );
+		$actual   = preg_replace( '/secret=("?)\w+\1/', 'secret=__SECRET__', $actual );
 
-		$this->assertStringEndsWith( $expected, get_post_embed_html( 200, 200, $post_id ) );
+		$this->assertStringStartsWith( '<blockquote class="wp-embedded-content" data-secret=__SECRET__>', $actual );
+		$this->assertStringContainsString( $expected, $actual );
+		$this->assertStringEndsWith( '</script>', trim( $actual ) );
 	}
 
+	/** @covers ::wp_oembed_add_host_js() */
 	public function test_add_host_js() {
+		remove_all_filters( 'embed_oembed_html' );
+
+		// This function is now a no-op.
 		wp_oembed_add_host_js();
 
-		$this->assertTrue( wp_script_is( 'wp-embed' ) );
+		$this->assertFalse( has_filter( 'embed_oembed_html', 'wp_maybe_enqueue_oembed_host_js' ) );
+	}
+
+	/** @covers ::wp_maybe_enqueue_oembed_host_js() */
+	public function test_wp_maybe_enqueue_oembed_host_js() {
+		$scripts = wp_scripts();
+
+		$this->assertFalse( $scripts->query( 'wp-embed', 'enqueued' ) );
+
+		$post_embed     = '<blockquote class="wp-embedded-content" data-secret="S24AQCJW9i"><a href="https://make.wordpress.org/core/2016/03/11/embeds-changes-in-wordpress-4-5/">Embeds Changes in WordPress 4.5</a></blockquote><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" style="position: absolute; clip: rect(1px, 1px, 1px, 1px);" title="&#8220;Embeds Changes in WordPress 4.5&#8221; &#8212; Make WordPress Core" src="https://make.wordpress.org/core/2016/03/11/embeds-changes-in-wordpress-4-5/embed/#?secret=S24AQCJW9i" data-secret="S24AQCJW9i" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>';
+		$non_post_embed = '<iframe title="Zoo Cares For 23 Tiny Pond Turtles" width="750" height="422" src="https://www.youtube.com/embed/6ZXHqUjL6f8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>';
+
+		wp_maybe_enqueue_oembed_host_js( $non_post_embed );
+		$this->assertFalse( $scripts->query( 'wp-embed', 'enqueued' ) );
+
+		wp_maybe_enqueue_oembed_host_js( $post_embed );
+		$this->assertTrue( $scripts->query( 'wp-embed', 'enqueued' ) );
+	}
+
+	/** @covers ::wp_maybe_enqueue_oembed_host_js() */
+	public function test_wp_maybe_enqueue_oembed_host_js_without_wp_head_action() {
+		$scripts = wp_scripts();
+
+		remove_action( 'wp_head', 'wp_oembed_add_host_js' );
+		$this->assertFalse( $scripts->query( 'wp-embed', 'enqueued' ) );
+
+		$post_embed = '<blockquote class="wp-embedded-content" data-secret="S24AQCJW9i"><a href="https://make.wordpress.org/core/2016/03/11/embeds-changes-in-wordpress-4-5/">Embeds Changes in WordPress 4.5</a></blockquote><iframe class="wp-embedded-content" sandbox="allow-scripts" security="restricted" style="position: absolute; clip: rect(1px, 1px, 1px, 1px);" title="&#8220;Embeds Changes in WordPress 4.5&#8221; &#8212; Make WordPress Core" src="https://make.wordpress.org/core/2016/03/11/embeds-changes-in-wordpress-4-5/embed/#?secret=S24AQCJW9i" data-secret="S24AQCJW9i" width="600" height="338" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>';
+
+		wp_maybe_enqueue_oembed_host_js( $post_embed );
+		$this->assertFalse( $scripts->query( 'wp-embed', 'enqueued' ) );
 	}
 
 	/**
diff --git a/tests/phpunit/tests/option/sanitize-option.php b/tests/phpunit/tests/option/sanitize-option.php
index 3a1c22215d..80342fed8f 100644
--- a/tests/phpunit/tests/option/sanitize-option.php
+++ b/tests/phpunit/tests/option/sanitize-option.php
@@ -155,6 +155,7 @@ class Tests_Sanitize_Option extends WP_UnitTestCase {
 			array( '/%postname%/', '/%postname%/', true ),
 			array( '/%year%/%monthnum%/%day%/%postname%/', '/%year%/%monthnum%/%day%/%postname%/', true ),
 			array( '/%year/%postname%/', '/%year/%postname%/', true ),
+			array( new WP_Error( 'wpdb_get_table_charset_failure' ), false, false ), // @ticket 53986
 		);
 	}
 
diff --git a/tests/phpunit/tests/post.php b/tests/phpunit/tests/post.php
index f8edf13dae..c7d60f4b5f 100644
--- a/tests/phpunit/tests/post.php
+++ b/tests/phpunit/tests/post.php
@@ -68,8 +68,8 @@ class Tests_Post extends WP_UnitTestCase {
 			$post = array(
 				'post_author'  => self::$editor_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
-				'post_title'   => rand_str(),
+				'post_content' => "{$post_type}_content",
+				'post_title'   => "{$post_type}_title",
 				'tax_input'    => array(
 					'post_tag' => 'tag1,tag2',
 					'ctax'     => 'cterm1,cterm2',
@@ -126,8 +126,8 @@ class Tests_Post extends WP_UnitTestCase {
 		$post = array(
 			'post_author'  => self::$editor_id,
 			'post_status'  => 'publish',
-			'post_content' => rand_str(),
-			'post_title'   => rand_str(),
+			'post_content' => 'content',
+			'post_title'   => 'title',
 			'post_date'    => date_format( date_create( "@{$future_date}" ), 'Y-m-d H:i:s' ),
 		);
 
@@ -162,8 +162,8 @@ class Tests_Post extends WP_UnitTestCase {
 		$post = array(
 			'post_author'  => self::$editor_id,
 			'post_status'  => 'publish',
-			'post_content' => rand_str(),
-			'post_title'   => rand_str(),
+			'post_content' => 'content',
+			'post_title'   => 'title',
 			'post_date'    => date_format( date_create( "@{$future_date_1}" ), 'Y-m-d H:i:s' ),
 		);
 
@@ -207,8 +207,8 @@ class Tests_Post extends WP_UnitTestCase {
 		$post = array(
 			'post_author'  => self::$editor_id,
 			'post_status'  => 'publish',
-			'post_content' => rand_str(),
-			'post_title'   => rand_str(),
+			'post_content' => 'content',
+			'post_title'   => 'title',
 			'post_date'    => date_format( date_create( "@{$future_date_1}" ), 'Y-m-d H:i:s' ),
 		);
 
@@ -249,8 +249,8 @@ class Tests_Post extends WP_UnitTestCase {
 		$post = array(
 			'post_author'  => self::$editor_id,
 			'post_status'  => 'draft',
-			'post_content' => rand_str(),
-			'post_title'   => rand_str(),
+			'post_content' => 'content',
+			'post_title'   => 'title',
 			'post_date'    => date_format( date_create( "@{$future_date}" ), 'Y-m-d H:i:s' ),
 		);
 
@@ -284,8 +284,8 @@ class Tests_Post extends WP_UnitTestCase {
 		$post = array(
 			'post_author'  => self::$editor_id,
 			'post_status'  => 'publish',
-			'post_content' => rand_str(),
-			'post_title'   => rand_str(),
+			'post_content' => 'content',
+			'post_title'   => 'title',
 			'post_date'    => date_format( date_create( "@{$future_date_1}" ), 'Y-m-d H:i:s' ),
 		);
 
@@ -328,8 +328,8 @@ class Tests_Post extends WP_UnitTestCase {
 			$post = array(
 				'post_author'  => self::$editor_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
-				'post_title'   => rand_str(),
+				'post_content' => "{$status}_content",
+				'post_title'   => "{$status}_title",
 				'post_date'    => date_format( date_create( "@{$future_date_1}" ), 'Y-m-d H:i:s' ),
 			);
 
@@ -370,8 +370,8 @@ class Tests_Post extends WP_UnitTestCase {
 		$post = array(
 			'post_author'  => self::$editor_id,
 			'post_status'  => 'private',
-			'post_content' => rand_str(),
-			'post_title'   => rand_str(),
+			'post_content' => 'content',
+			'post_title'   => 'title',
 			'post_date'    => date_format( date_create( "@{$future_date}" ), 'Y-m-d H:i:s' ),
 		);
 
@@ -404,8 +404,8 @@ class Tests_Post extends WP_UnitTestCase {
 		$post = array(
 			'post_author'  => self::$editor_id,
 			'post_status'  => 'publish',
-			'post_content' => rand_str(),
-			'post_title'   => rand_str(),
+			'post_content' => 'content',
+			'post_title'   => 'title',
 			'post_date'    => '2012-02-30 00:00:00',
 		);
 
@@ -427,8 +427,8 @@ class Tests_Post extends WP_UnitTestCase {
 		$post = array(
 			'post_author'  => self::$editor_id,
 			'post_status'  => 'publish',
-			'post_content' => rand_str(),
-			'post_title'   => rand_str(),
+			'post_content' => 'content',
+			'post_title'   => 'title',
 			'post_date'    => date_format( date_create( "@{$future_date_1}" ), 'Y-m-d H:i:s' ),
 		);
 
@@ -533,8 +533,8 @@ class Tests_Post extends WP_UnitTestCase {
 		$post = array(
 			'post_author'  => self::$editor_id,
 			'post_status'  => 'publish',
-			'post_content' => rand_str(),
-			'post_title'   => rand_str(),
+			'post_content' => 'content',
+			'post_title'   => 'title',
 			'post_date'    => date_format( date_create( "@{$future_date}" ), 'Y-m-d H:i:s' ),
 		);
 
@@ -564,7 +564,7 @@ class Tests_Post extends WP_UnitTestCase {
 		$post = array(
 			'post_author'  => self::$editor_id,
 			'post_status'  => 'publish',
-			'post_content' => rand_str(),
+			'post_content' => 'content',
 			'post_title'   => '',
 			'post_date'    => '2007-10-31 06:15:00',
 		);
@@ -782,11 +782,11 @@ class Tests_Post extends WP_UnitTestCase {
 
 		register_taxonomy( 'test_tax', 'post' );
 
-		$title          = rand_str();
+		$title          = 'title';
 		$post_data      = array(
 			'post_author'  => self::$editor_id,
 			'post_status'  => 'publish',
-			'post_content' => rand_str(),
+			'post_content' => 'content',
 			'post_title'   => $title,
 			'tax_input'    => array(
 				'test_tax' => array( 'term', 'term2', 'term3' ),
@@ -906,7 +906,7 @@ class Tests_Post extends WP_UnitTestCase {
 		register_taxonomy( $tax, $post_type );
 
 		$post = self::factory()->post->create( array( 'post_type' => $post_type ) );
-		wp_set_object_terms( $post, rand_str(), $tax );
+		wp_set_object_terms( $post, 'foo', $tax );
 
 		$wp_tag_cloud = wp_tag_cloud(
 			array(
@@ -973,8 +973,8 @@ class Tests_Post extends WP_UnitTestCase {
 			array(
 				'post_author'  => self::$editor_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
-				'post_title'   => rand_str(),
+				'post_content' => 'content',
+				'post_title'   => 'title',
 			)
 		);
 		$post    = get_post( $post_id );
@@ -991,8 +991,8 @@ class Tests_Post extends WP_UnitTestCase {
 			array(
 				'post_author'  => self::$editor_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
-				'post_title'   => rand_str(),
+				'post_content' => 'content',
+				'post_title'   => 'title',
 				'post_type'    => 'page',
 			)
 		);
@@ -1203,8 +1203,8 @@ class Tests_Post extends WP_UnitTestCase {
 		$post = array(
 			'post_author'   => self::$editor_id,
 			'post_status'   => 'publish',
-			'post_content'  => rand_str(),
-			'post_title'    => rand_str(),
+			'post_content'  => 'content',
+			'post_title'    => 'title',
 			'post_date_gmt' => '2014-01-01 12:00:00',
 		);
 
diff --git a/tests/phpunit/tests/post/attachments.php b/tests/phpunit/tests/post/attachments.php
index 86b24cfd32..2922c185d2 100644
--- a/tests/phpunit/tests/post/attachments.php
+++ b/tests/phpunit/tests/post/attachments.php
@@ -272,8 +272,8 @@ class Tests_Post_Attachments extends WP_UnitTestCase {
 
 		$post_id = wp_insert_post(
 			array(
-				'post_content' => rand_str(),
-				'post_title'   => rand_str(),
+				'post_content' => 'content',
+				'post_title'   => 'title',
 			)
 		);
 
diff --git a/tests/phpunit/tests/post/meta.php b/tests/phpunit/tests/post/meta.php
index 37c07d84e8..ad391e741f 100644
--- a/tests/phpunit/tests/post/meta.php
+++ b/tests/phpunit/tests/post/meta.php
@@ -23,8 +23,8 @@ class Tests_Post_Meta extends WP_UnitTestCase {
 			array(
 				'post_author'  => self::$author->ID,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
-				'post_title'   => rand_str(),
+				'post_content' => 'content',
+				'post_title'   => 'title',
 			)
 		);
 
@@ -32,8 +32,8 @@ class Tests_Post_Meta extends WP_UnitTestCase {
 			array(
 				'post_author'  => self::$author->ID,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
-				'post_title'   => rand_str(),
+				'post_content' => 'content',
+				'post_title'   => 'title',
 			)
 		);
 	}
diff --git a/tests/phpunit/tests/post/nav-menu.php b/tests/phpunit/tests/post/nav-menu.php
index 52d7a93c34..c95c6709c4 100644
--- a/tests/phpunit/tests/post/nav-menu.php
+++ b/tests/phpunit/tests/post/nav-menu.php
@@ -12,7 +12,7 @@ class Tests_Post_Nav_Menu extends WP_UnitTestCase {
 	public function set_up() {
 		parent::set_up();
 
-		$this->menu_id = wp_create_nav_menu( rand_str() );
+		$this->menu_id = wp_create_nav_menu( 'foo' );
 	}
 
 	/**
@@ -247,7 +247,7 @@ class Tests_Post_Nav_Menu extends WP_UnitTestCase {
 		// And this is what we got when calling wp_get_nav_menus().
 		$nav_menus_names = wp_list_pluck( wp_get_nav_menus(), 'name' );
 
-		$this->assertSame( $nav_menus_names, $expected_nav_menus_names );
+		$this->assertSame( $expected_nav_menus_names, $nav_menus_names );
 	}
 
 	/**
@@ -255,8 +255,8 @@ class Tests_Post_Nav_Menu extends WP_UnitTestCase {
 	 */
 	public function test_wp_setup_nav_menu_item_for_post_type_archive() {
 
-		$post_type_slug        = rand_str( 12 );
-		$post_type_description = rand_str();
+		$post_type_slug        = 'fooo-bar-baz';
+		$post_type_description = 'foo';
 		register_post_type(
 			$post_type_slug,
 			array(
@@ -288,7 +288,7 @@ class Tests_Post_Nav_Menu extends WP_UnitTestCase {
 	 */
 	public function test_wp_setup_nav_menu_item_for_post_type_archive_no_description() {
 
-		$post_type_slug        = rand_str( 12 );
+		$post_type_slug        = 'fooo-bar-baz';
 		$post_type_description = '';
 		register_post_type(
 			$post_type_slug,
@@ -319,8 +319,8 @@ class Tests_Post_Nav_Menu extends WP_UnitTestCase {
 	 */
 	public function test_wp_setup_nav_menu_item_for_post_type_archive_custom_description() {
 
-		$post_type_slug        = rand_str( 12 );
-		$post_type_description = rand_str();
+		$post_type_slug        = 'fooo-bar-baz';
+		$post_type_description = 'foobaz';
 		register_post_type(
 			$post_type_slug,
 			array(
@@ -331,7 +331,7 @@ class Tests_Post_Nav_Menu extends WP_UnitTestCase {
 			)
 		);
 
-		$menu_item_description = rand_str();
+		$menu_item_description = 'foo_description';
 
 		$post_type_archive_item_id = wp_update_nav_menu_item(
 			$this->menu_id,
@@ -354,7 +354,7 @@ class Tests_Post_Nav_Menu extends WP_UnitTestCase {
 	 */
 	public function test_wp_setup_nav_menu_item_for_unknown_post_type_archive_no_description() {
 
-		$post_type_slug = rand_str( 12 );
+		$post_type_slug = 'fooo-bar-baz';
 
 		$post_type_archive_item_id = wp_update_nav_menu_item(
 			$this->menu_id,
diff --git a/tests/phpunit/tests/post/query.php b/tests/phpunit/tests/post/query.php
index 29267e429a..e7def81a0c 100644
--- a/tests/phpunit/tests/post/query.php
+++ b/tests/phpunit/tests/post/query.php
@@ -132,33 +132,33 @@ class Tests_Post_Query extends WP_UnitTestCase {
 		$post_id1 = self::factory()->post->create(
 			array(
 				'post_type'  => 'page',
-				'menu_order' => rand( 1, 100 ),
+				'menu_order' => 1,
 			)
 		);
 		$post_id2 = self::factory()->post->create(
 			array(
 				'post_type'  => 'page',
-				'menu_order' => rand( 1, 100 ),
+				'menu_order' => 2,
 			)
 		);
 		$post_id3 = self::factory()->post->create(
 			array(
 				'post_type'   => 'page',
 				'post_parent' => $post_id2,
-				'menu_order'  => rand( 1, 100 ),
+				'menu_order'  => 3,
 			)
 		);
 		$post_id4 = self::factory()->post->create(
 			array(
 				'post_type'   => 'page',
 				'post_parent' => $post_id2,
-				'menu_order'  => rand( 1, 100 ),
+				'menu_order'  => 4,
 			)
 		);
 		$post_id5 = self::factory()->post->create(
 			array(
 				'post_type'  => 'page',
-				'menu_order' => rand( 1, 100 ),
+				'menu_order' => 5,
 			)
 		);
 
@@ -219,7 +219,7 @@ class Tests_Post_Query extends WP_UnitTestCase {
 			$post_id,
 			array(
 				'post_mime_type' => 'image/jpeg',
-				'menu_order'     => rand( 1, 100 ),
+				'menu_order'     => 1,
 			)
 		);
 		$att_ids[2] = self::factory()->attachment->create_object(
@@ -227,7 +227,7 @@ class Tests_Post_Query extends WP_UnitTestCase {
 			$post_id,
 			array(
 				'post_mime_type' => 'image/jpeg',
-				'menu_order'     => rand( 1, 100 ),
+				'menu_order'     => 2,
 			)
 		);
 		$att_ids[3] = self::factory()->attachment->create_object(
@@ -235,7 +235,7 @@ class Tests_Post_Query extends WP_UnitTestCase {
 			$post_id,
 			array(
 				'post_mime_type' => 'image/jpeg',
-				'menu_order'     => rand( 1, 100 ),
+				'menu_order'     => 3,
 			)
 		);
 		$att_ids[4] = self::factory()->attachment->create_object(
@@ -243,7 +243,7 @@ class Tests_Post_Query extends WP_UnitTestCase {
 			$post_id,
 			array(
 				'post_mime_type' => 'image/jpeg',
-				'menu_order'     => rand( 1, 100 ),
+				'menu_order'     => 4,
 			)
 		);
 		$att_ids[5] = self::factory()->attachment->create_object(
@@ -251,7 +251,7 @@ class Tests_Post_Query extends WP_UnitTestCase {
 			$post_id,
 			array(
 				'post_mime_type' => 'image/jpeg',
-				'menu_order'     => rand( 1, 100 ),
+				'menu_order'     => 5,
 			)
 		);
 
diff --git a/tests/phpunit/tests/post/revisions.php b/tests/phpunit/tests/post/revisions.php
index 35e43f18ae..322114e474 100644
--- a/tests/phpunit/tests/post/revisions.php
+++ b/tests/phpunit/tests/post/revisions.php
@@ -17,7 +17,7 @@ class Tests_Post_Revisions extends WP_UnitTestCase {
 
 	public function set_up() {
 		parent::set_up();
-		$this->post_type = rand_str( 20 );
+		$this->post_type = 'test-revision';
 	}
 
 	/**
@@ -446,7 +446,7 @@ class Tests_Post_Revisions extends WP_UnitTestCase {
 			array(
 				'post_status'  => 'publish',
 				'ID'           => $post_id,
-				'post_content' => rand_str(),
+				'post_content' => 'content',
 			)
 		);
 
@@ -654,4 +654,163 @@ class Tests_Post_Revisions extends WP_UnitTestCase {
 
 		$this->assertWPError( $revision );
 	}
+
+	/**
+	 * Tests that wp_get_post_revisions_url() returns the revisions URL.
+	 *
+	 * @ticket 39062
+	 *
+	 * @dataProvider data_wp_get_post_revisions_url
+	 *
+	 * @covers ::wp_get_post_revisions_url
+	 *
+	 * @param int $revisions The number of revisions to create.
+	 */
+	public function test_wp_get_post_revisions_url( $revisions ) {
+		wp_set_current_user( self::$admin_user_id );
+
+		$post_id            = self::factory()->post->create( array( 'post_title' => 'Some Post' ) );
+		$latest_revision_id = null;
+
+		if ( 0 !== $revisions ) {
+			$latest_revision_id = $post_id;
+
+			for ( $i = 0; $i < $revisions; ++$i ) {
+				wp_update_post(
+					array(
+						'ID'         => $post_id,
+						'post_title' => 'Some Post ' . $i,
+					)
+				);
+
+				$latest_revision_id++;
+			}
+		}
+
+		$expected = admin_url( 'revision.php?revision=' . $latest_revision_id );
+
+		$this->assertSame(
+			$expected,
+			wp_get_post_revisions_url( $post_id ),
+			'Failed when passed the Post ID'
+		);
+
+		$this->assertSame(
+			$expected,
+			wp_get_post_revisions_url( $latest_revision_id ),
+			'Failed when passed the latest revision ID'
+		);
+	}
+
+	/**
+	 * Tests that wp_get_post_revisions_url() returns the revisions URL
+	 * when passed a WP_Post object.
+	 *
+	 * @ticket 39062
+	 *
+	 * @dataProvider data_wp_get_post_revisions_url
+	 *
+	 * @covers ::wp_get_post_revisions_url
+	 *
+	 * @param int $revisions The number of revisions to create.
+	 */
+	public function test_wp_get_post_revisions_url_with_post_object( $revisions ) {
+		wp_set_current_user( self::$admin_user_id );
+
+		$post               = self::factory()->post->create_and_get( array( 'post_title' => 'Some Post' ) );
+		$latest_revision_id = null;
+
+		if ( 0 !== $revisions ) {
+			$latest_revision_id = $post->ID;
+
+			for ( $i = 0; $i < $revisions; ++$i ) {
+				wp_update_post(
+					array(
+						'ID'         => $post->ID,
+						'post_title' => 'Some Post ' . $i,
+					)
+				);
+
+				$latest_revision_id++;
+			}
+		}
+
+		$expected = admin_url( 'revision.php?revision=' . $latest_revision_id );
+
+		$this->assertSame(
+			$expected,
+			wp_get_post_revisions_url( $post ),
+			'Failed when passed the Post Object'
+		);
+
+		$this->assertSame(
+			$expected,
+			wp_get_post_revisions_url( $latest_revision_id ),
+			'Failed when passed the latest revision ID'
+		);
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_wp_get_post_revisions_url() {
+		return array(
+			'one revision'       => array( 'revisions' => 1 ),
+			'multiple revisions' => array( 'revisions' => 2 ),
+		);
+	}
+
+	/**
+	 * Tests that wp_get_post_revisions_url() returns NULL when a post does not exist.
+	 *
+	 * @ticket 39062
+	 *
+	 * @covers ::wp_get_post_revisions_url
+	 */
+	public function test_wp_get_post_revisions_url_returns_null_when_post_does_not_exist() {
+		wp_set_current_user( self::$admin_user_id );
+		$post_id = 99999;
+		$this->assertNull( wp_get_post_revisions_url( $post_id ) );
+	}
+
+	/**
+	 * Tests that wp_get_post_revisions_url() returns NULL when there are no revisions.
+	 *
+	 * @ticket 39062
+	 *
+	 * @covers ::wp_get_post_revisions_url
+	 */
+	public function test_wp_get_post_revisions_url_returns_null_with_no_revisions() {
+		wp_set_current_user( self::$admin_user_id );
+		$post_id = self::factory()->post->create( array( 'post_title' => 'Some Post' ) );
+		$this->assertNull( wp_get_post_revisions_url( $post_id ) );
+	}
+
+	/**
+	 * Tests that wp_get_post_revisions_url() returns NULL when revisions are disabled.
+	 *
+	 * @ticket 39062
+	 *
+	 * @covers ::wp_get_post_revisions_url
+	 */
+	public function test_wp_get_post_revisions_url_returns_null_with_revisions_disabled() {
+		wp_set_current_user( self::$admin_user_id );
+
+		remove_post_type_support( 'post', 'revisions' );
+
+		$post_id = self::factory()->post->create( array( 'post_title' => 'Some Post' ) );
+
+		wp_update_post(
+			array(
+				'ID'         => $post_id,
+				'post_title' => 'Some Post 2',
+			)
+		);
+
+		$this->assertNull( wp_get_post_revisions_url( $post_id ) );
+
+		add_post_type_support( 'post', 'revisions' );
+	}
 }
diff --git a/tests/phpunit/tests/post/types.php b/tests/phpunit/tests/post/types.php
index 449467cf1d..7bba3b639b 100644
--- a/tests/phpunit/tests/post/types.php
+++ b/tests/phpunit/tests/post/types.php
@@ -21,7 +21,7 @@ class Tests_Post_Types extends WP_UnitTestCase {
 	public function set_up() {
 		parent::set_up();
 
-		$this->post_type = rand_str( 20 );
+		$this->post_type = 'foo1';
 	}
 
 	public function test_register_post_type() {
diff --git a/tests/phpunit/tests/post/wpGetPostParentId.php b/tests/phpunit/tests/post/wpGetPostParentId.php
index bd25232830..c2160498bc 100644
--- a/tests/phpunit/tests/post/wpGetPostParentId.php
+++ b/tests/phpunit/tests/post/wpGetPostParentId.php
@@ -33,6 +33,15 @@ class Tests_Post_wpGetPostParentId extends WP_UnitTestCase {
 		$this->assertSame( self::$parent_post_id, wp_get_post_parent_id( self::$post_id ) );
 	}
 
+	/**
+	 * @ticket 48358
+	 * @covers ::wp_get_post_parent_id
+	 */
+	public function test_wp_get_post_parent_id_with_no_post_argument_default_to_global_post_id() {
+		$GLOBALS['post'] = get_post( self::$post_id );
+		$this->assertSame( self::$parent_post_id, wp_get_post_parent_id() );
+	}
+
 	public function test_wp_get_post_parent_id_with_non_existing_id_default_to_global_post_id() {
 		$GLOBALS['post'] = get_post( self::$post_id );
 		$this->assertSame( self::$parent_post_id, wp_get_post_parent_id( 0 ) );
diff --git a/tests/phpunit/tests/query/commentCount.php b/tests/phpunit/tests/query/commentCount.php
index 5c8bd2df26..5a759a3f06 100644
--- a/tests/phpunit/tests/query/commentCount.php
+++ b/tests/phpunit/tests/query/commentCount.php
@@ -21,7 +21,7 @@ class Tests_Query_CommentCount extends WP_UnitTestCase {
 	public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) {
 		$post_id             = $factory->post->create(
 			array(
-				'post_content' => 1 . rand_str() . ' about',
+				'post_content' => '1 about',
 				'post_type'    => self::$post_type,
 			)
 		);
@@ -30,7 +30,7 @@ class Tests_Query_CommentCount extends WP_UnitTestCase {
 
 		$post_id             = $factory->post->create(
 			array(
-				'post_content' => 1 . rand_str() . ' about',
+				'post_content' => '2 about',
 				'post_type'    => self::$post_type,
 			)
 		);
@@ -41,7 +41,7 @@ class Tests_Query_CommentCount extends WP_UnitTestCase {
 
 		$post_id             = $factory->post->create(
 			array(
-				'post_content' => 1 . rand_str() . ' about',
+				'post_content' => '3 about',
 				'post_type'    => self::$post_type,
 			)
 		);
@@ -52,7 +52,7 @@ class Tests_Query_CommentCount extends WP_UnitTestCase {
 
 		$post_id             = $factory->post->create(
 			array(
-				'post_content' => 1 . rand_str() . ' about',
+				'post_content' => '4 about',
 				'post_type'    => self::$post_type,
 			)
 		);
@@ -81,7 +81,7 @@ class Tests_Query_CommentCount extends WP_UnitTestCase {
 
 		$expected = self::$post_ids[4];
 
-		$this->assertSameSets( $found_post_ids, $expected );
+		$this->assertSameSets( $expected, $found_post_ids );
 	}
 
 	public function test_operator_greater_than() {
@@ -99,7 +99,7 @@ class Tests_Query_CommentCount extends WP_UnitTestCase {
 
 		$expected = self::$post_ids[5];
 
-		$this->assertSameSets( $found_post_ids, $expected );
+		$this->assertSameSets( $expected, $found_post_ids );
 	}
 
 	public function test_operator_greater_than_no_results() {
@@ -117,7 +117,7 @@ class Tests_Query_CommentCount extends WP_UnitTestCase {
 
 		$expected = array();
 
-		$this->assertSameSets( $found_post_ids, $expected );
+		$this->assertSameSets( $expected, $found_post_ids );
 	}
 	public function test_operator_less_than() {
 		$args = array(
@@ -143,7 +143,7 @@ class Tests_Query_CommentCount extends WP_UnitTestCase {
 			$expected[] = $expected_id;
 		}
 
-		$this->assertSameSets( $found_post_ids, $expected );
+		$this->assertSameSets( $expected, $found_post_ids );
 	}
 
 	public function test_operator_less_than_no_results() {
@@ -161,7 +161,7 @@ class Tests_Query_CommentCount extends WP_UnitTestCase {
 
 		$expected = array();
 
-		$this->assertSameSets( $found_post_ids, $expected );
+		$this->assertSameSets( $expected, $found_post_ids );
 	}
 
 
@@ -189,7 +189,7 @@ class Tests_Query_CommentCount extends WP_UnitTestCase {
 			$expected[] = $expected_id;
 		}
 
-		$this->assertSameSets( $found_post_ids, $expected );
+		$this->assertSameSets( $expected, $found_post_ids );
 
 	}
 	public function test_operator_equal_or_greater_than() {
@@ -213,7 +213,7 @@ class Tests_Query_CommentCount extends WP_UnitTestCase {
 			$expected[] = $expected_id;
 		}
 
-		$this->assertSameSets( $found_post_ids, $expected );
+		$this->assertSameSets( $expected, $found_post_ids );
 	}
 
 	public function test_operator_equal_or_greater_than_no_results() {
@@ -231,7 +231,7 @@ class Tests_Query_CommentCount extends WP_UnitTestCase {
 
 		$expected = array();
 
-		$this->assertSameSets( $found_post_ids, $expected );
+		$this->assertSameSets( $expected, $found_post_ids );
 	}
 
 	public function test_operator_equal_or_less_than() {
@@ -255,7 +255,7 @@ class Tests_Query_CommentCount extends WP_UnitTestCase {
 			$expected[] = $expected_id;
 		}
 
-		$this->assertSameSets( $found_post_ids, $expected );
+		$this->assertSameSets( $expected, $found_post_ids );
 	}
 
 	public function test_operator_equal_or_less_than_no_results() {
@@ -273,7 +273,7 @@ class Tests_Query_CommentCount extends WP_UnitTestCase {
 
 		$expected = array();
 
-		$this->assertSameSets( $found_post_ids, $expected );
+		$this->assertSameSets( $expected, $found_post_ids );
 	}
 
 	public function test_invalid_operator_should_fall_back_on_equals() {
@@ -294,7 +294,7 @@ class Tests_Query_CommentCount extends WP_UnitTestCase {
 			$expected[] = $expected_id;
 		}
 
-		$this->assertSameSets( $found_post_ids, $expected );
+		$this->assertSameSets( $expected, $found_post_ids );
 	}
 
 	public function test_wrong_count_no_results() {
@@ -312,7 +312,7 @@ class Tests_Query_CommentCount extends WP_UnitTestCase {
 
 		$expected = array();
 
-		$this->assertSameSets( $found_post_ids, $expected );
+		$this->assertSameSets( $expected, $found_post_ids );
 	}
 
 	public function test_no_operator_no_results() {
@@ -329,7 +329,7 @@ class Tests_Query_CommentCount extends WP_UnitTestCase {
 
 		$expected = self::$post_ids[5];
 
-		$this->assertSameSets( $found_post_ids, $expected );
+		$this->assertSameSets( $expected, $found_post_ids );
 	}
 
 	public function test_empty_non_numeric_string_should_be_ignored() {
@@ -353,7 +353,7 @@ class Tests_Query_CommentCount extends WP_UnitTestCase {
 			$expected[] = $expected_id;
 		}
 
-		$this->assertSameSets( $found_post_ids, $expected );
+		$this->assertSameSets( $expected, $found_post_ids );
 	}
 
 	public function test_simple_count() {
@@ -368,7 +368,7 @@ class Tests_Query_CommentCount extends WP_UnitTestCase {
 
 		$expected = self::$post_ids[5];
 
-		$this->assertSameSets( $found_post_ids, $expected );
+		$this->assertSameSets( $expected, $found_post_ids );
 	}
 }
 
diff --git a/tests/phpunit/tests/query/invalidQueries.php b/tests/phpunit/tests/query/invalidQueries.php
index ea18617b28..4c0b631f80 100644
--- a/tests/phpunit/tests/query/invalidQueries.php
+++ b/tests/phpunit/tests/query/invalidQueries.php
@@ -91,11 +91,10 @@ class Tests_Query_InvalidQueries extends WP_UnitTestCase {
 		global $wpdb;
 
 		$query = new WP_Query( array( 'post_type' => 'unregistered_cpt' ) );
-		$posts = $query->get_posts();
 
 		$this->assertStringContainsString( "{$wpdb->posts}.post_type = 'unregistered_cpt'", self::$last_posts_request );
 		$this->assertStringContainsString( "{$wpdb->posts}.post_status = 'publish'", self::$last_posts_request );
-		$this->assertCount( 0, $posts );
+		$this->assertCount( 0, $query->posts );
 	}
 
 	/**
@@ -111,10 +110,9 @@ class Tests_Query_InvalidQueries extends WP_UnitTestCase {
 				'post_type' => array( 'unregistered_cpt', 'page' ),
 			)
 		);
-		$posts = $query->get_posts();
 
 		$this->assertStringContainsString( "{$wpdb->posts}.post_type = 'unregistered_cpt'", self::$last_posts_request );
-		$this->assertCount( 1, $posts, 'the valid `page` post type should still return one post' );
+		$this->assertCount( 1, $query->posts, 'the valid `page` post type should still return one post' );
 	}
 
 	/**
@@ -143,10 +141,9 @@ class Tests_Query_InvalidQueries extends WP_UnitTestCase {
 				'post_type' => 'page',
 			)
 		);
-		$posts = $query->get_posts();
 
 		// Only the published page should be returned.
-		$this->assertCount( 1, $posts );
+		$this->assertCount( 1, $query->posts );
 	}
 
 	/**
@@ -158,9 +155,8 @@ class Tests_Query_InvalidQueries extends WP_UnitTestCase {
 				'static' => 'a',
 			)
 		);
-		$posts = $query->get_posts();
 
 		// Only the published post should be returned.
-		$this->assertCount( 1, $posts );
+		$this->assertCount( 1, $query->posts );
 	}
 }
diff --git a/tests/phpunit/tests/query/search.php b/tests/phpunit/tests/query/search.php
index 2beda65d2f..418acbfc85 100644
--- a/tests/phpunit/tests/query/search.php
+++ b/tests/phpunit/tests/query/search.php
@@ -10,7 +10,7 @@ class Tests_Query_Search extends WP_UnitTestCase {
 	public function set_up() {
 		parent::set_up();
 
-		$this->post_type = rand_str( 12 );
+		$this->post_type = 'foo1';
 		register_post_type( $this->post_type );
 
 		$this->q = new WP_Query();
@@ -36,7 +36,7 @@ class Tests_Query_Search extends WP_UnitTestCase {
 		foreach ( range( 1, 7 ) as $i ) {
 			self::factory()->post->create(
 				array(
-					'post_content' => $i . rand_str() . ' about',
+					'post_content' => "{$i} about",
 					'post_type'    => $this->post_type,
 				)
 			);
diff --git a/tests/phpunit/tests/query/taxQuery.php b/tests/phpunit/tests/query/taxQuery.php
index 2ca00b605b..c44f19880f 100644
--- a/tests/phpunit/tests/query/taxQuery.php
+++ b/tests/phpunit/tests/query/taxQuery.php
@@ -1024,8 +1024,7 @@ class Tests_Query_TaxQuery extends WP_UnitTestCase {
 			)
 		);
 
-		$posts = $query->get_posts();
-		$this->assertCount( 0, $posts );
+		$this->assertCount( 0, $query->posts );
 	}
 
 	/**
@@ -1059,8 +1058,7 @@ class Tests_Query_TaxQuery extends WP_UnitTestCase {
 			)
 		);
 
-		$posts = $query->get_posts();
-		$this->assertCount( 0, $posts );
+		$this->assertCount( 0, $query->posts );
 	}
 
 	public function test_tax_query_include_children() {
@@ -1209,8 +1207,8 @@ class Tests_Query_TaxQuery extends WP_UnitTestCase {
 		register_taxonomy_for_object_type( 'post_tag', 'attachment:image' );
 		$tag_id   = self::factory()->term->create(
 			array(
-				'slug' => rand_str(),
-				'name' => rand_str(),
+				'slug' => 'foo-bar',
+				'name' => 'Foo Bar',
 			)
 		);
 		$image_id = self::factory()->attachment->create_object(
diff --git a/tests/phpunit/tests/rest-api/rest-application-passwords-controller.php b/tests/phpunit/tests/rest-api/rest-application-passwords-controller.php
index cbfe965fa1..993dd2d7c0 100644
--- a/tests/phpunit/tests/rest-api/rest-application-passwords-controller.php
+++ b/tests/phpunit/tests/rest-api/rest-application-passwords-controller.php
@@ -946,6 +946,86 @@ class WP_Test_REST_Application_Passwords_Controller extends WP_Test_REST_Control
 		$this->assertErrorResponse( 'rest_application_password_not_found', $response, 500 );
 	}
 
+	/**
+	 * @ticket 53658
+	 *
+	 * @covers ::wp_is_application_passwords_supported
+	 */
+	public function test_wp_is_application_passwords_supported_with_https_only() {
+		$_SERVER['HTTPS'] = 'on';
+		$this->assertTrue( wp_is_application_passwords_supported() );
+	}
+
+	/**
+	 * @ticket 53658
+	 *
+	 * @covers ::wp_is_application_passwords_supported
+	 */
+	public function test_wp_is_application_passwords_supported_with_local_environment_only() {
+		putenv( 'WP_ENVIRONMENT_TYPE=local' );
+
+		$actual = wp_is_application_passwords_supported();
+
+		// Revert to default behaviour so that other tests are not affected.
+		putenv( 'WP_ENVIRONMENT_TYPE' );
+
+		$this->assertTrue( $actual );
+	}
+
+	/**
+	 * @dataProvider data_wp_is_application_passwords_available
+	 *
+	 * @ticket 53658
+	 *
+	 * @covers ::wp_is_application_passwords_available
+	 *
+	 * @param bool|string $expected The expected value.
+	 * @param string|null $callback Optional. The callback for the `wp_is_application_passwords_available` hook.
+	 *                              Default: null.
+	 */
+	public function test_wp_is_application_passwords_available( $expected, $callback = null ) {
+		remove_filter( 'wp_is_application_passwords_available', '__return_true' );
+
+		if ( $callback ) {
+			add_filter( 'wp_is_application_passwords_available', $callback );
+		}
+
+		if ( 'default' === $expected ) {
+			putenv( 'WP_ENVIRONMENT_TYPE=local' );
+			$expected = wp_is_application_passwords_supported();
+		}
+
+		$actual = wp_is_application_passwords_available();
+
+		if ( 'default' === $expected ) {
+			// Revert to default behaviour so that other tests are not affected.
+			putenv( 'WP_ENVIRONMENT_TYPE' );
+		}
+
+		$this->assertSame( $expected, $actual );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_wp_is_application_passwords_available() {
+		return array(
+			'availability not forced'   => array(
+				'expected' => 'default',
+			),
+			'availability forced true'  => array(
+				'expected' => true,
+				'callback' => '__return_true',
+			),
+			'availability forced false' => array(
+				'expected' => false,
+				'callback' => '__return_false',
+			),
+		);
+	}
+
 	/**
 	 * Sets up a REST API request to be authenticated using an App Password.
 	 *
diff --git a/tests/phpunit/tests/rest-api/rest-attachments-controller.php b/tests/phpunit/tests/rest-api/rest-attachments-controller.php
index 14c1f08075..47ea5820f3 100644
--- a/tests/phpunit/tests/rest-api/rest-attachments-controller.php
+++ b/tests/phpunit/tests/rest-api/rest-attachments-controller.php
@@ -160,6 +160,7 @@ class WP_Test_REST_Attachments_Controller extends WP_Test_REST_Post_Type_Control
 		$request  = new WP_REST_Request( 'OPTIONS', '/wp/v2/media' );
 		$response = rest_get_server()->dispatch( $request );
 		$data     = $response->get_data();
+		$this->assertArrayNotHasKey( 'allow_batch', $data['endpoints'][0] );
 		$this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
 		$this->assertSame( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
 		// Single.
@@ -174,6 +175,7 @@ class WP_Test_REST_Attachments_Controller extends WP_Test_REST_Post_Type_Control
 		$request       = new WP_REST_Request( 'OPTIONS', '/wp/v2/media/' . $attachment_id );
 		$response      = rest_get_server()->dispatch( $request );
 		$data          = $response->get_data();
+		$this->assertArrayNotHasKey( 'allow_batch', $data['endpoints'][0] );
 		$this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
 		$this->assertSame( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
 	}
@@ -520,8 +522,8 @@ class WP_Test_REST_Attachments_Controller extends WP_Test_REST_Post_Type_Control
 
 	public function test_get_items_invalid_date() {
 		$request = new WP_REST_Request( 'GET', '/wp/v2/media' );
-		$request->set_param( 'after', rand_str() );
-		$request->set_param( 'before', rand_str() );
+		$request->set_param( 'after', 'foo' );
+		$request->set_param( 'before', 'bar' );
 		$response = rest_get_server()->dispatch( $request );
 		$this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
 	}
@@ -568,8 +570,8 @@ class WP_Test_REST_Attachments_Controller extends WP_Test_REST_Post_Type_Control
 	 */
 	public function test_get_items_invalid_modified_date() {
 		$request = new WP_REST_Request( 'GET', '/wp/v2/media' );
-		$request->set_param( 'modified_after', rand_str() );
-		$request->set_param( 'modified_before', rand_str() );
+		$request->set_param( 'modified_after', 'foo' );
+		$request->set_param( 'modified_before', 'bar' );
 		$response = rest_get_server()->dispatch( $request );
 		$this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
 	}
diff --git a/tests/phpunit/tests/rest-api/rest-block-directory-controller.php b/tests/phpunit/tests/rest-api/rest-block-directory-controller.php
index ef70ecb319..f772c1e026 100644
--- a/tests/phpunit/tests/rest-api/rest-block-directory-controller.php
+++ b/tests/phpunit/tests/rest-api/rest-block-directory-controller.php
@@ -69,6 +69,11 @@ class WP_REST_Block_Directory_Controller_Test extends WP_Test_REST_Controller_Te
 	 */
 	public function test_get_items() {
 		wp_set_current_user( self::$admin_id );
+		$this->mock_remote_request(
+			array(
+				'body' => '{"info":{"page":1,"pages":0,"results":0},"plugins":[]}',
+			)
+		);
 
 		$request = new WP_REST_Request( 'GET', '/wp/v2/block-directory/search' );
 		$request->set_query_params( array( 'term' => 'foo' ) );
@@ -109,6 +114,11 @@ class WP_REST_Block_Directory_Controller_Test extends WP_Test_REST_Controller_Te
 	 */
 	public function test_get_items_no_results() {
 		wp_set_current_user( self::$admin_id );
+		$this->mock_remote_request(
+			array(
+				'body' => '{"info":{"page":1,"pages":0,"results":0},"plugins":[]}',
+			)
+		);
 
 		$request = new WP_REST_Request( 'GET', '/wp/v2/block-directory/search' );
 		$request->set_query_params( array( 'term' => '0c4549ee68f24eaaed46a49dc983ecde' ) );
@@ -287,4 +297,31 @@ class WP_REST_Block_Directory_Controller_Test extends WP_Test_REST_Controller_Te
 			'author_block_rating'      => 0,
 		);
 	}
+
+	/**
+	 * Mocks the remote request via `'pre_http_request'` filter by
+	 * returning the expected response.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param array $expected Expected response, which is merged with the default response.
+	 */
+	private function mock_remote_request( array $expected ) {
+		add_filter(
+			'pre_http_request',
+			static function() use ( $expected ) {
+				$default = array(
+					'headers'  => array(),
+					'response' => array(
+						'code'    => 200,
+						'message' => 'OK',
+					),
+					'body'     => '',
+					'cookies'  => array(),
+					'filename' => null,
+				);
+				return array_merge( $default, $expected );
+			}
+		);
+	}
 }
diff --git a/tests/phpunit/tests/rest-api/rest-categories-controller.php b/tests/phpunit/tests/rest-api/rest-categories-controller.php
index 3111371599..01bddd3738 100644
--- a/tests/phpunit/tests/rest-api/rest-categories-controller.php
+++ b/tests/phpunit/tests/rest-api/rest-categories-controller.php
@@ -117,6 +117,7 @@ class WP_Test_REST_Categories_Controller extends WP_Test_REST_Controller_Testcas
 		$request  = new WP_REST_Request( 'OPTIONS', '/wp/v2/categories' );
 		$response = rest_get_server()->dispatch( $request );
 		$data     = $response->get_data();
+		$this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
 		$this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
 		$this->assertSameSets( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
 		// Single.
@@ -124,6 +125,7 @@ class WP_Test_REST_Categories_Controller extends WP_Test_REST_Controller_Testcas
 		$request   = new WP_REST_Request( 'OPTIONS', '/wp/v2/categories/' . $category1 );
 		$response  = rest_get_server()->dispatch( $request );
 		$data      = $response->get_data();
+		$this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
 		$this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
 		$this->assertSameSets( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
 	}
diff --git a/tests/phpunit/tests/rest-api/rest-comments-controller.php b/tests/phpunit/tests/rest-api/rest-comments-controller.php
index 0c7ed625b7..99986a8037 100644
--- a/tests/phpunit/tests/rest-api/rest-comments-controller.php
+++ b/tests/phpunit/tests/rest-api/rest-comments-controller.php
@@ -888,8 +888,8 @@ class WP_Test_REST_Comments_Controller extends WP_Test_REST_Controller_Testcase
 
 	public function test_get_comments_invalid_date() {
 		$request = new WP_REST_Request( 'GET', '/wp/v2/comments' );
-		$request->set_param( 'after', rand_str() );
-		$request->set_param( 'before', rand_str() );
+		$request->set_param( 'after', 'foo' );
+		$request->set_param( 'before', 'bar' );
 		$response = rest_get_server()->dispatch( $request );
 		$this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
 	}
@@ -1477,7 +1477,7 @@ class WP_Test_REST_Comments_Controller extends WP_Test_REST_Controller_Testcase
 			'author_email' => 'lovejoy@example.com',
 			'author_url'   => 'http://timothylovejoy.jr',
 			'content'      => 'It\'s all over\, people! We don\'t have a prayer!',
-			'date'         => rand_str(),
+			'date'         => 'foo-bar',
 		);
 
 		$request = new WP_REST_Request( 'POST', '/wp/v2/comments' );
@@ -2625,8 +2625,8 @@ class WP_Test_REST_Comments_Controller extends WP_Test_REST_Controller_Testcase
 		wp_set_current_user( self::$admin_id );
 
 		$params = array(
-			'content' => rand_str(),
-			'date'    => rand_str(),
+			'content' => 'content',
+			'date'    => 'foo',
 		);
 
 		$request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/comments/%d', self::$approved_id ) );
@@ -2641,8 +2641,8 @@ class WP_Test_REST_Comments_Controller extends WP_Test_REST_Controller_Testcase
 		wp_set_current_user( self::$admin_id );
 
 		$params = array(
-			'content'  => rand_str(),
-			'date_gmt' => rand_str(),
+			'content'  => 'content',
+			'date_gmt' => 'foo',
 		);
 
 		$request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/comments/%d', self::$approved_id ) );
@@ -2770,7 +2770,7 @@ class WP_Test_REST_Comments_Controller extends WP_Test_REST_Controller_Testcase
 		// Change the comment parent.
 		$request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/comments/%s', $child_comment ) );
 		$request->set_param( 'parent', $comment_id_1 );
-		$request->set_param( 'content', rand_str() );
+		$request->set_param( 'content', 'foo bar' );
 		$response = rest_get_server()->dispatch( $request );
 		$this->assertSame( 200, $response->get_status() );
 
diff --git a/tests/phpunit/tests/rest-api/rest-global-styles-controller.php b/tests/phpunit/tests/rest-api/rest-global-styles-controller.php
new file mode 100644
index 0000000000..60023e7c01
--- /dev/null
+++ b/tests/phpunit/tests/rest-api/rest-global-styles-controller.php
@@ -0,0 +1,458 @@
+<?php
+/**
+ * Unit tests covering WP_REST_Global_Styles_Controller functionality.
+ *
+ * @package WordPress
+ * @subpackage REST API
+ */
+
+/**
+ * @covers WP_REST_Global_Styles_Controller
+ * @group restapi-global-styles
+ * @group restapi
+ */
+class WP_REST_Global_Styles_Controller_Test extends WP_Test_REST_Controller_Testcase {
+	/**
+	 * @var int
+	 */
+	protected static $admin_id;
+
+	/**
+	 * @var int
+	 */
+	protected static $subscriber_id;
+
+	/**
+	 * @var int
+	 */
+	protected static $global_styles_id;
+
+	/**
+	 * @var int
+	 */
+	protected static $post_id;
+
+	private function find_and_normalize_global_styles_by_id( $global_styles, $id ) {
+		foreach ( $global_styles as $style ) {
+			if ( $style['id'] === $id ) {
+				unset( $style['_links'] );
+				return $style;
+			}
+		}
+
+		return null;
+	}
+
+	public function set_up() {
+		parent::set_up();
+		switch_theme( 'tt1-blocks' );
+	}
+
+	/**
+	 * Create fake data before our tests run.
+	 *
+	 * @param WP_UnitTest_Factory $factory Helper that lets us create fake data.
+	 */
+	public static function wpSetupBeforeClass( $factory ) {
+		self::$admin_id = $factory->user->create(
+			array(
+				'role' => 'administrator',
+			)
+		);
+
+		self::$subscriber_id = $factory->user->create(
+			array(
+				'role' => 'subscriber',
+			)
+		);
+
+		// This creates the global styles for the current theme.
+		self::$global_styles_id = $factory->post->create(
+			array(
+				'post_content' => '{"version": ' . WP_Theme_JSON::LATEST_SCHEMA . ', "isGlobalStylesUserThemeJSON": true }',
+				'post_status'  => 'publish',
+				'post_title'   => 'Custom Styles',
+				'post_type'    => 'wp_global_styles',
+				'post_name'    => 'wp-global-styles-tt1-blocks',
+				'tax_input'    => array(
+					'wp_theme' => 'tt1-blocks',
+				),
+			)
+		);
+
+		self::$post_id = $factory->post->create();
+	}
+
+	/**
+	 *
+	 */
+	public static function wpTearDownAfterClass() {
+		self::delete_user( self::$admin_id );
+		self::delete_user( self::$subscriber_id );
+	}
+
+	/**
+	 * @covers WP_REST_Global_Styles_Controller::register_routes
+	 * @ticket 54596
+	 */
+	public function test_register_routes() {
+		$routes = rest_get_server()->get_routes();
+		$this->assertArrayHasKey(
+			'/wp/v2/global-styles/(?P<id>[\/\w-]+)',
+			$routes,
+			'Single global style based on the given ID route does not exist'
+		);
+		$this->assertCount(
+			2,
+			$routes['/wp/v2/global-styles/(?P<id>[\/\w-]+)'],
+			'Single global style based on the given ID route does not have exactly two elements'
+		);
+		$this->assertArrayHasKey(
+			'/wp/v2/global-styles/themes/(?P<stylesheet>[^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?)',
+			$routes,
+			'Theme global styles route does not exist'
+		);
+		$this->assertCount(
+			1,
+			$routes['/wp/v2/global-styles/themes/(?P<stylesheet>[^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?)'],
+			'Theme global styles route does not have exactly one element'
+		);
+	}
+
+	public function test_context_param() {
+		$this->markTestSkipped( 'Controller does not implement context_param().' );
+	}
+
+	public function test_get_items() {
+		$this->markTestSkipped( 'Controller does not implement get_items().' );
+	}
+
+	/**
+	 * @covers WP_REST_Global_Styles_Controller::get_theme_item
+	 * @ticket 54516
+	 */
+	public function test_get_theme_item_no_user() {
+		wp_set_current_user( 0 );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/global-styles/themes/tt1-blocks' );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_cannot_manage_global_styles', $response, 401 );
+	}
+
+	/**
+	 * @covers WP_REST_Global_Styles_Controller::get_theme_item
+	 * @ticket 54516
+	 */
+	public function test_get_theme_item_permission_check() {
+		wp_set_current_user( self::$subscriber_id );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/global-styles/themes/tt1-blocks' );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_cannot_manage_global_styles', $response, 403 );
+	}
+
+	/**
+	 * @covers WP_REST_Global_Styles_Controller::get_theme_item
+	 * @ticket 54516
+	 */
+	public function test_get_theme_item_invalid() {
+		wp_set_current_user( self::$admin_id );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/global-styles/themes/invalid' );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_theme_not_found', $response, 404 );
+	}
+
+	/**
+	 * @dataProvider data_get_theme_item_invalid_theme_dirname
+	 * @covers WP_REST_Global_Styles_Controller::get_theme_item
+	 * @ticket 54596
+	 *
+	 * @param string $theme_dirname Theme directory to test.
+	 * @param string $expected      Expected error code.
+	 */
+	public function test_get_theme_item_invalid_theme_dirname( $theme_dirname, $expected ) {
+		wp_set_current_user( self::$admin_id );
+		switch_theme( $theme_dirname );
+
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/global-styles/themes/' . $theme_dirname );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( $expected, $response, 404 );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_get_theme_item_invalid_theme_dirname() {
+		return array(
+			'+'                      => array(
+				'theme_dirname' => 'my+theme+',
+				'expected'      => 'rest_theme_not_found',
+			),
+			':'                      => array(
+				'theme_dirname' => 'my:theme:',
+				'expected'      => 'rest_no_route',
+			),
+			'<>'                     => array(
+				'theme_dirname' => 'my<theme>',
+				'expected'      => 'rest_no_route',
+			),
+			'*'                      => array(
+				'theme_dirname' => 'my*theme*',
+				'expected'      => 'rest_no_route',
+			),
+			'?'                      => array(
+				'theme_dirname' => 'my?theme?',
+				'expected'      => 'rest_no_route',
+			),
+			'"'                      => array(
+				'theme_dirname' => 'my"theme?"',
+				'expected'      => 'rest_no_route',
+			),
+			'| (invalid on Windows)' => array(
+				'theme_dirname' => 'my|theme|',
+				'expected'      => 'rest_no_route',
+			),
+			// Themes deep in subdirectories.
+			'2 subdirectories deep'  => array(
+				'theme_dirname' => 'subdir/subsubdir/mytheme',
+				'expected'      => 'rest_global_styles_not_found',
+			),
+		);
+	}
+
+	/**
+	 * @dataProvider data_get_theme_item
+	 * @covers WP_REST_Global_Styles_Controller::get_theme_item
+	 * @ticket 54596
+	 *
+	 * @param string $theme Theme directory to test.
+	 */
+	public function test_get_theme_item( $theme ) {
+		wp_set_current_user( self::$admin_id );
+		switch_theme( $theme );
+
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/global-styles/themes/' . $theme );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$links    = $response->get_links();
+		$this->assertArrayHasKey( 'settings', $data, 'Data does not have "settings" key' );
+		$this->assertArrayHasKey( 'styles', $data, 'Data does not have "styles" key' );
+		$this->assertArrayHasKey( 'self', $links, 'Links do not have a "self" key' );
+		$this->assertStringContainsString( '/wp/v2/global-styles/themes/' . $theme, $links['self'][0]['href'] );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_get_theme_item() {
+		return array(
+			'alphabetic'                     => array( 'mytheme' ),
+			'alphanumeric'                   => array( 'mythemev1' ),
+			'àáâãäåæç'                       => array( 'àáâãäåæç' ),
+			'space'                          => array( 'my theme' ),
+			'-_.'                            => array( 'my_theme-0.1' ),
+			'[]'                             => array( 'my[theme]' ),
+			'()'                             => array( 'my(theme)' ),
+			'{}'                             => array( 'my{theme}' ),
+			'&=#@!$,^~%'                     => array( 'theme &=#@!$,^~%' ),
+			'all combined'                   => array( 'thémé {}&=@!$,^~%[0.1](-_-)' ),
+
+			// Themes in a subdirectory.
+			'subdir: alphabetic'             => array( 'subdir/mytheme' ),
+			'subdir: alphanumeric in theme'  => array( 'subdir/mythemev1' ),
+			'subdir: alphanumeric in subdir' => array( 'subdirv1/mytheme' ),
+			'subdir: alphanumeric in both'   => array( 'subdirv1/mythemev1' ),
+			'subdir: àáâãäåæç in theme'      => array( 'subdir/àáâãäåæç' ),
+			'subdir: àáâãäåæç in subdir'     => array( 'àáâãäåæç/mythemev1' ),
+			'subdir: àáâãäåæç in both'       => array( 'àáâãäåæç/àáâãäåæç' ),
+			'subdir: space in theme'         => array( 'subdir/my theme' ),
+			'subdir: space in subdir'        => array( 'sub dir/mytheme' ),
+			'subdir: space in both'          => array( 'sub dir/my theme' ),
+			'subdir: -_. in theme'           => array( 'subdir/my_theme-0.1' ),
+			'subdir: -_. in subdir'          => array( 'sub_dir-0.1/mytheme' ),
+			'subdir: -_. in both'            => array( 'sub_dir-0.1/my_theme-0.1' ),
+			'subdir: all combined in theme'  => array( 'subdir/thémé {}&=@!$,^~%[0.1](-_-)' ),
+			'subdir: all combined in subdir' => array( 'sűbdīr {}&=@!$,^~%[0.1](-_-)/mytheme' ),
+			'subdir: all combined in both'   => array( 'sűbdīr {}&=@!$,^~%[0.1](-_-)/thémé {}&=@!$,^~%[0.1](-_-)' ),
+		);
+	}
+
+	/**
+	 * @covers WP_REST_Global_Styles_Controller::get_theme_item
+	 * @ticket 54595
+	 */
+	public function test_get_theme_item_fields() {
+		wp_set_current_user( self::$admin_id );
+		$request = new WP_REST_Request( 'GET', '/wp/v2/global-styles/themes/tt1-blocks' );
+		$request->set_param( '_fields', 'settings' );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$this->assertArrayHasKey( 'settings', $data );
+		$this->assertArrayNotHasKey( 'styles', $data );
+	}
+
+	/**
+	 * @covers WP_REST_Global_Styles_Controller::get_item
+	 * @ticket 54516
+	 */
+	public function test_get_item_no_user() {
+		wp_set_current_user( 0 );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/global-styles/' . self::$global_styles_id );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_cannot_view', $response, 401 );
+	}
+
+	/**
+	 * @covers WP_REST_Global_Styles_Controller::get_item
+	 * @ticket 54516
+	 */
+	public function test_get_item_invalid_post() {
+		wp_set_current_user( self::$admin_id );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/global-styles/' . self::$post_id );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_global_styles_not_found', $response, 404 );
+	}
+
+	/**
+	 * @covers WP_REST_Global_Styles_Controller::get_item
+	 * @ticket 54516
+	 */
+	public function test_get_item_permission_check() {
+		wp_set_current_user( self::$subscriber_id );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/global-styles/' . self::$global_styles_id );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_cannot_view', $response, 403 );
+	}
+
+	/**
+	 * @covers WP_REST_Global_Styles_Controller::get_item
+	 * @ticket 54516
+	 */
+	public function test_get_item_no_user_edit() {
+		wp_set_current_user( 0 );
+		$request = new WP_REST_Request( 'GET', '/wp/v2/global-styles/' . self::$global_styles_id );
+		$request->set_param( 'context', 'edit' );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_forbidden_context', $response, 401 );
+	}
+
+	/**
+	 * @covers WP_REST_Global_Styles_Controller::get_item
+	 * @ticket 54516
+	 */
+	public function test_get_item_permission_check_edit() {
+		wp_set_current_user( self::$subscriber_id );
+		$request = new WP_REST_Request( 'GET', '/wp/v2/global-styles/' . self::$global_styles_id );
+		$request->set_param( 'context', 'edit' );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_forbidden_context', $response, 403 );
+	}
+
+	/**
+	 * @covers WP_REST_Global_Styles_Controller::get_item
+	 */
+	public function test_get_item() {
+		wp_set_current_user( self::$admin_id );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/global-styles/' . self::$global_styles_id );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$links    = $response->get_links();
+
+		$this->assertEquals(
+			array(
+				'id'       => self::$global_styles_id,
+				'title'    => array(
+					'raw'      => 'Custom Styles',
+					'rendered' => 'Custom Styles',
+				),
+				'settings' => new stdClass(),
+				'styles'   => new stdClass(),
+			),
+			$data
+		);
+
+		$this->assertArrayHasKey( 'self', $links );
+		$this->assertStringContainsString( '/wp/v2/global-styles/' . self::$global_styles_id, $links['self'][0]['href'] );
+	}
+
+	public function test_create_item() {
+		$this->markTestSkipped( 'Controller does not implement create_item().' );
+	}
+
+	/**
+	 * @covers WP_REST_Global_Styles_Controller::update_item
+	 * @ticket 54516
+	 */
+	public function test_update_item() {
+		wp_set_current_user( self::$admin_id );
+		$request = new WP_REST_Request( 'PUT', '/wp/v2/global-styles/' . self::$global_styles_id );
+		$request->set_body_params(
+			array(
+				'title' => 'My new global styles title',
+			)
+		);
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$this->assertEquals( 'My new global styles title', $data['title']['raw'] );
+	}
+
+
+	/**
+	 * @covers WP_REST_Global_Styles_Controller::update_item
+	 * @ticket 54516
+	 */
+	public function test_update_item_no_user() {
+		wp_set_current_user( 0 );
+		$request  = new WP_REST_Request( 'PUT', '/wp/v2/global-styles/' . self::$global_styles_id );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_cannot_edit', $response, 401 );
+	}
+
+	/**
+	 * @covers WP_REST_Global_Styles_Controller::update_item
+	 * @ticket 54516
+	 */
+	public function test_update_item_invalid_post() {
+		wp_set_current_user( self::$admin_id );
+		$request  = new WP_REST_Request( 'PUT', '/wp/v2/global-styles/' . self::$post_id );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_global_styles_not_found', $response, 404 );
+	}
+
+	/**
+	 * @covers WP_REST_Global_Styles_Controller::update_item
+	 * @ticket 54516
+	 */
+	public function test_update_item_permission_check() {
+		wp_set_current_user( self::$subscriber_id );
+		$request  = new WP_REST_Request( 'PUT', '/wp/v2/global-styles/' . self::$global_styles_id );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_cannot_edit', $response, 403 );
+	}
+
+	public function test_delete_item() {
+		$this->markTestSkipped( 'Controller does not implement delete_item().' );
+	}
+
+	public function test_prepare_item() {
+		$this->markTestSkipped( 'Controller does not implement prepare_item().' );
+	}
+
+	/**
+	 * @covers WP_REST_Global_Styles_Controller::get_item_schema
+	 * @ticket 54516
+	 */
+	public function test_get_item_schema() {
+		$request    = new WP_REST_Request( 'OPTIONS', '/wp/v2/global-styles/' . self::$global_styles_id );
+		$response   = rest_get_server()->dispatch( $request );
+		$data       = $response->get_data();
+		$properties = $data['schema']['properties'];
+		$this->assertCount( 4, $properties, 'Schema properties array does not have exactly 4 elements' );
+		$this->assertArrayHasKey( 'id', $properties, 'Schema properties array does not have "id" key' );
+		$this->assertArrayHasKey( 'styles', $properties, 'Schema properties array does not have "styles" key' );
+		$this->assertArrayHasKey( 'settings', $properties, 'Schema properties array does not have "settings" key' );
+		$this->assertArrayHasKey( 'title', $properties, 'Schema properties array does not have "title" key' );
+	}
+}
diff --git a/tests/phpunit/tests/rest-api/rest-pages-controller.php b/tests/phpunit/tests/rest-api/rest-pages-controller.php
index 00047cce80..da24a13d9b 100644
--- a/tests/phpunit/tests/rest-api/rest-pages-controller.php
+++ b/tests/phpunit/tests/rest-api/rest-pages-controller.php
@@ -64,7 +64,8 @@ class WP_Test_REST_Pages_Controller extends WP_Test_REST_Post_Type_Controller_Te
 		$request  = new WP_REST_Request( 'OPTIONS', '/wp/v2/pages' );
 		$response = rest_get_server()->dispatch( $request );
 		$data     = $response->get_data();
-		$keys     = array_keys( $data['endpoints'][0]['args'] );
+		$this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
+		$keys = array_keys( $data['endpoints'][0]['args'] );
 		sort( $keys );
 		$this->assertSame(
 			array(
@@ -329,8 +330,8 @@ class WP_Test_REST_Pages_Controller extends WP_Test_REST_Post_Type_Controller_Te
 
 	public function test_get_items_invalid_date() {
 		$request = new WP_REST_Request( 'GET', '/wp/v2/pages' );
-		$request->set_param( 'after', rand_str() );
-		$request->set_param( 'before', rand_str() );
+		$request->set_param( 'after', 'foo' );
+		$request->set_param( 'before', 'bar' );
 		$response = rest_get_server()->dispatch( $request );
 		$this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
 	}
@@ -368,8 +369,8 @@ class WP_Test_REST_Pages_Controller extends WP_Test_REST_Post_Type_Controller_Te
 	 */
 	public function test_get_items_invalid_modified_date() {
 		$request = new WP_REST_Request( 'GET', '/wp/v2/pages' );
-		$request->set_param( 'modified_after', rand_str() );
-		$request->set_param( 'modified_before', rand_str() );
+		$request->set_param( 'modified_after', 'foo' );
+		$request->set_param( 'modified_before', 'bar' );
 		$response = rest_get_server()->dispatch( $request );
 		$this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
 	}
diff --git a/tests/phpunit/tests/rest-api/rest-plugins-controller.php b/tests/phpunit/tests/rest-api/rest-plugins-controller.php
index e2a61d605b..3cea054301 100644
--- a/tests/phpunit/tests/rest-api/rest-plugins-controller.php
+++ b/tests/phpunit/tests/rest-api/rest-plugins-controller.php
@@ -546,8 +546,26 @@ class WP_REST_Plugins_Controller_Test extends WP_Test_REST_Controller_Testcase {
 	 */
 	public function test_create_item_unknown_plugin() {
 		wp_set_current_user( self::$super_admin );
+		add_filter(
+			'pre_http_request',
+			static function() {
+				/*
+				 * Mocks the request to:
+				 * https://api.wordpress.org/plugins/info/1.2/?action=plugin_information&request%5Bslug%5D=alex-says-this-block-definitely-doesnt-exist&request%5Bfields%5D%5Bsections%5D=0&request%5Bfields%5D%5Blanguage_packs%5D=1&request%5Blocale%5D=en_US&request%5Bwp_version%5D=5.9
+				 */
+				return array(
+					'headers'  => array(),
+					'response' => array(
+						'code'    => 404,
+						'message' => 'Not Found',
+					),
+					'body'     => '{"error":"Plugin not found."}',
+					'cookies'  => array(),
+					'filename' => null,
+				);
+			}
+		);
 
-		// This will hit the live API.
 		$request = new WP_REST_Request( 'POST', self::BASE );
 		$request->set_body_params( array( 'slug' => 'alex-says-this-block-definitely-doesnt-exist' ) );
 		$response = rest_do_request( $request );
diff --git a/tests/phpunit/tests/rest-api/rest-posts-controller.php b/tests/phpunit/tests/rest-api/rest-posts-controller.php
index b35921a73d..f02037962c 100644
--- a/tests/phpunit/tests/rest-api/rest-posts-controller.php
+++ b/tests/phpunit/tests/rest-api/rest-posts-controller.php
@@ -154,12 +154,14 @@ class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te
 		$request  = new WP_REST_Request( 'OPTIONS', '/wp/v2/posts' );
 		$response = rest_get_server()->dispatch( $request );
 		$data     = $response->get_data();
+		$this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
 		$this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
 		$this->assertSame( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
 		// Single.
 		$request  = new WP_REST_Request( 'OPTIONS', '/wp/v2/posts/' . self::$post_id );
 		$response = rest_get_server()->dispatch( $request );
 		$data     = $response->get_data();
+		$this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
 		$this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
 		$this->assertSame( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
 	}
@@ -1692,8 +1694,8 @@ class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te
 
 	public function test_get_items_invalid_date() {
 		$request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
-		$request->set_param( 'after', rand_str() );
-		$request->set_param( 'before', rand_str() );
+		$request->set_param( 'after', 'foo' );
+		$request->set_param( 'before', 'bar' );
 		$response = rest_get_server()->dispatch( $request );
 		$this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
 	}
@@ -1717,8 +1719,8 @@ class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te
 	 */
 	public function test_get_items_invalid_modified_date() {
 		$request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
-		$request->set_param( 'modified_after', rand_str() );
-		$request->set_param( 'modified_before', rand_str() );
+		$request->set_param( 'modified_after', 'foo' );
+		$request->set_param( 'modified_before', 'bar' );
 		$response = rest_get_server()->dispatch( $request );
 		$this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
 	}
@@ -1846,7 +1848,7 @@ class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te
 		$this->assertSame( rest_url( '/wp/v2/users/' . self::$author_id ), $links['author'][0]['href'] );
 	}
 
-	public function test_get_post_draft_status_not_authenicated() {
+	public function test_get_post_draft_status_not_authenticated() {
 		$draft_id = $this->factory->post->create(
 			array(
 				'post_status' => 'draft',
@@ -2695,7 +2697,7 @@ class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te
 			0,
 			array(
 				'post_mime_type' => 'image/jpeg',
-				'menu_order'     => rand( 1, 100 ),
+				'menu_order'     => 1,
 			)
 		);
 
@@ -3308,7 +3310,7 @@ class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te
 	public function test_update_post_ignore_readonly() {
 		wp_set_current_user( self::$editor_id );
 
-		$new_content       = rand_str();
+		$new_content       = 'foo bar baz';
 		$expected_modified = current_time( 'mysql' );
 
 		$request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/posts/%d', self::$post_id ) );
@@ -3373,7 +3375,7 @@ class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te
 		$request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/posts/%d', self::$post_id ) );
 		$params  = $this->set_post_data(
 			array(
-				'date' => rand_str(),
+				'date' => 'foo',
 			)
 		);
 		$request->set_body_params( $params );
@@ -3388,7 +3390,7 @@ class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te
 		$request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/posts/%d', self::$post_id ) );
 		$params  = $this->set_post_data(
 			array(
-				'date_gmt' => rand_str(),
+				'date_gmt' => 'foo',
 			)
 		);
 		$request->set_body_params( $params );
diff --git a/tests/phpunit/tests/rest-api/rest-request.php b/tests/phpunit/tests/rest-api/rest-request.php
index 836cb6159d..509c754f65 100644
--- a/tests/phpunit/tests/rest-api/rest-request.php
+++ b/tests/phpunit/tests/rest-api/rest-request.php
@@ -18,6 +18,16 @@ class Tests_REST_Request extends WP_UnitTestCase {
 		$this->request = new WP_REST_Request();
 	}
 
+	/**
+	 * Called before setting up all tests.
+	 */
+	public static function set_up_before_class() {
+		parent::set_up_before_class();
+
+		// Require files that need to load once.
+		require_once DIR_TESTROOT . '/includes/mock-invokable.php';
+	}
+
 	public function test_header() {
 		$value = 'application/x-wp-example';
 
@@ -1014,7 +1024,7 @@ class Tests_REST_Request extends WP_UnitTestCase {
 		$request->set_query_params( array( 'test' => 'value' ) );
 
 		$error    = new WP_Error( 'error_code', __( 'Error Message' ), array( 'status' => 400 ) );
-		$callback = $this->createPartialMock( 'stdClass', array( '__invoke' ) );
+		$callback = $this->createPartialMock( 'Mock_Invokable', array( '__invoke' ) );
 		$callback->expects( self::once() )->method( '__invoke' )->with( self::identicalTo( $request ) )->willReturn( $error );
 		$request->set_attributes(
 			array(
@@ -1038,7 +1048,7 @@ class Tests_REST_Request extends WP_UnitTestCase {
 		$request->set_query_params( array( 'test' => 'value' ) );
 
 		$error    = new WP_Error( 'error_code', __( 'Error Message' ), array( 'status' => 400 ) );
-		$callback = $this->createPartialMock( 'stdClass', array( '__invoke' ) );
+		$callback = $this->createPartialMock( 'Mock_Invokable', array( '__invoke' ) );
 		$callback->expects( self::once() )->method( '__invoke' )->with( self::identicalTo( $request ) )->willReturn( $error );
 		$request->set_attributes(
 			array(
@@ -1056,7 +1066,7 @@ class Tests_REST_Request extends WP_UnitTestCase {
 		$request = new WP_REST_Request();
 		$request->set_query_params( array( 'test' => 'value' ) );
 
-		$callback = $this->createPartialMock( 'stdClass', array( '__invoke' ) );
+		$callback = $this->createPartialMock( 'Mock_Invokable', array( '__invoke' ) );
 		$callback->expects( self::never() )->method( '__invoke' );
 		$request->set_attributes(
 			array(
diff --git a/tests/phpunit/tests/rest-api/rest-schema-setup.php b/tests/phpunit/tests/rest-api/rest-schema-setup.php
index 8b522ef06b..3bec8d45d4 100644
--- a/tests/phpunit/tests/rest-api/rest-schema-setup.php
+++ b/tests/phpunit/tests/rest-api/rest-schema-setup.php
@@ -69,6 +69,9 @@ class WP_Test_REST_Schema_Initialization extends WP_Test_REST_TestCase {
 		}
 	}
 
+	/**
+	 * @ticket 54596
+	 */
 	public function test_expected_routes_in_schema() {
 		$routes = rest_get_server()->get_routes();
 
@@ -89,6 +92,14 @@ class WP_Test_REST_Schema_Initialization extends WP_Test_REST_TestCase {
 			'/wp/v2/posts/(?P<parent>[\\d]+)/revisions/(?P<id>[\\d]+)',
 			'/wp/v2/posts/(?P<id>[\\d]+)/autosaves',
 			'/wp/v2/posts/(?P<parent>[\\d]+)/autosaves/(?P<id>[\\d]+)',
+			'/wp/v2/menu-items',
+			'/wp/v2/menu-items/(?P<id>[\d]+)',
+			'/wp/v2/menu-items/(?P<id>[\d]+)/autosaves',
+			'/wp/v2/menu-items/(?P<parent>[\d]+)/autosaves/(?P<id>[\d]+)',
+			'/wp/v2/menu-locations',
+			'/wp/v2/menu-locations/(?P<location>[\w-]+)',
+			'/wp/v2/menus',
+			'/wp/v2/menus/(?P<id>[\d]+)',
 			'/wp/v2/pages',
 			'/wp/v2/pages/(?P<id>[\\d]+)',
 			'/wp/v2/pages/(?P<parent>[\\d]+)/revisions',
@@ -124,20 +135,28 @@ class WP_Test_REST_Schema_Initialization extends WP_Test_REST_TestCase {
 			'/wp/v2/users/(?P<user_id>(?:[\\d]+|me))/application-passwords/(?P<uuid>[\\w\\-]+)',
 			'/wp/v2/comments',
 			'/wp/v2/comments/(?P<id>[\\d]+)',
+			'/wp/v2/global-styles/(?P<id>[\/\w-]+)',
+			'/wp/v2/global-styles/themes/(?P<stylesheet>[^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?)',
 			'/wp/v2/search',
 			'/wp/v2/block-renderer/(?P<name>[a-z0-9-]+/[a-z0-9-]+)',
 			'/wp/v2/block-types',
 			'/wp/v2/block-types/(?P<namespace>[a-zA-Z0-9_-]+)',
 			'/wp/v2/block-types/(?P<namespace>[a-zA-Z0-9_-]+)/(?P<name>[a-zA-Z0-9_-]+)',
 			'/wp/v2/settings',
+			'/wp/v2/template-parts',
+			'/wp/v2/template-parts/(?P<id>[\d]+)/autosaves',
+			'/wp/v2/template-parts/(?P<id>([^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?)[\/\w-]+)',
+			'/wp/v2/template-parts/(?P<parent>[\d]+)/autosaves/(?P<id>[\d]+)',
+			'/wp/v2/template-parts/(?P<parent>[\d]+)/revisions',
+			'/wp/v2/template-parts/(?P<parent>[\d]+)/revisions/(?P<id>[\d]+)',
 			'/wp/v2/templates',
-			'/wp/v2/templates/(?P<id>[\/\w-]+)',
 			'/wp/v2/templates/(?P<id>[\d]+)/autosaves',
+			'/wp/v2/templates/(?P<id>([^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?)[\/\w-]+)',
 			'/wp/v2/templates/(?P<parent>[\d]+)/autosaves/(?P<id>[\d]+)',
 			'/wp/v2/templates/(?P<parent>[\d]+)/revisions',
 			'/wp/v2/templates/(?P<parent>[\d]+)/revisions/(?P<id>[\d]+)',
 			'/wp/v2/themes',
-			'/wp/v2/themes/(?P<stylesheet>[^.\/]+(?:\/[^.\/]+)?)',
+			'/wp/v2/themes/(?P<stylesheet>[^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?)',
 			'/wp/v2/plugins',
 			'/wp/v2/plugins/(?P<plugin>[^.\/]+(?:\/[^.\/]+)?)',
 			'/wp/v2/block-directory/search',
@@ -146,8 +165,15 @@ class WP_Test_REST_Schema_Initialization extends WP_Test_REST_TestCase {
 			'/wp/v2/widget-types',
 			'/wp/v2/widget-types/(?P<id>[a-zA-Z0-9_-]+)',
 			'/wp/v2/widget-types/(?P<id>[a-zA-Z0-9_-]+)/encode',
+			'/wp/v2/widget-types/(?P<id>[a-zA-Z0-9_-]+)/render',
 			'/wp/v2/widgets',
 			'/wp/v2/widgets/(?P<id>[\w\-]+)',
+			'/wp/v2/navigation',
+			'/wp/v2/navigation/(?P<id>[\d]+)',
+			'/wp/v2/navigation/(?P<id>[\d]+)/autosaves',
+			'/wp/v2/navigation/(?P<parent>[\d]+)/autosaves/(?P<id>[\d]+)',
+			'/wp/v2/navigation/(?P<parent>[\d]+)/revisions',
+			'/wp/v2/navigation/(?P<parent>[\d]+)/revisions/(?P<id>[\d]+)',
 			'/wp-site-health/v1',
 			'/wp-site-health/v1/tests/background-updates',
 			'/wp-site-health/v1/tests/loopback-requests',
diff --git a/tests/phpunit/tests/rest-api/rest-server.php b/tests/phpunit/tests/rest-api/rest-server.php
index 30977958fa..6c453c051c 100644
--- a/tests/phpunit/tests/rest-api/rest-server.php
+++ b/tests/phpunit/tests/rest-api/rest-server.php
@@ -10,6 +10,13 @@
  * @group restapi
  */
 class Tests_REST_Server extends WP_Test_REST_TestCase {
+	protected static $icon_id;
+
+	public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) {
+		$filename      = DIR_TESTDATA . '/images/test-image-large.jpg';
+		self::$icon_id = $factory->attachment->create_upload_object( $filename );
+	}
+
 	public function set_up() {
 		parent::set_up();
 
@@ -28,6 +35,16 @@ class Tests_REST_Server extends WP_Test_REST_TestCase {
 		parent::tear_down();
 	}
 
+	/**
+	 * Called before setting up all tests.
+	 */
+	public static function set_up_before_class() {
+		parent::set_up_before_class();
+
+		// Require files that need to load once.
+		require_once DIR_TESTROOT . '/includes/mock-invokable.php';
+	}
+
 	public function test_envelope() {
 		$data    = array(
 			'amount of arbitrary data' => 'alot',
@@ -370,6 +387,38 @@ class Tests_REST_Server extends WP_Test_REST_TestCase {
 		$this->assertSame( $sent_headers['Allow'], 'POST' );
 	}
 
+	/**
+	 * @ticket 53063
+	 */
+	public function test_batched_options() {
+		register_rest_route(
+			'test-ns',
+			'/test',
+			array(
+				array(
+					'methods'             => array( 'GET' ),
+					'callback'            => '__return_null',
+					'permission_callback' => '__return_true',
+				),
+				array(
+					'methods'             => array( 'POST' ),
+					'callback'            => '__return_null',
+					'permission_callback' => '__return_null',
+					'allow_batch'         => false,
+				),
+				'allow_batch' => array( 'v1' => true ),
+			)
+		);
+
+		$request  = new WP_REST_Request( 'OPTIONS', '/test-ns/test' );
+		$response = rest_get_server()->dispatch( $request );
+
+		$data = $response->get_data();
+
+		$this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
+		$this->assertArrayNotHasKey( 'allow_batch', $data['endpoints'][1] );
+	}
+
 	public function test_allow_header_sent_on_options_request() {
 		register_rest_route(
 			'test-ns',
@@ -975,6 +1024,38 @@ class Tests_REST_Server extends WP_Test_REST_TestCase {
 
 		$this->assertArrayHasKey( 'help', $index->get_links() );
 		$this->assertArrayNotHasKey( 'wp:active-theme', $index->get_links() );
+
+		// Check site logo and icon.
+		$this->assertArrayHasKey( 'site_logo', $data );
+		$this->assertArrayHasKey( 'site_icon', $data );
+	}
+
+	/**
+	 * @ticket 50152
+	 */
+	public function test_index_includes_link_to_active_theme_if_authenticated() {
+		$server = new WP_REST_Server();
+		wp_set_current_user( self::factory()->user->create( array( 'role' => 'administrator' ) ) );
+
+		$request = new WP_REST_Request( 'GET', '/' );
+		$index   = $server->dispatch( $request );
+
+		$this->assertArrayHasKey( 'https://api.w.org/active-theme', $index->get_links() );
+	}
+
+	/**
+	 * @ticket 52321
+	 */
+	public function test_index_includes_site_icon() {
+		$server = new WP_REST_Server();
+		update_option( 'site_icon', self::$icon_id );
+
+		$request = new WP_REST_Request( 'GET', '/' );
+		$index   = $server->dispatch( $request );
+		$data    = $index->get_data();
+
+		$this->assertArrayHasKey( 'site_icon', $data );
+		$this->assertSame( self::$icon_id, $data['site_icon'] );
 	}
 
 	public function test_get_namespace_index() {
@@ -1573,9 +1654,9 @@ class Tests_REST_Server extends WP_Test_REST_TestCase {
 	 * @ticket 50244
 	 */
 	public function test_callbacks_are_not_executed_if_request_validation_fails() {
-		$callback = $this->createPartialMock( 'stdClass', array( '__invoke' ) );
+		$callback = $this->createPartialMock( 'Mock_Invokable', array( '__invoke' ) );
 		$callback->expects( self::never() )->method( '__invoke' );
-		$permission_callback = $this->createPartialMock( 'stdClass', array( '__invoke' ) );
+		$permission_callback = $this->createPartialMock( 'Mock_Invokable', array( '__invoke' ) );
 		$permission_callback->expects( self::never() )->method( '__invoke' );
 
 		register_rest_route(
@@ -2012,16 +2093,6 @@ class Tests_REST_Server extends WP_Test_REST_TestCase {
 		$this->assertSameSetsWithIndex( $expected, $args['param'] );
 	}
 
-	/**
-	 * @ticket 50152
-	 */
-	public function test_index_includes_link_to_active_theme_if_authenticated() {
-		wp_set_current_user( self::factory()->user->create( array( 'role' => 'administrator' ) ) );
-
-		$index = rest_do_request( '/' );
-		$this->assertArrayHasKey( 'https://api.w.org/active-theme', $index->get_links() );
-	}
-
 	/**
 	 * @ticket 53056
 	 */
diff --git a/tests/phpunit/tests/rest-api/rest-settings-controller.php b/tests/phpunit/tests/rest-api/rest-settings-controller.php
index bb9a4bbdb6..fe99fccfa8 100644
--- a/tests/phpunit/tests/rest-api/rest-settings-controller.php
+++ b/tests/phpunit/tests/rest-api/rest-settings-controller.php
@@ -108,6 +108,7 @@ class WP_Test_REST_Settings_Controller extends WP_Test_REST_Controller_Testcase
 			'posts_per_page',
 			'default_ping_status',
 			'default_comment_status',
+			'site_icon', // Registered in wp-includes/blocks/site-logo.php
 		);
 
 		if ( ! is_multisite() ) {
diff --git a/tests/phpunit/tests/rest-api/rest-tags-controller.php b/tests/phpunit/tests/rest-api/rest-tags-controller.php
index 6ec4bbb689..b9ac20cf71 100644
--- a/tests/phpunit/tests/rest-api/rest-tags-controller.php
+++ b/tests/phpunit/tests/rest-api/rest-tags-controller.php
@@ -135,6 +135,7 @@ class WP_Test_REST_Tags_Controller extends WP_Test_REST_Controller_Testcase {
 		$request  = new WP_REST_Request( 'OPTIONS', '/wp/v2/tags' );
 		$response = rest_get_server()->dispatch( $request );
 		$data     = $response->get_data();
+		$this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
 		$this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
 		$this->assertSameSets( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
 		// Single.
@@ -142,6 +143,7 @@ class WP_Test_REST_Tags_Controller extends WP_Test_REST_Controller_Testcase {
 		$request  = new WP_REST_Request( 'OPTIONS', '/wp/v2/tags/' . $tag1 );
 		$response = rest_get_server()->dispatch( $request );
 		$data     = $response->get_data();
+		$this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
 		$this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
 		$this->assertSameSets( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
 	}
diff --git a/tests/phpunit/tests/rest-api/rest-taxonomies-controller.php b/tests/phpunit/tests/rest-api/rest-taxonomies-controller.php
index 17be251c1d..38906f5513 100644
--- a/tests/phpunit/tests/rest-api/rest-taxonomies-controller.php
+++ b/tests/phpunit/tests/rest-api/rest-taxonomies-controller.php
@@ -68,7 +68,9 @@ class WP_Test_REST_Taxonomies_Controller extends WP_Test_REST_Controller_Testcas
 		$request->set_param( 'context', 'edit' );
 		$response   = rest_get_server()->dispatch( $request );
 		$data       = $response->get_data();
-		$taxonomies = $this->get_public_taxonomies( get_taxonomies( '', 'objects' ) );
+		$taxonomies = get_taxonomies( '', 'objects' );
+		unset( $taxonomies['nav_menu'] ); // Menus are not editable by contributors.
+		$taxonomies = $this->get_public_taxonomies( $taxonomies );
 		$this->assertSame( count( $taxonomies ), count( $data ) );
 		$this->assertSame( 'Categories', $data['category']['name'] );
 		$this->assertSame( 'category', $data['category']['slug'] );
diff --git a/tests/phpunit/tests/rest-api/rest-templates-controller.php b/tests/phpunit/tests/rest-api/rest-templates-controller.php
deleted file mode 100644
index 356c868d76..0000000000
--- a/tests/phpunit/tests/rest-api/rest-templates-controller.php
+++ /dev/null
@@ -1,197 +0,0 @@
-<?php
-/**
- * Unit tests covering the templates endpoint..
- *
- * @package WordPress
- * @subpackage REST API
- */
-
-class WP_REST_Template_Controller_Test extends WP_Test_REST_Controller_Testcase {
-	/**
-	 * @var int
-	 */
-	protected static $admin_id;
-	private static $post;
-
-	/**
-	 * Create fake data before our tests run.
-	 *
-	 * @param WP_UnitTest_Factory $factory Helper that lets us create fake data.
-	 */
-	public static function wpSetupBeforeClass( $factory ) {
-		self::$admin_id = $factory->user->create(
-			array(
-				'role' => 'administrator',
-			)
-		);
-
-		// Set up template post.
-		$args       = array(
-			'post_type'    => 'wp_template',
-			'post_name'    => 'my_template',
-			'post_title'   => 'My Template',
-			'post_content' => 'Content',
-			'post_excerpt' => 'Description of my template.',
-			'tax_input'    => array(
-				'wp_theme' => array(
-					get_stylesheet(),
-				),
-			),
-		);
-		self::$post = self::factory()->post->create_and_get( $args );
-		wp_set_post_terms( self::$post->ID, get_stylesheet(), 'wp_theme' );
-	}
-
-	public static function wpTearDownAfterClass() {
-		wp_delete_post( self::$post->ID );
-	}
-
-
-	public function test_register_routes() {
-		$routes = rest_get_server()->get_routes();
-		$this->assertArrayHasKey( '/wp/v2/templates', $routes );
-		$this->assertArrayHasKey( '/wp/v2/templates/(?P<id>[\/\w-]+)', $routes );
-	}
-
-	public function test_context_param() {
-		// TODO: Implement test_context_param() method.
-	}
-
-	public function test_get_items() {
-		function find_and_normalize_template_by_id( $templates, $id ) {
-			foreach ( $templates as $template ) {
-				if ( $template['id'] === $id ) {
-					unset( $template['content'] );
-					unset( $template['_links'] );
-					return $template;
-				}
-			}
-
-			return null;
-		}
-
-		wp_set_current_user( 0 );
-		$request  = new WP_REST_Request( 'GET', '/wp/v2/templates' );
-		$response = rest_get_server()->dispatch( $request );
-		$this->assertErrorResponse( 'rest_cannot_manage_templates', $response, 401 );
-
-		wp_set_current_user( self::$admin_id );
-		$request  = new WP_REST_Request( 'GET', '/wp/v2/templates' );
-		$response = rest_get_server()->dispatch( $request );
-		$data     = $response->get_data();
-
-		$this->assertSame(
-			array(
-				'id'             => 'default//my_template',
-				'theme'          => 'default',
-				'slug'           => 'my_template',
-				'source'         => 'custom',
-				'type'           => 'wp_template',
-				'description'    => 'Description of my template.',
-				'title'          => array(
-					'raw'      => 'My Template',
-					'rendered' => 'My Template',
-				),
-				'status'         => 'publish',
-				'wp_id'          => self::$post->ID,
-				'has_theme_file' => false,
-			),
-			find_and_normalize_template_by_id( $data, 'default//my_template' )
-		);
-	}
-
-	public function test_get_item() {
-		wp_set_current_user( self::$admin_id );
-		$request  = new WP_REST_Request( 'GET', '/wp/v2/templates/default//my_template' );
-		$response = rest_get_server()->dispatch( $request );
-		$data     = $response->get_data();
-		unset( $data['content'] );
-		unset( $data['_links'] );
-
-		$this->assertSame(
-			array(
-				'id'             => 'default//my_template',
-				'theme'          => 'default',
-				'slug'           => 'my_template',
-				'source'         => 'custom',
-				'type'           => 'wp_template',
-				'description'    => 'Description of my template.',
-				'title'          => array(
-					'raw'      => 'My Template',
-					'rendered' => 'My Template',
-				),
-				'status'         => 'publish',
-				'wp_id'          => self::$post->ID,
-				'has_theme_file' => false,
-			),
-			$data
-		);
-	}
-
-	public function test_create_item() {
-		wp_set_current_user( self::$admin_id );
-		$request = new WP_REST_Request( 'POST', '/wp/v2/templates' );
-		$request->set_body_params(
-			array(
-				'slug'        => 'my_custom_template',
-				'description' => 'Just a description',
-				'title'       => 'My Template',
-				'content'     => 'Content',
-			)
-		);
-		$response = rest_get_server()->dispatch( $request );
-		$data     = $response->get_data();
-		unset( $data['_links'] );
-		unset( $data['wp_id'] );
-
-		$this->assertSame(
-			array(
-				'id'             => 'default//my_custom_template',
-				'theme'          => 'default',
-				'content'        => array(
-					'raw' => 'Content',
-				),
-				'slug'           => 'my_custom_template',
-				'source'         => 'custom',
-				'type'           => 'wp_template',
-				'description'    => 'Just a description',
-				'title'          => array(
-					'raw'      => 'My Template',
-					'rendered' => 'My Template',
-				),
-				'status'         => 'publish',
-				'has_theme_file' => false,
-			),
-			$data
-		);
-	}
-
-	public function test_update_item() {
-		wp_set_current_user( self::$admin_id );
-		$request = new WP_REST_Request( 'PUT', '/wp/v2/templates/default//my_template' );
-		$request->set_body_params(
-			array(
-				'title' => 'My new Index Title',
-			)
-		);
-		$response = rest_get_server()->dispatch( $request );
-		$data     = $response->get_data();
-		$this->assertSame( 'My new Index Title', $data['title']['raw'] );
-		$this->assertSame( 'custom', $data['source'] );
-	}
-
-	public function test_delete_item() {
-		wp_set_current_user( self::$admin_id );
-		$request  = new WP_REST_Request( 'DELETE', '/wp/v2/templates/justrandom//template' );
-		$response = rest_get_server()->dispatch( $request );
-		$this->assertErrorResponse( 'rest_template_not_found', $response, 404 );
-	}
-
-	public function test_prepare_item() {
-		// TODO: Implement test_prepare_item() method.
-	}
-
-	public function test_get_item_schema() {
-		// TODO: Implement test_get_item_schema() method.
-	}
-}
diff --git a/tests/phpunit/tests/rest-api/rest-themes-controller.php b/tests/phpunit/tests/rest-api/rest-themes-controller.php
index 73a8b4c3cc..6737a707bd 100644
--- a/tests/phpunit/tests/rest-api/rest-themes-controller.php
+++ b/tests/phpunit/tests/rest-api/rest-themes-controller.php
@@ -1285,15 +1285,86 @@ class WP_Test_REST_Themes_Controller extends WP_Test_REST_Controller_Testcase {
 	}
 
 	/**
-	 * @ticket 54349
+	 * @dataProvider data_get_item_non_subdir_theme
+	 * @ticket 54596
+	 * @covers WP_REST_Themes_Controller::get_item
+	 *
+	 * @param string $theme_dir     Theme directory to test.
+	 * @param string $expected_name Expected theme name.
 	 */
-	public function test_get_item_subdirectory_theme() {
+	public function test_get_item_non_subdir_theme( $theme_dir, $expected_name ) {
 		wp_set_current_user( self::$admin_id );
-		$request  = new WP_REST_Request( 'GET', self::$themes_route . '/subdir/theme2' );
+		$request  = new WP_REST_Request( 'GET', self::$themes_route . $theme_dir );
 		$response = rest_do_request( $request );
 
 		$this->assertSame( 200, $response->get_status() );
-		$this->assertSame( 'My Subdir Theme', $response->get_data()['name']['raw'] );
+		$this->assertSame( $expected_name, $response->get_data()['name']['raw'] );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_get_item_non_subdir_theme() {
+		return array(
+			'parent theme'                => array(
+				'theme_dir'     => '/block-theme',
+				'expected_name' => 'Block Theme',
+			),
+			'child theme'                 => array(
+				'theme_dir'     => '/block-theme-child',
+				'expected_name' => 'Block Theme Child Theme',
+			),
+			'theme with _-[]. characters' => array(
+				'theme_dir'     => '/block_theme-[0.4.0]',
+				'expected_name' => 'Block Theme [0.4.0]',
+			),
+		);
+	}
+
+	/**
+	 * @dataProvider data_get_item_subdirectory_theme
+	 * @ticket 54349
+	 * @ticket 54596
+	 * @covers WP_REST_Themes_Controller::get_item
+	 *
+	 * @param string $theme_dir     Theme directory to test.
+	 * @param string $expected_name Expected theme name.
+	 */
+	public function test_get_item_subdirectory_theme( $theme_dir, $expected_name ) {
+		wp_set_current_user( self::$admin_id );
+		$request  = new WP_REST_Request( 'GET', self::$themes_route . $theme_dir );
+		$response = rest_do_request( $request );
+
+		$this->assertSame(
+			200,
+			$response->get_status(),
+			'A 200 OK status was not returned.'
+		);
+		$this->assertSame(
+			$expected_name,
+			$response->get_data()['name']['raw'],
+			'The actual theme name was not the expected theme name.'
+		);
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_get_item_subdirectory_theme() {
+		return array(
+			'theme2'                      => array(
+				'theme_dir'     => '/subdir/theme2',
+				'expected_name' => 'My Subdir Theme',
+			),
+			'theme with _-[]. characters' => array(
+				'theme_dir'     => '/subdir/block_theme-[1.0.0]',
+				'expected_name' => 'Block Theme [1.0.0] in subdirectory',
+			),
+		);
 	}
 
 	/**
diff --git a/tests/phpunit/tests/rest-api/rest-users-controller.php b/tests/phpunit/tests/rest-api/rest-users-controller.php
index c3f620c8cc..4a28f210a1 100644
--- a/tests/phpunit/tests/rest-api/rest-users-controller.php
+++ b/tests/phpunit/tests/rest-api/rest-users-controller.php
@@ -207,6 +207,7 @@ class WP_Test_REST_Users_Controller extends WP_Test_REST_Controller_Testcase {
 				'search',
 				'slug',
 				'who',
+				'has_published_posts',
 			),
 			$keys
 		);
@@ -1444,7 +1445,10 @@ class WP_Test_REST_Users_Controller extends WP_Test_REST_Controller_Testcase {
 			if ( 'user_name' === $error['code'] ) {
 				$this->assertSame( 'Sorry, that username already exists!', $error['message'] );
 			} else {
-				$this->assertSame( 'Sorry, that email address is already used!', $error['message'] );
+				$expected = '<strong>Error:</strong> This email address is already registered. ' .
+							'<a href="http://rest.wordpress.org/wp-login.php">Log in</a> with ' .
+							'this address or choose another one.';
+				$this->assertSame( $expected, $error['message'] );
 			}
 		}
 	}
diff --git a/tests/phpunit/tests/rest-api/rest-widgets-controller.php b/tests/phpunit/tests/rest-api/rest-widgets-controller.php
index d50172f2b3..a548ab79e1 100644
--- a/tests/phpunit/tests/rest-api/rest-widgets-controller.php
+++ b/tests/phpunit/tests/rest-api/rest-widgets-controller.php
@@ -1523,6 +1523,8 @@ class WP_Test_REST_Widgets_Controller extends WP_Test_REST_Controller_Testcase {
 		$data       = $response->get_data();
 		$properties = $data['schema']['properties'];
 
+		$this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
+
 		$this->assertCount( 7, $properties );
 		$this->assertArrayHasKey( 'id', $properties );
 		$this->assertArrayHasKey( 'id_base', $properties );
diff --git a/tests/phpunit/tests/rest-api/wpRestEditSiteExportController.php b/tests/phpunit/tests/rest-api/wpRestEditSiteExportController.php
new file mode 100644
index 0000000000..4683d68fed
--- /dev/null
+++ b/tests/phpunit/tests/rest-api/wpRestEditSiteExportController.php
@@ -0,0 +1,156 @@
+<?php
+/**
+ * WP_REST_Edit_Site_Export_Controller tests.
+ *
+ * @package WordPress
+ * @subpackage REST_API
+ * @since 5.9.0
+ */
+
+/**
+ * Tests for WP_REST_Edit_Site_Export_Controller.
+ *
+ * @since 5.9.0
+ *
+ * @covers WP_REST_Edit_Site_Export_Controller
+ *
+ * @group restapi
+ */
+class Tests_REST_WpRestEditSiteExportController extends WP_Test_REST_Controller_Testcase {
+
+	/**
+	 * The REST API route for the edit site export.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @var string
+	 */
+	const REQUEST_ROUTE = '/wp-block-editor/v1/export';
+
+	/**
+	 * Subscriber user ID.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @var int
+	 */
+	protected static $subscriber_id;
+
+	/**
+	 * Set up class test fixtures.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param WP_UnitTest_Factory $factory WordPress unit test factory.
+	 */
+	public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) {
+		self::$subscriber_id = $factory->user->create(
+			array(
+				'role' => 'subscriber',
+			)
+		);
+	}
+
+	/**
+	 * Delete test data after our tests run.
+	 *
+	 * @since 5.9.0
+	 */
+	public static function wpTearDownAfterClass() {
+		self::delete_user( self::$subscriber_id );
+	}
+
+	/**
+	 * @covers WP_REST_Edit_Site_Export_Controller::register_routes
+	 * @ticket 54448
+	 */
+	public function test_register_routes() {
+		$routes = rest_get_server()->get_routes();
+		$this->assertArrayHasKey( static::REQUEST_ROUTE, $routes );
+		$this->assertCount( 1, $routes[ static::REQUEST_ROUTE ] );
+	}
+
+	/**
+	 * @covers WP_REST_Edit_Site_Export_Controller::permissions_check
+	 *
+	 * @ticket 54448
+	 */
+	public function test_export_for_no_user_permissions() {
+		wp_set_current_user( 0 );
+
+		$request  = new WP_REST_Request( 'GET', static::REQUEST_ROUTE );
+		$response = rest_get_server()->dispatch( $request );
+
+		$this->assertErrorResponse( 'rest_cannot_export_templates', $response, 401 );
+	}
+
+	/**
+	 * @covers WP_REST_Edit_Site_Export_Controller::permissions_check
+	 *
+	 * @ticket 54448
+	 */
+	public function test_export_for_user_with_insufficient_permissions() {
+		wp_set_current_user( self::$subscriber_id );
+
+		$request  = new WP_REST_Request( 'GET', static::REQUEST_ROUTE );
+		$response = rest_get_server()->dispatch( $request );
+
+		$this->assertErrorResponse( 'rest_cannot_export_templates', $response, 403 );
+	}
+
+	/**
+	 * @ticket 54448
+	 */
+	public function test_context_param() {
+		$this->markTestSkipped( 'Controller does not implement context_param().' );
+	}
+
+	/**
+	 * @ticket 54448
+	 */
+	public function test_get_item() {
+		$this->markTestSkipped( 'Controller does not implement get_item().' );
+	}
+
+	/**
+	 * @ticket 54448
+	 */
+	public function test_get_items() {
+		$this->markTestSkipped( 'Controller does not implement get_items().' );
+	}
+
+	/**
+	 * @ticket 54448
+	 */
+	public function test_create_item() {
+		$this->markTestSkipped( 'Controller does not implement create_item().' );
+	}
+
+	/**
+	 * @ticket 54448
+	 */
+	public function test_update_item() {
+		$this->markTestSkipped( 'Controller does not implement update_item().' );
+	}
+
+	/**
+	 * @ticket 54448
+	 */
+	public function test_delete_item() {
+		$this->markTestSkipped( 'Controller does not implement delete_item().' );
+	}
+
+	/**
+	 * @ticket 54448
+	 */
+	public function test_prepare_item() {
+		$this->markTestSkipped( 'Controller does not implement prepare_item().' );
+	}
+
+	/**
+	 * @ticket 54448
+	 */
+	public function test_get_item_schema() {
+		$this->markTestSkipped( 'Controller does not implement get_item_schema().' );
+	}
+}
diff --git a/tests/phpunit/tests/rest-api/wpRestMenuItemsController.php b/tests/phpunit/tests/rest-api/wpRestMenuItemsController.php
new file mode 100644
index 0000000000..9ef5b87d99
--- /dev/null
+++ b/tests/phpunit/tests/rest-api/wpRestMenuItemsController.php
@@ -0,0 +1,1058 @@
+<?php
+/**
+ * WP_REST_Menu_Items_Controller tests
+ *
+ * @package WordPress
+ * @subpackage REST_API
+ * @since 5.9.0
+ */
+
+/**
+ * Tests for REST API for Menu items.
+ *
+ * @group restapi
+ *
+ * @coversDefaultClass WP_REST_Menu_Items_Controller
+ */
+class Tests_REST_WpRestMenuItemsController extends WP_Test_REST_Post_Type_Controller_Testcase {
+	/**
+	 * @var int
+	 */
+	protected $menu_id;
+	/**
+	 * @var int
+	 */
+	protected $tag_id;
+	/**
+	 * @var int
+	 */
+	protected $menu_item_id;
+
+	/**
+	 * @var int
+	 */
+	protected static $admin_id;
+
+	/**
+	 * @var int
+	 */
+	protected static $subscriber_id;
+
+	/**
+	 *
+	 */
+	const POST_TYPE = 'nav_menu_item';
+
+	/**
+	 * Create fake data before our tests run.
+	 *
+	 * @param WP_UnitTest_Factory $factory Helper that lets us create fake data.
+	 */
+	public static function wpSetUpBeforeClass( $factory ) {
+		self::$admin_id      = $factory->user->create(
+			array(
+				'role' => 'administrator',
+			)
+		);
+		self::$subscriber_id = $factory->user->create(
+			array(
+				'role' => 'subscriber',
+			)
+		);
+	}
+
+	/**
+	 *
+	 */
+	public static function wpTearDownAfterClass() {
+		self::delete_user( self::$admin_id );
+		self::delete_user( self::$subscriber_id );
+	}
+
+	/**
+	 *
+	 */
+	public function set_up() {
+		parent::set_up();
+
+		$this->tag_id = self::factory()->tag->create();
+
+		$this->menu_id = wp_create_nav_menu( rand_str() );
+
+		$this->menu_item_id = wp_update_nav_menu_item(
+			$this->menu_id,
+			0,
+			array(
+				'menu-item-type'      => 'taxonomy',
+				'menu-item-object'    => 'post_tag',
+				'menu-item-object-id' => $this->tag_id,
+				'menu-item-status'    => 'publish',
+			)
+		);
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::register_routes
+	 */
+	public function test_register_routes() {
+		$routes = rest_get_server()->get_routes();
+
+		$this->assertArrayHasKey( '/wp/v2/menu-items', $routes );
+		$this->assertCount( 2, $routes['/wp/v2/menu-items'] );
+		$this->assertArrayHasKey( '/wp/v2/menu-items/(?P<id>[\d]+)', $routes );
+		$this->assertCount( 3, $routes['/wp/v2/menu-items/(?P<id>[\d]+)'] );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_context_param
+	 */
+	public function test_context_param() {
+		// Collection.
+		$request  = new WP_REST_Request( 'OPTIONS', '/wp/v2/menu-items' );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
+		$this->assertSame( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
+		$this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
+		// Single.
+		$request  = new WP_REST_Request( 'OPTIONS', '/wp/v2/menu-items/' . $this->menu_item_id );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
+		$this->assertSame( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
+		$this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_collection_params
+	 */
+	public function test_registered_query_params() {
+		$request    = new WP_REST_Request( 'OPTIONS', '/wp/v2/menu-items' );
+		$response   = rest_get_server()->dispatch( $request );
+		$data       = $response->get_data();
+		$properties = $data['endpoints'][0]['args'];
+		$this->assertArrayHasKey( 'before', $properties );
+		$this->assertArrayHasKey( 'context', $properties );
+		$this->assertArrayHasKey( 'exclude', $properties );
+		$this->assertArrayHasKey( 'include', $properties );
+		$this->assertArrayHasKey( 'menu_order', $properties );
+		$this->assertArrayHasKey( 'menus', $properties );
+		$this->assertArrayHasKey( 'menus_exclude', $properties );
+		$this->assertArrayHasKey( 'offset', $properties );
+		$this->assertArrayHasKey( 'order', $properties );
+		$this->assertArrayHasKey( 'orderby', $properties );
+		$this->assertArrayHasKey( 'page', $properties );
+		$this->assertArrayHasKey( 'per_page', $properties );
+		$this->assertArrayHasKey( 'search', $properties );
+		$this->assertArrayHasKey( 'slug', $properties );
+		$this->assertArrayHasKey( 'status', $properties );
+	}
+
+	/**
+	 * @ticket 40878
+	 */
+	public function test_registered_get_item_params() {
+		$request  = new WP_REST_Request( 'OPTIONS', sprintf( '/wp/v2/menu-items/%d', $this->menu_item_id ) );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$keys     = array_keys( $data['endpoints'][0]['args'] );
+		sort( $keys );
+		$this->assertSame( array( 'context', 'id' ), $keys );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_items
+	 */
+	public function test_get_items() {
+		wp_set_current_user( self::$admin_id );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/menu-items' );
+		$response = rest_get_server()->dispatch( $request );
+
+		$this->check_get_menu_items_response( $response );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_item
+	 */
+	public function test_get_item() {
+		wp_set_current_user( self::$admin_id );
+		$request  = new WP_REST_Request( 'GET', sprintf( '/wp/v2/menu-items/%d', $this->menu_item_id ) );
+		$response = rest_get_server()->dispatch( $request );
+
+		$this->check_get_menu_item_response( $response, 'view' );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_item
+	 */
+	public function test_get_item_edit() {
+		wp_set_current_user( self::$admin_id );
+		$request = new WP_REST_Request( 'GET', sprintf( '/wp/v2/menu-items/%d', $this->menu_item_id ) );
+		$request->set_param( 'context', 'edit' );
+		$response = rest_get_server()->dispatch( $request );
+
+		$this->check_get_menu_item_response( $response, 'edit' );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_item
+	 * @covers ::prepare_links
+	 */
+	public function test_get_item_term_links() {
+		wp_set_current_user( self::$admin_id );
+
+		$menu_item_id = wp_update_nav_menu_item(
+			$this->menu_id,
+			0,
+			array(
+				'menu-item-type'      => 'taxonomy',
+				'menu-item-object'    => 'post_tag',
+				'menu-item-object-id' => $this->tag_id,
+				'menu-item-status'    => 'publish',
+				'menu-item-title'     => 'Food',
+			)
+		);
+		$request      = new WP_REST_Request( 'GET', sprintf( '/wp/v2/menu-items/%d', $menu_item_id ) );
+		$request->set_param( 'context', 'edit' );
+		$response = rest_get_server()->dispatch( $request );
+
+		$this->check_get_menu_item_response( $response, 'edit' );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_item
+	 * @covers ::prepare_links
+	 */
+	public function test_get_item_term_posts() {
+		wp_set_current_user( self::$admin_id );
+
+		$post_id = self::factory()->post->create();
+
+		$menu_item_id = wp_update_nav_menu_item(
+			$this->menu_id,
+			0,
+			array(
+				'menu-item-type'      => 'post_type',
+				'menu-item-object'    => 'post',
+				'menu-item-object-id' => $post_id,
+				'menu-item-status'    => 'publish',
+				'menu-item-title'     => 'Food',
+			)
+		);
+		$request      = new WP_REST_Request( 'GET', sprintf( '/wp/v2/menu-items/%d', $menu_item_id ) );
+		$request->set_param( 'context', 'edit' );
+		$response = rest_get_server()->dispatch( $request );
+
+		$this->check_get_menu_item_response( $response, 'edit' );
+	}
+
+	/**
+	 * Test that title.raw contains the verbatim title and that title.rendered
+	 * has been passed through the_title which escapes & characters.
+	 *
+	 * @see https://github.com/WordPress/gutenberg/pull/24673
+	 *
+	 * @ticket 40878
+	 * @covers ::get_item
+	 */
+	public function test_get_item_escapes_title() {
+		wp_set_current_user( self::$admin_id );
+
+		$menu_item_id = wp_update_nav_menu_item(
+			$this->menu_id,
+			0,
+			array(
+				'menu-item-type'      => 'taxonomy',
+				'menu-item-object'    => 'post_tag',
+				'menu-item-object-id' => $this->tag_id,
+				'menu-item-status'    => 'publish',
+				'menu-item-title'     => '<strong>Foo</strong> & bar',
+			)
+		);
+
+		$request = new WP_REST_Request(
+			'GET',
+			"/wp/v2/menu-items/$menu_item_id"
+		);
+		$request->set_query_params(
+			array(
+				'context' => 'edit',
+			)
+		);
+
+		$response = rest_get_server()->dispatch( $request );
+
+		$data  = $response->get_data();
+		$title = $data['title'];
+
+		if ( ! is_multisite() ) {
+			// Check that title.raw is the unescaped title and that
+			// title.rendered has been run through the_title.
+			$this->assertSame( '<strong>Foo</strong> &#038; bar', $title['rendered'] );
+			$this->assertSame( '<strong>Foo</strong> & bar', $title['raw'] );
+		} else {
+			// In a multisite, administrators do not have unfiltered_html and
+			// post_title is ran through wp_kses before being saved in the
+			// database. Running the title through the_title does nothing in
+			// this case.
+			$this->assertSame( '<strong>Foo</strong> &amp; bar', $title['rendered'] );
+			$this->assertSame( '<strong>Foo</strong> &amp; bar', $title['raw'] );
+		}
+
+		wp_delete_post( $menu_item_id );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::create_item
+	 */
+	public function test_create_item() {
+		wp_set_current_user( self::$admin_id );
+
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menu-items' );
+		$request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
+		$params = $this->set_menu_item_data();
+		$request->set_body_params( $params );
+		$response = rest_get_server()->dispatch( $request );
+
+		$this->check_create_menu_item_response( $response );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::create_item
+	 */
+	public function test_create_item_invalid_invalid() {
+		wp_set_current_user( self::$admin_id );
+
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menu-items' );
+		$request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
+		$params = $this->set_menu_item_data(
+			array(
+				'menus' => array( 123, 456 ),
+			)
+		);
+		$request->set_body_params( $params );
+		$response = rest_get_server()->dispatch( $request );
+
+		$this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::create_item
+	 */
+	public function test_create_item_invalid_term() {
+		wp_set_current_user( self::$admin_id );
+
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menu-items' );
+		$request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
+		$params = $this->set_menu_item_data(
+			array(
+				'type'  => 'taxonomy',
+				'title' => 'Tags',
+			)
+		);
+		$request->set_body_params( $params );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_term_invalid_id', $response, 400 );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::create_item
+	 */
+	public function test_create_item_change_position() {
+		wp_set_current_user( self::$admin_id );
+		$new_menu_id = wp_create_nav_menu( rand_str() );
+		$expected    = array();
+		$actual      = array();
+		for ( $i = 1; $i < 5; $i ++ ) {
+			$request = new WP_REST_Request( 'POST', '/wp/v2/menu-items' );
+			$request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
+			$params = $this->set_menu_item_data(
+				array(
+					'menu_order' => $i,
+					'menus'      => $new_menu_id,
+				)
+			);
+			$request->set_body_params( $params );
+			$response = rest_get_server()->dispatch( $request );
+			$this->check_create_menu_item_response( $response );
+			$data = $response->get_data();
+
+			$expected[] = $i;
+			$actual[]   = $data['menu_order'];
+		}
+		$this->assertSame( $expected, $actual );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::create_item
+	 */
+	public function test_menu_order_must_be_set() {
+		wp_set_current_user( self::$admin_id );
+		$new_menu_id = wp_create_nav_menu( rand_str() );
+
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menu-items' );
+		$request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
+		$params = $this->set_menu_item_data(
+			array(
+				'menu_order' => 0,
+				'menus'      => $new_menu_id,
+			)
+		);
+		$request->set_body_params( $params );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
+
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menu-items' );
+		$request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
+		$params = $this->set_menu_item_data(
+			array(
+				'menu_order' => 1,
+				'menus'      => $new_menu_id,
+			)
+		);
+		$request->set_body_params( $params );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertSame( 201, $response->get_status() );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::create_item
+	 */
+	public function test_create_item_invalid_position_2() {
+		wp_set_current_user( self::$admin_id );
+		$new_menu_id = wp_create_nav_menu( rand_str() );
+		$request     = new WP_REST_Request( 'POST', '/wp/v2/menu-items' );
+		$request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
+		$params = $this->set_menu_item_data(
+			array(
+				'menu_order' => 'ddddd',
+				'menus'      => $new_menu_id,
+			)
+		);
+		$request->set_body_params( $params );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::create_item
+	 */
+	public function test_create_item_invalid_position_3() {
+		wp_set_current_user( self::$admin_id );
+		$new_menu_id = wp_create_nav_menu( rand_str() );
+		$request     = new WP_REST_Request( 'POST', '/wp/v2/menu-items' );
+		$request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
+		$params = $this->set_menu_item_data(
+			array(
+				'menu_order' => -9,
+				'menus'      => $new_menu_id,
+			)
+		);
+		$request->set_body_params( $params );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::create_item
+	 */
+	public function test_create_item_invalid_parent() {
+		wp_set_current_user( self::$admin_id );
+		wp_create_nav_menu( rand_str() );
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menu-items' );
+		$request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
+		$params = $this->set_menu_item_data(
+			array(
+				'parent' => -9,
+			)
+		);
+		$request->set_body_params( $params );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::create_item
+	 */
+	public function test_create_item_invalid_menu() {
+		wp_set_current_user( self::$admin_id );
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menu-items' );
+		$request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
+		$params = $this->set_menu_item_data(
+			array(
+				'menus' => -9,
+			)
+		);
+		$request->set_body_params( $params );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'invalid_menu_id', $response, 400 );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::create_item
+	 */
+	public function test_create_item_invalid_post() {
+		wp_set_current_user( self::$admin_id );
+
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menu-items' );
+		$request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
+		$params = $this->set_menu_item_data(
+			array(
+				'type'  => 'post_type',
+				'title' => 'Post',
+			)
+		);
+		$request->set_body_params( $params );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_post_invalid_id', $response, 400 );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::create_item
+	 */
+	public function test_create_item_invalid_post_type() {
+		wp_set_current_user( self::$admin_id );
+
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menu-items' );
+		$request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
+		$params = $this->set_menu_item_data(
+			array(
+				'type'             => 'post_type_archive',
+				'menu-item-object' => 'invalid_post_type',
+			)
+		);
+		$request->set_body_params( $params );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_post_invalid_type', $response, 400 );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::create_item
+	 */
+	public function test_create_item_invalid_custom_link() {
+		wp_set_current_user( self::$admin_id );
+
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menu-items' );
+		$request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
+		$params = $this->set_menu_item_data(
+			array(
+				'type'  => 'custom',
+				'title' => '',
+			)
+		);
+		$request->set_body_params( $params );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_title_required', $response, 400 );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::create_item
+	 */
+	public function test_create_item_missing_custom_link_url() {
+		wp_set_current_user( self::$admin_id );
+
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menu-items' );
+		$request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
+		$params = $this->set_menu_item_data(
+			array(
+				'type' => 'custom',
+				'url'  => '',
+			)
+		);
+		$request->set_body_params( $params );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_url_required', $response, 400 );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::create_item
+	 */
+	public function test_create_item_invalid_custom_link_url() {
+		wp_set_current_user( self::$admin_id );
+
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menu-items' );
+		$request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
+		$params = $this->set_menu_item_data(
+			array(
+				'type' => 'custom',
+				'url'  => '"^<>{}`',
+			)
+		);
+		$request->set_body_params( $params );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
+		$this->assertArrayHasKey( 'url', $response->get_data()['data']['details'] );
+		$this->assertSame( 'rest_invalid_url', $response->get_data()['data']['details']['url']['code'] );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::update_item
+	 */
+	public function test_update_item() {
+		wp_set_current_user( self::$admin_id );
+
+		$request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/menu-items/%d', $this->menu_item_id ) );
+		$request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
+		$params = $this->set_menu_item_data(
+			array(
+				'xfn' => array( 'test1', 'test2', 'test3' ),
+			)
+		);
+		$request->set_body_params( $params );
+		$response = rest_get_server()->dispatch( $request );
+		$this->check_update_menu_item_response( $response );
+		$new_data = $response->get_data();
+		$this->assertSame( $this->menu_item_id, $new_data['id'] );
+		$this->assertSame( $params['title'], $new_data['title']['raw'] );
+		$this->assertSame( $params['description'], $new_data['description'] );
+		$this->assertSame( $params['type_label'], $new_data['type_label'] );
+		$this->assertSame( $params['xfn'], $new_data['xfn'] );
+		$post      = get_post( $this->menu_item_id );
+		$menu_item = wp_setup_nav_menu_item( $post );
+		$this->assertSame( $params['title'], $menu_item->title );
+		$this->assertSame( $params['description'], $menu_item->description );
+		$this->assertSame( $params['xfn'], explode( ' ', $menu_item->xfn ) );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::update_item
+	 */
+	public function test_update_item_clean_xfn() {
+		wp_set_current_user( self::$admin_id );
+
+		$bad_data  = array( 'test1":|":', 'test2+|+', 'test3±', 'test4😀' );
+		$good_data = array( 'test1', 'test2', 'test3', 'test4' );
+
+		$request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/menu-items/%d', $this->menu_item_id ) );
+		$request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
+		$params = $this->set_menu_item_data(
+			array(
+				'xfn' => $bad_data,
+			)
+		);
+		$request->set_body_params( $params );
+		$response = rest_get_server()->dispatch( $request );
+		$this->check_update_menu_item_response( $response );
+		$new_data = $response->get_data();
+		$this->assertSame( $this->menu_item_id, $new_data['id'] );
+		$this->assertSame( $params['title'], $new_data['title']['raw'] );
+		$this->assertSame( $params['description'], $new_data['description'] );
+		$this->assertSame( $params['type_label'], $new_data['type_label'] );
+		$this->assertSame( $good_data, $new_data['xfn'] );
+		$post      = get_post( $this->menu_item_id );
+		$menu_item = wp_setup_nav_menu_item( $post );
+		$this->assertSame( $params['title'], $menu_item->title );
+		$this->assertSame( $params['description'], $menu_item->description );
+		$this->assertSame( $good_data, explode( ' ', $menu_item->xfn ) );
+	}
+
+
+	/**
+	 * @ticket 40878
+	 * @covers ::update_item
+	 */
+	public function test_update_item_invalid() {
+		wp_set_current_user( self::$admin_id );
+		$post_id = self::factory()->post->create();
+
+		$request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/menu-items/%d', $post_id ) );
+		$request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
+		$params = $this->set_menu_item_data();
+		$request->set_body_params( $params );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_post_invalid_id', $response, 404 );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::delete_item
+	 */
+	public function test_delete_item() {
+		wp_set_current_user( self::$admin_id );
+		$request = new WP_REST_Request( 'DELETE', sprintf( '/wp/v2/menu-items/%d', $this->menu_item_id ) );
+		$request->set_param( 'force', true );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertSame( 200, $response->get_status() );
+		$this->assertNull( get_post( $this->menu_item_id ) );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::delete_item
+	 */
+	public function test_delete_item_no_force() {
+		wp_set_current_user( self::$admin_id );
+		$request = new WP_REST_Request( 'DELETE', sprintf( '/wp/v2/menu-items/%d', $this->menu_item_id ) );
+		$request->set_param( 'force', false );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertSame( 501, $response->get_status() );
+		$this->assertNotNull( get_post( $this->menu_item_id ) );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::delete_item
+	 */
+	public function test_delete_item_invalid() {
+		wp_set_current_user( self::$admin_id );
+		$request = new WP_REST_Request( 'DELETE', '/wp/v2/menu-items/9999' );
+		$request->set_param( 'force', true );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_post_invalid_id', $response, 404 );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::prepare_item_for_response
+	 */
+	public function test_prepare_item() {
+		wp_set_current_user( self::$admin_id );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/menu-items/' . $this->menu_item_id );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertSame( 200, $response->get_status() );
+		$this->check_get_menu_item_response( $response );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_item_schema
+	 */
+	public function test_get_item_schema() {
+		$request    = new WP_REST_Request( 'OPTIONS', '/wp/v2/menu-items' );
+		$response   = rest_get_server()->dispatch( $request );
+		$data       = $response->get_data();
+		$properties = $data['schema']['properties'];
+		$this->assertSame( 18, count( $properties ) );
+		$this->assertArrayHasKey( 'type_label', $properties );
+		$this->assertArrayHasKey( 'attr_title', $properties );
+		$this->assertArrayHasKey( 'classes', $properties );
+		$this->assertArrayHasKey( 'description', $properties );
+		$this->assertArrayHasKey( 'id', $properties );
+		$this->assertArrayHasKey( 'url', $properties );
+		$this->assertArrayHasKey( 'meta', $properties );
+		$this->assertArrayHasKey( 'menu_order', $properties );
+		$this->assertArrayHasKey( 'object', $properties );
+		$this->assertArrayHasKey( 'object_id', $properties );
+		$this->assertArrayHasKey( 'target', $properties );
+		$this->assertArrayHasKey( 'parent', $properties );
+		$this->assertArrayHasKey( 'status', $properties );
+		$this->assertArrayHasKey( 'title', $properties );
+		$this->assertArrayHasKey( 'type', $properties );
+		$this->assertArrayHasKey( 'xfn', $properties );
+		$this->assertArrayHasKey( 'invalid', $properties );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_items_permissions_check
+	 */
+	public function test_get_items_no_permission() {
+		wp_set_current_user( 0 );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/menu-items' );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_cannot_view', $response, 401 );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_item_permissions_check
+	 */
+	public function test_get_item_no_permission() {
+		wp_set_current_user( 0 );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/menu-items/' . $this->menu_item_id );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_cannot_view', $response, 401 );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_items_permissions_check
+	 */
+	public function test_get_items_wrong_permission() {
+		wp_set_current_user( self::$subscriber_id );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/menu-items' );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_cannot_view', $response, 403 );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_item_permissions_check
+	 */
+	public function test_get_item_wrong_permission() {
+		wp_set_current_user( self::$subscriber_id );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/menu-items/' . $this->menu_item_id );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_cannot_view', $response, 403 );
+	}
+
+	/**
+	 * @param WP_REST_Response $response Response Class.
+	 * @param string           $context Defaults to View.
+	 */
+	protected function check_get_menu_items_response( $response, $context = 'view' ) {
+		$this->assertNotWPError( $response );
+		$response = rest_ensure_response( $response );
+		$this->assertSame( 200, $response->get_status() );
+
+		$headers = $response->get_headers();
+		$this->assertArrayHasKey( 'X-WP-Total', $headers );
+		$this->assertArrayHasKey( 'X-WP-TotalPages', $headers );
+
+		$all_data = $response->get_data();
+		foreach ( $all_data as $data ) {
+			$post = get_post( $data['id'] );
+			// Base fields for every post.
+			$menu_item = wp_setup_nav_menu_item( $post );
+			/**
+			 * As the links for the post are "response_links" format in the data array we have to pull them out and parse them.
+			 */
+			$links = $data['_links'];
+			foreach ( $links as &$links_array ) {
+				foreach ( $links_array as &$link ) {
+					$attributes         = array_diff_key(
+						$link,
+						array(
+							'href' => 1,
+							'name' => 1,
+						)
+					);
+					$link               = array_diff_key( $link, $attributes );
+					$link['attributes'] = $attributes;
+				}
+			}
+
+			$this->check_menu_item_data( $menu_item, $data, $context, $links );
+		}
+	}
+
+	/**
+	 * @param WP_Post $post WP_Post object.
+	 * @param array   $data Data compare.
+	 * @param string  $context Context of REST Request.
+	 * @param array   $links Array links.
+	 */
+	protected function check_menu_item_data( $post, $data, $context, $links ) {
+		$post_type_obj = get_post_type_object( self::POST_TYPE );
+
+		// Standard fields.
+		$this->assertSame( $post->ID, $data['id'] );
+		$this->assertSame( wpautop( $post->post_content ), $data['description'] );
+
+		// Check filtered values.
+		if ( post_type_supports( self::POST_TYPE, 'title' ) ) {
+			add_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );
+			$this->assertSame( $post->title, $data['title']['rendered'] );
+			remove_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );
+			if ( 'edit' === $context ) {
+				$this->assertSame( $post->title, $data['title']['raw'] );
+			} else {
+				$this->assertFalse( isset( $data['title']['raw'] ) );
+			}
+		} else {
+			$this->assertFalse( isset( $data['title'] ) );
+		}
+
+		// post_parent.
+		$this->assertArrayHasKey( 'parent', $data );
+		if ( $post->post_parent ) {
+			if ( is_int( $data['parent'] ) ) {
+				$this->assertSame( $post->post_parent, $data['parent'] );
+			} else {
+				$this->assertSame( $post->post_parent, $data['parent']['id'] );
+				$menu_item = wp_setup_nav_menu_item( get_post( $data['parent']['id'] ) );
+				$this->check_get_menu_item_response( $data['parent'], $menu_item, 'view-parent' );
+			}
+		} else {
+			$this->assertEmpty( $data['parent'] );
+		}
+
+		$this->assertFalse( $data['invalid'] );
+
+		// page attributes.
+		$this->assertSame( $post->menu_order, $data['menu_order'] );
+
+		$taxonomies = wp_list_filter( get_object_taxonomies( self::POST_TYPE, 'objects' ), array( 'show_in_rest' => true ) );
+		foreach ( $taxonomies as $taxonomy ) {
+			$this->assertTrue( isset( $data[ $taxonomy->rest_base ] ) );
+			$terms = wp_get_object_terms( $post->ID, $taxonomy->name, array( 'fields' => 'ids' ) );
+			sort( $terms );
+			if ( 'nav_menu' === $taxonomy->name ) {
+				$term_id = $terms ? array_shift( $terms ) : 0;
+				$this->assertSame( $term_id, $data[ $taxonomy->rest_base ] );
+			} else {
+				sort( $data[ $taxonomy->rest_base ] );
+				$this->assertSame( $terms, $data[ $taxonomy->rest_base ] );
+			}
+		}
+
+		// test links.
+		if ( $links ) {
+			$links = test_rest_expand_compact_links( $links );
+			$this->assertSame( $links['self'][0]['href'], rest_url( 'wp/v2/' . $post_type_obj->rest_base . '/' . $data['id'] ) );
+			$this->assertSame( $links['collection'][0]['href'], rest_url( 'wp/v2/' . $post_type_obj->rest_base ) );
+			$this->assertSame( $links['about'][0]['href'], rest_url( 'wp/v2/types/' . self::POST_TYPE ) );
+
+			$num = 0;
+			foreach ( $taxonomies as $taxonomy ) {
+				$this->assertSame( $taxonomy->name, $links['https://api.w.org/term'][ $num ]['attributes']['taxonomy'] );
+				$this->assertSame( add_query_arg( 'post', $data['id'], rest_url( 'wp/v2/' . $taxonomy->rest_base ) ), $links['https://api.w.org/term'][ $num ]['href'] );
+				$num ++;
+			}
+
+			if ( 'post_type' === $data['type'] ) {
+				$this->assertArrayHasKey( 'https://api.w.org/menu-item-object', $links );
+				$this->assertArrayHasKey( $data['type'], $links['https://api.w.org/menu-item-object'][0]['attributes'] );
+				$this->assertSame( $links['https://api.w.org/menu-item-object'][0]['href'], rest_url( rest_get_route_for_post( $data['object_id'] ) ) );
+			}
+
+			if ( 'taxonomy' === $data['type'] ) {
+				$this->assertArrayHasKey( 'https://api.w.org/menu-item-object', $links );
+				$this->assertArrayHasKey( $data['type'], $links['https://api.w.org/menu-item-object'][0]['attributes'] );
+				$this->assertSame( $links['https://api.w.org/menu-item-object'][0]['href'], rest_url( rest_get_route_for_term( $data['object_id'] ) ) );
+			}
+		}
+	}
+
+	/**
+	 * @param WP_REST_Response $response Response Class.
+	 * @param string           $context Defaults to View.
+	 */
+	protected function check_get_menu_item_response( $response, $context = 'view' ) {
+		$this->assertNotWPError( $response );
+		$response = rest_ensure_response( $response );
+		$this->assertSame( 200, $response->get_status() );
+
+		$data      = $response->get_data();
+		$post      = get_post( $data['id'] );
+		$menu_item = wp_setup_nav_menu_item( $post );
+		$this->check_menu_item_data( $menu_item, $data, $context, $response->get_links() );
+	}
+
+	/**
+	 * @param WP_REST_Response $response Response Class.
+	 */
+	protected function check_create_menu_item_response( $response ) {
+		$this->assertNotWPError( $response );
+		$response = rest_ensure_response( $response );
+
+		$this->assertSame( 201, $response->get_status() );
+		$headers = $response->get_headers();
+		$this->assertArrayHasKey( 'Location', $headers );
+
+		$data      = $response->get_data();
+		$post      = get_post( $data['id'] );
+		$menu_item = wp_setup_nav_menu_item( $post );
+		$this->check_menu_item_data( $menu_item, $data, 'edit', $response->get_links() );
+	}
+
+	/**
+	 * @param WP_REST_Response $response Response Class.
+	 */
+	protected function check_update_menu_item_response( $response ) {
+		$this->assertNotWPError( $response );
+		$response = rest_ensure_response( $response );
+
+		$this->assertSame( 200, $response->get_status() );
+		$headers = $response->get_headers();
+		$this->assertArrayNotHasKey( 'Location', $headers );
+
+		$data      = $response->get_data();
+		$post      = get_post( $data['id'] );
+		$menu_item = wp_setup_nav_menu_item( $post );
+		$this->check_menu_item_data( $menu_item, $data, 'edit', $response->get_links() );
+	}
+
+	/**
+	 * @param array $args Override params.
+	 *
+	 * @return mixed
+	 */
+	protected function set_menu_item_data( $args = array() ) {
+		$defaults = array(
+			'object_id'   => 0,
+			'parent'      => 0,
+			'menu_order'  => 1,
+			'menus'       => $this->menu_id,
+			'type'        => 'custom',
+			'title'       => 'Custom Link Title',
+			'url'         => '#',
+			'description' => '',
+			'attr-title'  => '',
+			'target'      => '',
+			'type_label'  => 'Custom Link',
+			'classes'     => '',
+			'xfn'         => '',
+			'status'      => 'draft',
+		);
+
+		return wp_parse_args( $args, $defaults );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::create_item
+	 */
+	public function test_create_item_properly_handles_slashed_data() {
+		wp_set_current_user( self::$admin_id );
+
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menu-items' );
+		$request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
+		$parameters = $this->set_menu_item_data(
+			array(
+				'title' => 'Some \\\'title',
+			)
+		);
+		$request->set_body_params( $parameters );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertNotWPError( $response->as_error() );
+		$data = $response->get_data();
+		$post = get_post( $data['id'] );
+		$this->assertSame( $parameters['title'], $post->post_title );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::update_item
+	 */
+	public function test_update_item_properly_handles_slashed_data() {
+		wp_set_current_user( self::$admin_id );
+
+		$request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/menu-items/%d', $this->menu_item_id ) );
+		$request->add_header( 'content-type', 'application/x-www-form-urlencoded' );
+		$title  = 'Some \\\'title';
+		$params = $this->set_menu_item_data(
+			array(
+				'title' => $title,
+			)
+		);
+		$request->set_body_params( $params );
+		$response = rest_get_server()->dispatch( $request );
+		$new_data = $response->get_data();
+		$this->assertSame( $params['title'], $new_data['title']['raw'] );
+	}
+}
diff --git a/tests/phpunit/tests/rest-api/wpRestMenuLocationsController.php b/tests/phpunit/tests/rest-api/wpRestMenuLocationsController.php
new file mode 100644
index 0000000000..9f100719ff
--- /dev/null
+++ b/tests/phpunit/tests/rest-api/wpRestMenuLocationsController.php
@@ -0,0 +1,207 @@
+<?php
+/**
+ * WP_REST_Menu_Locations_Controller tests.
+ *
+ * @package WordPress
+ * @subpackage REST_API
+ * @since 5.9.0
+ */
+
+/**
+ * Tests for REST API for Menu locations.
+ *
+ * @group restapi
+ *
+ * @coversDefaultClass WP_REST_Menu_Locations_Controller
+ */
+class Tests_REST_WpRestMenuLocationsController extends WP_Test_REST_Controller_Testcase {
+
+	/**
+	 * @var int
+	 */
+	protected static $admin_id;
+
+	/**
+	 * Create fake data before our tests run.
+	 *
+	 * @param WP_UnitTest_Factory $factory Helper that lets us create fake data.
+	 */
+	public static function wpSetUpBeforeClass( $factory ) {
+		self::$admin_id = $factory->user->create(
+			array(
+				'role' => 'administrator',
+			)
+		);
+	}
+
+	/**
+	 * Set up.
+	 */
+	public function set_up() {
+		parent::set_up();
+
+		// Unregister all nav menu locations.
+		foreach ( array_keys( get_registered_nav_menus() ) as $location ) {
+			unregister_nav_menu( $location );
+		}
+	}
+
+	/**
+	 * Register nav menu locations.
+	 *
+	 * @param array $locations Location slugs.
+	 */
+	public function register_nav_menu_locations( $locations ) {
+		foreach ( $locations as $location ) {
+			register_nav_menu( $location, ucfirst( $location ) );
+		}
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::register_routes
+	 */
+	public function test_register_routes() {
+		$routes = rest_get_server()->get_routes();
+		$this->assertArrayHasKey( '/wp/v2/menu-locations', $routes );
+		$this->assertCount( 1, $routes['/wp/v2/menu-locations'] );
+		$this->assertArrayHasKey( '/wp/v2/menu-locations/(?P<location>[\w-]+)', $routes );
+		$this->assertCount( 1, $routes['/wp/v2/menu-locations/(?P<location>[\w-]+)'] );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_context_param
+	 */
+	public function test_context_param() {
+		// Collection.
+		$request  = new WP_REST_Request( 'OPTIONS', '/wp/v2/menu-locations' );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
+		$this->assertSame( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
+		$menu = 'primary';
+		$this->register_nav_menu_locations( array( $menu ) );
+		$request  = new WP_REST_Request( 'OPTIONS', '/wp/v2/menu-locations/' . $menu );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
+		$this->assertSame( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_items
+	 */
+	public function test_get_items() {
+		$menus = array( 'primary', 'secondary' );
+		$this->register_nav_menu_locations( array( 'primary', 'secondary' ) );
+		wp_set_current_user( self::$admin_id );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/menu-locations' );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$data     = array_values( $data );
+		$this->assertCount( 2, $data );
+		$names        = wp_list_pluck( $data, 'name' );
+		$descriptions = wp_list_pluck( $data, 'description' );
+		$this->assertSame( $menus, $names );
+		$menu_descriptions = array_map( 'ucfirst', $names );
+		$this->assertSame( $menu_descriptions, $descriptions );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_item
+	 */
+	public function test_get_item() {
+		$menu = 'primary';
+		$this->register_nav_menu_locations( array( $menu ) );
+
+		wp_set_current_user( self::$admin_id );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/menu-locations/' . $menu );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$this->assertSame( $menu, $data['name'] );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_item
+	 */
+	public function test_get_item_invalid() {
+		$menu = 'primary';
+		$this->register_nav_menu_locations( array( $menu ) );
+
+		wp_set_current_user( self::$admin_id );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/menu-locations/invalid' );
+		$response = rest_get_server()->dispatch( $request );
+
+		$this->assertErrorResponse( 'rest_menu_location_invalid', $response, 404 );
+	}
+
+	/**
+	 * The test_create_item() method does not exist for menu locations.
+	 */
+	public function test_create_item() {}
+
+	/**
+	 * The test_update_item() method does not exist for menu locations.
+	 */
+	public function test_update_item() {}
+
+	/**
+	 * The test_delete_item() method does not exist for menu locations.
+	 */
+	public function test_delete_item() {}
+
+	/**
+	 * The test_prepare_item() method does not exist for menu locations.
+	 */
+	public function test_prepare_item() {}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_item_schema
+	 */
+	public function test_get_item_schema() {
+		wp_set_current_user( self::$admin_id );
+		$request    = new WP_REST_Request( 'OPTIONS', '/wp/v2/menu-locations' );
+		$response   = rest_get_server()->dispatch( $request );
+		$data       = $response->get_data();
+		$properties = $data['schema']['properties'];
+		$this->assertSame( 3, count( $properties ) );
+		$this->assertArrayHasKey( 'name', $properties );
+		$this->assertArrayHasKey( 'description', $properties );
+		$this->assertArrayHasKey( 'menu', $properties );
+	}
+
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_items
+	 * @covers ::get_items_permissions_check
+	 */
+	public function test_get_items_menu_location_context_without_permission() {
+		wp_set_current_user( 0 );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/menu-locations' );
+		$response = rest_get_server()->dispatch( $request );
+
+		$this->assertErrorResponse( 'rest_cannot_view', $response, rest_authorization_required_code() );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_item
+	 * @covers ::get_item_permissions_check
+	 */
+	public function test_get_item_menu_location_context_without_permission() {
+		$menu = 'primary';
+		$this->register_nav_menu_locations( array( $menu ) );
+
+		wp_set_current_user( 0 );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/menu-locations/' . $menu );
+		$response = rest_get_server()->dispatch( $request );
+
+		$this->assertErrorResponse( 'rest_cannot_view', $response, rest_authorization_required_code() );
+	}
+}
diff --git a/tests/phpunit/tests/rest-api/wpRestMenusController.php b/tests/phpunit/tests/rest-api/wpRestMenusController.php
new file mode 100644
index 0000000000..4b2384c1a7
--- /dev/null
+++ b/tests/phpunit/tests/rest-api/wpRestMenusController.php
@@ -0,0 +1,642 @@
+<?php
+/**
+ * WP_REST_Menus_Controller tests
+ *
+ * @package WordPress
+ * @subpackage REST_API
+ * @since 5.9.0
+ */
+
+/**
+ * Tests for REST API for Menus.
+ *
+ * @group restapi
+ *
+ * @coversDefaultClass WP_REST_Menus_Controller
+ */
+class Tests_REST_WpRestMenusController extends WP_Test_REST_Controller_Testcase {
+	/**
+	 * @var int
+	 */
+	public $menu_id;
+
+	/**
+	 * @var int
+	 */
+	protected static $admin_id;
+
+	/**
+	 * @var int
+	 */
+	protected static $editor_id;
+
+	/**
+	 * @var int
+	 */
+	protected static $subscriber_id;
+
+	/**
+	 *
+	 */
+	const TAXONOMY = 'nav_menu';
+
+	/**
+	 * @var int
+	 */
+	protected static $per_page = 50;
+
+	/**
+	 * Create fake data before our tests run.
+	 *
+	 * @param WP_UnitTest_Factory $factory Helper that lets us create fake data.
+	 */
+	public static function wpSetUpBeforeClass( $factory ) {
+		self::$admin_id      = $factory->user->create(
+			array(
+				'role' => 'administrator',
+			)
+		);
+		self::$editor_id     = $factory->user->create(
+			array(
+				'role' => 'editor',
+			)
+		);
+		self::$subscriber_id = $factory->user->create(
+			array(
+				'role' => 'subscriber',
+			)
+		);
+	}
+
+	/**
+	 *
+	 */
+	public function set_up() {
+		parent::set_up();
+		// Unregister all nav menu locations.
+		foreach ( array_keys( get_registered_nav_menus() ) as $location ) {
+			unregister_nav_menu( $location );
+		}
+
+		$orig_args = array(
+			'name'        => 'Original Name',
+			'description' => 'Original Description',
+			'slug'        => 'original-slug',
+			'taxonomy'    => 'nav_menu',
+		);
+
+		$this->menu_id = $this->factory->term->create( $orig_args );
+
+		register_meta(
+			'term',
+			'test_single_menu',
+			array(
+				'object_subtype' => self::TAXONOMY,
+				'show_in_rest'   => true,
+				'single'         => true,
+				'type'           => 'string',
+			)
+		);
+	}
+
+	/**
+	 * Register nav menu locations.
+	 *
+	 * @param array $locations Location slugs.
+	 */
+	public function register_nav_menu_locations( $locations ) {
+		foreach ( $locations as $location ) {
+			register_nav_menu( $location, ucfirst( $location ) );
+		}
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::register_routes
+	 */
+	public function test_register_routes() {
+		$routes = rest_get_server()->get_routes();
+		$this->assertArrayHasKey( '/wp/v2/menus', $routes );
+		$this->assertArrayHasKey( '/wp/v2/menus/(?P<id>[\d]+)', $routes );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_context_param
+	 */
+	public function test_context_param() {
+		// Collection.
+		$request  = new WP_REST_Request( 'OPTIONS', '/wp/v2/menus' );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
+		$this->assertSameSets( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
+		$this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
+		// Single.
+		$tag1     = $this->factory->tag->create( array( 'name' => 'Season 5' ) );
+		$request  = new WP_REST_Request( 'OPTIONS', '/wp/v2/menus/' . $tag1 );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
+		$this->assertSameSets( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
+		$this->assertSame( array( 'v1' => true ), $data['endpoints'][0]['allow_batch'] );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_collection_params
+	 */
+	public function test_registered_query_params() {
+		$request  = new WP_REST_Request( 'OPTIONS', '/wp/v2/menus' );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$keys     = array_keys( $data['endpoints'][0]['args'] );
+		sort( $keys );
+		$this->assertSame(
+			array(
+				'context',
+				'exclude',
+				'hide_empty',
+				'include',
+				'offset',
+				'order',
+				'orderby',
+				'page',
+				'per_page',
+				'post',
+				'search',
+				'slug',
+			),
+			$keys
+		);
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_items
+	 */
+	public function test_get_items() {
+		wp_set_current_user( self::$admin_id );
+		wp_update_nav_menu_object(
+			0,
+			array(
+				'description' => 'Test get',
+				'menu-name'   => 'test Name get',
+			)
+		);
+		$request = new WP_REST_Request( 'GET', '/wp/v2/menus' );
+		$request->set_param( 'per_page', self::$per_page );
+		$response = rest_get_server()->dispatch( $request );
+		$this->check_get_taxonomy_terms_response( $response );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_item
+	 */
+	public function test_get_item() {
+		wp_set_current_user( self::$admin_id );
+		$nav_menu_id = wp_update_nav_menu_object(
+			0,
+			array(
+				'description' => 'Test menu',
+				'menu-name'   => 'test Name',
+			)
+		);
+
+		$this->register_nav_menu_locations( array( 'primary' ) );
+		set_theme_mod( 'nav_menu_locations', array( 'primary' => $nav_menu_id ) );
+
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/menus/' . $nav_menu_id );
+		$response = rest_get_server()->dispatch( $request );
+		$this->check_get_taxonomy_term_response( $response, $nav_menu_id );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::create_item
+	 */
+	public function test_create_item() {
+		wp_set_current_user( self::$admin_id );
+
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menus' );
+		$request->set_param( 'name', 'My Awesome menus' );
+		$request->set_param( 'description', 'This menu is so awesome.' );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertSame( 201, $response->get_status() );
+		$headers = $response->get_headers();
+		$data    = $response->get_data();
+		$this->assertStringContainsString( '/wp/v2/menus/' . $data['id'], $headers['Location'] );
+		$this->assertSame( 'My Awesome menus', $data['name'] );
+		$this->assertSame( 'This menu is so awesome.', $data['description'] );
+		$this->assertSame( 'my-awesome-menus', $data['slug'] );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::create_item
+	 */
+	public function test_create_item_same_name() {
+		wp_set_current_user( self::$admin_id );
+
+		wp_update_nav_menu_object(
+			0,
+			array(
+				'description' => 'This menu is so Original',
+				'menu-name'   => 'Original',
+			)
+		);
+
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menus' );
+		$request->set_param( 'name', 'Original' );
+		$request->set_param( 'description', 'This menu is so Original' );
+		$response = rest_get_server()->dispatch( $request );
+
+		$this->assertErrorResponse( 'menu_exists', $response, 400 );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::update_item
+	 * @covers ::handle_auto_add
+	 */
+	public function test_update_item() {
+		wp_set_current_user( self::$admin_id );
+
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menus/' . $this->menu_id );
+		$request->set_param( 'name', 'New Name' );
+		$request->set_param( 'description', 'New Description' );
+		$request->set_param( 'auto_add', true );
+		$request->set_param(
+			'meta',
+			array(
+				'test_single_menu' => 'just meta',
+			)
+		);
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertSame( 200, $response->get_status() );
+		$data = $response->get_data();
+		$this->assertSame( 'New Name', $data['name'] );
+		$this->assertSame( 'New Description', $data['description'] );
+		$this->assertSame( true, $data['auto_add'] );
+		$this->assertSame( 'new-name', $data['slug'] );
+		$this->assertSame( 'just meta', $data['meta']['test_single_menu'] );
+		$this->assertFalse( isset( $data['meta']['test_cat_meta'] ) );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::delete_item
+	 */
+	public function test_delete_item() {
+		wp_set_current_user( self::$admin_id );
+
+		$nav_menu_id = wp_update_nav_menu_object(
+			0,
+			array(
+				'description' => 'Deleted Menu',
+				'menu-name'   => 'Deleted Menu',
+			)
+		);
+
+		$term = get_term_by( 'id', $nav_menu_id, self::TAXONOMY );
+
+		$request = new WP_REST_Request( 'DELETE', '/wp/v2/menus/' . $term->term_id );
+		$request->set_param( 'force', true );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertSame( 200, $response->get_status() );
+		$data = $response->get_data();
+		$this->assertTrue( $data['deleted'] );
+		$this->assertSame( 'Deleted Menu', $data['previous']['name'] );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::prepare_item_for_response
+	 * @covers ::get_item
+	 */
+	public function test_prepare_item() {
+		$nav_menu_id = wp_update_nav_menu_object(
+			0,
+			array(
+				'description' => 'Foo Menu',
+				'menu-name'   => 'Foo Menu',
+			)
+		);
+
+		$term = get_term_by( 'id', $nav_menu_id, self::TAXONOMY );
+		wp_set_current_user( self::$admin_id );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/menus/' . $term->term_id );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+
+		$this->check_taxonomy_term( $term, $data, $response->get_links() );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_item_schema
+	 */
+	public function test_get_item_schema() {
+		$request    = new WP_REST_Request( 'OPTIONS', '/wp/v2/menus' );
+		$response   = rest_get_server()->dispatch( $request );
+		$data       = $response->get_data();
+		$properties = $data['schema']['properties'];
+		$this->assertSame( 7, count( $properties ) );
+		$this->assertArrayHasKey( 'id', $properties );
+		$this->assertArrayHasKey( 'description', $properties );
+		$this->assertArrayHasKey( 'meta', $properties );
+		$this->assertArrayHasKey( 'name', $properties );
+		$this->assertArrayHasKey( 'slug', $properties );
+		$this->assertArrayHasKey( 'locations', $properties );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::create_item
+	 */
+	public function test_create_item_with_location_permission_correct() {
+		$this->register_nav_menu_locations( array( 'primary', 'secondary' ) );
+		wp_set_current_user( self::$admin_id );
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menus' );
+		$request->set_param( 'name', 'My Awesome Term' );
+		$request->set_param( 'slug', 'so-awesome' );
+		$request->set_param( 'locations', 'primary' );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertSame( 201, $response->get_status() );
+		$data      = $response->get_data();
+		$term_id   = $data['id'];
+		$locations = get_nav_menu_locations();
+		$this->assertSame( $locations['primary'], $term_id );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::create_item
+	 */
+	public function test_create_item_with_invalid_location() {
+		wp_set_current_user( self::$admin_id );
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menus' );
+		$request->set_param( 'name', 'My Awesome Term' );
+		$request->set_param( 'slug', 'so-awesome' );
+		$request->set_param( 'locations', 'bar' );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertSame( 400, $response->get_status() );
+		$this->assertErrorResponse( 'rest_invalid_param', $response, 400 );
+		$this->assertArrayHasKey( 'locations', $response->get_data()['data']['details'] );
+		$this->assertSame( 'rest_invalid_menu_location', $response->get_data()['data']['details']['locations']['code'] );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::update_item
+	 */
+	public function test_update_item_with_no_location() {
+		$this->register_nav_menu_locations( array( 'primary', 'secondary' ) );
+		wp_set_current_user( self::$admin_id );
+
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menus/' . $this->menu_id );
+		$request->set_param( 'name', 'New Name' );
+		$request->set_param( 'description', 'New Description' );
+		$request->set_param( 'slug', 'new-slug' );
+		$request->set_param( 'locations', 'bar' );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertSame( 400, $response->get_status() );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::update_item
+	 */
+	public function test_update_item_with_location_permission_correct() {
+		$this->register_nav_menu_locations( array( 'primary', 'secondary' ) );
+		wp_set_current_user( self::$admin_id );
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menus/' . $this->menu_id );
+		$request->set_param( 'name', 'New Name' );
+		$request->set_param( 'description', 'New Description' );
+		$request->set_param( 'slug', 'new-slug' );
+		$request->set_param( 'locations', 'primary' );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertSame( 200, $response->get_status() );
+		$locations = get_nav_menu_locations();
+		$this->assertSame( $locations['primary'], $this->menu_id );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::update_item
+	 */
+	public function test_update_item_with_location_permission_incorrect() {
+		$this->register_nav_menu_locations( array( 'primary', 'secondary' ) );
+		wp_set_current_user( self::$subscriber_id );
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menus/' . $this->menu_id );
+		$request->set_param( 'name', 'New Name' );
+		$request->set_param( 'description', 'New Description' );
+		$request->set_param( 'slug', 'new-slug' );
+		$request->set_param( 'locations', 'primary' );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertSame( rest_authorization_required_code(), $response->get_status() );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::prepare_links
+	 */
+	public function test_get_item_links() {
+		wp_set_current_user( self::$admin_id );
+
+		$nav_menu_id = wp_update_nav_menu_object(
+			0,
+			array(
+				'description' => 'Foo Menu',
+				'menu-name'   => 'Foo Menu',
+			)
+		);
+
+		register_nav_menu( 'foo', 'Bar' );
+
+		set_theme_mod( 'nav_menu_locations', array( 'foo' => $nav_menu_id ) );
+
+		$request  = new WP_REST_Request( 'GET', sprintf( '/wp/v2/menus/%d', $nav_menu_id ) );
+		$response = rest_get_server()->dispatch( $request );
+
+		$links = $response->get_links();
+		$this->assertArrayHasKey( 'https://api.w.org/menu-location', $links );
+
+		$location_url = rest_url( '/wp/v2/menu-locations/foo' );
+		$this->assertSame( $location_url, $links['https://api.w.org/menu-location'][0]['href'] );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::update_item
+	 * @covers ::handle_locations
+	 */
+	public function test_change_menu_location() {
+		$this->register_nav_menu_locations( array( 'primary', 'secondary' ) );
+		$secondary_id = self::factory()->term->create(
+			array(
+				'name'        => 'Secondary Name',
+				'description' => 'Secondary Description',
+				'slug'        => 'secondary-slug',
+				'taxonomy'    => 'nav_menu',
+			)
+		);
+
+		$locations              = get_nav_menu_locations();
+		$locations['primary']   = $this->menu_id;
+		$locations['secondary'] = $secondary_id;
+		set_theme_mod( 'nav_menu_locations', $locations );
+
+		wp_set_current_user( self::$admin_id );
+
+		$request = new WP_REST_Request( 'POST', '/wp/v2/menus/' . $this->menu_id );
+		$request->set_body_params(
+			array(
+				'locations' => array( 'secondary' ),
+			)
+		);
+		$response = rest_get_server()->dispatch( $request );
+
+		$this->assertSame( 200, $response->get_status() );
+
+		$locations = get_nav_menu_locations();
+		$this->assertArrayNotHasKey( 'primary', $locations );
+		$this->assertArrayHasKey( 'secondary', $locations );
+		$this->assertSame( $this->menu_id, $locations['secondary'] );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_items
+	 * @covers ::get_items_permissions_check
+	 */
+	public function test_get_items_no_permission() {
+		wp_set_current_user( 0 );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/menus' );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_cannot_view', $response, 401 );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_items
+	 * @covers ::get_items_permissions_check
+	 */
+	public function test_get_item_no_permission() {
+		wp_set_current_user( 0 );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/menus/' . $this->menu_id );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_cannot_view', $response, 401 );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_items
+	 * @covers ::get_items_permissions_check
+	 */
+	public function test_get_items_wrong_permission() {
+		wp_set_current_user( self::$subscriber_id );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/menus' );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_cannot_view', $response, 403 );
+	}
+
+	/**
+	 * @ticket 40878
+	 * @covers ::get_item
+	 * @covers ::get_item_permissions_check
+	 */
+	public function test_get_item_wrong_permission() {
+		wp_set_current_user( self::$subscriber_id );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/menus/' . $this->menu_id );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_cannot_view', $response, 403 );
+	}
+
+	/**
+	 * @ticket 40878
+	 */
+	public function test_it_allows_batch_requests_when_updating_menus() {
+		$rest_server = rest_get_server();
+		// This call is needed to initialize route_options.
+		$rest_server->get_routes();
+		$route_options = $rest_server->get_route_options( '/wp/v2/menus/(?P<id>[\d]+)' );
+
+		$this->assertArrayHasKey( 'allow_batch', $route_options );
+		$this->assertSame( array( 'v1' => true ), $route_options['allow_batch'] );
+	}
+
+	/**
+	 * @param WP_REST_Response $response Response Class.
+	 */
+	protected function check_get_taxonomy_terms_response( $response ) {
+		$this->assertSame( 200, $response->get_status() );
+		$data = $response->get_data();
+		$args = array(
+			'hide_empty' => false,
+		);
+		$tags = get_terms( self::TAXONOMY, $args );
+		$this->assertSame( count( $tags ), count( $data ) );
+		$this->assertSame( $tags[0]->term_id, $data[0]['id'] );
+		$this->assertSame( $tags[0]->name, $data[0]['name'] );
+		$this->assertSame( $tags[0]->slug, $data[0]['slug'] );
+		$this->assertSame( $tags[0]->description, $data[0]['description'] );
+	}
+
+	/**
+	 * @param WP_REST_Response $response Response Class.
+	 * @param int              $id Term ID.
+	 */
+	protected function check_get_taxonomy_term_response( $response, $id ) {
+		$this->assertSame( 200, $response->get_status() );
+
+		$data = $response->get_data();
+		$menu = get_term( $id, self::TAXONOMY );
+		$this->check_taxonomy_term( $menu, $data, $response->get_links() );
+	}
+
+	/**
+	 * @param WP_Term $term WP_Term object.
+	 * @param array   $data Data from REST API.
+	 * @param array   $links Array of links.
+	 */
+	protected function check_taxonomy_term( $term, $data, $links ) {
+		$this->assertSame( $term->term_id, $data['id'] );
+		$this->assertSame( $term->name, $data['name'] );
+		$this->assertSame( $term->slug, $data['slug'] );
+		$this->assertSame( $term->description, $data['description'] );
+		$this->assertFalse( isset( $data['parent'] ) );
+
+		$locations = get_nav_menu_locations();
+		if ( ! empty( $locations ) ) {
+			$menu_locations = array();
+			foreach ( $locations as $location => $menu_id ) {
+				if ( $menu_id === $term->term_id ) {
+					$menu_locations[] = $location;
+				}
+			}
+
+			$this->assertSame( $menu_locations, $data['locations'] );
+		}
+
+		$relations = array(
+			'self',
+			'collection',
+			'about',
+			'https://api.w.org/post_type',
+		);
+
+		if ( ! empty( $data['parent'] ) ) {
+			$relations[] = 'up';
+		}
+
+		if ( ! empty( $data['locations'] ) ) {
+			$relations[] = 'https://api.w.org/menu-location';
+		}
+
+		$this->assertSameSets( $relations, array_keys( $links ) );
+		$this->assertStringContainsString( 'wp/v2/taxonomies/' . $term->taxonomy, $links['about'][0]['href'] );
+		$this->assertSame( add_query_arg( 'menus', $term->term_id, rest_url( 'wp/v2/menu-items' ) ), $links['https://api.w.org/post_type'][0]['href'] );
+	}
+}
diff --git a/tests/phpunit/tests/rest-api/wpRestTemplatesController.php b/tests/phpunit/tests/rest-api/wpRestTemplatesController.php
new file mode 100644
index 0000000000..5242436bd6
--- /dev/null
+++ b/tests/phpunit/tests/rest-api/wpRestTemplatesController.php
@@ -0,0 +1,668 @@
+<?php
+/**
+ * Unit tests covering the templates endpoint..
+ *
+ * @package WordPress
+ * @subpackage REST API
+ */
+
+/**
+ * Tests for REST API for templates.
+ *
+ * @covers WP_REST_Templates_Controller
+ *
+ * @group restapi
+ */
+class Tests_REST_WpRestTemplatesController extends WP_Test_REST_Controller_Testcase {
+	/**
+	 * @var int
+	 */
+	protected static $admin_id;
+	private static $post;
+
+	/**
+	 * Create fake data before our tests run.
+	 *
+	 * @param WP_UnitTest_Factory $factory Helper that lets us create fake data.
+	 */
+	public static function wpSetupBeforeClass( $factory ) {
+		self::$admin_id = $factory->user->create(
+			array(
+				'role' => 'administrator',
+			)
+		);
+
+		// Set up template post.
+		$args       = array(
+			'post_type'    => 'wp_template',
+			'post_name'    => 'my_template',
+			'post_title'   => 'My Template',
+			'post_content' => 'Content',
+			'post_excerpt' => 'Description of my template.',
+			'tax_input'    => array(
+				'wp_theme' => array(
+					get_stylesheet(),
+				),
+			),
+		);
+		self::$post = self::factory()->post->create_and_get( $args );
+		wp_set_post_terms( self::$post->ID, get_stylesheet(), 'wp_theme' );
+	}
+
+	public static function wpTearDownAfterClass() {
+		wp_delete_post( self::$post->ID );
+	}
+
+	/**
+	 * @covers WP_REST_Templates_Controller::register_routes
+	 * @ticket 54596
+	 */
+	public function test_register_routes() {
+		$routes = rest_get_server()->get_routes();
+		$this->assertArrayHasKey(
+			'/wp/v2/templates',
+			$routes,
+			'Templates route does not exist'
+		);
+		$this->assertArrayHasKey(
+			'/wp/v2/templates/(?P<id>([^\/:<>\*\?"\|]+(?:\/[^\/:<>\*\?"\|]+)?)[\/\w-]+)',
+			$routes,
+			'Single template based on the given ID route does not exist'
+		);
+	}
+
+	/**
+	 * @covers WP_REST_Templates_Controller::get_context_param
+	 */
+	public function test_context_param() {
+		// Collection.
+		$request  = new WP_REST_Request( 'OPTIONS', '/wp/v2/templates' );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
+		$this->assertSame( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
+		// Single.
+		$request  = new WP_REST_Request( 'OPTIONS', '/wp/v2/templates/default//my_template' );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$this->assertSame( 'view', $data['endpoints'][0]['args']['context']['default'] );
+		$this->assertSame( array( 'view', 'embed', 'edit' ), $data['endpoints'][0]['args']['context']['enum'] );
+	}
+
+	/**
+	 * @covers WP_REST_Templates_Controller::get_items
+	 */
+	public function test_get_items() {
+		wp_set_current_user( self::$admin_id );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/templates' );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+
+		$this->assertSame(
+			array(
+				'id'             => 'default//my_template',
+				'theme'          => 'default',
+				'slug'           => 'my_template',
+				'source'         => 'custom',
+				'origin'         => null,
+				'type'           => 'wp_template',
+				'description'    => 'Description of my template.',
+				'title'          => array(
+					'raw'      => 'My Template',
+					'rendered' => 'My Template',
+				),
+				'status'         => 'publish',
+				'wp_id'          => self::$post->ID,
+				'has_theme_file' => false,
+				'is_custom'      => true,
+				'author'         => 0,
+			),
+			$this->find_and_normalize_template_by_id( $data, 'default//my_template' )
+		);
+	}
+
+	/**
+	 * @covers WP_REST_Templates_Controller::get_items
+	 */
+	public function test_get_items_no_permission() {
+		wp_set_current_user( 0 );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/templates' );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_cannot_manage_templates', $response, 401 );
+	}
+
+	/**
+	 * @covers WP_REST_Templates_Controller::get_item
+	 */
+	public function test_get_item() {
+		wp_set_current_user( self::$admin_id );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/templates/default//my_template' );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		unset( $data['content'] );
+		unset( $data['_links'] );
+
+		$this->assertSame(
+			array(
+				'id'             => 'default//my_template',
+				'theme'          => 'default',
+				'slug'           => 'my_template',
+				'source'         => 'custom',
+				'origin'         => null,
+				'type'           => 'wp_template',
+				'description'    => 'Description of my template.',
+				'title'          => array(
+					'raw'      => 'My Template',
+					'rendered' => 'My Template',
+				),
+				'status'         => 'publish',
+				'wp_id'          => self::$post->ID,
+				'has_theme_file' => false,
+				'is_custom'      => true,
+				'author'         => 0,
+			),
+			$data
+		);
+	}
+
+	/**
+	 * @ticket 54507
+	 * @dataProvider get_template_endpoint_urls
+	 */
+	public function test_get_item_works_with_a_single_slash( $endpoint_url ) {
+		wp_set_current_user( self::$admin_id );
+		$request  = new WP_REST_Request( 'GET', $endpoint_url );
+		$response = rest_get_server()->dispatch( $request );
+
+		$data = $response->get_data();
+		unset( $data['content'] );
+		unset( $data['_links'] );
+
+		$this->assertSame(
+			array(
+				'id'             => 'default//my_template',
+				'theme'          => 'default',
+				'slug'           => 'my_template',
+				'source'         => 'custom',
+				'origin'         => null,
+				'type'           => 'wp_template',
+				'description'    => 'Description of my template.',
+				'title'          => array(
+					'raw'      => 'My Template',
+					'rendered' => 'My Template',
+				),
+				'status'         => 'publish',
+				'wp_id'          => self::$post->ID,
+				'has_theme_file' => false,
+				'is_custom'      => true,
+				'author'         => 0,
+			),
+			$data
+		);
+	}
+
+	public function get_template_endpoint_urls() {
+		return array(
+			array( '/wp/v2/templates/default/my_template' ),
+			array( '/wp/v2/templates/default//my_template' ),
+		);
+	}
+
+	/**
+	 * @dataProvider data_get_item_with_valid_theme_dirname
+	 * @covers WP_REST_Templates_Controller::get_item
+	 * @ticket 54596
+	 *
+	 * @param string $theme_dir Theme directory to test.
+	 * @param string $template  Template to test.
+	 * @param array  $args      Arguments to create the 'wp_template" post.
+	 */
+	public function test_get_item_with_valid_theme_dirname( $theme_dir, $template, array $args ) {
+		wp_set_current_user( self::$admin_id );
+		switch_theme( $theme_dir );
+
+		// Set up template post.
+		$args['post_type'] = 'wp_template';
+		$args['tax_input'] = array(
+			'wp_theme' => array(
+				get_stylesheet(),
+			),
+		);
+		$post              = self::factory()->post->create_and_get( $args );
+		wp_set_post_terms( $post->ID, get_stylesheet(), 'wp_theme' );
+
+		$request  = new WP_REST_Request( 'GET', "/wp/v2/templates/{$theme_dir}//{$template}" );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		unset( $data['content'] );
+		unset( $data['_links'] );
+
+		$this->assertSameSetsWithIndex(
+			array(
+				'id'             => "{$theme_dir}//{$template}",
+				'theme'          => $theme_dir,
+				'slug'           => $template,
+				'source'         => 'custom',
+				'origin'         => null,
+				'type'           => 'wp_template',
+				'description'    => $args['post_excerpt'],
+				'title'          => array(
+					'raw'      => $args['post_title'],
+					'rendered' => $args['post_title'],
+				),
+				'status'         => 'publish',
+				'wp_id'          => $post->ID,
+				'has_theme_file' => false,
+				'is_custom'      => true,
+				'author'         => self::$admin_id,
+			),
+			$data
+		);
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_get_item_with_valid_theme_dirname() {
+		$theme_root_dir = DIR_TESTDATA . '/themedir1/';
+		return array(
+			'template parts: parent theme'                => array(
+				'theme_dir' => 'themedir1/block-theme',
+				'template'  => 'small-header',
+				'args'      => array(
+					'post_name'    => 'small-header',
+					'post_title'   => 'Small Header Template',
+					'post_content' => file_get_contents( $theme_root_dir . '/block-theme/parts/small-header.html' ),
+					'post_excerpt' => 'Description of small header template.',
+				),
+			),
+			'template: parent theme'                      => array(
+				'theme_dir' => 'themedir1/block-theme',
+				'template'  => 'page-home',
+				'args'      => array(
+					'post_name'    => 'page-home',
+					'post_title'   => 'Home Page Template',
+					'post_content' => file_get_contents( $theme_root_dir . 'block-theme/templates/page-home.html' ),
+					'post_excerpt' => 'Description of page home template.',
+				),
+			),
+			'template: child theme'                       => array(
+				'theme_dir' => 'themedir1/block-theme-child',
+				'template'  => 'page-1',
+				'args'      => array(
+					'post_name'    => 'page-1',
+					'post_title'   => 'Page 1 Template',
+					'post_content' => file_get_contents( $theme_root_dir . 'block-theme-child/templates/page-1.html' ),
+					'post_excerpt' => 'Description of page 1 template.',
+				),
+			),
+			'template part: subdir with _-[]. characters' => array(
+				'theme_dir' => 'themedir1/block_theme-[0.4.0]',
+				'template'  => 'large-header',
+				'args'      => array(
+					'post_name'    => 'large-header',
+					'post_title'   => 'Large Header Template Part',
+					'post_content' => file_get_contents( $theme_root_dir . 'block_theme-[0.4.0]/parts/large-header.html' ),
+					'post_excerpt' => 'Description of large header template.',
+				),
+			),
+			'template: subdir with _-[]. characters'      => array(
+				'theme_dir' => 'themedir1/block_theme-[0.4.0]',
+				'template'  => 'page-large-header',
+				'args'      => array(
+					'post_name'    => 'page-large-header',
+					'post_title'   => 'Page Large Template',
+					'post_content' => file_get_contents( $theme_root_dir . 'block_theme-[0.4.0]/templates/page-large-header.html' ),
+					'post_excerpt' => 'Description of page large template.',
+				),
+			),
+		);
+	}
+
+	/**
+	 * @ticket 54507
+	 * @dataProvider get_template_ids_to_sanitize
+	 */
+	public function test_sanitize_template_id( $input_id, $sanitized_id ) {
+		$endpoint = new WP_REST_Templates_Controller( 'wp_template' );
+		$this->assertEquals(
+			$sanitized_id,
+			$endpoint->_sanitize_template_id( $input_id )
+		);
+	}
+
+	public function get_template_ids_to_sanitize() {
+		return array(
+			array( 'tt1-blocks/index', 'tt1-blocks//index' ),
+			array( 'tt1-blocks//index', 'tt1-blocks//index' ),
+
+			array( 'theme-experiments/tt1-blocks/index', 'theme-experiments/tt1-blocks//index' ),
+			array( 'theme-experiments/tt1-blocks//index', 'theme-experiments/tt1-blocks//index' ),
+		);
+	}
+
+	/**
+	 * @ticket 54422
+	 * @covers WP_REST_Templates_Controller::create_item
+	 */
+	public function test_create_item() {
+		wp_set_current_user( self::$admin_id );
+		$request = new WP_REST_Request( 'POST', '/wp/v2/templates' );
+		$request->set_body_params(
+			array(
+				'slug'        => 'my_custom_template',
+				'description' => 'Just a description',
+				'title'       => 'My Template',
+				'content'     => 'Content',
+				'author'      => self::$admin_id,
+			)
+		);
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		unset( $data['_links'] );
+		unset( $data['wp_id'] );
+
+		$this->assertSame(
+			array(
+				'id'             => 'default//my_custom_template',
+				'theme'          => 'default',
+				'content'        => array(
+					'raw' => 'Content',
+				),
+				'slug'           => 'my_custom_template',
+				'source'         => 'custom',
+				'origin'         => null,
+				'type'           => 'wp_template',
+				'description'    => 'Just a description',
+				'title'          => array(
+					'raw'      => 'My Template',
+					'rendered' => 'My Template',
+				),
+				'status'         => 'publish',
+				'has_theme_file' => false,
+				'is_custom'      => true,
+				'author'         => self::$admin_id,
+			),
+			$data
+		);
+	}
+
+	/**
+	 * @ticket 54680
+	 * @covers WP_REST_Templates_Controller::create_item
+	 * @covers WP_REST_Templates_Controller::get_item_schema
+	 */
+	public function test_create_item_with_numeric_slug() {
+		wp_set_current_user( self::$admin_id );
+		$request = new WP_REST_Request( 'POST', '/wp/v2/templates' );
+		$request->set_body_params(
+			array(
+				'slug'        => '404',
+				'description' => 'Template shown when no content is found.',
+				'title'       => '404',
+				'author'      => self::$admin_id,
+			)
+		);
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		unset( $data['_links'] );
+		unset( $data['wp_id'] );
+
+		$this->assertSame(
+			array(
+				'id'             => 'default//404',
+				'theme'          => 'default',
+				'content'        => array(
+					'raw' => '',
+				),
+				'slug'           => '404',
+				'source'         => 'custom',
+				'origin'         => null,
+				'type'           => 'wp_template',
+				'description'    => 'Template shown when no content is found.',
+				'title'          => array(
+					'raw'      => '404',
+					'rendered' => '404',
+				),
+				'status'         => 'publish',
+				'has_theme_file' => false,
+				'is_custom'      => false,
+				'author'         => self::$admin_id,
+			),
+			$data
+		);
+	}
+
+	/**
+	 * @ticket 54422
+	 * @covers WP_REST_Templates_Controller::create_item
+	 */
+	public function test_create_item_raw() {
+		wp_set_current_user( self::$admin_id );
+		$request = new WP_REST_Request( 'POST', '/wp/v2/templates' );
+		$request->set_body_params(
+			array(
+				'slug'        => 'my_custom_template_raw',
+				'description' => 'Just a description',
+				'title'       => array(
+					'raw' => 'My Template',
+				),
+				'content'     => array(
+					'raw' => 'Content',
+				),
+				'author'      => self::$admin_id,
+			)
+		);
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		unset( $data['_links'] );
+		unset( $data['wp_id'] );
+
+		$this->assertSame(
+			array(
+				'id'             => 'default//my_custom_template_raw',
+				'theme'          => 'default',
+				'content'        => array(
+					'raw' => 'Content',
+				),
+				'slug'           => 'my_custom_template_raw',
+				'source'         => 'custom',
+				'origin'         => null,
+				'type'           => 'wp_template',
+				'description'    => 'Just a description',
+				'title'          => array(
+					'raw'      => 'My Template',
+					'rendered' => 'My Template',
+				),
+				'status'         => 'publish',
+				'has_theme_file' => false,
+				'is_custom'      => true,
+				'author'         => self::$admin_id,
+			),
+			$data
+		);
+	}
+
+	public function test_create_item_invalid_author() {
+		wp_set_current_user( self::$admin_id );
+		$request = new WP_REST_Request( 'POST', '/wp/v2/templates' );
+		$request->set_body_params(
+			array(
+				'slug'        => 'my_custom_template_invalid_author',
+				'description' => 'Just a description',
+				'title'       => 'My Template',
+				'content'     => 'Content',
+				'author'      => -1,
+			)
+		);
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_invalid_author', $response, 400 );
+	}
+
+	/**
+	 * @covers WP_REST_Templates_Controller::update_item
+	 */
+	public function test_update_item() {
+		wp_set_current_user( self::$admin_id );
+		$request = new WP_REST_Request( 'PUT', '/wp/v2/templates/default//my_template' );
+		$request->set_body_params(
+			array(
+				'title' => 'My new Index Title',
+			)
+		);
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$this->assertSame( 'My new Index Title', $data['title']['raw'] );
+		$this->assertSame( 'custom', $data['source'] );
+	}
+
+	/**
+	 * @covers WP_REST_Templates_Controller::update_item
+	 */
+	public function test_update_item_raw() {
+		wp_set_current_user( self::$admin_id );
+		$request = new WP_REST_Request( 'PUT', '/wp/v2/templates/default//my_template' );
+		$request->set_body_params(
+			array(
+				'title' => array( 'raw' => 'My new raw Index Title' ),
+			)
+		);
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$this->assertSame( 'My new raw Index Title', $data['title']['raw'] );
+		$this->assertSame( 'custom', $data['source'] );
+	}
+
+	/**
+	 * @covers WP_REST_Templates_Controller::delete_item
+	 */
+	public function test_delete_item() {
+		// Set up template post.
+		$args    = array(
+			'post_type'    => 'wp_template',
+			'post_name'    => 'my_test_template',
+			'post_title'   => 'My Template',
+			'post_content' => 'Content',
+			'post_excerpt' => 'Description of my template.',
+			'tax_input'    => array(
+				'wp_theme' => array(
+					get_stylesheet(),
+				),
+			),
+		);
+		$post_id = self::factory()->post->create( $args );
+		wp_set_post_terms( $post_id, get_stylesheet(), 'wp_theme' );
+
+		wp_set_current_user( self::$admin_id );
+		$request = new WP_REST_Request( 'DELETE', '/wp/v2/templates/default//my_test_template' );
+		$request->set_param( 'force', 'false' );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$this->assertSame( 'My Template', $data['title']['raw'] );
+		$this->assertSame( 'trash', $data['status'] );
+	}
+
+	/**
+	 * @covers WP_REST_Templates_Controller::delete_item
+	 */
+	public function test_delete_item_skip_trash() {
+		// Set up template post.
+		$args    = array(
+			'post_type'    => 'wp_template',
+			'post_name'    => 'my_test_template',
+			'post_title'   => 'My Template',
+			'post_content' => 'Content',
+			'post_excerpt' => 'Description of my template.',
+			'tax_input'    => array(
+				'wp_theme' => array(
+					get_stylesheet(),
+				),
+			),
+		);
+		$post_id = self::factory()->post->create( $args );
+		wp_set_post_terms( $post_id, get_stylesheet(), 'wp_theme' );
+
+		wp_set_current_user( self::$admin_id );
+		$request = new WP_REST_Request( 'DELETE', '/wp/v2/templates/default//my_test_template' );
+		$request->set_param( 'force', 'true' );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertSame( 200, $response->get_status() );
+		$data = $response->get_data();
+		$this->assertTrue( $data['deleted'] );
+		$this->assertNotEmpty( $data['previous'] );
+	}
+
+	/**
+	 * @covers WP_REST_Templates_Controller::delete_item
+	 */
+	public function test_delete_item_fail() {
+		wp_set_current_user( self::$admin_id );
+		$request  = new WP_REST_Request( 'DELETE', '/wp/v2/templates/justrandom//template' );
+		$response = rest_get_server()->dispatch( $request );
+		$this->assertErrorResponse( 'rest_template_not_found', $response, 404 );
+	}
+
+	public function test_prepare_item() {
+		// TODO: Implement test_prepare_item() method.
+	}
+
+	public function test_prepare_item_limit_fields() {
+		wp_set_current_user( self::$admin_id );
+
+		$endpoint = new WP_REST_Templates_Controller( 'wp_template' );
+		$request  = new WP_REST_Request( 'GET', '/wp/v2/templates/default//my_template' );
+		$request->set_param( 'context', 'edit' );
+		$request->set_param( '_fields', 'id,slug' );
+		$obj      = get_block_template( 'default//my_template', 'wp_template' );
+		$response = $endpoint->prepare_item_for_response( $obj, $request );
+		$this->assertSame(
+			array(
+				'id',
+				'slug',
+			),
+			array_keys( $response->get_data() )
+		);
+	}
+
+	/**
+	 * @ticket 54422
+	 * @covers WP_REST_Templates_Controller::get_item_schema
+	 */
+	public function test_get_item_schema() {
+		$request    = new WP_REST_Request( 'OPTIONS', '/wp/v2/templates' );
+		$response   = rest_get_server()->dispatch( $request );
+		$data       = $response->get_data();
+		$properties = $data['schema']['properties'];
+		$this->assertCount( 14, $properties );
+		$this->assertArrayHasKey( 'id', $properties );
+		$this->assertArrayHasKey( 'description', $properties );
+		$this->assertArrayHasKey( 'slug', $properties );
+		$this->assertArrayHasKey( 'theme', $properties );
+		$this->assertArrayHasKey( 'type', $properties );
+		$this->assertArrayHasKey( 'source', $properties );
+		$this->assertArrayHasKey( 'origin', $properties );
+		$this->assertArrayHasKey( 'content', $properties );
+		$this->assertArrayHasKey( 'title', $properties );
+		$this->assertArrayHasKey( 'description', $properties );
+		$this->assertArrayHasKey( 'status', $properties );
+		$this->assertArrayHasKey( 'wp_id', $properties );
+		$this->assertArrayHasKey( 'has_theme_file', $properties );
+		$this->assertArrayHasKey( 'is_custom', $properties );
+		$this->assertArrayHasKey( 'author', $properties );
+	}
+
+	protected function find_and_normalize_template_by_id( $templates, $id ) {
+		foreach ( $templates as $template ) {
+			if ( $template['id'] === $id ) {
+				unset( $template['content'] );
+				unset( $template['_links'] );
+				return $template;
+			}
+		}
+
+		return null;
+	}
+
+}
diff --git a/tests/phpunit/tests/rest-api/wpRestUrlDetailsController.php b/tests/phpunit/tests/rest-api/wpRestUrlDetailsController.php
index db4d229da3..642e51235d 100644
--- a/tests/phpunit/tests/rest-api/wpRestUrlDetailsController.php
+++ b/tests/phpunit/tests/rest-api/wpRestUrlDetailsController.php
@@ -93,7 +93,7 @@ class Tests_REST_WpRestUrlDetailsController extends WP_Test_REST_Controller_Test
 		add_filter( 'pre_http_request', array( $this, 'mock_success_request_to_remote_url' ), 10, 3 );
 
 		// Disables usage of cache during major of tests.
-		add_filter( 'pre_transient_' . $this->get_transient_name(), '__return_null' );
+		add_filter( 'pre_site_transient_' . $this->get_transient_name(), '__return_null' );
 	}
 
 	public function tear_down() {
@@ -341,11 +341,11 @@ class Tests_REST_WpRestUrlDetailsController extends WP_Test_REST_Controller_Test
 	 */
 	public function test_will_return_from_cache_if_populated() {
 		$transient_name = $this->get_transient_name();
-		remove_filter( "pre_transient_{$transient_name}", '__return_null' );
+		remove_filter( "pre_site_transient_{$transient_name}", '__return_null' );
 
 		// Force cache to return a known value as the remote URL http response body.
 		add_filter(
-			"pre_transient_{$transient_name}",
+			"pre_site_transient_{$transient_name}",
 			static function() {
 				return '<html><head><title>This value from cache.</title></head><body></body></html>';
 			}
diff --git a/tests/phpunit/tests/rewrite.php b/tests/phpunit/tests/rewrite.php
index 62697800cc..1a5ad9774b 100644
--- a/tests/phpunit/tests/rewrite.php
+++ b/tests/phpunit/tests/rewrite.php
@@ -173,7 +173,7 @@ class Tests_Rewrite extends WP_UnitTestCase {
 	public function test_url_to_postid_custom_post_type() {
 		delete_option( 'rewrite_rules' );
 
-		$post_type = rand_str( 12 );
+		$post_type = 'url_to_postid';
 		register_post_type( $post_type, array( 'public' => true ) );
 
 		$id = self::factory()->post->create( array( 'post_type' => $post_type ) );
diff --git a/tests/phpunit/tests/rewrite/numericSlugs.php b/tests/phpunit/tests/rewrite/numericSlugs.php
index e11c6b2a46..41ef636368 100644
--- a/tests/phpunit/tests/rewrite/numericSlugs.php
+++ b/tests/phpunit/tests/rewrite/numericSlugs.php
@@ -23,7 +23,7 @@ class Tests_Rewrite_NumericSlugs extends WP_UnitTestCase {
 			array(
 				'post_author'  => $this->author_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
+				'post_content' => 'content',
 				'post_title'   => '',
 				'post_name'    => '2015',
 				'post_date'    => '2015-02-01 01:00:00',
@@ -53,7 +53,7 @@ class Tests_Rewrite_NumericSlugs extends WP_UnitTestCase {
 			array(
 				'post_author'  => $this->author_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
+				'post_content' => 'content',
 				'post_title'   => '',
 				'post_name'    => '2015',
 				'post_date'    => '2015-02-01 01:00:00',
@@ -80,7 +80,7 @@ class Tests_Rewrite_NumericSlugs extends WP_UnitTestCase {
 			array(
 				'post_author'  => $this->author_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
+				'post_content' => 'content',
 				'post_title'   => '2015',
 				'post_date'    => '2015-02-01 01:00:00',
 			)
@@ -98,7 +98,7 @@ class Tests_Rewrite_NumericSlugs extends WP_UnitTestCase {
 			array(
 				'post_author'  => $this->author_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
+				'post_content' => 'content',
 				'post_title'   => '2015',
 				'post_date'    => '2015-02-01 01:00:00',
 			)
@@ -114,7 +114,7 @@ class Tests_Rewrite_NumericSlugs extends WP_UnitTestCase {
 			array(
 				'post_author'  => $this->author_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
+				'post_content' => 'content',
 				'post_title'   => '',
 				'post_name'    => '02',
 				'post_date'    => '2015-02-01 01:00:00',
@@ -133,7 +133,7 @@ class Tests_Rewrite_NumericSlugs extends WP_UnitTestCase {
 			array(
 				'post_author'  => $this->author_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
+				'post_content' => 'content',
 				'post_title'   => '',
 				'post_name'    => '02',
 				'post_date'    => '2015-02-01 01:00:00',
@@ -150,7 +150,7 @@ class Tests_Rewrite_NumericSlugs extends WP_UnitTestCase {
 			array(
 				'post_author'  => $this->author_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
+				'post_content' => 'content',
 				'post_title'   => '',
 				'post_name'    => '2',
 				'post_date'    => '2015-02-01 01:00:00',
@@ -169,7 +169,7 @@ class Tests_Rewrite_NumericSlugs extends WP_UnitTestCase {
 			array(
 				'post_author'  => $this->author_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
+				'post_content' => 'content',
 				'post_title'   => '',
 				'post_name'    => '2',
 				'post_date'    => '2015-02-01 01:00:00',
@@ -186,7 +186,7 @@ class Tests_Rewrite_NumericSlugs extends WP_UnitTestCase {
 			array(
 				'post_author'  => $this->author_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
+				'post_content' => 'content',
 				'post_title'   => '02',
 				'post_date'    => '2015-02-01 01:00:00',
 			)
@@ -204,7 +204,7 @@ class Tests_Rewrite_NumericSlugs extends WP_UnitTestCase {
 			array(
 				'post_author'  => $this->author_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
+				'post_content' => 'content',
 				'post_title'   => '02',
 				'post_date'    => '2015-02-01 01:00:00',
 			)
@@ -220,7 +220,7 @@ class Tests_Rewrite_NumericSlugs extends WP_UnitTestCase {
 			array(
 				'post_author'  => $this->author_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
+				'post_content' => 'content',
 				'post_title'   => '2',
 				'post_date'    => '2015-02-01 01:00:00',
 			)
@@ -238,7 +238,7 @@ class Tests_Rewrite_NumericSlugs extends WP_UnitTestCase {
 			array(
 				'post_author'  => $this->author_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
+				'post_content' => 'content',
 				'post_title'   => '2',
 				'post_date'    => '2015-02-01 01:00:00',
 			)
@@ -254,7 +254,7 @@ class Tests_Rewrite_NumericSlugs extends WP_UnitTestCase {
 			array(
 				'post_author'  => $this->author_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
+				'post_content' => 'content',
 				'post_title'   => '',
 				'post_name'    => '01',
 				'post_date'    => '2015-02-01 01:00:00',
@@ -273,7 +273,7 @@ class Tests_Rewrite_NumericSlugs extends WP_UnitTestCase {
 			array(
 				'post_author'  => $this->author_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
+				'post_content' => 'content',
 				'post_title'   => '',
 				'post_name'    => '01',
 				'post_date'    => '2015-02-01 01:00:00',
@@ -290,7 +290,7 @@ class Tests_Rewrite_NumericSlugs extends WP_UnitTestCase {
 			array(
 				'post_author'  => $this->author_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
+				'post_content' => 'content',
 				'post_title'   => '01',
 				'post_date'    => '2015-02-01 01:00:00',
 			)
@@ -308,7 +308,7 @@ class Tests_Rewrite_NumericSlugs extends WP_UnitTestCase {
 			array(
 				'post_author'  => $this->author_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
+				'post_content' => 'content',
 				'post_title'   => '01',
 				'post_date'    => '2015-02-01 01:00:00',
 			)
@@ -324,7 +324,7 @@ class Tests_Rewrite_NumericSlugs extends WP_UnitTestCase {
 			array(
 				'post_author'  => $this->author_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
+				'post_content' => 'content',
 				'post_title'   => '01',
 				'post_date'    => '2015-02-01 01:00:00',
 			)
diff --git a/tests/phpunit/tests/taxonomy.php b/tests/phpunit/tests/taxonomy.php
index 6d7cc06602..122f55b6bc 100644
--- a/tests/phpunit/tests/taxonomy.php
+++ b/tests/phpunit/tests/taxonomy.php
@@ -17,7 +17,7 @@ class Tests_Taxonomy extends WP_UnitTestCase {
 	 */
 	public function test_get_unknown_taxonomies() {
 		// Taxonomies for an unknown object type.
-		$this->assertSame( array(), get_object_taxonomies( rand_str() ) );
+		$this->assertSame( array(), get_object_taxonomies( 'unknown' ) );
 		$this->assertSame( array(), get_object_taxonomies( '' ) );
 		$this->assertSame( array(), get_object_taxonomies( 0 ) );
 		$this->assertSame( array(), get_object_taxonomies( null ) );
@@ -144,7 +144,7 @@ class Tests_Taxonomy extends WP_UnitTestCase {
 	public function test_register_taxonomy() {
 
 		// Make up a new taxonomy name, and ensure it's unused.
-		$tax = rand_str();
+		$tax = 'tax_new';
 		$this->assertFalse( taxonomy_exists( $tax ) );
 
 		register_taxonomy( $tax, 'post' );
@@ -158,7 +158,7 @@ class Tests_Taxonomy extends WP_UnitTestCase {
 	public function test_register_hierarchical_taxonomy() {
 
 		// Make up a new taxonomy name, and ensure it's unused.
-		$tax = rand_str();
+		$tax = 'tax_new';
 		$this->assertFalse( taxonomy_exists( $tax ) );
 
 		register_taxonomy( $tax, 'post', array( 'hierarchical' => true ) );
diff --git a/tests/phpunit/tests/term.php b/tests/phpunit/tests/term.php
index 61fbb3a397..4cc0701097 100644
--- a/tests/phpunit/tests/term.php
+++ b/tests/phpunit/tests/term.php
@@ -51,14 +51,17 @@ class Tests_Term extends WP_UnitTestCase {
 	 */
 	public function test_is_term_type() {
 		// Insert a term.
-		$term = rand_str();
+		$term = 'term_new';
 		$t    = wp_insert_term( $term, $this->taxonomy );
 		$this->assertIsArray( $t );
 		$term_obj = get_term_by( 'name', $term, $this->taxonomy );
-		$this->assertEquals( $t['term_id'], term_exists( $term_obj->slug ) );
 
+		$exists = term_exists( $term_obj->slug );
 		// Clean up.
-		$this->assertTrue( wp_delete_term( $t['term_id'], $this->taxonomy ) );
+		$deleted = wp_delete_term( $t['term_id'], $this->taxonomy );
+
+		$this->assertEquals( $t['term_id'], $exists );
+		$this->assertTrue( $deleted );
 	}
 
 	/**
@@ -120,7 +123,7 @@ class Tests_Term extends WP_UnitTestCase {
 		}
 
 		foreach ( $posts as $post_id ) {
-			$this->assertTrue( (bool) wp_delete_post( $post_id ) );
+			$this->assertInstanceOf( 'WP_Post', wp_delete_post( $post_id ) );
 		}
 	}
 
diff --git a/tests/phpunit/tests/term/getTermField.php b/tests/phpunit/tests/term/getTermField.php
index a5a132a9b4..c69044564c 100644
--- a/tests/phpunit/tests/term/getTermField.php
+++ b/tests/phpunit/tests/term/getTermField.php
@@ -91,7 +91,7 @@ class Tests_Term_getTermField extends WP_UnitTestCase {
 	}
 
 	public function test_get_term_field_name() {
-		$name = rand_str( 15 );
+		$name = 'baz';
 
 		$term = self::factory()->term->create_and_get(
 			array(
@@ -106,7 +106,7 @@ class Tests_Term_getTermField extends WP_UnitTestCase {
 	}
 
 	public function test_get_term_field_slug_when_slug_is_set() {
-		$slug = rand_str( 15 );
+		$slug = 'baz';
 
 		$term = self::factory()->term->create_and_get(
 			array(
@@ -121,7 +121,7 @@ class Tests_Term_getTermField extends WP_UnitTestCase {
 	}
 
 	public function test_get_term_field_slug_when_slug_falls_back_from_name() {
-		$name = rand_str( 15 );
+		$name = 'baz';
 
 		$term = self::factory()->term->create_and_get(
 			array(
@@ -156,7 +156,7 @@ class Tests_Term_getTermField extends WP_UnitTestCase {
 	}
 
 	public function test_get_term_field_description() {
-		$desc = wpautop( rand_str() );
+		$desc = wpautop( 'baz' );
 
 		$term = self::factory()->term->create_and_get(
 			array(
diff --git a/tests/phpunit/tests/term/getTermLink.php b/tests/phpunit/tests/term/getTermLink.php
index c5b9fbbe32..3522464cd1 100644
--- a/tests/phpunit/tests/term/getTermLink.php
+++ b/tests/phpunit/tests/term/getTermLink.php
@@ -2,13 +2,24 @@
 
 /**
  * @group taxonomy
+ * @covers ::get_term_link
  */
 class Tests_Term_GetTermLink extends WP_UnitTestCase {
 
+	public static $terms;
+
+	public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) {
+		self::register_custom_taxonomy();
+
+		$taxonomies = array( 'category', 'post_tag', 'wptests_tax' );
+		foreach ( $taxonomies as $taxonomy ) {
+			self::$terms[ $taxonomy ] = $factory->term->create_and_get( array( 'taxonomy' => $taxonomy ) );
+		}
+	}
+
 	public function set_up() {
 		parent::set_up();
-
-		register_taxonomy( 'wptests_tax', 'post' );
+		self::register_custom_taxonomy();
 	}
 
 	public function test_integer_should_be_interpreted_as_term_id() {
@@ -207,4 +218,134 @@ class Tests_Term_GetTermLink extends WP_UnitTestCase {
 
 		$this->assertStringContainsString( '/foo/term2/', $actual );
 	}
+
+	/**
+	 * @dataProvider data_get_term_link
+	 *
+	 * @ticket 50225
+	 *
+	 * @param string $taxonomy Taxonomy being tested (used for index of term keys).
+	 * @param bool   $use_id   When true, pass term ID. Else, pass term object.
+	 */
+	public function test_get_term_link_filter_is_object_by_term_id( $taxonomy, $use_id ) {
+		$term = $this->get_term( $taxonomy, $use_id );
+
+		add_filter(
+			'term_link',
+			function( $location, $term ) {
+				$this->assertInstanceOf( 'WP_Term', $term );
+			},
+			10,
+			2
+		);
+
+		get_term_link( $term, $taxonomy );
+	}
+
+	/**
+	 * @dataProvider data_get_term_link
+	 *
+	 * @ticket 50225
+	 *
+	 * @param string $taxonomy Taxonomy being tested (used for index of term keys).
+	 * @param bool   $use_id   When true, pass term ID. Else, pass term object.
+	 */
+	public function test_get_term_link_filter_is_object_by_term_object( $taxonomy, $use_id ) {
+		$term = $this->get_term( $taxonomy, $use_id );
+
+		add_filter(
+			'term_link',
+			function( $location, $term ) {
+				$this->assertInstanceOf( 'WP_Term', $term );
+			},
+			10,
+			2
+		);
+
+		get_term_link( get_term( $term, $taxonomy ), $taxonomy );
+	}
+
+	/**
+	 * @dataProvider data_get_term_link
+	 *
+	 * @ticket 50225
+	 *
+	 * @param string $taxonomy Taxonomy being tested (used for index of term keys).
+	 * @param bool   $use_id   When true, pass term ID. Else, skip the test.
+	 */
+	public function test_get_term_feed_link_backward_compatibility( $taxonomy, $use_id ) {
+		if ( $use_id ) {
+			$term = $this->get_term( $taxonomy, $use_id );
+
+			$term_feed_link = get_term_feed_link( $term, $taxonomy );
+			$this->assertIsString( $term_feed_link );
+
+			$term_feed_link = get_term_feed_link( $term, '' );
+			$this->assertIsString( $term_feed_link );
+		} else {
+			$this->markTestSkipped( 'This test requires to pass an ID to get_term_feed_link()' );
+		}
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_get_term_link() {
+		return array(
+			'category passing term_id'          => array(
+				'taxonomy' => 'category',
+				'use_id'   => false,
+			),
+			'category passing term object'      => array(
+				'taxonomy' => 'category',
+				'use_id'   => true,
+			),
+			'post_tag passing term_id'          => array(
+				'taxonomy' => 'post_tag',
+				'use_id'   => false,
+			),
+			'post_tag passing term object'      => array(
+				'taxonomy' => 'post_tag',
+				'use_id'   => true,
+			),
+			'a custom taxonomy passing term_id' => array(
+				'taxonomy' => 'wptests_tax',
+				'use_id'   => false,
+			),
+			'a custom taxonomy passing term_id' => array(
+				'taxonomy' => 'wptests_tax',
+				'use_id'   => true,
+				'expected' => 'term.php?taxonomy=custom_taxonomy&tag_ID=%ID%&post_type=post',
+			),
+		);
+	}
+
+	/**
+	 * Helper to register a custom taxonomy for use in tests.
+	 *
+	 * @since 5.9.0
+	 */
+	private static function register_custom_taxonomy() {
+		register_taxonomy( 'wptests_tax', 'post' );
+	}
+
+	/**
+	 * Helper to get the term for the given taxonomy.
+	 *
+	 * @since 5.9.0
+	 *
+	 * @param string $taxonomy Taxonomy being tested (used for index of term keys).
+	 * @param bool   $use_id   When true, pass term ID. Else, pass term object.
+	 * @return WP_Term|int If $use_id is true, term ID is returned; else instance of WP_Term.
+	 */
+	private function get_term( $taxonomy, $use_id ) {
+		$term = self::$terms[ $taxonomy ];
+		if ( $use_id ) {
+			$term = $term->term_id;
+		}
+
+		return $term;
+	}
 }
diff --git a/tests/phpunit/tests/term/splitSharedTerm.php b/tests/phpunit/tests/term/splitSharedTerm.php
index 65cefe8c4a..52e4281016 100644
--- a/tests/phpunit/tests/term/splitSharedTerm.php
+++ b/tests/phpunit/tests/term/splitSharedTerm.php
@@ -208,7 +208,7 @@ class Tests_Term_SplitSharedTerm extends WP_UnitTestCase {
 			array( '%d' )
 		);
 
-		$menu_id       = wp_create_nav_menu( rand_str() );
+		$menu_id       = wp_create_nav_menu( 'Nav Menu Bar' );
 		$cat_menu_item = wp_update_nav_menu_item(
 			$menu_id,
 			0,
diff --git a/tests/phpunit/tests/term/termExists.php b/tests/phpunit/tests/term/termExists.php
index bb4381036b..8bd9a783c7 100644
--- a/tests/phpunit/tests/term/termExists.php
+++ b/tests/phpunit/tests/term/termExists.php
@@ -260,7 +260,7 @@ class Tests_TermExists extends WP_UnitTestCase {
 		register_taxonomy( 'wptests_tax', 'post' );
 
 		// Insert a term.
-		$term = rand_str();
+		$term = __FUNCTION__;
 		$t    = wp_insert_term( $term, 'wptests_tax' );
 		$this->assertIsArray( $t );
 		$this->assertEquals( $t['term_id'], term_exists( $t['term_id'] ) );
diff --git a/tests/phpunit/tests/term/wpSetObjectTerms.php b/tests/phpunit/tests/term/wpSetObjectTerms.php
index b0da2fa3d6..8032a50e79 100644
--- a/tests/phpunit/tests/term/wpSetObjectTerms.php
+++ b/tests/phpunit/tests/term/wpSetObjectTerms.php
@@ -133,9 +133,9 @@ class Tests_Term_WpSetObjectTerms extends WP_UnitTestCase {
 		$ids = self::$post_ids;
 
 		$terms = array(
-			rand_str(),
-			rand_str(),
-			rand_str(),
+			'term0',
+			'term1',
+			'term2',
 		);
 
 		foreach ( $ids as $id ) {
@@ -164,7 +164,7 @@ class Tests_Term_WpSetObjectTerms extends WP_UnitTestCase {
 
 	public function test_set_object_terms_invalid() {
 		// Bogus taxonomy.
-		$result = wp_set_object_terms( self::$post_ids[0], array( rand_str() ), rand_str() );
+		$result = wp_set_object_terms( self::$post_ids[0], array( 'foo' ), 'invalid-taxonomy' );
 		$this->assertWPError( $result );
 	}
 
diff --git a/tests/phpunit/tests/term/wpTaxonomy.php b/tests/phpunit/tests/term/wpTaxonomy.php
index a8689284c2..a47edcc9ee 100644
--- a/tests/phpunit/tests/term/wpTaxonomy.php
+++ b/tests/phpunit/tests/term/wpTaxonomy.php
@@ -18,7 +18,7 @@ class Tests_WP_Taxonomy extends WP_UnitTestCase {
 		/* @var WP $wp */
 		global $wp;
 
-		$taxonomy        = rand_str();
+		$taxonomy        = 'taxonomy1';
 		$taxonomy_object = new WP_Taxonomy( $taxonomy, 'post' );
 
 		$taxonomy_object->add_rewrite_rules();
@@ -31,7 +31,7 @@ class Tests_WP_Taxonomy extends WP_UnitTestCase {
 		/* @var WP $wp */
 		global $wp;
 
-		$taxonomy        = rand_str();
+		$taxonomy        = 'taxonomy2';
 		$taxonomy_object = new WP_Taxonomy(
 			$taxonomy,
 			'post',
@@ -58,7 +58,7 @@ class Tests_WP_Taxonomy extends WP_UnitTestCase {
 		/* @var WP_Rewrite $wp_rewrite */
 		global $wp_rewrite;
 
-		$taxonomy        = rand_str();
+		$taxonomy        = 'taxonomy3';
 		$taxonomy_object = new WP_Taxonomy(
 			$taxonomy,
 			'post',
@@ -79,7 +79,7 @@ class Tests_WP_Taxonomy extends WP_UnitTestCase {
 	}
 
 	public function test_adds_ajax_callback() {
-		$taxonomy        = rand_str();
+		$taxonomy        = 'taxonomy4';
 		$taxonomy_object = new WP_Taxonomy(
 			$taxonomy,
 			'post',
diff --git a/tests/phpunit/tests/theme.php b/tests/phpunit/tests/theme.php
index 6c495ed023..e16dd4c900 100644
--- a/tests/phpunit/tests/theme.php
+++ b/tests/phpunit/tests/theme.php
@@ -20,6 +20,7 @@ class Tests_Theme extends WP_UnitTestCase {
 		'twentynineteen',
 		'twentytwenty',
 		'twentytwentyone',
+		'twentytwentytwo',
 	);
 
 	public function set_up() {
@@ -298,7 +299,7 @@ class Tests_Theme extends WP_UnitTestCase {
 				// get_query_template()
 
 				// Template file that doesn't exist.
-				$this->assertSame( '', get_query_template( rand_str() ) );
+				$this->assertSame( '', get_query_template( 'nonexistant' ) );
 
 				// Template files that do exist.
 				/*
@@ -332,8 +333,8 @@ class Tests_Theme extends WP_UnitTestCase {
 
 	public function test_switch_theme_bogus() {
 		// Try switching to a theme that doesn't exist.
-		$template = rand_str();
-		$style    = rand_str();
+		$template = 'some_template';
+		$style    = 'some_style';
 		update_option( 'template', $template );
 		update_option( 'stylesheet', $style );
 
@@ -699,4 +700,168 @@ class Tests_Theme extends WP_UnitTestCase {
 			),
 		);
 	}
+
+
+	/**
+	 * Tests that block themes support a feature by default.
+	 *
+	 * @ticket 54597
+	 * @ticket 54731
+	 *
+	 * @dataProvider data_block_theme_has_default_support
+	 *
+	 * @covers ::_add_default_theme_supports
+	 *
+	 * @param array $support {
+	 *     The feature to check.
+	 *
+	 *     @type string $feature     The feature to check.
+	 *     @type string $sub_feature Optional. The sub-feature to check.
+	 * }
+	 */
+	public function test_block_theme_has_default_support( $support ) {
+		$this->helper_requires_block_theme();
+
+		$support_data     = array_values( $support );
+		$support_data_str = implode( ': ', $support_data );
+
+		// Remove existing support.
+		if ( current_theme_supports( ...$support_data ) ) {
+			remove_theme_support( ...$support_data );
+		}
+
+		$this->assertFalse(
+			current_theme_supports( ...$support_data ),
+			"Could not remove support for $support_data_str."
+		);
+
+		do_action( 'setup_theme' );
+
+		$this->assertTrue(
+			current_theme_supports( ...$support_data ),
+			"Does not have default support for $support_data_str."
+		);
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_block_theme_has_default_support() {
+		return array(
+			'post-thumbnails'      => array(
+				'support' => array(
+					'feature' => 'post-thumbnails',
+				),
+			),
+			'responsive-embeds'    => array(
+				'support' => array(
+					'feature' => 'responsive-embeds',
+				),
+			),
+			'editor-styles'        => array(
+				'support' => array(
+					'feature' => 'editor-styles',
+				),
+			),
+			'html5: comment-list'  => array(
+				'support' => array(
+					'feature'     => 'html5',
+					'sub_feature' => 'comment-list',
+				),
+			),
+			'html5: comment-form'  => array(
+				'support' => array(
+					'feature'     => 'html5',
+					'sub_feature' => 'comment-form',
+				),
+			),
+			'html5: search-form'   => array(
+				'support' => array(
+					'feature'     => 'html5',
+					'sub_feature' => 'search-form',
+				),
+			),
+			'html5: gallery'       => array(
+				'support' => array(
+					'feature'     => 'html5',
+					'sub_feature' => 'gallery',
+				),
+			),
+			'html5: caption'       => array(
+				'support' => array(
+					'feature'     => 'html5',
+					'sub_feature' => 'caption',
+				),
+			),
+			'html5: style'         => array(
+				'support' => array(
+					'feature'     => 'html5',
+					'sub_feature' => 'style',
+				),
+			),
+			'html5: script'        => array(
+				'support' => array(
+					'feature'     => 'html5',
+					'sub_feature' => 'script',
+				),
+			),
+			'automatic-feed-links' => array(
+				'support' => array(
+					'feature' => 'automatic-feed-links',
+				),
+			),
+		);
+	}
+
+	/**
+	 * Tests that block themes load separate core block assets by default.
+	 *
+	 * @ticket 54597
+	 *
+	 * @covers ::_add_default_theme_supports
+	 * @covers ::wp_should_load_separate_core_block_assets
+	 */
+	public function test_block_theme_should_load_separate_core_block_assets_by_default() {
+		$this->helper_requires_block_theme();
+
+		add_filter( 'should_load_separate_core_block_assets', '__return_false' );
+
+		$this->assertFalse(
+			wp_should_load_separate_core_block_assets(),
+			'Could not disable loading separate core block assets.'
+		);
+
+		do_action( 'setup_theme' );
+
+		$this->assertTrue(
+			wp_should_load_separate_core_block_assets(),
+			'Block themes do not load separate core block assets by default.'
+		);
+	}
+
+	/**
+	 * Helper function to ensure that a block theme is available and active.
+	 */
+	private function helper_requires_block_theme() {
+		// No need to switch if we're already on a block theme.
+		if ( wp_is_block_theme() ) {
+			return;
+		}
+
+		$block_theme = 'twentytwentytwo';
+
+		// Skip if the block theme is not available.
+		if ( ! wp_get_theme( $block_theme )->exists() ) {
+			$this->markTestSkipped( "$block_theme must be available." );
+		}
+
+		switch_theme( $block_theme );
+
+		// Skip if we could not switch to the block theme.
+		if ( wp_get_theme()->stylesheet !== $block_theme ) {
+			$this->markTestSkipped( "Could not switch to $block_theme." );
+		}
+	}
 }
diff --git a/tests/phpunit/tests/theme/themeDir.php b/tests/phpunit/tests/theme/themeDir.php
index da24493a48..377ff79fc1 100644
--- a/tests/phpunit/tests/theme/themeDir.php
+++ b/tests/phpunit/tests/theme/themeDir.php
@@ -162,6 +162,9 @@ class Tests_Theme_ThemeDir extends WP_UnitTestCase {
 			'camelCase',
 			'REST Theme',
 			'Block Theme',
+			'Block Theme Child Theme',
+			'Block Theme [0.4.0]',
+			'Block Theme [1.0.0] in subdirectory',
 		);
 
 		sort( $theme_names );
diff --git a/tests/phpunit/tests/theme/wpGetGlobalStylesheet.php b/tests/phpunit/tests/theme/wpGetGlobalStylesheet.php
new file mode 100644
index 0000000000..b3bd7754bd
--- /dev/null
+++ b/tests/phpunit/tests/theme/wpGetGlobalStylesheet.php
@@ -0,0 +1,188 @@
+<?php
+
+/**
+ * Tests wp_get_global_stylesheet().
+ *
+ * @group themes
+ */
+class Tests_Theme_wpGetGlobalStylesheet extends WP_UnitTestCase {
+
+	public function set_up() {
+		parent::set_up();
+
+		$this->orig_theme_dir = $GLOBALS['wp_theme_directories'];
+		$this->theme_root     = realpath( DIR_TESTDATA . '/themedir1' );
+
+		// /themes is necessary as theme.php functions assume /themes is the root if there is only one root.
+		$GLOBALS['wp_theme_directories'] = array( WP_CONTENT_DIR . '/themes', $this->theme_root );
+
+		// Set up the new root.
+		add_filter( 'theme_root', array( $this, 'filter_set_theme_root' ) );
+		add_filter( 'stylesheet_root', array( $this, 'filter_set_theme_root' ) );
+		add_filter( 'template_root', array( $this, 'filter_set_theme_root' ) );
+
+		// Clear caches.
+		wp_clean_themes_cache();
+		unset( $GLOBALS['wp_themes'] );
+	}
+
+	public function tear_down() {
+		$GLOBALS['wp_theme_directories'] = $this->orig_theme_dir;
+
+		// Clear up the filters to modify the theme root.
+		remove_filter( 'theme_root', array( $this, 'filter_set_theme_root' ) );
+		remove_filter( 'stylesheet_root', array( $this, 'filter_set_theme_root' ) );
+		remove_filter( 'template_root', array( $this, 'filter_set_theme_root' ) );
+
+		wp_clean_themes_cache();
+		unset( $GLOBALS['wp_themes'] );
+
+		parent::tear_down();
+	}
+
+	public function filter_set_theme_root() {
+		return $this->theme_root;
+	}
+
+	public function test_block_theme_using_variables() {
+		switch_theme( 'block-theme' );
+
+		$styles = wp_get_global_stylesheet( array( 'variables' ) );
+		$this->assertStringContainsString( '--wp--preset--font-size--small: 13px', $styles, 'small font size is 13px' );
+		$this->assertStringContainsString( '--wp--preset--font-size--medium: 20px', $styles, 'medium font size is 20px' );
+		$this->assertStringContainsString( '--wp--preset--font-size--large: 36px', $styles, 'large font size is 36px' );
+		$this->assertStringContainsString( '--wp--preset--font-size--x-large: 42px', $styles, 'x-large font size is 42px' );
+		$this->assertStringContainsString( '--wp--preset--font-size--custom: 100px;', $styles, 'custom font size is 100px' );
+
+		switch_theme( WP_DEFAULT_THEME );
+	}
+
+	public function test_block_theme_using_presets() {
+		switch_theme( 'block-theme' );
+
+		$styles = wp_get_global_stylesheet( array( 'presets' ) );
+		$this->assertStringNotContainsString( '--wp--preset--font-size--small: 13px', $styles, 'small font size is not present' );
+		$this->assertStringNotContainsString( '--wp--preset--font-size--medium: 20px', $styles, 'medium font size is not present' );
+		$this->assertStringNotContainsString( '--wp--preset--font-size--large: 36px', $styles, 'large font size is not present' );
+		$this->assertStringNotContainsString( '--wp--preset--font-size--x-large: 42px', $styles, 'x-large font size is not present' );
+		$this->assertStringNotContainsString( '--wp--preset--font-size--custom: 100px;', $styles, 'custom font size is not present' );
+
+		switch_theme( WP_DEFAULT_THEME );
+	}
+
+	public function test_block_theme_using_defaults() {
+		switch_theme( 'block-theme' );
+
+		$styles = wp_get_global_stylesheet();
+		$this->assertStringContainsString( '--wp--preset--font-size--small: 13px', $styles, 'small font size is 13px' );
+		$this->assertStringContainsString( '--wp--preset--font-size--medium: 20px', $styles, 'medium font size is 20px' );
+		$this->assertStringContainsString( '--wp--preset--font-size--large: 36px', $styles, 'large font size is 36px' );
+		$this->assertStringContainsString( '--wp--preset--font-size--x-large: 42px', $styles, 'x-large font size is 42px' );
+		$this->assertStringContainsString( '--wp--preset--font-size--custom: 100px;', $styles, 'custom font size is 100px' );
+
+		switch_theme( WP_DEFAULT_THEME );
+	}
+
+	public function test_variables_in_classic_theme_with_no_presets_using_variables() {
+		$styles = wp_get_global_stylesheet( array( 'variables' ) );
+		$this->assertStringContainsString( '--wp--preset--font-size--small: 13px', $styles, 'small font size is 13px' );
+		$this->assertStringContainsString( '--wp--preset--font-size--medium: 20px', $styles, 'medium font size is 20px' );
+		$this->assertStringContainsString( '--wp--preset--font-size--large: 36px', $styles, 'large font size is 36px' );
+		$this->assertStringContainsString( '--wp--preset--font-size--x-large: 42px', $styles, 'x-large font size is 42px' );
+	}
+
+	public function test_variables_in_classic_theme_with_no_presets_using_presets() {
+		$styles = wp_get_global_stylesheet( array( 'presets' ) );
+		$this->assertStringNotContainsString( '--wp--preset--font-size--small: 13px', $styles, 'small font size is not present' );
+		$this->assertStringNotContainsString( '--wp--preset--font-size--medium: 20px', $styles, 'medium font size is not present' );
+		$this->assertStringNotContainsString( '--wp--preset--font-size--large: 36px', $styles, 'large font size is not present' );
+		$this->assertStringNotContainsString( '--wp--preset--font-size--x-large: 42px', $styles, 'x-large font size is not present' );
+	}
+
+	public function test_variables_in_classic_theme_with_no_presets_using_defaults() {
+		$styles = wp_get_global_stylesheet();
+		$this->assertStringContainsString( '--wp--preset--font-size--small: 13px', $styles, 'small font size is 13px' );
+		$this->assertStringContainsString( '--wp--preset--font-size--medium: 20px', $styles, 'medium font size is 20px' );
+		$this->assertStringContainsString( '--wp--preset--font-size--large: 36px', $styles, 'large font size is 36px' );
+		$this->assertStringContainsString( '--wp--preset--font-size--x-large: 42px', $styles, 'x-large font size is 42px' );
+	}
+
+	public function test_variables_in_classic_theme_with_presets_using_variables() {
+		add_theme_support(
+			'editor-font-sizes',
+			array(
+				array(
+					'name' => 'Small',
+					'size' => 18,
+					'slug' => 'small',
+				),
+				array(
+					'name' => 'Large',
+					'size' => 26.25,
+					'slug' => 'large',
+				),
+			)
+		);
+
+		$styles = wp_get_global_stylesheet( array( 'variables' ) );
+		$this->assertStringContainsString( '--wp--preset--font-size--small: 18px', $styles, 'small font size is 18px' );
+		$this->assertStringContainsString( '--wp--preset--font-size--medium: 20px', $styles, 'medium font size is 20px' );
+		$this->assertStringContainsString( '--wp--preset--font-size--large: 26.25px', $styles, 'large font size is 26.25px' );
+		$this->assertStringContainsString( '--wp--preset--font-size--x-large: 42px', $styles, 'x-large font size is 42px' );
+
+		remove_theme_support( 'editor-font-sizes' );
+	}
+
+	public function test_variables_in_classic_theme_with_presets_using_presets() {
+		add_theme_support(
+			'editor-font-sizes',
+			array(
+				array(
+					'name' => 'Small',
+					'size' => 18,
+					'slug' => 'small',
+				),
+				array(
+					'name' => 'Large',
+					'size' => 26.25,
+					'slug' => 'large',
+				),
+			)
+		);
+
+		$styles = wp_get_global_stylesheet( array( 'presets' ) );
+		$this->assertStringNotContainsString( '--wp--preset--font-size--small: 18px', $styles, 'small font size is not present' );
+		$this->assertStringNotContainsString( '--wp--preset--font-size--medium: 20px', $styles, 'medium font size is not present' );
+		$this->assertStringNotContainsString( '--wp--preset--font-size--large: 26.25px', $styles, 'large font size is not present' );
+		$this->assertStringNotContainsString( '--wp--preset--font-size--x-large: 42px', $styles, 'x-large font size is not present' );
+
+		remove_theme_support( 'editor-font-sizes' );
+	}
+
+	public function test_variables_in_classic_theme_with_presets_using_defaults() {
+		add_theme_support(
+			'editor-font-sizes',
+			array(
+				array(
+					'name' => 'Small',
+					'size' => 18,
+					'slug' => 'small',
+				),
+				array(
+					'name' => 'Large',
+					'size' => 26.25,
+					'slug' => 'large',
+				),
+			)
+		);
+
+		$styles = wp_get_global_stylesheet();
+		$this->assertStringContainsString( '--wp--preset--font-size--small: 18px', $styles, 'small font size is 18px' );
+		$this->assertStringContainsString( '--wp--preset--font-size--medium: 20px', $styles, 'medium font size is 20px' );
+		$this->assertStringContainsString( '--wp--preset--font-size--large: 26.25px', $styles, 'large font size is 26.25px' );
+		$this->assertStringContainsString( '--wp--preset--font-size--x-large: 42px', $styles, 'small font size is 42px' );
+
+		remove_theme_support( 'editor-font-sizes' );
+	}
+
+}
diff --git a/tests/phpunit/tests/theme/wpTheme.php b/tests/phpunit/tests/theme/wpTheme.php
index a85bcc89aa..3fb1e6e4b7 100644
--- a/tests/phpunit/tests/theme/wpTheme.php
+++ b/tests/phpunit/tests/theme/wpTheme.php
@@ -246,4 +246,111 @@ class Tests_Theme_wpTheme extends WP_UnitTestCase {
 
 		$this->assertSameSetsWithIndex( $allowed_themes, $new_allowed_themes );
 	}
+
+	/**
+	 * @dataProvider data_is_block_theme
+	 * @ticket 54460
+	 *
+	 * @covers WP_Theme::is_block_theme
+	 *
+	 * @param string $theme_dir Directory of the theme to test.
+	 * @param bool   $expected  Expected result.
+	 */
+	public function test_is_block_theme( $theme_dir, $expected ) {
+		$theme = new WP_Theme( $theme_dir, $this->theme_root );
+		$this->assertSame( $expected, $theme->is_block_theme() );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_is_block_theme() {
+		return array(
+			'default - non-block theme' => array(
+				'theme_dir' => 'default',
+				'expected'  => false,
+			),
+			'parent block theme'        => array(
+				'theme_dir' => 'block-theme',
+				'expected'  => true,
+			),
+			'child block theme'         => array(
+				'theme_dir' => 'block-theme-child',
+				'expected'  => true,
+			),
+		);
+	}
+
+	/**
+	 * @dataProvider data_get_file_path
+	 * @ticket 54460
+	 *
+	 * @covers WP_Theme::get_file_path
+	 *
+	 * @param string $theme_dir Directory of the theme to test.
+	 * @param string $file      Given file name to test.
+	 * @param string $expected  Expected file path.
+	 */
+	public function test_get_file_path( $theme_dir, $file, $expected ) {
+		$theme = new WP_Theme( $theme_dir, $this->theme_root );
+
+		$this->assertStringEndsWith( $expected, $theme->get_file_path( $file ) );
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_get_file_path() {
+		return array(
+			'no theme: no file given'           => array(
+				'theme_dir' => 'nonexistent',
+				'file'      => '',
+				'expected'  => '/nonexistent',
+			),
+			'parent theme: no file given'       => array(
+				'theme_dir' => 'block-theme',
+				'file'      => '',
+				'expected'  => '/block-theme',
+			),
+			'child theme: no file given'        => array(
+				'theme_dir' => 'block-theme-child',
+				'file'      => '',
+				'expected'  => '/block-theme-child',
+			),
+			'nonexistent theme: file given'     => array(
+				'theme_dir' => 'nonexistent',
+				'file'      => '/templates/page.html',
+				'expected'  => '/nonexistent/templates/page.html',
+			),
+			'parent theme: file exists'         => array(
+				'theme_dir' => 'block-theme',
+				'file'      => '/templates/page-home.html',
+				'expected'  => '/block-theme/templates/page-home.html',
+			),
+			'parent theme: file does not exist' => array(
+				'theme_dir' => 'block-theme',
+				'file'      => '/templates/nonexistent.html',
+				'expected'  => '/block-theme/templates/nonexistent.html',
+			),
+			'child theme: file exists'          => array(
+				'theme_dir' => 'block-theme-child',
+				'file'      => '/templates/page-1.html',
+				'expected'  => '/block-theme-child/templates/page-1.html',
+			),
+			'child theme: file does not exist'  => array(
+				'theme_dir' => 'block-theme-child',
+				'file'      => '/templates/nonexistent.html',
+				'expected'  => '/block-theme/templates/nonexistent.html',
+			),
+			'child theme: file exists in parent, not in child' => array(
+				'theme_dir' => 'block-theme-child',
+				'file'      => '/templates/page.html',
+				'expected'  => '/block-theme/templates/page.html',
+			),
+		);
+	}
 }
diff --git a/tests/phpunit/tests/theme/wpThemeJson.php b/tests/phpunit/tests/theme/wpThemeJson.php
index 1a663407b6..6d92c3741b 100644
--- a/tests/phpunit/tests/theme/wpThemeJson.php
+++ b/tests/phpunit/tests/theme/wpThemeJson.php
@@ -15,6 +15,7 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 
 	/**
 	 * @ticket 52991
+	 * @ticket 54336
 	 */
 	public function test_get_settings() {
 		$theme_json = new WP_Theme_JSON(
@@ -24,6 +25,10 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 					'color'       => array(
 						'custom' => false,
 					),
+					'layout'      => array(
+						'contentSize' => 'value',
+						'invalid/key' => 'value',
+					),
 					'invalid/key' => 'value',
 					'blocks'      => array(
 						'core/group' => array(
@@ -52,6 +57,9 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 			'color'  => array(
 				'custom' => false,
 			),
+			'layout' => array(
+				'contentSize' => 'value',
+			),
 			'blocks' => array(
 				'core/group' => array(
 					'color' => array(
@@ -61,14 +69,14 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 			),
 		);
 
-		$this->assertSameSetsWithIndex( $expected, $actual );
+		$this->assertEqualSetsWithIndex( $expected, $actual );
 	}
 
 	/**
 	 * @ticket 53397
 	 */
 	public function test_get_settings_presets_are_keyed_by_origin() {
-		$core_origin = new WP_Theme_JSON(
+		$default_origin = new WP_Theme_JSON(
 			array(
 				'version'  => WP_Theme_JSON::LATEST_SCHEMA,
 				'settings' => array(
@@ -95,9 +103,9 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 					),
 				),
 			),
-			'core'
+			'default'
 		);
-		$no_origin   = new WP_Theme_JSON(
+		$no_origin      = new WP_Theme_JSON(
 			array(
 				'version'  => WP_Theme_JSON::LATEST_SCHEMA,
 				'settings' => array(
@@ -126,15 +134,15 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 			)
 		);
 
-		$actual_core      = $core_origin->get_raw_data();
+		$actual_default   = $default_origin->get_raw_data();
 		$actual_no_origin = $no_origin->get_raw_data();
 
-		$expected_core      = array(
+		$expected_default   = array(
 			'version'  => WP_Theme_JSON::LATEST_SCHEMA,
 			'settings' => array(
 				'color'  => array(
 					'palette' => array(
-						'core' => array(
+						'default' => array(
 							array(
 								'slug'  => 'white',
 								'color' => 'white',
@@ -146,7 +154,7 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 					'core/group' => array(
 						'color' => array(
 							'palette' => array(
-								'core' => array(
+								'default' => array(
 									array(
 										'slug'  => 'white',
 										'color' => 'white',
@@ -188,12 +196,241 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 			),
 		);
 
-		$this->assertEqualSetsWithIndex( $expected_core, $actual_core );
+		$this->assertEqualSetsWithIndex( $expected_default, $actual_default );
 		$this->assertEqualSetsWithIndex( $expected_no_origin, $actual_no_origin );
 	}
 
+	function test_get_settings_appearance_true_opts_in() {
+		$theme_json = new WP_Theme_JSON(
+			array(
+				'version'  => WP_Theme_JSON::LATEST_SCHEMA,
+				'settings' => array(
+					'appearanceTools' => true,
+					'spacing'         => array(
+						'blockGap' => false, // This should override appearanceTools.
+					),
+					'blocks'          => array(
+						'core/paragraph' => array(
+							'typography' => array(
+								'lineHeight' => false,
+							),
+						),
+						'core/group'     => array(
+							'appearanceTools' => true,
+							'typography'      => array(
+								'lineHeight' => false, // This should override appearanceTools.
+							),
+							'spacing'         => array(
+								'blockGap' => null,
+							),
+						),
+					),
+				),
+			)
+		);
+
+		$actual   = $theme_json->get_settings();
+		$expected = array(
+			'border'     => array(
+				'width'  => true,
+				'style'  => true,
+				'radius' => true,
+				'color'  => true,
+			),
+			'color'      => array(
+				'link' => true,
+			),
+			'spacing'    => array(
+				'blockGap' => false,
+				'margin'   => true,
+				'padding'  => true,
+			),
+			'typography' => array(
+				'lineHeight' => true,
+			),
+			'blocks'     => array(
+				'core/paragraph' => array(
+					'typography' => array(
+						'lineHeight' => false,
+					),
+				),
+				'core/group'     => array(
+					'border'     => array(
+						'width'  => true,
+						'style'  => true,
+						'radius' => true,
+						'color'  => true,
+					),
+					'color'      => array(
+						'link' => true,
+					),
+					'spacing'    => array(
+						'blockGap' => false,
+						'margin'   => true,
+						'padding'  => true,
+					),
+					'typography' => array(
+						'lineHeight' => false,
+					),
+				),
+			),
+		);
+
+		$this->assertEqualSetsWithIndex( $expected, $actual );
+	}
+
+	function test_get_settings_appearance_false_does_not_opt_in() {
+		$theme_json = new WP_Theme_JSON(
+			array(
+				'version'  => WP_Theme_JSON::LATEST_SCHEMA,
+				'settings' => array(
+					'appearanceTools' => false,
+					'border'          => array(
+						'width' => true,
+					),
+					'blocks'          => array(
+						'core/paragraph' => array(
+							'typography' => array(
+								'lineHeight' => false,
+							),
+						),
+						'core/group'     => array(
+							'typography' => array(
+								'lineHeight' => false,
+							),
+						),
+					),
+				),
+			)
+		);
+
+		$actual   = $theme_json->get_settings();
+		$expected = array(
+			'appearanceTools' => false,
+			'border'          => array(
+				'width' => true,
+			),
+			'blocks'          => array(
+				'core/paragraph' => array(
+					'typography' => array(
+						'lineHeight' => false,
+					),
+				),
+				'core/group'     => array(
+					'typography' => array(
+						'lineHeight' => false,
+					),
+				),
+			),
+		);
+
+		$this->assertEqualSetsWithIndex( $expected, $actual );
+	}
+
+	/**
+	 * @ticket 54336
+	 */
+	public function test_get_stylesheet_support_for_shorthand_and_longhand_values() {
+		$theme_json = new WP_Theme_JSON(
+			array(
+				'version' => WP_Theme_JSON::LATEST_SCHEMA,
+				'styles'  => array(
+					'blocks' => array(
+						'core/group' => array(
+							'border'  => array(
+								'radius' => '10px',
+							),
+							'spacing' => array(
+								'padding' => '24px',
+								'margin'  => '1em',
+							),
+						),
+						'core/image' => array(
+							'border'  => array(
+								'radius' => array(
+									'topLeft'     => '10px',
+									'bottomRight' => '1em',
+								),
+							),
+							'spacing' => array(
+								'padding' => array(
+									'top' => '15px',
+								),
+								'margin'  => array(
+									'bottom' => '30px',
+								),
+							),
+						),
+					),
+				),
+			)
+		);
+
+		$styles = 'body { margin: 0; }.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }.wp-site-blocks > .alignright { float: right; margin-left: 2em; }.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }.wp-block-group{border-radius: 10px;margin: 1em;padding: 24px;}.wp-block-image{border-top-left-radius: 10px;border-bottom-right-radius: 1em;margin-bottom: 30px;padding-top: 15px;}';
+		$this->assertEquals( $styles, $theme_json->get_stylesheet() );
+		$this->assertEquals( $styles, $theme_json->get_stylesheet( array( 'styles' ) ) );
+	}
+
+	/**
+	 * @ticket 54336
+	 */
+	public function test_get_stylesheet_skips_disabled_protected_properties() {
+		$theme_json = new WP_Theme_JSON(
+			array(
+				'version'  => WP_Theme_JSON::LATEST_SCHEMA,
+				'settings' => array(
+					'spacing' => array(
+						'blockGap' => null,
+					),
+				),
+				'styles'   => array(
+					'spacing' => array(
+						'blockGap' => '1em',
+					),
+					'blocks'  => array(
+						'core/columns' => array(
+							'spacing' => array(
+								'blockGap' => '24px',
+							),
+						),
+					),
+				),
+			)
+		);
+
+		$expected = 'body { margin: 0; }.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }.wp-site-blocks > .alignright { float: right; margin-left: 2em; }.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }';
+		$this->assertEquals( $expected, $theme_json->get_stylesheet() );
+		$this->assertEquals( $expected, $theme_json->get_stylesheet( array( 'styles' ) ) );
+	}
+
+	/**
+	 * @ticket 54336
+	 */
+	public function test_get_stylesheet_renders_enabled_protected_properties() {
+		$theme_json = new WP_Theme_JSON(
+			array(
+				'version'  => WP_Theme_JSON::LATEST_SCHEMA,
+				'settings' => array(
+					'spacing' => array(
+						'blockGap' => true,
+					),
+				),
+				'styles'   => array(
+					'spacing' => array(
+						'blockGap' => '1em',
+					),
+				),
+			)
+		);
+
+		$expected = 'body { margin: 0; }body{--wp--style--block-gap: 1em;}.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }.wp-site-blocks > .alignright { float: right; margin-left: 2em; }.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }.wp-site-blocks > * { margin-top: 0; margin-bottom: 0; }.wp-site-blocks > * + * { margin-top: var( --wp--style--block-gap ); }';
+		$this->assertSame( $expected, $theme_json->get_stylesheet() );
+		$this->assertSame( $expected, $theme_json->get_stylesheet( array( 'styles' ) ) );
+	}
+
 	/**
 	 * @ticket 53175
+	 * @ticket 54336
 	 */
 	public function test_get_stylesheet() {
 		$theme_json = new WP_Theme_JSON(
@@ -221,6 +458,9 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 							),
 						),
 					),
+					'spacing'    => array(
+						'blockGap' => false,
+					),
 					'misc'       => 'value',
 					'blocks'     => array(
 						'core/group' => array(
@@ -250,6 +490,9 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 					),
 					'blocks'   => array(
 						'core/group'     => array(
+							'border'   => array(
+								'radius' => '10px',
+							),
 							'elements' => array(
 								'link' => array(
 									'color' => array(
@@ -258,10 +501,7 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 								),
 							),
 							'spacing'  => array(
-								'padding' => array(
-									'top'    => '12px',
-									'bottom' => '24px',
-								),
+								'padding' => '24px',
 							),
 						),
 						'core/heading'   => array(
@@ -293,28 +533,38 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 								),
 							),
 						),
+						'core/image'     => array(
+							'border'  => array(
+								'radius' => array(
+									'topLeft'     => '10px',
+									'bottomRight' => '1em',
+								),
+							),
+							'spacing' => array(
+								'margin' => array(
+									'bottom' => '30px',
+								),
+							),
+						),
 					),
 				),
 				'misc'     => 'value',
 			)
 		);
 
-		$this->assertSame(
-			'body{--wp--preset--color--grey: grey;}.wp-block-group{--wp--custom--base-font: 16;--wp--custom--line-height--small: 1.2;--wp--custom--line-height--medium: 1.4;--wp--custom--line-height--large: 1.8;}body{color: var(--wp--preset--color--grey);}a{background-color: #333;color: #111;}.wp-block-group{padding-top: 12px;padding-bottom: 24px;}.wp-block-group a{color: #111;}h1,h2,h3,h4,h5,h6{color: #123456;}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{background-color: #333;color: #111;font-size: 60px;}.wp-block-post-date{color: #123456;}.wp-block-post-date a{background-color: #777;color: #555;}.has-grey-color{color: var(--wp--preset--color--grey) !important;}.has-grey-background-color{background-color: var(--wp--preset--color--grey) !important;}',
-			$theme_json->get_stylesheet()
-		);
-		$this->assertSame(
-			'body{color: var(--wp--preset--color--grey);}a{background-color: #333;color: #111;}.wp-block-group{padding-top: 12px;padding-bottom: 24px;}.wp-block-group a{color: #111;}h1,h2,h3,h4,h5,h6{color: #123456;}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{background-color: #333;color: #111;font-size: 60px;}.wp-block-post-date{color: #123456;}.wp-block-post-date a{background-color: #777;color: #555;}.has-grey-color{color: var(--wp--preset--color--grey) !important;}.has-grey-background-color{background-color: var(--wp--preset--color--grey) !important;}',
-			$theme_json->get_stylesheet( 'block_styles' )
-		);
-		$this->assertSame(
-			'body{--wp--preset--color--grey: grey;}.wp-block-group{--wp--custom--base-font: 16;--wp--custom--line-height--small: 1.2;--wp--custom--line-height--medium: 1.4;--wp--custom--line-height--large: 1.8;}',
-			$theme_json->get_stylesheet( 'css_variables' )
-		);
+		$variables = 'body{--wp--preset--color--grey: grey;--wp--preset--font-family--small: 14px;--wp--preset--font-family--big: 41px;}.wp-block-group{--wp--custom--base-font: 16;--wp--custom--line-height--small: 1.2;--wp--custom--line-height--medium: 1.4;--wp--custom--line-height--large: 1.8;}';
+		$styles    = 'body { margin: 0; }body{color: var(--wp--preset--color--grey);}.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }.wp-site-blocks > .alignright { float: right; margin-left: 2em; }.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }.wp-site-blocks > * { margin-top: 0; margin-bottom: 0; }.wp-site-blocks > * + * { margin-top: var( --wp--style--block-gap ); }a{background-color: #333;color: #111;}.wp-block-group{border-radius: 10px;padding: 24px;}.wp-block-group a{color: #111;}h1,h2,h3,h4,h5,h6{color: #123456;}h1 a,h2 a,h3 a,h4 a,h5 a,h6 a{background-color: #333;color: #111;font-size: 60px;}.wp-block-post-date{color: #123456;}.wp-block-post-date a{background-color: #777;color: #555;}.wp-block-image{border-top-left-radius: 10px;border-bottom-right-radius: 1em;margin-bottom: 30px;}';
+		$presets   = '.has-grey-color{color: var(--wp--preset--color--grey) !important;}.has-grey-background-color{background-color: var(--wp--preset--color--grey) !important;}.has-grey-border-color{border-color: var(--wp--preset--color--grey) !important;}.has-small-font-family{font-family: var(--wp--preset--font-family--small) !important;}.has-big-font-family{font-family: var(--wp--preset--font-family--big) !important;}';
+		$all       = $variables . $styles . $presets;
+		$this->assertSame( $all, $theme_json->get_stylesheet() );
+		$this->assertSame( $styles, $theme_json->get_stylesheet( array( 'styles' ) ) );
+		$this->assertSame( $presets, $theme_json->get_stylesheet( array( 'presets' ) ) );
+		$this->assertSame( $variables, $theme_json->get_stylesheet( array( 'variables' ) ) );
 	}
 
 	/**
 	 * @ticket 52991
+	 * @ticket 54336
 	 */
 	public function test_get_stylesheet_preset_classes_work_with_compounded_selectors() {
 		$theme_json = new WP_Theme_JSON(
@@ -337,14 +587,15 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 			)
 		);
 
-		$this->assertSame(
-			'h1.has-white-color,h2.has-white-color,h3.has-white-color,h4.has-white-color,h5.has-white-color,h6.has-white-color{color: var(--wp--preset--color--white) !important;}h1.has-white-background-color,h2.has-white-background-color,h3.has-white-background-color,h4.has-white-background-color,h5.has-white-background-color,h6.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}',
-			$theme_json->get_stylesheet( 'block_styles' )
+		$this->assertEquals(
+			'h1.has-white-color,h2.has-white-color,h3.has-white-color,h4.has-white-color,h5.has-white-color,h6.has-white-color{color: var(--wp--preset--color--white) !important;}h1.has-white-background-color,h2.has-white-background-color,h3.has-white-background-color,h4.has-white-background-color,h5.has-white-background-color,h6.has-white-background-color{background-color: var(--wp--preset--color--white) !important;}h1.has-white-border-color,h2.has-white-border-color,h3.has-white-border-color,h4.has-white-border-color,h5.has-white-border-color,h6.has-white-border-color{border-color: var(--wp--preset--color--white) !important;}',
+			$theme_json->get_stylesheet( array( 'presets' ) )
 		);
 	}
 
 	/**
 	 * @ticket 53175
+	 * @ticket 54336
 	 */
 	public function test_get_stylesheet_preset_rules_come_after_block_rules() {
 		$theme_json = new WP_Theme_JSON(
@@ -376,18 +627,65 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 			)
 		);
 
-		$this->assertSame(
-			'.wp-block-group{--wp--preset--color--grey: grey;}.wp-block-group{color: red;}.wp-block-group.has-grey-color{color: var(--wp--preset--color--grey) !important;}.wp-block-group.has-grey-background-color{background-color: var(--wp--preset--color--grey) !important;}',
-			$theme_json->get_stylesheet()
+		$styles    = 'body { margin: 0; }.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }.wp-site-blocks > .alignright { float: right; margin-left: 2em; }.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }.wp-block-group{color: red;}';
+		$presets   = '.wp-block-group.has-grey-color{color: var(--wp--preset--color--grey) !important;}.wp-block-group.has-grey-background-color{background-color: var(--wp--preset--color--grey) !important;}.wp-block-group.has-grey-border-color{border-color: var(--wp--preset--color--grey) !important;}';
+		$variables = '.wp-block-group{--wp--preset--color--grey: grey;}';
+		$all       = $variables . $styles . $presets;
+		$this->assertEquals( $all, $theme_json->get_stylesheet() );
+		$this->assertEquals( $styles, $theme_json->get_stylesheet( array( 'styles' ) ) );
+		$this->assertEquals( $presets, $theme_json->get_stylesheet( array( 'presets' ) ) );
+		$this->assertEquals( $variables, $theme_json->get_stylesheet( array( 'variables' ) ) );
+	}
+
+	/**
+	 * @ticket 54336
+	 */
+	public function test_get_stylesheet_generates_proper_classes_and_css_vars_from_slugs() {
+		$theme_json = new WP_Theme_JSON(
+			array(
+				'version'  => WP_Theme_JSON::LATEST_SCHEMA,
+				'settings' => array(
+					'color'  => array(
+						'palette' => array(
+							array(
+								'slug'  => 'grey',
+								'color' => 'grey',
+							),
+							array(
+								'slug'  => 'dark grey',
+								'color' => 'grey',
+							),
+							array(
+								'slug'  => 'light-grey',
+								'color' => 'grey',
+							),
+							array(
+								'slug'  => 'white2black',
+								'color' => 'grey',
+							),
+						),
+					),
+					'custom' => array(
+						'white2black' => 'value',
+					),
+				),
+			)
+		);
+
+		$this->assertEquals(
+			'.has-grey-color{color: var(--wp--preset--color--grey) !important;}.has-dark-grey-color{color: var(--wp--preset--color--dark-grey) !important;}.has-light-grey-color{color: var(--wp--preset--color--light-grey) !important;}.has-white-2-black-color{color: var(--wp--preset--color--white-2-black) !important;}.has-grey-background-color{background-color: var(--wp--preset--color--grey) !important;}.has-dark-grey-background-color{background-color: var(--wp--preset--color--dark-grey) !important;}.has-light-grey-background-color{background-color: var(--wp--preset--color--light-grey) !important;}.has-white-2-black-background-color{background-color: var(--wp--preset--color--white-2-black) !important;}.has-grey-border-color{border-color: var(--wp--preset--color--grey) !important;}.has-dark-grey-border-color{border-color: var(--wp--preset--color--dark-grey) !important;}.has-light-grey-border-color{border-color: var(--wp--preset--color--light-grey) !important;}.has-white-2-black-border-color{border-color: var(--wp--preset--color--white-2-black) !important;}',
+			$theme_json->get_stylesheet( array( 'presets' ) )
 		);
-		$this->assertSame(
-			'.wp-block-group{color: red;}.wp-block-group.has-grey-color{color: var(--wp--preset--color--grey) !important;}.wp-block-group.has-grey-background-color{background-color: var(--wp--preset--color--grey) !important;}',
-			$theme_json->get_stylesheet( 'block_styles' )
+		$this->assertEquals(
+			'body{--wp--preset--color--grey: grey;--wp--preset--color--dark-grey: grey;--wp--preset--color--light-grey: grey;--wp--preset--color--white-2-black: grey;--wp--custom--white-2-black: value;}',
+			$theme_json->get_stylesheet( array( 'variables' ) )
 		);
+
 	}
 
 	/**
 	 * @ticket 53175
+	 * @ticket 54336
 	 */
 	public function test_get_stylesheet_preset_values_are_marked_as_important() {
 		$theme_json = new WP_Theme_JSON(
@@ -418,17 +716,18 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 					),
 				),
 			),
-			'core'
+			'default'
 		);
 
-		$this->assertSame(
-			'body{--wp--preset--color--grey: grey;}p{background-color: blue;color: red;font-size: 12px;line-height: 1.3;}.has-grey-color{color: var(--wp--preset--color--grey) !important;}.has-grey-background-color{background-color: var(--wp--preset--color--grey) !important;}',
+		$this->assertEquals(
+			'body{--wp--preset--color--grey: grey;}body { margin: 0; }.wp-site-blocks > .alignleft { float: left; margin-right: 2em; }.wp-site-blocks > .alignright { float: right; margin-left: 2em; }.wp-site-blocks > .aligncenter { justify-content: center; margin-left: auto; margin-right: auto; }p{background-color: blue;color: red;font-size: 12px;line-height: 1.3;}.has-grey-color{color: var(--wp--preset--color--grey) !important;}.has-grey-background-color{background-color: var(--wp--preset--color--grey) !important;}.has-grey-border-color{border-color: var(--wp--preset--color--grey) !important;}',
 			$theme_json->get_stylesheet()
 		);
 	}
 
 	/**
 	 * @ticket 52991
+	 * @ticket 54336
 	 */
 	public function test_merge_incoming_data() {
 		$theme_json = new WP_Theme_JSON(
@@ -608,7 +907,7 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 					),
 				),
 				'typography' => array(
-					'fontSizes' => array(
+					'fontSizes'    => array(
 						'theme' => array(
 							array(
 								'slug' => 'fontSize',
@@ -616,6 +915,14 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 							),
 						),
 					),
+					'fontFamilies' => array(
+						'theme' => array(
+							array(
+								'slug'       => 'fontFamily',
+								'fontFamily' => 'fontFamily',
+							),
+						),
+					),
 				),
 				'blocks'     => array(
 					'core/paragraph' => array(
@@ -669,6 +976,7 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 
 	/**
 	 * @ticket 53175
+	 * @ticket 54336
 	 */
 	public function test_merge_incoming_data_empty_presets() {
 		$theme_json = new WP_Theme_JSON(
@@ -736,7 +1044,9 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 			'version'  => WP_Theme_JSON::LATEST_SCHEMA,
 			'settings' => array(
 				'color'      => array(
-					'duotone'   => array(),
+					'duotone'   => array(
+						'theme' => array(),
+					),
 					'gradients' => array(
 						'theme' => array(),
 					),
@@ -760,6 +1070,7 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 
 	/**
 	 * @ticket 53175
+	 * @ticket 54336
 	 */
 	public function test_merge_incoming_data_null_presets() {
 		$theme_json = new WP_Theme_JSON(
@@ -810,10 +1121,10 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 							'custom' => false,
 						),
 						'spacing'    => array(
-							'customMargin' => false,
+							'margin' => false,
 						),
 						'typography' => array(
-							'customLineHeight' => false,
+							'lineHeight' => false,
 						),
 					),
 				)
@@ -827,9 +1138,11 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 				'color'      => array(
 					'custom'    => false,
 					'duotone'   => array(
-						array(
-							'slug'   => 'value',
-							'colors' => array( 'red', 'green' ),
+						'theme' => array(
+							array(
+								'slug'   => 'value',
+								'colors' => array( 'red', 'green' ),
+							),
 						),
 					),
 					'gradients' => array(
@@ -850,12 +1163,12 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 					),
 				),
 				'spacing'    => array(
-					'customMargin' => false,
-					'units'        => array( 'px', 'em' ),
+					'margin' => false,
+					'units'  => array( 'px', 'em' ),
 				),
 				'typography' => array(
-					'customLineHeight' => false,
-					'fontSizes'        => array(
+					'lineHeight' => false,
+					'fontSizes'  => array(
 						'theme' => array(
 							array(
 								'slug'  => 'size',
@@ -870,44 +1183,1006 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 		$this->assertEqualSetsWithIndex( $expected, $actual );
 	}
 
-	/**
-	 * @ticket 52991
-	 */
-	public function test_get_from_editor_settings() {
-		$input = array(
-			'disableCustomColors'    => true,
-			'disableCustomGradients' => true,
-			'disableCustomFontSizes' => true,
-			'enableCustomLineHeight' => true,
-			'enableCustomUnits'      => true,
-			'colors'                 => array(
-				array(
-					'slug'  => 'color-slug',
-					'name'  => 'Color Name',
-					'color' => 'colorvalue',
-				),
-			),
-			'gradients'              => array(
-				array(
-					'slug'     => 'gradient-slug',
-					'name'     => 'Gradient Name',
-					'gradient' => 'gradientvalue',
-				),
-			),
-			'fontSizes'              => array(
-				array(
-					'slug' => 'size-slug',
-					'name' => 'Size Name',
-					'size' => 'sizevalue',
+	public function test_merge_incoming_data_color_presets_with_same_slugs_as_default_are_removed() {
+		$defaults = new WP_Theme_JSON(
+			array(
+				'version'  => WP_Theme_JSON::LATEST_SCHEMA,
+				'settings' => array(
+					'color'  => array(
+						'defaultPalette' => true,
+						'palette'        => array(
+							array(
+								'slug'  => 'red',
+								'color' => 'red',
+								'name'  => 'Red',
+							),
+							array(
+								'slug'  => 'green',
+								'color' => 'green',
+								'name'  => 'Green',
+							),
+						),
+					),
+					'blocks' => array(
+						'core/paragraph' => array(
+							'color' => array(
+								'palette' => array(
+									array(
+										'slug'  => 'blue',
+										'color' => 'blue',
+										'name'  => 'Blue',
+									),
+								),
+							),
+						),
+					),
 				),
 			),
+			'default'
 		);
-
-		$expected = array(
-			'version'  => WP_Theme_JSON::LATEST_SCHEMA,
-			'settings' => array(
-				'color'      => array(
-					'custom'         => false,
+		$theme    = new WP_Theme_JSON(
+			array(
+				'version'  => WP_Theme_JSON::LATEST_SCHEMA,
+				'settings' => array(
+					'color'  => array(
+						'palette' => array(
+							array(
+								'slug'  => 'pink',
+								'color' => 'pink',
+								'name'  => 'Pink',
+							),
+							array(
+								'slug'  => 'green',
+								'color' => 'green',
+								'name'  => 'Greenish',
+							),
+						),
+					),
+					'blocks' => array(
+						'core/paragraph' => array(
+							'color' => array(
+								'palette' => array(
+									array(
+										'slug'  => 'blue',
+										'color' => 'blue',
+										'name'  => 'Bluish',
+									),
+									array(
+										'slug'  => 'yellow',
+										'color' => 'yellow',
+										'name'  => 'Yellow',
+									),
+									array(
+										'slug'  => 'green',
+										'color' => 'green',
+										'name'  => 'Block Green',
+									),
+								),
+							),
+						),
+					),
+				),
+			)
+		);
+
+		$expected = array(
+			'version'  => WP_Theme_JSON::LATEST_SCHEMA,
+			'settings' => array(
+				'color'  => array(
+					'palette'        => array(
+						'default' => array(
+							array(
+								'slug'  => 'red',
+								'color' => 'red',
+								'name'  => 'Red',
+							),
+							array(
+								'slug'  => 'green',
+								'color' => 'green',
+								'name'  => 'Green',
+							),
+						),
+						'theme'   => array(
+							array(
+								'slug'  => 'pink',
+								'color' => 'pink',
+								'name'  => 'Pink',
+							),
+						),
+					),
+					'defaultPalette' => true,
+				),
+				'blocks' => array(
+					'core/paragraph' => array(
+						'color' => array(
+							'palette' => array(
+								'default' => array(
+									array(
+										'slug'  => 'blue',
+										'color' => 'blue',
+										'name'  => 'Blue',
+									),
+								),
+								'theme'   => array(
+									array(
+										'slug'  => 'yellow',
+										'color' => 'yellow',
+										'name'  => 'Yellow',
+									),
+								),
+							),
+						),
+					),
+				),
+			),
+		);
+
+		$defaults->merge( $theme );
+		$actual = $defaults->get_raw_data();
+
+		$this->assertEqualSetsWithIndex( $expected, $actual );
+	}
+
+	public function test_merge_incoming_data_color_presets_with_same_slugs_as_default_are_not_removed_if_defaults_are_disabled() {
+		$defaults = new WP_Theme_JSON(
+			array(
+				'version'  => WP_Theme_JSON::LATEST_SCHEMA,
+				'settings' => array(
+					'color'  => array(
+						'defaultPalette' => true, // Emulate the defaults from core theme.json.
+						'palette'        => array(
+							array(
+								'slug'  => 'red',
+								'color' => 'red',
+								'name'  => 'Red',
+							),
+							array(
+								'slug'  => 'green',
+								'color' => 'green',
+								'name'  => 'Green',
+							),
+						),
+					),
+					'blocks' => array(
+						'core/paragraph' => array(
+							'color' => array(
+								'palette' => array(
+									array(
+										'slug'  => 'blue',
+										'color' => 'blue',
+										'name'  => 'Blue',
+									),
+								),
+							),
+						),
+					),
+				),
+			),
+			'default'
+		);
+		$theme    = new WP_Theme_JSON(
+			array(
+				'version'  => WP_Theme_JSON::LATEST_SCHEMA,
+				'settings' => array(
+					'color'  => array(
+						'defaultPalette' => false,
+						'palette'        => array(
+							array(
+								'slug'  => 'pink',
+								'color' => 'pink',
+								'name'  => 'Pink',
+							),
+							array(
+								'slug'  => 'green',
+								'color' => 'green',
+								'name'  => 'Greenish',
+							),
+						),
+					),
+					'blocks' => array(
+						'core/paragraph' => array(
+							'color' => array(
+								'palette' => array(
+									array(
+										'slug'  => 'blue',
+										'color' => 'blue',
+										'name'  => 'Bluish',
+									),
+									array(
+										'slug'  => 'yellow',
+										'color' => 'yellow',
+										'name'  => 'Yellow',
+									),
+									array(
+										'slug'  => 'green',
+										'color' => 'green',
+										'name'  => 'Block Green',
+									),
+								),
+							),
+						),
+					),
+				),
+			)
+		);
+
+		$expected = array(
+			'version'  => WP_Theme_JSON::LATEST_SCHEMA,
+			'settings' => array(
+				'color'  => array(
+					'defaultPalette' => false,
+					'palette'        => array(
+						'default' => array(
+							array(
+								'slug'  => 'red',
+								'color' => 'red',
+								'name'  => 'Red',
+							),
+							array(
+								'slug'  => 'green',
+								'color' => 'green',
+								'name'  => 'Green',
+							),
+						),
+						'theme'   => array(
+							array(
+								'slug'  => 'pink',
+								'color' => 'pink',
+								'name'  => 'Pink',
+							),
+							array(
+								'slug'  => 'green',
+								'color' => 'green',
+								'name'  => 'Greenish',
+							),
+						),
+					),
+				),
+				'blocks' => array(
+					'core/paragraph' => array(
+						'color' => array(
+							'palette' => array(
+								'default' => array(
+									array(
+										'slug'  => 'blue',
+										'color' => 'blue',
+										'name'  => 'Blue',
+									),
+								),
+								'theme'   => array(
+									array(
+										'slug'  => 'blue',
+										'color' => 'blue',
+										'name'  => 'Bluish',
+									),
+									array(
+										'slug'  => 'yellow',
+										'color' => 'yellow',
+										'name'  => 'Yellow',
+									),
+									array(
+										'slug'  => 'green',
+										'color' => 'green',
+										'name'  => 'Block Green',
+									),
+								),
+							),
+						),
+					),
+				),
+			),
+		);
+
+		$defaults->merge( $theme );
+		$actual = $defaults->get_raw_data();
+
+		$this->assertEqualSetsWithIndex( $expected, $actual );
+	}
+
+	/**
+	 * @ticket 54640
+	 */
+	public function test_merge_incoming_data_presets_use_default_names() {
+		$defaults   = new WP_Theme_JSON(
+			array(
+				'version'  => WP_Theme_JSON::LATEST_SCHEMA,
+				'settings' => array(
+					'typography' => array(
+						'fontSizes' => array(
+							array(
+								'name' => 'Small',
+								'slug' => 'small',
+								'size' => '12px',
+							),
+							array(
+								'name' => 'Large',
+								'slug' => 'large',
+								'size' => '20px',
+							),
+						),
+					),
+				),
+			),
+			'default'
+		);
+		$theme_json = new WP_Theme_JSON(
+			array(
+				'version'  => WP_Theme_JSON::LATEST_SCHEMA,
+				'settings' => array(
+					'typography' => array(
+						'fontSizes' => array(
+							array(
+								'slug' => 'small',
+								'size' => '1.1rem',
+							),
+							array(
+								'slug' => 'large',
+								'size' => '1.75rem',
+							),
+							array(
+								'name' => 'Huge',
+								'slug' => 'huge',
+								'size' => '3rem',
+							),
+						),
+					),
+				),
+			),
+			'theme'
+		);
+		$expected   = array(
+			'version'  => WP_Theme_JSON::LATEST_SCHEMA,
+			'settings' => array(
+				'typography' => array(
+					'fontSizes' => array(
+						'default' => array(
+							array(
+								'name' => 'Small',
+								'slug' => 'small',
+								'size' => '12px',
+							),
+							array(
+								'name' => 'Large',
+								'slug' => 'large',
+								'size' => '20px',
+							),
+						),
+						'theme'   => array(
+							array(
+								'slug' => 'small',
+								'size' => '1.1rem',
+								'name' => 'Small',
+							),
+							array(
+								'slug' => 'large',
+								'size' => '1.75rem',
+								'name' => 'Large',
+							),
+							array(
+								'name' => 'Huge',
+								'slug' => 'huge',
+								'size' => '3rem',
+							),
+						),
+					),
+				),
+			),
+		);
+		$defaults->merge( $theme_json );
+		$actual = $defaults->get_raw_data();
+		$this->assertSameSetsWithIndex( $expected, $actual );
+	}
+
+	/**
+	 * @ticket 54336
+	 */
+	public function test_remove_insecure_properties_removes_unsafe_styles() {
+		$actual = WP_Theme_JSON::remove_insecure_properties(
+			array(
+				'version' => WP_Theme_JSON::LATEST_SCHEMA,
+				'styles'  => array(
+					'color'    => array(
+						'gradient' => 'url(\'data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxMCcgaGVpZ2h0PScxMCc+PHNjcmlwdD5hbGVydCgnb2snKTwvc2NyaXB0PjxsaW5lYXJHcmFkaWVudCBpZD0nZ3JhZGllbnQnPjxzdG9wIG9mZnNldD0nMTAlJyBzdG9wLWNvbG9yPScjRjAwJy8+PHN0b3Agb2Zmc2V0PSc5MCUnIHN0b3AtY29sb3I9JyNmY2MnLz4gPC9saW5lYXJHcmFkaWVudD48cmVjdCBmaWxsPSd1cmwoI2dyYWRpZW50KScgeD0nMCcgeT0nMCcgd2lkdGg9JzEwMCUnIGhlaWdodD0nMTAwJScvPjwvc3ZnPg==\')',
+						'text'     => 'var:preset|color|dark-red',
+					),
+					'elements' => array(
+						'link' => array(
+							'color' => array(
+								'gradient'   => 'url(\'data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxMCcgaGVpZ2h0PScxMCc+PHNjcmlwdD5hbGVydCgnb2snKTwvc2NyaXB0PjxsaW5lYXJHcmFkaWVudCBpZD0nZ3JhZGllbnQnPjxzdG9wIG9mZnNldD0nMTAlJyBzdG9wLWNvbG9yPScjRjAwJy8+PHN0b3Agb2Zmc2V0PSc5MCUnIHN0b3AtY29sb3I9JyNmY2MnLz4gPC9saW5lYXJHcmFkaWVudD48cmVjdCBmaWxsPSd1cmwoI2dyYWRpZW50KScgeD0nMCcgeT0nMCcgd2lkdGg9JzEwMCUnIGhlaWdodD0nMTAwJScvPjwvc3ZnPg==\')',
+								'text'       => 'var:preset|color|dark-pink',
+								'background' => 'var:preset|color|dark-red',
+							),
+						),
+					),
+					'blocks'   => array(
+						'core/image'  => array(
+							'filter' => array(
+								'duotone' => 'var:preset|duotone|blue-red',
+							),
+						),
+						'core/cover'  => array(
+							'filter' => array(
+								'duotone' => 'var(--wp--preset--duotone--blue-red, var(--fallback-unsafe))',
+							),
+						),
+						'core/group'  => array(
+							'color'    => array(
+								'gradient' => 'url(\'data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxMCcgaGVpZ2h0PScxMCc+PHNjcmlwdD5hbGVydCgnb2snKTwvc2NyaXB0PjxsaW5lYXJHcmFkaWVudCBpZD0nZ3JhZGllbnQnPjxzdG9wIG9mZnNldD0nMTAlJyBzdG9wLWNvbG9yPScjRjAwJy8+PHN0b3Agb2Zmc2V0PSc5MCUnIHN0b3AtY29sb3I9JyNmY2MnLz4gPC9saW5lYXJHcmFkaWVudD48cmVjdCBmaWxsPSd1cmwoI2dyYWRpZW50KScgeD0nMCcgeT0nMCcgd2lkdGg9JzEwMCUnIGhlaWdodD0nMTAwJScvPjwvc3ZnPg==\')',
+								'text'     => 'var:preset|color|dark-gray',
+							),
+							'elements' => array(
+								'link' => array(
+									'color' => array(
+										'gradient' => 'url(\'data:image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHdpZHRoPScxMCcgaGVpZ2h0PScxMCc+PHNjcmlwdD5hbGVydCgnb2snKTwvc2NyaXB0PjxsaW5lYXJHcmFkaWVudCBpZD0nZ3JhZGllbnQnPjxzdG9wIG9mZnNldD0nMTAlJyBzdG9wLWNvbG9yPScjRjAwJy8+PHN0b3Agb2Zmc2V0PSc5MCUnIHN0b3AtY29sb3I9JyNmY2MnLz4gPC9saW5lYXJHcmFkaWVudD48cmVjdCBmaWxsPSd1cmwoI2dyYWRpZW50KScgeD0nMCcgeT0nMCcgd2lkdGg9JzEwMCUnIGhlaWdodD0nMTAwJScvPjwvc3ZnPg==\')',
+										'text'     => 'var:preset|color|dark-pink',
+									),
+								),
+							),
+						),
+						'invalid/key' => array(
+							'background' => 'green',
+						),
+					),
+				),
+			)
+		);
+
+		$expected = array(
+			'version' => WP_Theme_JSON::LATEST_SCHEMA,
+			'styles'  => array(
+				'color'    => array(
+					'text' => 'var:preset|color|dark-red',
+				),
+				'elements' => array(
+					'link' => array(
+						'color' => array(
+							'text'       => 'var:preset|color|dark-pink',
+							'background' => 'var:preset|color|dark-red',
+						),
+					),
+				),
+				'blocks'   => array(
+					'core/image' => array(
+						'filter' => array(
+							'duotone' => 'var:preset|duotone|blue-red',
+						),
+					),
+					'core/group' => array(
+						'color'    => array(
+							'text' => 'var:preset|color|dark-gray',
+						),
+						'elements' => array(
+							'link' => array(
+								'color' => array(
+									'text' => 'var:preset|color|dark-pink',
+								),
+							),
+						),
+					),
+				),
+			),
+		);
+		$this->assertEqualSetsWithIndex( $expected, $actual );
+	}
+
+	/**
+	 * @ticket 54336
+	 */
+	public function test_remove_insecure_properties_removes_unsafe_styles_sub_properties() {
+		$actual = WP_Theme_JSON::remove_insecure_properties(
+			array(
+				'version' => WP_Theme_JSON::LATEST_SCHEMA,
+				'styles'  => array(
+					'border'   => array(
+						'radius' => array(
+							'topLeft'     => '6px',
+							'topRight'    => 'var(--top-right, var(--unsafe-fallback))',
+							'bottomRight' => '6px',
+							'bottomLeft'  => '6px',
+						),
+					),
+					'spacing'  => array(
+						'padding' => array(
+							'top'    => '1px',
+							'right'  => '1px',
+							'bottom' => 'var(--bottom, var(--unsafe-fallback))',
+							'left'   => '1px',
+						),
+					),
+					'elements' => array(
+						'link' => array(
+							'spacing' => array(
+								'padding' => array(
+									'top'    => '2px',
+									'right'  => '2px',
+									'bottom' => 'var(--bottom, var(--unsafe-fallback))',
+									'left'   => '2px',
+								),
+							),
+						),
+					),
+					'blocks'   => array(
+						'core/group' => array(
+							'border'   => array(
+								'radius' => array(
+									'topLeft'     => '5px',
+									'topRight'    => 'var(--top-right, var(--unsafe-fallback))',
+									'bottomRight' => '5px',
+									'bottomLeft'  => '5px',
+								),
+							),
+							'spacing'  => array(
+								'padding' => array(
+									'top'    => '3px',
+									'right'  => '3px',
+									'bottom' => 'var(bottom, var(--unsafe-fallback))',
+									'left'   => '3px',
+								),
+							),
+							'elements' => array(
+								'link' => array(
+									'spacing' => array(
+										'padding' => array(
+											'top'    => '4px',
+											'right'  => '4px',
+											'bottom' => 'var(--bottom, var(--unsafe-fallback))',
+											'left'   => '4px',
+										),
+									),
+								),
+							),
+						),
+					),
+				),
+			),
+			true
+		);
+
+		$expected = array(
+			'version' => WP_Theme_JSON::LATEST_SCHEMA,
+			'styles'  => array(
+				'border'   => array(
+					'radius' => array(
+						'topLeft'     => '6px',
+						'bottomRight' => '6px',
+						'bottomLeft'  => '6px',
+					),
+				),
+				'spacing'  => array(
+					'padding' => array(
+						'top'   => '1px',
+						'right' => '1px',
+						'left'  => '1px',
+					),
+				),
+				'elements' => array(
+					'link' => array(
+						'spacing' => array(
+							'padding' => array(
+								'top'   => '2px',
+								'right' => '2px',
+								'left'  => '2px',
+							),
+						),
+					),
+				),
+				'blocks'   => array(
+					'core/group' => array(
+						'border'   => array(
+							'radius' => array(
+								'topLeft'     => '5px',
+								'bottomRight' => '5px',
+								'bottomLeft'  => '5px',
+							),
+						),
+						'spacing'  => array(
+							'padding' => array(
+								'top'   => '3px',
+								'right' => '3px',
+								'left'  => '3px',
+							),
+						),
+						'elements' => array(
+							'link' => array(
+								'spacing' => array(
+									'padding' => array(
+										'top'   => '4px',
+										'right' => '4px',
+										'left'  => '4px',
+									),
+								),
+							),
+						),
+					),
+				),
+			),
+		);
+		$this->assertEqualSetsWithIndex( $expected, $actual );
+	}
+
+	/**
+	 * @ticket 54336
+	 */
+	public function test_remove_insecure_properties_removes_non_preset_settings() {
+		$actual = WP_Theme_JSON::remove_insecure_properties(
+			array(
+				'version'  => WP_Theme_JSON::LATEST_SCHEMA,
+				'settings' => array(
+					'color'   => array(
+						'custom'  => true,
+						'palette' => array(
+							'custom' => array(
+								array(
+									'name'  => 'Red',
+									'slug'  => 'red',
+									'color' => '#ff0000',
+								),
+								array(
+									'name'  => 'Green',
+									'slug'  => 'green',
+									'color' => '#00ff00',
+								),
+								array(
+									'name'  => 'Blue',
+									'slug'  => 'blue',
+									'color' => '#0000ff',
+								),
+							),
+						),
+					),
+					'spacing' => array(
+						'padding' => false,
+					),
+					'blocks'  => array(
+						'core/group' => array(
+							'color'   => array(
+								'custom'  => true,
+								'palette' => array(
+									'custom' => array(
+										array(
+											'name'  => 'Yellow',
+											'slug'  => 'yellow',
+											'color' => '#ff0000',
+										),
+										array(
+											'name'  => 'Pink',
+											'slug'  => 'pink',
+											'color' => '#00ff00',
+										),
+										array(
+											'name'  => 'Orange',
+											'slug'  => 'orange',
+											'color' => '#0000ff',
+										),
+									),
+								),
+							),
+							'spacing' => array(
+								'padding' => false,
+							),
+						),
+					),
+				),
+			)
+		);
+
+		$expected = array(
+			'version'  => WP_Theme_JSON::LATEST_SCHEMA,
+			'settings' => array(
+				'color'  => array(
+					'palette' => array(
+						'custom' => array(
+							array(
+								'name'  => 'Red',
+								'slug'  => 'red',
+								'color' => '#ff0000',
+							),
+							array(
+								'name'  => 'Green',
+								'slug'  => 'green',
+								'color' => '#00ff00',
+							),
+							array(
+								'name'  => 'Blue',
+								'slug'  => 'blue',
+								'color' => '#0000ff',
+							),
+						),
+					),
+				),
+				'blocks' => array(
+					'core/group' => array(
+						'color' => array(
+							'palette' => array(
+								'custom' => array(
+									array(
+										'name'  => 'Yellow',
+										'slug'  => 'yellow',
+										'color' => '#ff0000',
+									),
+									array(
+										'name'  => 'Pink',
+										'slug'  => 'pink',
+										'color' => '#00ff00',
+									),
+									array(
+										'name'  => 'Orange',
+										'slug'  => 'orange',
+										'color' => '#0000ff',
+									),
+								),
+							),
+						),
+					),
+				),
+			),
+		);
+		$this->assertEqualSetsWithIndex( $expected, $actual );
+	}
+
+	/**
+	 * @ticket 54336
+	 */
+	public function test_remove_insecure_properties_removes_unsafe_preset_settings() {
+		$actual = WP_Theme_JSON::remove_insecure_properties(
+			array(
+				'version'  => WP_Theme_JSON::LATEST_SCHEMA,
+				'settings' => array(
+					'color'      => array(
+						'palette' => array(
+							'custom' => array(
+								array(
+									'name'  => 'Red/><b>ok</ok>',
+									'slug'  => 'red',
+									'color' => '#ff0000',
+								),
+								array(
+									'name'  => 'Green',
+									'slug'  => 'a" attr',
+									'color' => '#00ff00',
+								),
+								array(
+									'name'  => 'Blue',
+									'slug'  => 'blue',
+									'color' => 'var(--color, var(--unsafe-fallback))',
+								),
+								array(
+									'name'  => 'Pink',
+									'slug'  => 'pink',
+									'color' => '#FFC0CB',
+								),
+							),
+						),
+					),
+					'typography' => array(
+						'fontFamilies' => array(
+							'custom' => array(
+								array(
+									'name'       => 'Helvetica Arial/><b>test</b>',
+									'slug'       => 'helvetica-arial',
+									'fontFamily' => 'Helvetica Neue, Helvetica, Arial, sans-serif',
+								),
+								array(
+									'name'       => 'Geneva',
+									'slug'       => 'geneva#asa',
+									'fontFamily' => 'Geneva, Tahoma, Verdana, sans-serif',
+								),
+								array(
+									'name'       => 'Cambria',
+									'slug'       => 'cambria',
+									'fontFamily' => 'Cambria, Georgia, serif',
+								),
+								array(
+									'name'       => 'Helvetica Arial',
+									'slug'       => 'helvetica-arial',
+									'fontFamily' => 'var(--fontFamily, var(--unsafe-fallback))',
+								),
+							),
+						),
+					),
+					'blocks'     => array(
+						'core/group' => array(
+							'color' => array(
+								'palette' => array(
+									'custom' => array(
+										array(
+											'name'  => 'Red/><b>ok</ok>',
+											'slug'  => 'red',
+											'color' => '#ff0000',
+										),
+										array(
+											'name'  => 'Green',
+											'slug'  => 'a" attr',
+											'color' => '#00ff00',
+										),
+										array(
+											'name'  => 'Blue',
+											'slug'  => 'blue',
+											'color' => 'var(--color, var(--unsafe--fallback))',
+										),
+										array(
+											'name'  => 'Pink',
+											'slug'  => 'pink',
+											'color' => '#FFC0CB',
+										),
+									),
+								),
+							),
+						),
+					),
+				),
+			)
+		);
+
+		$expected = array(
+			'version'  => WP_Theme_JSON::LATEST_SCHEMA,
+			'settings' => array(
+				'color'      => array(
+					'palette' => array(
+						'custom' => array(
+							array(
+								'name'  => 'Pink',
+								'slug'  => 'pink',
+								'color' => '#FFC0CB',
+							),
+						),
+					),
+				),
+				'typography' => array(
+					'fontFamilies' => array(
+						'custom' => array(
+							array(
+								'name'       => 'Cambria',
+								'slug'       => 'cambria',
+								'fontFamily' => 'Cambria, Georgia, serif',
+							),
+						),
+					),
+				),
+				'blocks'     => array(
+					'core/group' => array(
+						'color' => array(
+							'palette' => array(
+								'custom' => array(
+									array(
+										'name'  => 'Pink',
+										'slug'  => 'pink',
+										'color' => '#FFC0CB',
+									),
+								),
+							),
+						),
+					),
+				),
+			),
+		);
+		$this->assertEqualSetsWithIndex( $expected, $actual );
+	}
+
+	/**
+	 * @ticket 54336
+	 */
+	public function test_remove_insecure_properties_applies_safe_styles() {
+		$actual = WP_Theme_JSON::remove_insecure_properties(
+			array(
+				'version' => WP_Theme_JSON::LATEST_SCHEMA,
+				'styles'  => array(
+					'color' => array(
+						'text' => '#abcabc ', // Trailing space.
+					),
+				),
+			),
+			true
+		);
+
+		$expected = array(
+			'version' => WP_Theme_JSON::LATEST_SCHEMA,
+			'styles'  => array(
+				'color' => array(
+					'text' => '#abcabc ',
+				),
+			),
+		);
+		$this->assertEqualSetsWithIndex( $expected, $actual );
+	}
+
+	/**
+	 * @ticket 54336
+	 */
+	public function test_get_custom_templates() {
+		$theme_json = new WP_Theme_JSON(
+			array(
+				'version'         => 1,
+				'customTemplates' => array(
+					array(
+						'name'  => 'page-home',
+						'title' => 'Homepage template',
+					),
+				),
+			)
+		);
+
+		$page_templates = $theme_json->get_custom_templates();
+
+		$this->assertEqualSetsWithIndex(
+			$page_templates,
+			array(
+				'page-home' => array(
+					'title'     => 'Homepage template',
+					'postTypes' => array( 'page' ),
+				),
+			)
+		);
+	}
+
+	/**
+	 * @ticket 54336
+	 */
+	public function test_get_template_parts() {
+		$theme_json = new WP_Theme_JSON(
+			array(
+				'version'       => 1,
+				'templateParts' => array(
+					array(
+						'name'  => 'small-header',
+						'title' => 'Small Header',
+						'area'  => 'header',
+					),
+				),
+			)
+		);
+
+		$template_parts = $theme_json->get_template_parts();
+
+		$this->assertEqualSetsWithIndex(
+			$template_parts,
+			array(
+				'small-header' => array(
+					'title' => 'Small Header',
+					'area'  => 'header',
+				),
+			)
+		);
+	}
+
+	/**
+	 * @ticket 52991
+	 */
+	public function test_get_from_editor_settings() {
+		$input = array(
+			'disableCustomColors'    => true,
+			'disableCustomGradients' => true,
+			'disableCustomFontSizes' => true,
+			'enableCustomLineHeight' => true,
+			'enableCustomUnits'      => true,
+			'colors'                 => array(
+				array(
+					'slug'  => 'color-slug',
+					'name'  => 'Color Name',
+					'color' => 'colorvalue',
+				),
+			),
+			'gradients'              => array(
+				array(
+					'slug'     => 'gradient-slug',
+					'name'     => 'Gradient Name',
+					'gradient' => 'gradientvalue',
+				),
+			),
+			'fontSizes'              => array(
+				array(
+					'slug' => 'size-slug',
+					'name' => 'Size Name',
+					'size' => 'sizevalue',
+				),
+			),
+		);
+
+		$expected = array(
+			'version'  => WP_Theme_JSON::LATEST_SCHEMA,
+			'settings' => array(
+				'color'      => array(
+					'custom'         => false,
 					'customGradient' => false,
 					'gradients'      => array(
 						array(
@@ -928,9 +2203,9 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 					'units' => array( 'px', 'em', 'rem', 'vh', 'vw', '%' ),
 				),
 				'typography' => array(
-					'customFontSize'   => false,
-					'customLineHeight' => true,
-					'fontSizes'        => array(
+					'customFontSize' => false,
+					'lineHeight'     => true,
+					'fontSizes'      => array(
 						array(
 							'slug' => 'size-slug',
 							'name' => 'Size Name',
@@ -948,6 +2223,7 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 
 	/**
 	 * @ticket 52991
+	 * @ticket 54336
 	 */
 	public function test_get_editor_settings_no_theme_support() {
 		$input = array(
@@ -990,8 +2266,8 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 					'units' => false,
 				),
 				'typography' => array(
-					'customFontSize'   => true,
-					'customLineHeight' => false,
+					'customFontSize' => true,
+					'lineHeight'     => false,
 				),
 			),
 		);
@@ -1003,6 +2279,7 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 
 	/**
 	 * @ticket 52991
+	 * @ticket 54336
 	 */
 	public function test_get_editor_settings_blank() {
 		$expected = array(
@@ -1011,58 +2288,100 @@ class Tests_Theme_wpThemeJson extends WP_UnitTestCase {
 		);
 		$actual   = WP_Theme_JSON::get_from_editor_settings( array() );
 
-		$this->assertSameSetsWithIndex( $expected, $actual );
+		$this->assertEqualSetsWithIndex( $expected, $actual );
 	}
 
 	/**
 	 * @ticket 52991
+	 * @ticket 54336
 	 */
 	public function test_get_editor_settings_custom_units_can_be_disabled() {
 		add_theme_support( 'custom-units', array() );
-		$input = get_default_block_editor_settings();
+		$actual = WP_Theme_JSON::get_from_editor_settings( get_default_block_editor_settings() );
+		remove_theme_support( 'custom-units' );
 
 		$expected = array(
-			'units'         => array( array() ),
-			'customPadding' => false,
+			'units'   => array( array() ),
+			'padding' => false,
 		);
 
-		$actual = WP_Theme_JSON::get_from_editor_settings( $input );
-
-		$this->assertSameSetsWithIndex( $expected, $actual['settings']['spacing'] );
+		$this->assertEqualSetsWithIndex( $expected, $actual['settings']['spacing'] );
 	}
 
 	/**
 	 * @ticket 52991
+	 * @ticket 54336
 	 */
 	public function test_get_editor_settings_custom_units_can_be_enabled() {
 		add_theme_support( 'custom-units' );
-		$input = get_default_block_editor_settings();
+		$actual = WP_Theme_JSON::get_from_editor_settings( get_default_block_editor_settings() );
+		remove_theme_support( 'custom-units' );
 
 		$expected = array(
-			'units'         => array( 'px', 'em', 'rem', 'vh', 'vw', '%' ),
-			'customPadding' => false,
+			'units'   => array( 'px', 'em', 'rem', 'vh', 'vw', '%' ),
+			'padding' => false,
 		);
 
-		$actual = WP_Theme_JSON::get_from_editor_settings( $input );
-
-		$this->assertSameSetsWithIndex( $expected, $actual['settings']['spacing'] );
+		$this->assertEqualSetsWithIndex( $expected, $actual['settings']['spacing'] );
 	}
 
 	/**
 	 * @ticket 52991
+	 * @ticket 54336
 	 */
 	public function test_get_editor_settings_custom_units_can_be_filtered() {
 		add_theme_support( 'custom-units', 'rem', 'em' );
-		$input = get_default_block_editor_settings();
+		$actual = WP_Theme_JSON::get_from_editor_settings( get_default_block_editor_settings() );
+		remove_theme_support( 'custom-units' );
 
 		$expected = array(
-			'units'         => array( 'rem', 'em' ),
-			'customPadding' => false,
+			'units'   => array( 'rem', 'em' ),
+			'padding' => false,
 		);
+		$this->assertEqualSetsWithIndex( $expected, $actual['settings']['spacing'] );
+	}
 
-		$actual = WP_Theme_JSON::get_from_editor_settings( $input );
+	/**
+	 * @ticket 54487
+	 */
+	public function test_sanitization() {
+		$theme_json = new WP_Theme_JSON(
+			array(
+				'version' => 2,
+				'styles'  => array(
+					'spacing' => array(
+						'blockGap' => 'valid value',
+					),
+					'blocks'  => array(
+						'core/group' => array(
+							'spacing' => array(
+								'margin'   => 'valid value',
+								'blockGap' => 'invalid value',
+							),
+						),
+					),
+				),
+			)
+		);
+
+		$actual   = $theme_json->get_raw_data();
+		$expected = array(
+			'version' => 2,
+			'styles'  => array(
+				'spacing' => array(
+					'blockGap' => 'valid value',
+				),
+				'blocks'  => array(
+					'core/group' => array(
+						'spacing' => array(
+							'margin' => 'valid value',
+						),
+					),
+				),
+			),
+		);
 
-		$this->assertSameSetsWithIndex( $expected, $actual['settings']['spacing'] );
+		$this->assertEqualSetsWithIndex( $expected, $actual );
 	}
 
 }
diff --git a/tests/phpunit/tests/theme/wpThemeJsonResolver.php b/tests/phpunit/tests/theme/wpThemeJsonResolver.php
index 7e4bd37d54..6c88666e38 100644
--- a/tests/phpunit/tests/theme/wpThemeJsonResolver.php
+++ b/tests/phpunit/tests/theme/wpThemeJsonResolver.php
@@ -24,6 +24,7 @@ class Tests_Theme_wpThemeJsonResolver extends WP_UnitTestCase {
 		add_filter( 'theme_root', array( $this, 'filter_set_theme_root' ) );
 		add_filter( 'stylesheet_root', array( $this, 'filter_set_theme_root' ) );
 		add_filter( 'template_root', array( $this, 'filter_set_theme_root' ) );
+		$this->queries = array();
 		// Clear caches.
 		wp_clean_themes_cache();
 		unset( $GLOBALS['wp_themes'] );
@@ -44,15 +45,22 @@ class Tests_Theme_wpThemeJsonResolver extends WP_UnitTestCase {
 		return 'pl_PL';
 	}
 
+	function filter_db_query( $query ) {
+		if ( preg_match( '#post_type = \'wp_global_styles\'#', $query ) ) {
+			$this->queries[] = $query;
+		}
+		return $query;
+	}
+
 	/**
 	 * @ticket 52991
+	 * @ticket 54336
 	 */
 	public function test_translations_are_applied() {
 		add_filter( 'locale', array( $this, 'filter_set_locale_to_polish' ) );
 		load_textdomain( 'block-theme', realpath( DIR_TESTDATA . '/languages/themes/block-theme-pl_PL.mo' ) );
 
 		switch_theme( 'block-theme' );
-
 		$actual = WP_Theme_JSON_Resolver::get_theme_data();
 
 		unload_textdomain( 'block-theme' );
@@ -62,6 +70,8 @@ class Tests_Theme_wpThemeJsonResolver extends WP_UnitTestCase {
 		$this->assertSame(
 			array(
 				'color'      => array(
+					'custom'         => false,
+					'customGradient' => false,
 					'palette'        => array(
 						'theme' => array(
 							array(
@@ -85,11 +95,11 @@ class Tests_Theme_wpThemeJsonResolver extends WP_UnitTestCase {
 							),
 						),
 					),
-					'custom'         => false,
-					'customGradient' => false,
 				),
 				'typography' => array(
-					'fontSizes'        => array(
+					'customFontSize' => false,
+					'lineHeight'     => true,
+					'fontSizes'      => array(
 						'theme' => array(
 							array(
 								'name' => 'Custom',
@@ -98,14 +108,10 @@ class Tests_Theme_wpThemeJsonResolver extends WP_UnitTestCase {
 							),
 						),
 					),
-					'customFontSize'   => false,
-					'customLineHeight' => true,
 				),
 				'spacing'    => array(
-					'units'         => array(
-						'rem',
-					),
-					'customPadding' => true,
+					'units'   => array( 'rem' ),
+					'padding' => true,
 				),
 				'blocks'     => array(
 					'core/paragraph' => array(
@@ -125,14 +131,32 @@ class Tests_Theme_wpThemeJsonResolver extends WP_UnitTestCase {
 			),
 			$actual->get_settings()
 		);
+		$this->assertSame(
+			$actual->get_custom_templates(),
+			array(
+				'page-home' => array(
+					'title'     => 'Szablon strony głównej',
+					'postTypes' => array( 'page' ),
+				),
+			)
+		);
+		$this->assertSame(
+			$actual->get_template_parts(),
+			array(
+				'small-header' => array(
+					'title' => 'Mały nagłówek',
+					'area'  => 'header',
+				),
+			)
+		);
 	}
 
 	/**
 	 * @ticket 52991
 	 */
 	public function test_switching_themes_recalculates_data() {
-		// By default, the theme for unit tests is "default",
-		// which doesn't have theme.json support.
+		// The "default" theme doesn't have theme.json support.
+		switch_theme( 'default' );
 		$default = WP_Theme_JSON_Resolver::theme_has_support();
 
 		// Switch to a theme that does have support.
@@ -143,4 +167,183 @@ class Tests_Theme_wpThemeJsonResolver extends WP_UnitTestCase {
 		$this->assertTrue( $has_theme_json_support );
 	}
 
+	/**
+	 * @ticket 54336
+	 */
+	function test_add_theme_supports_are_loaded_for_themes_without_theme_json() {
+		switch_theme( 'default' );
+		$color_palette = array(
+			array(
+				'name'  => 'Primary',
+				'slug'  => 'primary',
+				'color' => '#F00',
+			),
+			array(
+				'name'  => 'Secondary',
+				'slug'  => 'secondary',
+				'color' => '#0F0',
+			),
+			array(
+				'name'  => 'Tertiary',
+				'slug'  => 'tertiary',
+				'color' => '#00F',
+			),
+		);
+		add_theme_support( 'editor-color-palette', $color_palette );
+		add_theme_support( 'custom-line-height' );
+
+		$settings = WP_Theme_JSON_Resolver::get_theme_data()->get_settings();
+
+		remove_theme_support( 'custom-line-height' );
+		remove_theme_support( 'editor-color-palette' );
+
+		$this->assertFalse( WP_Theme_JSON_Resolver::theme_has_support() );
+		$this->assertTrue( $settings['typography']['lineHeight'] );
+		$this->assertSame( $color_palette, $settings['color']['palette']['theme'] );
+	}
+
+	/**
+	 * Recursively applies ksort to an array.
+	 */
+	private static function recursive_ksort( &$array ) {
+		foreach ( $array as &$value ) {
+			if ( is_array( $value ) ) {
+				self::recursive_ksort( $value );
+			}
+		}
+		ksort( $array );
+	}
+
+	/**
+	 * @ticket 54336
+	 */
+	function test_merges_child_theme_json_into_parent_theme_json() {
+		switch_theme( 'block-theme-child' );
+
+		$actual_settings   = WP_Theme_JSON_Resolver::get_theme_data()->get_settings();
+		$expected_settings = array(
+			'color'      => array(
+				'custom'         => false,
+				'customGradient' => false,
+				'gradients'      => array(
+					'theme' => array(
+						array(
+							'name'     => 'Custom gradient',
+							'gradient' => 'linear-gradient(135deg,rgba(0,0,0) 0%,rgb(0,0,0) 100%)',
+							'slug'     => 'custom-gradient',
+						),
+					),
+				),
+				'palette'        => array(
+					'theme' => array(
+						array(
+							'slug'  => 'light',
+							'name'  => 'Light',
+							'color' => '#f3f4f6',
+						),
+						array(
+							'slug'  => 'primary',
+							'name'  => 'Primary',
+							'color' => '#3858e9',
+						),
+						array(
+							'slug'  => 'dark',
+							'name'  => 'Dark',
+							'color' => '#111827',
+						),
+					),
+				),
+				'link'           => true,
+			),
+			'typography' => array(
+				'customFontSize' => false,
+				'lineHeight'     => true,
+				'fontSizes'      => array(
+					'theme' => array(
+						array(
+							'name' => 'Custom',
+							'slug' => 'custom',
+							'size' => '100px',
+						),
+					),
+				),
+			),
+			'spacing'    => array(
+				'units'   => array( 'rem' ),
+				'padding' => true,
+			),
+			'blocks'     => array(
+				'core/paragraph'  => array(
+					'color' => array(
+						'palette' => array(
+							'theme' => array(
+								array(
+									'slug'  => 'light',
+									'name'  => 'Light',
+									'color' => '#f5f7f9',
+								),
+							),
+						),
+					),
+				),
+				'core/post-title' => array(
+					'color' => array(
+						'palette' => array(
+							'theme' => array(
+								array(
+									'slug'  => 'light',
+									'name'  => 'Light',
+									'color' => '#f3f4f6',
+								),
+							),
+						),
+					),
+				),
+			),
+		);
+		self::recursive_ksort( $actual_settings );
+		self::recursive_ksort( $expected_settings );
+
+		// Should merge settings.
+		$this->assertSame(
+			$expected_settings,
+			$actual_settings
+		);
+
+		$this->assertSame(
+			WP_Theme_JSON_Resolver::get_theme_data()->get_custom_templates(),
+			array(
+				'page-home' => array(
+					'title'     => 'Homepage',
+					'postTypes' => array( 'page' ),
+				),
+			)
+		);
+	}
+
+	function test_get_user_data_from_wp_global_styles_does_not_use_uncached_queries() {
+		add_filter( 'query', array( $this, 'filter_db_query' ) );
+		$query_count = count( $this->queries );
+		for ( $i = 0; $i < 3; $i++ ) {
+			WP_Theme_JSON_Resolver::get_user_data_from_wp_global_styles( wp_get_theme() );
+			WP_Theme_JSON_Resolver::clean_cached_data();
+		}
+		$query_count = count( $this->queries ) - $query_count;
+		$this->assertEquals( 1, $query_count, 'Only one SQL query should be peformed for multiple invocations of WP_Theme_JSON_Resolver::get_global_styles_from_post()' );
+
+		$user_cpt = WP_Theme_JSON_Resolver::get_user_data_from_wp_global_styles( wp_get_theme() );
+		$this->assertEmpty( $user_cpt );
+
+		$user_cpt = WP_Theme_JSON_Resolver::get_user_data_from_wp_global_styles( wp_get_theme(), true );
+		$this->assertNotEmpty( $user_cpt );
+
+		$query_count = count( $this->queries );
+		for ( $i = 0; $i < 3; $i++ ) {
+			WP_Theme_JSON_Resolver::get_user_data_from_wp_global_styles( wp_get_theme() );
+			WP_Theme_JSON_Resolver::clean_cached_data();
+		}
+		$query_count = count( $this->queries ) - $query_count;
+		$this->assertEquals( 0, $query_count, 'Unexpected SQL queries detected for the wp_global_style post type' );
+		remove_filter( 'query', array( $this, 'filter_db_query' ) );
+	}
 }
diff --git a/tests/phpunit/tests/theme/wpThemeJsonSchema.php b/tests/phpunit/tests/theme/wpThemeJsonSchema.php
new file mode 100644
index 0000000000..25cfcf7c97
--- /dev/null
+++ b/tests/phpunit/tests/theme/wpThemeJsonSchema.php
@@ -0,0 +1,193 @@
+<?php
+
+/**
+ * Test WP_Theme_JSON_Schema class.
+ *
+ * @package WordPress
+ * @subpackage Theme
+ *
+ * @since 5.9.0
+ *
+ * @group themes
+ */
+class Tests_Theme_wpThemeJsonSchema extends WP_UnitTestCase {
+	/**
+	 * The current theme.json schema version.
+	 */
+	const LATEST_SCHEMA_VERSION = WP_Theme_JSON::LATEST_SCHEMA;
+
+	/**
+	 * @ticket 54336
+	 */
+	function test_migrate_v1_to_v2() {
+		$theme_json_v1 = array(
+			'version'  => 1,
+			'settings' => array(
+				'color'      => array(
+					'palette' => array(
+						array(
+							'name'  => 'Pale Pink',
+							'slug'  => 'pale-pink',
+							'color' => '#f78da7',
+						),
+						array(
+							'name'  => 'Vivid Red',
+							'slug'  => 'vivid-red',
+							'color' => '#cf2e2e',
+						),
+					),
+					'custom'  => false,
+					'link'    => true,
+				),
+				'border'     => array(
+					'color'        => false,
+					'customRadius' => false,
+					'style'        => false,
+					'width'        => false,
+				),
+				'typography' => array(
+					'fontStyle'      => false,
+					'fontWeight'     => false,
+					'letterSpacing'  => false,
+					'textDecoration' => false,
+					'textTransform'  => false,
+				),
+				'blocks'     => array(
+					'core/group' => array(
+						'border'     => array(
+							'color'        => true,
+							'customRadius' => true,
+							'style'        => true,
+							'width'        => true,
+						),
+						'typography' => array(
+							'fontStyle'      => true,
+							'fontWeight'     => true,
+							'letterSpacing'  => true,
+							'textDecoration' => true,
+							'textTransform'  => true,
+						),
+					),
+				),
+			),
+			'styles'   => array(
+				'color'    => array(
+					'background' => 'purple',
+				),
+				'blocks'   => array(
+					'core/group' => array(
+						'color'    => array(
+							'background' => 'red',
+						),
+						'spacing'  => array(
+							'padding' => array(
+								'top' => '10px',
+							),
+						),
+						'elements' => array(
+							'link' => array(
+								'color' => array(
+									'text' => 'yellow',
+								),
+							),
+						),
+					),
+				),
+				'elements' => array(
+					'link' => array(
+						'color' => array(
+							'text' => 'red',
+						),
+					),
+				),
+			),
+		);
+
+		$actual = WP_Theme_JSON_Schema::migrate( $theme_json_v1 );
+
+		$expected = array(
+			'version'  => self::LATEST_SCHEMA_VERSION,
+			'settings' => array(
+				'color'      => array(
+					'palette' => array(
+						array(
+							'name'  => 'Pale Pink',
+							'slug'  => 'pale-pink',
+							'color' => '#f78da7',
+						),
+						array(
+							'name'  => 'Vivid Red',
+							'slug'  => 'vivid-red',
+							'color' => '#cf2e2e',
+						),
+					),
+					'custom'  => false,
+					'link'    => true,
+				),
+				'border'     => array(
+					'color'  => false,
+					'radius' => false,
+					'style'  => false,
+					'width'  => false,
+				),
+				'typography' => array(
+					'fontStyle'      => false,
+					'fontWeight'     => false,
+					'letterSpacing'  => false,
+					'textDecoration' => false,
+					'textTransform'  => false,
+				),
+				'blocks'     => array(
+					'core/group' => array(
+						'border'     => array(
+							'color'  => true,
+							'radius' => true,
+							'style'  => true,
+							'width'  => true,
+						),
+						'typography' => array(
+							'fontStyle'      => true,
+							'fontWeight'     => true,
+							'letterSpacing'  => true,
+							'textDecoration' => true,
+							'textTransform'  => true,
+						),
+					),
+				),
+			),
+			'styles'   => array(
+				'color'    => array(
+					'background' => 'purple',
+				),
+				'blocks'   => array(
+					'core/group' => array(
+						'color'    => array(
+							'background' => 'red',
+						),
+						'spacing'  => array(
+							'padding' => array(
+								'top' => '10px',
+							),
+						),
+						'elements' => array(
+							'link' => array(
+								'color' => array(
+									'text' => 'yellow',
+								),
+							),
+						),
+					),
+				),
+				'elements' => array(
+					'link' => array(
+						'color' => array(
+							'text' => 'red',
+						),
+					),
+				),
+			),
+		);
+
+		$this->assertEqualSetsWithIndex( $expected, $actual );
+	}
+}
diff --git a/tests/phpunit/tests/user.php b/tests/phpunit/tests/user.php
index caa9a5e24d..67ab0f04f7 100644
--- a/tests/phpunit/tests/user.php
+++ b/tests/phpunit/tests/user.php
@@ -104,7 +104,7 @@ class Tests_User extends WP_UnitTestCase {
 		$this->assertSame( $val, get_user_option( $key, self::$author_id ) );
 
 		// Change and get again.
-		$val2 = rand_str();
+		$val2 = 'baz';
 		update_user_option( self::$author_id, $key, $val2 );
 		$this->assertSame( $val2, get_user_option( $key, self::$author_id ) );
 	}
@@ -135,7 +135,7 @@ class Tests_User extends WP_UnitTestCase {
 		// Delete by key AND value.
 		update_user_meta( self::$author_id, $key, $val );
 		// Incorrect key: key still exists.
-		delete_user_meta( self::$author_id, $key, rand_str() );
+		delete_user_meta( self::$author_id, $key, 'foo' );
 		$this->assertSame( $val, get_user_meta( self::$author_id, $key, true ) );
 		// Correct key: deleted.
 		delete_user_meta( self::$author_id, $key, $val );
@@ -149,9 +149,9 @@ class Tests_User extends WP_UnitTestCase {
 	public function test_usermeta_array() {
 		// Some values to set.
 		$vals = array(
-			rand_str() => 'val-' . rand_str(),
-			rand_str() => 'val-' . rand_str(),
-			rand_str() => 'val-' . rand_str(),
+			'key0' => 'val0',
+			'key1' => 'val1',
+			'key2' => 'val2',
 		);
 
 		// There is already some stuff in the array.
@@ -475,8 +475,8 @@ class Tests_User extends WP_UnitTestCase {
 		$post = array(
 			'post_author'  => self::$author_id,
 			'post_status'  => 'publish',
-			'post_content' => rand_str(),
-			'post_title'   => rand_str(),
+			'post_content' => 'content',
+			'post_title'   => 'title',
 			'post_type'    => 'post',
 		);
 
@@ -636,7 +636,7 @@ class Tests_User extends WP_UnitTestCase {
 	public function test_user_meta_error() {
 		$id1 = wp_insert_user(
 			array(
-				'user_login' => rand_str(),
+				'user_login' => 'taco_burrito',
 				'user_pass'  => 'password',
 				'user_email' => 'taco@burrito.com',
 			)
@@ -645,7 +645,7 @@ class Tests_User extends WP_UnitTestCase {
 
 		$id2 = wp_insert_user(
 			array(
-				'user_login' => rand_str(),
+				'user_login' => 'taco_burrito2',
 				'user_pass'  => 'password',
 				'user_email' => 'taco@burrito.com',
 			)
@@ -826,9 +826,9 @@ class Tests_User extends WP_UnitTestCase {
 	 */
 	public function test_wp_insert_user_should_not_wipe_existing_password() {
 		$user_details = array(
-			'user_login' => rand_str(),
+			'user_login' => 'jonsnow',
 			'user_pass'  => 'password',
-			'user_email' => rand_str() . '@example.com',
+			'user_email' => 'jonsnow@example.com',
 		);
 
 		$user_id = wp_insert_user( $user_details );
@@ -1000,6 +1000,24 @@ class Tests_User extends WP_UnitTestCase {
 		$this->assertSame( $expected, $user->user_nicename );
 	}
 
+	/**
+	 * @ticket 44107
+	 */
+	public function test_wp_insert_user_should_reject_user_url_over_100_characters() {
+		$user_url = str_repeat( 'a', 101 );
+		$u        = wp_insert_user(
+			array(
+				'user_login' => 'test',
+				'user_email' => 'test@example.com',
+				'user_pass'  => 'password',
+				'user_url'   => $user_url,
+			)
+		);
+
+		$this->assertWPError( $u );
+		$this->assertSame( 'user_url_too_long', $u->get_error_code() );
+	}
+
 	/**
 	 * @ticket 28004
 	 */
@@ -1909,9 +1927,9 @@ class Tests_User extends WP_UnitTestCase {
 	 * This hook is used in `test_wp_insert_user_with_meta()`.
 	 */
 	public function filter_custom_meta( $meta_input ) {
-		// Update some meta inputs
+		// Update some meta inputs.
 		$meta_input['test_meta_key'] = 'update_from_filter';
-		// Add a new meta
+		// Add a new meta.
 		$meta_input['new_meta_from_filter'] = 'new_from_filter';
 
 		return $meta_input;
diff --git a/tests/phpunit/tests/user/author.php b/tests/phpunit/tests/user/author.php
index 5786578855..1a624ec833 100644
--- a/tests/phpunit/tests/user/author.php
+++ b/tests/phpunit/tests/user/author.php
@@ -26,8 +26,8 @@ class Tests_User_Author_Template extends WP_UnitTestCase {
 			array(
 				'post_author'  => self::$author_id,
 				'post_status'  => 'publish',
-				'post_content' => rand_str(),
-				'post_title'   => rand_str(),
+				'post_content' => 'content',
+				'post_title'   => 'title',
 				'post_type'    => 'post',
 			)
 		);
diff --git a/tests/phpunit/tests/user/retrievePassword.php b/tests/phpunit/tests/user/retrievePassword.php
new file mode 100644
index 0000000000..5a0e1d638e
--- /dev/null
+++ b/tests/phpunit/tests/user/retrievePassword.php
@@ -0,0 +1,70 @@
+<?php
+/**
+ * Test cases for the `retrieve_password()` function.
+ *
+ * @package WordPress
+ * @since 6.0.0
+ */
+
+/**
+ * Test retrieve_password(), in wp-includes/user.php.
+ *
+ * @since 6.0.0
+ *
+ * @group user
+ * @covers ::retrieve_password
+ */
+class Tests_User_RetrievePassword extends WP_UnitTestCase {
+	/**
+	 * Test user.
+	 *
+	 * @since 6.0.0
+	 *
+	 * @var WP_User $user
+	 */
+	protected $user;
+
+	/**
+	 * Create users for tests.
+	 *
+	 * @since 6.0.0
+	 */
+	public function set_up() {
+		parent::set_up();
+
+		// Create the user.
+		$this->user = self::factory()->user->create_and_get(
+			array(
+				'user_login' => 'jane',
+				'user_email' => 'r.jane@example.com',
+			)
+		);
+	}
+
+	/**
+	 * The function should not error when the email was sent.
+	 *
+	 * @ticket 54690
+	 */
+	public function test_retrieve_password_reset_notification_email() {
+		$message = 'Sending password reset notification email failed.';
+		$this->assertNotWPError( retrieve_password( $this->user->user_login ), $message );
+	}
+
+	/**
+	 * The function should error when the email was not sent.
+	 *
+	 * @ticket 54690
+	 */
+	public function test_retrieve_password_should_return_wp_error_on_failed_email() {
+		add_filter(
+			'retrieve_password_notification_email',
+			static function() {
+				return array( 'message' => '' );
+			}
+		);
+
+		$message = 'Sending password reset notification email succeeded.';
+		$this->assertWPError( retrieve_password( $this->user->user_login ), $message );
+	}
+}
diff --git a/tests/phpunit/tests/user/wpListUsers.php b/tests/phpunit/tests/user/wpListUsers.php
new file mode 100644
index 0000000000..32d30699c1
--- /dev/null
+++ b/tests/phpunit/tests/user/wpListUsers.php
@@ -0,0 +1,202 @@
+<?php
+/**
+ * @group user
+ *
+ * @covers ::wp_list_users
+ */
+class Tests_Functions_wpListUsers extends WP_UnitTestCase {
+	private static $user_ids = array();
+
+	public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) {
+		self::$user_ids[] = $factory->user->create(
+			array(
+				'user_login'   => 'zack',
+				'display_name' => 'zack',
+				'role'         => 'subscriber',
+				'first_name'   => 'zack',
+				'last_name'    => 'moon',
+				'user_email'   => 'm.zack@example.com',
+				'user_url'     => 'http://moonzack.fake',
+			)
+		);
+
+		self::$user_ids[] = $factory->user->create(
+			array(
+				'user_login'   => 'jane',
+				'display_name' => 'jane',
+				'role'         => 'contributor',
+				'first_name'   => 'jane',
+				'last_name'    => 'reno',
+				'user_email'   => 'r.jane@example.com',
+				'user_url'     => 'http://janereno.fake',
+			)
+		);
+
+		self::$user_ids[] = $factory->user->create(
+			array(
+				'user_login'   => 'michelle',
+				'display_name' => 'michelle',
+				'role'         => 'subscriber',
+				'first_name'   => 'michelle',
+				'last_name'    => 'jones',
+				'user_email'   => 'j.michelle@example.com',
+				'user_url'     => 'http://lemichellejones.fake',
+			)
+		);
+
+		self::$user_ids[] = $factory->user->create(
+			array(
+				'user_login'   => 'paul',
+				'display_name' => 'paul',
+				'role'         => 'subscriber',
+				'first_name'   => 'paul',
+				'last_name'    => 'norris',
+				'user_email'   => 'n.paul@example.com',
+				'user_url'     => 'http://awildpaulappeared.fake',
+			)
+		);
+
+		foreach ( self::$user_ids as $user ) {
+			$factory->post->create(
+				array(
+					'post_type'   => 'post',
+					'post_author' => $user,
+				)
+			);
+		}
+	}
+
+	/**
+	 * Test that wp_list_users() creates the expected list of users.
+	 *
+	 * @dataProvider data_should_create_a_user_list
+	 *
+	 * @ticket 15145
+	 *
+	 * @param array|string $args     The arguments to create a list of users.
+	 * @param string       $expected The expected result.
+	 */
+	public function test_should_create_a_user_list( $args, $expected ) {
+		$actual = wp_list_users( $args );
+
+		$expected = str_replace(
+			array( 'AUTHOR_ID_zack', 'AUTHOR_ID_jane', 'AUTHOR_ID_michelle', 'AUTHOR_ID_paul' ),
+			array( self::$user_ids[0], self::$user_ids[1], self::$user_ids[2], self::$user_ids[3] ),
+			$expected
+		);
+
+		if ( null === $actual ) {
+			$this->expectOutputString( $expected );
+		} else {
+			$this->assertSame( $expected, $actual );
+		}
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_should_create_a_user_list() {
+		return array(
+			'defaults when no args are supplied' => array(
+				'args'     => '',
+				'expected' => '<li>jane</li><li>michelle</li><li>paul</li><li>zack</li>',
+			),
+			'the admin account included'         => array(
+				'args'     => array(
+					'exclude_admin' => false,
+				),
+				'expected' => '<li>admin</li><li>jane</li><li>michelle</li><li>paul</li><li>zack</li>',
+			),
+			'the full name of each user'         => array(
+				'args'     => array(
+					'show_fullname' => true,
+				),
+				'expected' => '<li>jane reno</li><li>michelle jones</li><li>paul norris</li><li>zack moon</li>',
+			),
+			'the feed of each user'              => array(
+				'args'     => array(
+					'feed' => 'User feed',
+				),
+				'expected' => '<li>jane (<a href="http://example.org/?feed=rss2&amp;author=AUTHOR_ID_jane">User feed</a>)</li>' .
+						'<li>michelle (<a href="http://example.org/?feed=rss2&amp;author=AUTHOR_ID_michelle">User feed</a>)</li>' .
+						'<li>paul (<a href="http://example.org/?feed=rss2&amp;author=AUTHOR_ID_paul">User feed</a>)</li>' .
+						'<li>zack (<a href="http://example.org/?feed=rss2&amp;author=AUTHOR_ID_zack">User feed</a>)</li>',
+			),
+			'the feed of each user and an image' => array(
+				'args'     => array(
+					'feed'       => 'User feed with image',
+					'feed_image' => 'http://example.org/image.jpg',
+				),
+				'expected' => '<li>jane <a href="http://example.org/?feed=rss2&amp;author=AUTHOR_ID_jane"><img src="http://example.org/image.jpg" style="border: none;" alt="User feed with image" /></a></li>' .
+						'<li>michelle <a href="http://example.org/?feed=rss2&amp;author=AUTHOR_ID_michelle"><img src="http://example.org/image.jpg" style="border: none;" alt="User feed with image" /></a></li>' .
+						'<li>paul <a href="http://example.org/?feed=rss2&amp;author=AUTHOR_ID_paul"><img src="http://example.org/image.jpg" style="border: none;" alt="User feed with image" /></a></li>' .
+						'<li>zack <a href="http://example.org/?feed=rss2&amp;author=AUTHOR_ID_zack"><img src="http://example.org/image.jpg" style="border: none;" alt="User feed with image" /></a></li>',
+			),
+			'a feed of the specified type'       => array(
+				'args'     => array(
+					'feed'      => 'User feed as atom',
+					'feed_type' => 'atom',
+				),
+				'expected' => '<li>jane (<a href="http://example.org/?feed=atom&amp;author=AUTHOR_ID_jane">User feed as atom</a>)</li>' .
+						'<li>michelle (<a href="http://example.org/?feed=atom&amp;author=AUTHOR_ID_michelle">User feed as atom</a>)</li>' .
+						'<li>paul (<a href="http://example.org/?feed=atom&amp;author=AUTHOR_ID_paul">User feed as atom</a>)</li>' .
+						'<li>zack (<a href="http://example.org/?feed=atom&amp;author=AUTHOR_ID_zack">User feed as atom</a>)</li>',
+			),
+			'no output via echo'                 => array(
+				'args'     => array(
+					'echo' => false,
+				),
+				'expected' => '<li>jane</li><li>michelle</li><li>paul</li><li>zack</li>',
+			),
+			'commas separating each user'        => array(
+				'args'     => array(
+					'style' => '',
+				),
+				'expected' => 'jane, michelle, paul, zack',
+			),
+			'plain text format'                  => array(
+				'args'     => array(
+					'html' => false,
+				),
+				'expected' => 'jane, michelle, paul, zack',
+			),
+		);
+	}
+
+	/**
+	 * Tests that wp_list_users() does not create a user list.
+	 *
+	 * @dataProvider data_should_not_create_a_user_list
+	 *
+	 * @ticket 15145
+	 *
+	 * @param array|string $args The arguments to create a list of users.
+	 */
+	public function test_should_not_create_a_user_list( $args ) {
+		$actual = wp_list_users( $args );
+
+		if ( null === $actual ) {
+			$this->expectOutputString( '', 'wp_list_users() did not output an empty string.' );
+		} else {
+			$this->assertSame( $actual, 'wp_list_users() did not return an empty string.' );
+		}
+	}
+
+	/**
+	 * Data provider.
+	 *
+	 * @return array
+	 */
+	public function data_should_not_create_a_user_list() {
+		return array(
+			'an empty user query result' => array(
+				'args'     => array(
+					'include' => array( 9999 ),
+				),
+				'expected' => '',
+			),
+		);
+	}
+}
diff --git a/tests/phpunit/tests/widgets.php b/tests/phpunit/tests/widgets.php
index 679d2b7a59..7cfce4719b 100644
--- a/tests/phpunit/tests/widgets.php
+++ b/tests/phpunit/tests/widgets.php
@@ -590,6 +590,42 @@ class Tests_Widgets extends WP_UnitTestCase {
 
 	// @todo Test WP_Widget::display_callback().
 
+	/**
+	 * @ticket 52728
+	 */
+	function test_widget_display_callback_handles_arrayobject() {
+		$widget = new WP_Widget_Text();
+
+		register_widget( $widget );
+
+		add_filter(
+			"pre_option_{$widget->option_name}",
+			static function() {
+				return new ArrayObject(
+					array(
+						2              => array( 'title' => 'Test Title' ),
+						'_multiwidget' => 1,
+						'__i__'        => true,
+					)
+				);
+			}
+		);
+
+		$this->expectOutputRegex( '/Test Title/' );
+
+		$widget->display_callback(
+			array(
+				'before_widget' => '<section>',
+				'after_widget'  => "</section>\n",
+				'before_title'  => '<h2>',
+				'after_title'   => "</h2>\n",
+			),
+			2
+		);
+
+		unregister_widget( $widget );
+	}
+
 	/**
 	 * @see WP_Widget::is_preview()
 	 */
diff --git a/tests/phpunit/tests/widgets/wpWidgetCustomHtml.php b/tests/phpunit/tests/widgets/wpWidgetCustomHtml.php
index 047b5653a0..a2ef5c35a7 100644
--- a/tests/phpunit/tests/widgets/wpWidgetCustomHtml.php
+++ b/tests/phpunit/tests/widgets/wpWidgetCustomHtml.php
@@ -185,7 +185,7 @@ class Tests_Widgets_wpWidgetCustomHtml extends WP_UnitTestCase {
 			'content' => $instance['content'],
 		);
 		$result   = $widget->update( $instance, array() );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Make sure KSES is applying as expected.
 		add_filter( 'map_meta_cap', array( $this, 'grant_unfiltered_html_cap' ), 10, 2 );
@@ -193,7 +193,7 @@ class Tests_Widgets_wpWidgetCustomHtml extends WP_UnitTestCase {
 		$instance['content'] = '<script>alert( "Howdy!" );</script>';
 		$expected['content'] = $instance['content'];
 		$result              = $widget->update( $instance, array() );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 		remove_filter( 'map_meta_cap', array( $this, 'grant_unfiltered_html_cap' ) );
 
 		add_filter( 'map_meta_cap', array( $this, 'revoke_unfiltered_html_cap' ), 10, 2 );
@@ -201,7 +201,7 @@ class Tests_Widgets_wpWidgetCustomHtml extends WP_UnitTestCase {
 		$instance['content'] = '<script>alert( "Howdy!" );</script>';
 		$expected['content'] = wp_kses_post( $instance['content'] );
 		$result              = $widget->update( $instance, array() );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 		remove_filter( 'map_meta_cap', array( $this, 'revoke_unfiltered_html_cap' ), 10 );
 	}
 
diff --git a/tests/phpunit/tests/widgets/wpWidgetMedia.php b/tests/phpunit/tests/widgets/wpWidgetMedia.php
index cd127fb999..fd85f37714 100644
--- a/tests/phpunit/tests/widgets/wpWidgetMedia.php
+++ b/tests/phpunit/tests/widgets/wpWidgetMedia.php
@@ -244,7 +244,7 @@ class Tests_Widgets_wpWidgetMedia extends WP_UnitTestCase {
 			'attachment_id' => 1,
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid attachment ID.
 		$result = $widget->update(
@@ -260,7 +260,7 @@ class Tests_Widgets_wpWidgetMedia extends WP_UnitTestCase {
 			'url' => 'https://example.org',
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid attachment url.
 		$result = $widget->update(
@@ -276,7 +276,7 @@ class Tests_Widgets_wpWidgetMedia extends WP_UnitTestCase {
 			'title' => 'What a title',
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid attachment title.
 		$result = $widget->update(
diff --git a/tests/phpunit/tests/widgets/wpWidgetMediaAudio.php b/tests/phpunit/tests/widgets/wpWidgetMediaAudio.php
index 5f54fc2d8b..a02c1bb042 100644
--- a/tests/phpunit/tests/widgets/wpWidgetMediaAudio.php
+++ b/tests/phpunit/tests/widgets/wpWidgetMediaAudio.php
@@ -125,7 +125,7 @@ class Tests_Widgets_wpWidgetMediaAudio extends WP_UnitTestCase {
 			'attachment_id' => 1,
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid attachment ID.
 		$result = $widget->update(
@@ -141,7 +141,7 @@ class Tests_Widgets_wpWidgetMediaAudio extends WP_UnitTestCase {
 			'url' => 'https://chickenandribs.org',
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid attachment url.
 		$result = $widget->update(
@@ -158,7 +158,7 @@ class Tests_Widgets_wpWidgetMediaAudio extends WP_UnitTestCase {
 			'loop' => true,
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid loop setting.
 		$result = $widget->update(
@@ -174,7 +174,7 @@ class Tests_Widgets_wpWidgetMediaAudio extends WP_UnitTestCase {
 			'title' => 'An audio sample of parrots',
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid attachment title.
 		$result = $widget->update(
@@ -190,7 +190,7 @@ class Tests_Widgets_wpWidgetMediaAudio extends WP_UnitTestCase {
 			'preload' => 'none',
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid preload setting.
 		$result = $widget->update(
diff --git a/tests/phpunit/tests/widgets/wpWidgetMediaImage.php b/tests/phpunit/tests/widgets/wpWidgetMediaImage.php
index 82e67e189e..57ffc9a6aa 100644
--- a/tests/phpunit/tests/widgets/wpWidgetMediaImage.php
+++ b/tests/phpunit/tests/widgets/wpWidgetMediaImage.php
@@ -132,7 +132,7 @@ class Tests_Widgets_wpWidgetMediaImage extends WP_UnitTestCase {
 			'attachment_id' => 1,
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid attachment ID.
 		$result = $widget->update(
@@ -148,7 +148,7 @@ class Tests_Widgets_wpWidgetMediaImage extends WP_UnitTestCase {
 			'url' => 'https://example.org',
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid attachment url.
 		$result = $widget->update(
@@ -165,7 +165,7 @@ class Tests_Widgets_wpWidgetMediaImage extends WP_UnitTestCase {
 			'title' => 'What a title',
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid attachment title.
 		$result = $widget->update(
@@ -181,7 +181,7 @@ class Tests_Widgets_wpWidgetMediaImage extends WP_UnitTestCase {
 			'size' => 'thumbnail',
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid image size.
 		$result = $widget->update(
@@ -197,7 +197,7 @@ class Tests_Widgets_wpWidgetMediaImage extends WP_UnitTestCase {
 			'width' => 300,
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid image width.
 		$result = $widget->update(
@@ -213,7 +213,7 @@ class Tests_Widgets_wpWidgetMediaImage extends WP_UnitTestCase {
 			'height' => 200,
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid image height.
 		$result = $widget->update(
@@ -229,7 +229,7 @@ class Tests_Widgets_wpWidgetMediaImage extends WP_UnitTestCase {
 			'caption' => 'A caption with <a href="#">link</a>',
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid image caption.
 		$result = $widget->update(
@@ -250,7 +250,7 @@ class Tests_Widgets_wpWidgetMediaImage extends WP_UnitTestCase {
 			'alt' => 'A water tower',
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid alt text.
 		$result = $widget->update(
@@ -271,7 +271,7 @@ class Tests_Widgets_wpWidgetMediaImage extends WP_UnitTestCase {
 			'link_type' => 'file',
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid link type.
 		$result = $widget->update(
@@ -287,7 +287,7 @@ class Tests_Widgets_wpWidgetMediaImage extends WP_UnitTestCase {
 			'link_url' => 'https://example.org',
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid link url.
 		$result = $widget->update(
@@ -304,7 +304,7 @@ class Tests_Widgets_wpWidgetMediaImage extends WP_UnitTestCase {
 			'image_classes' => 'A water tower',
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid image classes.
 		$result = $widget->update(
@@ -325,7 +325,7 @@ class Tests_Widgets_wpWidgetMediaImage extends WP_UnitTestCase {
 			'link_classes' => 'A water tower',
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid link classes.
 		$result = $widget->update(
@@ -346,7 +346,7 @@ class Tests_Widgets_wpWidgetMediaImage extends WP_UnitTestCase {
 			'link_rel' => 'previous',
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid rel text.
 		$result = $widget->update(
@@ -367,7 +367,7 @@ class Tests_Widgets_wpWidgetMediaImage extends WP_UnitTestCase {
 			'link_target_blank' => false,
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid  link target.
 		$result = $widget->update(
@@ -383,7 +383,7 @@ class Tests_Widgets_wpWidgetMediaImage extends WP_UnitTestCase {
 			'image_title' => 'What a title',
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid image title.
 		$result = $widget->update(
diff --git a/tests/phpunit/tests/widgets/wpWidgetMediaVideo.php b/tests/phpunit/tests/widgets/wpWidgetMediaVideo.php
index d3a6b9e266..2d4207e9f0 100644
--- a/tests/phpunit/tests/widgets/wpWidgetMediaVideo.php
+++ b/tests/phpunit/tests/widgets/wpWidgetMediaVideo.php
@@ -126,7 +126,7 @@ class Tests_Widgets_wpWidgetMediaVideo extends WP_UnitTestCase {
 			'attachment_id' => 1,
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid attachment ID.
 		$result = $widget->update(
@@ -142,7 +142,7 @@ class Tests_Widgets_wpWidgetMediaVideo extends WP_UnitTestCase {
 			'url' => 'https://chickenandribs.org',
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid attachment url.
 		$result = $widget->update(
@@ -159,7 +159,7 @@ class Tests_Widgets_wpWidgetMediaVideo extends WP_UnitTestCase {
 			'loop' => true,
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid loop setting.
 		$result = $widget->update(
@@ -175,7 +175,7 @@ class Tests_Widgets_wpWidgetMediaVideo extends WP_UnitTestCase {
 			'title' => 'A video of goats',
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid attachment title.
 		$result = $widget->update(
@@ -191,7 +191,7 @@ class Tests_Widgets_wpWidgetMediaVideo extends WP_UnitTestCase {
 			'preload' => 'none',
 		);
 		$result   = $widget->update( $expected, $instance );
-		$this->assertSame( $result, $expected );
+		$this->assertSame( $expected, $result );
 
 		// Should filter invalid preload setting.
 		$result = $widget->update(
diff --git a/tests/phpunit/tests/xmlrpc/wp/editProfile.php b/tests/phpunit/tests/xmlrpc/wp/editProfile.php
index 7c00626908..2789dbe460 100644
--- a/tests/phpunit/tests/xmlrpc/wp/editProfile.php
+++ b/tests/phpunit/tests/xmlrpc/wp/editProfile.php
@@ -16,13 +16,13 @@ class Tests_XMLRPC_wp_editProfile extends WP_XMLRPC_UnitTestCase {
 		$subscriber_id = $this->make_user_by_role( 'subscriber' );
 
 		$new_data = array(
-			'first_name'   => rand_str(),
-			'last_name'    => rand_str(),
+			'first_name'   => 'firstname',
+			'last_name'    => 'lastname',
 			'url'          => 'http://www.example.org/subscriber',
-			'display_name' => rand_str(),
-			'nickname'     => rand_str(),
-			'nicename'     => rand_str(),
-			'bio'          => rand_str( 200 ),
+			'display_name' => 'displayname',
+			'nickname'     => 'nickname',
+			'nicename'     => 'nicename',
+			'bio'          => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
 		);
 		$result   = $this->myxmlrpcserver->wp_editProfile( array( 1, 'subscriber', 'subscriber', $new_data ) );
 		$this->assertNotIXRError( $result );
diff --git a/tests/phpunit/tests/xmlrpc/wp/getComment.php b/tests/phpunit/tests/xmlrpc/wp/getComment.php
index e43a733910..08cd4a5b00 100644
--- a/tests/phpunit/tests/xmlrpc/wp/getComment.php
+++ b/tests/phpunit/tests/xmlrpc/wp/getComment.php
@@ -18,7 +18,7 @@ class Tests_XMLRPC_wp_getComment extends WP_XMLRPC_UnitTestCase {
 			'comment_author'       => 'Test commenter',
 			'comment_author_url'   => 'http://example.com/',
 			'comment_author_email' => 'example@example.com',
-			'comment_content'      => rand_str( 100 ),
+			'comment_content'      => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
 		);
 		self::$parent_comment_id   = wp_insert_comment( self::$parent_comment_data );
 
@@ -28,7 +28,7 @@ class Tests_XMLRPC_wp_getComment extends WP_XMLRPC_UnitTestCase {
 			'comment_author_url'   => 'http://example.org/',
 			'comment_author_email' => 'example@example.org',
 			'comment_parent'       => self::$parent_comment_id,
-			'comment_content'      => rand_str( 100 ),
+			'comment_content'      => 'Duis non neque cursus, commodo massa in, bibendum nisl.',
 		);
 		self::$child_comment_id   = wp_insert_comment( self::$child_comment_data );
 	}
diff --git a/tests/phpunit/tests/xmlrpc/wp/getPost.php b/tests/phpunit/tests/xmlrpc/wp/getPost.php
index 0fd81ada8a..be25ca2770 100644
--- a/tests/phpunit/tests/xmlrpc/wp/getPost.php
+++ b/tests/phpunit/tests/xmlrpc/wp/getPost.php
@@ -14,9 +14,9 @@ class Tests_XMLRPC_wp_getPost extends WP_XMLRPC_UnitTestCase {
 
 		$this->post_date_ts            = strtotime( '+1 day' );
 		$this->post_data               = array(
-			'post_title'   => rand_str(),
-			'post_content' => rand_str( 2000 ),
-			'post_excerpt' => rand_str( 100 ),
+			'post_title'   => 'Post Title',
+			'post_content' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
+			'post_excerpt' => 'Post Excerpt',
 			'post_author'  => $this->make_user_by_role( 'author' ),
 			'post_date'    => date_format( date_create( "@{$this->post_date_ts}" ), 'Y-m-d H:i:s' ),
 		);
diff --git a/tests/phpunit/tests/xmlrpc/wp/newComment.php b/tests/phpunit/tests/xmlrpc/wp/newComment.php
index 6cc6c30160..7c2eacc6b1 100644
--- a/tests/phpunit/tests/xmlrpc/wp/newComment.php
+++ b/tests/phpunit/tests/xmlrpc/wp/newComment.php
@@ -55,7 +55,7 @@ class Tests_XMLRPC_wp_newComment extends WP_XMLRPC_UnitTestCase {
 				'administrator',
 				self::$posts['publish']->ID,
 				array(
-					'content' => rand_str( 100 ),
+					'content' => 'Content',
 				),
 			)
 		);
@@ -155,7 +155,7 @@ class Tests_XMLRPC_wp_newComment extends WP_XMLRPC_UnitTestCase {
 				'administrator',
 				$post->ID,
 				array(
-					'content' => rand_str( 100 ),
+					'content' => 'Content',
 				),
 			)
 		);
@@ -171,7 +171,7 @@ class Tests_XMLRPC_wp_newComment extends WP_XMLRPC_UnitTestCase {
 			'administrator',
 			self::$posts['publish']->ID,
 			array(
-				'content' => rand_str( 100 ),
+				'content' => 'Content',
 			),
 		);
 
diff --git a/tests/qunit/fixtures/wp-api-generated.js b/tests/qunit/fixtures/wp-api-generated.js
index 24296670a0..9566fb0ded 100644
--- a/tests/qunit/fixtures/wp-api-generated.js
+++ b/tests/qunit/fixtures/wp-api-generated.js
@@ -18,7 +18,13 @@ mockedApiResponse.Schema = {
         "wp-site-health/v1",
         "wp-block-editor/v1"
     ],
-    "authentication": [],
+    "authentication": {
+        "application-passwords": {
+            "endpoints": {
+                "authorization": "http://example.org/wp-admin/authorize-application.php"
+            }
+        }
+    },
     "routes": {
         "/": {
             "namespace": "",
@@ -261,6 +267,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "GET"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "context": {
                             "description": "Scope under which the request is made; determines fields present in response.",
@@ -602,6 +611,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "POST"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "date": {
                             "description": "The date the post was published, in the site's timezone.",
@@ -840,6 +852,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "GET"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "id": {
                             "description": "Unique identifier for the post.",
@@ -870,6 +885,9 @@ mockedApiResponse.Schema = {
                         "PUT",
                         "PATCH"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "id": {
                             "description": "Unique identifier for the post.",
@@ -1098,6 +1116,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "DELETE"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "id": {
                             "description": "Unique identifier for the post.",
@@ -1579,6 +1600,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "GET"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "context": {
                             "description": "Scope under which the request is made; determines fields present in response.",
@@ -1766,6 +1790,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "POST"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "date": {
                             "description": "The date the post was published, in the site's timezone.",
@@ -1976,6 +2003,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "GET"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "id": {
                             "description": "Unique identifier for the post.",
@@ -2006,6 +2036,9 @@ mockedApiResponse.Schema = {
                         "PUT",
                         "PATCH"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "id": {
                             "description": "Unique identifier for the post.",
@@ -2206,6 +2239,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "DELETE"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "id": {
                             "description": "Unique identifier for the post.",
@@ -3385,7 +3421,7 @@ mockedApiResponse.Schema = {
                 }
             ]
         },
-        "/wp/v2/blocks": {
+        "/wp/v2/menu-items": {
             "namespace": "wp/v2",
             "methods": [
                 "GET",
@@ -3396,6 +3432,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "GET"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "context": {
                             "description": "Scope under which the request is made; determines fields present in response.",
@@ -3418,7 +3457,7 @@ mockedApiResponse.Schema = {
                         "per_page": {
                             "description": "Maximum number of items to be returned in result set.",
                             "type": "integer",
-                            "default": 10,
+                            "default": 100,
                             "minimum": 1,
                             "maximum": 100,
                             "required": false
@@ -3478,7 +3517,7 @@ mockedApiResponse.Schema = {
                         "order": {
                             "description": "Order sort attribute ascending or descending.",
                             "type": "string",
-                            "default": "desc",
+                            "default": "asc",
                             "enum": [
                                 "asc",
                                 "desc"
@@ -3486,9 +3525,9 @@ mockedApiResponse.Schema = {
                             "required": false
                         },
                         "orderby": {
-                            "description": "Sort collection by post attribute.",
+                            "description": "Sort collection by object attribute.",
                             "type": "string",
-                            "default": "date",
+                            "default": "menu_order",
                             "enum": [
                                 "author",
                                 "date",
@@ -3499,7 +3538,8 @@ mockedApiResponse.Schema = {
                                 "relevance",
                                 "slug",
                                 "include_slugs",
-                                "title"
+                                "title",
+                                "menu_order"
                             ],
                             "required": false
                         },
@@ -3534,6 +3574,97 @@ mockedApiResponse.Schema = {
                                 "type": "string"
                             },
                             "required": false
+                        },
+                        "tax_relation": {
+                            "description": "Limit result set based on relationship between multiple taxonomies.",
+                            "type": "string",
+                            "enum": [
+                                "AND",
+                                "OR"
+                            ],
+                            "required": false
+                        },
+                        "menus": {
+                            "description": "Limit result set to items with specific terms assigned in the menus taxonomy.",
+                            "type": [
+                                "object",
+                                "array"
+                            ],
+                            "oneOf": [
+                                {
+                                    "title": "Term ID List",
+                                    "description": "Match terms with the listed IDs.",
+                                    "type": "array",
+                                    "items": {
+                                        "type": "integer"
+                                    }
+                                },
+                                {
+                                    "title": "Term ID Taxonomy Query",
+                                    "description": "Perform an advanced term query.",
+                                    "type": "object",
+                                    "properties": {
+                                        "terms": {
+                                            "description": "Term IDs.",
+                                            "type": "array",
+                                            "items": {
+                                                "type": "integer"
+                                            },
+                                            "default": []
+                                        },
+                                        "operator": {
+                                            "description": "Whether items must be assigned all or any of the specified terms.",
+                                            "type": "string",
+                                            "enum": [
+                                                "AND",
+                                                "OR"
+                                            ],
+                                            "default": "OR"
+                                        }
+                                    },
+                                    "additionalProperties": false
+                                }
+                            ],
+                            "required": false
+                        },
+                        "menus_exclude": {
+                            "description": "Limit result set to items except those with specific terms assigned in the menus taxonomy.",
+                            "type": [
+                                "object",
+                                "array"
+                            ],
+                            "oneOf": [
+                                {
+                                    "title": "Term ID List",
+                                    "description": "Match terms with the listed IDs.",
+                                    "type": "array",
+                                    "items": {
+                                        "type": "integer"
+                                    }
+                                },
+                                {
+                                    "title": "Term ID Taxonomy Query",
+                                    "description": "Perform an advanced term query.",
+                                    "type": "object",
+                                    "properties": {
+                                        "terms": {
+                                            "description": "Term IDs.",
+                                            "type": "array",
+                                            "items": {
+                                                "type": "integer"
+                                            },
+                                            "default": []
+                                        }
+                                    },
+                                    "additionalProperties": false
+                                }
+                            ],
+                            "required": false
+                        },
+                        "menu_order": {
+                            "description": "Limit result set to posts with a specific menu_order value.",
+                            "type": "integer",
+                            "required": false
                         }
                     }
                 },
@@ -3541,32 +3672,52 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "POST"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
-                        "date": {
-                            "description": "The date the post was published, in the site's timezone.",
-                            "type": [
-                                "string",
-                                "null"
-                            ],
-                            "format": "date-time",
-                            "required": false
-                        },
-                        "date_gmt": {
-                            "description": "The date the post was published, as GMT.",
+                        "title": {
+                            "description": "The title for the object.",
                             "type": [
                                 "string",
-                                "null"
+                                "object"
                             ],
-                            "format": "date-time",
+                            "properties": {
+                                "raw": {
+                                    "description": "Title for the object, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "edit"
+                                    ]
+                                },
+                                "rendered": {
+                                    "description": "HTML title for the object, transformed for display.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
                             "required": false
                         },
-                        "slug": {
-                            "description": "An alphanumeric identifier for the post unique to its type.",
+                        "type": {
+                            "default": "custom",
+                            "description": "The family of objects originally represented, such as \"post_type\" or \"taxonomy\".",
                             "type": "string",
+                            "enum": [
+                                "taxonomy",
+                                "post_type",
+                                "post_type_archive",
+                                "custom"
+                            ],
                             "required": false
                         },
                         "status": {
-                            "description": "A named status for the post.",
+                            "default": "publish",
+                            "description": "A named status for the object.",
                             "type": "string",
                             "enum": [
                                 "publish",
@@ -3577,72 +3728,96 @@ mockedApiResponse.Schema = {
                             ],
                             "required": false
                         },
-                        "password": {
-                            "description": "A password to protect access to the content and excerpt.",
+                        "parent": {
+                            "default": 0,
+                            "description": "The ID for the parent of the object.",
+                            "type": "integer",
+                            "minimum": 0,
+                            "required": false
+                        },
+                        "attr_title": {
+                            "description": "Text for the title attribute of the link element for this menu item.",
                             "type": "string",
                             "required": false
                         },
-                        "title": {
-                            "description": "The title for the post.",
-                            "type": "object",
-                            "properties": {
-                                "raw": {
-                                    "description": "Title for the post, as it exists in the database.",
-                                    "type": "string",
-                                    "context": [
-                                        "view",
-                                        "edit"
-                                    ]
-                                }
+                        "classes": {
+                            "description": "Class names for the link element of this menu item.",
+                            "type": "array",
+                            "items": {
+                                "type": "string"
                             },
                             "required": false
                         },
-                        "content": {
-                            "description": "The content for the post.",
-                            "type": "object",
-                            "properties": {
-                                "raw": {
-                                    "description": "Content for the post, as it exists in the database.",
-                                    "type": "string",
-                                    "context": [
-                                        "view",
-                                        "edit"
-                                    ]
-                                },
-                                "block_version": {
-                                    "description": "Version of the content block format used by the post.",
-                                    "type": "integer",
-                                    "context": [
-                                        "edit"
-                                    ],
-                                    "readonly": true
-                                },
-                                "protected": {
-                                    "description": "Whether the content is protected with a password.",
-                                    "type": "boolean",
-                                    "context": [
-                                        "view",
-                                        "edit",
-                                        "embed"
-                                    ],
-                                    "readonly": true
-                                }
-                            },
+                        "description": {
+                            "description": "The description of this menu item.",
+                            "type": "string",
                             "required": false
                         },
-                        "template": {
-                            "description": "The theme file to use to display the post.",
+                        "menu_order": {
+                            "default": 1,
+                            "description": "The DB ID of the nav_menu_item that is this item's menu parent, if any, otherwise 0.",
+                            "type": "integer",
+                            "minimum": 1,
+                            "required": false
+                        },
+                        "object": {
+                            "description": "The type of object originally represented, such as \"category\", \"post\", or \"attachment\".",
+                            "type": "string",
+                            "required": false
+                        },
+                        "object_id": {
+                            "default": 0,
+                            "description": "The database ID of the original object this menu item represents, for example the ID for posts or the term_id for categories.",
+                            "type": "integer",
+                            "minimum": 0,
+                            "required": false
+                        },
+                        "target": {
+                            "description": "The target attribute of the link element for this menu item.",
+                            "type": "string",
+                            "enum": [
+                                "_blank",
+                                ""
+                            ],
+                            "required": false
+                        },
+                        "url": {
+                            "description": "The URL to which this menu item points.",
                             "type": "string",
+                            "format": "uri",
+                            "required": false
+                        },
+                        "xfn": {
+                            "description": "The XFN relationship expressed in the link of this menu item.",
+                            "type": "array",
+                            "items": {
+                                "type": "string"
+                            },
+                            "required": false
+                        },
+                        "menus": {
+                            "description": "The terms assigned to the object in the nav_menu taxonomy.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "meta": {
+                            "description": "Meta fields.",
+                            "type": "object",
+                            "properties": [],
                             "required": false
                         }
                     }
                 }
             ],
             "_links": {
-                "self": "http://example.org/index.php?rest_route=/wp/v2/blocks"
+                "self": [
+                    {
+                        "href": "http://example.org/index.php?rest_route=/wp/v2/menu-items"
+                    }
+                ]
             }
         },
-        "/wp/v2/blocks/(?P<id>[\\d]+)": {
+        "/wp/v2/menu-items/(?P<id>[\\d]+)": {
             "namespace": "wp/v2",
             "methods": [
                 "GET",
@@ -3656,6 +3831,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "GET"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "id": {
                             "description": "Unique identifier for the post.",
@@ -3672,11 +3850,6 @@ mockedApiResponse.Schema = {
                             ],
                             "default": "view",
                             "required": false
-                        },
-                        "password": {
-                            "description": "The password for the post if it is password protected.",
-                            "type": "string",
-                            "required": false
                         }
                     }
                 },
@@ -3686,37 +3859,55 @@ mockedApiResponse.Schema = {
                         "PUT",
                         "PATCH"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "id": {
                             "description": "Unique identifier for the post.",
                             "type": "integer",
                             "required": false
                         },
-                        "date": {
-                            "description": "The date the post was published, in the site's timezone.",
-                            "type": [
-                                "string",
-                                "null"
-                            ],
-                            "format": "date-time",
-                            "required": false
-                        },
-                        "date_gmt": {
-                            "description": "The date the post was published, as GMT.",
+                        "title": {
+                            "description": "The title for the object.",
                             "type": [
                                 "string",
-                                "null"
+                                "object"
                             ],
-                            "format": "date-time",
+                            "properties": {
+                                "raw": {
+                                    "description": "Title for the object, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "edit"
+                                    ]
+                                },
+                                "rendered": {
+                                    "description": "HTML title for the object, transformed for display.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
                             "required": false
                         },
-                        "slug": {
-                            "description": "An alphanumeric identifier for the post unique to its type.",
+                        "type": {
+                            "description": "The family of objects originally represented, such as \"post_type\" or \"taxonomy\".",
                             "type": "string",
+                            "enum": [
+                                "taxonomy",
+                                "post_type",
+                                "post_type_archive",
+                                "custom"
+                            ],
                             "required": false
                         },
                         "status": {
-                            "description": "A named status for the post.",
+                            "description": "A named status for the object.",
                             "type": "string",
                             "enum": [
                                 "publish",
@@ -3727,62 +3918,79 @@ mockedApiResponse.Schema = {
                             ],
                             "required": false
                         },
-                        "password": {
-                            "description": "A password to protect access to the content and excerpt.",
+                        "parent": {
+                            "description": "The ID for the parent of the object.",
+                            "type": "integer",
+                            "minimum": 0,
+                            "required": false
+                        },
+                        "attr_title": {
+                            "description": "Text for the title attribute of the link element for this menu item.",
                             "type": "string",
                             "required": false
                         },
-                        "title": {
-                            "description": "The title for the post.",
-                            "type": "object",
-                            "properties": {
-                                "raw": {
-                                    "description": "Title for the post, as it exists in the database.",
-                                    "type": "string",
-                                    "context": [
-                                        "view",
-                                        "edit"
-                                    ]
-                                }
+                        "classes": {
+                            "description": "Class names for the link element of this menu item.",
+                            "type": "array",
+                            "items": {
+                                "type": "string"
                             },
                             "required": false
                         },
-                        "content": {
-                            "description": "The content for the post.",
-                            "type": "object",
-                            "properties": {
-                                "raw": {
-                                    "description": "Content for the post, as it exists in the database.",
-                                    "type": "string",
-                                    "context": [
-                                        "view",
-                                        "edit"
-                                    ]
-                                },
-                                "block_version": {
-                                    "description": "Version of the content block format used by the post.",
-                                    "type": "integer",
-                                    "context": [
-                                        "edit"
-                                    ],
-                                    "readonly": true
-                                },
-                                "protected": {
-                                    "description": "Whether the content is protected with a password.",
-                                    "type": "boolean",
-                                    "context": [
-                                        "view",
-                                        "edit",
-                                        "embed"
-                                    ],
-                                    "readonly": true
-                                }
-                            },
+                        "description": {
+                            "description": "The description of this menu item.",
+                            "type": "string",
                             "required": false
                         },
-                        "template": {
-                            "description": "The theme file to use to display the post.",
+                        "menu_order": {
+                            "description": "The DB ID of the nav_menu_item that is this item's menu parent, if any, otherwise 0.",
+                            "type": "integer",
+                            "minimum": 1,
+                            "required": false
+                        },
+                        "object": {
+                            "description": "The type of object originally represented, such as \"category\", \"post\", or \"attachment\".",
+                            "type": "string",
+                            "required": false
+                        },
+                        "object_id": {
+                            "description": "The database ID of the original object this menu item represents, for example the ID for posts or the term_id for categories.",
+                            "type": "integer",
+                            "minimum": 0,
+                            "required": false
+                        },
+                        "target": {
+                            "description": "The target attribute of the link element for this menu item.",
+                            "type": "string",
+                            "enum": [
+                                "_blank",
+                                ""
+                            ],
+                            "required": false
+                        },
+                        "url": {
+                            "description": "The URL to which this menu item points.",
                             "type": "string",
+                            "format": "uri",
+                            "required": false
+                        },
+                        "xfn": {
+                            "description": "The XFN relationship expressed in the link of this menu item.",
+                            "type": "array",
+                            "items": {
+                                "type": "string"
+                            },
+                            "required": false
+                        },
+                        "menus": {
+                            "description": "The terms assigned to the object in the nav_menu taxonomy.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "meta": {
+                            "description": "Meta fields.",
+                            "type": "object",
+                            "properties": [],
                             "required": false
                         }
                     }
@@ -3791,6 +3999,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "DELETE"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "id": {
                             "description": "Unique identifier for the post.",
@@ -3807,10 +4018,11 @@ mockedApiResponse.Schema = {
                 }
             ]
         },
-        "/wp/v2/blocks/(?P<parent>[\\d]+)/revisions": {
+        "/wp/v2/menu-items/(?P<id>[\\d]+)/autosaves": {
             "namespace": "wp/v2",
             "methods": [
-                "GET"
+                "GET",
+                "POST"
             ],
             "endpoints": [
                 {
@@ -3819,7 +4031,7 @@ mockedApiResponse.Schema = {
                     ],
                     "args": {
                         "parent": {
-                            "description": "The ID for the parent of the revision.",
+                            "description": "The ID for the parent of the autosave.",
                             "type": "integer",
                             "required": false
                         },
@@ -3833,83 +4045,147 @@ mockedApiResponse.Schema = {
                             ],
                             "default": "view",
                             "required": false
-                        },
-                        "page": {
-                            "description": "Current page of the collection.",
+                        }
+                    }
+                },
+                {
+                    "methods": [
+                        "POST"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the object.",
                             "type": "integer",
-                            "default": 1,
-                            "minimum": 1,
+                            "minimum": 0,
                             "required": false
                         },
-                        "per_page": {
-                            "description": "Maximum number of items to be returned in result set.",
-                            "type": "integer",
-                            "minimum": 1,
-                            "maximum": 100,
+                        "title": {
+                            "description": "The title for the object.",
+                            "type": [
+                                "string",
+                                "object"
+                            ],
+                            "properties": {
+                                "raw": {
+                                    "description": "Title for the object, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "edit"
+                                    ]
+                                },
+                                "rendered": {
+                                    "description": "HTML title for the object, transformed for display.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
                             "required": false
                         },
-                        "search": {
-                            "description": "Limit results to those matching a string.",
+                        "type": {
+                            "description": "The family of objects originally represented, such as \"post_type\" or \"taxonomy\".",
                             "type": "string",
+                            "enum": [
+                                "taxonomy",
+                                "post_type",
+                                "post_type_archive",
+                                "custom"
+                            ],
                             "required": false
                         },
-                        "exclude": {
-                            "description": "Ensure result set excludes specific IDs.",
-                            "type": "array",
-                            "items": {
-                                "type": "integer"
-                            },
-                            "default": [],
+                        "status": {
+                            "description": "A named status for the object.",
+                            "type": "string",
+                            "enum": [
+                                "publish",
+                                "future",
+                                "draft",
+                                "pending",
+                                "private"
+                            ],
                             "required": false
                         },
-                        "include": {
-                            "description": "Limit result set to specific IDs.",
+                        "attr_title": {
+                            "description": "Text for the title attribute of the link element for this menu item.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "classes": {
+                            "description": "Class names for the link element of this menu item.",
                             "type": "array",
                             "items": {
-                                "type": "integer"
+                                "type": "string"
                             },
-                            "default": [],
                             "required": false
                         },
-                        "offset": {
-                            "description": "Offset the result set by a specific number of items.",
+                        "description": {
+                            "description": "The description of this menu item.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "menu_order": {
+                            "description": "The DB ID of the nav_menu_item that is this item's menu parent, if any, otherwise 0.",
                             "type": "integer",
+                            "minimum": 1,
                             "required": false
                         },
-                        "order": {
-                            "description": "Order sort attribute ascending or descending.",
+                        "object": {
+                            "description": "The type of object originally represented, such as \"category\", \"post\", or \"attachment\".",
                             "type": "string",
-                            "default": "desc",
-                            "enum": [
-                                "asc",
-                                "desc"
-                            ],
                             "required": false
                         },
-                        "orderby": {
-                            "description": "Sort collection by object attribute.",
+                        "object_id": {
+                            "description": "The database ID of the original object this menu item represents, for example the ID for posts or the term_id for categories.",
+                            "type": "integer",
+                            "minimum": 0,
+                            "required": false
+                        },
+                        "target": {
+                            "description": "The target attribute of the link element for this menu item.",
                             "type": "string",
-                            "default": "date",
                             "enum": [
-                                "date",
-                                "id",
-                                "include",
-                                "relevance",
-                                "slug",
-                                "include_slugs",
-                                "title"
+                                "_blank",
+                                ""
                             ],
                             "required": false
+                        },
+                        "url": {
+                            "description": "The URL to which this menu item points.",
+                            "type": "string",
+                            "format": "uri",
+                            "required": false
+                        },
+                        "xfn": {
+                            "description": "The XFN relationship expressed in the link of this menu item.",
+                            "type": "array",
+                            "items": {
+                                "type": "string"
+                            },
+                            "required": false
+                        },
+                        "menus": {
+                            "description": "The terms assigned to the object in the nav_menu taxonomy.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "meta": {
+                            "description": "Meta fields.",
+                            "type": "object",
+                            "properties": [],
+                            "required": false
                         }
                     }
                 }
             ]
         },
-        "/wp/v2/blocks/(?P<parent>[\\d]+)/revisions/(?P<id>[\\d]+)": {
+        "/wp/v2/menu-items/(?P<parent>[\\d]+)/autosaves/(?P<id>[\\d]+)": {
             "namespace": "wp/v2",
             "methods": [
-                "GET",
-                "DELETE"
+                "GET"
             ],
             "endpoints": [
                 {
@@ -3918,12 +4194,12 @@ mockedApiResponse.Schema = {
                     ],
                     "args": {
                         "parent": {
-                            "description": "The ID for the parent of the revision.",
+                            "description": "The ID for the parent of the autosave.",
                             "type": "integer",
                             "required": false
                         },
                         "id": {
-                            "description": "Unique identifier for the revision.",
+                            "description": "The ID for the autosave.",
                             "type": "integer",
                             "required": false
                         },
@@ -3939,33 +4215,10 @@ mockedApiResponse.Schema = {
                             "required": false
                         }
                     }
-                },
-                {
-                    "methods": [
-                        "DELETE"
-                    ],
-                    "args": {
-                        "parent": {
-                            "description": "The ID for the parent of the revision.",
-                            "type": "integer",
-                            "required": false
-                        },
-                        "id": {
-                            "description": "Unique identifier for the revision.",
-                            "type": "integer",
-                            "required": false
-                        },
-                        "force": {
-                            "type": "boolean",
-                            "default": false,
-                            "description": "Required to be true, as revisions do not support trashing.",
-                            "required": false
-                        }
-                    }
                 }
             ]
         },
-        "/wp/v2/blocks/(?P<id>[\\d]+)/autosaves": {
+        "/wp/v2/blocks": {
             "namespace": "wp/v2",
             "methods": [
                 "GET",
@@ -3976,12 +4229,10 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "GET"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
-                        "parent": {
-                            "description": "The ID for the parent of the autosave.",
-                            "type": "integer",
-                            "required": false
-                        },
                         "context": {
                             "description": "Scope under which the request is made; determines fields present in response.",
                             "type": "string",
@@ -3992,6 +4243,133 @@ mockedApiResponse.Schema = {
                             ],
                             "default": "view",
                             "required": false
+                        },
+                        "page": {
+                            "description": "Current page of the collection.",
+                            "type": "integer",
+                            "default": 1,
+                            "minimum": 1,
+                            "required": false
+                        },
+                        "per_page": {
+                            "description": "Maximum number of items to be returned in result set.",
+                            "type": "integer",
+                            "default": 10,
+                            "minimum": 1,
+                            "maximum": 100,
+                            "required": false
+                        },
+                        "search": {
+                            "description": "Limit results to those matching a string.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "after": {
+                            "description": "Limit response to posts published after a given ISO8601 compliant date.",
+                            "type": "string",
+                            "format": "date-time",
+                            "required": false
+                        },
+                        "modified_after": {
+                            "description": "Limit response to posts modified after a given ISO8601 compliant date.",
+                            "type": "string",
+                            "format": "date-time",
+                            "required": false
+                        },
+                        "before": {
+                            "description": "Limit response to posts published before a given ISO8601 compliant date.",
+                            "type": "string",
+                            "format": "date-time",
+                            "required": false
+                        },
+                        "modified_before": {
+                            "description": "Limit response to posts modified before a given ISO8601 compliant date.",
+                            "type": "string",
+                            "format": "date-time",
+                            "required": false
+                        },
+                        "exclude": {
+                            "description": "Ensure result set excludes specific IDs.",
+                            "type": "array",
+                            "items": {
+                                "type": "integer"
+                            },
+                            "default": [],
+                            "required": false
+                        },
+                        "include": {
+                            "description": "Limit result set to specific IDs.",
+                            "type": "array",
+                            "items": {
+                                "type": "integer"
+                            },
+                            "default": [],
+                            "required": false
+                        },
+                        "offset": {
+                            "description": "Offset the result set by a specific number of items.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "order": {
+                            "description": "Order sort attribute ascending or descending.",
+                            "type": "string",
+                            "default": "desc",
+                            "enum": [
+                                "asc",
+                                "desc"
+                            ],
+                            "required": false
+                        },
+                        "orderby": {
+                            "description": "Sort collection by post attribute.",
+                            "type": "string",
+                            "default": "date",
+                            "enum": [
+                                "author",
+                                "date",
+                                "id",
+                                "include",
+                                "modified",
+                                "parent",
+                                "relevance",
+                                "slug",
+                                "include_slugs",
+                                "title"
+                            ],
+                            "required": false
+                        },
+                        "slug": {
+                            "description": "Limit result set to posts with one or more specific slugs.",
+                            "type": "array",
+                            "items": {
+                                "type": "string"
+                            },
+                            "required": false
+                        },
+                        "status": {
+                            "default": "publish",
+                            "description": "Limit result set to posts assigned one or more statuses.",
+                            "type": "array",
+                            "items": {
+                                "enum": [
+                                    "publish",
+                                    "future",
+                                    "draft",
+                                    "pending",
+                                    "private",
+                                    "trash",
+                                    "auto-draft",
+                                    "inherit",
+                                    "request-pending",
+                                    "request-confirmed",
+                                    "request-failed",
+                                    "request-completed",
+                                    "any"
+                                ],
+                                "type": "string"
+                            },
+                            "required": false
                         }
                     }
                 },
@@ -3999,12 +4377,10 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "POST"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
-                        "parent": {
-                            "description": "The ID for the parent of the autosave.",
-                            "type": "integer",
-                            "required": false
-                        },
                         "date": {
                             "description": "The date the post was published, in the site's timezone.",
                             "type": [
@@ -4100,26 +4476,31 @@ mockedApiResponse.Schema = {
                         }
                     }
                 }
-            ]
+            ],
+            "_links": {
+                "self": "http://example.org/index.php?rest_route=/wp/v2/blocks"
+            }
         },
-        "/wp/v2/blocks/(?P<parent>[\\d]+)/autosaves/(?P<id>[\\d]+)": {
+        "/wp/v2/blocks/(?P<id>[\\d]+)": {
             "namespace": "wp/v2",
             "methods": [
-                "GET"
+                "GET",
+                "POST",
+                "PUT",
+                "PATCH",
+                "DELETE"
             ],
             "endpoints": [
                 {
                     "methods": [
                         "GET"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
-                        "parent": {
-                            "description": "The ID for the parent of the autosave.",
-                            "type": "integer",
-                            "required": false
-                        },
                         "id": {
-                            "description": "The ID for the autosave.",
+                            "description": "Unique identifier for the post.",
                             "type": "integer",
                             "required": false
                         },
@@ -4133,162 +4514,119 @@ mockedApiResponse.Schema = {
                             ],
                             "default": "view",
                             "required": false
-                        }
-                    }
-                }
-            ]
-        },
-        "/wp/v2/templates": {
-            "namespace": "wp/v2",
-            "methods": [
-                "GET",
-                "POST"
-            ],
-            "endpoints": [
-                {
-                    "methods": [
-                        "GET"
-                    ],
-                    "args": {
-                        "context": {
-                            "description": "Scope under which the request is made; determines fields present in response.",
-                            "type": "string",
-                            "enum": [
-                                "view",
-                                "embed",
-                                "edit"
-                            ],
-                            "required": false
                         },
-                        "wp_id": {
-                            "description": "Limit to the specified post id.",
-                            "type": "integer",
+                        "password": {
+                            "description": "The password for the post if it is password protected.",
+                            "type": "string",
                             "required": false
                         }
                     }
                 },
                 {
                     "methods": [
-                        "POST"
+                        "POST",
+                        "PUT",
+                        "PATCH"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
-                        "slug": {
-                            "description": "Unique slug identifying the template.",
-                            "type": "string",
-                            "minLength": 1,
-                            "pattern": "[a-zA-Z_\\-]+",
-                            "required": true
-                        },
-                        "theme": {
-                            "description": "Theme identifier for the template.",
-                            "type": "string",
+                        "id": {
+                            "description": "Unique identifier for the post.",
+                            "type": "integer",
                             "required": false
                         },
-                        "content": {
-                            "default": "",
-                            "description": "Content of template.",
+                        "date": {
+                            "description": "The date the post was published, in the site's timezone.",
                             "type": [
-                                "object",
-                                "string"
+                                "string",
+                                "null"
                             ],
+                            "format": "date-time",
                             "required": false
                         },
-                        "title": {
-                            "default": "",
-                            "description": "Title of template.",
+                        "date_gmt": {
+                            "description": "The date the post was published, as GMT.",
                             "type": [
-                                "object",
-                                "string"
+                                "string",
+                                "null"
                             ],
+                            "format": "date-time",
                             "required": false
                         },
-                        "description": {
-                            "default": "",
-                            "description": "Description of template.",
+                        "slug": {
+                            "description": "An alphanumeric identifier for the post unique to its type.",
                             "type": "string",
                             "required": false
                         },
                         "status": {
-                            "default": "publish",
-                            "description": "Status of template.",
+                            "description": "A named status for the post.",
                             "type": "string",
-                            "required": false
-                        }
-                    }
-                }
-            ],
-            "_links": {
-                "self": [
-                    {
-                        "href": "http://example.org/index.php?rest_route=/wp/v2/templates"
-                    }
-                ]
-            }
-        },
-        "/wp/v2/templates/(?P<id>[\\/\\w-]+)": {
-            "namespace": "wp/v2",
-            "methods": [
-                "GET",
-                "POST",
-                "PUT",
-                "PATCH",
-                "DELETE"
-            ],
-            "endpoints": [
-                {
-                    "methods": [
-                        "GET"
-                    ],
-                    "args": {
-                        "id": {
-                            "description": "The id of a template",
-                            "type": "string",
-                            "required": false
-                        }
-                    }
-                },
-                {
-                    "methods": [
-                        "POST",
-                        "PUT",
-                        "PATCH"
-                    ],
-                    "args": {
-                        "slug": {
-                            "description": "Unique slug identifying the template.",
-                            "type": "string",
-                            "minLength": 1,
-                            "pattern": "[a-zA-Z_\\-]+",
+                            "enum": [
+                                "publish",
+                                "future",
+                                "draft",
+                                "pending",
+                                "private"
+                            ],
                             "required": false
                         },
-                        "theme": {
-                            "description": "Theme identifier for the template.",
+                        "password": {
+                            "description": "A password to protect access to the content and excerpt.",
                             "type": "string",
                             "required": false
                         },
-                        "content": {
-                            "description": "Content of template.",
-                            "type": [
-                                "object",
-                                "string"
-                            ],
-                            "required": false
-                        },
                         "title": {
-                            "description": "Title of template.",
-                            "type": [
-                                "object",
-                                "string"
-                            ],
+                            "description": "The title for the post.",
+                            "type": "object",
+                            "properties": {
+                                "raw": {
+                                    "description": "Title for the post, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit"
+                                    ]
+                                }
+                            },
                             "required": false
                         },
-                        "description": {
-                            "description": "Description of template.",
-                            "type": "string",
+                        "content": {
+                            "description": "The content for the post.",
+                            "type": "object",
+                            "properties": {
+                                "raw": {
+                                    "description": "Content for the post, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit"
+                                    ]
+                                },
+                                "block_version": {
+                                    "description": "Version of the content block format used by the post.",
+                                    "type": "integer",
+                                    "context": [
+                                        "edit"
+                                    ],
+                                    "readonly": true
+                                },
+                                "protected": {
+                                    "description": "Whether the content is protected with a password.",
+                                    "type": "boolean",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
                             "required": false
                         },
-                        "status": {
-                            "description": "Status of template.",
+                        "template": {
+                            "description": "The theme file to use to display the post.",
                             "type": "string",
                             "required": false
                         }
@@ -4298,7 +4636,15 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "DELETE"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
+                        "id": {
+                            "description": "Unique identifier for the post.",
+                            "type": "integer",
+                            "required": false
+                        },
                         "force": {
                             "type": "boolean",
                             "default": false,
@@ -4309,7 +4655,7 @@ mockedApiResponse.Schema = {
                 }
             ]
         },
-        "/wp/v2/templates/(?P<parent>[\\d]+)/revisions": {
+        "/wp/v2/blocks/(?P<parent>[\\d]+)/revisions": {
             "namespace": "wp/v2",
             "methods": [
                 "GET"
@@ -4407,11 +4753,2375 @@ mockedApiResponse.Schema = {
                 }
             ]
         },
-        "/wp/v2/templates/(?P<parent>[\\d]+)/revisions/(?P<id>[\\d]+)": {
+        "/wp/v2/blocks/(?P<parent>[\\d]+)/revisions/(?P<id>[\\d]+)": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET",
+                "DELETE"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the revision.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "id": {
+                            "description": "Unique identifier for the revision.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        }
+                    }
+                },
+                {
+                    "methods": [
+                        "DELETE"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the revision.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "id": {
+                            "description": "Unique identifier for the revision.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "force": {
+                            "type": "boolean",
+                            "default": false,
+                            "description": "Required to be true, as revisions do not support trashing.",
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp/v2/blocks/(?P<id>[\\d]+)/autosaves": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET",
+                "POST"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the autosave.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        }
+                    }
+                },
+                {
+                    "methods": [
+                        "POST"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the autosave.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "date": {
+                            "description": "The date the post was published, in the site's timezone.",
+                            "type": [
+                                "string",
+                                "null"
+                            ],
+                            "format": "date-time",
+                            "required": false
+                        },
+                        "date_gmt": {
+                            "description": "The date the post was published, as GMT.",
+                            "type": [
+                                "string",
+                                "null"
+                            ],
+                            "format": "date-time",
+                            "required": false
+                        },
+                        "slug": {
+                            "description": "An alphanumeric identifier for the post unique to its type.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "status": {
+                            "description": "A named status for the post.",
+                            "type": "string",
+                            "enum": [
+                                "publish",
+                                "future",
+                                "draft",
+                                "pending",
+                                "private"
+                            ],
+                            "required": false
+                        },
+                        "password": {
+                            "description": "A password to protect access to the content and excerpt.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "title": {
+                            "description": "The title for the post.",
+                            "type": "object",
+                            "properties": {
+                                "raw": {
+                                    "description": "Title for the post, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit"
+                                    ]
+                                }
+                            },
+                            "required": false
+                        },
+                        "content": {
+                            "description": "The content for the post.",
+                            "type": "object",
+                            "properties": {
+                                "raw": {
+                                    "description": "Content for the post, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit"
+                                    ]
+                                },
+                                "block_version": {
+                                    "description": "Version of the content block format used by the post.",
+                                    "type": "integer",
+                                    "context": [
+                                        "edit"
+                                    ],
+                                    "readonly": true
+                                },
+                                "protected": {
+                                    "description": "Whether the content is protected with a password.",
+                                    "type": "boolean",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
+                            "required": false
+                        },
+                        "template": {
+                            "description": "The theme file to use to display the post.",
+                            "type": "string",
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp/v2/blocks/(?P<parent>[\\d]+)/autosaves/(?P<id>[\\d]+)": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the autosave.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "id": {
+                            "description": "The ID for the autosave.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp/v2/templates": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET",
+                "POST"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        },
+                        "wp_id": {
+                            "description": "Limit to the specified post id.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "area": {
+                            "description": "Limit to the specified template part area.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "post_type": {
+                            "description": "Post type to get the templates for.",
+                            "type": "string",
+                            "required": false
+                        }
+                    }
+                },
+                {
+                    "methods": [
+                        "POST"
+                    ],
+                    "args": {
+                        "slug": {
+                            "description": "Unique slug identifying the template.",
+                            "type": "string",
+                            "minLength": 1,
+                            "pattern": "[a-zA-Z0-9_\\-]+",
+                            "required": true
+                        },
+                        "theme": {
+                            "description": "Theme identifier for the template.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "type": {
+                            "description": "Type of template.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "content": {
+                            "default": "",
+                            "description": "Content of template.",
+                            "type": [
+                                "object",
+                                "string"
+                            ],
+                            "properties": {
+                                "raw": {
+                                    "description": "Content for the template, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit"
+                                    ]
+                                },
+                                "block_version": {
+                                    "description": "Version of the content block format used by the template.",
+                                    "type": "integer",
+                                    "context": [
+                                        "edit"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
+                            "required": false
+                        },
+                        "title": {
+                            "default": "",
+                            "description": "Title of template.",
+                            "type": [
+                                "object",
+                                "string"
+                            ],
+                            "properties": {
+                                "raw": {
+                                    "description": "Title for the template, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ]
+                                },
+                                "rendered": {
+                                    "description": "HTML title for the template, transformed for display.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
+                            "required": false
+                        },
+                        "description": {
+                            "default": "",
+                            "description": "Description of template.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "status": {
+                            "default": "publish",
+                            "description": "Status of template.",
+                            "type": "string",
+                            "enum": [
+                                "publish",
+                                "future",
+                                "draft",
+                                "pending",
+                                "private"
+                            ],
+                            "required": false
+                        },
+                        "author": {
+                            "description": "The ID for the author of the template.",
+                            "type": "integer",
+                            "required": false
+                        }
+                    }
+                }
+            ],
+            "_links": {
+                "self": [
+                    {
+                        "href": "http://example.org/index.php?rest_route=/wp/v2/templates"
+                    }
+                ]
+            }
+        },
+        "/wp/v2/templates/(?P<id>([^\\/:<>\\*\\?\"\\|]+(?:\\/[^\\/:<>\\*\\?\"\\|]+)?)[\\/\\w-]+)": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET",
+                "POST",
+                "PUT",
+                "PATCH",
+                "DELETE"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "id": {
+                            "description": "The id of a template",
+                            "type": "string",
+                            "required": false
+                        },
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        }
+                    }
+                },
+                {
+                    "methods": [
+                        "POST",
+                        "PUT",
+                        "PATCH"
+                    ],
+                    "args": {
+                        "id": {
+                            "description": "The id of a template",
+                            "type": "string",
+                            "required": false
+                        },
+                        "slug": {
+                            "description": "Unique slug identifying the template.",
+                            "type": "string",
+                            "minLength": 1,
+                            "pattern": "[a-zA-Z0-9_\\-]+",
+                            "required": false
+                        },
+                        "theme": {
+                            "description": "Theme identifier for the template.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "type": {
+                            "description": "Type of template.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "content": {
+                            "description": "Content of template.",
+                            "type": [
+                                "object",
+                                "string"
+                            ],
+                            "properties": {
+                                "raw": {
+                                    "description": "Content for the template, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit"
+                                    ]
+                                },
+                                "block_version": {
+                                    "description": "Version of the content block format used by the template.",
+                                    "type": "integer",
+                                    "context": [
+                                        "edit"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
+                            "required": false
+                        },
+                        "title": {
+                            "description": "Title of template.",
+                            "type": [
+                                "object",
+                                "string"
+                            ],
+                            "properties": {
+                                "raw": {
+                                    "description": "Title for the template, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ]
+                                },
+                                "rendered": {
+                                    "description": "HTML title for the template, transformed for display.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
+                            "required": false
+                        },
+                        "description": {
+                            "description": "Description of template.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "status": {
+                            "description": "Status of template.",
+                            "type": "string",
+                            "enum": [
+                                "publish",
+                                "future",
+                                "draft",
+                                "pending",
+                                "private"
+                            ],
+                            "required": false
+                        },
+                        "author": {
+                            "description": "The ID for the author of the template.",
+                            "type": "integer",
+                            "required": false
+                        }
+                    }
+                },
+                {
+                    "methods": [
+                        "DELETE"
+                    ],
+                    "args": {
+                        "id": {
+                            "description": "The id of a template",
+                            "type": "string",
+                            "required": false
+                        },
+                        "force": {
+                            "type": "boolean",
+                            "default": false,
+                            "description": "Whether to bypass Trash and force deletion.",
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp/v2/templates/(?P<parent>[\\d]+)/revisions": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the revision.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        },
+                        "page": {
+                            "description": "Current page of the collection.",
+                            "type": "integer",
+                            "default": 1,
+                            "minimum": 1,
+                            "required": false
+                        },
+                        "per_page": {
+                            "description": "Maximum number of items to be returned in result set.",
+                            "type": "integer",
+                            "minimum": 1,
+                            "maximum": 100,
+                            "required": false
+                        },
+                        "search": {
+                            "description": "Limit results to those matching a string.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "exclude": {
+                            "description": "Ensure result set excludes specific IDs.",
+                            "type": "array",
+                            "items": {
+                                "type": "integer"
+                            },
+                            "default": [],
+                            "required": false
+                        },
+                        "include": {
+                            "description": "Limit result set to specific IDs.",
+                            "type": "array",
+                            "items": {
+                                "type": "integer"
+                            },
+                            "default": [],
+                            "required": false
+                        },
+                        "offset": {
+                            "description": "Offset the result set by a specific number of items.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "order": {
+                            "description": "Order sort attribute ascending or descending.",
+                            "type": "string",
+                            "default": "desc",
+                            "enum": [
+                                "asc",
+                                "desc"
+                            ],
+                            "required": false
+                        },
+                        "orderby": {
+                            "description": "Sort collection by object attribute.",
+                            "type": "string",
+                            "default": "date",
+                            "enum": [
+                                "date",
+                                "id",
+                                "include",
+                                "relevance",
+                                "slug",
+                                "include_slugs",
+                                "title"
+                            ],
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp/v2/templates/(?P<parent>[\\d]+)/revisions/(?P<id>[\\d]+)": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET",
+                "DELETE"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the revision.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "id": {
+                            "description": "Unique identifier for the revision.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        }
+                    }
+                },
+                {
+                    "methods": [
+                        "DELETE"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the revision.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "id": {
+                            "description": "Unique identifier for the revision.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "force": {
+                            "type": "boolean",
+                            "default": false,
+                            "description": "Required to be true, as revisions do not support trashing.",
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp/v2/templates/(?P<id>[\\d]+)/autosaves": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET",
+                "POST"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the autosave.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        }
+                    }
+                },
+                {
+                    "methods": [
+                        "POST"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the autosave.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "slug": {
+                            "description": "Unique slug identifying the template.",
+                            "type": "string",
+                            "minLength": 1,
+                            "pattern": "[a-zA-Z0-9_\\-]+",
+                            "required": false
+                        },
+                        "theme": {
+                            "description": "Theme identifier for the template.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "type": {
+                            "description": "Type of template.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "content": {
+                            "description": "Content of template.",
+                            "type": [
+                                "object",
+                                "string"
+                            ],
+                            "properties": {
+                                "raw": {
+                                    "description": "Content for the template, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit"
+                                    ]
+                                },
+                                "block_version": {
+                                    "description": "Version of the content block format used by the template.",
+                                    "type": "integer",
+                                    "context": [
+                                        "edit"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
+                            "required": false
+                        },
+                        "title": {
+                            "description": "Title of template.",
+                            "type": [
+                                "object",
+                                "string"
+                            ],
+                            "properties": {
+                                "raw": {
+                                    "description": "Title for the template, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ]
+                                },
+                                "rendered": {
+                                    "description": "HTML title for the template, transformed for display.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
+                            "required": false
+                        },
+                        "description": {
+                            "description": "Description of template.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "status": {
+                            "description": "Status of template.",
+                            "type": "string",
+                            "enum": [
+                                "publish",
+                                "future",
+                                "draft",
+                                "pending",
+                                "private"
+                            ],
+                            "required": false
+                        },
+                        "author": {
+                            "description": "The ID for the author of the template.",
+                            "type": "integer",
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp/v2/templates/(?P<parent>[\\d]+)/autosaves/(?P<id>[\\d]+)": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the autosave.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "id": {
+                            "description": "The ID for the autosave.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp/v2/template-parts": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET",
+                "POST"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        },
+                        "wp_id": {
+                            "description": "Limit to the specified post id.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "area": {
+                            "description": "Limit to the specified template part area.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "post_type": {
+                            "description": "Post type to get the templates for.",
+                            "type": "string",
+                            "required": false
+                        }
+                    }
+                },
+                {
+                    "methods": [
+                        "POST"
+                    ],
+                    "args": {
+                        "slug": {
+                            "description": "Unique slug identifying the template.",
+                            "type": "string",
+                            "minLength": 1,
+                            "pattern": "[a-zA-Z0-9_\\-]+",
+                            "required": true
+                        },
+                        "theme": {
+                            "description": "Theme identifier for the template.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "type": {
+                            "description": "Type of template.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "content": {
+                            "default": "",
+                            "description": "Content of template.",
+                            "type": [
+                                "object",
+                                "string"
+                            ],
+                            "properties": {
+                                "raw": {
+                                    "description": "Content for the template, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit"
+                                    ]
+                                },
+                                "block_version": {
+                                    "description": "Version of the content block format used by the template.",
+                                    "type": "integer",
+                                    "context": [
+                                        "edit"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
+                            "required": false
+                        },
+                        "title": {
+                            "default": "",
+                            "description": "Title of template.",
+                            "type": [
+                                "object",
+                                "string"
+                            ],
+                            "properties": {
+                                "raw": {
+                                    "description": "Title for the template, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ]
+                                },
+                                "rendered": {
+                                    "description": "HTML title for the template, transformed for display.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
+                            "required": false
+                        },
+                        "description": {
+                            "default": "",
+                            "description": "Description of template.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "status": {
+                            "default": "publish",
+                            "description": "Status of template.",
+                            "type": "string",
+                            "enum": [
+                                "publish",
+                                "future",
+                                "draft",
+                                "pending",
+                                "private"
+                            ],
+                            "required": false
+                        },
+                        "author": {
+                            "description": "The ID for the author of the template.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "area": {
+                            "description": "Where the template part is intended for use (header, footer, etc.)",
+                            "type": "string",
+                            "required": false
+                        }
+                    }
+                }
+            ],
+            "_links": {
+                "self": [
+                    {
+                        "href": "http://example.org/index.php?rest_route=/wp/v2/template-parts"
+                    }
+                ]
+            }
+        },
+        "/wp/v2/template-parts/(?P<id>([^\\/:<>\\*\\?\"\\|]+(?:\\/[^\\/:<>\\*\\?\"\\|]+)?)[\\/\\w-]+)": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET",
+                "POST",
+                "PUT",
+                "PATCH",
+                "DELETE"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "id": {
+                            "description": "The id of a template",
+                            "type": "string",
+                            "required": false
+                        },
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        }
+                    }
+                },
+                {
+                    "methods": [
+                        "POST",
+                        "PUT",
+                        "PATCH"
+                    ],
+                    "args": {
+                        "id": {
+                            "description": "The id of a template",
+                            "type": "string",
+                            "required": false
+                        },
+                        "slug": {
+                            "description": "Unique slug identifying the template.",
+                            "type": "string",
+                            "minLength": 1,
+                            "pattern": "[a-zA-Z0-9_\\-]+",
+                            "required": false
+                        },
+                        "theme": {
+                            "description": "Theme identifier for the template.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "type": {
+                            "description": "Type of template.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "content": {
+                            "description": "Content of template.",
+                            "type": [
+                                "object",
+                                "string"
+                            ],
+                            "properties": {
+                                "raw": {
+                                    "description": "Content for the template, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit"
+                                    ]
+                                },
+                                "block_version": {
+                                    "description": "Version of the content block format used by the template.",
+                                    "type": "integer",
+                                    "context": [
+                                        "edit"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
+                            "required": false
+                        },
+                        "title": {
+                            "description": "Title of template.",
+                            "type": [
+                                "object",
+                                "string"
+                            ],
+                            "properties": {
+                                "raw": {
+                                    "description": "Title for the template, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ]
+                                },
+                                "rendered": {
+                                    "description": "HTML title for the template, transformed for display.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
+                            "required": false
+                        },
+                        "description": {
+                            "description": "Description of template.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "status": {
+                            "description": "Status of template.",
+                            "type": "string",
+                            "enum": [
+                                "publish",
+                                "future",
+                                "draft",
+                                "pending",
+                                "private"
+                            ],
+                            "required": false
+                        },
+                        "author": {
+                            "description": "The ID for the author of the template.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "area": {
+                            "description": "Where the template part is intended for use (header, footer, etc.)",
+                            "type": "string",
+                            "required": false
+                        }
+                    }
+                },
+                {
+                    "methods": [
+                        "DELETE"
+                    ],
+                    "args": {
+                        "id": {
+                            "description": "The id of a template",
+                            "type": "string",
+                            "required": false
+                        },
+                        "force": {
+                            "type": "boolean",
+                            "default": false,
+                            "description": "Whether to bypass Trash and force deletion.",
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp/v2/template-parts/(?P<parent>[\\d]+)/revisions": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the revision.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        },
+                        "page": {
+                            "description": "Current page of the collection.",
+                            "type": "integer",
+                            "default": 1,
+                            "minimum": 1,
+                            "required": false
+                        },
+                        "per_page": {
+                            "description": "Maximum number of items to be returned in result set.",
+                            "type": "integer",
+                            "minimum": 1,
+                            "maximum": 100,
+                            "required": false
+                        },
+                        "search": {
+                            "description": "Limit results to those matching a string.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "exclude": {
+                            "description": "Ensure result set excludes specific IDs.",
+                            "type": "array",
+                            "items": {
+                                "type": "integer"
+                            },
+                            "default": [],
+                            "required": false
+                        },
+                        "include": {
+                            "description": "Limit result set to specific IDs.",
+                            "type": "array",
+                            "items": {
+                                "type": "integer"
+                            },
+                            "default": [],
+                            "required": false
+                        },
+                        "offset": {
+                            "description": "Offset the result set by a specific number of items.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "order": {
+                            "description": "Order sort attribute ascending or descending.",
+                            "type": "string",
+                            "default": "desc",
+                            "enum": [
+                                "asc",
+                                "desc"
+                            ],
+                            "required": false
+                        },
+                        "orderby": {
+                            "description": "Sort collection by object attribute.",
+                            "type": "string",
+                            "default": "date",
+                            "enum": [
+                                "date",
+                                "id",
+                                "include",
+                                "relevance",
+                                "slug",
+                                "include_slugs",
+                                "title"
+                            ],
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp/v2/template-parts/(?P<parent>[\\d]+)/revisions/(?P<id>[\\d]+)": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET",
+                "DELETE"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the revision.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "id": {
+                            "description": "Unique identifier for the revision.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        }
+                    }
+                },
+                {
+                    "methods": [
+                        "DELETE"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the revision.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "id": {
+                            "description": "Unique identifier for the revision.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "force": {
+                            "type": "boolean",
+                            "default": false,
+                            "description": "Required to be true, as revisions do not support trashing.",
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp/v2/template-parts/(?P<id>[\\d]+)/autosaves": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET",
+                "POST"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the autosave.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        }
+                    }
+                },
+                {
+                    "methods": [
+                        "POST"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the autosave.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "slug": {
+                            "description": "Unique slug identifying the template.",
+                            "type": "string",
+                            "minLength": 1,
+                            "pattern": "[a-zA-Z0-9_\\-]+",
+                            "required": false
+                        },
+                        "theme": {
+                            "description": "Theme identifier for the template.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "type": {
+                            "description": "Type of template.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "content": {
+                            "description": "Content of template.",
+                            "type": [
+                                "object",
+                                "string"
+                            ],
+                            "properties": {
+                                "raw": {
+                                    "description": "Content for the template, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit"
+                                    ]
+                                },
+                                "block_version": {
+                                    "description": "Version of the content block format used by the template.",
+                                    "type": "integer",
+                                    "context": [
+                                        "edit"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
+                            "required": false
+                        },
+                        "title": {
+                            "description": "Title of template.",
+                            "type": [
+                                "object",
+                                "string"
+                            ],
+                            "properties": {
+                                "raw": {
+                                    "description": "Title for the template, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ]
+                                },
+                                "rendered": {
+                                    "description": "HTML title for the template, transformed for display.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
+                            "required": false
+                        },
+                        "description": {
+                            "description": "Description of template.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "status": {
+                            "description": "Status of template.",
+                            "type": "string",
+                            "enum": [
+                                "publish",
+                                "future",
+                                "draft",
+                                "pending",
+                                "private"
+                            ],
+                            "required": false
+                        },
+                        "author": {
+                            "description": "The ID for the author of the template.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "area": {
+                            "description": "Where the template part is intended for use (header, footer, etc.)",
+                            "type": "string",
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp/v2/template-parts/(?P<parent>[\\d]+)/autosaves/(?P<id>[\\d]+)": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the autosave.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "id": {
+                            "description": "The ID for the autosave.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp/v2/navigation": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET",
+                "POST"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "allow_batch": {
+                        "v1": true
+                    },
+                    "args": {
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        },
+                        "page": {
+                            "description": "Current page of the collection.",
+                            "type": "integer",
+                            "default": 1,
+                            "minimum": 1,
+                            "required": false
+                        },
+                        "per_page": {
+                            "description": "Maximum number of items to be returned in result set.",
+                            "type": "integer",
+                            "default": 10,
+                            "minimum": 1,
+                            "maximum": 100,
+                            "required": false
+                        },
+                        "search": {
+                            "description": "Limit results to those matching a string.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "after": {
+                            "description": "Limit response to posts published after a given ISO8601 compliant date.",
+                            "type": "string",
+                            "format": "date-time",
+                            "required": false
+                        },
+                        "modified_after": {
+                            "description": "Limit response to posts modified after a given ISO8601 compliant date.",
+                            "type": "string",
+                            "format": "date-time",
+                            "required": false
+                        },
+                        "before": {
+                            "description": "Limit response to posts published before a given ISO8601 compliant date.",
+                            "type": "string",
+                            "format": "date-time",
+                            "required": false
+                        },
+                        "modified_before": {
+                            "description": "Limit response to posts modified before a given ISO8601 compliant date.",
+                            "type": "string",
+                            "format": "date-time",
+                            "required": false
+                        },
+                        "exclude": {
+                            "description": "Ensure result set excludes specific IDs.",
+                            "type": "array",
+                            "items": {
+                                "type": "integer"
+                            },
+                            "default": [],
+                            "required": false
+                        },
+                        "include": {
+                            "description": "Limit result set to specific IDs.",
+                            "type": "array",
+                            "items": {
+                                "type": "integer"
+                            },
+                            "default": [],
+                            "required": false
+                        },
+                        "offset": {
+                            "description": "Offset the result set by a specific number of items.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "order": {
+                            "description": "Order sort attribute ascending or descending.",
+                            "type": "string",
+                            "default": "desc",
+                            "enum": [
+                                "asc",
+                                "desc"
+                            ],
+                            "required": false
+                        },
+                        "orderby": {
+                            "description": "Sort collection by post attribute.",
+                            "type": "string",
+                            "default": "date",
+                            "enum": [
+                                "author",
+                                "date",
+                                "id",
+                                "include",
+                                "modified",
+                                "parent",
+                                "relevance",
+                                "slug",
+                                "include_slugs",
+                                "title"
+                            ],
+                            "required": false
+                        },
+                        "slug": {
+                            "description": "Limit result set to posts with one or more specific slugs.",
+                            "type": "array",
+                            "items": {
+                                "type": "string"
+                            },
+                            "required": false
+                        },
+                        "status": {
+                            "default": "publish",
+                            "description": "Limit result set to posts assigned one or more statuses.",
+                            "type": "array",
+                            "items": {
+                                "enum": [
+                                    "publish",
+                                    "future",
+                                    "draft",
+                                    "pending",
+                                    "private",
+                                    "trash",
+                                    "auto-draft",
+                                    "inherit",
+                                    "request-pending",
+                                    "request-confirmed",
+                                    "request-failed",
+                                    "request-completed",
+                                    "any"
+                                ],
+                                "type": "string"
+                            },
+                            "required": false
+                        }
+                    }
+                },
+                {
+                    "methods": [
+                        "POST"
+                    ],
+                    "allow_batch": {
+                        "v1": true
+                    },
+                    "args": {
+                        "date": {
+                            "description": "The date the post was published, in the site's timezone.",
+                            "type": [
+                                "string",
+                                "null"
+                            ],
+                            "format": "date-time",
+                            "required": false
+                        },
+                        "date_gmt": {
+                            "description": "The date the post was published, as GMT.",
+                            "type": [
+                                "string",
+                                "null"
+                            ],
+                            "format": "date-time",
+                            "required": false
+                        },
+                        "slug": {
+                            "description": "An alphanumeric identifier for the post unique to its type.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "status": {
+                            "description": "A named status for the post.",
+                            "type": "string",
+                            "enum": [
+                                "publish",
+                                "future",
+                                "draft",
+                                "pending",
+                                "private"
+                            ],
+                            "required": false
+                        },
+                        "password": {
+                            "description": "A password to protect access to the content and excerpt.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "title": {
+                            "description": "The title for the post.",
+                            "type": "object",
+                            "properties": {
+                                "raw": {
+                                    "description": "Title for the post, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "edit"
+                                    ]
+                                },
+                                "rendered": {
+                                    "description": "HTML title for the post, transformed for display.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
+                            "required": false
+                        },
+                        "content": {
+                            "description": "The content for the post.",
+                            "type": "object",
+                            "properties": {
+                                "raw": {
+                                    "description": "Content for the post, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "edit"
+                                    ]
+                                },
+                                "rendered": {
+                                    "description": "HTML content for the post, transformed for display.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit"
+                                    ],
+                                    "readonly": true
+                                },
+                                "block_version": {
+                                    "description": "Version of the content block format used by the post.",
+                                    "type": "integer",
+                                    "context": [
+                                        "edit"
+                                    ],
+                                    "readonly": true
+                                },
+                                "protected": {
+                                    "description": "Whether the content is protected with a password.",
+                                    "type": "boolean",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
+                            "required": false
+                        },
+                        "template": {
+                            "description": "The theme file to use to display the post.",
+                            "type": "string",
+                            "required": false
+                        }
+                    }
+                }
+            ],
+            "_links": {
+                "self": [
+                    {
+                        "href": "http://example.org/index.php?rest_route=/wp/v2/navigation"
+                    }
+                ]
+            }
+        },
+        "/wp/v2/navigation/(?P<id>[\\d]+)": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET",
+                "POST",
+                "PUT",
+                "PATCH",
+                "DELETE"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "allow_batch": {
+                        "v1": true
+                    },
+                    "args": {
+                        "id": {
+                            "description": "Unique identifier for the post.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        },
+                        "password": {
+                            "description": "The password for the post if it is password protected.",
+                            "type": "string",
+                            "required": false
+                        }
+                    }
+                },
+                {
+                    "methods": [
+                        "POST",
+                        "PUT",
+                        "PATCH"
+                    ],
+                    "allow_batch": {
+                        "v1": true
+                    },
+                    "args": {
+                        "id": {
+                            "description": "Unique identifier for the post.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "date": {
+                            "description": "The date the post was published, in the site's timezone.",
+                            "type": [
+                                "string",
+                                "null"
+                            ],
+                            "format": "date-time",
+                            "required": false
+                        },
+                        "date_gmt": {
+                            "description": "The date the post was published, as GMT.",
+                            "type": [
+                                "string",
+                                "null"
+                            ],
+                            "format": "date-time",
+                            "required": false
+                        },
+                        "slug": {
+                            "description": "An alphanumeric identifier for the post unique to its type.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "status": {
+                            "description": "A named status for the post.",
+                            "type": "string",
+                            "enum": [
+                                "publish",
+                                "future",
+                                "draft",
+                                "pending",
+                                "private"
+                            ],
+                            "required": false
+                        },
+                        "password": {
+                            "description": "A password to protect access to the content and excerpt.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "title": {
+                            "description": "The title for the post.",
+                            "type": "object",
+                            "properties": {
+                                "raw": {
+                                    "description": "Title for the post, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "edit"
+                                    ]
+                                },
+                                "rendered": {
+                                    "description": "HTML title for the post, transformed for display.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
+                            "required": false
+                        },
+                        "content": {
+                            "description": "The content for the post.",
+                            "type": "object",
+                            "properties": {
+                                "raw": {
+                                    "description": "Content for the post, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "edit"
+                                    ]
+                                },
+                                "rendered": {
+                                    "description": "HTML content for the post, transformed for display.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit"
+                                    ],
+                                    "readonly": true
+                                },
+                                "block_version": {
+                                    "description": "Version of the content block format used by the post.",
+                                    "type": "integer",
+                                    "context": [
+                                        "edit"
+                                    ],
+                                    "readonly": true
+                                },
+                                "protected": {
+                                    "description": "Whether the content is protected with a password.",
+                                    "type": "boolean",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
+                            "required": false
+                        },
+                        "template": {
+                            "description": "The theme file to use to display the post.",
+                            "type": "string",
+                            "required": false
+                        }
+                    }
+                },
+                {
+                    "methods": [
+                        "DELETE"
+                    ],
+                    "allow_batch": {
+                        "v1": true
+                    },
+                    "args": {
+                        "id": {
+                            "description": "Unique identifier for the post.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "force": {
+                            "type": "boolean",
+                            "default": false,
+                            "description": "Whether to bypass Trash and force deletion.",
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp/v2/navigation/(?P<parent>[\\d]+)/revisions": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the revision.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        },
+                        "page": {
+                            "description": "Current page of the collection.",
+                            "type": "integer",
+                            "default": 1,
+                            "minimum": 1,
+                            "required": false
+                        },
+                        "per_page": {
+                            "description": "Maximum number of items to be returned in result set.",
+                            "type": "integer",
+                            "minimum": 1,
+                            "maximum": 100,
+                            "required": false
+                        },
+                        "search": {
+                            "description": "Limit results to those matching a string.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "exclude": {
+                            "description": "Ensure result set excludes specific IDs.",
+                            "type": "array",
+                            "items": {
+                                "type": "integer"
+                            },
+                            "default": [],
+                            "required": false
+                        },
+                        "include": {
+                            "description": "Limit result set to specific IDs.",
+                            "type": "array",
+                            "items": {
+                                "type": "integer"
+                            },
+                            "default": [],
+                            "required": false
+                        },
+                        "offset": {
+                            "description": "Offset the result set by a specific number of items.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "order": {
+                            "description": "Order sort attribute ascending or descending.",
+                            "type": "string",
+                            "default": "desc",
+                            "enum": [
+                                "asc",
+                                "desc"
+                            ],
+                            "required": false
+                        },
+                        "orderby": {
+                            "description": "Sort collection by object attribute.",
+                            "type": "string",
+                            "default": "date",
+                            "enum": [
+                                "date",
+                                "id",
+                                "include",
+                                "relevance",
+                                "slug",
+                                "include_slugs",
+                                "title"
+                            ],
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp/v2/navigation/(?P<parent>[\\d]+)/revisions/(?P<id>[\\d]+)": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET",
+                "DELETE"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the revision.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "id": {
+                            "description": "Unique identifier for the revision.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        }
+                    }
+                },
+                {
+                    "methods": [
+                        "DELETE"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the revision.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "id": {
+                            "description": "Unique identifier for the revision.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "force": {
+                            "type": "boolean",
+                            "default": false,
+                            "description": "Required to be true, as revisions do not support trashing.",
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp/v2/navigation/(?P<id>[\\d]+)/autosaves": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET",
+                "POST"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the autosave.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        }
+                    }
+                },
+                {
+                    "methods": [
+                        "POST"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the autosave.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "date": {
+                            "description": "The date the post was published, in the site's timezone.",
+                            "type": [
+                                "string",
+                                "null"
+                            ],
+                            "format": "date-time",
+                            "required": false
+                        },
+                        "date_gmt": {
+                            "description": "The date the post was published, as GMT.",
+                            "type": [
+                                "string",
+                                "null"
+                            ],
+                            "format": "date-time",
+                            "required": false
+                        },
+                        "slug": {
+                            "description": "An alphanumeric identifier for the post unique to its type.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "status": {
+                            "description": "A named status for the post.",
+                            "type": "string",
+                            "enum": [
+                                "publish",
+                                "future",
+                                "draft",
+                                "pending",
+                                "private"
+                            ],
+                            "required": false
+                        },
+                        "password": {
+                            "description": "A password to protect access to the content and excerpt.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "title": {
+                            "description": "The title for the post.",
+                            "type": "object",
+                            "properties": {
+                                "raw": {
+                                    "description": "Title for the post, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "edit"
+                                    ]
+                                },
+                                "rendered": {
+                                    "description": "HTML title for the post, transformed for display.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
+                            "required": false
+                        },
+                        "content": {
+                            "description": "The content for the post.",
+                            "type": "object",
+                            "properties": {
+                                "raw": {
+                                    "description": "Content for the post, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "edit"
+                                    ]
+                                },
+                                "rendered": {
+                                    "description": "HTML content for the post, transformed for display.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit"
+                                    ],
+                                    "readonly": true
+                                },
+                                "block_version": {
+                                    "description": "Version of the content block format used by the post.",
+                                    "type": "integer",
+                                    "context": [
+                                        "edit"
+                                    ],
+                                    "readonly": true
+                                },
+                                "protected": {
+                                    "description": "Whether the content is protected with a password.",
+                                    "type": "boolean",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
+                            "required": false
+                        },
+                        "template": {
+                            "description": "The theme file to use to display the post.",
+                            "type": "string",
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp/v2/navigation/(?P<parent>[\\d]+)/autosaves/(?P<id>[\\d]+)": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "parent": {
+                            "description": "The ID for the parent of the autosave.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "id": {
+                            "description": "The ID for the autosave.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp/v2/types": {
             "namespace": "wp/v2",
             "methods": [
-                "GET",
-                "DELETE"
+                "GET"
             ],
             "endpoints": [
                 {
@@ -4419,16 +7129,6 @@ mockedApiResponse.Schema = {
                         "GET"
                     ],
                     "args": {
-                        "parent": {
-                            "description": "The ID for the parent of the revision.",
-                            "type": "integer",
-                            "required": false
-                        },
-                        "id": {
-                            "description": "Unique identifier for the revision.",
-                            "type": "integer",
-                            "required": false
-                        },
                         "context": {
                             "description": "Scope under which the request is made; determines fields present in response.",
                             "type": "string",
@@ -4441,37 +7141,47 @@ mockedApiResponse.Schema = {
                             "required": false
                         }
                     }
-                },
+                }
+            ],
+            "_links": {
+                "self": "http://example.org/index.php?rest_route=/wp/v2/types"
+            }
+        },
+        "/wp/v2/types/(?P<type>[\\w-]+)": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET"
+            ],
+            "endpoints": [
                 {
                     "methods": [
-                        "DELETE"
+                        "GET"
                     ],
                     "args": {
-                        "parent": {
-                            "description": "The ID for the parent of the revision.",
-                            "type": "integer",
-                            "required": false
-                        },
-                        "id": {
-                            "description": "Unique identifier for the revision.",
-                            "type": "integer",
+                        "type": {
+                            "description": "An alphanumeric identifier for the post type.",
+                            "type": "string",
                             "required": false
                         },
-                        "force": {
-                            "type": "boolean",
-                            "default": false,
-                            "description": "Required to be true, as revisions do not support trashing.",
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
                             "required": false
                         }
                     }
                 }
             ]
         },
-        "/wp/v2/templates/(?P<id>[\\d]+)/autosaves": {
+        "/wp/v2/statuses": {
             "namespace": "wp/v2",
             "methods": [
-                "GET",
-                "POST"
+                "GET"
             ],
             "endpoints": [
                 {
@@ -4479,11 +7189,6 @@ mockedApiResponse.Schema = {
                         "GET"
                     ],
                     "args": {
-                        "parent": {
-                            "description": "The ID for the parent of the autosave.",
-                            "type": "integer",
-                            "required": false
-                        },
                         "context": {
                             "description": "Scope under which the request is made; determines fields present in response.",
                             "type": "string",
@@ -4496,60 +7201,44 @@ mockedApiResponse.Schema = {
                             "required": false
                         }
                     }
-                },
+                }
+            ],
+            "_links": {
+                "self": "http://example.org/index.php?rest_route=/wp/v2/statuses"
+            }
+        },
+        "/wp/v2/statuses/(?P<status>[\\w-]+)": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET"
+            ],
+            "endpoints": [
                 {
                     "methods": [
-                        "POST"
+                        "GET"
                     ],
                     "args": {
-                        "parent": {
-                            "description": "The ID for the parent of the autosave.",
-                            "type": "integer",
-                            "required": false
-                        },
-                        "slug": {
-                            "description": "Unique slug identifying the template.",
+                        "status": {
+                            "description": "An alphanumeric identifier for the status.",
                             "type": "string",
-                            "minLength": 1,
-                            "pattern": "[a-zA-Z_\\-]+",
                             "required": false
                         },
-                        "theme": {
-                            "description": "Theme identifier for the template.",
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
                             "type": "string",
-                            "required": false
-                        },
-                        "content": {
-                            "description": "Content of template.",
-                            "type": [
-                                "object",
-                                "string"
-                            ],
-                            "required": false
-                        },
-                        "title": {
-                            "description": "Title of template.",
-                            "type": [
-                                "object",
-                                "string"
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
                             ],
-                            "required": false
-                        },
-                        "description": {
-                            "description": "Description of template.",
-                            "type": "string",
-                            "required": false
-                        },
-                        "status": {
-                            "description": "Status of template.",
-                            "type": "string",
+                            "default": "view",
                             "required": false
                         }
                     }
                 }
             ]
         },
-        "/wp/v2/templates/(?P<parent>[\\d]+)/autosaves/(?P<id>[\\d]+)": {
+        "/wp/v2/taxonomies": {
             "namespace": "wp/v2",
             "methods": [
                 "GET"
@@ -4560,16 +7249,6 @@ mockedApiResponse.Schema = {
                         "GET"
                     ],
                     "args": {
-                        "parent": {
-                            "description": "The ID for the parent of the autosave.",
-                            "type": "integer",
-                            "required": false
-                        },
-                        "id": {
-                            "description": "The ID for the autosave.",
-                            "type": "integer",
-                            "required": false
-                        },
                         "context": {
                             "description": "Scope under which the request is made; determines fields present in response.",
                             "type": "string",
@@ -4580,12 +7259,20 @@ mockedApiResponse.Schema = {
                             ],
                             "default": "view",
                             "required": false
+                        },
+                        "type": {
+                            "description": "Limit results to taxonomies associated with a specific post type.",
+                            "type": "string",
+                            "required": false
                         }
                     }
                 }
-            ]
+            ],
+            "_links": {
+                "self": "http://example.org/index.php?rest_route=/wp/v2/taxonomies"
+            }
         },
-        "/wp/v2/types": {
+        "/wp/v2/taxonomies/(?P<taxonomy>[\\w-]+)": {
             "namespace": "wp/v2",
             "methods": [
                 "GET"
@@ -4596,6 +7283,11 @@ mockedApiResponse.Schema = {
                         "GET"
                     ],
                     "args": {
+                        "taxonomy": {
+                            "description": "An alphanumeric identifier for the taxonomy.",
+                            "type": "string",
+                            "required": false
+                        },
                         "context": {
                             "description": "Scope under which the request is made; determines fields present in response.",
                             "type": "string",
@@ -4609,27 +7301,23 @@ mockedApiResponse.Schema = {
                         }
                     }
                 }
-            ],
-            "_links": {
-                "self": "http://example.org/index.php?rest_route=/wp/v2/types"
-            }
+            ]
         },
-        "/wp/v2/types/(?P<type>[\\w-]+)": {
+        "/wp/v2/categories": {
             "namespace": "wp/v2",
             "methods": [
-                "GET"
+                "GET",
+                "POST"
             ],
             "endpoints": [
                 {
                     "methods": [
                         "GET"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
-                        "type": {
-                            "description": "An alphanumeric identifier for the post type.",
-                            "type": "string",
-                            "required": false
-                        },
                         "context": {
                             "description": "Scope under which the request is made; determines fields present in response.",
                             "type": "string",
@@ -4640,54 +7328,160 @@ mockedApiResponse.Schema = {
                             ],
                             "default": "view",
                             "required": false
+                        },
+                        "page": {
+                            "description": "Current page of the collection.",
+                            "type": "integer",
+                            "default": 1,
+                            "minimum": 1,
+                            "required": false
+                        },
+                        "per_page": {
+                            "description": "Maximum number of items to be returned in result set.",
+                            "type": "integer",
+                            "default": 10,
+                            "minimum": 1,
+                            "maximum": 100,
+                            "required": false
+                        },
+                        "search": {
+                            "description": "Limit results to those matching a string.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "exclude": {
+                            "description": "Ensure result set excludes specific IDs.",
+                            "type": "array",
+                            "items": {
+                                "type": "integer"
+                            },
+                            "default": [],
+                            "required": false
+                        },
+                        "include": {
+                            "description": "Limit result set to specific IDs.",
+                            "type": "array",
+                            "items": {
+                                "type": "integer"
+                            },
+                            "default": [],
+                            "required": false
+                        },
+                        "order": {
+                            "description": "Order sort attribute ascending or descending.",
+                            "type": "string",
+                            "default": "asc",
+                            "enum": [
+                                "asc",
+                                "desc"
+                            ],
+                            "required": false
+                        },
+                        "orderby": {
+                            "description": "Sort collection by term attribute.",
+                            "type": "string",
+                            "default": "name",
+                            "enum": [
+                                "id",
+                                "include",
+                                "name",
+                                "slug",
+                                "include_slugs",
+                                "term_group",
+                                "description",
+                                "count"
+                            ],
+                            "required": false
+                        },
+                        "hide_empty": {
+                            "description": "Whether to hide terms not assigned to any posts.",
+                            "type": "boolean",
+                            "default": false,
+                            "required": false
+                        },
+                        "parent": {
+                            "description": "Limit result set to terms assigned to a specific parent.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "post": {
+                            "description": "Limit result set to terms assigned to a specific post.",
+                            "type": "integer",
+                            "default": null,
+                            "required": false
+                        },
+                        "slug": {
+                            "description": "Limit result set to terms with one or more specific slugs.",
+                            "type": "array",
+                            "items": {
+                                "type": "string"
+                            },
+                            "required": false
                         }
                     }
-                }
-            ]
-        },
-        "/wp/v2/statuses": {
-            "namespace": "wp/v2",
-            "methods": [
-                "GET"
-            ],
-            "endpoints": [
+                },
                 {
                     "methods": [
-                        "GET"
+                        "POST"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
-                        "context": {
-                            "description": "Scope under which the request is made; determines fields present in response.",
+                        "description": {
+                            "description": "HTML description of the term.",
                             "type": "string",
-                            "enum": [
-                                "view",
-                                "embed",
-                                "edit"
-                            ],
-                            "default": "view",
+                            "required": false
+                        },
+                        "name": {
+                            "description": "HTML title for the term.",
+                            "type": "string",
+                            "required": true
+                        },
+                        "slug": {
+                            "description": "An alphanumeric identifier for the term unique to its type.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "parent": {
+                            "description": "The parent term ID.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "meta": {
+                            "description": "Meta fields.",
+                            "type": "object",
+                            "properties": [],
                             "required": false
                         }
                     }
                 }
             ],
             "_links": {
-                "self": "http://example.org/index.php?rest_route=/wp/v2/statuses"
+                "self": "http://example.org/index.php?rest_route=/wp/v2/categories"
             }
         },
-        "/wp/v2/statuses/(?P<status>[\\w-]+)": {
+        "/wp/v2/categories/(?P<id>[\\d]+)": {
             "namespace": "wp/v2",
             "methods": [
-                "GET"
+                "GET",
+                "POST",
+                "PUT",
+                "PATCH",
+                "DELETE"
             ],
             "endpoints": [
                 {
                     "methods": [
                         "GET"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
-                        "status": {
-                            "description": "An alphanumeric identifier for the status.",
-                            "type": "string",
+                        "id": {
+                            "description": "Unique identifier for the term.",
+                            "type": "integer",
                             "required": false
                         },
                         "context": {
@@ -4702,75 +7496,74 @@ mockedApiResponse.Schema = {
                             "required": false
                         }
                     }
-                }
-            ]
-        },
-        "/wp/v2/taxonomies": {
-            "namespace": "wp/v2",
-            "methods": [
-                "GET"
-            ],
-            "endpoints": [
+                },
                 {
                     "methods": [
-                        "GET"
+                        "POST",
+                        "PUT",
+                        "PATCH"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
-                        "context": {
-                            "description": "Scope under which the request is made; determines fields present in response.",
+                        "id": {
+                            "description": "Unique identifier for the term.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "description": {
+                            "description": "HTML description of the term.",
                             "type": "string",
-                            "enum": [
-                                "view",
-                                "embed",
-                                "edit"
-                            ],
-                            "default": "view",
                             "required": false
                         },
-                        "type": {
-                            "description": "Limit results to taxonomies associated with a specific post type.",
+                        "name": {
+                            "description": "HTML title for the term.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "slug": {
+                            "description": "An alphanumeric identifier for the term unique to its type.",
                             "type": "string",
                             "required": false
+                        },
+                        "parent": {
+                            "description": "The parent term ID.",
+                            "type": "integer",
+                            "required": false
+                        },
+                        "meta": {
+                            "description": "Meta fields.",
+                            "type": "object",
+                            "properties": [],
+                            "required": false
                         }
                     }
-                }
-            ],
-            "_links": {
-                "self": "http://example.org/index.php?rest_route=/wp/v2/taxonomies"
-            }
-        },
-        "/wp/v2/taxonomies/(?P<taxonomy>[\\w-]+)": {
-            "namespace": "wp/v2",
-            "methods": [
-                "GET"
-            ],
-            "endpoints": [
+                },
                 {
                     "methods": [
-                        "GET"
+                        "DELETE"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
-                        "taxonomy": {
-                            "description": "An alphanumeric identifier for the taxonomy.",
-                            "type": "string",
+                        "id": {
+                            "description": "Unique identifier for the term.",
+                            "type": "integer",
                             "required": false
                         },
-                        "context": {
-                            "description": "Scope under which the request is made; determines fields present in response.",
-                            "type": "string",
-                            "enum": [
-                                "view",
-                                "embed",
-                                "edit"
-                            ],
-                            "default": "view",
+                        "force": {
+                            "type": "boolean",
+                            "default": false,
+                            "description": "Required to be true, as terms do not support trashing.",
                             "required": false
                         }
                     }
                 }
             ]
         },
-        "/wp/v2/categories": {
+        "/wp/v2/tags": {
             "namespace": "wp/v2",
             "methods": [
                 "GET",
@@ -4781,6 +7574,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "GET"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "context": {
                             "description": "Scope under which the request is made; determines fields present in response.",
@@ -4831,6 +7627,11 @@ mockedApiResponse.Schema = {
                             "default": [],
                             "required": false
                         },
+                        "offset": {
+                            "description": "Offset the result set by a specific number of items.",
+                            "type": "integer",
+                            "required": false
+                        },
                         "order": {
                             "description": "Order sort attribute ascending or descending.",
                             "type": "string",
@@ -4863,11 +7664,6 @@ mockedApiResponse.Schema = {
                             "default": false,
                             "required": false
                         },
-                        "parent": {
-                            "description": "Limit result set to terms assigned to a specific parent.",
-                            "type": "integer",
-                            "required": false
-                        },
                         "post": {
                             "description": "Limit result set to terms assigned to a specific post.",
                             "type": "integer",
@@ -4888,6 +7684,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "POST"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "description": {
                             "description": "HTML description of the term.",
@@ -4904,11 +7703,6 @@ mockedApiResponse.Schema = {
                             "type": "string",
                             "required": false
                         },
-                        "parent": {
-                            "description": "The parent term ID.",
-                            "type": "integer",
-                            "required": false
-                        },
                         "meta": {
                             "description": "Meta fields.",
                             "type": "object",
@@ -4919,10 +7713,10 @@ mockedApiResponse.Schema = {
                 }
             ],
             "_links": {
-                "self": "http://example.org/index.php?rest_route=/wp/v2/categories"
+                "self": "http://example.org/index.php?rest_route=/wp/v2/tags"
             }
         },
-        "/wp/v2/categories/(?P<id>[\\d]+)": {
+        "/wp/v2/tags/(?P<id>[\\d]+)": {
             "namespace": "wp/v2",
             "methods": [
                 "GET",
@@ -4936,6 +7730,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "GET"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "id": {
                             "description": "Unique identifier for the term.",
@@ -4961,6 +7758,9 @@ mockedApiResponse.Schema = {
                         "PUT",
                         "PATCH"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "id": {
                             "description": "Unique identifier for the term.",
@@ -4982,11 +7782,6 @@ mockedApiResponse.Schema = {
                             "type": "string",
                             "required": false
                         },
-                        "parent": {
-                            "description": "The parent term ID.",
-                            "type": "integer",
-                            "required": false
-                        },
                         "meta": {
                             "description": "Meta fields.",
                             "type": "object",
@@ -4999,6 +7794,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "DELETE"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "id": {
                             "description": "Unique identifier for the term.",
@@ -5015,7 +7813,7 @@ mockedApiResponse.Schema = {
                 }
             ]
         },
-        "/wp/v2/tags": {
+        "/wp/v2/menus": {
             "namespace": "wp/v2",
             "methods": [
                 "GET",
@@ -5026,6 +7824,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "GET"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "context": {
                             "description": "Scope under which the request is made; determines fields present in response.",
@@ -5133,6 +7934,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "POST"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "description": {
                             "description": "HTML description of the term.",
@@ -5154,15 +7958,32 @@ mockedApiResponse.Schema = {
                             "type": "object",
                             "properties": [],
                             "required": false
+                        },
+                        "locations": {
+                            "description": "The locations assigned to the menu.",
+                            "type": "array",
+                            "items": {
+                                "type": "string"
+                            },
+                            "required": false
+                        },
+                        "auto_add": {
+                            "description": "Whether to automatically add top level pages to this menu.",
+                            "type": "boolean",
+                            "required": false
                         }
                     }
                 }
             ],
             "_links": {
-                "self": "http://example.org/index.php?rest_route=/wp/v2/tags"
+                "self": [
+                    {
+                        "href": "http://example.org/index.php?rest_route=/wp/v2/menus"
+                    }
+                ]
             }
         },
-        "/wp/v2/tags/(?P<id>[\\d]+)": {
+        "/wp/v2/menus/(?P<id>[\\d]+)": {
             "namespace": "wp/v2",
             "methods": [
                 "GET",
@@ -5176,6 +7997,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "GET"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "id": {
                             "description": "Unique identifier for the term.",
@@ -5201,6 +8025,9 @@ mockedApiResponse.Schema = {
                         "PUT",
                         "PATCH"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "id": {
                             "description": "Unique identifier for the term.",
@@ -5227,6 +8054,19 @@ mockedApiResponse.Schema = {
                             "type": "object",
                             "properties": [],
                             "required": false
+                        },
+                        "locations": {
+                            "description": "The locations assigned to the menu.",
+                            "type": "array",
+                            "items": {
+                                "type": "string"
+                            },
+                            "required": false
+                        },
+                        "auto_add": {
+                            "description": "Whether to automatically add top level pages to this menu.",
+                            "type": "boolean",
+                            "required": false
                         }
                     }
                 },
@@ -5234,6 +8074,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "DELETE"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "id": {
                             "description": "Unique identifier for the term.",
@@ -5373,6 +8216,27 @@ mockedApiResponse.Schema = {
                                 "authors"
                             ],
                             "required": false
+                        },
+                        "has_published_posts": {
+                            "description": "Limit result set to users who have published posts.",
+                            "type": [
+                                "boolean",
+                                "array"
+                            ],
+                            "items": {
+                                "type": "string",
+                                "enum": {
+                                    "post": "post",
+                                    "page": "page",
+                                    "attachment": "attachment",
+                                    "nav_menu_item": "nav_menu_item",
+                                    "wp_block": "wp_block",
+                                    "wp_template": "wp_template",
+                                    "wp_template_part": "wp_template_part",
+                                    "wp_navigation": "wp_navigation"
+                                }
+                            },
+                            "required": false
                         }
                     }
                 },
@@ -6527,7 +9391,66 @@ mockedApiResponse.Schema = {
         "/wp/v2/block-types/(?P<namespace>[a-zA-Z0-9_-]+)/(?P<name>[a-zA-Z0-9_-]+)": {
             "namespace": "wp/v2",
             "methods": [
-                "GET"
+                "GET"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "name": {
+                            "description": "Block name.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "namespace": {
+                            "description": "Block namespace.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp/v2/global-styles/themes/(?P<stylesheet>[^\\/:<>\\*\\?\"\\|]+(?:\\/[^\\/:<>\\*\\?\"\\|]+)?)": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "stylesheet": {
+                            "description": "The theme identifier",
+                            "type": "string",
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp/v2/global-styles/(?P<id>[\\/\\w-]+)": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET",
+                "POST",
+                "PUT",
+                "PATCH"
             ],
             "endpoints": [
                 {
@@ -6535,25 +9458,61 @@ mockedApiResponse.Schema = {
                         "GET"
                     ],
                     "args": {
-                        "name": {
-                            "description": "Block name.",
+                        "id": {
+                            "description": "The id of a template",
                             "type": "string",
                             "required": false
+                        }
+                    }
+                },
+                {
+                    "methods": [
+                        "POST",
+                        "PUT",
+                        "PATCH"
+                    ],
+                    "args": {
+                        "styles": {
+                            "description": "Global styles.",
+                            "type": [
+                                "object"
+                            ],
+                            "required": false
                         },
-                        "namespace": {
-                            "description": "Block namespace.",
-                            "type": "string",
+                        "settings": {
+                            "description": "Global settings.",
+                            "type": [
+                                "object"
+                            ],
                             "required": false
                         },
-                        "context": {
-                            "description": "Scope under which the request is made; determines fields present in response.",
-                            "type": "string",
-                            "enum": [
-                                "view",
-                                "embed",
-                                "edit"
+                        "title": {
+                            "description": "Title of the global styles variation.",
+                            "type": [
+                                "object",
+                                "string"
                             ],
-                            "default": "view",
+                            "properties": {
+                                "raw": {
+                                    "description": "Title for the global styles variation, as it exists in the database.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ]
+                                },
+                                "rendered": {
+                                    "description": "HTML title for the post, transformed for display.",
+                                    "type": "string",
+                                    "context": [
+                                        "view",
+                                        "edit",
+                                        "embed"
+                                    ],
+                                    "readonly": true
+                                }
+                            },
                             "required": false
                         }
                     }
@@ -6671,6 +9630,11 @@ mockedApiResponse.Schema = {
                             "description": "Site logo.",
                             "type": "integer",
                             "required": false
+                        },
+                        "site_icon": {
+                            "description": "Site icon.",
+                            "type": "integer",
+                            "required": false
                         }
                     }
                 }
@@ -6709,7 +9673,7 @@ mockedApiResponse.Schema = {
                 "self": "http://example.org/index.php?rest_route=/wp/v2/themes"
             }
         },
-        "/wp/v2/themes/(?P<stylesheet>[^.\\/]+(?:\\/[^.\\/]+)?)": {
+        "/wp/v2/themes/(?P<stylesheet>[^\\/:<>\\*\\?\"\\|]+(?:\\/[^\\/:<>\\*\\?\"\\|]+)?)": {
             "namespace": "wp/v2",
             "methods": [
                 "GET"
@@ -7076,6 +10040,31 @@ mockedApiResponse.Schema = {
                 }
             ]
         },
+        "/wp/v2/widget-types/(?P<id>[a-zA-Z0-9_-]+)/render": {
+            "namespace": "wp/v2",
+            "methods": [
+                "POST"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "POST"
+                    ],
+                    "args": {
+                        "id": {
+                            "description": "The widget type id.",
+                            "type": "string",
+                            "required": true
+                        },
+                        "instance": {
+                            "description": "Current instance settings of the widget.",
+                            "type": "object",
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
         "/wp/v2/widgets": {
             "namespace": "wp/v2",
             "methods": [
@@ -7087,6 +10076,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "GET"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "context": {
                             "description": "Scope under which the request is made; determines fields present in response.",
@@ -7110,6 +10102,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "POST"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "id": {
                             "description": "Unique identifier for the widget.",
@@ -7185,6 +10180,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "GET"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "context": {
                             "description": "Scope under which the request is made; determines fields present in response.",
@@ -7205,6 +10203,9 @@ mockedApiResponse.Schema = {
                         "PUT",
                         "PATCH"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "id": {
                             "description": "Unique identifier for the widget.",
@@ -7260,6 +10261,9 @@ mockedApiResponse.Schema = {
                     "methods": [
                         "DELETE"
                     ],
+                    "allow_batch": {
+                        "v1": true
+                    },
                     "args": {
                         "force": {
                             "description": "Whether to force removal of the widget, or move it to the inactive sidebar.",
@@ -7585,9 +10589,95 @@ mockedApiResponse.Schema = {
                     }
                 ]
             }
+        },
+        "/wp/v2/menu-locations": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        }
+                    }
+                }
+            ],
+            "_links": {
+                "self": [
+                    {
+                        "href": "http://example.org/index.php?rest_route=/wp/v2/menu-locations"
+                    }
+                ]
+            }
+        },
+        "/wp/v2/menu-locations/(?P<location>[\\w-]+)": {
+            "namespace": "wp/v2",
+            "methods": [
+                "GET"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": {
+                        "location": {
+                            "description": "An alphanumeric identifier for the menu location.",
+                            "type": "string",
+                            "required": false
+                        },
+                        "context": {
+                            "description": "Scope under which the request is made; determines fields present in response.",
+                            "type": "string",
+                            "enum": [
+                                "view",
+                                "embed",
+                                "edit"
+                            ],
+                            "default": "view",
+                            "required": false
+                        }
+                    }
+                }
+            ]
+        },
+        "/wp-block-editor/v1/export": {
+            "namespace": "wp-block-editor/v1",
+            "methods": [
+                "GET"
+            ],
+            "endpoints": [
+                {
+                    "methods": [
+                        "GET"
+                    ],
+                    "args": []
+                }
+            ],
+            "_links": {
+                "self": [
+                    {
+                        "href": "http://example.org/index.php?rest_route=/wp-block-editor/v1/export"
+                    }
+                ]
+            }
         }
     },
-    "site_logo": false
+    "site_logo": 0,
+    "site_icon": 0
 };
 
 mockedApiResponse.oembed = {
@@ -8460,6 +11550,36 @@ mockedApiResponse.TypesCollection = {
             ]
         }
     },
+    "nav_menu_item": {
+        "description": "",
+        "hierarchical": false,
+        "name": "Navigation Menu Items",
+        "slug": "nav_menu_item",
+        "taxonomies": [
+            "nav_menu"
+        ],
+        "rest_base": "menu-items",
+        "rest_namespace": "wp/v2",
+        "_links": {
+            "collection": [
+                {
+                    "href": "http://example.org/index.php?rest_route=/wp/v2/types"
+                }
+            ],
+            "wp:items": [
+                {
+                    "href": "http://example.org/index.php?rest_route=/wp/v2/menu-items"
+                }
+            ],
+            "curies": [
+                {
+                    "name": "wp",
+                    "href": "https://api.w.org/{rel}",
+                    "templated": true
+                }
+            ]
+        }
+    },
     "wp_block": {
         "description": "",
         "hierarchical": false,
@@ -8515,6 +11635,62 @@ mockedApiResponse.TypesCollection = {
                 }
             ]
         }
+    },
+    "wp_template_part": {
+        "description": "Template parts to include in your templates.",
+        "hierarchical": false,
+        "name": "Template Parts",
+        "slug": "wp_template_part",
+        "taxonomies": [],
+        "rest_base": "template-parts",
+        "rest_namespace": "wp/v2",
+        "_links": {
+            "collection": [
+                {
+                    "href": "http://example.org/index.php?rest_route=/wp/v2/types"
+                }
+            ],
+            "wp:items": [
+                {
+                    "href": "http://example.org/index.php?rest_route=/wp/v2/template-parts"
+                }
+            ],
+            "curies": [
+                {
+                    "name": "wp",
+                    "href": "https://api.w.org/{rel}",
+                    "templated": true
+                }
+            ]
+        }
+    },
+    "wp_navigation": {
+        "description": "Navigation menus that can be inserted into your site.",
+        "hierarchical": false,
+        "name": "Navigation Menus",
+        "slug": "wp_navigation",
+        "taxonomies": [],
+        "rest_base": "navigation",
+        "rest_namespace": "wp/v2",
+        "_links": {
+            "collection": [
+                {
+                    "href": "http://example.org/index.php?rest_route=/wp/v2/types"
+                }
+            ],
+            "wp:items": [
+                {
+                    "href": "http://example.org/index.php?rest_route=/wp/v2/navigation"
+                }
+            ],
+            "curies": [
+                {
+                    "name": "wp",
+                    "href": "https://api.w.org/{rel}",
+                    "templated": true
+                }
+            ]
+        }
     }
 };
 
@@ -8686,6 +11862,36 @@ mockedApiResponse.TaxonomiesCollection = {
                 }
             ]
         }
+    },
+    "nav_menu": {
+        "name": "Navigation Menus",
+        "slug": "nav_menu",
+        "description": "",
+        "types": [
+            "nav_menu_item"
+        ],
+        "hierarchical": false,
+        "rest_base": "menus",
+        "rest_namespace": "wp/v2",
+        "_links": {
+            "collection": [
+                {
+                    "href": "http://example.org/index.php?rest_route=/wp/v2/taxonomies"
+                }
+            ],
+            "wp:items": [
+                {
+                    "href": "http://example.org/index.php?rest_route=/wp/v2/menus"
+                }
+            ],
+            "curies": [
+                {
+                    "name": "wp",
+                    "href": "https://api.w.org/{rel}",
+                    "templated": true
+                }
+            ]
+        }
     }
 };
 
@@ -9011,5 +12217,6 @@ mockedApiResponse.settings = {
     "posts_per_page": 10,
     "default_ping_status": "open",
     "default_comment_status": "open",
-    "site_logo": null
+    "site_logo": null,
+    "site_icon": 0
 };
diff --git a/tests/qunit/wp-admin/js/nav-menu.js b/tests/qunit/wp-admin/js/nav-menu.js
index 98a3448a34..c630d07829 100644
--- a/tests/qunit/wp-admin/js/nav-menu.js
+++ b/tests/qunit/wp-admin/js/nav-menu.js
@@ -23,6 +23,20 @@
 
 		var testString = '<div>Hello World</div>';
 
+		// Mock global menus.
+		if ( ! window.hasOwnProperty( 'menus' ) ) {
+			window.menus = {
+				'itemAdded': false,
+				'itemDeleted': false
+			};
+		}
+
+		// Mock global wp.a11y.
+		window.wp = window.wp || {};
+		window.wp.a11y = {
+			'speak': function() {}
+		};
+
 		// Mock the internal function calls so the don't fail.
 		$.fn.hideAdvancedMenuItemFields = function() {
 			return {
diff --git a/tools/webpack/blocks.js b/tools/webpack/blocks.js
index 2934732ab3..2579ce11d4 100644
--- a/tools/webpack/blocks.js
+++ b/tools/webpack/blocks.js
@@ -28,17 +28,26 @@ module.exports = function( env = { environment: 'production', watch: false, buil
 		'calendar',
 		'categories',
 		'file',
+		'gallery',
+		'image',
 		'latest-comments',
 		'latest-posts',
 		'loginout',
+		'navigation',
+		'navigation-link',
+		'navigation-submenu',
 		'page-list',
+		'pattern',
+		'post-author',
+		'post-comments',
 		'post-content',
 		'post-date',
 		'post-excerpt',
 		'post-featured-image',
+		'post-navigation-link',
+		'post-template',
 		'post-terms',
 		'post-title',
-		'post-template',
 		'query',
 		'query-pagination',
 		'query-pagination-next',
@@ -53,6 +62,8 @@ module.exports = function( env = { environment: 'production', watch: false, buil
 		'site-title',
 		'social-link',
 		'tag-cloud',
+		'template-part',
+		'term-description',
 	];
 	const blockFolders = [
 		'audio',
@@ -64,11 +75,9 @@ module.exports = function( env = { environment: 'production', watch: false, buil
 		'cover',
 		'embed',
 		'freeform',
-		'gallery',
 		'group',
 		'heading',
 		'html',
-		'image',
 		'list',
 		'media-text',
 		'missing',
@@ -89,6 +98,7 @@ module.exports = function( env = { environment: 'production', watch: false, buil
 	];
 	const blockPHPFiles = {
 		'widgets/src/blocks/legacy-widget/index.php': 'wp-includes/blocks/legacy-widget.php',
+		'widgets/src/blocks/widget-group/index.php': 'wp-includes/blocks/widget-group.php',
 		...dynamicBlockFolders.reduce( ( files, blockName ) => {
 			files[ `block-library/src/${ blockName }/index.php` ] = `wp-includes/blocks/${ blockName }.php`;
 			return files;
@@ -96,6 +106,7 @@ module.exports = function( env = { environment: 'production', watch: false, buil
 	};
 	const blockMetadataFiles = {
 		'widgets/src/blocks/legacy-widget/block.json': 'wp-includes/blocks/legacy-widget/block.json',
+		'widgets/src/blocks/widget-group/block.json': 'wp-includes/blocks/widget-group/block.json',
 		...blockFolders.reduce( ( files, blockName ) => {
 			files[ `block-library/src/${ blockName }/block.json` ] = `wp-includes/blocks/${ blockName }/block.json`;
 			return files;
@@ -142,6 +153,7 @@ module.exports = function( env = { environment: 'production', watch: false, buil
 		mode,
 		entry: {
 			'file/view': join( baseDir, `node_modules/@wordpress/block-library/build-module/file/view` ),
+			'navigation/view': join( baseDir, `node_modules/@wordpress/block-library/build-module/navigation/view` ),
 		},
 		output: {
 			devtoolNamespace: 'wp',
diff --git a/wp-config-sample.php b/wp-config-sample.php
index d8469e730f..c095f50f6c 100644
--- a/wp-config-sample.php
+++ b/wp-config-sample.php
@@ -8,7 +8,7 @@
  *
  * This file contains the following configurations:
  *
- * * MySQL settings
+ * * Database settings
  * * Secret keys
  * * Database table prefix
  * * ABSPATH
@@ -18,17 +18,17 @@
  * @package WordPress
  */
 
-// ** MySQL settings - You can get this info from your web host ** //
+// ** Database settings - You can get this info from your web host ** //
 /** The name of the database for WordPress */
 define( 'DB_NAME', 'database_name_here' );
 
-/** MySQL database username */
+/** Database username */
 define( 'DB_USER', 'username_here' );
 
-/** MySQL database password */
+/** Database password */
 define( 'DB_PASSWORD', 'password_here' );
 
-/** MySQL hostname */
+/** Database hostname */
 define( 'DB_HOST', 'localhost' );
 
 /** Database charset to use in creating database tables. */
diff --git a/wp-tests-config-sample.php b/wp-tests-config-sample.php
index 62636da344..934eda9162 100644
--- a/wp-tests-config-sample.php
+++ b/wp-tests-config-sample.php
@@ -26,7 +26,7 @@ define( 'WP_DEFAULT_THEME', 'default' );
 // Test with WordPress debug mode (default).
 define( 'WP_DEBUG', true );
 
-// ** MySQL settings ** //
+// ** Database settings ** //
 
 /*
  * This configuration file will be used by the copy of WordPress being tested.
