diff --git a/DEPS b/DEPS
index 0aa515b2..3379ba6 100644
--- a/DEPS
+++ b/DEPS
@@ -250,7 +250,7 @@
   # luci-go CIPD package version.
   # Make sure the revision is uploaded by infra-packagers builder.
   # https://ci.chromium.org/p/infra-internal/g/infra-packagers/console
-  'luci_go': 'git_revision:a0624fca6d6e6fc1da6462ce0ee7678d4cc739d8',
+  'luci_go': 'git_revision:05765dd1fd00909347fcc36cac12b732e3039e3d',
 
   # This can be overridden, e.g. with custom_vars, to build clang from HEAD
   # instead of downloading the prebuilt pinned revision.
@@ -284,7 +284,7 @@
   'dawn_standalone': False,
 
   # reclient CIPD package version
-  'reclient_version': 're_client_version:0.78.0.6f1e751-gomaip',
+  'reclient_version': 're_client_version:0.81.1.0853992-gomaip',
 
   # Fetch Rust-related packages.
   'use_rust': False,
@@ -307,11 +307,11 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling Skia
   # and whatever else without interference from each other.
-  'skia_revision': 'f2036096c93c6760b1308923c2e04ba1c967f579',
+  'skia_revision': '3a990bac0bd53e13f105914a7ab0f657398719aa',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling V8
   # and whatever else without interference from each other.
-  'v8_revision': 'a62b12a6d662f541262d416970b69d1910d38dbf',
+  'v8_revision': '2b0be936426d7226ec71be4048e5192963d31062',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
@@ -422,7 +422,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'dawn_revision': 'fafeb9a3279b602f59cc7493bb15fe1931fefaee',
+  'dawn_revision': 'ba384f0383502bb182f810c3007235a6d0aadc3f',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -442,7 +442,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libavif
   # and whatever else without interference from each other.
-  'libavif_revision': 'b3e0f315fcf9f0aca68d695d8b917215768030f4',
+  'libavif_revision': 'de7e6c0d98abcd6843c4a9bf4cee731141dca566',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling nearby
   # and whatever else without interference from each other.
@@ -470,7 +470,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
-  'libunwind_revision':    '118a58005a16d1b06b2b9ce2fbb34af2ecc55ad4',
+  'libunwind_revision':    '1111799723f6a003e6f52202b9bf84387c552081',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling feed
   # and whatever else without interference from each other.
@@ -818,12 +818,12 @@
 
   'src/clank': {
     'url': 'https://chrome-internal.googlesource.com/clank/internal/apps.git' + '@' +
-    '9ea4f61b3c171f9393aa126d3b9913f7bec2d644',
+    'fcea22e26c67e9b39f3f3d00810500b306722e32',
     'condition': 'checkout_android and checkout_src_internal and not checkout_clank_via_src_internal',
   },
 
   'src/docs/website': {
-    'url': Var('chromium_git') + '/website.git' + '@' + '1be3076436b5535f31cf306e9b80b528b0e10c27',
+    'url': Var('chromium_git') + '/website.git' + '@' + 'b5ad817e0eecb584486d51f769bd91f013d287c4',
   },
 
   'src/ios/third_party/earl_grey2/src': {
@@ -1245,13 +1245,13 @@
   },
 
   'src/third_party/depot_tools':
-    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '5b5ee2de1b2b405061b92185c129a7016c6d62b4',
+    Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '67d8bcb9957d1154387c0702fd8115729f81f935',
 
   'src/third_party/devtools-frontend/src':
     Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'),
 
   'src/third_party/devtools-frontend-internal': {
-      'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + 'bb40f187b3587d8893e0a5a62448c06f59b30a3c',
+      'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + 'cc58c5f3d991b96ca28eb13c3b639728d846d4e4',
     'condition': 'checkout_src_internal',
   },
 
@@ -1851,7 +1851,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'eba1a78f3d741241b0dbee728561b61e9587a686',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '2068d0daa78100056dd1e3c1eae7317389079859',
+    Var('webrtc_git') + '/src.git' + '@' + '601b2f5e8c33a68b521346d6ce8ac899408d11b2',
 
   # Wuffs' canonical repository is at github.com/google/wuffs, but we use
   # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file.
@@ -1888,7 +1888,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/windows-amd64',
-          'version': '3IrV971Fn9UEAXu0UwL8cBBY3L8il5zi4Qjhvfa43TQC',
+          'version': 'UQplRaUw9FHcOfJNcDs_v_q1RgFiRQOm1YPonxadxu0C',
         },
       ],
       'dep_type': 'cipd',
@@ -1899,7 +1899,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/mac-amd64',
-          'version': 'OKl2kxI6rF8oLCJQma7QhqQHTC_J3hMRKoAqyW4tqq0C',
+          'version': 'spR3Wh59oLDHcwMl_Aw4KX_h3c0G4xcOxQSi7KM8uNgC',
         },
       ],
       'dep_type': 'cipd',
@@ -1910,7 +1910,7 @@
       'packages': [
         {
           'package': 'skia/tools/goldctl/mac-arm64',
-          'version': 'pZmD81q5BF6lQcwTgrtJre8iXtofPubDLM8624rQKNsC',
+          'version': 'GBW03jFiyCg47tt4xFsQ4Qql_kYZm-A-ADSEmuqRCRIC',
         },
       ],
       'dep_type': 'cipd',
@@ -1921,7 +1921,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@09f5b2382850af3ea498f4b386d8a2696abafca2',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@b8ba6757c04ce866ecb8720119d7c3c56b5dbaf5',
     'condition': 'checkout_src_internal',
   },
 
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
index 3314f7a..e50dface 100644
--- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
+++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -186,6 +186,8 @@
             Flag.baseFeature(AutofillFeatures.AUTOFILL_CONSIDER_PLACEHOLDER_FOR_PARSING,
                     "When enabled, Autofill local heuristics consider the placeholder attribute "
                             + "for determining field types."),
+            Flag.baseFeature(AutofillFeatures.AUTOFILL_IMPROVED_LABEL_FOR_INFERENCE,
+                    "When enabled, Autofill associates assigned labels with inputs in unowned forms."),
             Flag.baseFeature(AutofillFeatures.AUTOFILL_SERVER_BEHAVIORS,
                     "When enabled, Autofill will request experimental "
                             + "predictions from the Autofill API."),
diff --git a/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt b/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt
index dfb4b668..a31ccb1 100644
--- a/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt
+++ b/android_webview/tools/system_webview_shell/test/data/webexposed/not-webview-exposed.txt
@@ -281,7 +281,6 @@
 
 # FedCM API is not implemented on WebView. crbug.com/1340252
 interface IdentityCredential : Credential
-    getter token
 
 [GLOBAL OBJECT]
     method openDatabase
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index d338202..f991c4c3 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -1783,6 +1783,8 @@
     "system/unified/feature_pod_controller_base.h",
     "system/unified/feature_pods_container_view.cc",
     "system/unified/feature_pods_container_view.h",
+    "system/unified/feature_tiles_container_view.cc",
+    "system/unified/feature_tiles_container_view.h",
     "system/unified/ime_mode_view.cc",
     "system/unified/ime_mode_view.h",
     "system/unified/managed_device_tray_item_view.cc",
@@ -3001,6 +3003,7 @@
     "system/unified/camera_mic_tray_item_view_unittest.cc",
     "system/unified/date_tray_unittest.cc",
     "system/unified/feature_pods_container_view_unittest.cc",
+    "system/unified/feature_tiles_container_view_unittest.cc",
     "system/unified/notification_counter_view_unittest.cc",
     "system/unified/notification_icons_controller_unittest.cc",
     "system/unified/page_indicator_view_unittest.cc",
diff --git a/ash/accelerators/ash_accelerator_configuration.cc b/ash/accelerators/ash_accelerator_configuration.cc
index 0cf73991..4d2eb50 100644
--- a/ash/accelerators/ash_accelerator_configuration.cc
+++ b/ash/accelerators/ash_accelerator_configuration.cc
@@ -11,6 +11,7 @@
 #include "ash/accelerators/debug_commands.h"
 #include "ash/constants/ash_features.h"
 #include "ash/public/cpp/accelerators.h"
+#include "ash/public/cpp/accelerators_util.h"
 #include "ash/public/mojom/accelerator_info.mojom.h"
 #include "base/containers/span.h"
 #include "base/strings/strcat.h"
@@ -172,7 +173,8 @@
                                   : ui::Accelerator::KeyState::RELEASED);
     // TODO(jimmyxgong): Ash accelerators should not be locked when
     // customization is allowed.
-    AcceleratorInfo info(type, accelerator, /**locked=*/true);
+    AcceleratorInfo info(type, accelerator, KeycodeToKeyString(data.keycode),
+                         /*locked=*/true);
     accelerator_to_id_.InsertNew(std::make_pair(accelerator, data.action));
     id_to_accelerator_infos_[static_cast<uint32_t>(data.action)].push_back(
         info);
diff --git a/ash/accelerators/ash_accelerator_configuration_unittest.cc b/ash/accelerators/ash_accelerator_configuration_unittest.cc
index a63b034..9038065 100644
--- a/ash/accelerators/ash_accelerator_configuration_unittest.cc
+++ b/ash/accelerators/ash_accelerator_configuration_unittest.cc
@@ -9,6 +9,7 @@
 
 #include "ash/accelerators/accelerator_layout_table.h"
 #include "ash/public/cpp/accelerators.h"
+#include "ash/public/cpp/accelerators_util.h"
 #include "base/test/scoped_feature_list.h"
 #include "ui/base/ui_base_features.h"
 #include "ui/events/event_constants.h"
@@ -24,14 +25,19 @@
                          const ash::AcceleratorInfo& actual_info) {
   ui::Accelerator expected_accel(expected_data.keycode,
                                  expected_data.modifiers);
-  ash::AcceleratorInfo expected_info(actual_info.type, expected_accel,
-                                     /**locked=*/true);
+  ash::AcceleratorInfo expected_info(
+      actual_info.type, expected_accel,
+      ash::KeycodeToKeyString(expected_data.keycode),
+      /*locked=*/true);
 
   const bool type_equals = expected_info.type == actual_info.type;
   const bool accelerator_equals =
       expected_info.accelerator == actual_info.accelerator;
+  const bool key_display_equals =
+      expected_info.key_display == actual_info.key_display;
   const bool locked_equals = expected_info.locked == actual_info.locked;
-  return type_equals && accelerator_equals && locked_equals;
+  return type_equals && accelerator_equals && key_display_equals &&
+         locked_equals;
 }
 
 void ExpectAllAcceleratorsEqual(
diff --git a/ash/app_list/app_list_metrics.cc b/ash/app_list/app_list_metrics.cc
index c720d378..2eb303d4 100644
--- a/ash/app_list/app_list_metrics.cc
+++ b/ash/app_list/app_list_metrics.cc
@@ -236,7 +236,7 @@
     case AppListShowSource::kSearchKeyFullscreen_DEPRECATED:
       return "SearchKey";
     case AppListShowSource::kShelfButton:
-    case AppListShowSource::kShelfButtonFullscreen:
+    case AppListShowSource::kShelfButtonFullscreen_DEPRACTED:
       return "HomeButton";
     case AppListShowSource::kSwipeFromShelf:
       return "Swipe";
diff --git a/ash/app_list/app_list_metrics.h b/ash/app_list/app_list_metrics.h
index 59aa608..a7f420c 100644
--- a/ash/app_list/app_list_metrics.h
+++ b/ash/app_list/app_list_metrics.h
@@ -58,8 +58,8 @@
   kShelfButton = 1,
   kSwipeFromShelf = 2,
   kTabletMode = 3,
-  kSearchKeyFullscreen_DEPRECATED = 4,  // Migrated to kSearchKey.
-  kShelfButtonFullscreen = 5,
+  kSearchKeyFullscreen_DEPRECATED = 4,   // Migrated to kSearchKey.
+  kShelfButtonFullscreen_DEPRACTED = 5,  // Obsolete on bubble launcher.
   kAssistantEntryPoint = 6,
   kScrollFromShelf = 7,
   kMaxValue = kScrollFromShelf,
diff --git a/ash/app_list/views/assistant/assistant_main_stage.cc b/ash/app_list/views/assistant/assistant_main_stage.cc
index 07de262d..0083cdb 100644
--- a/ash/app_list/views/assistant/assistant_main_stage.cc
+++ b/ash/app_list/views/assistant/assistant_main_stage.cc
@@ -11,7 +11,6 @@
 #include "ash/assistant/ui/assistant_view_delegate.h"
 #include "ash/assistant/ui/assistant_view_ids.h"
 #include "ash/assistant/ui/base/stack_layout.h"
-#include "ash/assistant/ui/colors/assistant_colors_util.h"
 #include "ash/assistant/ui/main_stage/assistant_footer_view.h"
 #include "ash/assistant/ui/main_stage/assistant_progress_indicator.h"
 #include "ash/assistant/ui/main_stage/assistant_query_view.h"
@@ -118,8 +117,7 @@
 
 AppListAssistantMainStage::AppListAssistantMainStage(
     AssistantViewDelegate* delegate)
-    : delegate_(delegate),
-      use_dark_light_mode_colors_(assistant::UseDarkLightModeColors()) {
+    : delegate_(delegate) {
   SetID(AssistantViewID::kMainStage);
   InitLayout();
 
@@ -142,10 +140,6 @@
 
 void AppListAssistantMainStage::OnThemeChanged() {
   views::View::OnThemeChanged();
-
-  if (!use_dark_light_mode_colors_)
-    return;
-
   horizontal_separator_->SetColorId(ui::kColorAshSystemUIMenuSeparator);
 }
 
@@ -258,9 +252,7 @@
                        2;
   horizontal_separator_->SetBorder(
       views::CreateEmptyBorder(gfx::Insets::VH(vertical_inset, 0)));
-  // We use default color of views::Separator if dark light mode flag is off.
-  if (use_dark_light_mode_colors_)
-    horizontal_separator_->SetColorId(ui::kColorAshSystemUIMenuSeparator);
+  horizontal_separator_->SetColorId(ui::kColorAshSystemUIMenuSeparator);
   horizontal_separator_->SetPreferredSize(gfx::Size(
       kSeparatorWidthDip, progress_indicator_->GetPreferredSize().height()));
   horizontal_separator_->SetPaintToLayer();
diff --git a/ash/app_list/views/assistant/assistant_main_stage.h b/ash/app_list/views/assistant/assistant_main_stage.h
index 7e899e432..852fdca 100644
--- a/ash/app_list/views/assistant/assistant_main_stage.h
+++ b/ash/app_list/views/assistant/assistant_main_stage.h
@@ -86,9 +86,6 @@
 
   AssistantViewDelegate* const delegate_;  // Owned by Shell.
 
-  // Whether to use dark/light mode colors, which default to dark.
-  const bool use_dark_light_mode_colors_;
-
   // Owned by view hierarchy.
   AssistantProgressIndicator* progress_indicator_;
   views::Separator* horizontal_separator_;
diff --git a/ash/assistant/assistant_controller_impl_unittest.cc b/ash/assistant/assistant_controller_impl_unittest.cc
index 36863b1..c4f1988 100644
--- a/ash/assistant/assistant_controller_impl_unittest.cc
+++ b/ash/assistant/assistant_controller_impl_unittest.cc
@@ -254,21 +254,18 @@
   ui_model()->RemoveObserver(&ui_model_observer_mock);
 }
 
-// Make sure that AssistantControllerImpl sets dark mode = false even if the
-// flag is off. SettingsController won't set options if dark mode bit is not
-// set.
+// Dark mode is set to true if the DarkLightMode flag is off. This is determined
+// in DarkLightModeControllerImpl::IsDarkModeEnabled().
 TEST_F(AssistantControllerImplTest, ColorModeIsSetWhenAssistantIsReadyFlagOff) {
-  // ProductivityLauncher uses DarkLightMode colors.
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures(
       /*enabled_features=*/{}, /*disabled_features=*/{
-          chromeos::features::kDarkLightMode, features::kNotificationsRefresh,
-          features::kProductivityLauncher});
+          chromeos::features::kDarkLightMode, features::kNotificationsRefresh});
 
   controller()->SetAssistant(test_assistant_service());
 
   ASSERT_TRUE(test_assistant_service()->dark_mode_enabled().has_value());
-  EXPECT_FALSE(test_assistant_service()->dark_mode_enabled().value());
+  EXPECT_TRUE(test_assistant_service()->dark_mode_enabled().value());
 }
 
 TEST_F(AssistantControllerImplTest, ColorModeIsUpdated) {
diff --git a/ash/assistant/assistant_interaction_controller_impl_unittest.cc b/ash/assistant/assistant_interaction_controller_impl_unittest.cc
index 7f50465..26706f41 100644
--- a/ash/assistant/assistant_interaction_controller_impl_unittest.cc
+++ b/ash/assistant/assistant_interaction_controller_impl_unittest.cc
@@ -275,10 +275,8 @@
   static constexpr int kNarrowLayoutAshWebViewWidth = 496;
 
   base::test::ScopedFeatureList scoped_feature_list;
-  scoped_feature_list.InitWithFeatures(
-      {app_list_features::kCompactBubbleLauncher,
-       features::kProductivityLauncher},
-      {});
+  scoped_feature_list.InitAndEnableFeature(
+      app_list_features::kCompactBubbleLauncher);
 
   UpdateDisplay("1200x800");
   ShowAssistantUi();
diff --git a/ash/assistant/ui/base/assistant_button_unittest.cc b/ash/assistant/ui/base/assistant_button_unittest.cc
index f28067a..76d9084 100644
--- a/ash/assistant/ui/base/assistant_button_unittest.cc
+++ b/ash/assistant/ui/base/assistant_button_unittest.cc
@@ -162,16 +162,12 @@
                      /*is_opaque=*/true);
 
   const SkBitmap button_image_with_focus = CreateExpectedImageWithFocus(
-      /*icon_color=*/ash::features::IsProductivityLauncherEnabled()
-          ? gfx::kGoogleGrey200
-          : gfx::kGoogleGrey900,
+      /*icon_color=*/gfx::kGoogleGrey200,
       /*focus_color=*/ColorProvider::Get()->GetControlsLayerColor(
           ColorProvider::ControlsLayerType::kFocusRingColor));
 
   const SkBitmap button_image_without_focus = CreateExpectedImageWithoutFocus(
-      /*icon_color=*/ash::features::IsProductivityLauncherEnabled()
-          ? gfx::kGoogleGrey200
-          : gfx::kGoogleGrey900);
+      /*icon_color=*/gfx::kGoogleGrey200);
 
   button->RequestFocus();
   ASSERT_TRUE(button->HasFocus());
diff --git a/ash/assistant/ui/colors/assistant_colors_util.cc b/ash/assistant/ui/colors/assistant_colors_util.cc
index fd5aeda..498a638 100644
--- a/ash/assistant/ui/colors/assistant_colors_util.cc
+++ b/ash/assistant/ui/colors/assistant_colors_util.cc
@@ -11,35 +11,13 @@
 
 namespace ash {
 namespace assistant {
-namespace {
-
-SkColor GetDarkLightModeFlagOffColor(assistant_colors::ColorName color_name) {
-  if (color_name == assistant_colors::ColorName::kBgAssistantPlate)
-    return SK_ColorWHITE;
-
-  return assistant_colors::ResolveColor(color_name, /*is_dark_mode=*/false,
-                                        /*use_debug_colors=*/false);
-}
-
-}  // namespace
 
 SkColor ResolveAssistantColor(assistant_colors::ColorName color_name) {
-  // Delete this utility class and call assistant_colors::ResolveColor directly
-  // once dark and light mode has launched and features::IsDarkLightModeEnabled
-  // gets removed.
-  if (!UseDarkLightModeColors())
-    return GetDarkLightModeFlagOffColor(color_name);
-
   return assistant_colors::ResolveColor(
       color_name, DarkLightModeController::Get()->IsDarkModeEnabled(),
       base::FeatureList::IsEnabled(
           ash::features::kSemanticColorsDebugOverride));
 }
 
-bool UseDarkLightModeColors() {
-  return features::IsDarkLightModeEnabled() ||
-         features::IsProductivityLauncherEnabled();
-}
-
 }  // namespace assistant
 }  // namespace ash
diff --git a/ash/assistant/ui/colors/assistant_colors_util.h b/ash/assistant/ui/colors/assistant_colors_util.h
index b6f82513..270157a 100644
--- a/ash/assistant/ui/colors/assistant_colors_util.h
+++ b/ash/assistant/ui/colors/assistant_colors_util.h
@@ -15,11 +15,6 @@
 // flag is off, this resolve the color from a map defined in the cc file.
 SkColor ResolveAssistantColor(assistant_colors::ColorName color_name);
 
-// Whether to use the modern dark/light mode colors, instead of legacy colors.
-// Returns true if either feature kDarkLightMode or kProductivityLauncher is
-// enabled.
-bool UseDarkLightModeColors();
-
 }  // namespace assistant
 }  // namespace ash
 
diff --git a/ash/assistant/ui/colors/assistant_colors_util_unittest.cc b/ash/assistant/ui/colors/assistant_colors_util_unittest.cc
index 99d9dc55..0346756 100644
--- a/ash/assistant/ui/colors/assistant_colors_util_unittest.cc
+++ b/ash/assistant/ui/colors/assistant_colors_util_unittest.cc
@@ -51,35 +51,33 @@
 }
 
 TEST_F(AssistantColorsUtilUnittest, AssistantColorFlagOff) {
-  // ProductivityLauncher uses DarkLightMode colors.
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures(
       /*enabled_features=*/{}, /*disabled_features=*/{
-          chromeos::features::kDarkLightMode, features::kNotificationsRefresh,
-          features::kProductivityLauncher});
+          chromeos::features::kDarkLightMode, features::kNotificationsRefresh});
 
+  // If DarkLightMode is off, the dark mode is on by default.
   EXPECT_EQ(
       ResolveAssistantColor(assistant_colors::ColorName::kBgAssistantPlate),
-      SK_ColorWHITE);
-  EXPECT_EQ(
-      ResolveAssistantColor(assistant_colors::ColorName::kBgAssistantPlate),
-      SK_ColorWHITE);
+      assistant_colors::ResolveColor(
+          assistant_colors::ColorName::kBgAssistantPlate,
+          /*is_dark_mode=*/true,
+          /*use_debug_colors=*/false));
 }
 
 // ResolveAssistantColor falls back to assistant_colors::ResolveColor with dark
 // mode off if the color is not defined in the cc file map and the flag is off.
 TEST_F(AssistantColorsUtilUnittest, AssistantColorFlagOffFallback) {
-  // ProductivityLauncher uses DarkLightMode colors.
   base::test::ScopedFeatureList scoped_feature_list;
   scoped_feature_list.InitWithFeatures(
       /*enabled_features=*/{}, /*disabled_features=*/{
-          chromeos::features::kDarkLightMode, features::kNotificationsRefresh,
-          features::kProductivityLauncher});
+          chromeos::features::kDarkLightMode, features::kNotificationsRefresh});
 
+  // If DarkLightMode is off, the dark mode is on by default.
   EXPECT_EQ(ResolveAssistantColor(assistant_colors::ColorName::kGoogleBlue100),
             assistant_colors::ResolveColor(
                 assistant_colors::ColorName::kGoogleBlue100,
-                /*is_dark_mode=*/false, /*use_debug_colors=*/false));
+                /*is_dark_mode=*/true, /*use_debug_colors=*/false));
 }
 
 }  // namespace assistant
diff --git a/ash/assistant/ui/main_stage/suggestion_chip_view.cc b/ash/assistant/ui/main_stage/suggestion_chip_view.cc
index 8296a98f..16f7aa35 100644
--- a/ash/assistant/ui/main_stage/suggestion_chip_view.cc
+++ b/ash/assistant/ui/main_stage/suggestion_chip_view.cc
@@ -12,7 +12,6 @@
 #include "ash/assistant/ui/assistant_view_delegate.h"
 #include "ash/assistant/ui/assistant_view_ids.h"
 #include "ash/assistant/ui/colors/assistant_colors.h"
-#include "ash/assistant/ui/colors/assistant_colors_util.h"
 #include "ash/assistant/util/resource_util.h"
 #include "ash/style/ash_color_id.h"
 #include "base/bind.h"
@@ -43,8 +42,6 @@
 using assistant::util::ResourceLinkType;
 
 // Appearance.
-constexpr SkColor kFocusColor = SkColorSetA(gfx::kGoogleGrey900, 0x14);
-
 constexpr int kStrokeWidthDip = 1;
 constexpr int kFocusedStrokeWidthDip = 2;
 
@@ -53,25 +50,13 @@
 constexpr int kChipPaddingDip = 16;
 constexpr int kPreferredHeightDip = 32;
 
-// Returns the color of the border stroke.
-SkColor GetStrokeColor(ui::ColorProvider* color_provider,
-                       bool use_dark_light_mode_colors) {
-  if (use_dark_light_mode_colors) {
-    DCHECK(color_provider);
-    return color_provider->GetColor(kColorAshSeparatorColor);
-  }
-  return SkColorSetA(gfx::kGoogleGrey900, 0x24);
-}
-
 }  // namespace
 
 // SuggestionChipView ----------------------------------------------------------
 
 SuggestionChipView::SuggestionChipView(AssistantViewDelegate* delegate,
                                        const AssistantSuggestion& suggestion)
-    : delegate_(delegate),
-      use_dark_light_mode_colors_(assistant::UseDarkLightModeColors()),
-      suggestion_id_(suggestion.id) {
+    : delegate_(delegate), suggestion_id_(suggestion.id) {
   InitLayout(suggestion);
 }
 
@@ -110,17 +95,12 @@
   // 2. Dark light mode is ON
   // We use focus ring. No background color change with focus.
   SetFocusBehavior(FocusBehavior::ALWAYS);
-  SetInstallFocusRingOnFocus(use_dark_light_mode_colors_);
+  SetInstallFocusRingOnFocus(true);
 
-  if (use_dark_light_mode_colors_) {
-    views::FocusRing* focus_ring = views::FocusRing::Get(this);
-    focus_ring->SetColorId(ui::kColorAshFocusRing);
-    focus_ring->SetHaloThickness(kFocusedStrokeWidthDip);
-    focus_ring->SetHaloInset(0.0f);
-  } else {
-    // We don't call Button::OnFocus (views::OnFocus) in our OnFocus.
-    set_suppress_default_focus_handling();
-  }
+  views::FocusRing* focus_ring = views::FocusRing::Get(this);
+  focus_ring->SetColorId(ui::kColorAshFocusRing);
+  focus_ring->SetHaloThickness(kFocusedStrokeWidthDip);
+  focus_ring->SetHaloInset(0.0f);
 
   // Path is used for the focus ring, i.e. path is not necessary for dark and
   // light mode flag off case. But we always install this as it shouldn't be a
@@ -171,35 +151,6 @@
   text_view_->SetFontList(font_list.Derive(
       /*size_delta=*/1, font_list.GetFontStyle(), gfx::Font::Weight::MEDIUM));
   SetText(text);
-
-  if (!use_dark_light_mode_colors_) {
-    SetBackground(
-        views::CreateRoundedRectBackground(SK_ColorTRANSPARENT, radius));
-  }
-}
-
-void SuggestionChipView::OnFocus() {
-  if (use_dark_light_mode_colors_) {
-    Button::OnFocus();
-  } else {
-    background()->SetNativeControlColor(kFocusColor);
-
-    // SetNativeControlColor doesn't trigger a paint.
-    SchedulePaint();
-
-    // Manually notify an event as we called
-    // set_suppress_default_focus_handling.
-    NotifyAccessibilityEvent(ax::mojom::Event::kSelection, true);
-  }
-}
-
-void SuggestionChipView::OnBlur() {
-  if (use_dark_light_mode_colors_) {
-    Button::OnBlur();
-  } else {
-    background()->SetNativeControlColor(SK_ColorTRANSPARENT);
-    SchedulePaint();
-  }
 }
 
 bool SuggestionChipView::OnKeyPressed(const ui::KeyEvent& event) {
@@ -218,10 +169,6 @@
 
   const int radius = views::LayoutProvider::Get()->GetCornerRadiusMetric(
       views::Emphasis::kMaximum, size());
-  if (!use_dark_light_mode_colors_) {
-    SetBackground(views::CreateRoundedRectBackground(
-        HasFocus() ? kFocusColor : SK_ColorTRANSPARENT, radius));
-  }
 
   // Only set the border if a ColorProvider is available. Otherwise, we cannot
   // compute the stroke color.
@@ -229,7 +176,7 @@
   if (color_provider) {
     SetBorder(views::CreateRoundedRectBorder(
         kStrokeWidthDip, radius,
-        GetStrokeColor(color_provider, use_dark_light_mode_colors_)));
+        color_provider->GetColor(kColorAshSeparatorColor)));
   }
 
   views::InstallRoundRectHighlightPathGenerator(this, gfx::Insets(), radius);
@@ -242,13 +189,11 @@
   DCHECK(color_provider);
   text_view_->SetEnabledColor(
       color_provider->GetColor(kColorAshSuggestionChipViewTextView));
-  if (use_dark_light_mode_colors_) {
-    const int radius = views::LayoutProvider::Get()->GetCornerRadiusMetric(
-        views::Emphasis::kMaximum, size());
-    SetBorder(views::CreateRoundedRectBorder(
-        kStrokeWidthDip, radius,
-        GetStrokeColor(color_provider, use_dark_light_mode_colors_)));
-  }
+  const int radius = views::LayoutProvider::Get()->GetCornerRadiusMetric(
+      views::Emphasis::kMaximum, size());
+  SetBorder(views::CreateRoundedRectBorder(
+      kStrokeWidthDip, radius,
+      color_provider->GetColor(kColorAshSeparatorColor)));
 }
 
 void SuggestionChipView::SetIcon(const gfx::ImageSkia& icon) {
diff --git a/ash/assistant/ui/main_stage/suggestion_chip_view.h b/ash/assistant/ui/main_stage/suggestion_chip_view.h
index e17fad5..df622139 100644
--- a/ash/assistant/ui/main_stage/suggestion_chip_view.h
+++ b/ash/assistant/ui/main_stage/suggestion_chip_view.h
@@ -37,8 +37,6 @@
   gfx::Size CalculatePreferredSize() const override;
   int GetHeightForWidth(int width) const override;
   void ChildVisibilityChanged(views::View* child) override;
-  void OnFocus() override;
-  void OnBlur() override;
   bool OnKeyPressed(const ui::KeyEvent& event) override;
   void OnThemeChanged() override;
   void OnBoundsChanged(const gfx::Rect& previous_bounds) override;
@@ -56,9 +54,6 @@
 
   AssistantViewDelegate* const delegate_;
 
-  // Whether to use dark/light mode colors, which default to dark.
-  const bool use_dark_light_mode_colors_;
-
   const base::UnguessableToken suggestion_id_;
 
   views::BoxLayout* layout_manager_;  // Owned by view hierarchy.
diff --git a/ash/assistant/ui/main_stage/ui_element_container_view.cc b/ash/assistant/ui/main_stage/ui_element_container_view.cc
index d7083579..aa4e883 100644
--- a/ash/assistant/ui/main_stage/ui_element_container_view.cc
+++ b/ash/assistant/ui/main_stage/ui_element_container_view.cc
@@ -12,7 +12,6 @@
 #include "ash/assistant/ui/assistant_ui_constants.h"
 #include "ash/assistant/ui/assistant_view_delegate.h"
 #include "ash/assistant/ui/assistant_view_ids.h"
-#include "ash/assistant/ui/colors/assistant_colors_util.h"
 #include "ash/assistant/ui/main_stage/animated_container_view.h"
 #include "ash/assistant/ui/main_stage/assistant_ui_element_view.h"
 #include "ash/assistant/ui/main_stage/assistant_ui_element_view_factory.h"
@@ -88,8 +87,7 @@
 
 UiElementContainerView::UiElementContainerView(AssistantViewDelegate* delegate)
     : AnimatedContainerView(delegate),
-      view_factory_(std::make_unique<AssistantUiElementViewFactory>(delegate)),
-      use_dark_light_mode_colors_(assistant::UseDarkLightModeColors()) {
+      view_factory_(std::make_unique<AssistantUiElementViewFactory>(delegate)) {
   SetID(AssistantViewID::kUiElementContainer);
   InitLayout();
 }
@@ -260,12 +258,8 @@
 }
 
 SkColor UiElementContainerView::GetOverflowIndicatorBackgroundColor() const {
-  if (use_dark_light_mode_colors_) {
-    return ColorProvider::Get()->GetContentLayerColor(
-        ColorProvider::ContentLayerType::kSeparatorColor);
-  }
-
-  return gfx::kGoogleGrey300;
+  return ColorProvider::Get()->GetContentLayerColor(
+      ColorProvider::ContentLayerType::kSeparatorColor);
 }
 
 }  // namespace ash
diff --git a/ash/assistant/ui/main_stage/ui_element_container_view.h b/ash/assistant/ui/main_stage/ui_element_container_view.h
index 7e792f7..9273830a 100644
--- a/ash/assistant/ui/main_stage/ui_element_container_view.h
+++ b/ash/assistant/ui/main_stage/ui_element_container_view.h
@@ -64,9 +64,6 @@
 
   // Factory instance used to construct views for modeled UI elements.
   std::unique_ptr<AssistantUiElementViewFactory> view_factory_;
-
-  // Whether to use dark/light mode colors, which default to dark.
-  const bool use_dark_light_mode_colors_;
 };
 
 }  // namespace ash
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index 41eb4cbf..64664f1 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -663,7 +663,7 @@
              base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Enables the System Web App (SWA) version of Eche.
-BASE_FEATURE(kEcheSWA, "EcheSWA", base::FEATURE_ENABLED_BY_DEFAULT);
+BASE_FEATURE(kEcheSWA, "EcheSWA", base::FEATURE_DISABLED_BY_DEFAULT);
 
 // Enables the Debug Mode of Eche.
 BASE_FEATURE(kEcheSWADebugMode,
diff --git a/ash/constants/ash_switches.cc b/ash/constants/ash_switches.cc
index 386f5c3..68df430 100644
--- a/ash/constants/ash_switches.cc
+++ b/ash/constants/ash_switches.cc
@@ -315,6 +315,10 @@
 // App ID to use for screensaver app in demo mode.
 const char kDemoModeScreensaverApp[] = "demo-mode-screensaver-extension";
 
+// Directory from which to fetch the demo mode SWA content (instead of
+// downloading from Omaha).
+const char kDemoModeSwaContentDirectory[] = "demo-mode-swa-content-directory";
+
 // Time in seconds before a machine at OOBE is considered derelict.
 const char kDerelictDetectionTimeout[] = "derelict-detection-timeout";
 
diff --git a/ash/constants/ash_switches.h b/ash/constants/ash_switches.h
index 07441a3..9c021cb 100644
--- a/ash/constants/ash_switches.h
+++ b/ash/constants/ash_switches.h
@@ -101,6 +101,8 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kDefaultWallpaperSmall[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kDemoModeHighlightsApp[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kDemoModeScreensaverApp[];
+COMPONENT_EXPORT(ASH_CONSTANTS)
+extern const char kDemoModeSwaContentDirectory[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kDerelictDetectionTimeout[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kDerelictIdleTimeout[];
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const char kDisableArcCpuRestriction[];
diff --git a/ash/public/cpp/accelerator_configuration.h b/ash/public/cpp/accelerator_configuration.h
index 7e774fb..657850e 100644
--- a/ash/public/cpp/accelerator_configuration.h
+++ b/ash/public/cpp/accelerator_configuration.h
@@ -29,10 +29,15 @@
 struct ASH_PUBLIC_EXPORT AcceleratorInfo {
   AcceleratorInfo(ash::mojom::AcceleratorType type,
                   ui::Accelerator accelerator,
+                  const std::u16string& key_display,
                   bool locked)
-      : type(type), accelerator(accelerator), locked(locked) {}
+      : type(type),
+        accelerator(accelerator),
+        key_display(key_display),
+        locked(locked) {}
   ash::mojom::AcceleratorType type;
   ui::Accelerator accelerator;
+  std::u16string key_display;
   // Whether the accelerator can be modified.
   bool locked = true;
   // Accelerators are enabled by default.
diff --git a/ash/public/mojom/accelerator_info.mojom b/ash/public/mojom/accelerator_info.mojom
index 5d099e11..ad0772c 100644
--- a/ash/public/mojom/accelerator_info.mojom
+++ b/ash/public/mojom/accelerator_info.mojom
@@ -87,6 +87,8 @@
 struct AcceleratorInfo {
   // Underlying accelerator struct, contains keycode and modifier.
   ui.mojom.Accelerator accelerator;
+  // The user viewable string of the primary activation key for the accelerator.
+  mojo_base.mojom.String16 key_display;
   AcceleratorType type;
   AcceleratorState state;
   // True if the accelerator can not be customized by the user.
diff --git a/ash/shelf/home_button.cc b/ash/shelf/home_button.cc
index 417cd35..14cc0368 100644
--- a/ash/shelf/home_button.cc
+++ b/ash/shelf/home_button.cc
@@ -179,11 +179,8 @@
         base::UserMetricsAction("AppList_HomeButtonPressedClamshell"));
   }
 
-  const AppListShowSource show_source =
-      event.IsShiftDown() ? AppListShowSource::kShelfButtonFullscreen
-                          : AppListShowSource::kShelfButton;
   Shell::Get()->app_list_controller()->ToggleAppList(
-      GetDisplayId(), show_source, event.time_stamp());
+      GetDisplayId(), AppListShowSource::kShelfButton, event.time_stamp());
 
   // If the home button is pressed, fade out the nudge label if it is showing.
   if (label_container_) {
diff --git a/ash/shelf/launcher_nudge_controller_unittest.cc b/ash/shelf/launcher_nudge_controller_unittest.cc
index 5494a11..5957287 100644
--- a/ash/shelf/launcher_nudge_controller_unittest.cc
+++ b/ash/shelf/launcher_nudge_controller_unittest.cc
@@ -223,14 +223,10 @@
   AdvanceClock(nudge_controller_->GetNudgeInterval(/*is_first_time=*/true));
   EXPECT_EQ(1, GetNudgeShownCount());
 
-  // Toggle the app list to show. Open fullscreen to avoid showing the expand
-  // arrow button, because the animation for that button causes an MSAN
-  // use-of-uninitialized-value. This workaround can be removed when
-  // ProductivityLauncher is the default, since it does not have an expand
-  // button. See https://crbug.com/926038.
+  // Toggle the app list to show.
   Shell::Get()->app_list_controller()->ToggleAppList(
       display::Screen::GetScreen()->GetPrimaryDisplay().id(),
-      AppListShowSource::kShelfButtonFullscreen, base::TimeTicks());
+      AppListShowSource::kShelfButton, base::TimeTicks());
   ASSERT_TRUE(Shell::Get()->app_list_controller()->IsVisible());
   AdvanceClock(nudge_controller_->GetNudgeInterval(/*is_first_time=*/false));
 
diff --git a/ash/shell.cc b/ash/shell.cc
index f3f1abc..65f1e7a7 100644
--- a/ash/shell.cc
+++ b/ash/shell.cc
@@ -1089,8 +1089,7 @@
 
   wallpaper_controller_ = WallpaperControllerImpl::Create(local_state_);
 
-  if (features::IsRgbKeyboardEnabled() &&
-      rgb_keyboard_manager_->IsRgbKeyboardSupported()) {
+  if (features::IsRgbKeyboardEnabled()) {
     // Initialized after |wallpaper_controller_| because we will need to observe
     // when the extracted wallpaper color changes.
     keyboard_backlight_color_controller_ =
diff --git a/ash/system/eche/eche_tray.cc b/ash/system/eche/eche_tray.cc
index 32f436f..18e895e1 100644
--- a/ash/system/eche/eche_tray.cc
+++ b/ash/system/eche/eche_tray.cc
@@ -180,6 +180,18 @@
       icon_(
           tray_container()->AddChildView(std::make_unique<views::ImageView>())),
       event_interceptor_(std::make_unique<EventInterceptor>(this)) {
+  SetPressedCallback(base::BindRepeating(
+      [](EcheTray* eche_tray, const ui::Event& event) {
+        // The `bubble_` is cached, so don't check for existence (which is the
+        // base TrayBackgroundView implementation), check for visibility to
+        // decide on whether to show or hide.
+        if (eche_tray->IsBubbleVisible()) {
+          eche_tray->HideBubble();
+          return;
+        }
+        eche_tray->ShowBubble();
+      },
+      base::Unretained(this)));
   const int icon_padding = (kTrayItemSize - kIconSize) / 2;
 
   icon_->SetBorder(
@@ -249,6 +261,12 @@
 }
 
 void EcheTray::ShowBubble() {
+#ifdef FAKE_BUBBLE_FOR_DEBUG
+  LoadBubble(GURL("http://google.com"), std::move(gfx::Image()),
+             u"visible_name");
+  return;
+#endif
+
   if (!bubble_)
     return;
   SetIconVisibility(true);
@@ -273,20 +291,6 @@
   shelf()->UpdateAutoHideState();
 }
 
-bool EcheTray::PerformAction(const ui::Event& event) {
-  // Simply toggle between visible/invisibvle
-  if (IsBubbleVisible()) {
-    HideBubble();
-  } else {
-#ifdef FAKE_BUBBLE_FOR_DEBUG
-    LoadBubble(GURL("http://google.com"), std::move(gfx::Image()),
-               u"visible_name");
-#endif
-    ShowBubble();
-  }
-  return true;
-}
-
 TrayBubbleView* EcheTray::GetBubbleView() {
   return bubble_ ? bubble_->bubble_view() : nullptr;
 }
diff --git a/ash/system/eche/eche_tray.h b/ash/system/eche/eche_tray.h
index 2b71e60..82abde3 100644
--- a/ash/system/eche/eche_tray.h
+++ b/ash/system/eche/eche_tray.h
@@ -41,7 +41,7 @@
 }  // namespace views
 
 namespace ui {
-class Event;
+class KeyEvent;
 }  // namespace ui
 
 namespace gfx {
@@ -88,7 +88,6 @@
   void Initialize() override;
   void CloseBubble() override;
   void ShowBubble() override;
-  bool PerformAction(const ui::Event& event) override;
   TrayBubbleView* GetBubbleView() override;
   views::Widget* GetBubbleWidget() const override;
   void OnVirtualKeyboardVisibilityChanged() override;
diff --git a/ash/system/keyboard_brightness/keyboard_backlight_color_controller.cc b/ash/system/keyboard_brightness/keyboard_backlight_color_controller.cc
index 50d9412..1ff11af5 100644
--- a/ash/system/keyboard_brightness/keyboard_backlight_color_controller.cc
+++ b/ash/system/keyboard_brightness/keyboard_backlight_color_controller.cc
@@ -73,7 +73,12 @@
   if (account_id.empty())
     return personalization_app::mojom::BacklightColor::kWallpaper;
   auto* pref_service = GetUserPrefService(account_id);
-  DCHECK(pref_service);
+  if (!pref_service) {
+    // TODO(b/238463679): Migrate to local state pref. There may be a timing
+    // issue that results in null pref service. Defaults to |kWallpaper| when
+    // that happens.
+    return personalization_app::mojom::BacklightColor::kWallpaper;
+  }
   return static_cast<personalization_app::mojom::BacklightColor>(
       pref_service->GetInteger(prefs::kPersonalizationKeyboardBacklightColor));
 }
diff --git a/ash/system/keyboard_brightness/keyboard_backlight_color_controller_unittest.cc b/ash/system/keyboard_brightness/keyboard_backlight_color_controller_unittest.cc
index e804c12..724448ab 100644
--- a/ash/system/keyboard_brightness/keyboard_backlight_color_controller_unittest.cc
+++ b/ash/system/keyboard_brightness/keyboard_backlight_color_controller_unittest.cc
@@ -3,9 +3,6 @@
 // found in the LICENSE file.
 
 #include "ash/system/keyboard_brightness/keyboard_backlight_color_controller.h"
-
-#include <memory>
-
 #include "ash/constants/ash_features.h"
 #include "ash/rgb_keyboard/rgb_keyboard_util.h"
 #include "ash/shell.h"
@@ -83,15 +80,10 @@
   void SetUp() override {
     AshTestBase::SetUp();
 
-    controller_ = std::make_unique<KeyboardBacklightColorController>();
+    controller_ = Shell::Get()->keyboard_backlight_color_controller();
     wallpaper_controller_ = Shell::Get()->wallpaper_controller();
   }
 
-  void TearDown() override {
-    controller_.reset();
-    AshTestBase::TearDown();
-  }
-
  protected:
   const base::HistogramTester& histogram_tester() const {
     return histogram_tester_;
@@ -105,7 +97,7 @@
     controller_->displayed_color_for_testing_ = SK_ColorTRANSPARENT;
   }
 
-  std::unique_ptr<KeyboardBacklightColorController> controller_;
+  KeyboardBacklightColorController* controller_ = nullptr;
   WallpaperControllerImpl* wallpaper_controller_ = nullptr;
 
  private:
diff --git a/ash/system/keyboard_brightness/keyboard_backlight_color_nudge_controller_unittest.cc b/ash/system/keyboard_brightness/keyboard_backlight_color_nudge_controller_unittest.cc
index b1f8525c..7d6fbce 100644
--- a/ash/system/keyboard_brightness/keyboard_backlight_color_nudge_controller_unittest.cc
+++ b/ash/system/keyboard_brightness/keyboard_backlight_color_nudge_controller_unittest.cc
@@ -7,6 +7,7 @@
 #include "ash/controls/contextual_tooltip.h"
 #include "ash/session/session_controller_impl.h"
 #include "ash/shell.h"
+#include "ash/system/keyboard_brightness/keyboard_backlight_color_controller.h"
 #include "ash/test/ash_test_base.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
@@ -35,7 +36,18 @@
 
   ~KeyboardBacklightColorNudgeControllerTest() override = default;
 
+  // testing::Test:
+  void SetUp() override {
+    AshTestBase::SetUp();
+
+    controller_ = Shell::Get()
+                      ->keyboard_backlight_color_controller()
+                      ->keyboard_backlight_color_nudge_controller();
+  }
+
  protected:
+  KeyboardBacklightColorNudgeController* controller_ = nullptr;
+
   PrefService* pref_service() {
     return Shell::Get()->session_controller()->GetActivePrefService();
   }
@@ -46,8 +58,6 @@
         contextual_tooltip::TooltipType::kKeyboardBacklightColor, nullptr);
   }
 
-  KeyboardBacklightColorNudgeController controller_;
-
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
 };
@@ -59,7 +69,7 @@
 
   SimulateUserLogin(account_id_1);
   EXPECT_TRUE(can_show_nudge());
-  controller_.MaybeShowEducationNudge(&anchor_view);
+  controller_->MaybeShowEducationNudge(&anchor_view);
 
   EXPECT_FALSE(can_show_nudge());
 
@@ -73,7 +83,7 @@
   SimulateUserLogin(account_id_1);
   EXPECT_TRUE(can_show_nudge());
 
-  controller_.SetUserPerformedAction();
+  controller_->SetUserPerformedAction();
 
   EXPECT_FALSE(can_show_nudge());
 
diff --git a/ash/system/privacy/privacy_indicators_controller.cc b/ash/system/privacy/privacy_indicators_controller.cc
index 29e3878a..d30aea9 100644
--- a/ash/system/privacy/privacy_indicators_controller.cc
+++ b/ash/system/privacy/privacy_indicators_controller.cc
@@ -24,13 +24,6 @@
 
 namespace ash {
 
-namespace {
-
-// Keep track of the button indexes in the privacy indicators notification.
-enum PrivacyIndicatorsNotificationButton { kAppLaunch, kAppSettings };
-
-}  // namespace
-
 PrivacyIndicatorsNotificationDelegate::PrivacyIndicatorsNotificationDelegate(
     const AppActionClosure& launch_app,
     const AppActionClosure& launch_settings)
@@ -46,14 +39,7 @@
   if (!button_index)
     return;
 
-  switch (button_index.value()) {
-    case PrivacyIndicatorsNotificationButton::kAppLaunch:
-      launch_app_.Run();
-      break;
-    case PrivacyIndicatorsNotificationButton::kAppSettings:
-      launch_settings_.Run();
-      break;
-  }
+  launch_settings_.Run();
 }
 
 std::unique_ptr<message_center::Notification>
@@ -94,10 +80,7 @@
 
   optional_fields.parent_vector_small_image = &kPrivacyIndicatorsIcon;
 
-  // Note: The order of buttons added here should match the order in
-  // PrivacyIndicatorsNotificationButton.
-  optional_fields.buttons.emplace_back(
-      l10n_util::GetStringUTF16(IDS_PRIVACY_NOTIFICATION_BUTTON_APP_LAUNCH));
+  // TODO(b/251686202): Add back the "Launch App button".
   optional_fields.buttons.emplace_back(
       l10n_util::GetStringUTF16(IDS_PRIVACY_NOTIFICATION_BUTTON_APP_SETTINGS));
 
diff --git a/ash/system/privacy/privacy_indicators_controller_unittest.cc b/ash/system/privacy/privacy_indicators_controller_unittest.cc
index 1beb097..8a2de481 100644
--- a/ash/system/privacy/privacy_indicators_controller_unittest.cc
+++ b/ash/system/privacy/privacy_indicators_controller_unittest.cc
@@ -120,14 +120,9 @@
       GetNotificationViewFromMessageCenter(notification_id));
   EXPECT_TRUE(notification_view);
 
-  // Clicking the first button will trigger launching the app.
-  EXPECT_FALSE(delegate->launch_app_called());
-  ClickView(notification_view, 0);
-  EXPECT_TRUE(delegate->launch_app_called());
-
   // Clicking the first button will trigger launching the app settings.
   EXPECT_FALSE(delegate->launch_settings_called());
-  ClickView(notification_view, 1);
+  ClickView(notification_view, 0);
   EXPECT_TRUE(delegate->launch_settings_called());
 }
 
diff --git a/ash/system/tray/tray_constants.h b/ash/system/tray/tray_constants.h
index 5ec1f30..aa3eb7d 100644
--- a/ash/system/tray/tray_constants.h
+++ b/ash/system/tray/tray_constants.h
@@ -29,6 +29,9 @@
 // The width of the tray menu.
 constexpr int kTrayMenuWidth = 360;
 
+// The width of the revamped tray menu.
+constexpr int kRevampedTrayMenuWidth = 440;
+
 extern const int kTrayPopupAutoCloseDelayInSeconds;
 extern const int kTrayPopupAutoCloseDelayInSecondsWithSpokenFeedback;
 extern const int kTrayPopupPaddingHorizontal;
@@ -142,6 +145,7 @@
 constexpr int kUnifiedBackButtonLeftPadding = 16;
 constexpr auto kUnifiedTopShortcutPadding = gfx::Insets::VH(0, 16);
 constexpr auto kUnifiedNotificationHiddenPadding = gfx::Insets::VH(6, 16);
+constexpr int kUnifiedNotificationSeparatorThickness = 1;
 constexpr gfx::Insets kUnifiedCircularButtonFocusPadding(4);
 constexpr gfx::Insets kTrayBackgroundFocusPadding(1);
 constexpr gfx::Insets kUnifiedSystemInfoBatteryIconPadding =
@@ -199,7 +203,14 @@
 constexpr int kUnifiedFeaturePodMinRows = 1;
 constexpr int kUnifiedFeaturePodMaxItemsInCollapsed = 5;
 constexpr int kUnifiedFeaturePodsPageSpacing = 48;
-constexpr int kUnifiedNotificationSeparatorThickness = 1;
+
+// Constants used in FeatureTiles of QuickSettingsView.
+constexpr int kFeatureTileItemsInRow = 2;
+constexpr int kFeatureTileMaxRows = 4;
+constexpr int kFeatureTileMinRows = 1;
+constexpr int kFeatureTileHeight = 64;
+
+// Height of the page indicator view.
 constexpr int kPageIndicatorViewMaxHeight = 20;
 
 // Constants used in system tray page transition animations.
diff --git a/ash/system/unified/feature_tiles_container_view.cc b/ash/system/unified/feature_tiles_container_view.cc
new file mode 100644
index 0000000..6400a34e
--- /dev/null
+++ b/ash/system/unified/feature_tiles_container_view.cc
@@ -0,0 +1,206 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/system/unified/feature_tiles_container_view.h"
+
+#include "ash/public/cpp/pagination/pagination_controller.h"
+#include "ash/public/cpp/pagination/pagination_model.h"
+#include "ash/system/tray/tray_constants.h"
+#include "ash/system/unified/feature_pod_button.h"
+#include "ash/system/unified/unified_system_tray_controller.h"
+#include "ui/base/metadata/metadata_impl_macros.h"
+#include "ui/views/background.h"
+#include "ui/views/controls/label.h"
+#include "ui/views/layout/flex_layout.h"
+#include "ui/views/layout/flex_layout_view.h"
+
+using views::FlexLayout;
+using views::FlexLayoutView;
+
+namespace ash {
+
+namespace {
+
+constexpr gfx::Size kFeatureTileRowSize(440, kFeatureTileHeight);
+constexpr gfx::Size kFeatureTileDefaultSize(200, kFeatureTileHeight);
+constexpr gfx::Size kFeatureTileCompactSize(96, kFeatureTileHeight);
+constexpr gfx::Insets kFeatureTileRowMargins = gfx::Insets::VH(4, 0);
+constexpr gfx::Insets kFeatureTileMargins = gfx::Insets::VH(0, 4);
+constexpr gfx::Insets kFeatureTileRowPadding = gfx::Insets::VH(0, 16);
+constexpr gfx::Insets kFeatureTileContainerPadding = gfx::Insets::VH(16, 0);
+
+class FeatureTileRow : public views::FlexLayoutView {
+ public:
+  METADATA_HEADER(FeatureTileRow);
+
+  FeatureTileRow() {
+    SetPreferredSize(kFeatureTileRowSize);
+    SetDefault(views::kMarginsKey, kFeatureTileMargins);
+    SetIgnoreDefaultMainAxisMargins(true);
+    SetInteriorMargin(kFeatureTileRowPadding);
+  }
+
+  FeatureTileRow(const FeatureTileRow&) = delete;
+  FeatureTileRow& operator=(const FeatureTileRow&) = delete;
+  ~FeatureTileRow() override = default;
+};
+
+BEGIN_METADATA(FeatureTileRow, views::FlexLayoutView)
+END_METADATA
+
+// Temp class for prototyping.
+class FeatureTile : public views::Label {
+ public:
+  METADATA_HEADER(FeatureTile);
+
+  explicit FeatureTile(bool compact = false) {
+    SetPreferredSize(compact ? kFeatureTileCompactSize
+                             : kFeatureTileDefaultSize);
+    SetBackground(views::CreateSolidBackground(SK_ColorGRAY));
+  }
+
+  FeatureTile(const FeatureTile&) = delete;
+  FeatureTile& operator=(const FeatureTile&) = delete;
+  ~FeatureTile() override = default;
+};
+
+BEGIN_METADATA(FeatureTile, views::Label)
+END_METADATA
+
+}  // namespace
+
+FeatureTilesContainerView::FeatureTilesContainerView(
+    UnifiedSystemTrayController* controller)
+    : controller_(controller),
+      pagination_model_(controller->model()->pagination_model()),
+      feature_tile_rows_(kFeatureTileMaxRows) {
+  DCHECK(pagination_model_);
+  DCHECK(controller_);
+  pagination_model_->AddObserver(this);
+
+  SetLayoutManager(std::make_unique<FlexLayout>())
+      ->SetOrientation(views::LayoutOrientation::kVertical)
+      .SetDefault(views::kMarginsKey, kFeatureTileRowMargins)
+      .SetIgnoreDefaultMainAxisMargins(true)
+      .SetInteriorMargin(kFeatureTileContainerPadding)
+      .SetCrossAxisAlignment(views::LayoutAlignment::kCenter);
+
+  // Adds four rows with placeholder FeatureTile elements.
+  AddPlaceholderFeatureTiles();
+}
+
+FeatureTilesContainerView::~FeatureTilesContainerView() {
+  pagination_model_->RemoveObserver(this);
+}
+
+void FeatureTilesContainerView::AddPlaceholderFeatureTiles() {
+  // TODO: add child rows based on `feature_tile_rows`.
+  FeatureTileRow* row1 = AddChildView(std::make_unique<FeatureTileRow>());
+  FeatureTileRow* row2 = AddChildView(std::make_unique<FeatureTileRow>());
+  FeatureTileRow* row3 = AddChildView(std::make_unique<FeatureTileRow>());
+  FeatureTileRow* row4 = AddChildView(std::make_unique<FeatureTileRow>());
+
+  row1->AddChildView(std::make_unique<FeatureTile>());
+  row1->AddChildView(std::make_unique<FeatureTile>(/*compact=*/true));
+  row1->AddChildView(std::make_unique<FeatureTile>(/*compact=*/true));
+
+  row2->AddChildView(std::make_unique<FeatureTile>());
+  row2->AddChildView(std::make_unique<FeatureTile>());
+
+  row3->AddChildView(std::make_unique<FeatureTile>());
+  row3->AddChildView(std::make_unique<FeatureTile>());
+
+  row4->AddChildView(std::make_unique<FeatureTile>());
+  row4->AddChildView(std::make_unique<FeatureTile>());
+}
+
+void FeatureTilesContainerView::SetRowsFromHeight(int max_height) {
+  int feature_tile_rows = CalculateRowsFromHeight(max_height);
+
+  if (feature_tile_rows_ != feature_tile_rows) {
+    feature_tile_rows_ = feature_tile_rows;
+    UpdateTotalPages();
+  }
+}
+
+// TODO(crbug/1371668): Update pagination.
+void FeatureTilesContainerView::ShowPageWithButton(views::View* button) {
+  auto index = visible_buttons_.GetIndexOfView(button->parent());
+  if (!index.has_value())
+    return;
+
+  int tiles_per_page = GetTilesPerPage();
+  size_t first_index = pagination_model_->selected_page() * tiles_per_page;
+  size_t last_index =
+      ((pagination_model_->selected_page() + 1) * tiles_per_page) - 1;
+  if (index.value() < first_index || index.value() > last_index) {
+    int page = ((index.value() + 1) / tiles_per_page) +
+               ((index.value() + 1) % tiles_per_page ? 1 : 0) - 1;
+
+    pagination_model_->SelectPage(page, true /*animate*/);
+  }
+}
+
+// TODO(crbug/1371668): Update pagination.
+void FeatureTilesContainerView::SelectedPageChanged(int old_selected,
+                                                    int new_selected) {
+  PaginationModelObserver::SelectedPageChanged(old_selected, new_selected);
+  InvalidateLayout();
+}
+
+// TODO(crbug/1371668): Update pagination.
+void FeatureTilesContainerView::OnGestureEvent(ui::GestureEvent* event) {}
+
+// TODO(crbug/1371668): Update pagination.
+void FeatureTilesContainerView::OnScrollEvent(ui::ScrollEvent* event) {}
+
+// TODO(crbug/1371668): Update pagination.
+bool FeatureTilesContainerView::OnMouseWheel(const ui::MouseWheelEvent& event) {
+  return false;
+}
+
+// TODO(crbug/1371668): Update pagination.
+int FeatureTilesContainerView::CalculateRowsFromHeight(int height) {
+  int row_height = kFeatureTileRowSize.height();
+
+  // Uses the max number of rows with the space available.
+  int rows = kFeatureTileMaxRows;
+  while (height < (rows * row_height) && rows > kFeatureTileMinRows)
+    rows--;
+  return rows;
+}
+
+// TODO(crbug/1371668): Update pagination.
+int FeatureTilesContainerView::GetTilesPerPage() const {
+  return kFeatureTileItemsInRow * feature_tile_rows_;
+}
+
+// TODO(crbug/1371668): Update pagination.
+void FeatureTilesContainerView::UpdateTotalPages() {
+  int total_pages = 0;
+
+  size_t total_visible = visible_buttons_.view_size();
+  int tiles_per_page = GetTilesPerPage();
+
+  if (total_visible == 0 || tiles_per_page == 0) {
+    total_pages = 0;
+  } else {
+    total_pages = (total_visible / tiles_per_page) +
+                  (total_visible % tiles_per_page ? 1 : 0);
+  }
+  pagination_model_->SetTotalPages(total_pages);
+}
+
+// TODO(crbug/1371668): Update pagination.
+void FeatureTilesContainerView::TransitionChanged() {
+  const PaginationModel::Transition& transition =
+      pagination_model_->transition();
+  if (pagination_model_->is_valid_page(transition.target_page))
+    Layout();
+}
+
+BEGIN_METADATA(FeatureTilesContainerView, views::View)
+END_METADATA
+
+}  // namespace ash
diff --git a/ash/system/unified/feature_tiles_container_view.h b/ash/system/unified/feature_tiles_container_view.h
new file mode 100644
index 0000000..d0e7b51a
--- /dev/null
+++ b/ash/system/unified/feature_tiles_container_view.h
@@ -0,0 +1,93 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_SYSTEM_UNIFIED_FEATURE_TILES_CONTAINER_VIEW_H_
+#define ASH_SYSTEM_UNIFIED_FEATURE_TILES_CONTAINER_VIEW_H_
+
+#include "ash/ash_export.h"
+#include "ash/public/cpp/pagination/pagination_model_observer.h"
+#include "ui/base/metadata/metadata_header_macros.h"
+#include "ui/views/view.h"
+#include "ui/views/view_model.h"
+
+namespace ash {
+
+// TODO(crbug/1368717): use FeatureTile.
+class FeaturePodButton;
+class PaginationModel;
+class UnifiedSystemTrayController;
+
+// Container of FeatureTiles in the middle of QuickSettingsView.
+// It can place buttons in a 1x2 to 4x2 grid given the available height.
+// Implements pagination to be able to show all visible FeatureTiles.
+class ASH_EXPORT FeatureTilesContainerView : public views::View,
+                                             public PaginationModelObserver {
+ public:
+  METADATA_HEADER(FeatureTilesContainerView);
+
+  explicit FeatureTilesContainerView(UnifiedSystemTrayController* controller);
+
+  FeatureTilesContainerView(const FeatureTilesContainerView&) = delete;
+  FeatureTilesContainerView& operator=(const FeatureTilesContainerView&) =
+      delete;
+
+  ~FeatureTilesContainerView() override;
+
+  // Adds FeatureTileRow elements with FeatureTile placeholders.
+  // This function is only used for prototyping.
+  void AddPlaceholderFeatureTiles();
+
+  // Sets the number of rows of feature tiles based on the max height the
+  // container can have.
+  void SetRowsFromHeight(int max_height);
+
+  // Makes sure button is visible by switching page if needed.
+  void ShowPageWithButton(views::View* button);
+
+  // PaginationModelObserver:
+  void SelectedPageChanged(int old_selected, int new_selected) override;
+  void TransitionChanged() override;
+
+  // views::View:
+  void OnGestureEvent(ui::GestureEvent* event) override;
+  void OnScrollEvent(ui::ScrollEvent* event) override;
+  bool OnMouseWheel(const ui::MouseWheelEvent& event) override;
+
+  int row_count() const { return feature_tile_rows_; }
+
+ private:
+  friend class FeatureTilesContainerViewTest;
+
+  // Calculates the number of feature tile rows based on the available `height`.
+  int CalculateRowsFromHeight(int height);
+
+  // Returns the number of tiles per page.
+  int GetTilesPerPage() const;
+
+  // Updates page splits for feature tiles.
+  void UpdateTotalPages();
+
+  // Owned by UnifiedSystemTrayBubble.
+  UnifiedSystemTrayController* const controller_;
+
+  // Owned by UnifiedSystemTrayModel.
+  PaginationModel* const pagination_model_;
+
+  // Number of rows of feature tiles to display. Updated based on the available
+  // max height for FeatureTilesContainer.
+  int feature_tile_rows_ = 0;
+
+  // Used for preventing reentrancy issue in ChildVisibilityChanged. Should be
+  // always false if FeatureTilesContainerView is not in the call stack.
+  bool changing_visibility_ = false;
+
+  // A view model that contains all visible feature tiles.
+  // Used to calculate required number of pages.
+  // TODO(crbug/1368717): use FeatureTile.
+  views::ViewModelT<FeaturePodButton> visible_buttons_;
+};
+
+}  // namespace ash
+
+#endif  // ASH_SYSTEM_UNIFIED_FEATURE_TILES_CONTAINER_VIEW_H_
diff --git a/ash/system/unified/feature_tiles_container_view_unittest.cc b/ash/system/unified/feature_tiles_container_view_unittest.cc
new file mode 100644
index 0000000..413374e6
--- /dev/null
+++ b/ash/system/unified/feature_tiles_container_view_unittest.cc
@@ -0,0 +1,89 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/system/unified/feature_tiles_container_view.h"
+
+#include "ash/constants/quick_settings_catalogs.h"
+#include "ash/system/tray/tray_constants.h"
+#include "ash/system/unified/feature_pod_button.h"
+#include "ash/system/unified/feature_pod_controller_base.h"
+#include "ash/system/unified/unified_system_tray.h"
+#include "ash/system/unified/unified_system_tray_bubble.h"
+#include "ash/system/unified/unified_system_tray_controller.h"
+#include "ash/test/ash_test_base.h"
+#include "ui/views/test/views_test_utils.h"
+
+namespace ash {
+
+// TODO(crbug/1368717): use FeatureTile.
+class FeatureTilesContainerViewTest : public NoSessionAshTestBase,
+                                      public views::ViewObserver {
+ public:
+  FeatureTilesContainerViewTest() = default;
+
+  FeatureTilesContainerViewTest(const FeatureTilesContainerViewTest&) = delete;
+  FeatureTilesContainerViewTest& operator=(
+      const FeatureTilesContainerViewTest&) = delete;
+
+  ~FeatureTilesContainerViewTest() override = default;
+
+  // AshTestBase:
+  void SetUp() override {
+    AshTestBase::SetUp();
+    GetPrimaryUnifiedSystemTray()->ShowBubble();
+    container_ = std::make_unique<FeatureTilesContainerView>(controller());
+    container_->AddObserver(this);
+  }
+
+  void TearDown() override {
+    container_->RemoveObserver(this);
+    container_.reset();
+    GetPrimaryUnifiedSystemTray()->CloseBubble();
+    NoSessionAshTestBase::TearDown();
+  }
+
+  // views::ViewObserver:
+  void OnViewPreferredSizeChanged(views::View* observed_view) override {
+    ++preferred_size_changed_count_;
+  }
+
+  FeatureTilesContainerView* container() { return container_.get(); }
+
+  UnifiedSystemTrayController* controller() {
+    return GetPrimaryUnifiedSystemTray()
+        ->bubble()
+        ->unified_system_tray_controller();
+  }
+
+  int preferred_size_changed_count() const {
+    return preferred_size_changed_count_;
+  }
+
+  int CalculateRowsFromHeight(int height) {
+    return container()->CalculateRowsFromHeight(height);
+  }
+
+  // TODO(crbug/1368717): use FeatureTile.
+  std::vector<FeaturePodButton*> buttons_;
+
+ private:
+  std::unique_ptr<FeatureTilesContainerView> container_;
+  int preferred_size_changed_count_ = 0;
+};
+
+TEST_F(FeatureTilesContainerViewTest, CalculateRowsFromHeight) {
+  int row_height = kFeatureTileHeight;
+
+  // Expect max number of rows even if available height could fit another row.
+  EXPECT_EQ(kFeatureTileMaxRows,
+            CalculateRowsFromHeight((kFeatureTileMaxRows + 1) * row_height));
+
+  // Expect appropriate number of rows with available height.
+  EXPECT_EQ(3, CalculateRowsFromHeight(3 * row_height));
+
+  // Expect min number of rows even with zero height.
+  EXPECT_EQ(kFeatureTileMinRows, CalculateRowsFromHeight(0));
+}
+
+}  // namespace ash
diff --git a/ash/system/unified/quick_settings_view.cc b/ash/system/unified/quick_settings_view.cc
index 0d9c2b63..815534e 100644
--- a/ash/system/unified/quick_settings_view.cc
+++ b/ash/system/unified/quick_settings_view.cc
@@ -12,7 +12,7 @@
 #include "ash/system/tray/tray_constants.h"
 #include "ash/system/unified/detailed_view_controller.h"
 #include "ash/system/unified/feature_pod_button.h"
-#include "ash/system/unified/feature_pods_container_view.h"
+#include "ash/system/unified/feature_tiles_container_view.h"
 #include "ash/system/unified/page_indicator_view.h"
 #include "ash/system/unified/quick_settings_footer.h"
 #include "ash/system/unified/quick_settings_header.h"
@@ -86,14 +86,14 @@
 SlidersContainerView::~SlidersContainerView() = default;
 
 int SlidersContainerView::GetHeight() const {
-  return std::accumulate(children().cbegin(), children().cend(), 0,
-                         [](int height, const auto* v) {
-                           return height + v->GetHeightForWidth(kTrayMenuWidth);
-                         });
+  return std::accumulate(
+      children().cbegin(), children().cend(), 0, [](int height, const auto* v) {
+        return height + v->GetHeightForWidth(kRevampedTrayMenuWidth);
+      });
 }
 
 gfx::Size SlidersContainerView::CalculatePreferredSize() const {
-  return gfx::Size(kTrayMenuWidth, GetHeight());
+  return gfx::Size(kRevampedTrayMenuWidth, GetHeight());
 }
 
 BEGIN_METADATA(SlidersContainerView, views::View)
@@ -141,8 +141,8 @@
 
   header_ = system_tray_container_->AddChildView(
       std::make_unique<QuickSettingsHeader>());
-  feature_pods_container_ = system_tray_container_->AddChildView(
-      std::make_unique<FeaturePodsContainerView>(controller_, true));
+  feature_tiles_container_ = system_tray_container_->AddChildView(
+      std::make_unique<FeatureTilesContainerView>(controller_));
   page_indicator_view_ = system_tray_container_->AddChildView(
       std::make_unique<PageIndicatorView>(controller_, true));
 
@@ -170,8 +170,10 @@
 
 QuickSettingsView::~QuickSettingsView() = default;
 
-void QuickSettingsView::AddFeaturePodButton(FeaturePodButton* button) {
-  feature_pods_container_->AddFeaturePodButton(button);
+void QuickSettingsView::SetMaxHeight(int max_height) {
+  max_height_ = max_height;
+  feature_tiles_container_->SetRowsFromHeight(
+      CalculateHeightForFeatureTilesContainer());
 }
 
 void QuickSettingsView::AddSliderView(views::View* slider_view) {
@@ -236,8 +238,15 @@
   return GetPreferredSize().height();
 }
 
-int QuickSettingsView::GetVisibleFeaturePodCount() const {
-  return feature_pods_container_->GetVisibleCount();
+int QuickSettingsView::CalculateHeightForFeatureTilesContainer() {
+  int media_controls_container_height =
+      media_controls_container_ ? media_controls_container_->GetExpandedHeight()
+                                : 0;
+
+  return max_height_ - header_->GetPreferredSize().height() -
+         page_indicator_view_->GetPreferredSize().height() -
+         sliders_container_->GetHeight() - media_controls_container_height -
+         footer_->GetPreferredSize().height();
 }
 
 std::u16string QuickSettingsView::GetDetailedViewAccessibleName() const {
@@ -252,9 +261,9 @@
   int media_controls_container_height =
       media_controls_container_ ? media_controls_container_->GetExpandedHeight()
                                 : 0;
-  return gfx::Size(kTrayMenuWidth,
+  return gfx::Size(kRevampedTrayMenuWidth,
                    header_->GetPreferredSize().height() +
-                       feature_pods_container_->GetExpandedHeight() +
+                       feature_tiles_container_->GetPreferredSize().height() +
                        page_indicator_view_->GetExpandedHeight() +
                        sliders_container_->GetHeight() +
                        media_controls_container_height +
diff --git a/ash/system/unified/quick_settings_view.h b/ash/system/unified/quick_settings_view.h
index 0335d0a..d39d001 100644
--- a/ash/system/unified/quick_settings_view.h
+++ b/ash/system/unified/quick_settings_view.h
@@ -11,8 +11,7 @@
 
 namespace ash {
 
-class FeaturePodButton;
-class FeaturePodsContainerView;
+class FeatureTilesContainerView;
 class PageIndicatorView;
 class QuickSettingsFooter;
 class QuickSettingsHeader;
@@ -31,7 +30,7 @@
 
   ~SlidersContainerView() override;
 
-  // Get height of the view.
+  // Gets height of the view.
   int GetHeight() const;
 
   // views::View:
@@ -52,41 +51,43 @@
 
   ~QuickSettingsView() override;
 
-  // Add feature pod button to `feature_pods_`.
-  void AddFeaturePodButton(FeaturePodButton* button);
+  // Sets the maximum height that the view can take.
+  void SetMaxHeight(int max_height);
 
-  // Add slider view.
+  // Adds slider view.
   void AddSliderView(views::View* slider_view);
 
-  // Add media controls view to `media_controls_container_`;
+  // Adds media controls view to `media_controls_container_`;
   void AddMediaControlsView(views::View* media_controls);
 
-  // Hide the main view and show the given `detailed_view`.
+  // Hides the main view and shows the given `detailed_view`.
   void SetDetailedView(views::View* detailed_view);
 
-  // Remove the detailed view set by SetDetailedView, and show the main view.
+  // Removes the detailed view set by SetDetailedView, and shows the main view.
   // It deletes `detailed_view` and children.
   void ResetDetailedView();
 
-  // Save and restore keyboard focus of the currently focused element. Called
+  // Saves and restores keyboard focus of the currently focused element. Called
   // before transitioning into a detailed view.
   void SaveFocus();
   void RestoreFocus();
 
-  // Get current height of the view (including the message center).
+  // Gets current height of the view (including the message center).
   int GetCurrentHeight() const;
 
-  // Returns the number of visible feature pods.
-  int GetVisibleFeaturePodCount() const;
+  // Calculates how many rows to use based on the max available height.
+  // FeatureTilesContainer can adjust it's height by reducing the number of rows
+  // it uses.
+  int CalculateHeightForFeatureTilesContainer();
 
-  // Get the accessible name for the currently shown detailed view.
+  // Gets the accessible name for the currently shown detailed view.
   std::u16string GetDetailedViewAccessibleName() const;
 
   // Returns true if a detailed view is being shown in the tray. (e.g Bluetooth
   // Settings).
   bool IsDetailedViewShown() const;
 
-  // Show media controls view.
+  // Shows media controls view.
   void ShowMediaControls();
 
   // views::View:
@@ -95,8 +96,8 @@
   void Layout() override;
   void ChildPreferredSizeChanged(views::View* child) override;
 
-  FeaturePodsContainerView* feature_pods_container() {
-    return feature_pods_container_;
+  FeatureTilesContainerView* feature_tiles_container() {
+    return feature_tiles_container_;
   }
 
   View* detailed_view() { return detailed_view_container_; }
@@ -111,13 +112,13 @@
  private:
   class SystemTrayContainer;
 
-  // Unowned.
+  // Owned by UnifiedSystemTrayBubble.
   UnifiedSystemTrayController* const controller_;
 
   // Owned by views hierarchy.
   SystemTrayContainer* system_tray_container_ = nullptr;
   QuickSettingsHeader* header_ = nullptr;
-  FeaturePodsContainerView* feature_pods_container_ = nullptr;
+  FeatureTilesContainerView* feature_tiles_container_ = nullptr;
   PageIndicatorView* page_indicator_view_ = nullptr;
   SlidersContainerView* sliders_container_ = nullptr;
   QuickSettingsFooter* footer_ = nullptr;
@@ -126,6 +127,9 @@
   // Null if media::kGlobalMediaControlsForChromeOS is disabled.
   UnifiedMediaControlsContainer* media_controls_container_ = nullptr;
 
+  // The maximum height available to the view.
+  int max_height_ = 0;
+
   // The view that is saved by calling SaveFocus().
   views::View* saved_focused_view_ = nullptr;
 
diff --git a/ash/system/unified/unified_system_tray_bubble.cc b/ash/system/unified/unified_system_tray_bubble.cc
index 0815e98..6e29353 100644
--- a/ash/system/unified/unified_system_tray_bubble.cc
+++ b/ash/system/unified/unified_system_tray_bubble.cc
@@ -40,7 +40,8 @@
 
   TrayBubbleView::InitParams init_params;
   init_params.shelf_alignment = tray_->shelf()->alignment();
-  init_params.preferred_width = kTrayMenuWidth;
+  init_params.preferred_width =
+      features::IsQsRevampEnabled() ? kRevampedTrayMenuWidth : kTrayMenuWidth;
   init_params.delegate = tray->GetWeakPtr();
   init_params.parent_window = tray->GetBubbleWindowContainer();
   init_params.anchor_view = nullptr;
@@ -56,6 +57,7 @@
 
   if (features::IsQsRevampEnabled()) {
     auto quick_settings_view = controller_->CreateQuickSettingsView();
+    quick_settings_view->SetMaxHeight(max_height);
     bubble_view_->SetMaxHeight(max_height);
     quick_settings_view_ =
         bubble_view_->AddChildView(std::move(quick_settings_view));
@@ -343,7 +345,9 @@
 
 void UnifiedSystemTrayBubble::UpdateBubbleBounds() {
   int max_height = CalculateMaxHeight();
-  if (!features::IsQsRevampEnabled())
+  if (features::IsQsRevampEnabled())
+    quick_settings_view_->SetMaxHeight(max_height);
+  else
     unified_view_->SetMaxHeight(max_height);
   bubble_view_->SetMaxHeight(max_height);
   bubble_view_->ChangeAnchorAlignment(tray_->shelf()->alignment());
diff --git a/ash/system/unified/unified_system_tray_controller.cc b/ash/system/unified/unified_system_tray_controller.cc
index d5e5349..11effbc7 100644
--- a/ash/system/unified/unified_system_tray_controller.cc
+++ b/ash/system/unified/unified_system_tray_controller.cc
@@ -609,6 +609,10 @@
 }
 
 void UnifiedSystemTrayController::InitFeaturePods() {
+  // TODO(crbug/1368717): use FeatureTiles.
+  if (ash::features::IsQsRevampEnabled())
+    return;
+
   if (ash::features::IsQuickSettingsNetworkRevampEnabled()) {
     AddFeaturePodItem(std::make_unique<NetworkFeaturePodController>(this));
   } else {
@@ -632,17 +636,10 @@
     AddFeaturePodItem(std::make_unique<DarkModeFeaturePodController>(this));
   if (base::FeatureList::IsEnabled(features::kShelfParty))
     AddFeaturePodItem(std::make_unique<ShelfPartyFeaturePodController>());
-
   if (media::ShouldEnableAutoFraming())
     AddFeaturePodItem(std::make_unique<AutozoomFeaturePodController>());
-
   // If you want to add a new feature pod item, add here.
-  if (features::IsQsRevampEnabled()) {
-    quick_settings_metrics_util::RecordQsFeaturePodCount(
-        quick_settings_view_->GetVisibleFeaturePodCount(),
-        Shell::Get()->tablet_mode_controller()->InTabletMode());
-    return;
-  }
+
   quick_settings_metrics_util::RecordQsFeaturePodCount(
       unified_view_->GetVisibleFeaturePodCount(),
       Shell::Get()->tablet_mode_controller()->InTabletMode());
@@ -660,10 +657,7 @@
     quick_settings_metrics_util::RecordVisibleQsFeature(
         controller->GetCatalogName());
   }
-  if (features::IsQsRevampEnabled())
-    quick_settings_view_->AddFeaturePodButton(button);
-  else
-    unified_view_->AddFeaturePodButton(button);
+  unified_view_->AddFeaturePodButton(button);
 
   feature_pod_controllers_.push_back(std::move(controller));
 }
diff --git a/ash/webui/common/resources/BUILD.gn b/ash/webui/common/resources/BUILD.gn
index 2b285056..bdc7ad0a 100644
--- a/ash/webui/common/resources/BUILD.gn
+++ b/ash/webui/common/resources/BUILD.gn
@@ -101,12 +101,16 @@
   "cellular_setup/mojo_interface_provider.js",
   "cellular_setup/subflow_behavior.js",
   "cellular_setup/webview_post_util.js",
+  "cr_container_shadow_behavior.js",
   "cr_picture/cr_picture_types.js",
   "cr_picture/png.js",
   "cr_picture/webcam_utils.js",
+  "cr_policy_indicator_behavior.js",
+  "cr_scrollable_behavior.js",
   "focus_row_js.js",
   "focus_row_behavior.js",
   "focus_without_ink_js.js",
+  "i18n_behavior.js",
   "keyboard_shortcut_list_js.js",
   "list_property_update_behavior.js",
   "multidevice_setup/fake_mojo_service.js",
@@ -131,6 +135,7 @@
   "store/store_client.js",
   "traffic_counters/traffic_counters_adapter.js",
   "quick_unlock/lock_screen_constants.js",
+  "web_ui_listener_behavior.js",
 ]
 
 icons_html_files = [
@@ -299,9 +304,13 @@
 }
 
 checked_in_dts_files = [
+  "cr_container_shadow_behavior.d.ts",
+  "cr_scrollable_behavior.d.ts",
+  "cr_policy_indicator_behavior.d.ts",
   "fake_method_resolver.d.ts",
   "fake_observables.d.ts",
   "focus_row_behavior.d.ts",
+  "i18n_behavior.d.ts",
   "keyboard_diagram.d.ts",
   "keyboard_key.d.ts",
   "list_property_update_behavior.d.ts",
@@ -309,6 +318,7 @@
   "page_toolbar.d.ts",
   "navigation_view_panel.d.ts",
   "navigation_selector.d.ts",
+  "web_ui_listener_behavior.d.ts",
 
   "bluetooth/bluetooth_base_page.d.ts",
   "bluetooth/bluetooth_battery_icon_percentage.d.ts",
@@ -407,6 +417,21 @@
   ]
 }
 
+js_library("cr_container_shadow_behavior") {
+  deps = [ "//ui/webui/resources/js:assert" ]
+}
+
+js_library("cr_policy_indicator_behavior") {
+  deps = [ "//ui/webui/resources/js:assert" ]
+}
+
+js_library("cr_scrollable_behavior") {
+  deps = [
+    "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
+    "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
+  ]
+}
+
 js_library("fake_observables") {
   deps = [ "//ui/webui/resources/js:cr.m" ]
 }
@@ -439,19 +464,26 @@
   ]
 }
 
+js_library("i18n_behavior") {
+  deps = [
+    "//ui/webui/resources/js:load_time_data.m",
+    "//ui/webui/resources/js:parse_html_subset",
+  ]
+}
+
 js_library("keyboard_diagram") {
   deps = [
     ":keyboard_key",
     ":keyboard_layouts",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
 js_library("keyboard_key") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -490,3 +522,7 @@
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
   ]
 }
+
+js_library("web_ui_listener_behavior") {
+  deps = [ "//ui/webui/resources/js:cr.m" ]
+}
diff --git a/ash/webui/common/resources/bluetooth/BUILD.gn b/ash/webui/common/resources/bluetooth/BUILD.gn
index f99e704..f66b701 100644
--- a/ash/webui/common/resources/bluetooth/BUILD.gn
+++ b/ash/webui/common/resources/bluetooth/BUILD.gn
@@ -69,10 +69,10 @@
     ":bluetooth_base_page",
     ":bluetooth_pairing_device_item",
     ":bluetooth_types",
+    "//ash/webui/common/resources:cr_scrollable_behavior",
     "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:cr_scrollable_behavior",
   ]
 
   externs_list = [ "//ui/webui/resources/cr_components/localized_link/localized_link_externs.js" ]
@@ -119,8 +119,8 @@
 js_library("bluetooth_base_page") {
   deps = [
     ":bluetooth_types",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list =
       [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js" ]
@@ -128,20 +128,20 @@
 
 js_library("bluetooth_battery_icon_percentage") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/bluetooth:bluetooth_utils",
     "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
 js_library("bluetooth_device_battery_info") {
   deps = [
     "//ash/webui/common/resources:focus_row_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/bluetooth:bluetooth_utils",
     "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
diff --git a/ash/webui/common/resources/bluetooth/bluetooth_base_page.js b/ash/webui/common/resources/bluetooth/bluetooth_base_page.js
index 351c992..3545eac 100644
--- a/ash/webui/common/resources/bluetooth/bluetooth_base_page.js
+++ b/ash/webui/common/resources/bluetooth/bluetooth_base_page.js
@@ -12,13 +12,12 @@
 import '//resources/cr_elements/cr_shared_vars.css.js';
 import '//resources/cr_elements/cr_button/cr_button.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from '//resources/cr_elements/i18n_behavior.js';
-import {afterNextRender, html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {getTemplate} from './bluetooth_base_page.html.js';
-
-import {assertNotReached} from '//resources/js/assert.js';
 import {focusWithoutInk} from '//resources/ash/common/focus_without_ink_js.js';
+import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js';
+import {assertNotReached} from '//resources/js/assert.js';
+import {afterNextRender, html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {getTemplate} from './bluetooth_base_page.html.js';
 import {ButtonBarState, ButtonName, ButtonState} from './bluetooth_types.js';
 
 /**
diff --git a/ash/webui/common/resources/bluetooth/bluetooth_battery_icon_percentage.js b/ash/webui/common/resources/bluetooth/bluetooth_battery_icon_percentage.js
index 3e0acc66..49d11a5 100644
--- a/ash/webui/common/resources/bluetooth/bluetooth_battery_icon_percentage.js
+++ b/ash/webui/common/resources/bluetooth/bluetooth_battery_icon_percentage.js
@@ -12,12 +12,12 @@
 import '//resources/cr_elements/cr_shared_style.css.js';
 import './bluetooth_icons.html.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from '//resources/cr_elements/i18n_behavior.js';
-import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {getTemplate} from './bluetooth_battery_icon_percentage.html.js';
+import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js';
 import {assert} from '//resources/js/assert.js';
+import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {BluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
 
+import {getTemplate} from './bluetooth_battery_icon_percentage.html.js';
 import {BatteryType} from './bluetooth_types.js';
 import {getBatteryPercentage} from './bluetooth_utils.js';
 
diff --git a/ash/webui/common/resources/bluetooth/bluetooth_pairing_confirm_code_page.js b/ash/webui/common/resources/bluetooth/bluetooth_pairing_confirm_code_page.js
index fb644e3..1d65760 100644
--- a/ash/webui/common/resources/bluetooth/bluetooth_pairing_confirm_code_page.js
+++ b/ash/webui/common/resources/bluetooth/bluetooth_pairing_confirm_code_page.js
@@ -12,10 +12,10 @@
 import '//resources/cr_elements/cr_shared_style.css.js';
 import '//resources/cr_elements/cr_input/cr_input.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {getTemplate} from './bluetooth_pairing_confirm_code_page.html.js';
 
+import {getTemplate} from './bluetooth_pairing_confirm_code_page.html.js';
 import {ButtonBarState, ButtonState} from './bluetooth_types.js';
 
 /**
diff --git a/ash/webui/common/resources/bluetooth/bluetooth_pairing_device_item.js b/ash/webui/common/resources/bluetooth/bluetooth_pairing_device_item.js
index 74f876c..9f2f6028 100644
--- a/ash/webui/common/resources/bluetooth/bluetooth_pairing_device_item.js
+++ b/ash/webui/common/resources/bluetooth/bluetooth_pairing_device_item.js
@@ -11,7 +11,7 @@
 import './bluetooth_icon.js';
 
 import {FocusRowBehavior} from '//resources/ash/common/focus_row_behavior.js';
-import {I18nBehavior, I18nBehaviorInterface} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js';
 import {assertNotReached} from '//resources/js/assert.js';
 import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {BluetoothDeviceProperties, DeviceType} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
diff --git a/ash/webui/common/resources/bluetooth/bluetooth_pairing_device_selection_page.js b/ash/webui/common/resources/bluetooth/bluetooth_pairing_device_selection_page.js
index 95b4846..d294485 100644
--- a/ash/webui/common/resources/bluetooth/bluetooth_pairing_device_selection_page.js
+++ b/ash/webui/common/resources/bluetooth/bluetooth_pairing_device_selection_page.js
@@ -13,12 +13,12 @@
 import '//resources/polymer/v3_0/iron-list/iron-list.js';
 import '//resources/cr_components/localized_link/localized_link.js';
 
-import {CrScrollableBehavior, CrScrollableBehaviorInterface} from '//resources/cr_elements/cr_scrollable_behavior.js';
-import {I18nBehavior, I18nBehaviorInterface} from '//resources/cr_elements/i18n_behavior.js';
+import {CrScrollableBehavior, CrScrollableBehaviorInterface} from '//resources/ash/common/cr_scrollable_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js';
 import {afterNextRender, html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {getTemplate} from './bluetooth_pairing_device_selection_page.html.js';
 import {BluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
 
+import {getTemplate} from './bluetooth_pairing_device_selection_page.html.js';
 import {ButtonBarState, ButtonState, DeviceItemState} from './bluetooth_types.js';
 
 /**
diff --git a/ash/webui/common/resources/bluetooth/bluetooth_pairing_enter_code_page.js b/ash/webui/common/resources/bluetooth/bluetooth_pairing_enter_code_page.js
index b6054ce3..52cd9a0ba 100644
--- a/ash/webui/common/resources/bluetooth/bluetooth_pairing_enter_code_page.js
+++ b/ash/webui/common/resources/bluetooth/bluetooth_pairing_enter_code_page.js
@@ -12,11 +12,11 @@
 import '//resources/cr_elements/cr_shared_style.css.js';
 import '//resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from '//resources/cr_elements/i18n_behavior.js';
-import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {getTemplate} from './bluetooth_pairing_enter_code_page.html.js';
+import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js';
 import {assert} from '//resources/js/assert.js';
+import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {getTemplate} from './bluetooth_pairing_enter_code_page.html.js';
 import {ButtonBarState, ButtonState} from './bluetooth_types.js';
 
 // Pairing passkey can be a maximum of 16 characters while pairing code a max
diff --git a/ash/webui/common/resources/bluetooth/bluetooth_pairing_request_code_page.js b/ash/webui/common/resources/bluetooth/bluetooth_pairing_request_code_page.js
index 10b64bb..822f72d 100644
--- a/ash/webui/common/resources/bluetooth/bluetooth_pairing_request_code_page.js
+++ b/ash/webui/common/resources/bluetooth/bluetooth_pairing_request_code_page.js
@@ -12,11 +12,11 @@
 import '//resources/cr_elements/cr_shared_style.css.js';
 import '//resources/cr_elements/cr_input/cr_input.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js';
 import {afterNextRender, html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {getTemplate} from './bluetooth_pairing_request_code_page.html.js';
 import {BluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
 
+import {getTemplate} from './bluetooth_pairing_request_code_page.html.js';
 import {ButtonBarState, ButtonState, PairingAuthType} from './bluetooth_types.js';
 import {mojoString16ToString} from './bluetooth_utils.js';
 
diff --git a/ash/webui/common/resources/cellular_setup/BUILD.gn b/ash/webui/common/resources/cellular_setup/BUILD.gn
index 1c09ac7..8e5a2ace 100644
--- a/ash/webui/common/resources/cellular_setup/BUILD.gn
+++ b/ash/webui/common/resources/cellular_setup/BUILD.gn
@@ -37,8 +37,8 @@
 
 js_library("base_page") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -46,15 +46,15 @@
   deps = [
     ":base_page",
     ":cellular_setup_delegate",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
   ]
 }
 
 js_library("activation_verification_page") {
   deps = [
     ":base_page",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list =
       [ "//ui/webui/resources/cr_elements/cr_lottie/cr_lottie_externs.js" ]
@@ -64,32 +64,32 @@
   deps = [
     ":cellular_setup_delegate",
     ":subflow_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/paper-spinner:paper-spinner-lite",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
 js_library("confirmation_code_page") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/paper-spinner:paper-spinner-lite",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
 js_library("profile_discovery_list_item") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/paper-spinner:paper-spinner-lite",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
 js_library("profile_discovery_list_page") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -137,9 +137,9 @@
     ":base_page",
     ":cellular_setup_delegate",
     ":webview_post_util",
+    "//ash/webui/common/resources:i18n_behavior",
     "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
   ]
   externs_list = [
@@ -152,8 +152,8 @@
   deps = [
     ":cellular_types",
     "//ash/webui/common/resources:focus_without_ink_js",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -176,9 +176,9 @@
     ":provisioning_page",
     ":setup_loading_page",
     ":subflow_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
   ]
   externs_list = [ "$externs_path/metrics_private.js" ]
@@ -197,13 +197,13 @@
     ":profile_discovery_list_item",
     ":profile_discovery_list_page",
     ":subflow_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/network:cellular_utils",
     "//ash/webui/common/resources/network:mojo_interface_provider",
     "//ash/webui/common/resources/network:network_listener_behavior",
     "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js",
     "//chromeos/services/network_config/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
   ]
   externs_list = [ "$externs_path/metrics_private.js" ]
@@ -211,8 +211,8 @@
 
 js_library("cellular_eid_dialog") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -223,8 +223,8 @@
     ":cellular_types",
     ":esim_flow_ui",
     ":psim_flow_ui",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/network:cellular_utils",
     "//ash/webui/common/resources/network:mojo_interface_provider",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
diff --git a/ash/webui/common/resources/cellular_setup/activation_code_page.js b/ash/webui/common/resources/cellular_setup/activation_code_page.js
index 6dae2bac..507cd40 100644
--- a/ash/webui/common/resources/cellular_setup/activation_code_page.js
+++ b/ash/webui/common/resources/cellular_setup/activation_code_page.js
@@ -13,8 +13,8 @@
 import './base_page.js';
 import './cellular_setup_icons.html.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
 import {focusWithoutInk} from '//resources/ash/common/focus_without_ink_js.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from '//resources/js/load_time_data.m.js';
 import {afterNextRender, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/ash/webui/common/resources/cellular_setup/activation_verification_page.js b/ash/webui/common/resources/cellular_setup/activation_verification_page.js
index a6f91435..42ec143 100644
--- a/ash/webui/common/resources/cellular_setup/activation_verification_page.js
+++ b/ash/webui/common/resources/cellular_setup/activation_verification_page.js
@@ -11,7 +11,7 @@
 import '//resources/polymer/v3_0/iron-media-query/iron-media-query.js';
 import '//resources/cr_elements/cr_lottie/cr_lottie.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './activation_verification_page.html.js';
diff --git a/ash/webui/common/resources/cellular_setup/base_page.js b/ash/webui/common/resources/cellular_setup/base_page.js
index 9bdbfe7..7c2cfe12 100644
--- a/ash/webui/common/resources/cellular_setup/base_page.js
+++ b/ash/webui/common/resources/cellular_setup/base_page.js
@@ -7,7 +7,7 @@
 import '//resources/ash/common/cellular_setup/cellular_setup_icons.html.js';
 import '//resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './base_page.html.js';
diff --git a/ash/webui/common/resources/cellular_setup/button_bar.js b/ash/webui/common/resources/cellular_setup/button_bar.js
index 3d5950a..9c4d67f0 100644
--- a/ash/webui/common/resources/cellular_setup/button_bar.js
+++ b/ash/webui/common/resources/cellular_setup/button_bar.js
@@ -7,9 +7,9 @@
 import '//resources/cr_elements/cr_shared_style.css.js';
 import '//resources/cr_elements/cr_shared_vars.css.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
-import {assert, assertNotReached} from '//resources/js/assert.js';
 import {focusWithoutInk} from '//resources/ash/common/focus_without_ink_js.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
+import {assert, assertNotReached} from '//resources/js/assert.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './button_bar.html.js';
diff --git a/ash/webui/common/resources/cellular_setup/cellular_eid_dialog.js b/ash/webui/common/resources/cellular_setup/cellular_eid_dialog.js
index 583c99a0..204b410 100644
--- a/ash/webui/common/resources/cellular_setup/cellular_eid_dialog.js
+++ b/ash/webui/common/resources/cellular_setup/cellular_eid_dialog.js
@@ -10,7 +10,7 @@
 import '//resources/cr_elements/cr_shared_style.css.js';
 import '//resources/cr_elements/cr_shared_vars.css.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {flush, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {EuiccProperties, QRCode} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.js';
 
diff --git a/ash/webui/common/resources/cellular_setup/cellular_setup.js b/ash/webui/common/resources/cellular_setup/cellular_setup.js
index f888a58..695fd74 100644
--- a/ash/webui/common/resources/cellular_setup/cellular_setup.js
+++ b/ash/webui/common/resources/cellular_setup/cellular_setup.js
@@ -10,7 +10,7 @@
 import './psim_flow_ui.js';
 import './esim_flow_ui.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './cellular_setup.html.js';
diff --git a/ash/webui/common/resources/cellular_setup/confirmation_code_page.js b/ash/webui/common/resources/cellular_setup/confirmation_code_page.js
index 0acc25b..c790c9e4 100644
--- a/ash/webui/common/resources/cellular_setup/confirmation_code_page.js
+++ b/ash/webui/common/resources/cellular_setup/confirmation_code_page.js
@@ -12,7 +12,7 @@
 import '//resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js';
 import './base_page.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {ESimProfileProperties, ESimProfileRemote} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.js';
 
diff --git a/ash/webui/common/resources/cellular_setup/esim_flow_ui.js b/ash/webui/common/resources/cellular_setup/esim_flow_ui.js
index 9389f65..834dbde 100644
--- a/ash/webui/common/resources/cellular_setup/esim_flow_ui.js
+++ b/ash/webui/common/resources/cellular_setup/esim_flow_ui.js
@@ -10,10 +10,10 @@
 import './profile_discovery_list_page.js';
 import './confirmation_code_page.js';
 
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {hasActiveCellularNetwork} from '//resources/ash/common/network/cellular_utils.js';
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from '//resources/ash/common/network/mojo_interface_provider.js';
 import {NetworkListenerBehavior} from '//resources/ash/common/network/network_listener_behavior.js';
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
 import {assert, assertNotReached} from '//resources/js/assert.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {ESimManagerRemote, ESimOperationResult, ESimProfileRemote, EuiccRemote, ProfileInstallResult} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.js';
diff --git a/ash/webui/common/resources/cellular_setup/final_page.js b/ash/webui/common/resources/cellular_setup/final_page.js
index 9996f97..b9b3adb 100644
--- a/ash/webui/common/resources/cellular_setup/final_page.js
+++ b/ash/webui/common/resources/cellular_setup/final_page.js
@@ -9,7 +9,7 @@
  */
 import './base_page.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {CellularSetupDelegate} from './cellular_setup_delegate.js';
diff --git a/ash/webui/common/resources/cellular_setup/profile_discovery_list_item.js b/ash/webui/common/resources/cellular_setup/profile_discovery_list_item.js
index 7ef5cfb..6e7ec27 100644
--- a/ash/webui/common/resources/cellular_setup/profile_discovery_list_item.js
+++ b/ash/webui/common/resources/cellular_setup/profile_discovery_list_item.js
@@ -15,7 +15,7 @@
 import '//resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js';
 import './cellular_setup_icons.html.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {ESimProfileProperties, ESimProfileRemote} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.js';
 
diff --git a/ash/webui/common/resources/cellular_setup/profile_discovery_list_page.js b/ash/webui/common/resources/cellular_setup/profile_discovery_list_page.js
index 84bec6f..6d73476 100644
--- a/ash/webui/common/resources/cellular_setup/profile_discovery_list_page.js
+++ b/ash/webui/common/resources/cellular_setup/profile_discovery_list_page.js
@@ -12,7 +12,7 @@
 import './base_page.js';
 import './profile_discovery_list_item.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {ESimProfileRemote} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.js';
 
diff --git a/ash/webui/common/resources/cellular_setup/provisioning_page.js b/ash/webui/common/resources/cellular_setup/provisioning_page.js
index d080698a..4c50a46 100644
--- a/ash/webui/common/resources/cellular_setup/provisioning_page.js
+++ b/ash/webui/common/resources/cellular_setup/provisioning_page.js
@@ -13,7 +13,7 @@
 import '//resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
 import '//resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {assert} from '//resources/js/assert.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {CellularMetadata} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/cellular_setup.mojom-webui.js';
diff --git a/ash/webui/common/resources/cellular_setup/psim_flow_ui.js b/ash/webui/common/resources/cellular_setup/psim_flow_ui.js
index 4942bd8..cf54faef 100644
--- a/ash/webui/common/resources/cellular_setup/psim_flow_ui.js
+++ b/ash/webui/common/resources/cellular_setup/psim_flow_ui.js
@@ -7,7 +7,7 @@
 import './final_page.js';
 import '//resources/polymer/v3_0/iron-pages/iron-pages.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {assert, assertNotReached} from '//resources/js/assert.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {ActivationDelegateInterface, ActivationDelegateReceiver, ActivationResult, CarrierPortalHandlerRemote, CarrierPortalStatus, CellularMetadata, CellularSetup_StartActivation_ResponseParams, CellularSetupRemote} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/cellular_setup.mojom-webui.js';
diff --git a/ash/webui/common/resources/cellular_setup/setup_loading_page.js b/ash/webui/common/resources/cellular_setup/setup_loading_page.js
index d6cb6af..8d27c4a7 100644
--- a/ash/webui/common/resources/cellular_setup/setup_loading_page.js
+++ b/ash/webui/common/resources/cellular_setup/setup_loading_page.js
@@ -12,7 +12,7 @@
 import '//resources/cr_elements/cr_lottie/cr_lottie.js';
 import '//resources/polymer/v3_0/iron-media-query/iron-media-query.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './setup_loading_page.html.js';
diff --git a/ui/webui/resources/cr_elements/cr_container_shadow_behavior.d.ts b/ash/webui/common/resources/cr_container_shadow_behavior.d.ts
similarity index 100%
rename from ui/webui/resources/cr_elements/cr_container_shadow_behavior.d.ts
rename to ash/webui/common/resources/cr_container_shadow_behavior.d.ts
diff --git a/ui/webui/resources/cr_elements/cr_container_shadow_behavior.js b/ash/webui/common/resources/cr_container_shadow_behavior.js
similarity index 98%
rename from ui/webui/resources/cr_elements/cr_container_shadow_behavior.js
rename to ash/webui/common/resources/cr_container_shadow_behavior.js
index 3b65ee9f..2df5cd8 100644
--- a/ui/webui/resources/cr_elements/cr_container_shadow_behavior.js
+++ b/ash/webui/common/resources/cr_container_shadow_behavior.js
@@ -35,7 +35,7 @@
  */
 
 // clang-format off
-import {assert} from '../js/assert.js';
+import {assert} from '//resources/js/assert.js';
 // clang-format on
 
 /** @enum {string} */
diff --git a/ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.d.ts b/ash/webui/common/resources/cr_policy_indicator_behavior.d.ts
similarity index 100%
rename from ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.d.ts
rename to ash/webui/common/resources/cr_policy_indicator_behavior.d.ts
diff --git a/ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.js b/ash/webui/common/resources/cr_policy_indicator_behavior.js
similarity index 98%
rename from ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.js
rename to ash/webui/common/resources/cr_policy_indicator_behavior.js
index 760abb0..285e0d73 100644
--- a/ui/webui/resources/cr_elements/policy/cr_policy_indicator_behavior.js
+++ b/ash/webui/common/resources/cr_policy_indicator_behavior.js
@@ -8,7 +8,7 @@
  * rework the "policy" naming scheme throughout this directory.
  */
 
-import {assertNotReached} from '../../js/assert.js';
+import {assertNotReached} from '//resources/js/assert.js';
 
 /**
  * Strings required for policy indicators. These must be set at runtime.
diff --git a/ui/webui/resources/cr_elements/cr_scrollable_behavior.d.ts b/ash/webui/common/resources/cr_scrollable_behavior.d.ts
similarity index 100%
rename from ui/webui/resources/cr_elements/cr_scrollable_behavior.d.ts
rename to ash/webui/common/resources/cr_scrollable_behavior.d.ts
diff --git a/ui/webui/resources/cr_elements/cr_scrollable_behavior.js b/ash/webui/common/resources/cr_scrollable_behavior.js
similarity index 100%
rename from ui/webui/resources/cr_elements/cr_scrollable_behavior.js
rename to ash/webui/common/resources/cr_scrollable_behavior.js
diff --git a/ui/webui/resources/cr_elements/i18n_behavior.d.ts b/ash/webui/common/resources/i18n_behavior.d.ts
similarity index 87%
rename from ui/webui/resources/cr_elements/i18n_behavior.d.ts
rename to ash/webui/common/resources/i18n_behavior.d.ts
index 998955c..f73e60d 100644
--- a/ui/webui/resources/cr_elements/i18n_behavior.d.ts
+++ b/ash/webui/common/resources/i18n_behavior.d.ts
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {SanitizeInnerHtmlOpts} from '../js/parse_html_subset.js';
+import {SanitizeInnerHtmlOpts} from 'chrome://resources/js/parse_html_subset.js';
 
 export interface I18nBehavior {
   locale: string|null|undefined;
diff --git a/ui/webui/resources/cr_elements/i18n_behavior.js b/ash/webui/common/resources/i18n_behavior.js
similarity index 96%
rename from ui/webui/resources/cr_elements/i18n_behavior.js
rename to ash/webui/common/resources/i18n_behavior.js
index a8b3359..1486640 100644
--- a/ui/webui/resources/cr_elements/i18n_behavior.js
+++ b/ash/webui/common/resources/i18n_behavior.js
@@ -12,8 +12,8 @@
  * code.
  */
 
-import {parseHtmlSubset, SanitizeInnerHtmlOpts, sanitizeInnerHtml} from '../js/parse_html_subset.js';
-import {loadTimeData} from '../js/load_time_data.m.js';
+import {loadTimeData} from '//resources/js/load_time_data.m.js';
+import {parseHtmlSubset, sanitizeInnerHtml, SanitizeInnerHtmlOpts} from '//resources/js/parse_html_subset.js';
 
 /** @polymerBehavior */
 export const I18nBehavior = {
@@ -183,4 +183,3 @@
    */
   i18nExists(id) {}
 }
-
diff --git a/ash/webui/common/resources/keyboard_diagram.js b/ash/webui/common/resources/keyboard_diagram.js
index 3056ecc..3ac63238 100644
--- a/ash/webui/common/resources/keyboard_diagram.js
+++ b/ash/webui/common/resources/keyboard_diagram.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './keyboard_diagram.html.js';
diff --git a/ash/webui/common/resources/keyboard_key.js b/ash/webui/common/resources/keyboard_key.js
index 3661f00..8d153cd5 100644
--- a/ash/webui/common/resources/keyboard_key.js
+++ b/ash/webui/common/resources/keyboard_key.js
@@ -5,7 +5,7 @@
 import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 import './keyboard_icons.html.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './keyboard_key.html.js';
diff --git a/ash/webui/common/resources/multidevice_setup/BUILD.gn b/ash/webui/common/resources/multidevice_setup/BUILD.gn
index 2934fa0..551b1f9a 100644
--- a/ash/webui/common/resources/multidevice_setup/BUILD.gn
+++ b/ash/webui/common/resources/multidevice_setup/BUILD.gn
@@ -55,7 +55,7 @@
     ":setup_succeeded_page",
     ":start_setup_page",
     "//ash/services/multidevice_setup/public/mojom:mojom_webui_js",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//ui/webui/resources/js:cr.m",
   ]
 }
@@ -89,7 +89,7 @@
     ":ui_page_container_behavior",
     "//ash/services/device_sync/public/mojom:mojom_webui_js",
     "//ash/services/multidevice_setup/public/mojom:mojom_webui_js",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
   ]
   externs_list =
       [ "//ui/webui/resources/cr_elements/cr_lottie/cr_lottie_externs.js" ]
@@ -97,7 +97,7 @@
 
 js_library("ui_page_container_behavior") {
   deps = [
-    "//ui/webui/resources/cr_elements:i18n_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ui/webui/resources/js:cr.m",
   ]
 }
diff --git a/ash/webui/common/resources/multidevice_setup/multidevice_setup.js b/ash/webui/common/resources/multidevice_setup/multidevice_setup.js
index 25bc92a..3b7778b 100644
--- a/ash/webui/common/resources/multidevice_setup/multidevice_setup.js
+++ b/ash/webui/common/resources/multidevice_setup/multidevice_setup.js
@@ -11,7 +11,7 @@
 import '//resources/js/cr.m.js';
 import '//resources/polymer/v3_0/iron-pages/iron-pages.js';
 
-import {WebUIListenerBehavior} from '//resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from '//resources/ash/common/web_ui_listener_behavior.js';
 import {assert} from '//resources/js/assert.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {HostDevice} from 'chrome://resources/mojo/ash/services/multidevice_setup/public/mojom/multidevice_setup.mojom-webui.js';
diff --git a/ash/webui/common/resources/multidevice_setup/start_setup_page.js b/ash/webui/common/resources/multidevice_setup/start_setup_page.js
index 534f066..f30bbb1e 100644
--- a/ash/webui/common/resources/multidevice_setup/start_setup_page.js
+++ b/ash/webui/common/resources/multidevice_setup/start_setup_page.js
@@ -11,7 +11,7 @@
 import '//resources/polymer/v3_0/iron-icon/iron-icon.js';
 import '//resources/polymer/v3_0/iron-media-query/iron-media-query.js';
 
-import {WebUIListenerBehavior} from '//resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from '//resources/ash/common/web_ui_listener_behavior.js';
 import {loadTimeData} from '//resources/js/load_time_data.m.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {ConnectivityStatus} from 'chrome://resources/mojo/ash/services/device_sync/public/mojom/device_sync.mojom-webui.js';
diff --git a/ash/webui/common/resources/multidevice_setup/ui_page_container_behavior.js b/ash/webui/common/resources/multidevice_setup/ui_page_container_behavior.js
index 9b402c61..0f61dcb 100644
--- a/ash/webui/common/resources/multidevice_setup/ui_page_container_behavior.js
+++ b/ash/webui/common/resources/multidevice_setup/ui_page_container_behavior.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 
 /** @polymerBehavior */
 const UiPageContainerBehaviorImpl = {
diff --git a/ash/webui/common/resources/network/BUILD.gn b/ash/webui/common/resources/network/BUILD.gn
index ad43cd31..c8568811a 100644
--- a/ash/webui/common/resources/network/BUILD.gn
+++ b/ash/webui/common/resources/network/BUILD.gn
@@ -50,9 +50,9 @@
 
 js_library("cr_policy_network_behavior_mojo") {
   deps = [
+    "//ash/webui/common/resources:cr_policy_indicator_behavior",
     "//chromeos/services/network_config/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior",
   ]
 }
 
@@ -60,8 +60,8 @@
   deps = [
     ":cr_policy_network_behavior_mojo",
     ":onc_mojo",
+    "//ash/webui/common/resources:cr_policy_indicator_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior",
   ]
 }
 
@@ -69,8 +69,8 @@
   deps = [
     ":network_property_list_mojo",
     ":onc_mojo",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:load_time_data.m",
   ]
@@ -83,10 +83,10 @@
 
 js_library("network_choose_mobile") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//chromeos/services/network_config/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list =
       [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js" ]
@@ -100,12 +100,12 @@
     ":network_config_toggle",
     ":network_listener_behavior",
     ":network_password_input",
+    "//ash/webui/common/resources:i18n_behavior",
     "//chrome/browser/ui/webui/settings/ash/search:mojo_bindings_js_library_for_compile",
     "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
     "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon",
     "//third_party/polymer/v3_0/components-chromium/paper-spinner:paper-spinner-lite",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
   externs_list = [
@@ -134,8 +134,8 @@
     ":cr_policy_network_behavior_mojo",
     ":cr_policy_network_indicator_mojo",
     ":network_config_element_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list =
       [ "//ui/webui/resources/cr_elements/policy/cr_tooltip_icon_externs.js" ]
@@ -155,8 +155,8 @@
 js_library("network_icon") {
   deps = [
     ":onc_mojo",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
   ]
 }
@@ -179,10 +179,10 @@
     ":network_list_item",
     ":network_list_types",
     ":onc_mojo",
+    "//ash/webui/common/resources:cr_scrollable_behavior",
     "//ash/webui/common/resources:list_property_update_behavior",
     "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:cr_scrollable_behavior",
   ]
 }
 
@@ -213,9 +213,9 @@
 js_library("network_nameservers") {
   deps = [
     ":cr_policy_network_behavior_mojo",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_input/cr_input_externs.js",
@@ -229,8 +229,8 @@
     ":cr_policy_network_behavior_mojo",
     ":cr_policy_network_indicator_mojo",
     ":network_config_element_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list =
       [ "//ui/webui/resources/cr_elements/cr_input/cr_input_externs.js" ]
@@ -254,9 +254,9 @@
     ":network_proxy_exclusions",
     ":network_proxy_input",
     ":onc_mojo",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
   ]
   externs_list = [
@@ -268,17 +268,17 @@
 
 js_library("network_proxy_exclusions") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
 js_library("network_proxy_input") {
   deps = [
     ":onc_mojo",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list =
       [ "//ui/webui/resources/cr_elements/cr_input/cr_input_externs.js" ]
@@ -303,10 +303,10 @@
     ":onc_mojo",
     ":sim_lock_dialogs",
     "//ash/webui/common/resources:focus_without_ink_js",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
     "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
   ]
   externs_list = [
@@ -335,10 +335,10 @@
     ":mojo_interface_provider",
     ":network_password_input",
     ":onc_mojo",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
     "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js",
diff --git a/ash/webui/common/resources/network/cr_policy_network_behavior_mojo.js b/ash/webui/common/resources/network/cr_policy_network_behavior_mojo.js
index 08ba706..e9749510 100644
--- a/ash/webui/common/resources/network/cr_policy_network_behavior_mojo.js
+++ b/ash/webui/common/resources/network/cr_policy_network_behavior_mojo.js
@@ -8,7 +8,7 @@
  * optional properties (which may be null|undefined).
  */
 
-import {CrPolicyIndicatorType} from 'chrome://resources/cr_elements/policy/cr_policy_indicator_behavior.js';
+import {CrPolicyIndicatorType} from 'chrome://resources/ash/common/cr_policy_indicator_behavior.js';
 import {ApnProperties, ManagedApnList, ManagedBoolean, ManagedInt32, ManagedString, ManagedStringList} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {OncSource, PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 
diff --git a/ash/webui/common/resources/network/cr_policy_network_indicator_mojo.js b/ash/webui/common/resources/network/cr_policy_network_indicator_mojo.js
index 2611606e..b20422d51 100644
--- a/ash/webui/common/resources/network/cr_policy_network_indicator_mojo.js
+++ b/ash/webui/common/resources/network/cr_policy_network_indicator_mojo.js
@@ -10,7 +10,7 @@
 import '//resources/cr_elements/policy/cr_tooltip_icon.js';
 import '//resources/cr_elements/cr_hidden_style.css.js';
 
-import {CrPolicyIndicatorBehavior, CrPolicyIndicatorType} from '//resources/cr_elements/policy/cr_policy_indicator_behavior.js';
+import {CrPolicyIndicatorBehavior, CrPolicyIndicatorType} from '//resources/ash/common/cr_policy_indicator_behavior.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {ManagedBoolean, ManagedInt32, ManagedString} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_apnlist.js b/ash/webui/common/resources/network/network_apnlist.js
index 25a247d..881f280 100644
--- a/ash/webui/common/resources/network/network_apnlist.js
+++ b/ash/webui/common/resources/network/network_apnlist.js
@@ -14,8 +14,8 @@
 import './network_property_list_mojo.js';
 import './network_shared.css.js';
 
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {OncMojo} from '//resources/ash/common/network/onc_mojo.js';
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
 import {assert} from '//resources/js/assert.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {ApnAuthenticationType, ApnIpType, ApnProperties, ApnState, ApnType, ManagedApnProperties, ManagedProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_choose_mobile.js b/ash/webui/common/resources/network/network_choose_mobile.js
index b4b9cc0d..90e7cb5e 100644
--- a/ash/webui/common/resources/network/network_choose_mobile.js
+++ b/ash/webui/common/resources/network/network_choose_mobile.js
@@ -13,7 +13,7 @@
 import '//resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
 import './network_shared.css.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {CrosNetworkConfigRemote, FoundNetworkProperties, ManagedProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {ConnectionStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_config.js b/ash/webui/common/resources/network/network_config.js
index 5eb97a80..d9d4016 100644
--- a/ash/webui/common/resources/network/network_config.js
+++ b/ash/webui/common/resources/network/network_config.js
@@ -22,7 +22,7 @@
 import './network_password_input.js';
 import './network_shared.css.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {assert, assertNotReached} from '//resources/js/assert.js';
 import {loadTimeData} from '//resources/js/load_time_data.m.js';
 import {flush, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/ash/webui/common/resources/network/network_config_select.js b/ash/webui/common/resources/network/network_config_select.js
index 2cc9048..7d3a5d1 100644
--- a/ash/webui/common/resources/network/network_config_select.js
+++ b/ash/webui/common/resources/network/network_config_select.js
@@ -12,7 +12,7 @@
 import './cr_policy_network_indicator_mojo.js';
 import './network_shared.css.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {assertNotReached} from '//resources/js/assert.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {NetworkCertificate} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_icon.js b/ash/webui/common/resources/network/network_icon.js
index 2ce9026..4c582b49 100644
--- a/ash/webui/common/resources/network/network_icon.js
+++ b/ash/webui/common/resources/network/network_icon.js
@@ -11,7 +11,7 @@
 import '//resources/cr_elements/cr_hidden_style.css.js';
 import '//resources/polymer/v3_0/iron-icon/iron-icon.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {SecurityType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {ConnectionStateType, DeviceStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_ip_config.js b/ash/webui/common/resources/network/network_ip_config.js
index 0fe38bd..cf41e94 100644
--- a/ash/webui/common/resources/network/network_ip_config.js
+++ b/ash/webui/common/resources/network/network_ip_config.js
@@ -12,7 +12,7 @@
 import './network_property_list_mojo.js';
 import './network_shared.css.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {IPConfigProperties, ManagedProperties, NO_ROUTING_PREFIX} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {IPConfigType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_list.js b/ash/webui/common/resources/network/network_list.js
index bd5d6e6..4eeca30e 100644
--- a/ash/webui/common/resources/network/network_list.js
+++ b/ash/webui/common/resources/network/network_list.js
@@ -11,7 +11,7 @@
 import '//resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
 import '//resources/polymer/v3_0/iron-list/iron-list.js';
 
-import {CrScrollableBehavior} from '//resources/cr_elements/cr_scrollable_behavior.js';
+import {CrScrollableBehavior} from '//resources/ash/common/cr_scrollable_behavior.js';
 import {ListPropertyUpdateBehavior} from '//resources/ash/common/list_property_update_behavior.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {GlobalPolicy} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_list_item.js b/ash/webui/common/resources/network/network_list_item.js
index 7c82362..ce84276 100644
--- a/ash/webui/common/resources/network/network_list_item.js
+++ b/ash/webui/common/resources/network/network_list_item.js
@@ -19,7 +19,7 @@
 import {CellularSetupPageName} from '//resources/ash/common/cellular_setup/cellular_types.js';
 import {getESimProfileProperties} from '//resources/ash/common/cellular_setup/esim_manager_utils.js';
 import {FocusRowBehavior} from '//resources/ash/common/focus_row_behavior.js';
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {assert} from '//resources/js/assert.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
diff --git a/ash/webui/common/resources/network/network_nameservers.js b/ash/webui/common/resources/network/network_nameservers.js
index 0518a59..fec5473d 100644
--- a/ash/webui/common/resources/network/network_nameservers.js
+++ b/ash/webui/common/resources/network/network_nameservers.js
@@ -14,7 +14,7 @@
 import '//resources/cr_elements/md_select.css.js';
 import './network_shared.css.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {ManagedProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {IPConfigType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_password_input.js b/ash/webui/common/resources/network/network_password_input.js
index fcf14c89..5bb0d56 100644
--- a/ash/webui/common/resources/network/network_password_input.js
+++ b/ash/webui/common/resources/network/network_password_input.js
@@ -14,7 +14,7 @@
 import './cr_policy_network_indicator_mojo.js';
 import './network_shared.css.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {CrPolicyNetworkBehaviorMojo} from './cr_policy_network_behavior_mojo.js';
diff --git a/ash/webui/common/resources/network/network_property_list_mojo.js b/ash/webui/common/resources/network/network_property_list_mojo.js
index 5aa5cf2e..0c70c20 100644
--- a/ash/webui/common/resources/network/network_property_list_mojo.js
+++ b/ash/webui/common/resources/network/network_property_list_mojo.js
@@ -13,7 +13,7 @@
 import './cr_policy_network_indicator_mojo.js';
 import './network_shared.css.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {assert} from '//resources/js/assert.js';
 import {flush, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {ActivationStateType, SecurityType, SubjectAltName, VpnType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_proxy.js b/ash/webui/common/resources/network/network_proxy.js
index 519a881..ae66262 100644
--- a/ash/webui/common/resources/network/network_proxy.js
+++ b/ash/webui/common/resources/network/network_proxy.js
@@ -17,7 +17,7 @@
 import './network_proxy_input.js';
 import './network_shared.css.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {assert} from '//resources/js/assert.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {ManagedManualProxySettings, ManagedProperties, ManagedProxyLocation, ManagedProxySettings, ManagedStringList, ProxyLocation, ProxySettings} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/network_proxy_exclusions.js b/ash/webui/common/resources/network/network_proxy_exclusions.js
index 72cb217..dd8a4761 100644
--- a/ash/webui/common/resources/network/network_proxy_exclusions.js
+++ b/ash/webui/common/resources/network/network_proxy_exclusions.js
@@ -12,7 +12,7 @@
 import '//resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
 import './network_shared.css.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './network_proxy_exclusions.html.js';
diff --git a/ash/webui/common/resources/network/network_proxy_input.js b/ash/webui/common/resources/network/network_proxy_input.js
index d75437d..53c9ae8c 100644
--- a/ash/webui/common/resources/network/network_proxy_input.js
+++ b/ash/webui/common/resources/network/network_proxy_input.js
@@ -12,7 +12,7 @@
 import '//resources/cr_elements/cr_input/cr_input.js';
 import './network_shared.css.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {ManagedProxyLocation} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 
diff --git a/ash/webui/common/resources/network/network_siminfo.js b/ash/webui/common/resources/network/network_siminfo.js
index 840423d..d1305db0 100644
--- a/ash/webui/common/resources/network/network_siminfo.js
+++ b/ash/webui/common/resources/network/network_siminfo.js
@@ -16,8 +16,8 @@
 import './network_shared.css.js';
 import './sim_lock_dialogs.js';
 
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {isActiveSim} from '//resources/ash/common/network/cellular_utils.js';
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
 import {loadTimeData} from '//resources/js/load_time_data.m.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {GlobalPolicy} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/ash/webui/common/resources/network/sim_lock_dialogs.js b/ash/webui/common/resources/network/sim_lock_dialogs.js
index a933c837..429541a9 100644
--- a/ash/webui/common/resources/network/sim_lock_dialogs.js
+++ b/ash/webui/common/resources/network/sim_lock_dialogs.js
@@ -15,7 +15,7 @@
 import './network_password_input.js';
 import './network_shared.css.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {assertNotReached} from '//resources/js/assert.js';
 import {loadTimeData} from '//resources/js/load_time_data.m.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/ash/webui/common/resources/network_health/BUILD.gn b/ash/webui/common/resources/network_health/BUILD.gn
index 019c613..707dcfd 100644
--- a/ash/webui/common/resources/network_health/BUILD.gn
+++ b/ash/webui/common/resources/network_health/BUILD.gn
@@ -25,10 +25,10 @@
 
 js_library("network_health_summary") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/network:onc_mojo",
     "//chromeos/services/network_health/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
   ]
 }
@@ -43,9 +43,9 @@
     ":mojo_interface_provider",
     ":network_diagnostics_types",
     ":routine_group",
+    "//ash/webui/common/resources:i18n_behavior",
     "//chromeos/services/network_health/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -57,8 +57,8 @@
   deps = [
     ":network_diagnostics_types",
     ":network_health_container",
+    "//ash/webui/common/resources:i18n_behavior",
     "//chromeos/services/network_health/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
diff --git a/ash/webui/common/resources/network_health/network_diagnostics.js b/ash/webui/common/resources/network_health/network_diagnostics.js
index e5cceda0..9ec19f6 100644
--- a/ash/webui/common/resources/network_health/network_diagnostics.js
+++ b/ash/webui/common/resources/network_health/network_diagnostics.js
@@ -7,7 +7,7 @@
 
 import {loadTimeData} from '//resources/js/load_time_data.m.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {ArcDnsResolutionProblem, ArcHttpProblem, ArcPingProblem, CaptivePortalProblem, DnsLatencyProblem, DnsResolutionProblem, DnsResolverPresentProblem, GatewayCanBePingedProblem, HasSecureWiFiConnectionProblem, HttpFirewallProblem, HttpsFirewallProblem, HttpsLatencyProblem, RoutineProblems, RoutineType, RoutineVerdict, SignalStrengthProblem, VideoConferencingProblem} from 'chrome://resources/mojo/chromeos/services/network_health/public/mojom/network_diagnostics.mojom-webui.js';
 
 import {getNetworkDiagnosticsService} from './mojo_interface_provider.js';
diff --git a/ash/webui/common/resources/network_health/network_health_summary.js b/ash/webui/common/resources/network_health/network_health_summary.js
index d487559c..e8082f6 100644
--- a/ash/webui/common/resources/network_health/network_health_summary.js
+++ b/ash/webui/common/resources/network_health/network_health_summary.js
@@ -6,8 +6,8 @@
 import 'chrome://resources/ash/common/network/network_shared.css.js';
 
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {assertNotReached} from 'chrome://resources/js/assert.js';
 import {NetworkType, PortalState} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {Network, NetworkHealthService, NetworkHealthServiceRemote, NetworkHealthState, NetworkState, UInt32Value} from 'chrome://resources/mojo/chromeos/services/network_health/public/mojom/network_health.mojom-webui.js';
diff --git a/ash/webui/common/resources/network_health/routine_group.js b/ash/webui/common/resources/network_health/routine_group.js
index 4063ce8..f5ac9bf 100644
--- a/ash/webui/common/resources/network_health/routine_group.js
+++ b/ash/webui/common/resources/network_health/routine_group.js
@@ -10,7 +10,7 @@
 import './network_health_container.js';
 
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {RoutineResult, RoutineVerdict} from 'chrome://resources/mojo/chromeos/services/network_health/public/mojom/network_diagnostics.mojom-webui.js';
 
 import {Icons, Routine} from './network_diagnostics_types.js';
diff --git a/ash/webui/common/resources/quick_unlock/BUILD.gn b/ash/webui/common/resources/quick_unlock/BUILD.gn
index 927e95a2..ef0608b 100644
--- a/ash/webui/common/resources/quick_unlock/BUILD.gn
+++ b/ash/webui/common/resources/quick_unlock/BUILD.gn
@@ -24,8 +24,8 @@
 
 js_library("pin_keyboard") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list =
       [ "//ui/webui/resources/cr_elements/cr_input/cr_input_externs.js" ]
@@ -35,8 +35,8 @@
   deps = [
     ":lock_screen_constants",
     ":pin_keyboard",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list = [ "$externs_path/quick_unlock_private.js" ]
   extra_sources = [ "$interfaces_path/quick_unlock_private_interface.js" ]
diff --git a/ash/webui/common/resources/quick_unlock/pin_keyboard.js b/ash/webui/common/resources/quick_unlock/pin_keyboard.js
index 7afda44..9e277a2 100644
--- a/ash/webui/common/resources/quick_unlock/pin_keyboard.js
+++ b/ash/webui/common/resources/quick_unlock/pin_keyboard.js
@@ -31,10 +31,9 @@
 import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 import './pin_keyboard_icons.html.js';
 
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
-
 import {getTemplate} from './pin_keyboard.html.js';
 
 /**
diff --git a/ash/webui/common/resources/quick_unlock/setup_pin_keyboard.js b/ash/webui/common/resources/quick_unlock/setup_pin_keyboard.js
index 0a5fda5..8a87a49d 100644
--- a/ash/webui/common/resources/quick_unlock/setup_pin_keyboard.js
+++ b/ash/webui/common/resources/quick_unlock/setup_pin_keyboard.js
@@ -13,7 +13,7 @@
 import 'chrome://resources/cr_elements/cr_shared_vars.css.js';
 import './pin_keyboard.js';
 
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert, assertNotReached} from 'chrome://resources/js/assert.js';
 import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/ash/webui/common/resources/smb_shares/BUILD.gn b/ash/webui/common/resources/smb_shares/BUILD.gn
index 442257bb..85d6df4 100644
--- a/ash/webui/common/resources/smb_shares/BUILD.gn
+++ b/ash/webui/common/resources/smb_shares/BUILD.gn
@@ -17,9 +17,9 @@
 js_library("add_smb_share_dialog") {
   deps = [
     ":smb_browser_proxy",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:cr.m",
     "//ui/webui/resources/js:load_time_data.m",
   ]
diff --git a/ash/webui/common/resources/smb_shares/add_smb_share_dialog.js b/ash/webui/common/resources/smb_shares/add_smb_share_dialog.js
index 88df76d4..8763ee2b 100644
--- a/ash/webui/common/resources/smb_shares/add_smb_share_dialog.js
+++ b/ash/webui/common/resources/smb_shares/add_smb_share_dialog.js
@@ -20,8 +20,8 @@
 import '//resources/cr_elements/md_select.css.js';
 import '//resources/polymer/v3_0/iron-icon/iron-icon.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior} from '//resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior} from '//resources/ash/common/web_ui_listener_behavior.js';
 import {loadTimeData} from '//resources/js/load_time_data.m.js';
 import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/ash/webui/common/resources/traffic_counters/BUILD.gn b/ash/webui/common/resources/traffic_counters/BUILD.gn
index 796407311..32679c59 100644
--- a/ash/webui/common/resources/traffic_counters/BUILD.gn
+++ b/ash/webui/common/resources/traffic_counters/BUILD.gn
@@ -22,21 +22,21 @@
 js_library("traffic_counters") {
   deps = [
     ":traffic_counters_adapter",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/network:onc_mojo",
     "//chromeos/services/network_config/public/mojom:mojom_webui_js",
     "//chromeos/services/network_config/public/mojom:network_types_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
 js_library("traffic_counters_adapter") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/network:mojo_interface_provider",
     "//ash/webui/common/resources/network:onc_mojo",
     "//chromeos/services/network_config/public/mojom:mojom_webui_js",
     "//chromeos/services/network_config/public/mojom:network_types_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
diff --git a/ash/webui/common/resources/traffic_counters/traffic_counters.js b/ash/webui/common/resources/traffic_counters/traffic_counters.js
index b26fb0a..ac801d7 100644
--- a/ash/webui/common/resources/traffic_counters/traffic_counters.js
+++ b/ash/webui/common/resources/traffic_counters/traffic_counters.js
@@ -4,8 +4,8 @@
 
 import 'chrome://resources/ash/common/network/network_shared.css.js';
 
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {TrafficCounterSource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {Time} from 'chrome://resources/mojo/mojo/public/mojom/base/time.mojom-webui.js';
diff --git a/ui/webui/resources/cr_elements/web_ui_listener_behavior.d.ts b/ash/webui/common/resources/web_ui_listener_behavior.d.ts
similarity index 100%
rename from ui/webui/resources/cr_elements/web_ui_listener_behavior.d.ts
rename to ash/webui/common/resources/web_ui_listener_behavior.d.ts
diff --git a/ui/webui/resources/cr_elements/web_ui_listener_behavior.js b/ash/webui/common/resources/web_ui_listener_behavior.js
similarity index 93%
rename from ui/webui/resources/cr_elements/web_ui_listener_behavior.js
rename to ash/webui/common/resources/web_ui_listener_behavior.js
index c5f45815..e33a539 100644
--- a/ui/webui/resources/cr_elements/web_ui_listener_behavior.js
+++ b/ash/webui/common/resources/web_ui_listener_behavior.js
@@ -9,7 +9,8 @@
  * it in new code.
  */
 
-import {WebUIListener, addWebUIListener, removeWebUIListener} from '../js/cr.m.js';
+import {addWebUIListener, removeWebUIListener, WebUIListener} from 'chrome://resources/js/cr.m.js';
+
 
 /** @polymerBehavior */
 // eslint-disable-next-line no-var
@@ -57,4 +58,3 @@
    */
   addWebUIListener(eventName, callback) {}
 }
-
diff --git a/ash/webui/connectivity_diagnostics/resources/BUILD.gn b/ash/webui/connectivity_diagnostics/resources/BUILD.gn
index f474b56..61aa068 100644
--- a/ash/webui/connectivity_diagnostics/resources/BUILD.gn
+++ b/ash/webui/connectivity_diagnostics/resources/BUILD.gn
@@ -21,11 +21,11 @@
 
 js_library("connectivity_diagnostics") {
   deps = [
+    "//ash/webui/common/resources:cr_container_shadow_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/network_health:network_diagnostics",
     "//ash/webui/common/resources/network_health:network_health_summary",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:cr_container_shadow_behavior",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 
   externs_list = [ "$externs_path/chrome_send.js" ]
diff --git a/ash/webui/connectivity_diagnostics/resources/connectivity_diagnostics.js b/ash/webui/connectivity_diagnostics/resources/connectivity_diagnostics.js
index e732c961..244020b6 100644
--- a/ash/webui/connectivity_diagnostics/resources/connectivity_diagnostics.js
+++ b/ash/webui/connectivity_diagnostics/resources/connectivity_diagnostics.js
@@ -7,8 +7,8 @@
 import 'chrome://resources/cr_elements/cr_shared_style.css.js';
 import './strings.m.js';
 
-import {CrContainerShadowBehavior} from 'chrome://resources/cr_elements/cr_container_shadow_behavior.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {CrContainerShadowBehavior} from 'chrome://resources/ash/common/cr_container_shadow_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {sendWithPromise} from 'chrome://resources/js/cr.m.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/ash/webui/diagnostics_ui/resources/drawing_provider.ts b/ash/webui/diagnostics_ui/resources/drawing_provider.ts
index 04b17e4..304d984 100644
--- a/ash/webui/diagnostics_ui/resources/drawing_provider.ts
+++ b/ash/webui/diagnostics_ui/resources/drawing_provider.ts
@@ -10,6 +10,8 @@
 export const MARK_COLOR =
     'rgba(var(--cros-icon-color-prominent), var(--cros-second-tone-opacity))';
 export const TRAIL_COLOR = 'var(--google-blue-50)';
+export const TRAIL_MAX_OPACITY = 0.3;
+export const MAX_TOUCH_PRESSURE = 255;
 export const SOURCE_OVER = 'source-over';
 export const DESTINATION_OVER = 'destination-over';
 
@@ -19,7 +21,8 @@
  */
 interface DrawingProvider {
   // For touchscreen tester to draw a trail on screen.
-  drawTrail(x0: number, y0: number, x1: number, y1: number): void;
+  drawTrail(x0: number, y0: number, x1: number, y1: number, pressure: number):
+      void;
 
   // For touchscreen tester to draw a trial mark on screen.
   drawTrailMark(x: number, y: number): void;
@@ -88,9 +91,11 @@
   /**
    * Draw a line on canvas.
    */
-  drawTrail(x0: number, y0: number, x1: number, y1: number): void {
+  drawTrail(x0: number, y0: number, x1: number, y1: number, pressure: number):
+      void {
     assert(this.ctx);
-    this.ctx.strokeStyle = TRAIL_COLOR;
+    this.ctx.strokeStyle =
+        `rgba(${TRAIL_COLOR}, ${this.getOpacityFromPressure(pressure)})`;
     this.ctx.beginPath();
     this.ctx.moveTo(x0, y0);
     this.ctx.lineTo(x1, y1);
@@ -110,4 +115,13 @@
     this.ctx.fill();
     this.ctx.globalCompositeOperation = DESTINATION_OVER;
   }
+
+  /**
+   * Get trail's opacity based on touch pressure for touchscreen.
+   * TODO(wenyu): this function needs further fine-tune based on the
+   * distribution of pressure value.
+   */
+  private getOpacityFromPressure(pressure: number): number {
+    return TRAIL_MAX_OPACITY * (pressure / MAX_TOUCH_PRESSURE);
+  }
 }
\ No newline at end of file
diff --git a/ash/webui/diagnostics_ui/resources/realtime_cpu_chart.js b/ash/webui/diagnostics_ui/resources/realtime_cpu_chart.js
index 63829b9..b4949e7 100644
--- a/ash/webui/diagnostics_ui/resources/realtime_cpu_chart.js
+++ b/ash/webui/diagnostics_ui/resources/realtime_cpu_chart.js
@@ -6,7 +6,7 @@
 import './diagnostics_shared.css.js';
 import './strings.m.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/ash/webui/firmware_update_ui/resources/BUILD.gn b/ash/webui/firmware_update_ui/resources/BUILD.gn
index 2411887..3643e32 100644
--- a/ash/webui/firmware_update_ui/resources/BUILD.gn
+++ b/ash/webui/firmware_update_ui/resources/BUILD.gn
@@ -98,8 +98,8 @@
     ":firmware_confirmation_dialog",
     ":firmware_update_dialog",
     ":peripheral_updates_list",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -107,9 +107,9 @@
   deps = [
     ":firmware_update_types",
     ":mojo_utils",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/firmware_update_ui/mojom:mojom_js_library_for_compile",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -117,9 +117,9 @@
   deps = [
     ":firmware_update_types",
     ":mojo_utils",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/firmware_update_ui/mojom:mojom_js_library_for_compile",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -145,19 +145,19 @@
     ":firmware_update_types",
     ":mojo_interface_provider",
     ":update_card",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/firmware_update_ui/mojom:mojom_js_library_for_compile",
     "//third_party/polymer/v3_0/components-chromium/iron-a11y-announcer:iron-a11y-announcer",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
 js_library("update_card") {
   deps = [
     ":firmware_update_types",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/firmware_update_ui/mojom:mojom_js_library_for_compile",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
diff --git a/ash/webui/firmware_update_ui/resources/firmware_confirmation_dialog.js b/ash/webui/firmware_update_ui/resources/firmware_confirmation_dialog.js
index 280b944..cc8c2503 100644
--- a/ash/webui/firmware_update_ui/resources/firmware_confirmation_dialog.js
+++ b/ash/webui/firmware_update_ui/resources/firmware_confirmation_dialog.js
@@ -10,7 +10,7 @@
 import './strings.m.js';
 import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {FirmwareUpdate} from './firmware_update_types.js';
diff --git a/ash/webui/firmware_update_ui/resources/firmware_update_app.js b/ash/webui/firmware_update_ui/resources/firmware_update_app.js
index 8222fece..41f9f35 100644
--- a/ash/webui/firmware_update_ui/resources/firmware_update_app.js
+++ b/ash/webui/firmware_update_ui/resources/firmware_update_app.js
@@ -9,7 +9,7 @@
 import './peripheral_updates_list.js';
 import './strings.m.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
diff --git a/ash/webui/firmware_update_ui/resources/firmware_update_dialog.js b/ash/webui/firmware_update_ui/resources/firmware_update_dialog.js
index ca1c5a0..ceacb8dc 100644
--- a/ash/webui/firmware_update_ui/resources/firmware_update_dialog.js
+++ b/ash/webui/firmware_update_ui/resources/firmware_update_dialog.js
@@ -13,7 +13,7 @@
 import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
 import 'chrome://resources/polymer/v3_0/paper-progress/paper-progress.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {DialogContent, FirmwareUpdate, InstallationProgress, InstallControllerRemote, UpdateProgressObserverInterface, UpdateProgressObserverReceiver, UpdateProviderInterface, UpdateState} from './firmware_update_types.js';
diff --git a/ash/webui/firmware_update_ui/resources/peripheral_updates_list.js b/ash/webui/firmware_update_ui/resources/peripheral_updates_list.js
index 6c4b127..04eef7e 100644
--- a/ash/webui/firmware_update_ui/resources/peripheral_updates_list.js
+++ b/ash/webui/firmware_update_ui/resources/peripheral_updates_list.js
@@ -12,7 +12,7 @@
 import './update_card.js';
 import './strings.m.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {IronA11yAnnouncer} from 'chrome://resources/polymer/v3_0/iron-a11y-announcer/iron-a11y-announcer.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/ash/webui/firmware_update_ui/resources/update_card.js b/ash/webui/firmware_update_ui/resources/update_card.js
index d6b9755..9539f03a 100644
--- a/ash/webui/firmware_update_ui/resources/update_card.js
+++ b/ash/webui/firmware_update_ui/resources/update_card.js
@@ -12,7 +12,7 @@
 import './mojom/firmware_update.mojom-lite.js';
 import './strings.m.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {FirmwareUpdate, UpdatePriority} from './firmware_update_types.js';
diff --git a/ash/webui/os_feedback_ui/resources/BUILD.gn b/ash/webui/os_feedback_ui/resources/BUILD.gn
index 4a19ce5..a94dfeb 100644
--- a/ash/webui/os_feedback_ui/resources/BUILD.gn
+++ b/ash/webui/os_feedback_ui/resources/BUILD.gn
@@ -97,8 +97,8 @@
 js_library("help_content") {
   deps = [
     ":feedback_types",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui//webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -168,8 +168,8 @@
     ":feedback_types",
     ":help_content",
     ":mojo_interface_provider",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
diff --git a/ash/webui/os_feedback_ui/resources/confirmation_page.js b/ash/webui/os_feedback_ui/resources/confirmation_page.js
index 958690d..927a7628 100644
--- a/ash/webui/os_feedback_ui/resources/confirmation_page.js
+++ b/ash/webui/os_feedback_ui/resources/confirmation_page.js
@@ -8,7 +8,7 @@
 import 'chrome://resources/cr_elements/cr_link_row/cr_link_row.js';
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {FeedbackFlowState} from './feedback_flow.js';
diff --git a/ash/webui/os_feedback_ui/resources/file_attachment.js b/ash/webui/os_feedback_ui/resources/file_attachment.js
index b422577..2f1e8f6f 100644
--- a/ash/webui/os_feedback_ui/resources/file_attachment.js
+++ b/ash/webui/os_feedback_ui/resources/file_attachment.js
@@ -11,9 +11,9 @@
 import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js';
 import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {stringToMojoString16} from 'chrome://resources/ash/common/mojo_utils.js';
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {AttachedFile, FeedbackAppPreSubmitAction, FeedbackServiceProviderInterface} from './feedback_types.js';
diff --git a/ash/webui/os_feedback_ui/resources/help_content.js b/ash/webui/os_feedback_ui/resources/help_content.js
index 71c56fbf..daa035e 100644
--- a/ash/webui/os_feedback_ui/resources/help_content.js
+++ b/ash/webui/os_feedback_ui/resources/help_content.js
@@ -12,8 +12,8 @@
 import '//resources/cr_elements/policy/cr_tooltip_icon.js';
 import '//resources/cr_elements/cr_shared_vars.css.js';
 
+import {I18nBehavior, I18nBehaviorInterface} from '//resources/ash/common/i18n_behavior.js';
 import {mojoString16ToString} from '//resources/ash/common/mojo_utils.js';
-import {I18nBehavior, I18nBehaviorInterface} from '//resources/cr_elements/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {HelpContent, HelpContentList, HelpContentType, SearchResult} from './feedback_types.js';
diff --git a/ash/webui/os_feedback_ui/resources/search_page.js b/ash/webui/os_feedback_ui/resources/search_page.js
index 368ce92..266ea7d8 100644
--- a/ash/webui/os_feedback_ui/resources/search_page.js
+++ b/ash/webui/os_feedback_ui/resources/search_page.js
@@ -7,8 +7,8 @@
 import './os_feedback_shared_css.js';
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
 
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {stringToMojoString16} from 'chrome://resources/ash/common/mojo_utils.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {btRegEx, buildWordMatcher, FeedbackFlowState} from './feedback_flow.js';
diff --git a/ash/webui/os_feedback_ui/resources/share_data_page.js b/ash/webui/os_feedback_ui/resources/share_data_page.js
index 88cd987..7d022c1 100644
--- a/ash/webui/os_feedback_ui/resources/share_data_page.js
+++ b/ash/webui/os_feedback_ui/resources/share_data_page.js
@@ -9,7 +9,7 @@
 import 'chrome://resources/cr_elements/cr_checkbox/cr_checkbox.js';
 import 'chrome://resources/cr_elements/policy/cr_tooltip_icon.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {FEEDBACK_LEGAL_HELP_URL, FEEDBACK_PRIVACY_POLICY_URL, FEEDBACK_TERMS_OF_SERVICE_URL} from './feedback_constants.js';
diff --git a/ash/webui/personalization_app/resources/js/personalization_breadcrumb_element.ts b/ash/webui/personalization_app/resources/js/personalization_breadcrumb_element.ts
index 7356c12..b5dabf4 100644
--- a/ash/webui/personalization_app/resources/js/personalization_breadcrumb_element.ts
+++ b/ash/webui/personalization_app/resources/js/personalization_breadcrumb_element.ts
@@ -95,11 +95,6 @@
       /** The list of Google Photos albums. */
       googlePhotosAlbums_: Array,
 
-      showBackButton_: {
-        type: Boolean,
-        computed: 'computeShowBackButton_(path)',
-      },
-
       /** The breadcrumb being highlighted by keyboard navigation. */
       selectedBreadcrumb_: {
         type: Object,
@@ -115,7 +110,6 @@
   private breadcrumbs_: string[];
   private collections_: WallpaperCollection[]|null;
   private googlePhotosAlbums_: GooglePhotosAlbum[]|null;
-  private showBackButton_: boolean;
   private selectedBreadcrumb_: HTMLElement;
 
   override ready() {
diff --git a/ash/webui/projector_app/resources/annotator/trusted/BUILD.gn b/ash/webui/projector_app/resources/annotator/trusted/BUILD.gn
index 85abea8d..e3fc9f3 100644
--- a/ash/webui/projector_app/resources/annotator/trusted/BUILD.gn
+++ b/ash/webui/projector_app/resources/annotator/trusted/BUILD.gn
@@ -15,11 +15,11 @@
     "trusted_annotator_comm_factory.js",
   ]
   deps = [
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//ash/webui/common/resources/post_message_api:post_message_api_client",
     "//ash/webui/common/resources/post_message_api:post_message_api_request_handler",
     "//ash/webui/projector_app/resources/common:message_types",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
   externs_list = [ "../../common/projector_app.externs.js" ]
 }
diff --git a/ash/webui/projector_app/resources/annotator/trusted/annotator_embedder_impl.js b/ash/webui/projector_app/resources/annotator/trusted/annotator_embedder_impl.js
index d4bac7b..3cc6d58 100644
--- a/ash/webui/projector_app/resources/annotator/trusted/annotator_embedder_impl.js
+++ b/ash/webui/projector_app/resources/annotator/trusted/annotator_embedder_impl.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {AnnotatorBrowserProxyImpl} from './annotator_browser_proxy.js';
diff --git a/ash/webui/projector_app/resources/app/trusted/BUILD.gn b/ash/webui/projector_app/resources/app/trusted/BUILD.gn
index c78c951..389eadd9 100644
--- a/ash/webui/projector_app/resources/app/trusted/BUILD.gn
+++ b/ash/webui/projector_app/resources/app/trusted/BUILD.gn
@@ -16,10 +16,10 @@
     "trusted_app_comm_factory.js",
   ]
   deps = [
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//ash/webui/common/resources/post_message_api:post_message_api_client",
     "//ash/webui/common/resources/post_message_api:post_message_api_request_handler",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
   externs_list = [
     "../../common/projector_app.externs.js",
diff --git a/ash/webui/projector_app/resources/app/trusted/embedder.js b/ash/webui/projector_app/resources/app/trusted/embedder.js
index 918f011..4bc16584 100644
--- a/ash/webui/projector_app/resources/app/trusted/embedder.js
+++ b/ash/webui/projector_app/resources/app/trusted/embedder.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {installLaunchHandler} from './launch.js';
diff --git a/ash/webui/scanning/resources/BUILD.gn b/ash/webui/scanning/resources/BUILD.gn
index 04ab3dc3..bc4fd89 100644
--- a/ash/webui/scanning/resources/BUILD.gn
+++ b/ash/webui/scanning/resources/BUILD.gn
@@ -45,24 +45,24 @@
   deps = [
     ":scanning_app_util",
     ":select_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/scanning/mojom:mojom_js_library_for_compile",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
 js_library("loading_page") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
 js_library("file_type_select") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/scanning/mojom:mojom_js_library_for_compile",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -70,26 +70,26 @@
   deps = [
     ":scanning_app_util",
     ":select_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/scanning/mojom:mojom_js_library_for_compile",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
 js_library("resolution_select") {
   deps = [
     ":select_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/scanning/mojom:mojom_js_library_for_compile",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
 js_library("scan_done_section") {
   deps = [
     ":scanning_app_types",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -98,17 +98,17 @@
     ":action_toolbar",
     ":scanning_app_types",
     ":scanning_app_util",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/scanning/mojom:mojom_js_library_for_compile",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
 js_library("scan_to_select") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/scanning/mojom:mojom_js_library_for_compile",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -116,25 +116,25 @@
   deps = [
     ":scanning_app_types",
     ":scanning_app_util",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/scanning/mojom:mojom_js_library_for_compile",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
 js_library("multi_page_checkbox") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/scanning/mojom:mojom_js_library_for_compile",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
 js_library("multi_page_scan") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/scanning/mojom:mojom_js_library_for_compile",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -155,9 +155,9 @@
     ":scanning_app_util",
     ":scanning_browser_proxy",
     ":source_select",
+    "//ash/webui/common/resources:cr_container_shadow_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:cr_container_shadow_behavior",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list =
       [ "//ui/webui/resources/cr_elements/cr_toast/cr_toast_externs.js" ]
@@ -176,9 +176,9 @@
   deps = [
     ":scanning_app_util",
     ":select_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/scanning/mojom:mojom_js_library_for_compile",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
diff --git a/ash/webui/scanning/resources/action_toolbar.js b/ash/webui/scanning/resources/action_toolbar.js
index b27f6397..140f3bf 100644
--- a/ash/webui/scanning/resources/action_toolbar.js
+++ b/ash/webui/scanning/resources/action_toolbar.js
@@ -5,8 +5,8 @@
 import './scanning_shared_css.js';
 import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js';
 
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
diff --git a/ash/webui/scanning/resources/color_mode_select.js b/ash/webui/scanning/resources/color_mode_select.js
index 54b55eee..7e04457 100644
--- a/ash/webui/scanning/resources/color_mode_select.js
+++ b/ash/webui/scanning/resources/color_mode_select.js
@@ -6,8 +6,8 @@
 import './scan_settings_section.js';
 import './strings.m.js';
 
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {alphabeticalCompare, getColorModeString} from './scanning_app_util.js';
diff --git a/ash/webui/scanning/resources/file_type_select.js b/ash/webui/scanning/resources/file_type_select.js
index 266b2bc..5e800903 100644
--- a/ash/webui/scanning/resources/file_type_select.js
+++ b/ash/webui/scanning/resources/file_type_select.js
@@ -6,7 +6,7 @@
 import './scan_settings_section.js';
 import './strings.m.js';
 
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
diff --git a/ash/webui/scanning/resources/loading_page.js b/ash/webui/scanning/resources/loading_page.js
index e4ca77ec..d099d589 100644
--- a/ash/webui/scanning/resources/loading_page.js
+++ b/ash/webui/scanning/resources/loading_page.js
@@ -6,7 +6,7 @@
 import 'chrome://resources/polymer/v3_0/iron-media-query/iron-media-query.js';
 import 'chrome://resources/polymer/v3_0/paper-progress/paper-progress.js';
 
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {AppState} from './scanning_app_types.js';
diff --git a/ash/webui/scanning/resources/multi_page_checkbox.js b/ash/webui/scanning/resources/multi_page_checkbox.js
index b1dd3f0..774ffa8 100644
--- a/ash/webui/scanning/resources/multi_page_checkbox.js
+++ b/ash/webui/scanning/resources/multi_page_checkbox.js
@@ -5,7 +5,7 @@
 import 'chrome://resources/cr_elements/cr_checkbox/cr_checkbox.js';
 import './scan_settings_section.js';
 
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
diff --git a/ash/webui/scanning/resources/multi_page_scan.js b/ash/webui/scanning/resources/multi_page_scan.js
index 9e40957..b2ee3dac 100644
--- a/ash/webui/scanning/resources/multi_page_scan.js
+++ b/ash/webui/scanning/resources/multi_page_scan.js
@@ -5,7 +5,7 @@
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
 import './scanning_fonts_css.js';
 
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {AppState} from './scanning_app_types.js';
diff --git a/ash/webui/scanning/resources/page_size_select.js b/ash/webui/scanning/resources/page_size_select.js
index f80d9a915..3af323a 100644
--- a/ash/webui/scanning/resources/page_size_select.js
+++ b/ash/webui/scanning/resources/page_size_select.js
@@ -6,8 +6,8 @@
 import './scan_settings_section.js';
 import './strings.m.js';
 
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {alphabeticalCompare, getPageSizeString} from './scanning_app_util.js';
diff --git a/ash/webui/scanning/resources/resolution_select.js b/ash/webui/scanning/resources/resolution_select.js
index 12b6751..92a5a620 100644
--- a/ash/webui/scanning/resources/resolution_select.js
+++ b/ash/webui/scanning/resources/resolution_select.js
@@ -6,8 +6,8 @@
 import './scan_settings_section.js';
 import './strings.m.js';
 
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {SelectBehavior} from './select_behavior.js';
diff --git a/ash/webui/scanning/resources/scan_done_section.js b/ash/webui/scanning/resources/scan_done_section.js
index fb3a3c5..46ad866 100644
--- a/ash/webui/scanning/resources/scan_done_section.js
+++ b/ash/webui/scanning/resources/scan_done_section.js
@@ -7,8 +7,8 @@
 import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 import './file_path.mojom-lite.js';
 
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/ash/webui/scanning/resources/scan_preview.js b/ash/webui/scanning/resources/scan_preview.js
index 755351b..3fdf65a 100644
--- a/ash/webui/scanning/resources/scan_preview.js
+++ b/ash/webui/scanning/resources/scan_preview.js
@@ -10,8 +10,8 @@
 import 'chrome://resources/polymer/v3_0/iron-media-query/iron-media-query.js';
 import 'chrome://resources/polymer/v3_0/paper-progress/paper-progress.js';
 
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {afterNextRender, html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/ash/webui/scanning/resources/scan_to_select.js b/ash/webui/scanning/resources/scan_to_select.js
index 46ec5a8..1e58f675 100644
--- a/ash/webui/scanning/resources/scan_to_select.js
+++ b/ash/webui/scanning/resources/scan_to_select.js
@@ -5,7 +5,7 @@
 import './scan_settings_section.js';
 import './strings.m.js';
 
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {ScanningBrowserProxy, ScanningBrowserProxyImpl, SelectedPath} from './scanning_browser_proxy.js';
diff --git a/ash/webui/scanning/resources/scanner_select.js b/ash/webui/scanning/resources/scanner_select.js
index ba7938b..845403a 100644
--- a/ash/webui/scanning/resources/scanner_select.js
+++ b/ash/webui/scanning/resources/scanner_select.js
@@ -9,7 +9,7 @@
 import './scan_settings_section.js';
 import './strings.m.js';
 
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {afterNextRender, html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {ScannerArr, ScannerInfo} from './scanning_app_types.js';
diff --git a/ash/webui/scanning/resources/scanning_app.js b/ash/webui/scanning/resources/scanning_app.js
index 25f20855..06bf3e5d 100644
--- a/ash/webui/scanning/resources/scanning_app.js
+++ b/ash/webui/scanning/resources/scanning_app.js
@@ -28,9 +28,9 @@
 import './scanning_shared_css.js';
 import './source_select.js';
 
-import {CrContainerShadowBehavior} from 'chrome://resources/cr_elements/cr_container_shadow_behavior.js';
+import {CrContainerShadowBehavior} from 'chrome://resources/ash/common/cr_container_shadow_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {afterNextRender, html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/ash/webui/scanning/resources/source_select.js b/ash/webui/scanning/resources/source_select.js
index 451111c92..a3db202 100644
--- a/ash/webui/scanning/resources/source_select.js
+++ b/ash/webui/scanning/resources/source_select.js
@@ -6,8 +6,8 @@
 import './scan_settings_section.js';
 import './strings.m.js';
 
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {alphabeticalCompare, getSourceTypeString} from './scanning_app_util.js';
diff --git a/ash/webui/shimless_rma/backend/shimless_rma_service.cc b/ash/webui/shimless_rma/backend/shimless_rma_service.cc
index 9d681675..d6a53113 100644
--- a/ash/webui/shimless_rma/backend/shimless_rma_service.cc
+++ b/ash/webui/shimless_rma/backend/shimless_rma_service.cc
@@ -950,26 +950,12 @@
 }
 
 void ShimlessRmaService::GetLog(GetLogCallback callback) {
-  if (state_proto_.state_case() != rmad::RmadState::kRepairComplete) {
-    LOG(ERROR) << "GetLog called from incorrect state "
-               << state_proto_.state_case();
-    std::move(callback).Run("",
-                            rmad::RmadErrorCode::RMAD_ERROR_REQUEST_INVALID);
-    return;
-  }
   RmadClient::Get()->GetLog(base::BindOnce(&ShimlessRmaService::OnGetLog,
                                            weak_ptr_factory_.GetWeakPtr(),
                                            std::move(callback)));
 }
 
 void ShimlessRmaService::SaveLog(SaveLogCallback callback) {
-  if (state_proto_.state_case() != rmad::RmadState::kRepairComplete) {
-    LOG(ERROR) << "SaveLog called from incorrect state "
-               << state_proto_.state_case();
-    std::move(callback).Run(base::FilePath(""),
-                            rmad::RmadErrorCode::RMAD_ERROR_REQUEST_INVALID);
-    return;
-  }
   RmadClient::Get()->SaveLog(base::BindOnce(&ShimlessRmaService::OnSaveLog,
                                             weak_ptr_factory_.GetWeakPtr(),
                                             std::move(callback)));
@@ -1148,8 +1134,9 @@
 
 void ShimlessRmaService::ExternalDiskState(bool detected) {
   last_external_disk_state_ = detected;
-  if (external_disk_state_observer_.is_bound()) {
-    external_disk_state_observer_->OnExternalDiskStateChanged(detected);
+  for (auto& external_disk_state_observer : external_disk_state_observers_) {
+    external_disk_state_observer->OnExternalDiskStateChanged(
+        *last_external_disk_state_);
   }
 }
 
@@ -1244,10 +1231,12 @@
 
 void ShimlessRmaService::ObserveExternalDiskState(
     ::mojo::PendingRemote<mojom::ExternalDiskStateObserver> observer) {
-  external_disk_state_observer_.Bind(std::move(observer));
+  external_disk_state_observers_.Add(std::move(observer));
   if (last_external_disk_state_) {
-    external_disk_state_observer_->OnExternalDiskStateChanged(
-        *last_external_disk_state_);
+    for (auto& external_disk_state_observer : external_disk_state_observers_) {
+      external_disk_state_observer->OnExternalDiskStateChanged(
+          *last_external_disk_state_);
+    }
   }
 }
 
diff --git a/ash/webui/shimless_rma/backend/shimless_rma_service.h b/ash/webui/shimless_rma/backend/shimless_rma_service.h
index d71b85d..a8d0095 100644
--- a/ash/webui/shimless_rma/backend/shimless_rma_service.h
+++ b/ash/webui/shimless_rma/backend/shimless_rma_service.h
@@ -324,7 +324,10 @@
   mojo::Remote<mojom::HardwareWriteProtectionStateObserver>
       hwwp_state_observer_;
   mojo::Remote<mojom::PowerCableStateObserver> power_cable_observer_;
-  mojo::Remote<mojom::ExternalDiskStateObserver> external_disk_state_observer_;
+  // ExternalDiskStateObserver is used to detect external disks for saving logs
+  // and installing firmware.
+  mojo::RemoteSet<mojom::ExternalDiskStateObserver>
+      external_disk_state_observers_;
   // HardwareVerificationStatusObserver is used by landing and OS update pages.
   mojo::RemoteSet<mojom::HardwareVerificationStatusObserver>
       hardware_verification_observers_;
diff --git a/ash/webui/shimless_rma/backend/shimless_rma_service_unittest.cc b/ash/webui/shimless_rma/backend/shimless_rma_service_unittest.cc
index 3b5efcc0..914a6a95 100644
--- a/ash/webui/shimless_rma/backend/shimless_rma_service_unittest.cc
+++ b/ash/webui/shimless_rma/backend/shimless_rma_service_unittest.cc
@@ -3095,26 +3095,6 @@
   run_loop.RunUntilIdle();
 }
 
-TEST_F(ShimlessRmaServiceTest, GetLogWrongStateEmpty) {
-  const std::vector<rmad::GetStateReply> fake_states = {CreateStateReply(
-      rmad::RmadState::kDeviceDestination, rmad::RMAD_ERROR_OK)};
-  fake_rmad_client_()->SetFakeStateReplies(std::move(fake_states));
-  base::RunLoop run_loop;
-  shimless_rma_provider_->GetCurrentState(
-      base::BindLambdaForTesting([&](mojom::StateResultPtr state_result_ptr) {
-        EXPECT_EQ(state_result_ptr->state, mojom::State::kChooseDestination);
-        EXPECT_EQ(state_result_ptr->error, rmad::RmadErrorCode::RMAD_ERROR_OK);
-      }));
-  run_loop.RunUntilIdle();
-
-  shimless_rma_provider_->GetLog(base::BindLambdaForTesting(
-      [&](const std::string& log, rmad::RmadErrorCode error) {
-        EXPECT_TRUE(log.empty());
-        EXPECT_EQ(error, rmad::RmadErrorCode::RMAD_ERROR_REQUEST_INVALID);
-      }));
-  run_loop.RunUntilIdle();
-}
-
 TEST_F(ShimlessRmaServiceTest, SaveLog) {
   const std::vector<rmad::GetStateReply> fake_states = {
       CreateStateReply(rmad::RmadState::kRepairComplete, rmad::RMAD_ERROR_OK)};
@@ -3141,26 +3121,6 @@
   run_loop.RunUntilIdle();
 }
 
-TEST_F(ShimlessRmaServiceTest, SaveLogWrongStateEmpty) {
-  const std::vector<rmad::GetStateReply> fake_states = {CreateStateReply(
-      rmad::RmadState::kDeviceDestination, rmad::RMAD_ERROR_OK)};
-  fake_rmad_client_()->SetFakeStateReplies(std::move(fake_states));
-  base::RunLoop run_loop;
-  shimless_rma_provider_->GetCurrentState(
-      base::BindLambdaForTesting([&](mojom::StateResultPtr state_result_ptr) {
-        EXPECT_EQ(state_result_ptr->state, mojom::State::kChooseDestination);
-        EXPECT_EQ(state_result_ptr->error, rmad::RmadErrorCode::RMAD_ERROR_OK);
-      }));
-  run_loop.RunUntilIdle();
-
-  shimless_rma_provider_->SaveLog(base::BindLambdaForTesting(
-      [&](const base::FilePath& save_path, rmad::RmadErrorCode error) {
-        EXPECT_TRUE(save_path.empty());
-        EXPECT_EQ(error, rmad::RmadErrorCode::RMAD_ERROR_REQUEST_INVALID);
-      }));
-  run_loop.RunUntilIdle();
-}
-
 TEST_F(ShimlessRmaServiceTest, GetPowerwashRequired) {
   rmad::GetStateReply repair_complete_state =
       CreateStateReply(rmad::RmadState::kRepairComplete, rmad::RMAD_ERROR_OK);
@@ -3632,25 +3592,40 @@
 };
 
 TEST_F(ShimlessRmaServiceTest, ObserveExternalDiskState) {
-  FakeExternalDiskStateObserver fake_observer;
+  FakeExternalDiskStateObserver fake_observer1;
+  FakeExternalDiskStateObserver fake_observer2;
+
+  // Shimless is expected to support multiple ExternalDiskState observers.
   shimless_rma_provider_->ObserveExternalDiskState(
-      fake_observer.receiver.BindNewPipeAndPassRemote());
+      fake_observer1.receiver.BindNewPipeAndPassRemote());
+  shimless_rma_provider_->ObserveExternalDiskState(
+      fake_observer2.receiver.BindNewPipeAndPassRemote());
   base::RunLoop run_loop;
   fake_rmad_client_()->TriggerExternalDiskStateObservation(true);
   run_loop.RunUntilIdle();
-  EXPECT_EQ(fake_observer.observations.size(), 1UL);
-  EXPECT_EQ(fake_observer.observations[0], true);
+  EXPECT_EQ(fake_observer1.observations.size(), 1UL);
+  EXPECT_EQ(fake_observer1.observations[0], true);
+  EXPECT_EQ(fake_observer2.observations.size(), 1UL);
+  EXPECT_EQ(fake_observer2.observations[0], true);
 }
 
 TEST_F(ShimlessRmaServiceTest, ObserveExternalDiskStateAfterSignal) {
-  FakeExternalDiskStateObserver fake_observer;
+  FakeExternalDiskStateObserver fake_observer1;
+  FakeExternalDiskStateObserver fake_observer2;
   fake_rmad_client_()->TriggerExternalDiskStateObservation(true);
+
+  // Shimless is expected to support multiple ExternalDiskState observers.
   shimless_rma_provider_->ObserveExternalDiskState(
-      fake_observer.receiver.BindNewPipeAndPassRemote());
+      fake_observer1.receiver.BindNewPipeAndPassRemote());
+  shimless_rma_provider_->ObserveExternalDiskState(
+      fake_observer2.receiver.BindNewPipeAndPassRemote());
   base::RunLoop run_loop;
   run_loop.RunUntilIdle();
-  EXPECT_EQ(fake_observer.observations.size(), 1UL);
-  EXPECT_EQ(fake_observer.observations[0], true);
+  EXPECT_EQ(fake_observer1.observations.size(), 2UL);
+  EXPECT_EQ(fake_observer1.observations[0], true);
+  EXPECT_EQ(fake_observer1.observations[1], true);
+  EXPECT_EQ(fake_observer2.observations.size(), 1UL);
+  EXPECT_EQ(fake_observer2.observations[0], true);
 }
 
 class FakeHardwareVerificationStatusObserver
diff --git a/ash/webui/shimless_rma/resources/BUILD.gn b/ash/webui/shimless_rma/resources/BUILD.gn
index 69cacfc..7a4a7a1 100644
--- a/ash/webui/shimless_rma/resources/BUILD.gn
+++ b/ash/webui/shimless_rma/resources/BUILD.gn
@@ -178,8 +178,8 @@
     ":base_page",
     ":mojo_interface_provider",
     ":shimless_rma_types",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -188,8 +188,8 @@
     ":base_page",
     ":mojo_interface_provider",
     ":shimless_rma_types",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -231,8 +231,8 @@
     ":base_page",
     ":mojo_interface_provider",
     ":shimless_rma_types",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list = [ "//ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_externs.js" ]
 }
@@ -283,8 +283,8 @@
     ":mojo_interface_provider",
     ":repair_component_chip",
     ":shimless_rma_types",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
   ]
 }
@@ -295,11 +295,11 @@
     ":icons",
     ":mojo_interface_provider",
     ":shimless_rma_types",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/network:network_config",
     "//ash/webui/common/resources/network:network_list",
     "//ash/webui/common/resources/network:onc_mojo",
     "//chromeos/services/network_config/public/mojom:mojom_webui_js",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:util",
   ]
@@ -314,9 +314,9 @@
     ":base_page",
     ":mojo_interface_provider",
     ":shimless_rma_types",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/paper-spinner:paper-spinner-lite",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -346,8 +346,8 @@
     ":base_page",
     ":mojo_interface_provider",
     ":shimless_rma_types",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -440,8 +440,8 @@
     ":base_page",
     ":mojo_interface_provider",
     ":shimless_rma_types",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js",
diff --git a/ash/webui/shimless_rma/resources/critical_error_page.js b/ash/webui/shimless_rma/resources/critical_error_page.js
index 9bb6bcd..8ffb7865a7 100644
--- a/ash/webui/shimless_rma/resources/critical_error_page.js
+++ b/ash/webui/shimless_rma/resources/critical_error_page.js
@@ -7,7 +7,7 @@
 import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/hardware_error_page.js b/ash/webui/shimless_rma/resources/hardware_error_page.js
index e40fde5..9511a363 100644
--- a/ash/webui/shimless_rma/resources/hardware_error_page.js
+++ b/ash/webui/shimless_rma/resources/hardware_error_page.js
@@ -7,7 +7,7 @@
 import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/onboarding_choose_destination_page.js b/ash/webui/shimless_rma/resources/onboarding_choose_destination_page.js
index f3d0b99..dce3504 100644
--- a/ash/webui/shimless_rma/resources/onboarding_choose_destination_page.js
+++ b/ash/webui/shimless_rma/resources/onboarding_choose_destination_page.js
@@ -7,7 +7,7 @@
 import '//resources/cr_elements/cr_radio_button/cr_radio_button.js';
 import '//resources/cr_elements/cr_radio_group/cr_radio_group.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/onboarding_choose_wipe_device_page.js b/ash/webui/shimless_rma/resources/onboarding_choose_wipe_device_page.js
index 28fdbbb..d4c832c 100644
--- a/ash/webui/shimless_rma/resources/onboarding_choose_wipe_device_page.js
+++ b/ash/webui/shimless_rma/resources/onboarding_choose_wipe_device_page.js
@@ -7,8 +7,8 @@
 import '//resources/cr_elements/cr_radio_button/cr_radio_button.js';
 import '//resources/cr_elements/cr_radio_group/cr_radio_group.js';
 
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/onboarding_choose_wp_disable_method_page.js b/ash/webui/shimless_rma/resources/onboarding_choose_wp_disable_method_page.js
index c421cbc..408fb1f 100644
--- a/ash/webui/shimless_rma/resources/onboarding_choose_wp_disable_method_page.js
+++ b/ash/webui/shimless_rma/resources/onboarding_choose_wp_disable_method_page.js
@@ -5,7 +5,7 @@
 import './shimless_rma_shared_css.js';
 import './base_page.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/onboarding_enter_rsu_wp_disable_code_page.js b/ash/webui/shimless_rma/resources/onboarding_enter_rsu_wp_disable_code_page.js
index d5c7e0c0..98b505e7 100644
--- a/ash/webui/shimless_rma/resources/onboarding_enter_rsu_wp_disable_code_page.js
+++ b/ash/webui/shimless_rma/resources/onboarding_enter_rsu_wp_disable_code_page.js
@@ -8,7 +8,7 @@
 import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
 import 'chrome://resources/cr_elements/cr_input/cr_input.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/onboarding_landing_page.js b/ash/webui/shimless_rma/resources/onboarding_landing_page.js
index 7e7621ba..22c1aec 100644
--- a/ash/webui/shimless_rma/resources/onboarding_landing_page.js
+++ b/ash/webui/shimless_rma/resources/onboarding_landing_page.js
@@ -8,7 +8,7 @@
 import './base_page.js';
 import './icons.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/onboarding_network_page.js b/ash/webui/shimless_rma/resources/onboarding_network_page.js
index 2621669..0eaa552b 100644
--- a/ash/webui/shimless_rma/resources/onboarding_network_page.js
+++ b/ash/webui/shimless_rma/resources/onboarding_network_page.js
@@ -14,9 +14,9 @@
 import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 
 import {HTMLEscape} from '//resources/js/util.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/ash/common/network/network_listener_behavior.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {FilterType, NetworkStateProperties, NO_LIMIT, StartConnectResult} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {ConnectionStateType, NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/ash/webui/shimless_rma/resources/onboarding_select_components_page.js b/ash/webui/shimless_rma/resources/onboarding_select_components_page.js
index 90bb7c7..42e3601 100644
--- a/ash/webui/shimless_rma/resources/onboarding_select_components_page.js
+++ b/ash/webui/shimless_rma/resources/onboarding_select_components_page.js
@@ -6,8 +6,8 @@
 import './repair_component_chip.js';
 import './shimless_rma_shared_css.js';
 
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {ComponentTypeToId} from './data.js';
diff --git a/ash/webui/shimless_rma/resources/onboarding_update_page.js b/ash/webui/shimless_rma/resources/onboarding_update_page.js
index f96688c..080fd06 100644
--- a/ash/webui/shimless_rma/resources/onboarding_update_page.js
+++ b/ash/webui/shimless_rma/resources/onboarding_update_page.js
@@ -10,8 +10,8 @@
 import './base_page.js';
 import './icons.js';
 
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/ash/webui/shimless_rma/resources/onboarding_wait_for_manual_wp_disable_page.js b/ash/webui/shimless_rma/resources/onboarding_wait_for_manual_wp_disable_page.js
index 0fe0dd66..20dac447 100644
--- a/ash/webui/shimless_rma/resources/onboarding_wait_for_manual_wp_disable_page.js
+++ b/ash/webui/shimless_rma/resources/onboarding_wait_for_manual_wp_disable_page.js
@@ -5,7 +5,7 @@
 import './shimless_rma_shared_css.js';
 import './base_page.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/onboarding_wp_disable_complete_page.js b/ash/webui/shimless_rma/resources/onboarding_wp_disable_complete_page.js
index b03dfc1..d59d759 100644
--- a/ash/webui/shimless_rma/resources/onboarding_wp_disable_complete_page.js
+++ b/ash/webui/shimless_rma/resources/onboarding_wp_disable_complete_page.js
@@ -5,7 +5,7 @@
 import './shimless_rma_shared_css.js';
 import './base_page.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/reboot_page.js b/ash/webui/shimless_rma/resources/reboot_page.js
index 918f6eb..b7abfdcc 100644
--- a/ash/webui/shimless_rma/resources/reboot_page.js
+++ b/ash/webui/shimless_rma/resources/reboot_page.js
@@ -6,7 +6,7 @@
 import './base_page.js';
 import './shimless_rma_shared_css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {RmadErrorCode} from './shimless_rma_types.js';
diff --git a/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.js b/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.js
index 8291649..5853122e8 100644
--- a/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.js
+++ b/ash/webui/shimless_rma/resources/reimaging_calibration_failed_page.js
@@ -10,8 +10,8 @@
 import './icons.js';
 import './shimless_rma_shared_css.js';
 
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {ComponentTypeToId} from './data.js';
diff --git a/ash/webui/shimless_rma/resources/reimaging_calibration_run_page.js b/ash/webui/shimless_rma/resources/reimaging_calibration_run_page.js
index 08e4fc1a..3836a23 100644
--- a/ash/webui/shimless_rma/resources/reimaging_calibration_run_page.js
+++ b/ash/webui/shimless_rma/resources/reimaging_calibration_run_page.js
@@ -8,7 +8,7 @@
 import './base_page.js';
 import './icons.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {ComponentTypeToId} from './data.js';
diff --git a/ash/webui/shimless_rma/resources/reimaging_calibration_setup_page.js b/ash/webui/shimless_rma/resources/reimaging_calibration_setup_page.js
index 9be49fa..9fa4da7 100644
--- a/ash/webui/shimless_rma/resources/reimaging_calibration_setup_page.js
+++ b/ash/webui/shimless_rma/resources/reimaging_calibration_setup_page.js
@@ -8,8 +8,8 @@
 import './base_page.js';
 import './icons.js';
 
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/reimaging_device_information_page.js b/ash/webui/shimless_rma/resources/reimaging_device_information_page.js
index 4c1e507..93fb00d 100644
--- a/ash/webui/shimless_rma/resources/reimaging_device_information_page.js
+++ b/ash/webui/shimless_rma/resources/reimaging_device_information_page.js
@@ -9,7 +9,7 @@
 import 'chrome://resources/cr_elements/icons.html.js';
 import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/reimaging_firmware_update_page.js b/ash/webui/shimless_rma/resources/reimaging_firmware_update_page.js
index a69d709..55da2ad 100644
--- a/ash/webui/shimless_rma/resources/reimaging_firmware_update_page.js
+++ b/ash/webui/shimless_rma/resources/reimaging_firmware_update_page.js
@@ -8,7 +8,7 @@
 import './base_page.js';
 import './icons.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/reimaging_provisioning_page.js b/ash/webui/shimless_rma/resources/reimaging_provisioning_page.js
index 4ef10e5..49c3f84 100644
--- a/ash/webui/shimless_rma/resources/reimaging_provisioning_page.js
+++ b/ash/webui/shimless_rma/resources/reimaging_provisioning_page.js
@@ -10,7 +10,7 @@
 import './base_page.js';
 import './icons.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/repair_component_chip.js b/ash/webui/shimless_rma/resources/repair_component_chip.js
index 5c1b4874..7894cf7 100644
--- a/ash/webui/shimless_rma/resources/repair_component_chip.js
+++ b/ash/webui/shimless_rma/resources/repair_component_chip.js
@@ -10,7 +10,7 @@
 import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 import 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {modifyTabbableElement} from './shimless_rma_util.js';
diff --git a/ash/webui/shimless_rma/resources/shimless_rma.js b/ash/webui/shimless_rma/resources/shimless_rma.js
index 4492bb7..d621e97a 100644
--- a/ash/webui/shimless_rma/resources/shimless_rma.js
+++ b/ash/webui/shimless_rma/resources/shimless_rma.js
@@ -29,7 +29,7 @@
 import './wrapup_wait_for_manual_wp_enable_page.js';
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
@@ -501,6 +501,11 @@
     this.openLogsDialogCallback_ = () => {
       this.openLogsDialog_();
     };
+
+    /** @private {?Function} */
+    this.onKeyDownCallback_ = (event) => {
+      this.isOpenLogsKeyboardShortcut_(event);
+    };
   }
 
   /** @override */
@@ -520,6 +525,8 @@
     window.addEventListener(
         'fatal-hardware-error', this.fatalHardwareErrorCallback_);
     window.addEventListener('open-logs-dialog', this.openLogsDialogCallback_);
+
+    window.addEventListener('keydown', this.onKeyDownCallback_);
   }
 
   /** @override */
@@ -540,6 +547,8 @@
         'fatal-hardware-error', this.fatalHardwareErrorCallback_);
     window.removeEventListener(
         'open-logs-dialog', this.openLogsDialogCallback_);
+
+    window.removeEventListener('keydown', this.onKeyDownCallback_);
   }
 
   /** @override */
@@ -991,6 +1000,22 @@
         return '';
     }
   }
+
+  /**
+   * Opens the logs dialog if the `Alt + Shift + L` keyboard shortcut is
+   * pressed.
+   * @param {Event} event
+   * @private
+   */
+  isOpenLogsKeyboardShortcut_(event) {
+    const altKeyPressed = event.altKey;
+    const shiftKeyPressed = event.shiftKey;
+    const lKeyPressed = event.key.toLowerCase() === 'l';
+
+    if (altKeyPressed && shiftKeyPressed && lKeyPressed) {
+      this.openLogsDialog_();
+    }
+  }
 }
 
 customElements.define(ShimlessRma.is, ShimlessRma);
diff --git a/ash/webui/shimless_rma/resources/splash_screen.js b/ash/webui/shimless_rma/resources/splash_screen.js
index e6e5078..41460392 100644
--- a/ash/webui/shimless_rma/resources/splash_screen.js
+++ b/ash/webui/shimless_rma/resources/splash_screen.js
@@ -9,7 +9,7 @@
 import './icons.js';
 import './shimless_rma_shared_css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {focusPageTitle} from './shimless_rma_util.js';
diff --git a/ash/webui/shimless_rma/resources/wrapup_finalize_page.js b/ash/webui/shimless_rma/resources/wrapup_finalize_page.js
index 0b324f4..c9df790 100644
--- a/ash/webui/shimless_rma/resources/wrapup_finalize_page.js
+++ b/ash/webui/shimless_rma/resources/wrapup_finalize_page.js
@@ -6,7 +6,7 @@
 import './shimless_rma_shared_css.js';
 import './base_page.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/wrapup_repair_complete_page.js b/ash/webui/shimless_rma/resources/wrapup_repair_complete_page.js
index eb4f63f..8142e606 100644
--- a/ash/webui/shimless_rma/resources/wrapup_repair_complete_page.js
+++ b/ash/webui/shimless_rma/resources/wrapup_repair_complete_page.js
@@ -9,7 +9,7 @@
 import './shimless_rma_fonts_css.js';
 import './shimless_rma_shared_css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/wrapup_restock_page.js b/ash/webui/shimless_rma/resources/wrapup_restock_page.js
index a838633..ecf680c 100644
--- a/ash/webui/shimless_rma/resources/wrapup_restock_page.js
+++ b/ash/webui/shimless_rma/resources/wrapup_restock_page.js
@@ -9,7 +9,7 @@
 import './base_page.js';
 import './icons.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shimless_rma/resources/wrapup_wait_for_manual_wp_enable_page.js b/ash/webui/shimless_rma/resources/wrapup_wait_for_manual_wp_enable_page.js
index 1694e32..17a6656b 100644
--- a/ash/webui/shimless_rma/resources/wrapup_wait_for_manual_wp_enable_page.js
+++ b/ash/webui/shimless_rma/resources/wrapup_wait_for_manual_wp_enable_page.js
@@ -5,7 +5,7 @@
 import './shimless_rma_shared_css.js';
 import './base_page.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getShimlessRmaService} from './mojo_interface_provider.js';
diff --git a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc
index 5133a4b..26ea344 100644
--- a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc
+++ b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc
@@ -10,6 +10,7 @@
 #include "ash/accelerators/ash_accelerator_configuration.h"
 #include "ash/public/cpp/accelerator_configuration.h"
 #include "ash/public/cpp/accelerators.h"
+#include "ash/public/cpp/accelerators_util.h"
 #include "ash/public/mojom/accelerator_keys.mojom.h"
 #include "ash/shell.h"
 #include "ash/test/ash_test_base.h"
@@ -31,8 +32,10 @@
                          const ash::AcceleratorInfo& actual_info) {
   ui::Accelerator expected_accel(expected_data.keycode,
                                  expected_data.modifiers);
-  ash::AcceleratorInfo expected_info(actual_info.type, expected_accel,
-                                     /**locked=*/true);
+  ash::AcceleratorInfo expected_info(
+      actual_info.type, expected_accel,
+      ash::KeycodeToKeyString(expected_data.keycode),
+      /*locked=*/true);
 
   const bool type_equals = expected_info.type == actual_info.type;
   const bool accelerator_equals =
diff --git a/ash/webui/shortcut_customization_ui/resources/common/icons.html b/ash/webui/shortcut_customization_ui/resources/common/icons.html
index 8a00f5d3..df347da7 100644
--- a/ash/webui/shortcut_customization_ui/resources/common/icons.html
+++ b/ash/webui/shortcut_customization_ui/resources/common/icons.html
@@ -24,6 +24,10 @@
           d="M19 19H5V5h7V3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2v-7h-2v7zM14 3v2h3.59l-9.83 9.83 1.41 1.41L19 6.41V10h2V3h-7z">
         </path>
       </g>
+      <!-- Keyboard icons -->
+      <g id="overview" width="20" height="20" viewbox="0 0 20 20">
+        <path fill-rule="evenodd" d="M0.164062 15.3381H13.1281V4.65625H0.164062V15.3381ZM1.80029 6.28995H11.4919V13.7044H1.80029V6.28995ZM14.803 15.3381H16.4806V4.65625H14.803V15.3381ZM18.1583 4.65625H19.8359V15.3255H18.1583V4.65625Z">
+      </g>
     </defs>
   </svg>
 </iron-iconset-svg>
\ No newline at end of file
diff --git a/ash/webui/shortcut_customization_ui/resources/js/input_key.html b/ash/webui/shortcut_customization_ui/resources/js/input_key.html
index ed0d908..c1de78be 100644
--- a/ash/webui/shortcut_customization_ui/resources/js/input_key.html
+++ b/ash/webui/shortcut_customization_ui/resources/js/input_key.html
@@ -37,6 +37,18 @@
     color: var(--google-grey-600);
     font-weight: bold;
   }
+
+  #key-icon {
+    height: 14px;
+    width: 14px;
+  }
 </style>
 
-<div id="key" class="key-container">[[key]]</div>
\ No newline at end of file
+<div id="key" class="key-container">
+  <template is="dom-if" if="[[getIconIdForKey(key)]]">
+    <iron-icon icon="[[getIconIdForKey(key)]]" id="key-icon"></iron-icon>
+  </template>
+  <template is="dom-if" if="[[!getIconIdForKey(key)]]">
+    <span id="key-text">[[key]]</span>
+  </template>
+</div>
\ No newline at end of file
diff --git a/ash/webui/shortcut_customization_ui/resources/js/input_key.ts b/ash/webui/shortcut_customization_ui/resources/js/input_key.ts
index 03be402..4bf8a38 100644
--- a/ash/webui/shortcut_customization_ui/resources/js/input_key.ts
+++ b/ash/webui/shortcut_customization_ui/resources/js/input_key.ts
@@ -4,6 +4,7 @@
 
 import 'chrome://resources/cr_elements/cr_shared_style.css.js';
 import 'chrome://resources/cr_elements/cr_shared_vars.css.js';
+import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
@@ -18,6 +19,11 @@
   ALPHANUMERIC_SELECTED = 'alpha-numeric-selected',
 }
 
+const keyToIconNameMap: {[key: string]: string} = {
+  'PrintScreen': 'overview',
+  // TODO(cambickel): Add remaining keyboard icons to this map.
+};
+
 /**
  * @fileoverview
  * 'input-key' is a component wrapper for a single input key. Responsible for
@@ -49,6 +55,20 @@
   static get template() {
     return getTemplate();
   }
+
+  private getIconIdForKey(): string|null {
+    const iconName = keyToIconNameMap[this.key];
+    if (iconName) {
+      return `shortcut-customization:${iconName}`;
+    }
+    return null;
+  }
+}
+
+declare global {
+  interface HTMLElementTagNameMap {
+    'input-key': InputKeyElement;
+  }
 }
 
 customElements.define(InputKeyElement.is, InputKeyElement);
diff --git a/ash/wm/desks/desks_controller.cc b/ash/wm/desks/desks_controller.cc
index 24bea438..7d6026c 100644
--- a/ash/wm/desks/desks_controller.cc
+++ b/ash/wm/desks/desks_controller.cc
@@ -523,16 +523,19 @@
 }
 
 void DesksController::NewDesk(DesksCreationRemovalSource source) {
+  // We do not want this function to run here when there is no
+  // `temporary_removed_desk_` because that will incorrectly record metrics.
+  // We also want to destroy the `temporary_removed_desk_` first in this
+  // function because we want to ensure that the removing desk's container is
+  // available for use if we need it for the new desk.
+  if (temporary_removed_desk_)
+    MaybeCommitPendingDeskRemoval();
+
   DCHECK(CanCreateDesks());
   DCHECK(!available_container_ids_.empty());
 
   base::AutoReset<bool> in_progress(&are_desks_being_modified_, true);
 
-  // We do not want this function to run here when there is no
-  // `temporary_removed_desk_` because that will incorrectly record metrics.
-  if (temporary_removed_desk_)
-    MaybeCommitPendingDeskRemoval();
-
   // The first default desk should not overwrite any desks restore data, nor
   // should it trigger any UMA stats reports.
   const bool is_first_ever_desk = desks_.empty();
@@ -1806,10 +1809,15 @@
     // when `native_widget_->CloseNow()` finishes running, the window will
     // finally be removed from desk. Therefore, to remove the desk now, we have
     // to manually remove the window from desk now.
-    // Since floated window doesn't belong to desk container, handle it
-    // separately.
-    if (window != floated_window)
-      removed_desk->RemoveWindowFromDesk(window);
+    // We also want to ensure that any windows associated with `removed_desk`'s
+    // container are removed from the container in case we want to immediately
+    // reuse that container. Since floated window doesn't belong to desk
+    // container, handle it separately.
+    if (window != floated_window) {
+      aura::Window* removed_desk_container =
+          removed_desk->GetDeskContainerForRoot(window->GetRootWindow());
+      removed_desk_container->RemoveChild(window);
+    }
   }
 
   // Schedules a delayed task to forcefully close all windows that have not
diff --git a/ash/wm/desks/desks_unittests.cc b/ash/wm/desks/desks_unittests.cc
index be402de..a6a30f82 100644
--- a/ash/wm/desks/desks_unittests.cc
+++ b/ash/wm/desks/desks_unittests.cc
@@ -8113,6 +8113,48 @@
   EXPECT_EQ(2u, DesksController::Get()->desks().size());
 }
 
+// Tests that we can create the maximum number of desks, remove one, and add one
+// before the toast asking if the user would like to undo goes away.
+TEST_F(DesksCloseAllTest, CanAddLastDeskWhileUndoToastIsBeingDisplayed) {
+  auto* controller = DesksController::Get();
+  while (controller->desks().size() < desks_util::kMaxNumberOfDesks)
+    NewDesk();
+  ASSERT_EQ(desks_util::kMaxNumberOfDesks, controller->desks().size());
+
+  // Create a window to ensure that closing windows after removing the last desk
+  // still occurs correctly.
+  WindowHolder window(CreateAppWindow());
+  const int last_desk_index = desks_util::kMaxNumberOfDesks - 1;
+  controller->SendToDeskAtIndex(window.window(), last_desk_index);
+
+  EnterOverview();
+  ASSERT_TRUE(Shell::Get()->overview_controller()->InOverviewSession());
+
+  // Remove the last desk with close-all. This should show the undo toast.
+  RemoveDesk(controller->desks()[last_desk_index].get(),
+             DeskCloseType::kCloseAllWindowsAndWait);
+  ASSERT_EQ(desks_util::kMaxNumberOfDesks - 1, controller->desks().size());
+  ASSERT_TRUE(DesksTestApi::DesksControllerCanUndoDeskRemoval());
+
+  // The new desk button should be enabled at this point.
+  auto* new_desk_button = GetPrimaryRootDesksBarView()
+                              ->expanded_state_new_desk_button()
+                              ->inner_button();
+  ASSERT_TRUE(new_desk_button->GetEnabled());
+
+  // If we click on the `new_desk_button`, we should create a new desk and
+  // destroy the previously removed desk and the window inside of it.
+  auto* event_generator = GetEventGenerator();
+  ClickOnView(new_desk_button, event_generator);
+  EXPECT_EQ(desks_util::kMaxNumberOfDesks, controller->desks().size());
+  EXPECT_FALSE(DesksTestApi::DesksControllerCanUndoDeskRemoval());
+
+  // Ensure that the window is still closed properly.
+  WaitForMilliseconds(
+      DesksController::kCloseAllWindowCloseTimeout.InMilliseconds());
+  EXPECT_FALSE(window.is_valid());
+}
+
 // TODO(afakhry): Add more tests:
 // - Always on top windows are not tracked by any desk.
 // - Reusing containers when desks are removed and created.
diff --git a/base/files/file_error_or.h b/base/files/file_error_or.h
index b4b0554..5b85139 100644
--- a/base/files/file_error_or.h
+++ b/base/files/file_error_or.h
@@ -1,13 +1,10 @@
-// Copyright 2020 The Chromium Authors
+// Copyright 2021 The Chromium Authors
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
 #ifndef BASE_FILES_FILE_ERROR_OR_H_
 #define BASE_FILES_FILE_ERROR_OR_H_
 
-#include <utility>
-
-#include "base/check.h"
 #include "base/files/file.h"
 #include "base/types/expected.h"
 
@@ -15,33 +12,17 @@
 
 // Helper for methods which perform file system operations and which may fail.
 // Objects of this type can take on EITHER a base::File::Error value OR a result
-// value of the specified type.
-template <typename ValueType>
-class FileErrorOr {
- public:
-  // These constructors are intentionally not marked `explicit` for cleaner code
-  // at call sites.
-  FileErrorOr(File::Error error) : value_or_error_(unexpected(error)) {}
-  FileErrorOr(ValueType&& value) : value_or_error_(std::move(value)) {}
-  FileErrorOr(const FileErrorOr&) = default;
-  FileErrorOr(FileErrorOr&&) = default;
-  FileErrorOr& operator=(const FileErrorOr&) = default;
-  FileErrorOr& operator=(FileErrorOr&&) = default;
-  ~FileErrorOr() = default;
-
-  bool is_error() const { return !value_or_error_.has_value(); }
-  File::Error error() const { return value_or_error_.error(); }
-
-  bool is_value() const { return value_or_error_.has_value(); }
-  ValueType& value() { return value_or_error_.value(); }
-  const ValueType& value() const { return value_or_error_.value(); }
-
-  ValueType* operator->() { return &value(); }
-  const ValueType* operator->() const { return &value(); }
-
- private:
-  expected<ValueType, File::Error> value_or_error_;
-};
+// value of the specified type. For example:
+//
+// base::FileErrorOr<int64_t> GetSize() {
+//   if (failed_to_get_size)
+//     return base::unexpected(base::File::Error::FILE_ERROR_FAILED);
+//
+//   return size;
+// }
+//
+template <class ValueType>
+using FileErrorOr = expected<ValueType, File::Error>;
 
 }  // namespace base
 
diff --git a/base/files/file_error_or_unittest.cc b/base/files/file_error_or_unittest.cc
index 9980e88..6945710 100644
--- a/base/files/file_error_or_unittest.cc
+++ b/base/files/file_error_or_unittest.cc
@@ -4,31 +4,30 @@
 
 #include "base/files/file_error_or.h"
 
+#include "base/types/expected.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace base {
 namespace {
 
 TEST(FileErrorOrDeathTest, Error) {
-  FileErrorOr<int> error(File::Error::FILE_ERROR_FAILED);
-  EXPECT_TRUE(error.is_error());
-  EXPECT_FALSE(error.is_value());
+  FileErrorOr<int> error;
+  error = unexpected(File::Error::FILE_ERROR_FAILED);
+  EXPECT_FALSE(error.has_value());
   EXPECT_EQ(error.error(), File::Error::FILE_ERROR_FAILED);
   EXPECT_DEATH_IF_SUPPORTED(error.value(), "");
 }
 
 TEST(FileErrorOrDeathTest, Value) {
   FileErrorOr<int> value(42);
-  EXPECT_FALSE(value.is_error());
-  EXPECT_TRUE(value.is_value());
+  EXPECT_TRUE(value.has_value());
   EXPECT_EQ(value.value(), 42);
   EXPECT_DEATH_IF_SUPPORTED(value.error(), "");
 }
 
 TEST(FileErrorOrDeathTest, ConstValue) {
   const FileErrorOr<int> const_value(1234);
-  EXPECT_FALSE(const_value.is_error());
-  EXPECT_TRUE(const_value.is_value());
+  EXPECT_TRUE(const_value.has_value());
   EXPECT_EQ(const_value.value(), 1234);
   EXPECT_DEATH_IF_SUPPORTED(const_value.error(), "");
 }
diff --git a/build/android/pylib/local/device/local_device_environment.py b/build/android/pylib/local/device/local_device_environment.py
index bbb69da1..720aa9d 100644
--- a/build/android/pylib/local/device/local_device_environment.py
+++ b/build/android/pylib/local/device/local_device_environment.py
@@ -133,6 +133,7 @@
     self._trace_all = None
     if hasattr(args, 'trace_all'):
       self._trace_all = args.trace_all
+    self._use_persistent_shell = args.use_persistent_shell
 
     devil_chromium.Initialize(
         output_directory=constants.GetOutDirectory(),
@@ -172,7 +173,8 @@
         enable_device_files_cache=self._enable_device_cache,
         default_retries=self._max_tries - 1,
         device_arg=device_arg,
-        abis=self._preferred_abis)
+        abis=self._preferred_abis,
+        persistent_shell=self._use_persistent_shell)
 
     if self._logcat_output_file:
       self._logcat_output_dir = tempfile.mkdtemp()
diff --git a/build/android/test_runner.py b/build/android/test_runner.py
index 4e87be9..ff776fbd 100755
--- a/build/android/test_runner.py
+++ b/build/android/test_runner.py
@@ -315,6 +315,10 @@
       action='store_true',
       dest='upload_logcats_file',
       help='Whether to upload logcat file to logdog.')
+  parser.add_argument(
+      '--use-persistent-shell',
+      action='store_true',
+      help='Uses a persistent shell connection for the adb connection.')
 
   logcat_output_group = parser.add_mutually_exclusive_group()
   logcat_output_group.add_argument(
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuTest.java
index 5541a84..0fdbd6b 100644
--- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuTest.java
+++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuTest.java
@@ -16,6 +16,9 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import static org.chromium.chrome.browser.flags.ChromeFeatureList.GRID_TAB_SWITCHER_FOR_TABLETS;
+import static org.chromium.chrome.browser.flags.ChromeFeatureList.TAB_GROUPS_FOR_TABLETS;
+import static org.chromium.chrome.browser.flags.ChromeFeatureList.TAB_STRIP_IMPROVEMENTS;
 import static org.chromium.ui.test.util.ViewUtils.onViewWaiting;
 
 import android.content.Context;
@@ -29,6 +32,7 @@
 import org.junit.Assert;
 import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
@@ -38,7 +42,6 @@
 import org.chromium.base.test.util.CallbackHelper;
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.base.test.util.Feature;
-import org.chromium.base.test.util.Restriction;
 import org.chromium.chrome.browser.flags.CachedFeatureFlags;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.tab.Tab;
@@ -50,6 +53,7 @@
 import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorAction.IconPosition;
 import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorAction.ShowMode;
 import org.chromium.chrome.tab_ui.R;
+import org.chromium.chrome.test.util.browser.Features;
 import org.chromium.components.browser_ui.widget.listmenu.ListMenuButton;
 import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
@@ -61,7 +65,6 @@
 import org.chromium.ui.test.util.BlankUiTestActivityTestCase;
 import org.chromium.ui.test.util.RenderTestRule;
 import org.chromium.ui.test.util.RenderTestRule.Component;
-import org.chromium.ui.test.util.UiRestriction;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -75,9 +78,9 @@
  * classes.
  */
 @RunWith(BaseJUnit4ClassRunner.class)
+@Features.
+EnableFeatures({GRID_TAB_SWITCHER_FOR_TABLETS, TAB_STRIP_IMPROVEMENTS, TAB_GROUPS_FOR_TABLETS})
 @Batch(Batch.UNIT_TESTS)
-// TODO(crbug/1371594): Fix test on tablets.
-@Restriction({UiRestriction.RESTRICTION_TYPE_PHONE})
 public class TabSelectionEditorMenuTest extends BlankUiTestActivityTestCase {
     private static final int TAB_COUNT = 3;
     private static final Integer TAB_ID_0 = 0;
@@ -93,6 +96,9 @@
                     .setDescription("Pluralize strings")
                     .build();
 
+    @Rule
+    public TestRule mProcessor = new Features.JUnitProcessor();
+
     static class FakeTabSelectionEditorAction extends TabSelectionEditorAction {
         private boolean mShouldEnableAction = true;
         private List<Integer> mLastTabIdList;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java
index 1884995..049251b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/PartialCustomTabHeightStrategy.java
@@ -91,6 +91,7 @@
     private static final int SPINNER_FADEIN_DURATION_MS = 100;
     private static final int SPINNER_FADEOUT_DURATION_MS = 400;
     private static final int NAVBAR_BUTTON_RESTORE_DELAY_MS = 400;
+    private static final int NAVBAR_BUTTON_HIDE_SHOW_DELAY_MS = 50;
     private static final String PARAM_LOG_IMMERSIVE_MODE_CONFIRMATIONS =
             "log_immersive_mode_confirmations";
     @VisibleForTesting
@@ -886,13 +887,7 @@
         }
     }
 
-    private void showNavbarButtons(boolean show) {
-        // If the feature flag is set to true then we don't want to hide the nav buttons.
-        if (mWindowAboveNavbar
-                && ChromeFeatureList.sCctResizableAlwaysShowNavBarButtons.isEnabled()) {
-            return;
-        }
-
+    private void changeVisibilityNavbarButtons(boolean show) {
         View decorView = mActivity.getWindow().getDecorView();
         WindowInsetsControllerCompat controller =
                 WindowCompat.getInsetsController(mActivity.getWindow(), decorView);
@@ -910,6 +905,28 @@
                 /*durationMillis*/ 1, null, null, mNavbarTransitionController);
     }
 
+    private void showNavbarButtons(boolean show) {
+        if (mWindowAboveNavbar
+                && ChromeFeatureList.sCctResizableAlwaysShowNavBarButtons.isEnabled()) {
+            // Resizing while the navbar buttons are visible, at times, flashes the host app.
+            // http://crbug/1360425 fixed this for when the navbar buttons are hidden, so taking
+            // advantage of that fix by hiding for a bit the navigation buttons, during the time the
+            // flashing usually occurs. The navbar buttons need to be visible while resizing so that
+            // the immersive mode confirmation dialog is not displayed, as fixed with
+            // http://crbug/1360453
+            // TODO: http://crbug/1373984 for follow-up on long term solution for fixing host app
+            // flashing issues.
+            if (!show) {
+                changeVisibilityNavbarButtons(false);
+                new Handler().postDelayed(() -> {
+                    changeVisibilityNavbarButtons(true);
+                }, NAVBAR_BUTTON_HIDE_SHOW_DELAY_MS);
+            }
+        } else {
+            changeVisibilityNavbarButtons(show);
+        }
+    }
+
     // TODO(jinsukkim): Explore the way to use androidx.window.WindowManager or
     // androidx.window.java.WindowInfoRepoJavaAdapter once the androidx API get finalized and is
     // available in Chromium to use #getCurrentWindowMetrics()/#currentWindowMetrics() to get the
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java
index 3bc6339..97dac88 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java
@@ -123,6 +123,7 @@
 
     /** Main content view. */
     private ViewGroup mContentView;
+    private View mAnchorView;
 
     /** Whether the user is now allowed to perform searches. */
     private boolean mIsActivityUsable;
@@ -184,7 +185,9 @@
         // Build the search box.
         mSearchBox = (SearchActivityLocationBarLayout) mContentView.findViewById(
                 R.id.search_location_bar);
-        View anchorView = mContentView.findViewById(R.id.toolbar);
+        mAnchorView = mContentView.findViewById(R.id.toolbar);
+        updateAnchorViewLayoutForActiveColorFlag();
+
         OverrideUrlLoadingDelegate overrideUrlLoadingDelegate =
                 (String url, @PageTransition int transition, String postDataType, byte[] postData,
                         boolean incognito) -> {
@@ -198,7 +201,7 @@
             getOnBackPressedDispatcher().addCallback(this, backPressManager.getCallback());
         }
         // clang-format off
-        mLocationBarCoordinator = new LocationBarCoordinator(mSearchBox, anchorView,
+        mLocationBarCoordinator = new LocationBarCoordinator(mSearchBox, mAnchorView,
                 mProfileSupplier, PrivacyPreferencesManagerImpl.getInstance(),
                 mSearchBoxDataProvider, null, new WindowDelegate(getWindow()), getWindowAndroid(),
                 /*activityTabSupplier=*/() -> null, getModalDialogManagerSupplier(),
@@ -558,4 +561,25 @@
     LocationBarCoordinator getLocationBarCoordinatorForTesting() {
         return mLocationBarCoordinator;
     }
+
+    /**
+     * Increase the toolbar vertical height and bottom padding if the omnibox phase 2 active feature
+     * flag is enabled.
+     */
+    private void updateAnchorViewLayoutForActiveColorFlag() {
+        if (!(OmniboxFeatures.shouldShowModernizeVisualUpdate(mAnchorView.getContext())
+                    && OmniboxFeatures.shouldShowActiveColorOnOmnibox())) {
+            return;
+        }
+
+        var layoutParams = mAnchorView.getLayoutParams();
+        layoutParams.height = getResources().getDimensionPixelSize(R.dimen.toolbar_height_no_shadow)
+                + getResources().getDimensionPixelSize(R.dimen.toolbar_url_focus_height_increase);
+        mAnchorView.setLayoutParams(layoutParams);
+
+        mAnchorView.setPaddingRelative(mAnchorView.getPaddingStart(), mAnchorView.getPaddingTop(),
+                mAnchorView.getPaddingEnd(),
+                getResources().getDimensionPixelSize(
+                        R.dimen.toolbar_url_focus_bottom_padding_increase));
+    }
 }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java
index 70ed0271..39a807b 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityLocationBarLayout.java
@@ -42,7 +42,6 @@
 public class SearchActivityLocationBarLayout extends LocationBarLayout {
     private boolean mPendingSearchPromoDecision;
     private boolean mPendingBeginQuery;
-    private boolean mHasWindowFocus;
 
     public SearchActivityLocationBarLayout(Context context, AttributeSet attrs) {
         super(context, attrs, R.layout.location_bar_base);
@@ -74,8 +73,8 @@
         }
         setBackground(backgroundDrawable);
 
-        // Expand status view's left and right space to match the expanded interface on the regular
-        // omnibox.
+        // Expand status view's left and right space, and expand the vertical padding of the
+        // location bar to match the expanded interface on the regular omnibox.
         setUrlFocusChangePercent(1f);
     }
 
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarSecurityIconTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarSecurityIconTest.java
index f7a1c26..85854114 100644
--- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarSecurityIconTest.java
+++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/ToolbarSecurityIconTest.java
@@ -20,10 +20,10 @@
 import org.junit.rules.TestRule;
 import org.junit.runner.RunWith;
 import org.mockito.Mock;
-import org.mockito.Mockito;
 import org.mockito.MockitoAnnotations;
 
 import org.chromium.base.ContextUtils;
+import org.chromium.base.UserDataHost;
 import org.chromium.base.test.BaseJUnit4ClassRunner;
 import org.chromium.base.test.UiThreadTest;
 import org.chromium.base.test.util.Batch;
@@ -33,20 +33,21 @@
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.omnibox.NewTabPageDelegate;
 import org.chromium.chrome.browser.omnibox.SearchEngineLogoUtils;
-import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.TabImpl;
+import org.chromium.chrome.browser.tab.TrustedCdn;
 import org.chromium.chrome.browser.theme.ThemeUtils;
 import org.chromium.chrome.browser.ui.theme.BrandedColorScheme;
 import org.chromium.chrome.test.util.ToolbarUnitTestUtils;
 import org.chromium.chrome.test.util.browser.Features;
-import org.chromium.components.prefs.PrefService;
 import org.chromium.components.security_state.ConnectionSecurityLevel;
 import org.chromium.components.security_state.SecurityStateModel;
 import org.chromium.components.security_state.SecurityStateModelJni;
 import org.chromium.content_public.browser.test.NativeLibraryTestUtils;
 import org.chromium.content_public.browser.test.util.TestThreadUtils;
 
+import java.util.concurrent.ExecutionException;
+
 /**
  * Instrumentation tests for the toolbar security icon.
  */
@@ -80,25 +81,12 @@
     private SearchEngineLogoUtils mSearchEngineLogoUtils;
 
     @Mock
-    private PrefService mMockPrefService;
-    @Mock
     private Profile mMockProfile;
-
-    /**
-     * Set up the lock icon policy for Mock PrefService.
-     * @param isPolicyEnabled If true, omnibox must show the lock icon.
-     */
-    private void setupLockIconPolicyForTests(boolean isPolicyEnabled) {
-        Mockito.when(mMockPrefService.isManagedPreference(
-                             ChromePreferenceKeys.LOCK_ICON_IN_ADDRESS_BAR_ENABLED))
-                .thenReturn(isPolicyEnabled);
-        Mockito.when(mMockPrefService.getBoolean(
-                             ChromePreferenceKeys.LOCK_ICON_IN_ADDRESS_BAR_ENABLED))
-                .thenReturn(isPolicyEnabled);
-    }
+    @Mock
+    private TrustedCdn mTrustedCdn;
 
     @Before
-    public void setUp() {
+    public void setUp() throws ExecutionException {
         MockitoAnnotations.initMocks(this);
 
         NativeLibraryTestUtils.loadNativeLibraryNoBrowserProcess();
@@ -114,10 +102,12 @@
                         mSearchEngineLogoUtils));
         // clang-format on
         Profile.setLastUsedProfileForTesting(mMockProfile);
-        TestThreadUtils.runOnUiThreadBlocking(() -> mLocationBarModel.initializeWithNative());
-
-        doReturn(mMockPrefService).when(mLocationBarModel).getPrefService();
-        setupLockIconPolicyForTests(false);
+        TestThreadUtils.runOnUiThreadBlocking(() -> {
+            mLocationBarModel.initializeWithNative();
+            UserDataHost userDataHost = new UserDataHost();
+            userDataHost.setUserData(TrustedCdn.USER_DATA_KEY, mTrustedCdn);
+            doReturn(userDataHost).when(mTab).getUserDataHost();
+        });
     }
 
     @Test
@@ -125,34 +115,37 @@
     @UiThreadTest
     public void testGetSecurityLevel() {
         assertEquals(ConnectionSecurityLevel.NONE,
-                mLocationBarModel.getSecurityLevel(null, !IS_OFFLINE_PAGE, null));
+                mLocationBarModel.getSecurityLevel(null, !IS_OFFLINE_PAGE));
         assertEquals(ConnectionSecurityLevel.NONE,
-                mLocationBarModel.getSecurityLevel(null, IS_OFFLINE_PAGE, null));
+                mLocationBarModel.getSecurityLevel(null, IS_OFFLINE_PAGE));
         assertEquals(ConnectionSecurityLevel.NONE,
-                mLocationBarModel.getSecurityLevel(mTab, IS_OFFLINE_PAGE, null));
+                mLocationBarModel.getSecurityLevel(mTab, IS_OFFLINE_PAGE));
 
         for (int securityLevel : SECURITY_LEVELS) {
             doReturn(securityLevel).when(mLocationBarModel).getSecurityLevelFromStateModel(any());
             assertEquals("Wrong security level returned for " + securityLevel, securityLevel,
-                    mLocationBarModel.getSecurityLevel(mTab, !IS_OFFLINE_PAGE, null));
+                    mLocationBarModel.getSecurityLevel(mTab, !IS_OFFLINE_PAGE));
         }
 
         doReturn(ConnectionSecurityLevel.SECURE)
                 .when(mLocationBarModel)
                 .getSecurityLevelFromStateModel(any());
+        doReturn("https://example.com").when(mTrustedCdn).getPublisherUrl();
         assertEquals("Wrong security level returned for HTTPS publisher URL",
                 ConnectionSecurityLevel.SECURE,
-                mLocationBarModel.getSecurityLevel(mTab, !IS_OFFLINE_PAGE, "https://example.com"));
+                mLocationBarModel.getSecurityLevel(mTab, !IS_OFFLINE_PAGE));
+        doReturn("http://example.com").when(mTrustedCdn).getPublisherUrl();
         assertEquals("Wrong security level returned for HTTP publisher URL",
                 ConnectionSecurityLevel.WARNING,
-                mLocationBarModel.getSecurityLevel(mTab, !IS_OFFLINE_PAGE, "http://example.com"));
+                mLocationBarModel.getSecurityLevel(mTab, !IS_OFFLINE_PAGE));
 
         doReturn(ConnectionSecurityLevel.DANGEROUS)
                 .when(mLocationBarModel)
                 .getSecurityLevelFromStateModel(any());
+        doReturn(null).when(mTrustedCdn).getPublisherUrl();
         assertEquals("Wrong security level returned for publisher URL on insecure page",
                 ConnectionSecurityLevel.DANGEROUS,
-                mLocationBarModel.getSecurityLevel(mTab, !IS_OFFLINE_PAGE, null));
+                mLocationBarModel.getSecurityLevel(mTab, !IS_OFFLINE_PAGE));
     }
 
     @Test
@@ -221,39 +214,6 @@
     @Test
     @SmallTest
     @UiThreadTest
-    @Feature({"Omnibox"})
-    @Features.EnableFeatures(ChromeFeatureList.OMNIBOX_UPDATED_CONNECTION_SECURITY_INDICATORS)
-    public void testLockIconPolicyDisabled() {
-        setupLockIconPolicyForTests(false);
-
-        assertEquals(R.drawable.omnibox_https_valid_arrow,
-                mLocationBarModel.getSecurityIconResource(ConnectionSecurityLevel.SECURE,
-                        IS_SMALL_DEVICE, !IS_OFFLINE_PAGE, !IS_PAINT_PREVIEW));
-        assertEquals(R.drawable.omnibox_https_valid_arrow,
-                mLocationBarModel.getSecurityIconResource(ConnectionSecurityLevel.SECURE,
-                        !IS_SMALL_DEVICE, !IS_OFFLINE_PAGE, !IS_PAINT_PREVIEW));
-    }
-
-    @Test
-    @SmallTest
-    @UiThreadTest
-    @Feature({"Omnibox"})
-    @Features.EnableFeatures(ChromeFeatureList.OMNIBOX_UPDATED_CONNECTION_SECURITY_INDICATORS)
-    public void testLockIconPolicyEnabled() {
-        setupLockIconPolicyForTests(true);
-
-        // When the policy is enabled, omnibox should keep showing the lock icon.
-        assertEquals(R.drawable.omnibox_https_valid,
-                mLocationBarModel.getSecurityIconResource(ConnectionSecurityLevel.SECURE,
-                        IS_SMALL_DEVICE, !IS_OFFLINE_PAGE, !IS_PAINT_PREVIEW));
-        assertEquals(R.drawable.omnibox_https_valid,
-                mLocationBarModel.getSecurityIconResource(ConnectionSecurityLevel.SECURE,
-                        !IS_SMALL_DEVICE, !IS_OFFLINE_PAGE, !IS_PAINT_PREVIEW));
-    }
-
-    @Test
-    @SmallTest
-    @UiThreadTest
     public void testGetSecurityIconColorWithSecurityLevel_DangerousWebsite() {
         assertEquals(R.color.default_red,
                 mLocationBarModel.getSecurityIconColorWithSecurityLevel(
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd
index 59d094ce..909d689 100644
--- a/chrome/app/generated_resources.grd
+++ b/chrome/app/generated_resources.grd
@@ -12787,6 +12787,12 @@
       <message name="IDS_WEBAUTHN_ERROR_WRONG_KEY_REGISTER_DESCRIPTION" desc="Description in the dialog informing the user that they are trying to register a security key (an external physical device for user authentication) that they have already registered with the given web site before.">
         You already registered this security key. You don't have to register it again.
       </message>
+      <message name="IDS_WEBAUTHN_ERROR_WRONG_DEVICE_TITLE" desc="Title of the dialog informing the user that they are trying to register a passkey on a device that they have already registered with the given web site before.">
+        Try a different device
+      </message>
+      <message name="IDS_WEBAUTHN_ERROR_WRONG_DEVICE_REGISTER_DESCRIPTION" desc="Description in the dialog informing the user that they are trying to register a passkey on a device that they have already registered with the given web site before.">
+        You already registered this device. You don't have to register it again.
+      </message>
       <message name="IDS_WEBAUTHN_ERROR_WRONG_KEY_SIGN_DESCRIPTION" desc="Description in the dialog informing the user that they are trying to use the wrong security key (an external physical device for user authentication) to sign in to a given web site, that is, not the one they have previously registered on that site.">
         You're using a security key that's not registered with this website
       </message>
diff --git a/chrome/app/generated_resources_grd/IDS_WEBAUTHN_ERROR_WRONG_DEVICE_REGISTER_DESCRIPTION.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBAUTHN_ERROR_WRONG_DEVICE_REGISTER_DESCRIPTION.png.sha1
new file mode 100644
index 0000000..8d849ec
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_WEBAUTHN_ERROR_WRONG_DEVICE_REGISTER_DESCRIPTION.png.sha1
@@ -0,0 +1 @@
+3cfd451d63b257a1a6982b3a0b0b5efe54f9c318
\ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_WEBAUTHN_ERROR_WRONG_DEVICE_TITLE.png.sha1 b/chrome/app/generated_resources_grd/IDS_WEBAUTHN_ERROR_WRONG_DEVICE_TITLE.png.sha1
new file mode 100644
index 0000000..8d849ec
--- /dev/null
+++ b/chrome/app/generated_resources_grd/IDS_WEBAUTHN_ERROR_WRONG_DEVICE_TITLE.png.sha1
@@ -0,0 +1 @@
+3cfd451d63b257a1a6982b3a0b0b5efe54f9c318
\ No newline at end of file
diff --git a/chrome/browser/ash/app_mode/startup_app_launcher_unittest.cc b/chrome/browser/ash/app_mode/startup_app_launcher_unittest.cc
index 143a6219..4d16e525 100644
--- a/chrome/browser/ash/app_mode/startup_app_launcher_unittest.cc
+++ b/chrome/browser/ash/app_mode/startup_app_launcher_unittest.cc
@@ -47,6 +47,7 @@
 #include "extensions/common/extension.h"
 #include "extensions/common/extension_set.h"
 #include "extensions/common/manifest.h"
+#include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h"
 #include "url/gurl.h"
 
 using extensions::ExternalInstallInfoFile;
@@ -390,6 +391,9 @@
 
     KioskAppManager::InitializeForTesting(this);
 
+    in_process_data_decoder_ =
+        std::make_unique<data_decoder::test::InProcessDataDecoder>();
+
     InitializePrimaryAppState();
 
     extensions::ExtensionServiceTestBase::SetUp();
@@ -415,6 +419,7 @@
     primary_app_provider_->ServiceShutdown();
     secondary_apps_provider_->ServiceShutdown();
     external_apps_loader_handler_.reset();
+    in_process_data_decoder_.reset();
 
     app_launch_tracker_.reset();
 
@@ -628,6 +633,9 @@
   std::unique_ptr<extensions::ExternalProviderImpl> secondary_apps_provider_;
 
   std::unique_ptr<user_manager::ScopedUserManager> user_manager_enabler_;
+
+  std::unique_ptr<data_decoder::test::InProcessDataDecoder>
+      in_process_data_decoder_;
 };
 
 TEST_F(StartupAppLauncherTest, PrimaryAppLaunchFlow) {
diff --git a/chrome/browser/ash/drive/DIR_METADATA b/chrome/browser/ash/drive/DIR_METADATA
new file mode 100644
index 0000000..e9400b87
--- /dev/null
+++ b/chrome/browser/ash/drive/DIR_METADATA
@@ -0,0 +1 @@
+mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chrome/browser/ash/file_manager/copy_or_move_io_task_impl.cc b/chrome/browser/ash/file_manager/copy_or_move_io_task_impl.cc
index 4467330..6462059 100644
--- a/chrome/browser/ash/file_manager/copy_or_move_io_task_impl.cc
+++ b/chrome/browser/ash/file_manager/copy_or_move_io_task_impl.cc
@@ -358,7 +358,7 @@
     size_t idx,
     base::FileErrorOr<storage::FileSystemURL> destination_result) {
   DCHECK(idx < progress_.sources.size());
-  if (destination_result.is_error()) {
+  if (!destination_result.has_value()) {
     progress_.outputs.emplace_back(progress_.destination_folder, absl::nullopt);
     OnCopyOrMoveComplete(idx, destination_result.error());
     return;
diff --git a/chrome/browser/ash/file_manager/extract_io_task.cc b/chrome/browser/ash/file_manager/extract_io_task.cc
index ba7dfcf..1b8b62c 100644
--- a/chrome/browser/ash/file_manager/extract_io_task.cc
+++ b/chrome/browser/ash/file_manager/extract_io_task.cc
@@ -172,7 +172,7 @@
     base::FileErrorOr<storage::FileSystemURL> destination_result) {
   DCHECK(index < progress_.sources.size());
   const base::FilePath source_file = progress_.sources[index].url.path();
-  if (destination_result.is_error()) {
+  if (!destination_result.has_value()) {
     ZipExtractCallback(base::FilePath(), false);
   } else {
     const base::FilePath destination_directory =
diff --git a/chrome/browser/ash/file_manager/fileapi_util.cc b/chrome/browser/ash/file_manager/fileapi_util.cc
index 4fc183c..d4457c82 100644
--- a/chrome/browser/ash/file_manager/fileapi_util.cc
+++ b/chrome/browser/ash/file_manager/fileapi_util.cc
@@ -475,7 +475,7 @@
     return;
   } else if (error != base::File::FILE_OK &&
              error != base::File::FILE_ERROR_NOT_A_DIRECTORY) {
-    std::move(callback).Run(error);
+    std::move(callback).Run(base::unexpected(error));
     return;
   }
 
@@ -687,7 +687,8 @@
     base::OnceCallback<void(base::FileErrorOr<storage::FileSystemURL>)>
         callback) {
   if (filename.empty() || filename != filename.BaseName()) {
-    std::move(callback).Run(base::File::FILE_ERROR_INVALID_OPERATION);
+    std::move(callback).Run(
+        base::unexpected(base::File::FILE_ERROR_INVALID_OPERATION));
     return;
   }
 
diff --git a/chrome/browser/ash/file_manager/fileapi_util_unittest.cc b/chrome/browser/ash/file_manager/fileapi_util_unittest.cc
index 7ffcfd485c..fdac5734 100644
--- a/chrome/browser/ash/file_manager/fileapi_util_unittest.cc
+++ b/chrome/browser/ash/file_manager/fileapi_util_unittest.cc
@@ -418,12 +418,12 @@
       root_url, base::FilePath(target_filename), file_system_context,
       base::BindLambdaForTesting(
           [&](base::FileErrorOr<storage::FileSystemURL> result) {
-            if (expected.is_error()) {
-              EXPECT_TRUE(result.is_error())
+            if (!expected.has_value()) {
+              EXPECT_FALSE(result.has_value())
                   << "Unexpected result " << result->ToGURL();
               EXPECT_EQ(expected.error(), result.error());
             } else {
-              EXPECT_FALSE(result.is_error())
+              EXPECT_TRUE(result.has_value())
                   << "Unexpected error " << result.error();
               EXPECT_EQ(temp_file_system->CreateFileSystemURL(expected.value())
                             .ToGURL(),
@@ -489,9 +489,11 @@
 }
 
 TEST_F(FileManagerFileAPIUtilTest, GenerateUnusedFilenameInvalidFilename) {
-  TestGenerateUnusedFilename({}, "", base::File::FILE_ERROR_INVALID_OPERATION);
-  TestGenerateUnusedFilename({}, "path/with/slashes",
-                             base::File::FILE_ERROR_INVALID_OPERATION);
+  TestGenerateUnusedFilename(
+      {}, "", base::unexpected(base::File::FILE_ERROR_INVALID_OPERATION));
+  TestGenerateUnusedFilename(
+      {}, "path/with/slashes",
+      base::unexpected(base::File::FILE_ERROR_INVALID_OPERATION));
 }
 
 TEST_F(FileManagerFileAPIUtilTest, GenerateUnusedFilenameFileSystemProvider) {
@@ -542,7 +544,7 @@
       context,
       base::BindLambdaForTesting(
           [&](base::FileErrorOr<storage::FileSystemURL> result) {
-            EXPECT_FALSE(result.is_error())
+            EXPECT_TRUE(result.has_value())
                 << "Unexpected error " << result.error();
             EXPECT_EQ(expected_url.ToGURL(), result->ToGURL());
             run_loop.Quit();
diff --git a/chrome/browser/ash/file_manager/restore_io_task.cc b/chrome/browser/ash/file_manager/restore_io_task.cc
index 40dce42..2471526 100644
--- a/chrome/browser/ash/file_manager/restore_io_task.cc
+++ b/chrome/browser/ash/file_manager/restore_io_task.cc
@@ -128,7 +128,7 @@
 void RestoreIOTask::EnsureParentRestorePathExists(
     size_t idx,
     base::FileErrorOr<trash::ParsedTrashInfoData> parsed_data) {
-  if (parsed_data.is_error()) {
+  if (!parsed_data.has_value()) {
     progress_.sources[idx].error = parsed_data.error();
     Complete(State::kError);
     return;
@@ -180,7 +180,7 @@
   storage::FileSystemURL source_url =
       CreateFileSystemURL(progress_.sources[idx].url,
                           MakeRelativeFromBasePath(trashed_file_location));
-  if (destination_result.is_error()) {
+  if (!destination_result.has_value()) {
     progress_.outputs.emplace_back(source_url, absl::nullopt);
     OnRestoreItem(idx, destination_result.error());
     return;
diff --git a/chrome/browser/ash/file_manager/restore_to_destination_io_task.cc b/chrome/browser/ash/file_manager/restore_to_destination_io_task.cc
index 988331d..f281936 100644
--- a/chrome/browser/ash/file_manager/restore_to_destination_io_task.cc
+++ b/chrome/browser/ash/file_manager/restore_to_destination_io_task.cc
@@ -110,7 +110,7 @@
 void RestoreToDestinationIOTask::OnTrashInfoParsed(
     size_t idx,
     base::FileErrorOr<trash::ParsedTrashInfoData> parsed_data) {
-  if (parsed_data.is_error()) {
+  if (!parsed_data.has_value()) {
     progress_.sources[idx].error = parsed_data.error();
     Complete(State::kError);
     return;
diff --git a/chrome/browser/ash/file_manager/trash_info_validator.cc b/chrome/browser/ash/file_manager/trash_info_validator.cc
index 19e476a..9cb43ef 100644
--- a/chrome/browser/ash/file_manager/trash_info_validator.cc
+++ b/chrome/browser/ash/file_manager/trash_info_validator.cc
@@ -20,7 +20,7 @@
 
 void RunCallbackWithError(base::File::Error error,
                           ValidateAndParseTrashInfoCallback callback) {
-  std::move(callback).Run(base::FileErrorOr<ParsedTrashInfoData>(error));
+  std::move(callback).Run(base::unexpected(error));
 }
 
 }  // namespace
@@ -147,8 +147,7 @@
   parsed_data.absolute_restore_path = std::move(absolute_restore_path);
   parsed_data.deletion_date = std::move(deletion_date);
 
-  std::move(callback).Run(
-      base::FileErrorOr<ParsedTrashInfoData>(std::move(parsed_data)));
+  std::move(callback).Run(std::move(parsed_data));
 }
 
 }  // namespace file_manager::trash
diff --git a/chrome/browser/ash/file_manager/trash_io_task.cc b/chrome/browser/ash/file_manager/trash_io_task.cc
index 0b612e3..118ee56 100644
--- a/chrome/browser/ash/file_manager/trash_io_task.cc
+++ b/chrome/browser/ash/file_manager/trash_io_task.cc
@@ -477,7 +477,7 @@
     size_t output_idx,
     const storage::FileSystemURL& files_folder_location,
     base::FileErrorOr<storage::FileSystemURL> destination_result) {
-  if (destination_result.is_error()) {
+  if (!destination_result.has_value()) {
     progress_.outputs.emplace_back(files_folder_location, absl::nullopt);
     TrashComplete(source_idx, output_idx, destination_result.error());
     return;
diff --git a/chrome/browser/ash/file_manager/zip_io_task.cc b/chrome/browser/ash/file_manager/zip_io_task.cc
index ed5f929..a09a5f3 100644
--- a/chrome/browser/ash/file_manager/zip_io_task.cc
+++ b/chrome/browser/ash/file_manager/zip_io_task.cc
@@ -195,7 +195,7 @@
 // Starts the zip operation.
 void ZipIOTask::ZipItems(
     base::FileErrorOr<storage::FileSystemURL> destination_result) {
-  if (destination_result.is_error()) {
+  if (!destination_result.has_value()) {
     progress_.outputs.emplace_back(progress_.destination_folder,
                                    destination_result.error());
     Complete(State::kError);
diff --git a/chrome/browser/ash/fusebox/DIR_METADATA b/chrome/browser/ash/fusebox/DIR_METADATA
new file mode 100644
index 0000000..e9400b87
--- /dev/null
+++ b/chrome/browser/ash/fusebox/DIR_METADATA
@@ -0,0 +1 @@
+mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chrome/browser/ash/login/demo_mode/demo_session.cc b/chrome/browser/ash/login/demo_mode/demo_session.cc
index 1b0c46f..41ec5d8 100644
--- a/chrome/browser/ash/login/demo_mode/demo_session.cc
+++ b/chrome/browser/ash/login/demo_mode/demo_session.cc
@@ -629,6 +629,13 @@
   }
 }
 
+base::FilePath DemoSession::GetDemoAppComponentPath() {
+  DCHECK(!DemoSession::default_demo_app_component_path_.empty());
+  return base::FilePath(GetSwitchOrDefault(
+      switches::kDemoModeSwaContentDirectory,
+      DemoSession::default_demo_app_component_path_.value()));
+}
+
 void LaunchDemoSystemWebApp() {
   // SystemWebAppManager won't run this callback if the profile is destroyed,
   // so we don't need to worry about there being no active user profile
@@ -644,7 +651,7 @@
                  << static_cast<int>(error);
     return;
   }
-  demo_app_component_path_ = path;
+  default_demo_app_component_path_ = path;
   Profile* profile = ProfileManager::GetActiveUserProfile();
   ash::SystemWebAppManager::Get(profile)->on_apps_synchronized().Post(
       FROM_HERE, base::BindOnce(&LaunchDemoSystemWebApp));
diff --git a/chrome/browser/ash/login/demo_mode/demo_session.h b/chrome/browser/ash/login/demo_mode/demo_session.h
index beba01c..d69d5ed 100644
--- a/chrome/browser/ash/login/demo_mode/demo_session.h
+++ b/chrome/browser/ash/login/demo_mode/demo_session.h
@@ -177,10 +177,13 @@
 
   bool started() const { return started_; }
 
-  base::FilePath DemoAppComponentPath() {
-    DCHECK(!demo_app_component_path_.empty());
-    return demo_app_component_path_;
-  }
+  // Returns the Demo App component path, which defines the directory that the
+  // Demo Mode SWA should source its content from.
+  // If the demo-mode-swa-content-directory switch is set, we retrieve the
+  // content from there. Otherwise, the default location at
+  // /run/imageloader/demo-mode-app is used. When copying the directory to a
+  // custom location, make sure the permissions are set to 555.
+  base::FilePath GetDemoAppComponentPath();
 
   const DemoResources* resources() const { return demo_resources_.get(); }
 
@@ -262,7 +265,7 @@
   bool splash_screen_removed_ = false;
   bool screensaver_activated_ = false;
 
-  base::FilePath demo_app_component_path_;
+  base::FilePath default_demo_app_component_path_;
 
   base::WeakPtrFactory<DemoSession> weak_ptr_factory_{this};
 };
diff --git a/chrome/browser/ash/login/ui/login_display_mojo.cc b/chrome/browser/ash/login/ui/login_display_mojo.cc
index 6d28cef..a3561ef 100644
--- a/chrome/browser/ash/login/ui/login_display_mojo.cc
+++ b/chrome/browser/ash/login/ui/login_display_mojo.cc
@@ -79,8 +79,10 @@
     // Enable pin and challenge-response authentication for any users who can
     // use them.
     for (const user_manager::User* user : filtered_users) {
-      UpdatePinKeyboardState(user->GetAccountId());
-      UpdateChallengeResponseAuthAvailability(user->GetAccountId());
+      if (!user->IsDeviceLocalAccount()) {
+        UpdatePinKeyboardState(user->GetAccountId());
+        UpdateChallengeResponseAuthAvailability(user->GetAccountId());
+      }
     }
   }
 
diff --git a/chrome/browser/ash/login/users/avatar/user_image_loader.cc b/chrome/browser/ash/login/users/avatar/user_image_loader.cc
index 685a637..c8bec3e7 100644
--- a/chrome/browser/ash/login/users/avatar/user_image_loader.cc
+++ b/chrome/browser/ash/login/users/avatar/user_image_loader.cc
@@ -16,14 +16,25 @@
 #include "base/task/sequenced_task_runner.h"
 #include "base/task/single_thread_task_runner.h"
 #include "base/task/task_runner_util.h"
+#include "base/task/thread_pool.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "chrome/browser/ash/login/helper.h"
+#include "chrome/browser/browser_process.h"
 #include "chrome/browser/ui/ash/image_downloader_impl.h"
 #include "components/user_manager/user_image/user_image.h"
+#include "ipc/ipc_channel.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
+#include "services/data_decoder/public/cpp/data_decoder.h"
+#include "services/data_decoder/public/cpp/decode_image.h"
+#include "services/data_decoder/public/mojom/image_decoder.mojom.h"
+#include "services/network/public/cpp/resource_request.h"
+#include "services/network/public/cpp/shared_url_loader_factory.h"
+#include "services/network/public/cpp/simple_url_loader.h"
 #include "skia/ext/image_operations.h"
 #include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/skia/include/encode/SkWebpEncoder.h"
 #include "ui/gfx/codec/png_codec.h"
+#include "ui/gfx/codec/webp_codec.h"
 #include "ui/gfx/skbitmap_operations.h"
 #include "url/gurl.h"
 
@@ -31,6 +42,9 @@
 namespace user_image_loader {
 namespace {
 
+constexpr int64_t kMaxImageSizeInBytes =
+    static_cast<int64_t>(IPC::Channel::kMaximumMessageSize);
+
 // Contains attributes we need to know about each image we decode.
 struct ImageInfo {
   ImageInfo(const base::FilePath& file_path,
@@ -236,11 +250,112 @@
   ImageDecoder::StartWithOptions(image_request, *data, codec, false);
 }
 
-void OnImageDownloaded(LoadedCallback loaded_cb,
-                       const gfx::ImageSkia& image_skia) {
-  std::move(loaded_cb).Run(user_manager::UserImage::CreateAndEncode(
-      image_skia,
-      user_manager::UserImage::ChooseImageFormat(*image_skia.bitmap())));
+void OnAnimationDecoded(
+    LoadedCallback loaded_cb,
+    std::vector<data_decoder::mojom::AnimationFramePtr> mojo_frames) {
+  auto frame_size = mojo_frames.size();
+  if (!frame_size) {
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(loaded_cb),
+                                  std::make_unique<user_manager::UserImage>()));
+    return;
+  }
+
+  // Re-encode static image as PNG and send to requester.
+  if (frame_size == 1) {
+    base::ThreadPool::PostTaskAndReplyWithResult(
+        FROM_HERE,
+        base::BindOnce(
+            [](const SkBitmap& bitmap) {
+              auto encoded = base::MakeRefCounted<base::RefCountedBytes>();
+              if (!gfx::PNGCodec::EncodeBGRASkBitmap(
+                      bitmap, /*discard_transparency=*/false,
+                      &encoded->data())) {
+                return std::make_unique<user_manager::UserImage>();
+              }
+
+              auto image_skia = gfx::ImageSkia::CreateFrom1xBitmap(bitmap);
+              image_skia.MakeThreadSafe();
+
+              auto user_image = std::make_unique<user_manager::UserImage>(
+                  image_skia, encoded, user_manager::UserImage::FORMAT_PNG);
+              user_image->MarkAsSafe();
+
+              return user_image;
+            },
+            mojo_frames[0]->bitmap),
+        std::move(loaded_cb));
+    return;
+  }
+
+  // The image is animated, re-encode as WebP animated image and send to
+  // requester.
+  std::vector<gfx::WebpCodec::Frame> frames;
+  for (auto& mojo_frame : mojo_frames) {
+    gfx::WebpCodec::Frame frame;
+    frame.bitmap = mojo_frame->bitmap;
+    frame.duration = mojo_frame->duration.InMilliseconds();
+    frames.push_back(frame);
+  }
+
+  base::ThreadPool::PostTaskAndReplyWithResult(
+      FROM_HERE,
+      base::BindOnce(
+          [](const std::vector<gfx::WebpCodec::Frame>& frames) {
+            SkWebpEncoder::Options options;
+            options.fCompression = SkWebpEncoder::Compression::kLossless;
+            // Lower quality under kLossless compression means compress faster
+            // into larger files.
+            options.fQuality = 0;
+
+            auto encoded = gfx::WebpCodec::EncodeAnimated(frames, options);
+            if (!encoded.has_value()) {
+              return std::make_unique<user_manager::UserImage>();
+            }
+
+            auto image_skia =
+                gfx::ImageSkia::CreateFrom1xBitmap(frames[0].bitmap);
+            image_skia.MakeThreadSafe();
+
+            auto bytes =
+                base::MakeRefCounted<base::RefCountedBytes>(encoded.value());
+
+            auto user_image = std::make_unique<user_manager::UserImage>(
+                image_skia, bytes, user_manager::UserImage::FORMAT_WEBP);
+            user_image->MarkAsSafe();
+
+            return user_image;
+          },
+          std::move(frames)),
+      std::move(loaded_cb));
+}
+
+void DecodeAnimation(LoadedCallback loaded_cb, base::StringPiece data) {
+  if (data.empty()) {
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(loaded_cb),
+                                  std::make_unique<user_manager::UserImage>()));
+    return;
+  }
+
+  base::span<const uint8_t> bytes = base::make_span(
+      reinterpret_cast<const uint8_t*>(data.data()), data.size());
+
+  data_decoder::DecodeAnimationIsolated(
+      bytes, /*shrink_to_fit=*/true, kMaxImageSizeInBytes,
+      base::BindOnce(&OnAnimationDecoded, std::move(loaded_cb)));
+}
+
+void OnImageDownloaded(std::unique_ptr<network::SimpleURLLoader> loader,
+                       LoadedCallback loaded_cb,
+                       std::unique_ptr<std::string> body) {
+  if (loader->NetError() != net::OK || !body) {
+    base::ThreadTaskRunnerHandle::Get()->PostTask(
+        FROM_HERE, base::BindOnce(std::move(loaded_cb),
+                                  std::make_unique<user_manager::UserImage>()));
+    return;
+  }
+  DecodeAnimation(std::move(loaded_cb), *body);
 }
 
 }  // namespace
@@ -272,16 +387,30 @@
               background_task_runner, data.get(), true /* data_is_ready */);
 }
 
+void StartWithDataAnimated(base::StringPiece data, LoadedCallback loaded_cb) {
+  DecodeAnimation(std::move(loaded_cb), data);
+}
+
+void StartWithFilePathAnimated(const base::FilePath& file_path,
+                               LoadedCallback loaded_cb) {
+  base::ThreadTaskRunnerHandle::Get()->PostTaskAndReplyWithResult(
+      FROM_HERE,
+      base::BindOnce(
+          [](const base::FilePath& file_path) {
+            std::string data;
+            if (!base::ReadFileToString(file_path, &data)) {
+              return std::string();
+            }
+            return data;
+          },
+          file_path),
+      base::BindOnce(&DecodeAnimation, std::move(loaded_cb)));
+}
+
 // Used to load user images from GURL, specifically in the case of
 // retrieving images from the cloud.
-void StartWithGURL(const GURL& default_image_url, LoadedCallback loaded_cb) {
-  if (!ash::ImageDownloader::Get()) {
-    LOG(ERROR) << "Could not retrieve image downloader for user image";
-    return;
-  }
-
-  ash::ImageDownloader::DownloadCallback download_callback =
-      base::BindOnce(&OnImageDownloaded, std::move(loaded_cb));
+void StartWithGURLAnimated(const GURL& default_image_url,
+                           LoadedCallback loaded_cb) {
   constexpr net::NetworkTrafficAnnotationTag kNetworkTrafficAnnotationTag =
       net::DefineNetworkTrafficAnnotation("user_image_downloader", R"(
             semantics: {
@@ -303,9 +432,25 @@
               policy_exception_justification: "Not implemented."
             })");
 
-  ash::ImageDownloader::Get()->Download(default_image_url,
-                                        kNetworkTrafficAnnotationTag,
-                                        std::move(download_callback));
+  auto request = std::make_unique<network::ResourceRequest>();
+  request->url = default_image_url;
+  request->credentials_mode = network::mojom::CredentialsMode::kOmit;
+
+  auto loader = network::SimpleURLLoader::Create(std::move(request),
+                                                 kNetworkTrafficAnnotationTag);
+  loader->SetRetryOptions(
+      /*max_retries=*/5,
+      network::SimpleURLLoader::RetryMode::RETRY_ON_5XX |
+          network::SimpleURLLoader::RETRY_ON_NETWORK_CHANGE |
+          network::SimpleURLLoader::RETRY_ON_NAME_NOT_RESOLVED);
+
+  auto* loader_ptr = loader.get();
+  loader_ptr->DownloadToString(
+      g_browser_process->shared_url_loader_factory().get(),
+      base::BindOnce(&OnImageDownloaded, std::move(loader),
+                     std::move(loaded_cb)),
+      network::SimpleURLLoader::kMaxBoundedStringDownloadSize);
 }
+
 }  // namespace user_image_loader
 }  // namespace ash
diff --git a/chrome/browser/ash/login/users/avatar/user_image_loader.h b/chrome/browser/ash/login/users/avatar/user_image_loader.h
index a288e24..9a717f9 100644
--- a/chrome/browser/ash/login/users/avatar/user_image_loader.h
+++ b/chrome/browser/ash/login/users/avatar/user_image_loader.h
@@ -50,10 +50,20 @@
     int pixels_per_side,
     LoadedCallback loaded_cb);
 
-// Loads the default image fetched from `default_image_url` and calls
-// `loaded_cb` with the resulting UserImage (which may be empty in case of
-// error).
-void StartWithGURL(const GURL& default_image_url, LoadedCallback loaded_cb);
+// Loads user image from provided |data| bytes. If the image is animated, encode
+// with WebP encoder, otherwise encode with PNG encoder.
+void StartWithDataAnimated(base::StringPiece data, LoadedCallback loaded_cb);
+
+// Loads user image from |file_path|. If the image is animated, encode with WebP
+// encoder, otherwise encode with PNG encoder.
+// TODO(b/251083485): Add support for external image from file.
+void StartWithFilePathAnimated(const base::FilePath& file_path,
+                               LoadedCallback loaded_cb);
+
+// Loads the default image fetched from |default_image_url|. If the image is
+// animated, encode with WebP encoder, otherwise encode with PNG encoder.
+void StartWithGURLAnimated(const GURL& default_image_url,
+                           LoadedCallback loaded_cb);
 
 }  // namespace user_image_loader
 }  // namespace ash
diff --git a/chrome/browser/ash/login/users/avatar/user_image_manager_browsertest.cc b/chrome/browser/ash/login/users/avatar/user_image_manager_browsertest.cc
index 296f72b..1ab0ce4 100644
--- a/chrome/browser/ash/login/users/avatar/user_image_manager_browsertest.cc
+++ b/chrome/browser/ash/login/users/avatar/user_image_manager_browsertest.cc
@@ -371,6 +371,8 @@
   const gfx::ImageSkia& default_image =
       default_user_image::GetDefaultImageDeprecated(
           default_user_image::kFirstDefaultImageIndex);
+  auto scale =
+      ui::ResourceBundle::GetSharedInstance().GetMaxResourceScaleFactor();
 
   run_loop_ = std::make_unique<base::RunLoop>();
   UserImageManager* user_image_manager =
@@ -381,10 +383,17 @@
 
   EXPECT_TRUE(user->HasDefaultImage());
   EXPECT_EQ(default_user_image::kFirstDefaultImageIndex, user->image_index());
-  EXPECT_TRUE(test::AreImagesEqual(default_image, user->GetImage()));
+
   ExpectUserImageInfo(test_account_id1_,
                       default_user_image::kFirstDefaultImageIndex,
-                      GetUserImagePath(test_account_id1_, "jpg"));
+                      GetUserImagePath(test_account_id1_, "png"));
+
+  // Check image dimensions. Images can't be compared since we decode and
+  // re-encode the image bytes.
+  EXPECT_EQ(default_image.GetRepresentation(scale).pixel_width(),
+            user->GetImage().width());
+  EXPECT_EQ(default_image.GetRepresentation(scale).pixel_height(),
+            user->GetImage().height());
 }
 
 // Verifies that SaveUserImage() correctly sets and persists the chosen user
@@ -730,6 +739,8 @@
   const gfx::ImageSkia& default_image =
       default_user_image::GetDefaultImageDeprecated(
           default_user_image::kFirstDefaultImageIndex);
+  auto scale =
+      ui::ResourceBundle::GetSharedInstance().GetMaxResourceScaleFactor();
 
   run_loop_ = std::make_unique<base::RunLoop>();
   UserImageManager* user_image_manager =
@@ -740,10 +751,16 @@
 
   EXPECT_TRUE(user->HasDefaultImage());
   EXPECT_EQ(default_user_image::kFirstDefaultImageIndex, user->image_index());
-  EXPECT_TRUE(test::AreImagesEqual(default_image, user->GetImage()));
+
   ExpectUserImageInfo(enterprise_account_id_,
                       default_user_image::kFirstDefaultImageIndex,
-                      GetUserImagePath(enterprise_account_id_, "jpg"));
+                      GetUserImagePath(enterprise_account_id_, "png"));
+  // Check image dimensions. Images can't be compared since we decode and
+  // re-encode the image bytes.
+  EXPECT_EQ(default_image.GetRepresentation(scale).pixel_width(),
+            user->GetImage().width());
+  EXPECT_EQ(default_image.GetRepresentation(scale).pixel_height(),
+            user->GetImage().height());
 
   // Set policy. Verify that the policy-provided user image is downloaded, set
   // and persisted, overriding the previously set image.
diff --git a/chrome/browser/ash/login/users/avatar/user_image_manager_impl.cc b/chrome/browser/ash/login/users/avatar/user_image_manager_impl.cc
index a503cf2..a425ff43 100644
--- a/chrome/browser/ash/login/users/avatar/user_image_manager_impl.cc
+++ b/chrome/browser/ash/login/users/avatar/user_image_manager_impl.cc
@@ -104,6 +104,8 @@
       return ".jpg";
     case user_manager::UserImage::FORMAT_PNG:
       return ".png";
+    case user_manager::UserImage::FORMAT_WEBP:
+      return ".webp";
     default:
       NOTREACHED() << "Invalid format: " << image_format;
       return ".jpg";
@@ -288,30 +290,30 @@
           !base::DirectoryExists(image_path_)) {
         // Will refactor to remove this redundant call after the feature flag
         // IsAvatarsCloudMigrationEnabled is no longer needed.
-        user_image_loader::StartWithFilePath(
-            parent_->background_task_runner_, image_path_,
-            ChooseCodecFromPath(image_path_),
-            0,  // Do not crop.
-            base::BindOnce(&Job::OnLoadImageDone, weak_factory_.GetWeakPtr(),
-                           false));
+        user_image_loader::StartWithFilePathAnimated(
+            image_path_, base::BindOnce(&Job::OnLoadImageDone,
+                                        weak_factory_.GetWeakPtr(), false));
       } else {
         // Fetch the default image from cloud before caching it.
         image_url_ = default_user_image::GetDefaultImageUrl(image_index_);
-        user_image_loader::StartWithGURL(
+        user_image_loader::StartWithGURLAnimated(
             image_url_, base::BindOnce(&Job::OnLoadImageDone,
                                        weak_factory_.GetWeakPtr(), true));
       }
     } else {
-      gfx::ImageSkia default_image =
-          default_user_image::GetDefaultImageDeprecated(image_index_);
-      std::unique_ptr<user_manager::UserImage> user_image(
-          user_manager::UserImage::CreateAndEncode(
-              default_image, user_manager::UserImage::ChooseImageFormat(
-                                 *default_image.bitmap())));
+      auto& resource_bundle = ui::ResourceBundle::GetSharedInstance();
+      auto data = resource_bundle.GetRawDataResourceForScale(
+          default_user_image::GetDefaultImageResourceId(image_index_),
+          resource_bundle.GetMaxResourceScaleFactor());
+
       // Cache the in-use default image as part of the migration of avatar
       // images to cloud.
-      UpdateUserAndSaveImage(std::move(user_image));
+      user_image_loader::StartWithDataAnimated(
+          data,
+          base::BindOnce(&Job::OnLoadImageDone, weak_factory_.GetWeakPtr(),
+                         /*save=*/true));
     }
+
   } else if (image_index_ == user_manager::User::USER_IMAGE_EXTERNAL ||
              image_index_ == user_manager::User::USER_IMAGE_PROFILE) {
     // Load the user image from a file referenced by `image_path`. This happens
@@ -341,21 +343,20 @@
   if (ash::features::IsAvatarsCloudMigrationEnabled()) {
     // Fetch the default image from cloud before caching it.
     image_url_ = default_user_image::GetDefaultImageUrl(image_index_);
-    user_image_loader::StartWithGURL(
+    user_image_loader::StartWithGURLAnimated(
         image_url_, base::BindOnce(&Job::OnLoadImageDone,
                                    weak_factory_.GetWeakPtr(), true));
   } else {
-    gfx::ImageSkia default_image =
-        default_user_image::GetDefaultImageDeprecated(image_index_);
-    std::unique_ptr<user_manager::UserImage> user_image(
-        user_manager::UserImage::CreateAndEncode(
-            default_image, user_manager::UserImage::ChooseImageFormat(
-                               *default_image.bitmap())));
+    auto& resource_bundle = ui::ResourceBundle::GetSharedInstance();
+    auto data = resource_bundle.GetRawDataResourceForScale(
+        default_user_image::GetDefaultImageResourceId(image_index_),
+        resource_bundle.GetMaxResourceScaleFactor());
 
-    // Now that default images are served from the cloud, the current in-use
-    // user avatar image needs to be saved and cached in local state for
-    // offline usage.
-    UpdateUserAndSaveImage(std::move(user_image));
+    // Cache the in-use default image as part of the migration of avatar
+    // images to cloud.
+    user_image_loader::StartWithDataAnimated(
+        data, base::BindOnce(&Job::OnLoadImageDone, weak_factory_.GetWeakPtr(),
+                             /*save=*/true));
   }
 }
 
diff --git a/chrome/browser/ash/login/users/user_manager_unittest.cc b/chrome/browser/ash/login/users/user_manager_unittest.cc
index 3d4bfe9..0d07ff1 100644
--- a/chrome/browser/ash/login/users/user_manager_unittest.cc
+++ b/chrome/browser/ash/login/users/user_manager_unittest.cc
@@ -38,6 +38,7 @@
 #include "content/public/test/browser_task_environment.h"
 #include "extensions/common/features/feature_session_type.h"
 #include "extensions/common/mojom/feature_session_type.mojom.h"
+#include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
@@ -146,9 +147,13 @@
     wallpaper_controller_client_ =
         std::make_unique<WallpaperControllerClientImpl>();
     wallpaper_controller_client_->InitForTesting(&test_wallpaper_controller_);
+
+    in_process_data_decoder_ =
+        std::make_unique<data_decoder::test::InProcessDataDecoder>();
   }
 
   void TearDown() override {
+    in_process_data_decoder_.reset();
     wallpaper_controller_client_.reset();
 
     // Shut down the DeviceSettingsService.
@@ -234,6 +239,8 @@
       session_type_;
   std::unique_ptr<WallpaperControllerClientImpl> wallpaper_controller_client_;
   TestWallpaperController test_wallpaper_controller_;
+  std::unique_ptr<data_decoder::test::InProcessDataDecoder>
+      in_process_data_decoder_;
 
   content::BrowserTaskEnvironment task_environment_;
 
diff --git a/chrome/browser/ash/smb_client/DIR_METADATA b/chrome/browser/ash/smb_client/DIR_METADATA
index 5345fc2..e9400b87 100644
--- a/chrome/browser/ash/smb_client/DIR_METADATA
+++ b/chrome/browser/ash/smb_client/DIR_METADATA
@@ -1,3 +1 @@
-monorail: {
-  component: "Platform>Apps>FileManager"
-}
+mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.cc
index 0471da7..7fd2f2b 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.cc
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.cc
@@ -24,6 +24,15 @@
 
 namespace ash::personalization_app {
 
+namespace {
+KeyboardBacklightColorController* GetKeyboardBacklightColorController() {
+  auto* keyboard_backlight_color_controller =
+      ash::Shell::Get()->keyboard_backlight_color_controller();
+  DCHECK(keyboard_backlight_color_controller);
+  return keyboard_backlight_color_controller;
+}
+}  // namespace
+
 PersonalizationAppKeyboardBacklightProviderImpl::
     PersonalizationAppKeyboardBacklightProviderImpl(content::WebUI* web_ui)
     : profile_(Profile::FromWebUI(web_ui)) {}
@@ -92,23 +101,6 @@
 }
 
 void PersonalizationAppKeyboardBacklightProviderImpl::
-    SetKeyboardBacklightColorControllerForTesting(
-        KeyboardBacklightColorController* controller) {
-  keyboard_backlight_color_controller_for_testing_ = controller;
-}
-
-KeyboardBacklightColorController*
-PersonalizationAppKeyboardBacklightProviderImpl::
-    GetKeyboardBacklightColorController() {
-  if (keyboard_backlight_color_controller_for_testing_)
-    return keyboard_backlight_color_controller_for_testing_;
-  auto* keyboard_backlight_color_controller =
-      ash::Shell::Get()->keyboard_backlight_color_controller();
-  DCHECK(keyboard_backlight_color_controller);
-  return keyboard_backlight_color_controller;
-}
-
-void PersonalizationAppKeyboardBacklightProviderImpl::
     NotifyBacklightColorChanged() {
   DCHECK(keyboard_backlight_observer_remote_.is_bound());
   keyboard_backlight_observer_remote_->OnBacklightColorChanged(
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.h b/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.h
index fd047ac..05db719 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.h
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.h
@@ -7,7 +7,6 @@
 
 #include "ash/public/cpp/wallpaper/wallpaper_controller.h"
 #include "ash/public/cpp/wallpaper/wallpaper_controller_observer.h"
-#include "ash/system/keyboard_brightness/keyboard_backlight_color_controller.h"
 #include "ash/webui/personalization_app/mojom/personalization_app.mojom.h"
 #include "ash/webui/personalization_app/personalization_app_keyboard_backlight_provider.h"
 #include "base/scoped_observation.h"
@@ -53,23 +52,13 @@
   // WallpaperControllerObserver:
   void OnWallpaperColorsChanged() override;
 
-  // Tests can provide the controller in case it is not initialized in
-  // ash::Shell.
-  void SetKeyboardBacklightColorControllerForTesting(
-      KeyboardBacklightColorController* controller);
-
  private:
-  KeyboardBacklightColorController* GetKeyboardBacklightColorController();
-
   // Notify webUI the current state of backlight color.
   void NotifyBacklightColorChanged();
 
   // Pointer to profile of user that opened personalization SWA. Not owned.
   raw_ptr<Profile> const profile_ = nullptr;
 
-  raw_ptr<KeyboardBacklightColorController>
-      keyboard_backlight_color_controller_for_testing_;
-
   mojo::Receiver<mojom::KeyboardBacklightProvider> keyboard_backlight_receiver_{
       this};
 
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl_unittest.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl_unittest.cc
index 619d192..6100e52 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl_unittest.cc
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl_unittest.cc
@@ -4,10 +4,7 @@
 
 #include "chrome/browser/ash/web_applications/personalization_app/personalization_app_keyboard_backlight_provider_impl.h"
 
-#include <memory>
-
 #include "ash/constants/ash_features.h"
-#include "ash/system/keyboard_brightness/keyboard_backlight_color_controller.h"
 #include "ash/webui/personalization_app/mojom/personalization_app.mojom.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h"
@@ -104,16 +101,11 @@
     keyboard_backlight_provider_ =
         std::make_unique<PersonalizationAppKeyboardBacklightProviderImpl>(
             &web_ui_);
-    keyboard_backlight_color_controller_ =
-        std::make_unique<KeyboardBacklightColorController>();
-    keyboard_backlight_provider_->SetKeyboardBacklightColorControllerForTesting(
-        keyboard_backlight_color_controller_.get());
     keyboard_backlight_provider_->BindInterface(
         keyboard_backlight_provider_remote_.BindNewPipeAndPassReceiver());
   }
 
   void TearDown() override {
-    keyboard_backlight_color_controller_.reset();
     keyboard_backlight_provider_.reset();
     ChromeAshTestBase::TearDown();
   }
@@ -156,8 +148,6 @@
   content::TestWebUI web_ui_;
   std::unique_ptr<content::WebContents> web_contents_;
   TestingProfile* profile_;
-  std::unique_ptr<KeyboardBacklightColorController>
-      keyboard_backlight_color_controller_;
   mojo::Remote<ash::personalization_app::mojom::KeyboardBacklightProvider>
       keyboard_backlight_provider_remote_;
   std::unique_ptr<PersonalizationAppKeyboardBacklightProviderImpl>
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_user_provider_impl_unittest.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_user_provider_impl_unittest.cc
index e7c7fe1..9006388e 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_user_provider_impl_unittest.cc
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_user_provider_impl_unittest.cc
@@ -39,6 +39,7 @@
 #include "mojo/public/cpp/base/big_buffer.h"
 #include "mojo/public/cpp/bindings/receiver.h"
 #include "mojo/public/cpp/bindings/remote.h"
+#include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/skia/include/core/SkColor.h"
@@ -182,6 +183,9 @@
 
     user_provider_->BindInterface(
         user_provider_remote_.BindNewPipeAndPassReceiver());
+
+    in_process_data_decoder_ =
+        std::make_unique<data_decoder::test::InProcessDataDecoder>();
   }
 
   TestingProfile* profile() { return profile_; }
@@ -242,6 +246,8 @@
 
   const base::HistogramTester& histogram_tester() { return histogram_tester_; }
 
+  void RunUntilIdle() { task_environment_.RunUntilIdle(); }
+
  private:
   base::test::ScopedFeatureList scoped_feature_list_;
   content::BrowserTaskEnvironment task_environment_;
@@ -255,6 +261,8 @@
       user_provider_remote_;
   std::unique_ptr<PersonalizationAppUserProviderImpl> user_provider_;
   base::HistogramTester histogram_tester_;
+  std::unique_ptr<data_decoder::test::InProcessDataDecoder>
+      in_process_data_decoder_;
 };
 
 TEST_F(PersonalizationAppUserProviderImplTest, GetsUserInfo) {
@@ -283,6 +291,7 @@
   // Select a default image.
   int image_index = ash::default_user_image::GetRandomDefaultImageIndex();
   user_image_manager()->SaveUserDefaultImageIndex(image_index);
+  RunUntilIdle();
 
   // Observer received the updated image information. Because it is a default
   // image, receives a default image with the right index.
@@ -297,6 +306,7 @@
   int image_index = ash::default_user_image::GetRandomDefaultImageIndex();
   user_provider_remote()->get()->SelectDefaultImage(image_index);
   user_provider_remote()->FlushForTesting();
+  RunUntilIdle();
 
   // Observer received the updated user image of type default with the right
   // index.
@@ -370,6 +380,7 @@
 
   user_provider_remote()->get()->SelectDefaultImage(image_index);
   user_provider_remote()->FlushForTesting();
+  RunUntilIdle();
 
   // Bucket count is incremented after selecting this default image.
   histogram_tester().ExpectBucketCount(
@@ -379,6 +390,7 @@
   // Select the same image again.
   user_provider_remote()->get()->SelectDefaultImage(image_index);
   user_provider_remote()->FlushForTesting();
+  RunUntilIdle();
 
   // Bucket count is not incremented.
   histogram_tester().ExpectBucketCount(
@@ -423,6 +435,7 @@
   // Select a default image first to make sure profile is not selected.
   user_provider_remote()->get()->SelectDefaultImage(
       ash::default_user_image::GetRandomDefaultImageIndex());
+  RunUntilIdle();
   // Now select profile.
   user_provider_remote()->get()->SelectProfileImage();
   user_provider_remote()->FlushForTesting();
@@ -457,6 +470,7 @@
   user_provider_remote()->get()->SelectDefaultImage(
       ash::default_user_image::GetRandomDefaultImageIndex());
   user_provider_remote()->FlushForTesting();
+  RunUntilIdle();
 
   histogram_tester().ExpectBucketCount(
       ash::UserImageManager::kUserImageChangedHistogramName,
@@ -499,6 +513,7 @@
   user_image_manager()->SaveUserDefaultImageIndex(
       kDeprecatedImageWithSourceInfoIndex);
   SetUserImageObserver();
+  RunUntilIdle();
 
   absl::optional<default_user_image::DeprecatedSourceInfo>
       expected_source_info =
diff --git a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
index 6819050..2bb5849 100644
--- a/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
+++ b/chrome/browser/chromeos/extensions/file_manager/private_api_file_system.cc
@@ -2038,7 +2038,7 @@
   url::Origin origin = render_frame_host()->GetLastCommittedOrigin();
 
   for (auto& trash_info_data : parsed_data) {
-    if (trash_info_data.is_error()) {
+    if (!trash_info_data.has_value()) {
       LOG(ERROR) << "Failed parsing trashinfo file: "
                  << trash_info_data.error();
       continue;
diff --git a/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_apitest.cc b/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_apitest.cc
index eefbbe2..915f5d4 100644
--- a/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_apitest.cc
+++ b/chrome/browser/chromeos/extensions/file_system_provider/file_system_provider_apitest.cc
@@ -359,6 +359,13 @@
       << message_;
 }
 
+IN_PROC_BROWSER_TEST_F(FileSystemProviderServiceWorkerApiTest, Configure) {
+  ASSERT_TRUE(RunExtensionTest("file_system_provider/service_worker/configure",
+                               {.extension_url = "test.html"},
+                               {.load_as_component = true}))
+      << message_;
+}
+
 IN_PROC_BROWSER_TEST_F(FileSystemProviderServiceWorkerApiTest, CopyEntry) {
   ASSERT_TRUE(RunExtensionTest("file_system_provider/service_worker/copy_entry",
                                {.extension_url = "test.html"},
@@ -373,6 +380,13 @@
       << message_;
 }
 
+IN_PROC_BROWSER_TEST_F(FileSystemProviderServiceWorkerApiTest, MoveEntry) {
+  ASSERT_TRUE(RunExtensionTest("file_system_provider/service_worker/move_entry",
+                               {.extension_url = "test.html"},
+                               {.load_as_component = true}))
+      << message_;
+}
+
 IN_PROC_BROWSER_TEST_F(FileSystemProviderServiceWorkerApiTest, GetAll) {
   ASSERT_TRUE(RunExtensionTest("file_system_provider/service_worker/get_all",
                                {.extension_url = "test.html"},
diff --git a/chrome/browser/chromeos/extensions/wm/wm_desks_private_api.cc b/chrome/browser/chromeos/extensions/wm/wm_desks_private_api.cc
index 6934294..e9efe52 100644
--- a/chrome/browser/chromeos/extensions/wm/wm_desks_private_api.cc
+++ b/chrome/browser/chromeos/extensions/wm/wm_desks_private_api.cc
@@ -8,6 +8,7 @@
 
 #include "ash/public/cpp/desk_template.h"
 #include "ash/wm/desks/desk.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/values.h"
 #include "chrome/browser/profiles/profile.h"
@@ -19,6 +20,11 @@
 namespace {
 
 constexpr char kInvalidUuidError[] = "Invalid template UUID.";
+constexpr char kInvalidDeskIdError[] = "The desk identifier is not valid.";
+constexpr char kApiLaunchDeskResult[] = "Ash.DeskApi.LaunchDesk.Result";
+constexpr char kApiRemoveDeskResult[] = "Ash.DeskApi.RemoveDesk.Result";
+constexpr char kApiSwitchDeskResult[] = "Ash.DeskApi.SwitchDesk.Result";
+constexpr char kApiAllDeskResult[] = "Ash.DeskApi.AllDesk.Result";
 
 api::wm_desks_private::Desk FromAshDesk(const ash::Desk& ash_desk) {
   api::wm_desks_private::Desk target;
@@ -94,10 +100,11 @@
     std::string error_string,
     const base::GUID& desk_uuid) {
   if (!error_string.empty()) {
+    base::UmaHistogramBoolean(kApiLaunchDeskResult, false);
     Respond(Error(std::move(error_string)));
     return;
   }
-
+  base::UmaHistogramBoolean(kApiLaunchDeskResult, true);
   Respond(ArgumentList(api::wm_desks_private::LaunchDesk::Results::Create(
       desk_uuid.AsLowercaseString())));
 }
@@ -119,10 +126,12 @@
 
 void WmDesksPrivateRemoveDeskFunction::OnRemoveDesk(std::string error_string) {
   if (!error_string.empty()) {
+    base::UmaHistogramBoolean(kApiRemoveDeskResult, false);
     Respond(Error(std::move(error_string)));
     return;
   }
 
+  base::UmaHistogramBoolean(kApiRemoveDeskResult, true);
   Respond(NoArguments());
 }
 
@@ -175,9 +184,11 @@
 void WmDesksPrivateSetWindowPropertiesFunction::OnSetWindowProperties(
     std::string error_string) {
   if (!error_string.empty()) {
+    base::UmaHistogramBoolean(kApiAllDeskResult, false);
     Respond(Error(std::move(error_string)));
     return;
   }
+  base::UmaHistogramBoolean(kApiAllDeskResult, true);
   Respond(NoArguments());
 }
 
@@ -303,9 +314,10 @@
       api::wm_desks_private::SwitchDesk::Params::Create(args()));
   EXTENSION_FUNCTION_VALIDATE(params);
   base::GUID uuid = base::GUID::ParseCaseInsensitive(params->desk_uuid);
-  if (!uuid.is_valid())
-    return RespondNow(Error(kInvalidUuidError));
-
+  if (!uuid.is_valid()) {
+    base::UmaHistogramBoolean(kApiSwitchDeskResult, false);
+    return RespondNow(Error(kInvalidDeskIdError));
+  }
   std::string error = DesksClient::Get()->SwitchDesk(uuid);
   OnSwitchDesk(error);
   return AlreadyResponded();
@@ -314,9 +326,11 @@
 // The interface is to keep compatible with future lacros implementation.
 void WmDesksPrivateSwitchDeskFunction::OnSwitchDesk(std::string error_string) {
   if (!error_string.empty()) {
+    base::UmaHistogramBoolean(kApiSwitchDeskResult, false);
     Respond(Error(std::move(error_string)));
     return;
   }
+  base::UmaHistogramBoolean(kApiSwitchDeskResult, true);
   Respond(NoArguments());
 }
 
diff --git a/chrome/browser/chromeos/extensions/wm/wm_desks_private_apitest.cc b/chrome/browser/chromeos/extensions/wm/wm_desks_private_apitest.cc
index f6d7295..56ed576 100644
--- a/chrome/browser/chromeos/extensions/wm/wm_desks_private_apitest.cc
+++ b/chrome/browser/chromeos/extensions/wm/wm_desks_private_apitest.cc
@@ -7,6 +7,7 @@
 #include "ash/wm/desks/desks_test_util.h"
 #include "base/guid.h"
 #include "base/memory/scoped_refptr.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "build/build_config.h"
 #include "chrome/browser/chromeos/extensions/wm/wm_desks_private_api.h"
 #include "chrome/browser/extensions/extension_apitest.h"
@@ -49,6 +50,7 @@
       base::MakeRefCounted<WmDesksPrivateLaunchDeskFunction>();
 
   ash::DeskSwitchAnimationWaiter launch_waiter;
+  base::HistogramTester histogram_tester;
   // The RunFunctionAndReturnSingleResult already asserts no error
   auto desk_id =
       extension_function_test_utils::RunFunctionAndReturnSingleResult(
@@ -57,6 +59,7 @@
   EXPECT_TRUE(
       base::GUID::ParseCaseInsensitive(desk_id->GetString()).is_valid());
 
+  histogram_tester.ExpectBucketCount("Ash.DeskApi.LaunchDesk.Result", 1, 1);
   // Waiting for desk launch animation to settle
   // The check is necessary as both desk animation and extension function is
   // async. There is no guarantee which ones execute first.
@@ -73,6 +76,7 @@
       R"([")" + desk_id->GetString() + R"(", { "combineDesks": false }])",
       new_browser);
 
+  histogram_tester.ExpectBucketCount("Ash.DeskApi.RemoveDesk.Result", 1, 1);
   // Waiting for desk removal animation to settle
   if (ash::DesksController::Get()->AreDesksBeingModified()) {
     remove_waiter.Wait();
@@ -112,7 +116,7 @@
 // Tests switch to different desk show trigger animation.
 IN_PROC_BROWSER_TEST_F(WmDesksPrivateApiTest, SwitchToDifferentDeskTest) {
   Browser* new_browser = CreateBrowser(browser()->profile());
-
+  base::HistogramTester histogram_tester;
   // Get the active desk.
   auto get_active_desk_function =
       base::MakeRefCounted<WmDesksPrivateGetActiveDeskFunction>();
@@ -136,6 +140,7 @@
   EXPECT_TRUE(desk_id_1->is_string());
   EXPECT_TRUE(
       base::GUID::ParseCaseInsensitive(desk_id_1->GetString()).is_valid());
+  histogram_tester.ExpectBucketCount("Ash.DeskApi.LaunchDesk.Result", 1, 1);
 
   // Waiting for desk launch animation to settle
   if (ash::DesksController::Get()->AreDesksBeingModified()) {
@@ -164,6 +169,7 @@
           get_active_desk_function_.get(), "[]", new_browser);
   EXPECT_TRUE(desk_id_2->is_string());
   EXPECT_EQ(desk_id->GetString(), desk_id_2->GetString());
+  histogram_tester.ExpectBucketCount("Ash.DeskApi.SwitchDesk.Result", 1, 1);
 }
 
 // Tests switch to current desk should skip animation.
@@ -197,4 +203,74 @@
   EXPECT_TRUE(desk_id_1->is_string());
   EXPECT_EQ(desk_id->GetString(), desk_id_1->GetString());
 }
+
+// Tests launch desks failed.
+IN_PROC_BROWSER_TEST_F(WmDesksPrivateApiTest,
+                       LaunchDeskWhenMaxNumberExceedTest) {
+  Browser* new_browser = CreateBrowser(browser()->profile());
+
+  // Max number of desks allowed is 8.
+  const int kMaxDeskIndex = 7;
+  for (int i = 0; i < kMaxDeskIndex; i++) {
+    ash::DesksController::Get()->NewDesk(ash::DesksCreationRemovalSource::kApi);
+  }
+
+  // Launch a desk.
+  auto launch_desk_function =
+      base::MakeRefCounted<WmDesksPrivateLaunchDeskFunction>();
+
+  base::HistogramTester histogram_tester;
+  // The RunFunctionAndReturnSingleResult already asserts no error
+  auto error = extension_function_test_utils::RunFunctionAndReturnError(
+      launch_desk_function.get(), R"([{"deskName":"test"}])", new_browser);
+  EXPECT_EQ(error, "The maximum number of desks is already open.");
+  histogram_tester.ExpectBucketCount("Ash.DeskApi.LaunchDesk.Result", 0, 1);
+}
+
+// Tests remove desks failed.
+IN_PROC_BROWSER_TEST_F(WmDesksPrivateApiTest, RemoveDeskWithInvalidIdTest) {
+  Browser* new_browser = CreateBrowser(browser()->profile());
+
+  base::HistogramTester histogram_tester;
+  // The RunFunctionAndReturnSingleResult already asserts no error
+  auto remove_desk_function =
+      base::MakeRefCounted<WmDesksPrivateRemoveDeskFunction>();
+  auto error = extension_function_test_utils::RunFunctionAndReturnError(
+      remove_desk_function.get(), R"(["invalid-id"])", new_browser);
+
+  EXPECT_EQ(error, "The desk identifier is not valid.");
+  histogram_tester.ExpectBucketCount("Ash.DeskApi.RemoveDesk.Result", 0, 1);
+}
+
+// Tests switch desks failed.
+IN_PROC_BROWSER_TEST_F(WmDesksPrivateApiTest, SwitchDeskWithInvalidIdTest) {
+  Browser* new_browser = CreateBrowser(browser()->profile());
+
+  base::HistogramTester histogram_tester;
+  // Switches to the current desk.
+  auto switch_desk_function =
+      base::MakeRefCounted<WmDesksPrivateSwitchDeskFunction>();
+  auto error = extension_function_test_utils::RunFunctionAndReturnError(
+      switch_desk_function.get(), R"(["invalid-id"])", new_browser);
+
+  EXPECT_EQ(error, "The desk identifier is not valid.");
+  histogram_tester.ExpectBucketCount("Ash.DeskApi.SwitchDesk.Result", 0, 1);
+}
+
+// Tests set all desks with invalid ID.
+IN_PROC_BROWSER_TEST_F(WmDesksPrivateApiTest,
+                       SetAllDesksWindowWithInvalidIdTest) {
+  Browser* new_browser = CreateBrowser(browser()->profile());
+
+  base::HistogramTester histogram_tester;
+  // Switches to the current desk.
+  auto all_desk_function =
+      base::MakeRefCounted<WmDesksPrivateSetWindowPropertiesFunction>();
+  auto error = extension_function_test_utils::RunFunctionAndReturnError(
+      all_desk_function.get(), R"([123,{"allDesks":true}])", new_browser);
+
+  EXPECT_EQ(error, "The window cannot be found.");
+  histogram_tester.ExpectBucketCount("Ash.DeskApi.AllDesk.Result", 0, 1);
+}
+
 }  // namespace extensions
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service.cc b/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service.cc
index 891f46469..30cbdba80 100644
--- a/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service.cc
@@ -17,6 +17,7 @@
 #include "chrome/browser/ash/attestation/tpm_challenge_key_result.h"
 #include "chrome/browser/ash/attestation/tpm_challenge_key_with_timeout.h"
 #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_utils.h"
+#include "chrome/browser/enterprise/connectors/device_trust/common/common_types.h"
 #include "chrome/browser/enterprise/connectors/device_trust/common/metrics_utils.h"
 
 namespace enterprise_connectors {
@@ -52,7 +53,8 @@
     AttestationCallback callback) {
   std::string signals_json;
   if (!base::JSONWriter::Write(signals, &signals_json)) {
-    std::move(callback).Run(std::string());
+    std::move(callback).Run(
+        {std::string(), DTAttestationResult::kFailedToSerializeSignals});
     return;
   }
 
@@ -78,11 +80,11 @@
   if (result.IsSuccess()) {
     encoded_response =
         ProtobufChallengeToJsonChallenge(result.challenge_response);
-    LogAttestationResult(DTAttestationResult::kSuccess);
-  } else {
-    LogAttestationResult(ToAttestationResult(result.result_code));
   }
-  std::move(callback).Run(encoded_response);
+  std::move(callback).Run(
+      {encoded_response, encoded_response.empty()
+                             ? ToAttestationResult(result.result_code)
+                             : DTAttestationResult::kSuccess});
 }
 
 }  // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service_unittest.cc
index 6f1b1a9..bc67a87c 100644
--- a/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/attestation/ash/ash_attestation_service_unittest.cc
@@ -17,6 +17,7 @@
 #include "chrome/browser/ash/attestation/tpm_challenge_key.h"
 #include "chrome/browser/ash/attestation/tpm_challenge_key_result.h"
 #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_utils.h"
+#include "chrome/browser/enterprise/connectors/device_trust/common/common_types.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/base/testing_profile_manager.h"
@@ -123,9 +124,12 @@
 
 TEST_F(AshAttestationServiceTest, BuildChallengeResponse_Success) {
   base::RunLoop run_loop;
-  auto callback =
-      base::BindLambdaForTesting([&](const std::string& challenge_response) {
+  auto callback = base::BindLambdaForTesting(
+      [&](const AttestationResponse& attestation_response) {
+        auto challenge_response = attestation_response.challenge_response;
         ASSERT_FALSE(challenge_response.empty());
+        EXPECT_EQ(attestation_response.result_code,
+                  DTAttestationResult::kSuccess);
         auto parsed_value = ParseValueFromResponse(challenge_response);
         ASSERT_TRUE(parsed_value.has_value());
         EXPECT_EQ(kFakeResponse, parsed_value.value());
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/common/BUILD.gn b/chrome/browser/enterprise/connectors/device_trust/attestation/common/BUILD.gn
index 9345434..3d5c5240 100644
--- a/chrome/browser/enterprise/connectors/device_trust/attestation/common/BUILD.gn
+++ b/chrome/browser/enterprise/connectors/device_trust/attestation/common/BUILD.gn
@@ -43,6 +43,7 @@
   public_deps = [
     ":common",
     ":types",
+    "//chrome/browser/enterprise/connectors/device_trust/common",
     "//testing/gmock",
   ]
 }
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_service.h b/chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_service.h
index 9a29b62..be6d3d4 100644
--- a/chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_service.h
+++ b/chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_service.h
@@ -14,11 +14,14 @@
 
 namespace enterprise_connectors {
 
+struct AttestationResponse;
+
 // Interface for classes in charge of building challenge-responses to enable
 // handshake between Chrome, an IdP and Verified Access.
 class AttestationService {
  public:
-  using AttestationCallback = base::OnceCallback<void(const std::string&)>;
+  using AttestationCallback =
+      base::OnceCallback<void(const AttestationResponse&)>;
 
   virtual ~AttestationService() = default;
 
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/common/mock_attestation_service.h b/chrome/browser/enterprise/connectors/device_trust/attestation/common/mock_attestation_service.h
index 1280acc..21932895 100644
--- a/chrome/browser/enterprise/connectors/device_trust/attestation/common/mock_attestation_service.h
+++ b/chrome/browser/enterprise/connectors/device_trust/attestation/common/mock_attestation_service.h
@@ -9,6 +9,7 @@
 
 #include "base/values.h"
 #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_service.h"
+#include "chrome/browser/enterprise/connectors/device_trust/common/common_types.h"
 #include "testing/gmock/include/gmock/gmock.h"
 
 namespace enterprise_connectors {
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service.cc b/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service.cc
index 3cdf880..439308b 100644
--- a/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service.cc
@@ -18,6 +18,7 @@
 #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/proto/device_trust_attestation_ca.pb.h"
 #include "chrome/browser/enterprise/connectors/device_trust/attestation/desktop/crypto_utility.h"
 #include "chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_switches.h"
+#include "chrome/browser/enterprise/connectors/device_trust/common/common_types.h"
 #include "chrome/browser/enterprise/connectors/device_trust/common/metrics_utils.h"
 #include "components/device_signals/core/common/signals_constants.h"
 #include "components/enterprise/browser/controller/browser_dm_token_storage.h"
@@ -136,8 +137,8 @@
   if (!exported_key) {
     // No key is available, so mark the device as untrusted (no challenge
     // response).
-    LogAttestationResult(DTAttestationResult::kMissingSigningKey);
-    std::move(callback).Run(std::string());
+    std::move(callback).Run(
+        {std::string(), DTAttestationResult::kMissingSigningKey});
     return;
   }
 
@@ -146,8 +147,8 @@
       !signed_data.ParseFromString(serialized_signed_challenge)) {
     // Challenge is not properly formatted, so mark the device as untrusted (no
     // challenge response).
-    LogAttestationResult(DTAttestationResult::kBadChallengeFormat);
-    std::move(callback).Run(std::string());
+    std::move(callback).Run(
+        {std::string(), DTAttestationResult::kBadChallengeFormat});
     return;
   }
 
@@ -171,15 +172,15 @@
   if (!is_va_challenge) {
     // Challenge does not come from VA, so mark the device as untrusted (no
     // challenge response).
-    LogAttestationResult(DTAttestationResult::kBadChallengeSource);
-    std::move(callback).Run(std::string());
+    std::move(callback).Run(
+        {std::string(), DTAttestationResult::kBadChallengeSource});
     return;
   }
 
   auto dm_token = dm_token_storage_->RetrieveDMToken();
   if (!dm_token.is_valid()) {
-    LogAttestationResult(DTAttestationResult::kMissingCoreSignals);
-    std::move(callback).Run(std::string());
+    std::move(callback).Run(
+        {std::string(), DTAttestationResult::kMissingCoreSignals});
     return;
   }
 
@@ -196,7 +197,8 @@
   // VA should accept signals JSON string.
   std::string signals_json;
   if (!base::JSONWriter::Write(signals, &signals_json)) {
-    std::move(callback).Run(std::string());
+    std::move(callback).Run(
+        {std::string(), DTAttestationResult::kFailedToSerializeSignals});
     return;
   }
 
@@ -204,8 +206,8 @@
 
   std::string serialized_key_info;
   if (!key_info.SerializeToString(&serialized_key_info)) {
-    LogAttestationResult(DTAttestationResult::kFailedToSerializeKeyInfo);
-    std::move(callback).Run(std::string());
+    std::move(callback).Run(
+        {std::string(), DTAttestationResult::kFailedToSerializeKeyInfo});
     return;
   }
 
@@ -226,8 +228,8 @@
   if (!serialized_response) {
     // Failed to create a response, so mark the device as untrusted (no
     // challenge response).
-    LogAttestationResult(DTAttestationResult::kFailedToGenerateResponse);
-    std::move(callback).Run(std::string());
+    std::move(callback).Run(
+        {std::string(), DTAttestationResult::kFailedToGenerateResponse});
     return;
   }
 
@@ -246,8 +248,8 @@
   if (!encrypted_response) {
     // Failed to sign the response, so mark the device as untrusted (no
     // challenge response).
-    LogAttestationResult(DTAttestationResult::kFailedToSignResponse);
-    std::move(callback).Run(std::string());
+    std::move(callback).Run(
+        {std::string(), DTAttestationResult::kFailedToSignResponse});
     return;
   }
 
@@ -259,21 +261,21 @@
 
   std::string serialized_attestation_response;
   if (!signed_data.SerializeToString(&serialized_attestation_response)) {
-    LogAttestationResult(DTAttestationResult::kFailedToSerializeResponse);
-    std::move(callback).Run(std::string());
+    std::move(callback).Run(
+        {std::string(), DTAttestationResult::kFailedToSerializeResponse});
     return;
   }
 
   std::string json_response;
   if (!serialized_attestation_response.empty()) {
-    LogAttestationResult(DTAttestationResult::kSuccess);
     json_response =
         ProtobufChallengeToJsonChallenge(serialized_attestation_response);
-  } else {
-    LogAttestationResult(DTAttestationResult::kEmptySerializedResponse);
   }
 
-  std::move(callback).Run(json_response);
+  std::move(callback).Run(
+      {json_response, json_response.empty()
+                          ? DTAttestationResult::kEmptySerializedResponse
+                          : DTAttestationResult::kSuccess});
 }
 
 }  // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service_unittest.cc
index 891b477..1ec2932 100644
--- a/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/attestation/desktop/desktop_attestation_service_unittest.cc
@@ -11,7 +11,6 @@
 #include "base/json/json_reader.h"
 #include "base/run_loop.h"
 #include "base/test/bind.h"
-#include "base/test/metrics/histogram_tester.h"
 #include "base/test/task_environment.h"
 #include "base/values.h"
 #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_utils.h"
@@ -62,9 +61,6 @@
 constexpr char kDmToken[] = "fake-dm-token";
 constexpr char kInvalidDmToken[] = "INVALID_DM_TOKEN";
 
-constexpr char kResultHistogramName[] =
-    "Enterprise.DeviceTrust.Attestation.Result";
-
 std::string GetSerializedSignedChallenge(bool use_dev = false) {
   std::string serialized_signed_challenge;
   if (!base::Base64Decode(use_dev ? kEncodedChallengeDev : kEncodedChallenge,
@@ -132,7 +128,6 @@
   test::ScopedKeyPersistenceDelegateFactory persistence_delegate_factory_;
   std::unique_ptr<DeviceTrustKeyManagerImpl> key_manager_;
   policy::FakeBrowserDMTokenStorage fake_dm_token_storage_;
-  base::HistogramTester histogram_tester_;
 };
 
 TEST_F(DesktopAttestationServiceTest, BuildChallengeResponseDev_Success) {
@@ -141,12 +136,16 @@
 
   base::RunLoop run_loop;
   auto callback = base::BindLambdaForTesting(
-      [&](const std::string& serialized_signed_challenge) {
-        ASSERT_FALSE(serialized_signed_challenge.empty());
-        auto signed_data = ParseDataFromResponse(serialized_signed_challenge);
+      [&](const AttestationResponse& attestation_response) {
+        ASSERT_FALSE(attestation_response.challenge_response.empty());
+        auto signed_data =
+            ParseDataFromResponse(attestation_response.challenge_response);
         ASSERT_TRUE(signed_data);
         EXPECT_FALSE(signed_data->data().empty());
         EXPECT_FALSE(signed_data->signature().empty());
+
+        EXPECT_EQ(attestation_response.result_code,
+                  DTAttestationResult::kSuccess);
         run_loop.Quit();
       });
 
@@ -162,12 +161,16 @@
 
   base::RunLoop run_loop;
   auto callback = base::BindLambdaForTesting(
-      [&](const std::string& serialized_signed_challenge) {
-        ASSERT_FALSE(serialized_signed_challenge.empty());
-        auto signed_data = ParseDataFromResponse(serialized_signed_challenge);
+      [&](const AttestationResponse& attestation_response) {
+        ASSERT_FALSE(attestation_response.challenge_response.empty());
+        auto signed_data =
+            ParseDataFromResponse(attestation_response.challenge_response);
         ASSERT_TRUE(signed_data);
         EXPECT_FALSE(signed_data->data().empty());
         EXPECT_FALSE(signed_data->signature().empty());
+
+        EXPECT_EQ(attestation_response.result_code,
+                  DTAttestationResult::kSuccess);
         run_loop.Quit();
       });
 
@@ -182,11 +185,11 @@
 
   base::RunLoop run_loop;
   auto callback = base::BindLambdaForTesting(
-      [&](const std::string& serialized_signed_challenge) {
+      [&](const AttestationResponse& attestation_response) {
         // No challenge response is returned if no valid DMToken was found.
-        ASSERT_TRUE(serialized_signed_challenge.empty());
-        histogram_tester_.ExpectUniqueSample(
-            kResultHistogramName, DTAttestationResult::kMissingCoreSignals, 1);
+        EXPECT_TRUE(attestation_response.challenge_response.empty());
+        EXPECT_EQ(attestation_response.result_code,
+                  DTAttestationResult::kMissingCoreSignals);
         run_loop.Quit();
       });
 
@@ -200,11 +203,11 @@
 
   base::RunLoop run_loop;
   auto callback = base::BindLambdaForTesting(
-      [&](const std::string& serialized_signed_challenge) {
+      [&](const AttestationResponse& attestation_response) {
         // No challenge response is returned if no valid DMToken was found.
-        ASSERT_TRUE(serialized_signed_challenge.empty());
-        histogram_tester_.ExpectUniqueSample(
-            kResultHistogramName, DTAttestationResult::kMissingCoreSignals, 1);
+        ASSERT_TRUE(attestation_response.challenge_response.empty());
+        EXPECT_EQ(attestation_response.result_code,
+                  DTAttestationResult::kMissingCoreSignals);
         run_loop.Quit();
       });
 
diff --git a/chrome/browser/enterprise/connectors/device_trust/common/BUILD.gn b/chrome/browser/enterprise/connectors/device_trust/common/BUILD.gn
index a6703b6..f184120 100644
--- a/chrome/browser/enterprise/connectors/device_trust/common/BUILD.gn
+++ b/chrome/browser/enterprise/connectors/device_trust/common/BUILD.gn
@@ -7,7 +7,10 @@
 source_set("common") {
   sources = [ "metrics_utils.cc" ]
 
-  public = [ "metrics_utils.h" ]
+  public = [
+    "common_types.h",
+    "metrics_utils.h",
+  ]
 
   public_deps = [ "//base" ]
 
diff --git a/chrome/browser/enterprise/connectors/device_trust/common/common_types.h b/chrome/browser/enterprise/connectors/device_trust/common/common_types.h
new file mode 100644
index 0000000..9d6b7084a
--- /dev/null
+++ b/chrome/browser/enterprise/connectors/device_trust/common/common_types.h
@@ -0,0 +1,38 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_COMMON_COMMON_TYPES_H_
+#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_COMMON_COMMON_TYPES_H_
+
+#include <string>
+
+namespace enterprise_connectors {
+
+// Various possible outcomes to the attestation step in the overarching Device
+// Trust connector attestation flow. These values are persisted to logs and
+// should not be renumbered. Please update the DTAttestationResult enum in
+// enums.xml when adding a new value here.
+enum class DTAttestationResult {
+  kMissingCoreSignals = 0,
+  kMissingSigningKey = 1,
+  kBadChallengeFormat = 2,
+  kBadChallengeSource = 3,
+  kFailedToSerializeKeyInfo = 4,
+  kFailedToGenerateResponse = 5,
+  kFailedToSignResponse = 6,
+  kFailedToSerializeResponse = 7,
+  kEmptySerializedResponse = 8,
+  kSuccess = 9,
+  kFailedToSerializeSignals = 10,
+  kMaxValue = kFailedToSerializeSignals,
+};
+
+struct AttestationResponse {
+  std::string challenge_response{};
+  DTAttestationResult result_code{};
+};
+
+}  // namespace enterprise_connectors
+
+#endif  // CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_COMMON_COMMON_TYPES_H_
diff --git a/chrome/browser/enterprise/connectors/device_trust/common/metrics_utils.h b/chrome/browser/enterprise/connectors/device_trust/common/metrics_utils.h
index aad5ff0..cbef663 100644
--- a/chrome/browser/enterprise/connectors/device_trust/common/metrics_utils.h
+++ b/chrome/browser/enterprise/connectors/device_trust/common/metrics_utils.h
@@ -6,6 +6,7 @@
 #define CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_COMMON_METRICS_UTILS_H_
 
 #include "base/time/time.h"
+#include "chrome/browser/enterprise/connectors/device_trust/common/common_types.h"
 
 namespace enterprise_connectors {
 
@@ -20,24 +21,6 @@
   kMaxValue = kChallengeResponseSent,
 };
 
-// Various possible outcomes to the attestation step in the overarching Device
-// Trust connector attestation flow. These values are persisted to logs and
-// should not be renumbered. Please update the DTAttestationResult enum in
-// enums.xml when adding a new value here.
-enum class DTAttestationResult {
-  kMissingCoreSignals = 0,
-  kMissingSigningKey = 1,
-  kBadChallengeFormat = 2,
-  kBadChallengeSource = 3,
-  kFailedToSerializeKeyInfo = 4,
-  kFailedToGenerateResponse = 5,
-  kFailedToSignResponse = 6,
-  kFailedToSerializeResponse = 7,
-  kEmptySerializedResponse = 8,
-  kSuccess = 9,
-  kMaxValue = kSuccess,
-};
-
 #if BUILDFLAG(IS_CHROMEOS_ASH)
 // Possible origins of the Device Trust connector attestation flow on ChromeOS.
 // These values are persisted to logs and should not be renumbered. Please
diff --git a/chrome/browser/enterprise/connectors/device_trust/device_trust_service.cc b/chrome/browser/enterprise/connectors/device_trust/device_trust_service.cc
index d0f4d571..0a6fa70 100644
--- a/chrome/browser/enterprise/connectors/device_trust/device_trust_service.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/device_trust_service.cc
@@ -10,6 +10,7 @@
 #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_service.h"
 #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/attestation_utils.h"
 #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/signals_type.h"
+#include "chrome/browser/enterprise/connectors/device_trust/common/common_types.h"
 #include "chrome/browser/enterprise/connectors/device_trust/common/metrics_utils.h"
 #include "chrome/browser/enterprise/connectors/device_trust/device_trust_connector_service.h"
 #include "chrome/browser/enterprise/connectors/device_trust/device_trust_features.h"
@@ -107,7 +108,16 @@
   LogAttestationFunnelStep(DTAttestationFunnelStep::kSignalsCollected);
 
   attestation_service_->BuildChallengeResponseForVAChallenge(
-      serialized_signed_challenge, std::move(signals), std::move(callback));
+      serialized_signed_challenge, std::move(signals),
+      base::BindOnce(&DeviceTrustService::OnAttestationResponseReceived,
+                     weak_factory_.GetWeakPtr(), std::move(callback)));
+}
+
+void DeviceTrustService::OnAttestationResponseReceived(
+    AttestationCallback callback,
+    const AttestationResponse& response) {
+  LogAttestationResult(response.result_code);
+  std::move(callback).Run(response.challenge_response);
 }
 
 }  // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/device_trust_service.h b/chrome/browser/enterprise/connectors/device_trust/device_trust_service.h
index 0918988..7547f4a 100644
--- a/chrome/browser/enterprise/connectors/device_trust/device_trust_service.h
+++ b/chrome/browser/enterprise/connectors/device_trust/device_trust_service.h
@@ -18,6 +18,7 @@
 
 namespace enterprise_connectors {
 
+struct AttestationResponse;
 class AttestationService;
 class DeviceTrustConnectorService;
 class SignalsService;
@@ -71,6 +72,8 @@
   void OnSignalsCollected(const std::string& challenge,
                           AttestationCallback callback,
                           base::Value::Dict signals);
+  void OnAttestationResponseReceived(AttestationCallback callback,
+                                     const AttestationResponse& response);
 
   std::unique_ptr<AttestationService> attestation_service_;
   std::unique_ptr<SignalsService> signals_service_;
diff --git a/chrome/browser/enterprise/connectors/device_trust/device_trust_service_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/device_trust_service_unittest.cc
index f9430c3..a828ca3 100644
--- a/chrome/browser/enterprise/connectors/device_trust/device_trust_service_unittest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/device_trust_service_unittest.cc
@@ -12,10 +12,12 @@
 #include "base/memory/raw_ptr.h"
 #include "base/run_loop.h"
 #include "base/test/bind.h"
+#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
 #include "base/test/task_environment.h"
 #include "base/values.h"
 #include "chrome/browser/enterprise/connectors/device_trust/attestation/common/mock_attestation_service.h"
+#include "chrome/browser/enterprise/connectors/device_trust/common/common_types.h"
 #include "chrome/browser/enterprise/connectors/device_trust/device_trust_connector_service.h"
 #include "chrome/browser/enterprise/connectors/device_trust/device_trust_features.h"
 #include "chrome/browser/enterprise/connectors/device_trust/prefs.h"
@@ -54,6 +56,9 @@
     "u3W4CMboCswxIxNYRCGrIIVPElE3Yb4QS65mKrg=\""
     "}";
 
+constexpr char kResultHistogramName[] =
+    "Enterprise.DeviceTrust.Attestation.Result";
+
 std::string GetSerializedSignedChallenge(const std::string& response) {
   absl::optional<base::Value> data = base::JSONReader::Read(
       response, base::JSONParserOptions::JSON_ALLOW_TRAILING_COMMAS);
@@ -135,6 +140,7 @@
   raw_ptr<MockAttestationService> mock_attestation_service_;
   raw_ptr<MockSignalsService> mock_signals_service_;
   data_decoder::test::InProcessDataDecoder in_process_data_decoder;
+  base::HistogramTester histogram_tester_;
 };
 
 // Tests that IsEnabled returns true only when the feature flag is enabled and
@@ -159,16 +165,18 @@
             std::move(signals_callback).Run(std::move(*fake_signals));
           }));
 
+  const DTAttestationResult result_code = DTAttestationResult::kSuccess;
   EXPECT_CALL(*mock_attestation_service_,
               BuildChallengeResponseForVAChallenge(
                   GetSerializedSignedChallenge(kJsonChallenge), _, _))
-      .WillOnce(Invoke([&fake_display_name](const std::string& challenge,
-                                            const base::Value::Dict signals,
-                                            AttestationCallback callback) {
+      .WillOnce(Invoke([&fake_display_name](
+                           const std::string& challenge,
+                           const base::Value::Dict signals,
+                           AttestationService::AttestationCallback callback) {
         EXPECT_EQ(
             signals.FindString(device_signals::names::kDisplayName)->c_str(),
             fake_display_name);
-        std::move(callback).Run(challenge);
+        std::move(callback).Run({challenge, result_code});
       }));
 
   base::RunLoop run_loop;
@@ -177,6 +185,8 @@
       /*callback=*/base::BindLambdaForTesting(
           [&run_loop](const std::string& response) { run_loop.Quit(); }));
   run_loop.Run();
+
+  histogram_tester_.ExpectUniqueSample(kResultHistogramName, result_code, 1);
 }
 
 INSTANTIATE_TEST_SUITE_P(All,
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator.cc b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator.cc
index 4319be5e..b2f82f2 100644
--- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator.cc
@@ -83,6 +83,12 @@
   signals.Set(device_signals::names::kDiskEncrypted,
               static_cast<int32_t>(enterprise_signals::SettingValue::ENABLED));
 
+  // Also, there is no way to remove the need for a password when logging into a
+  // device, including when the screen is locked. A password or pin is always
+  // required.
+  signals.Set(device_signals::names::kScreenLockSecured,
+              static_cast<int32_t>(enterprise_signals::SettingValue::ENABLED));
+
   const ash::DeviceState* device_state =
       GetCurrentlyActiveDeviceState(profile_);
   if (device_state) {
diff --git a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator_browsertest.cc b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator_browsertest.cc
index 0080912..f6ddfca8 100644
--- a/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator_browsertest.cc
+++ b/chrome/browser/enterprise/connectors/device_trust/signals/decorators/ash/ash_signals_decorator_browsertest.cc
@@ -164,6 +164,12 @@
   ASSERT_TRUE(disk_encrypted);
   EXPECT_EQ(disk_encrypted.value(),
             static_cast<int32_t>(enterprise_signals::SettingValue::ENABLED));
+
+  auto screen_lock_secured =
+      signals.FindInt(device_signals::names::kScreenLockSecured);
+  ASSERT_TRUE(screen_lock_secured);
+  EXPECT_EQ(screen_lock_secured.value(),
+            static_cast<int32_t>(enterprise_signals::SettingValue::ENABLED));
 }
 
 IN_PROC_BROWSER_TEST_F(AshSignalsDecoratorBrowserTest, TestNetworkSignals) {
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc
index 45cb4e46..ca18783 100644
--- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc
+++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc
@@ -743,6 +743,73 @@
 
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
 
+#if BUILDFLAG(IS_MAC)
+IN_PROC_BROWSER_TEST_F(EnterpriseReportingPrivateApiTest, GetSettings) {
+  constexpr char kTest[] = R"(
+      chrome.test.assertEq(
+        'function',
+        typeof chrome.enterprise.reportingPrivate.getSettings);
+      const userContext = {userId: '%s'};
+
+      const options = [];
+
+      %s
+
+      const request = { userContext, options};
+
+   chrome.enterprise.reportingPrivate.getSettings(
+    request,
+    (settingItems) => {
+        chrome.test.assertNoLastError();
+
+        %s
+
+        chrome.test.notifyPass();
+      });
+  )";
+
+  std::string extra_items = base::StringPrintf(
+      R"(
+    const filePath = '%s';
+    const validKeyPath = "Key1.SubKey1.SubSubKey1[0][10]";
+    const invalidKeyPath = "Key1.SubKey1.SubSubKey1[0][0][3]";
+    options.push({
+      path: filePath,
+      key: validKeyPath,
+      getValue: true
+    });
+    options.push({
+      path: filePath,
+      key: invalidKeyPath,
+      getValue: true
+    });
+  )",
+
+      device_signals::test::GetMixArrayDictionaryPlistPath().value().c_str());
+
+  constexpr char kAssertions[] = R"(
+        chrome.test.assertTrue(settingItems instanceof Array);
+        chrome.test.assertEq(2, settingItems.length);
+        for (const response of settingItems) {
+          chrome.test.assertEq(filePath, response.path);
+          if (response.key == validKeyPath) {
+            chrome.test.assertEq("FOUND", response.presence);
+            chrome.test.assertEq("\"string10\"", response.value);
+          } else if (response.key == invalidKeyPath) {
+            chrome.test.assertEq("NOT_FOUND", response.presence);
+            chrome.test.assertEq(null, response.value);
+          } else {
+            chrome.test.fail();
+          }
+        }
+  )";
+
+  AccountInfo account_info = SignIn("some-email@example.com");
+  RunTest(base::StringPrintf(kTest, account_info.gaia.c_str(),
+                             extra_items.c_str(), kAssertions));
+}
+#endif  // BUILDFLAG(IS_MAC)
+
 #if BUILDFLAG(IS_CHROMEOS)
 static void RunTestUsingProfile(const std::string& background_js,
                                 Profile* profile) {
diff --git a/chrome/browser/extensions/api/file_manager/DIR_METADATA b/chrome/browser/extensions/api/file_manager/DIR_METADATA
index 2ea5b1db..e9400b87 100644
--- a/chrome/browser/extensions/api/file_manager/DIR_METADATA
+++ b/chrome/browser/extensions/api/file_manager/DIR_METADATA
@@ -1,3 +1 @@
-monorail {
-  component: "Platform>Apps>FileManager"
-}
\ No newline at end of file
+mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chrome/browser/first_party_sets/first_party_sets_policy_browsertest.cc b/chrome/browser/first_party_sets/first_party_sets_policy_browsertest.cc
index 5c223b20..b5f193a 100644
--- a/chrome/browser/first_party_sets/first_party_sets_policy_browsertest.cc
+++ b/chrome/browser/first_party_sets/first_party_sets_policy_browsertest.cc
@@ -16,6 +16,7 @@
 #include "components/policy/core/common/policy_types.h"
 #include "components/policy/policy_constants.h"
 #include "components/prefs/pref_service.h"
+#include "components/privacy_sandbox/privacy_sandbox_prefs.h"
 #include "content/public/browser/browser_context.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/common/content_features.h"
@@ -63,7 +64,8 @@
       public ::testing::WithParamInterface<std::tuple<bool, PrefState>> {
  public:
   EnabledPolicyBrowsertest()
-      : https_server_(net::EmbeddedTestServer::TYPE_HTTPS) {
+      : https_server_(net::EmbeddedTestServer::TYPE_HTTPS),
+        pref_enabled_(GetPrefState() != PrefState::kDisabled) {
     if (IsFeatureEnabled()) {
       scoped_feature_list_.InitWithFeatures(
           {features::kFirstPartySets,
@@ -161,28 +163,44 @@
 
   std::vector<std::string> ExpectedCrossSiteCookiesInCrossPartyContext() {
     // Returns the expected cookies that are accessible in a cross-site,
-    // cros-party context.
+    // cross-party context.
     if (IsFirstPartySetsEnabled()) {
       return {};
     }
     return kSameSiteNoneCookies;
   }
 
+  // Reverses the state of the First-Party Sets enabled preference.
+  void FlipEnabledPolicy() {
+    pref_enabled_ = !pref_enabled_;
+    policy_map().Set(policy::key::kFirstPartySetsEnabled,
+                     POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
+                     POLICY_SOURCE_ENTERPRISE_DEFAULT,
+                     base::Value(pref_enabled_), nullptr);
+
+    provider_.UpdateChromePolicy(policy_map());
+  }
+
+  bool IsFirstPartySetsEnabled() {
+    return IsFeatureEnabled() && IsPrefEnabled();
+  }
+
+  // Clear cookies for the current browser context, returning the number
+  // cleared.
+  uint32_t ClearCookies() {
+    return content::DeleteCookies(web_contents()->GetBrowserContext(),
+                                  network::mojom::CookieDeletionFilter());
+  }
+
  private:
   bool IsFeatureEnabled() { return std::get<0>(GetParam()); }
   PrefState GetPrefState() { return std::get<1>(GetParam()); }
-  bool IsPrefEnabled() { return GetPrefState() == PrefState::kEnabled; }
-
-  bool IsFirstPartySetsEnabled() {
-    if (GetPrefState() == PrefState::kDefault) {
-      return IsFeatureEnabled();
-    }
-    return IsFeatureEnabled() && IsPrefEnabled();
-  }
+  bool IsPrefEnabled() { return pref_enabled_; }
 
   net::test_server::EmbeddedTestServer https_server_;
   base::test::ScopedFeatureList scoped_feature_list_;
   PolicyMap policies_;
+  bool pref_enabled_;
 };
 
 IN_PROC_BROWSER_TEST_P(EnabledPolicyBrowsertest,
@@ -206,7 +224,19 @@
 
 IN_PROC_BROWSER_TEST_P(EnabledPolicyBrowsertest,
                        SetCrossSiteSamePartyEmbedWithFpsPrimaryTopLevel) {
+  std::vector<std::string> expected_cookies =
+      ExpectedCrossSiteCookiesInSamePartyContext();
   // Cross-site, same-party iframe (B embedded in A).
+  EXPECT_THAT(
+      content::ArrangeFramesAndGetCanonicalCookiesForLeaf(
+          web_contents(), https_server(), "a.test(%s)",
+          SetSamePartyCookiesUrl(kHostB)),
+      UnorderedPointwise(net::CanonicalCookieNameIs(), expected_cookies));
+
+  // Clear cookies from above and flip the First-Party Sets enabled pref.
+  ASSERT_EQ(ClearCookies(), expected_cookies.size());
+  FlipEnabledPolicy();
+
   EXPECT_THAT(content::ArrangeFramesAndGetCanonicalCookiesForLeaf(
                   web_contents(), https_server(), "a.test(%s)",
                   SetSamePartyCookiesUrl(kHostB)),
@@ -216,7 +246,19 @@
 
 IN_PROC_BROWSER_TEST_P(EnabledPolicyBrowsertest,
                        SetCrossSiteSamePartyEmbedWithFpsPrimaryLeaf) {
+  std::vector<std::string> expected_cookies =
+      ExpectedCrossSiteCookiesInSamePartyContext();
   // Cross-site, same-party iframe (A embedded in B).
+  EXPECT_THAT(
+      content::ArrangeFramesAndGetCanonicalCookiesForLeaf(
+          web_contents(), https_server(), "b.test(%s)",
+          SetSamePartyCookiesUrl(kHostA)),
+      UnorderedPointwise(net::CanonicalCookieNameIs(), expected_cookies));
+
+  // Clear cookies from above and flip the First-Party Sets enabled pref.
+  ASSERT_EQ(ClearCookies(), expected_cookies.size());
+  FlipEnabledPolicy();
+
   EXPECT_THAT(content::ArrangeFramesAndGetCanonicalCookiesForLeaf(
                   web_contents(), https_server(), "b.test(%s)",
                   SetSamePartyCookiesUrl(kHostA)),
@@ -227,7 +269,19 @@
 IN_PROC_BROWSER_TEST_P(
     EnabledPolicyBrowsertest,
     SetCrossSiteSamePartyWithTwoNestedSamePartyContextFrames) {
+  std::vector<std::string> expected_cookies =
+      ExpectedCrossSiteCookiesInSamePartyContext();
   // Cross-site, same-party nested iframe (A embedded in B embedded in A).
+  EXPECT_THAT(
+      content::ArrangeFramesAndGetCanonicalCookiesForLeaf(
+          web_contents(), https_server(), "a.test(b.test(%s))",
+          SetSamePartyCookiesUrl(kHostA)),
+      UnorderedPointwise(net::CanonicalCookieNameIs(), expected_cookies));
+
+  // Clear cookies from above and flip the First-Party Sets enabled pref.
+  ASSERT_EQ(ClearCookies(), expected_cookies.size());
+  FlipEnabledPolicy();
+
   EXPECT_THAT(content::ArrangeFramesAndGetCanonicalCookiesForLeaf(
                   web_contents(), https_server(), "a.test(b.test(%s))",
                   SetSamePartyCookiesUrl(kHostA)),
@@ -238,8 +292,20 @@
 IN_PROC_BROWSER_TEST_P(
     EnabledPolicyBrowsertest,
     SetCrossSiteSamePartyWithThreeNestedSamePartyContextFrames) {
+  std::vector<std::string> expected_cookies =
+      ExpectedCrossSiteCookiesInSamePartyContext();
   // Cross-site, same-party nested iframe (A embedded in B embedded in C
   // embedded in A).
+  EXPECT_THAT(
+      content::ArrangeFramesAndGetCanonicalCookiesForLeaf(
+          web_contents(), https_server(), "a.test(c.test(b.test(%s)))",
+          SetSamePartyCookiesUrl(kHostA)),
+      UnorderedPointwise(net::CanonicalCookieNameIs(), expected_cookies));
+
+  // Clear cookies from above and flip the First-Party Sets enabled pref.
+  ASSERT_EQ(ClearCookies(), expected_cookies.size());
+  FlipEnabledPolicy();
+
   EXPECT_THAT(content::ArrangeFramesAndGetCanonicalCookiesForLeaf(
                   web_contents(), https_server(), "a.test(c.test(b.test(%s)))",
                   SetSamePartyCookiesUrl(kHostA)),
@@ -259,11 +325,23 @@
 
 IN_PROC_BROWSER_TEST_P(EnabledPolicyBrowsertest,
                        SetCrossSiteCrossPartyEmbedWithFpsLeaf) {
+  std::vector<std::string> expected_cookies =
+      ExpectedCrossSiteCookiesInCrossPartyContext();
   // Cross-site, cross-party iframe (A embedded in D).
   EXPECT_THAT(
       content::ArrangeFramesAndGetCanonicalCookiesForLeaf(
           web_contents(), https_server(), "d.test(%s)",
           SetSamePartyCookiesUrl(kHostA)),
+      UnorderedPointwise(net::CanonicalCookieNameIs(), expected_cookies));
+
+  // Clear cookies from above and flip the First-Party Sets enabled pref.
+  ASSERT_EQ(ClearCookies(), expected_cookies.size());
+  FlipEnabledPolicy();
+
+  EXPECT_THAT(
+      content::ArrangeFramesAndGetCanonicalCookiesForLeaf(
+          web_contents(), https_server(), "d.test(%s)",
+          SetSamePartyCookiesUrl(kHostA)),
       UnorderedPointwise(net::CanonicalCookieNameIs(),
                          ExpectedCrossSiteCookiesInCrossPartyContext()));
 }
@@ -271,7 +349,21 @@
 IN_PROC_BROWSER_TEST_P(
     EnabledPolicyBrowsertest,
     SetCrossSiteCrossPartyWithTwoNestedCrossPartyContextFrames) {
-  // Cross-site, cross-party nested iframe (A embedded in B embedded in D).
+  std::vector<std::string> expected_cookies =
+      ExpectedCrossSiteCookiesInCrossPartyContext();
+  // Cross-site, cross-party nested iframe (A embedded in B embedded in
+  // D).
+  EXPECT_THAT(
+      content::ArrangeFramesAndGetCanonicalCookiesForLeaf(
+          web_contents(), https_server(), "d.test(b.test(%s))",
+          SetSamePartyCookiesUrl(kHostA)),
+      UnorderedPointwise(net::CanonicalCookieNameIs(),
+                         ExpectedCrossSiteCookiesInCrossPartyContext()));
+
+  // Clear cookies from above and flip the First-Party Sets enabled pref.
+  ASSERT_EQ(ClearCookies(), expected_cookies.size());
+  FlipEnabledPolicy();
+
   EXPECT_THAT(
       content::ArrangeFramesAndGetCanonicalCookiesForLeaf(
           web_contents(), https_server(), "d.test(b.test(%s))",
@@ -322,6 +414,18 @@
                                                   {0}, EchoCookiesUrl(kHostB)),
       net::CookieStringIs(UnorderedPointwise(
           net::NameIs(), ExpectedCrossSiteCookiesInSamePartyContext())));
+
+  // Clear cookies from above and flip the First-Party Sets enabled pref.
+  ASSERT_EQ(ClearCookies(), 3u);
+  FlipEnabledPolicy();
+
+  ASSERT_NO_FATAL_FAILURE(SetSamePartyCookies(kHostB));
+  EXPECT_THAT(
+      content::ArrangeFramesAndGetContentFromLeaf(web_contents(),
+                                                  https_server(), "a.test(%s)",
+                                                  {0}, EchoCookiesUrl(kHostB)),
+      net::CookieStringIs(UnorderedPointwise(
+          net::NameIs(), ExpectedCrossSiteCookiesInSamePartyContext())));
 }
 
 IN_PROC_BROWSER_TEST_P(EnabledPolicyBrowsertest,
@@ -334,6 +438,18 @@
                                                   {0}, EchoCookiesUrl(kHostA)),
       net::CookieStringIs(UnorderedPointwise(
           net::NameIs(), ExpectedCrossSiteCookiesInSamePartyContext())));
+
+  // Clear cookies from above and flip the First-Party Sets enabled pref.
+  ASSERT_EQ(ClearCookies(), 3u);
+  FlipEnabledPolicy();
+
+  ASSERT_NO_FATAL_FAILURE(SetSamePartyCookies(kHostA));
+  EXPECT_THAT(
+      content::ArrangeFramesAndGetContentFromLeaf(web_contents(),
+                                                  https_server(), "b.test(%s)",
+                                                  {0}, EchoCookiesUrl(kHostA)),
+      net::CookieStringIs(UnorderedPointwise(
+          net::NameIs(), ExpectedCrossSiteCookiesInSamePartyContext())));
 }
 
 IN_PROC_BROWSER_TEST_P(
@@ -347,6 +463,18 @@
           EchoCookiesUrl(kHostA)),
       net::CookieStringIs(UnorderedPointwise(
           net::NameIs(), ExpectedCrossSiteCookiesInSamePartyContext())));
+
+  // Clear cookies from above and flip the First-Party Sets enabled pref.
+  ASSERT_EQ(ClearCookies(), 3u);
+  FlipEnabledPolicy();
+
+  ASSERT_NO_FATAL_FAILURE(SetSamePartyCookies(kHostA));
+  EXPECT_THAT(
+      content::ArrangeFramesAndGetContentFromLeaf(
+          web_contents(), https_server(), "a.test(b.test(%s))", {0, 0},
+          EchoCookiesUrl(kHostA)),
+      net::CookieStringIs(UnorderedPointwise(
+          net::NameIs(), ExpectedCrossSiteCookiesInSamePartyContext())));
 }
 
 IN_PROC_BROWSER_TEST_P(
@@ -361,6 +489,18 @@
           {0, 0, 0}, EchoCookiesUrl(kHostA)),
       net::CookieStringIs(UnorderedPointwise(
           net::NameIs(), ExpectedCrossSiteCookiesInSamePartyContext())));
+
+  // Clear cookies from above and flip the First-Party Sets enabled pref.
+  ASSERT_EQ(ClearCookies(), 3u);
+  FlipEnabledPolicy();
+
+  ASSERT_NO_FATAL_FAILURE(SetSamePartyCookies(kHostA));
+  EXPECT_THAT(
+      content::ArrangeFramesAndGetContentFromLeaf(
+          web_contents(), https_server(), "a.test(c.test(b.test(%s)))",
+          {0, 0, 0}, EchoCookiesUrl(kHostA)),
+      net::CookieStringIs(UnorderedPointwise(
+          net::NameIs(), ExpectedCrossSiteCookiesInSamePartyContext())));
 }
 
 IN_PROC_BROWSER_TEST_P(EnabledPolicyBrowsertest,
@@ -384,6 +524,18 @@
                                                   {0}, EchoCookiesUrl(kHostA)),
       net::CookieStringIs(UnorderedPointwise(
           net::NameIs(), ExpectedCrossSiteCookiesInCrossPartyContext())));
+
+  // Clear cookies from above and flip the First-Party Sets enabled pref.
+  ASSERT_EQ(ClearCookies(), 3u);
+  FlipEnabledPolicy();
+
+  ASSERT_NO_FATAL_FAILURE(SetSamePartyCookies(kHostA));
+  EXPECT_THAT(
+      content::ArrangeFramesAndGetContentFromLeaf(web_contents(),
+                                                  https_server(), "d.test(%s)",
+                                                  {0}, EchoCookiesUrl(kHostA)),
+      net::CookieStringIs(UnorderedPointwise(
+          net::NameIs(), ExpectedCrossSiteCookiesInCrossPartyContext())));
 }
 
 IN_PROC_BROWSER_TEST_P(
@@ -397,6 +549,18 @@
           EchoCookiesUrl(kHostA)),
       net::CookieStringIs(UnorderedPointwise(
           net::NameIs(), ExpectedCrossSiteCookiesInCrossPartyContext())));
+
+  // Clear cookies from above and flip the First-Party Sets enabled pref.
+  ASSERT_EQ(ClearCookies(), 3u);
+  FlipEnabledPolicy();
+
+  ASSERT_NO_FATAL_FAILURE(SetSamePartyCookies(kHostA));
+  EXPECT_THAT(
+      content::ArrangeFramesAndGetContentFromLeaf(
+          web_contents(), https_server(), "d.test(b.test(%s))", {0, 0},
+          EchoCookiesUrl(kHostA)),
+      net::CookieStringIs(UnorderedPointwise(
+          net::NameIs(), ExpectedCrossSiteCookiesInCrossPartyContext())));
 }
 
 IN_PROC_BROWSER_TEST_P(EnabledPolicyBrowsertest,
@@ -661,6 +825,5 @@
                        ::testing::Values(PrefState::kDefault,
                                          PrefState::kDisabled,
                                          PrefState::kEnabled)));
-
 }  // namespace
 }  // namespace policy
diff --git a/chrome/browser/first_party_sets/first_party_sets_policy_service.cc b/chrome/browser/first_party_sets/first_party_sets_policy_service.cc
index ff3cadf..1b96d5a8 100644
--- a/chrome/browser/first_party_sets/first_party_sets_policy_service.cc
+++ b/chrome/browser/first_party_sets/first_party_sets_policy_service.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/first_party_sets/first_party_sets_policy_service.h"
 
+#include "base/feature_list.h"
 #include "chrome/browser/first_party_sets/first_party_sets_pref_names.h"
 #include "chrome/browser/profiles/profile.h"
 #include "components/prefs/pref_service.h"
@@ -175,6 +176,31 @@
                          weak_factory_.GetWeakPtr()));
 }
 
+absl::optional<net::FirstPartySetEntry> FirstPartySetsPolicyService::FindEntry(
+    const net::SchemefulSite& site) const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  PrefService* prefs =
+      Profile::FromBrowserContext(browser_context_)->GetPrefs();
+  if ((prefs &&
+       !prefs->GetBoolean(prefs::kPrivacySandboxFirstPartySetsEnabled)) ||
+      !config_.has_value()) {
+    return absl::nullopt;
+  }
+  return content::FirstPartySetsHandler::GetInstance()->FindEntry(
+      site, config_.value());
+}
+
+bool FirstPartySetsPolicyService::IsSiteInManagedSet(
+    const net::SchemefulSite& site) const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (!config_.has_value())
+    return false;
+
+  absl::optional<absl::optional<net::FirstPartySetEntry>> maybe_override =
+      config_->FindOverride(site);
+  return maybe_override.has_value() && maybe_override->has_value();
+}
+
 void FirstPartySetsPolicyService::OnReadyToNotifyDelegates(
     net::FirstPartySetsContextConfig config) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
diff --git a/chrome/browser/first_party_sets/first_party_sets_policy_service.h b/chrome/browser/first_party_sets/first_party_sets_policy_service.h
index 315cbaa..d1f86460 100644
--- a/chrome/browser/first_party_sets/first_party_sets_policy_service.h
+++ b/chrome/browser/first_party_sets/first_party_sets_policy_service.h
@@ -6,21 +6,24 @@
 #define CHROME_BROWSER_FIRST_PARTY_SETS_FIRST_PARTY_SETS_POLICY_SERVICE_H_
 
 #include "base/memory/raw_ptr.h"
-#include "base/scoped_observation.h"
 #include "base/sequence_checker.h"
 #include "base/thread_annotations.h"
-#include "base/values.h"
 #include "components/keyed_service/core/keyed_service.h"
-#include "components/privacy_sandbox/privacy_sandbox_settings.h"
 #include "mojo/public/cpp/bindings/remote.h"
 #include "mojo/public/cpp/bindings/remote_set.h"
 #include "net/first_party_sets/first_party_sets_context_config.h"
 #include "services/network/public/mojom/first_party_sets_access_delegate.mojom.h"
 
+class PrefService;
+
 namespace content {
 class BrowserContext;
 }  // namespace content
 
+namespace net {
+class SchemefulSite;
+}  // namespace net
+
 namespace first_party_sets {
 
 // A profile keyed service for per-BrowserContext First-Party Sets state.
@@ -28,9 +31,7 @@
 // This service always exists for a BrowserContext, regardless of whether the
 // First-Party Sets feature is enabled globally or for this particular
 // BrowserContext.
-class FirstPartySetsPolicyService
-    : public KeyedService,
-      public privacy_sandbox::PrivacySandboxSettings::Observer {
+class FirstPartySetsPolicyService : public KeyedService {
  public:
   explicit FirstPartySetsPolicyService(content::BrowserContext* context);
   FirstPartySetsPolicyService(const FirstPartySetsPolicyService&) = delete;
@@ -53,8 +54,9 @@
       mojo::Remote<network::mojom::FirstPartySetsAccessDelegate>
           access_delegate);
 
-  // PrivacySandboxSettings::Observer:
-  void OnFirstPartySetsEnabledChanged(bool enabled) override;
+  // Triggers changes to `access_delegates` that should occur when the
+  // First-Party Sets enabled pref changes.
+  void OnFirstPartySetsEnabledChanged(bool enabled);
 
   // KeyedService:
   void Shutdown() override;
@@ -80,6 +82,23 @@
 
   void ResetForTesting();
 
+  // Looks up `site` in Chrome's list of First-Party Sets and returns its
+  // associated entry if `site` is found.
+  //
+  // This will return nullopt if:
+  // - First-Party Sets is disabled or
+  // - the list of First-Party Sets isn't initialized yet or
+  // - `site` isn't in Chrome's list of First-Party Sets or
+  // - this instance has not received the config yet
+  absl::optional<net::FirstPartySetEntry> FindEntry(
+      const net::SchemefulSite& site) const;
+
+  // Checks if ownership of `site` is managed by an enterprise.
+  //
+  // Note: this doesn't consider `site` as managed if it was removed by an
+  // enterprise using policy.
+  bool IsSiteInManagedSet(const net::SchemefulSite& site) const;
+
   content::BrowserContext* browser_context() const {
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
     return browser_context_;
@@ -119,10 +138,6 @@
   absl::optional<net::FirstPartySetsContextConfig> config_
       GUARDED_BY_CONTEXT(sequence_checker_);
 
-  base::ScopedObservation<privacy_sandbox::PrivacySandboxSettings,
-                          privacy_sandbox::PrivacySandboxSettings::Observer>
-      privacy_sandbox_settings_observer_{this};
-
   // Callback used by tests to wait for the ctor's initialization flow to
   // complete.
   absl::optional<base::OnceClosure> on_first_init_complete_for_testing_;
diff --git a/chrome/browser/first_party_sets/first_party_sets_policy_service_unittest.cc b/chrome/browser/first_party_sets/first_party_sets_policy_service_unittest.cc
index a440b59d..2899653 100644
--- a/chrome/browser/first_party_sets/first_party_sets_policy_service_unittest.cc
+++ b/chrome/browser/first_party_sets/first_party_sets_policy_service_unittest.cc
@@ -132,15 +132,15 @@
 
   void SetUp() override {
     DefaultFirstPartySetsPolicyServiceTest::SetUp();
-
+    content::FirstPartySetsHandler::GetInstance()->ResetForTesting();
     content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting({});
 
     profile_manager_ = std::make_unique<TestingProfileManager>(
         TestingBrowserProcess::GetGlobal());
     ASSERT_TRUE(profile_manager_->SetUp());
-
-    service_ = FirstPartySetsPolicyServiceFactory::GetForBrowserContext(
-        profile_manager_->CreateTestingProfile("TestProfile"));
+    profile_ = profile_manager_->CreateTestingProfile("TestProfile");
+    service_ =
+        FirstPartySetsPolicyServiceFactory::GetForBrowserContext(profile_);
     ASSERT_NE(service_, nullptr);
 
     // We can't avoid eagerly initializing the service, due to
@@ -166,15 +166,160 @@
   }
 
  protected:
+  Profile* profile() { return profile_; }
   FirstPartySetsPolicyService* service() { return service_; }
 
  private:
   std::unique_ptr<TestingProfileManager> profile_manager_;
+  Profile* profile_;
   base::test::ScopedFeatureList features_;
   FirstPartySetsPolicyService* service_;
 };
 
+TEST_F(FirstPartySetsPolicyServiceTest, IsSiteInManagedSet_WithoutConfig) {
+  EXPECT_FALSE(service()->IsSiteInManagedSet(
+      net::SchemefulSite(GURL("https://example.test"))));
+}
+
+TEST_F(FirstPartySetsPolicyServiceTest, IsSiteInManagedSet_SiteNotInConfig) {
+  service()->InitForTesting(
+      [](PrefService* prefs,
+         base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) {
+        std::move(callback).Run(net::FirstPartySetsContextConfig(
+            {{net::SchemefulSite(GURL("https://example.test")),
+              {net::FirstPartySetEntry(
+                  net::SchemefulSite(GURL("https://primary.test")),
+                  net::SiteType::kAssociated, absl::nullopt)}}}));
+      });
+
+  EXPECT_FALSE(service()->IsSiteInManagedSet(
+      net::SchemefulSite(GURL("https://not-example.test"))));
+  env().RunUntilIdle();
+}
+
 TEST_F(FirstPartySetsPolicyServiceTest,
+       IsSiteInManagedSet_SiteInConfig_AsDeletion) {
+  net::SchemefulSite example_site =
+      net::SchemefulSite(GURL("https://example.test"));
+  service()->InitForTesting(
+      [example_site](
+          PrefService* prefs,
+          base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) {
+        std::move(callback).Run(net::FirstPartySetsContextConfig(
+            {{example_site, {absl::nullopt}}}));
+      });
+  EXPECT_FALSE(service()->IsSiteInManagedSet(example_site));
+  env().RunUntilIdle();
+}
+
+TEST_F(FirstPartySetsPolicyServiceTest,
+       IsSiteInManagedSet_SiteInConfig_AsModification) {
+  net::SchemefulSite example_site =
+      net::SchemefulSite(GURL("https://example.test"));
+  service()->InitForTesting(
+      [example_site](
+          PrefService* prefs,
+          base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) {
+        std::move(callback).Run(net::FirstPartySetsContextConfig(
+            {{example_site,
+              {net::FirstPartySetEntry(
+                  net::SchemefulSite(GURL("https://primary.test")),
+                  net::SiteType::kAssociated, absl::nullopt)}}}));
+      });
+  EXPECT_TRUE(service()->IsSiteInManagedSet(example_site));
+  env().RunUntilIdle();
+}
+
+TEST_F(FirstPartySetsPolicyServiceTest, FindEntry_FpsDisabled) {
+  base::test::ScopedFeatureList features;
+  net::SchemefulSite primary_site(GURL("https://primary.test"));
+  net::SchemefulSite associate1_site(GURL("https://associate1.test"));
+
+  // Create Global First-Party Sets with the following set:
+  // { primary: "https://primary.test",
+  // associatedSites: ["https://associate1.test"}
+  content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting(
+      net::GlobalFirstPartySets(
+          {{associate1_site,
+            {net::FirstPartySetEntry(primary_site, net::SiteType::kAssociated,
+                                     0)}}},
+          {}));
+  service()->InitForTesting(
+      [](PrefService* prefs,
+         base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) {
+        std::move(callback).Run(net::FirstPartySetsContextConfig());
+      });
+
+  // Simulate First-Party Sets disabled by the preference.
+  features.InitAndEnableFeature(features::kFirstPartySets);
+  profile()->GetPrefs()->SetBoolean(prefs::kPrivacySandboxFirstPartySetsEnabled,
+                                    false);
+
+  // Verify that FindEntry doesn't return associate1's entry when FPS is off.
+  EXPECT_FALSE(service()->FindEntry(associate1_site));
+
+  // Simulate First-Party Sets disabled by the feature.
+  features.Reset();
+  features.InitAndDisableFeature(features::kFirstPartySets);
+  profile()->GetPrefs()->SetBoolean(prefs::kPrivacySandboxFirstPartySetsEnabled,
+                                    true);
+  // Verify that FindEntry doesn't return associate1's entry when FPS is off.
+  EXPECT_FALSE(service()->FindEntry(associate1_site));
+  env().RunUntilIdle();
+}
+
+TEST_F(FirstPartySetsPolicyServiceTest,
+       FindEntry_FpsEnabled_ReturnsEmptyUntilAllSetsReady) {
+  base::test::ScopedFeatureList features;
+  net::SchemefulSite primary_site(GURL("https://primary.test"));
+  net::SchemefulSite associate1_site(GURL("https://associate1.test"));
+  net::FirstPartySetEntry associate1_entry(
+      net::FirstPartySetEntry(primary_site, net::SiteType::kAssociated, 0));
+
+  // Fully enable First-Party Sets.
+  features.InitAndEnableFeature(features::kFirstPartySets);
+  profile()->GetPrefs()->SetBoolean(prefs::kPrivacySandboxFirstPartySetsEnabled,
+                                    true);
+  // Verify that FindEntry returns empty if the global sets and profile sets
+  // aren't ready yet.
+  EXPECT_FALSE(service()->FindEntry(associate1_site));
+
+  // Simulate the global First-Party Sets with the following set:
+  // { primary: "https://primary.test",
+  // associatedSites: ["https://associate1.test"}
+  content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting(
+      net::GlobalFirstPartySets({{associate1_site, {associate1_entry}}}, {}));
+
+  // Verify that FindEntry returns empty if both sources of sets aren't ready
+  // yet.
+  EXPECT_FALSE(service()->FindEntry(associate1_site));
+
+  // Simulate the profile set overrides are empty.
+  service()->InitForTesting(
+      [](PrefService* prefs,
+         base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) {
+        std::move(callback).Run(net::FirstPartySetsContextConfig());
+      });
+
+  // Verify that FindEntry finally returns associate1's entry.
+  EXPECT_EQ(service()->FindEntry(associate1_site).value(), associate1_entry);
+  env().RunUntilIdle();
+}
+
+class FirstPartySetsPolicyServicePrefObserverTest
+    : public FirstPartySetsPolicyServiceTest {
+ public:
+  FirstPartySetsPolicyServicePrefObserverTest() {
+    // Enable base::Feature for all tests since only the pref can change
+    // whether the service is enabled.
+    features_.InitAndEnableFeature(features::kFirstPartySets);
+  }
+
+ private:
+  base::test::ScopedFeatureList features_;
+};
+
+TEST_F(FirstPartySetsPolicyServicePrefObserverTest,
        OnProfileConfigReady_InitDisabled_NotifiesReadyWithConfig) {
   net::SchemefulSite test_primary(GURL("https://a.test"));
   net::FirstPartySetEntry test_entry(test_primary, net::SiteType::kPrimary,
@@ -193,7 +338,7 @@
   env().RunUntilIdle();
 }
 
-TEST_F(FirstPartySetsPolicyServiceTest,
+TEST_F(FirstPartySetsPolicyServicePrefObserverTest,
        OnFirstPartySetsEnabledChanged_Default_WithConfig) {
   service()->InitForTesting(
       [](PrefService* prefs,
@@ -207,7 +352,7 @@
   env().RunUntilIdle();
 }
 
-TEST_F(FirstPartySetsPolicyServiceTest,
+TEST_F(FirstPartySetsPolicyServicePrefObserverTest,
        OnFirstPartySetsEnabledChanged_Default_WithoutConfig) {
   EXPECT_CALL(mock_delegate, SetEnabled(_)).Times(0);
   EXPECT_CALL(mock_delegate, NotifyReady(_)).Times(0);
@@ -215,7 +360,7 @@
   env().RunUntilIdle();
 }
 
-TEST_F(FirstPartySetsPolicyServiceTest,
+TEST_F(FirstPartySetsPolicyServicePrefObserverTest,
        OnFirstPartySetsEnabledChanged_Disables_WithConfig) {
   service()->InitForTesting(
       [](PrefService* prefs,
@@ -230,7 +375,7 @@
   env().RunUntilIdle();
 }
 
-TEST_F(FirstPartySetsPolicyServiceTest,
+TEST_F(FirstPartySetsPolicyServicePrefObserverTest,
        OnFirstPartySetsEnabledChanged_Disables_WithoutConfig) {
   service()->OnFirstPartySetsEnabledChanged(false);
 
@@ -240,7 +385,7 @@
   env().RunUntilIdle();
 }
 
-TEST_F(FirstPartySetsPolicyServiceTest,
+TEST_F(FirstPartySetsPolicyServicePrefObserverTest,
        OnFirstPartySetsEnabledChanged_Enables_WithConfig) {
   net::SchemefulSite test_primary(GURL("https://a.test"));
   net::FirstPartySetEntry test_entry(test_primary, net::SiteType::kPrimary,
@@ -264,7 +409,7 @@
   env().RunUntilIdle();
 }
 
-TEST_F(FirstPartySetsPolicyServiceTest,
+TEST_F(FirstPartySetsPolicyServicePrefObserverTest,
        OnFirstPartySetsEnabledChanged_Enables_WithoutConfig) {
   service()->OnFirstPartySetsEnabledChanged(true);
 
diff --git a/chrome/browser/hid/chrome_hid_delegate_unittest.cc b/chrome/browser/hid/chrome_hid_delegate_unittest.cc
index b6850ac9..1cea438 100644
--- a/chrome/browser/hid/chrome_hid_delegate_unittest.cc
+++ b/chrome/browser/hid/chrome_hid_delegate_unittest.cc
@@ -4,19 +4,25 @@
 
 #include "chrome/browser/hid/chrome_hid_delegate.h"
 
+#include <memory>
+
 #include "base/guid.h"
+#include "base/run_loop.h"
+#include "base/strings/stringprintf.h"
 #include "base/test/repeating_test_future.h"
 #include "base/test/test_future.h"
 #include "build/build_config.h"
 #include "chrome/browser/hid/hid_chooser_context.h"
 #include "chrome/browser/hid/hid_chooser_context_factory.h"
 #include "chrome/browser/prefs/browser_prefs.h"
+#include "chrome/common/chrome_features.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
 #include "chrome/test/base/testing_browser_process.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chrome/test/base/testing_profile_manager.h"
 #include "content/public/browser/web_contents.h"
 #include "content/public/test/back_forward_cache_util.h"
+#include "content/public/test/embedded_worker_instance_test_harness.h"
 #include "content/public/test/web_contents_tester.h"
 #include "extensions/buildflags/buildflags.h"
 #include "services/device/public/cpp/test/fake_hid_manager.h"
@@ -53,10 +59,12 @@
 
 constexpr base::StringPiece kDefaultTestUrl{"https://www.google.com"};
 constexpr base::StringPiece kCrossOriginTestUrl{"https://www.chromium.org"};
+constexpr char kTestUserEmail[] = "user@example.com";
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 constexpr base::StringPiece kPrivilegedExtensionId{
     "ckcendljdlmgnhghiaomidhiiclmapok"};
+constexpr base::StringPiece kExtensionDocumentFileName{"index.html"};
 #endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 
 MATCHER_P(HasGuid, matcher, "") {
@@ -139,96 +147,8 @@
   mojo::Receiver<device::mojom::HidConnectionClient> receiver_{this};
 };
 
-class ChromeHidDelegateTest : public ChromeRenderViewHostTestHarness {
+class ChromeHidTestHelper {
  public:
-  ChromeHidDelegateTest() = default;
-  ChromeHidDelegateTest(const ChromeHidDelegateTest&) = delete;
-  ChromeHidDelegateTest& operator=(const ChromeHidDelegateTest&) = delete;
-  ~ChromeHidDelegateTest() override = default;
-
-  void SetUp() override {
-    ChromeRenderViewHostTestHarness::SetUp();
-
-    // On ChromeOS a user account is needed in order to check whether the user
-    // account is affiliated with the device owner for the purposes of applying
-    // enterprise policy.
-    constexpr char kTestUserEmail[] = "user@example.com";
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-    constexpr char kTestUserGaiaId[] = "1111111111";
-    auto fake_user_manager = std::make_unique<ash::FakeChromeUserManager>();
-    auto* fake_user_manager_ptr = fake_user_manager.get();
-    scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>(
-        std::move(fake_user_manager));
-
-    auto account_id =
-        AccountId::FromUserEmailGaiaId(kTestUserEmail, kTestUserGaiaId);
-    fake_user_manager_ptr->AddUser(account_id);
-    fake_user_manager_ptr->LoginUser(account_id);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
-
-    profile_manager_ = std::make_unique<TestingProfileManager>(
-        TestingBrowserProcess::GetGlobal());
-    ASSERT_TRUE(profile_manager_->SetUp());
-    profile_ = profile_manager_->CreateTestingProfile(kTestUserEmail);
-    ASSERT_TRUE(profile_);
-    // Create a new web contents for `profile_`.
-    SetContents(
-        content::WebContentsTester::CreateTestWebContents(profile_, nullptr));
-
-    NavigateAndCommit(GURL(kDefaultTestUrl));
-    BindHidManager();
-  }
-
-  void TearDown() override {
-    DeleteContents();
-    profile_manager_->DeleteAllTestingProfiles();
-    profile_manager_.reset();
-    profile_ = nullptr;
-
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-    scoped_user_manager_.reset();
-#endif
-
-    ChromeRenderViewHostTestHarness::TearDown();
-  }
-
- protected:
-#if BUILDFLAG(ENABLE_EXTENSIONS)
-  // Creates a fake extension with the specified `extension_id` so that it can
-  // exercise behaviors that are only enabled for privileged extensions.
-  absl::optional<GURL> CreateExtensionWithId(base::StringPiece extension_id) {
-    extensions::DictionaryBuilder manifest;
-    manifest.Set("name", "Fake extension")
-        .Set("description", "For testing.")
-        .Set("version", "0.1")
-        .Set("manifest_version", 2)
-        .Set("web_accessible_resources",
-             extensions::ListBuilder().Append("index.html").Build());
-    scoped_refptr<const extensions::Extension> extension =
-        extensions::ExtensionBuilder()
-            .SetManifest(manifest.Build())
-            .SetID(std::string(extension_id))
-            .Build();
-    if (!extension) {
-      return absl::nullopt;
-    }
-    extensions::TestExtensionSystem* extension_system =
-        static_cast<extensions::TestExtensionSystem*>(
-            extensions::ExtensionSystem::Get(profile_));
-    extensions::ExtensionService* extension_service =
-        extension_system->CreateExtensionService(
-            base::CommandLine::ForCurrentProcess(), base::FilePath(), false);
-    extension_service->AddExtension(extension.get());
-    return extension->GetResourceURL("index.html");
-  }
-#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
-
-  void ConnectToService(
-      mojo::PendingReceiver<blink::mojom::HidService> receiver) {
-    content::RenderFrameHostTester::For(main_rfh())
-        ->CreateHidServiceForTesting(std::move(receiver));
-  }
-
   void SimulateDeviceServiceCrash() {
     hid_manager_->SimulateConnectionError();
     hid_manager_.reset();
@@ -254,7 +174,9 @@
     return HidChooserContextFactory::GetForProfile(profile_);
   }
 
- private:
+  virtual void ConnectToService(
+      mojo::PendingReceiver<blink::mojom::HidService> receiver) = 0;
+
   void BindHidManager() {
     EXPECT_FALSE(hid_manager_);
     hid_manager_ = std::make_unique<device::FakeHidManager>();
@@ -266,501 +188,851 @@
     EXPECT_TRUE(devices_future.Wait());
   }
 
-  std::unique_ptr<device::FakeHidManager> hid_manager_;
-  std::unique_ptr<TestingProfileManager> profile_manager_;
-  raw_ptr<Profile> profile_ = nullptr;
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+  void SetUpUserManager(TestingProfile* profile) {
+    // On ChromeOS a user account is needed in order to check whether the user
+    // account is affiliated with the device owner for the purposes of applying
+    // enterprise policy.
+    constexpr char kTestUserGaiaId[] = "1111111111";
+    auto fake_user_manager = std::make_unique<ash::FakeChromeUserManager>();
+    auto* fake_user_manager_ptr = fake_user_manager.get();
+    scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>(
+        std::move(fake_user_manager));
 
+    auto account_id =
+        AccountId::FromUserEmailGaiaId(kTestUserEmail, kTestUserGaiaId);
+    fake_user_manager_ptr->AddUserWithAffiliationAndTypeAndProfile(
+        account_id, /*is_affiliated=*/false, user_manager::USER_TYPE_REGULAR,
+        profile);
+    fake_user_manager_ptr->LoginUser(account_id);
+  }
+
+  void TearDownUserManager() { scoped_user_manager_.reset(); }
+#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+  // Creates a fake extension with the specified `extension_id` so that it can
+  // exercise behaviors that are only enabled for privileged extensions.
+  scoped_refptr<const extensions::Extension> CreateExtensionWithId(
+      base::StringPiece extension_id) {
+    extensions::DictionaryBuilder manifest;
+    manifest.Set("name", "Fake extension")
+        .Set("description", "For testing.")
+        .Set("version", "0.1")
+        .Set("manifest_version", 2)
+        .Set("web_accessible_resources", extensions::ListBuilder()
+                                             .Append(kExtensionDocumentFileName)
+                                             .Build());
+    scoped_refptr<const extensions::Extension> extension =
+        extensions::ExtensionBuilder()
+            .SetManifest(manifest.Build())
+            .SetID(std::string(extension_id))
+            .Build();
+    if (!extension) {
+      return nullptr;
+    }
+    extensions::TestExtensionSystem* extension_system =
+        static_cast<extensions::TestExtensionSystem*>(
+            extensions::ExtensionSystem::Get(profile_));
+    extensions::ExtensionService* extension_service =
+        extension_system->CreateExtensionService(
+            base::CommandLine::ForCurrentProcess(), base::FilePath(), false);
+    extension_service->AddExtension(extension.get());
+    return extension;
+  }
+#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
+
+  void SetUpWebPageOriginUrl() { origin_url_ = GURL(kDefaultTestUrl); }
+
+  void SetUpExtensionOriginUrl() {
+    extension_ = CreateExtensionWithId(kPrivilegedExtensionId);
+    origin_url_ = extension_->origin().GetURL();
+  }
+
+  virtual void SetUpOriginUrl() = 0;
+
+  void TestHidServiceNotConnected() {
+    base::RunLoop run_loop;
+    mojo::Remote<blink::mojom::HidService> hid_service;
+    ConnectToService(hid_service.BindNewPipeAndPassReceiver());
+    hid_service.set_disconnect_handler(run_loop.QuitClosure());
+    run_loop.Run();
+    EXPECT_FALSE(hid_service.is_connected());
+  }
+
+  void TestAddChangeRemoveDevice() {
+    const auto origin = url::Origin::Create(origin_url_);
+    // Connect a device with one of its collections missing.
+    auto incomplete_device = CreateIncompleteFakeDevice();
+    AddDevice(incomplete_device);
+
+    // Grant permission to access `incomplete_device` from `origin`.
+    GetChooserContext()->GrantDevicePermission(origin, *incomplete_device);
+
+    // Create the HidService and register a `mock_client` to receive
+    // notifications on device connections and disconnections.
+    mojo::Remote<blink::mojom::HidService> hid_service;
+    ConnectToService(hid_service.BindNewPipeAndPassReceiver());
+    NiceMock<MockHidManagerClient> mock_client;
+    hid_service->RegisterClient(mock_client.BindReceiverAndPassRemote());
+
+    // Call GetDevices to ensure the service is started and the client is set.
+    {
+      TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
+      hid_service->GetDevices(devices_future.GetCallback());
+      ASSERT_THAT(devices_future.Get(),
+                  ElementsAre(HasGuid(incomplete_device->guid)));
+      EXPECT_EQ(devices_future.Get().front()->collections.size(),
+                incomplete_device->collections.size());
+    }
+
+    // Update the device with the missing collection.
+    auto complete_device = CreateFakeDevice();
+    complete_device->guid = incomplete_device->guid;
+    complete_device->serial_number = incomplete_device->serial_number;
+    TestFuture<device::mojom::HidDeviceInfoPtr> device_changed_future;
+    EXPECT_CALL(mock_client, DeviceChanged).WillOnce([&](auto d) {
+      device_changed_future.SetValue(std::move(d));
+    });
+    ChangeDevice(complete_device);
+    EXPECT_EQ(device_changed_future.Get()->guid, complete_device->guid);
+
+    // Call GetDevices and make sure there is still only one device with the
+    // same `guid` but the complete device info is returned.
+    {
+      TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
+      hid_service->GetDevices(devices_future.GetCallback());
+      ASSERT_THAT(devices_future.Get(),
+                  ElementsAre(HasGuid(incomplete_device->guid)));
+      EXPECT_EQ(devices_future.Get().front()->collections.size(),
+                complete_device->collections.size());
+    }
+
+    // Disconnect the devices. The `mock_client` should be notified.
+    TestFuture<device::mojom::HidDeviceInfoPtr> device_removed_future;
+    EXPECT_CALL(mock_client, DeviceRemoved).WillOnce([&](auto d) {
+      device_removed_future.SetValue(std::move(d));
+    });
+    RemoveDevice(incomplete_device);
+    EXPECT_EQ(device_removed_future.Get()->guid, incomplete_device->guid);
+
+    // Reconnect the device. The `mock_client` should be notified.
+    TestFuture<device::mojom::HidDeviceInfoPtr> device_added_future;
+    EXPECT_CALL(mock_client, DeviceAdded).WillOnce([&](auto d) {
+      device_added_future.SetValue(std::move(d));
+    });
+    AddDevice(complete_device);
+    EXPECT_EQ(device_added_future.Get()->guid, incomplete_device->guid);
+  }
+
+  void TestNoPermissionDevice() {
+    const auto origin = url::Origin::Create(origin_url_);
+
+    // Connect two devices.
+    auto allowed_device1 = CreateFakeDevice();
+    AddDevice(allowed_device1);
+    auto other_device1 = CreateFakeDevice();
+    AddDevice(other_device1);
+
+    // Grant permission to access `allowed_device1` from `origin`.
+    GetChooserContext()->GrantDevicePermission(origin, *allowed_device1);
+
+    // Create the HidService and register a `mock_client` to receive
+    // notifications on device connections and disconnections.
+    mojo::Remote<blink::mojom::HidService> hid_service;
+    ConnectToService(hid_service.BindNewPipeAndPassReceiver());
+    NiceMock<MockHidManagerClient> mock_client;
+    hid_service->RegisterClient(mock_client.BindReceiverAndPassRemote());
+
+    // Call GetDevices to ensure the service is started and the client is set.
+    TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
+    hid_service->GetDevices(devices_future.GetCallback());
+    EXPECT_THAT(devices_future.Get(),
+                ElementsAre(HasGuid(allowed_device1->guid)));
+
+    // Connect two more devices.
+    auto allowed_device2 = CreateFakeDevice();
+    AddDevice(allowed_device2);
+    auto other_device2 = CreateFakeDevice();
+    AddDevice(other_device2);
+
+    // Grant permission to access `allowed_device2` from `origin`.
+    GetChooserContext()->GrantDevicePermission(origin, *allowed_device2);
+
+    // Disconnect all four devices. The `mock_client` should be notified only
+    // for the devices it has permission to access.
+    RepeatingTestFuture<device::mojom::HidDeviceInfoPtr> device_removed_future;
+    EXPECT_CALL(mock_client, DeviceRemoved)
+        .Times(2)
+        .WillRepeatedly(
+            [&](auto d) { device_removed_future.AddValue(std::move(d)); });
+    RemoveDevice(allowed_device1);
+    RemoveDevice(allowed_device2);
+    RemoveDevice(other_device1);
+    RemoveDevice(other_device2);
+    EXPECT_EQ(device_removed_future.Take()->guid, allowed_device1->guid);
+    EXPECT_EQ(device_removed_future.Take()->guid, allowed_device2->guid);
+
+    // Reconnect all four devices. The `mock_client` should be notified only for
+    // the devices it has permission to access.
+    RepeatingTestFuture<device::mojom::HidDeviceInfoPtr> device_added_future;
+    EXPECT_CALL(mock_client, DeviceAdded).Times(2).WillRepeatedly([&](auto d) {
+      device_added_future.AddValue(std::move(d));
+    });
+    AddDevice(allowed_device1);
+    AddDevice(allowed_device2);
+    AddDevice(other_device1);
+    AddDevice(other_device2);
+    EXPECT_EQ(device_added_future.Take()->guid, allowed_device1->guid);
+    EXPECT_EQ(device_added_future.Take()->guid, allowed_device2->guid);
+  }
+
+  void TestReconnectHidService() {
+    const auto origin = url::Origin::Create(origin_url_);
+
+    // Connect two devices. Configure `ephemeral_device` with no serial number
+    // so it is not eligible for persistent permissions.
+    auto device = CreateFakeDevice();
+    auto ephemeral_device = CreateFakeDevice();
+    ephemeral_device->serial_number = "";
+    AddDevice(device);
+    AddDevice(ephemeral_device);
+
+    // Grant permission for `origin` to access both devices. `device` is
+    // eligible for persistent permissions and `ephemeral_device` is only
+    // eligible for ephemeral permissions.
+    GetChooserContext()->GrantDevicePermission(origin, *device);
+    GetChooserContext()->GrantDevicePermission(origin, *ephemeral_device);
+
+    // Create the HidService and register a `mock_client` to receive
+    // notifications on device connections and disconnections. Call `GetDevices`
+    // to ensure the service is started and the client is set.
+    mojo::Remote<blink::mojom::HidService> hid_service;
+    ConnectToService(hid_service.BindNewPipeAndPassReceiver());
+    NiceMock<MockHidManagerClient> mock_client;
+    hid_service->RegisterClient(mock_client.BindReceiverAndPassRemote());
+    {
+      TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
+      hid_service->GetDevices(devices_future.GetCallback());
+      EXPECT_THAT(devices_future.Get(),
+                  UnorderedElementsAre(HasGuid(device->guid),
+                                       HasGuid(ephemeral_device->guid)));
+    }
+
+    // Both permissions are granted.
+    EXPECT_TRUE(GetChooserContext()->HasDevicePermission(origin, *device));
+    EXPECT_TRUE(
+        GetChooserContext()->HasDevicePermission(origin, *ephemeral_device));
+
+    // Simulate a device service crash.
+    base::RunLoop loop;
+    EXPECT_CALL(mock_client, ConnectionError).WillOnce([&]() { loop.Quit(); });
+    SimulateDeviceServiceCrash();
+    loop.Run();
+
+    // The ephemeral permission is revoked.
+    EXPECT_TRUE(GetChooserContext()->HasDevicePermission(origin, *device));
+    EXPECT_FALSE(
+        GetChooserContext()->HasDevicePermission(origin, *ephemeral_device));
+
+    // Add a new device eligible for persistent permissions.
+    auto another_device = CreateFakeDevice();
+    AddDevice(another_device);
+    EXPECT_CALL(mock_client, DeviceAdded).Times(0);
+    base::RunLoop().RunUntilIdle();
+
+    // Grant the device permission while the service is off.
+    GetChooserContext()->GrantDevicePermission(origin, *another_device);
+
+    // `mock_client` is not notified when `device` is removed because the
+    // service is off.
+    RemoveDevice(device);
+    EXPECT_CALL(mock_client, DeviceRemoved).Times(0);
+    base::RunLoop().RunUntilIdle();
+
+    // Reconnect the service.
+    hid_service.reset();
+    ConnectToService(hid_service.BindNewPipeAndPassReceiver());
+    hid_service->RegisterClient(mock_client.BindReceiverAndPassRemote());
+    {
+      TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
+      hid_service->GetDevices(devices_future.GetCallback());
+      EXPECT_THAT(devices_future.Get(),
+                  ElementsAre(HasGuid(another_device->guid)));
+    }
+
+    // The persistent permissions are still granted.
+    EXPECT_TRUE(GetChooserContext()->HasDevicePermission(origin, *device));
+    EXPECT_TRUE(
+        GetChooserContext()->HasDevicePermission(origin, *another_device));
+    EXPECT_FALSE(
+        GetChooserContext()->HasDevicePermission(origin, *ephemeral_device));
+  }
+
+  void TestRevokeDevicePermission() {
+    const auto origin = url::Origin::Create(origin_url_);
+
+    // Connect a device.
+    auto device = CreateFakeDevice();
+    AddDevice(device);
+
+    // Create the `HidService`.
+    mojo::Remote<blink::mojom::HidService> hid_service;
+    ConnectToService(hid_service.BindNewPipeAndPassReceiver());
+
+    // Call GetDevices to ensure the service is started.
+    TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
+    hid_service->GetDevices(devices_future.GetCallback());
+    EXPECT_TRUE(devices_future.Get().empty());
+
+    // Grant permission to access the connected device.
+    GetChooserContext()->GrantDevicePermission(origin, *device);
+    auto objects = GetChooserContext()->GetGrantedObjects(origin);
+    ASSERT_EQ(1u, objects.size());
+
+    // Open a connection to `device`.
+    FakeHidConnectionClient connection_client;
+    mojo::PendingRemote<device::mojom::HidConnectionClient>
+        hid_connection_client;
+    connection_client.Bind(
+        hid_connection_client.InitWithNewPipeAndPassReceiver());
+    TestFuture<mojo::PendingRemote<device::mojom::HidConnection>>
+        pending_remote_future;
+    hid_service->Connect(device->guid, std::move(hid_connection_client),
+                         pending_remote_future.GetCallback());
+    mojo::Remote<device::mojom::HidConnection> connection;
+    connection.Bind(pending_remote_future.Take());
+    ASSERT_TRUE(connection);
+
+    // Revoke the permission. The device should be disconnected.
+    base::RunLoop disconnect_loop;
+    connection.set_disconnect_handler(disconnect_loop.QuitClosure());
+    GetChooserContext()->RevokeDevicePermission(origin, *device);
+    disconnect_loop.Run();
+  }
+
+  void TestRevokeDevicePermissionEphemeral() {
+    const auto origin = url::Origin::Create(origin_url_);
+
+    // Connect a device. Configure it with no serial number so it is not
+    // eligible for persistent permissions.
+    auto device = CreateFakeDevice();
+    device->serial_number = "";
+    AddDevice(device);
+
+    // Create the `HidService`.
+    mojo::Remote<blink::mojom::HidService> hid_service;
+    ConnectToService(hid_service.BindNewPipeAndPassReceiver());
+
+    // Call GetDevices to ensure the service is started.
+    TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
+    hid_service->GetDevices(devices_future.GetCallback());
+    EXPECT_TRUE(devices_future.Get().empty());
+
+    // Grant permission to access the connected device.
+    GetChooserContext()->GrantDevicePermission(origin, *device);
+    auto objects = GetChooserContext()->GetGrantedObjects(origin);
+    ASSERT_EQ(1u, objects.size());
+
+    // Open a connection to `device`.
+    FakeHidConnectionClient connection_client;
+    mojo::PendingRemote<device::mojom::HidConnectionClient>
+        hid_connection_client;
+    connection_client.Bind(
+        hid_connection_client.InitWithNewPipeAndPassReceiver());
+    TestFuture<mojo::PendingRemote<device::mojom::HidConnection>>
+        pending_remote_future;
+    hid_service->Connect(device->guid, std::move(hid_connection_client),
+                         pending_remote_future.GetCallback());
+    mojo::Remote<device::mojom::HidConnection> connection;
+    connection.Bind(pending_remote_future.Take());
+    ASSERT_TRUE(connection);
+
+    // Revoke the permission. The device should be disconnected.
+    base::RunLoop disconnect_loop;
+    connection.set_disconnect_handler(disconnect_loop.QuitClosure());
+    GetChooserContext()->RevokeDevicePermission(origin, *device);
+    disconnect_loop.Run();
+  }
+
+  void TestConnectAndDisconnect(content::WebContents* web_contents) {
+    const auto origin = url::Origin::Create(origin_url_);
+
+    // Create the `HidService`.
+    mojo::Remote<blink::mojom::HidService> hid_service;
+    ConnectToService(hid_service.BindNewPipeAndPassReceiver());
+
+    // Connect a device.
+    auto device = CreateFakeDevice();
+    AddDevice(device);
+
+    // Grant permission to access `device` from `origin`.
+    GetChooserContext()->GrantDevicePermission(origin, *device);
+
+    // Call `GetDevices` and expect the device to be returned.
+    TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
+    hid_service->GetDevices(devices_future.GetCallback());
+    EXPECT_THAT(devices_future.Take(), ElementsAre(HasGuid(device->guid)));
+
+    if (web_contents) {
+      // The `WebContents` should not indicate we are connected to a device.
+      EXPECT_FALSE(web_contents->IsConnectedToHidDevice());
+    }
+
+    // Open a connection to `device`.
+    FakeHidConnectionClient connection_client;
+    mojo::PendingRemote<device::mojom::HidConnectionClient>
+        hid_connection_client;
+    connection_client.Bind(
+        hid_connection_client.InitWithNewPipeAndPassReceiver());
+    TestFuture<mojo::PendingRemote<device::mojom::HidConnection>>
+        pending_remote_future;
+    hid_service->Connect(device->guid, std::move(hid_connection_client),
+                         pending_remote_future.GetCallback());
+    mojo::Remote<device::mojom::HidConnection> connection;
+    connection.Bind(pending_remote_future.Take());
+    ASSERT_TRUE(connection);
+
+    if (web_contents) {
+      // Now the `WebContents` should indicate we are connected to a device.
+      EXPECT_TRUE(web_contents->IsConnectedToHidDevice());
+    }
+
+    // Close `connection` and check that the `WebContents` no longer indicates
+    // we are connected.
+    connection.reset();
+    base::RunLoop().RunUntilIdle();
+
+    if (web_contents) {
+      EXPECT_FALSE(web_contents->IsConnectedToHidDevice());
+    }
+  }
+
+  void TestConnectAndRemove(content::WebContents* web_contents) {
+    const auto origin = url::Origin::Create(origin_url_);
+
+    // Create the `HidService`.
+    mojo::Remote<blink::mojom::HidService> hid_service;
+    ConnectToService(hid_service.BindNewPipeAndPassReceiver());
+
+    // Connect a device.
+    auto device = CreateFakeDevice();
+    AddDevice(device);
+
+    // Grant permission to access `device` from `origin`.
+    GetChooserContext()->GrantDevicePermission(origin, *device);
+
+    // Call `GetDevices` and expect the device to be returned.
+    TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
+    hid_service->GetDevices(devices_future.GetCallback());
+    EXPECT_THAT(devices_future.Take(), ElementsAre(HasGuid(device->guid)));
+
+    if (web_contents) {
+      // The `WebContents` should not indicate we are connected to a device.
+      EXPECT_FALSE(web_contents->IsConnectedToHidDevice());
+    }
+
+    // Open a connection to `device`.
+    FakeHidConnectionClient connection_client;
+    mojo::PendingRemote<device::mojom::HidConnectionClient>
+        hid_connection_client;
+    connection_client.Bind(
+        hid_connection_client.InitWithNewPipeAndPassReceiver());
+    TestFuture<mojo::PendingRemote<device::mojom::HidConnection>>
+        pending_remote_future;
+    hid_service->Connect(device->guid, std::move(hid_connection_client),
+                         pending_remote_future.GetCallback());
+    mojo::Remote<device::mojom::HidConnection> connection;
+    connection.Bind(pending_remote_future.Take());
+    ASSERT_TRUE(connection);
+
+    if (web_contents) {
+      // Now the `WebContents` should indicate we are connected to a device.
+      EXPECT_TRUE(web_contents->IsConnectedToHidDevice());
+    }
+
+    // Remove `device` and check that the `WebContents` no longer indicates we
+    // are connected.
+    RemoveDevice(device);
+    base::RunLoop().RunUntilIdle();
+
+    if (web_contents) {
+      EXPECT_FALSE(web_contents->IsConnectedToHidDevice());
+    }
+  }
+
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+  void TestFidoDeviceAllowedWithPrivilegedOrigin(
+      content::WebContents* web_contents) {
+    auto origin = url::Origin::Create(origin_url_);
+    // Connect a FIDO device.
+    auto device = CreateFakeFidoDevice();
+    AddDevice(device);
+
+    // Grant permission to access `device` from `privileged_origin`.
+    GetChooserContext()->GrantDevicePermission(origin, *device);
+
+    // Create the `HidService`.
+    mojo::Remote<blink::mojom::HidService> hid_service;
+    ConnectToService(hid_service.BindNewPipeAndPassReceiver());
+
+    // Call `GetDevices` and expect the device to be returned.
+    TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
+    hid_service->GetDevices(devices_future.GetCallback());
+    EXPECT_THAT(devices_future.Take(), ElementsAre(HasGuid(device->guid)));
+
+    if (web_contents) {
+      // The `WebContents` should not indicate we are connected to a device.
+      EXPECT_FALSE(web_contents->IsConnectedToHidDevice());
+    }
+
+    // Open a connection to `device`.
+    FakeHidConnectionClient connection_client;
+    mojo::PendingRemote<device::mojom::HidConnectionClient>
+        hid_connection_client;
+    connection_client.Bind(
+        hid_connection_client.InitWithNewPipeAndPassReceiver());
+    TestFuture<mojo::PendingRemote<device::mojom::HidConnection>>
+        pending_remote_future;
+    hid_service->Connect(device->guid, std::move(hid_connection_client),
+                         pending_remote_future.GetCallback());
+    mojo::Remote<device::mojom::HidConnection> connection;
+    connection.Bind(pending_remote_future.Take());
+    ASSERT_TRUE(connection);
+
+    if (web_contents) {
+      // Now the `WebContents` should indicate we are connected to a device.
+      EXPECT_TRUE(web_contents->IsConnectedToHidDevice());
+    }
+  }
+#endif
+
+ protected:
+  raw_ptr<TestingProfile> profile_ = nullptr;
+  GURL origin_url_;
+
+ private:
+  std::unique_ptr<device::FakeHidManager> hid_manager_;
 #if BUILDFLAG(IS_CHROMEOS_ASH)
   std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_;
 #endif
+  scoped_refptr<const extensions::Extension> extension_;
 };
 
+class ChromeHidDelegateRenderFrameTestBase
+    : public ChromeRenderViewHostTestHarness,
+      public ChromeHidTestHelper {
+ public:
+  void SetUp() override {
+    ChromeRenderViewHostTestHarness::SetUp();
+    profile_manager_ = std::make_unique<TestingProfileManager>(
+        TestingBrowserProcess::GetGlobal());
+    ASSERT_TRUE(profile_manager_->SetUp());
+    profile_ = profile_manager_->CreateTestingProfile(kTestUserEmail);
+    ASSERT_TRUE(profile_);
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+    SetUpUserManager(profile_.get());
+#endif
+    // Create a new web contents for `profile_`.
+    SetContents(
+        content::WebContentsTester::CreateTestWebContents(profile_, nullptr));
+    BindHidManager();
+    SetUpOriginUrl();
+    NavigateAndCommit(origin_url_);
+  }
+
+  void TearDown() override {
+    DeleteContents();
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+    TearDownUserManager();
+#endif
+    profile_manager_->DeleteAllTestingProfiles();
+    profile_manager_.reset();
+    profile_ = nullptr;
+    ChromeRenderViewHostTestHarness::TearDown();
+  }
+
+  // ChromeHidTestHelper
+  void ConnectToService(
+      mojo::PendingReceiver<blink::mojom::HidService> receiver) override {
+    content::RenderFrameHostTester::For(main_rfh())
+        ->CreateHidServiceForTesting(std::move(receiver));
+  }
+
+  void TestConnectAndNavigateCrossDocument(content::WebContents* web_contents) {
+    // The test assumes the previous page gets deleted after navigation,
+    // disconnecting the device. Disable back/forward cache to ensure that it
+    // doesn't get preserved in the cache.
+    // TODO(crbug.com/1346021): Integrate WebHID with bfcache and remove this.
+    content::DisableBackForwardCacheForTesting(
+        web_contents, content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
+
+    const auto origin = url::Origin::Create(origin_url_);
+
+    // Create the `HidService`.
+    mojo::Remote<blink::mojom::HidService> hid_service;
+    ConnectToService(hid_service.BindNewPipeAndPassReceiver());
+
+    // Connect a device.
+    auto device = CreateFakeDevice();
+    AddDevice(device);
+
+    // Grant permission to access `device` from `origin`.
+    GetChooserContext()->GrantDevicePermission(origin, *device);
+
+    // Call `GetDevices` and expect the device to be returned.
+    TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
+    hid_service->GetDevices(devices_future.GetCallback());
+    EXPECT_THAT(devices_future.Take(), ElementsAre(HasGuid(device->guid)));
+
+    // The `WebContents` should not indicate we are connected to a device.
+    EXPECT_FALSE(web_contents->IsConnectedToHidDevice());
+
+    // Open a connection to `device`.
+    FakeHidConnectionClient connection_client;
+    mojo::PendingRemote<device::mojom::HidConnectionClient>
+        hid_connection_client;
+    connection_client.Bind(
+        hid_connection_client.InitWithNewPipeAndPassReceiver());
+    TestFuture<mojo::PendingRemote<device::mojom::HidConnection>>
+        pending_remote_future;
+    hid_service->Connect(device->guid, std::move(hid_connection_client),
+                         pending_remote_future.GetCallback());
+    mojo::Remote<device::mojom::HidConnection> connection;
+    connection.Bind(pending_remote_future.Take());
+    ASSERT_TRUE(connection);
+
+    // Now the `WebContents` should indicate we are connected to a device.
+    EXPECT_TRUE(web_contents->IsConnectedToHidDevice());
+
+    // Perform a cross-document navigation. The `WebContents` should no longer
+    // indicate we are connected.
+    NavigateAndCommit(GURL(kCrossOriginTestUrl));
+    base::RunLoop().RunUntilIdle();
+
+    EXPECT_FALSE(web_contents->IsConnectedToHidDevice());
+  }
+
+ private:
+  std::unique_ptr<TestingProfileManager> profile_manager_;
+};
+
+class ChromeHidDelegateRenderFrameTest
+    : public ChromeHidDelegateRenderFrameTestBase {
+  // ChromeHidTestHelper
+  void SetUpOriginUrl() override { SetUpWebPageOriginUrl(); }
+};
+
+class ChromeHidDelegateServiceWorkerTestBase
+    : public content::EmbeddedWorkerInstanceTestHarness,
+      public ChromeHidTestHelper {
+ public:
+  void SetUp() override {
+    content::EmbeddedWorkerInstanceTestHarness::SetUp();
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+    SetUpUserManager(profile_.get());
+#endif
+    BindHidManager();
+    SetUpOriginUrl();
+    StartWorker();
+  }
+
+  void TearDown() override {
+    StopWorker();
+#if BUILDFLAG(IS_CHROMEOS_ASH)
+    TearDownUserManager();
+#endif
+    content::EmbeddedWorkerInstanceTestHarness::TearDown();
+  }
+
+  // ChromeHidTestHelper
+  void ConnectToService(
+      mojo::PendingReceiver<blink::mojom::HidService> receiver) override {
+    BindHidServiceToWorker(origin_url_, std::move(receiver));
+  }
+
+  void StartWorker() {
+    auto worker_url =
+        GURL(base::StringPrintf("%s/worker.js", origin_url_.spec().c_str()));
+    CreateAndStartWorker(origin_url_, worker_url);
+  }
+
+  void StopWorker() { StopAndResetWorker(); }
+
+  // content::EmbeddedWorkerInstanceTestHarness
+  std::unique_ptr<content::BrowserContext> CreateBrowserContext() override {
+    auto testing_profile = TestingProfile::Builder().Build();
+    profile_ = testing_profile.get();
+    return testing_profile;
+  }
+
+ private:
+  ScopedTestingLocalState testing_local_state_{
+      TestingBrowserProcess::GetGlobal()};
+};
+
+class ChromeHidDelegateServiceWorkerTest
+    : public ChromeHidDelegateServiceWorkerTestBase {
+ public:
+  // ChromeHidTestHelper
+  void SetUpOriginUrl() override { SetUpWebPageOriginUrl(); }
+};
+
+#if BUILDFLAG(ENABLE_EXTENSIONS)
+class EnableWebHidOnExtensionServiceWorkerHelper {
+ public:
+  EnableWebHidOnExtensionServiceWorkerHelper() {
+    scoped_feature_list_.InitWithFeatures(
+        {features::kEnableWebHidOnExtensionServiceWorker}, {});
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+class ChromeHidDelegateExtensionServiceWorkerTest
+    : public ChromeHidDelegateServiceWorkerTestBase {
+ public:
+  // ChromeHidTestHelper
+  void SetUpOriginUrl() override { SetUpExtensionOriginUrl(); }
+};
+
+class ChromeHidDelegateExtensionServiceWorkerFeatureEnabledTest
+    : public ChromeHidDelegateExtensionServiceWorkerTest,
+      public EnableWebHidOnExtensionServiceWorkerHelper {};
+
+class ChromeHidDelegateServiceWorkerTestFeatureEnabledTest
+    : public ChromeHidDelegateServiceWorkerTest,
+      public EnableWebHidOnExtensionServiceWorkerHelper {};
+
+class ChromeHidDelegateExtensionRenderFrameTest
+    : public ChromeHidDelegateRenderFrameTestBase {
+ public:
+  // ChromeHidTestHelper
+  void SetUpOriginUrl() override { SetUpExtensionOriginUrl(); }
+};
+#endif  // BUILDFLAG(ENABLE_EXTENSIONS)
+
 }  // namespace
 
-TEST_F(ChromeHidDelegateTest, AddChangeRemoveDevice) {
-  const auto origin = url::Origin::Create(GURL(kDefaultTestUrl));
-
-  // Connect a device with one of its collections missing.
-  auto incomplete_device = CreateIncompleteFakeDevice();
-  AddDevice(incomplete_device);
-
-  // Grant permission to access `incomplete_device` from `origin`.
-  GetChooserContext()->GrantDevicePermission(origin, *incomplete_device);
-
-  // Create the HidService and register a `mock_client` to receive
-  // notifications on device connections and disconnections.
-  mojo::Remote<blink::mojom::HidService> hid_service;
-  ConnectToService(hid_service.BindNewPipeAndPassReceiver());
-  NiceMock<MockHidManagerClient> mock_client;
-  hid_service->RegisterClient(mock_client.BindReceiverAndPassRemote());
-
-  // Call GetDevices to ensure the service is started and the client is set.
-  {
-    TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
-    hid_service->GetDevices(devices_future.GetCallback());
-    ASSERT_THAT(devices_future.Get(),
-                ElementsAre(HasGuid(incomplete_device->guid)));
-    EXPECT_EQ(devices_future.Get().front()->collections.size(),
-              incomplete_device->collections.size());
-  }
-
-  // Update the device with the missing collection.
-  auto complete_device = CreateFakeDevice();
-  complete_device->guid = incomplete_device->guid;
-  complete_device->serial_number = incomplete_device->serial_number;
-  TestFuture<device::mojom::HidDeviceInfoPtr> device_changed_future;
-  EXPECT_CALL(mock_client, DeviceChanged).WillOnce([&](auto d) {
-    device_changed_future.SetValue(std::move(d));
-  });
-  ChangeDevice(complete_device);
-  EXPECT_EQ(device_changed_future.Get()->guid, complete_device->guid);
-
-  // Call GetDevices and make sure there is still only one device with the same
-  // `guid` but the complete device info is returned.
-  {
-    TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
-    hid_service->GetDevices(devices_future.GetCallback());
-    ASSERT_THAT(devices_future.Get(),
-                ElementsAre(HasGuid(incomplete_device->guid)));
-    EXPECT_EQ(devices_future.Get().front()->collections.size(),
-              complete_device->collections.size());
-  }
-
-  // Disconnect the devices. The `mock_client` should be notified.
-  TestFuture<device::mojom::HidDeviceInfoPtr> device_removed_future;
-  EXPECT_CALL(mock_client, DeviceRemoved).WillOnce([&](auto d) {
-    device_removed_future.SetValue(std::move(d));
-  });
-  RemoveDevice(incomplete_device);
-  EXPECT_EQ(device_removed_future.Get()->guid, incomplete_device->guid);
-
-  // Reconnect the device. The `mock_client` should be notified.
-  TestFuture<device::mojom::HidDeviceInfoPtr> device_added_future;
-  EXPECT_CALL(mock_client, DeviceAdded).WillOnce([&](auto d) {
-    device_added_future.SetValue(std::move(d));
-  });
-  AddDevice(complete_device);
-  EXPECT_EQ(device_added_future.Get()->guid, incomplete_device->guid);
+TEST_F(ChromeHidDelegateRenderFrameTest, AddChangeRemoveDevice) {
+  TestAddChangeRemoveDevice();
 }
 
-TEST_F(ChromeHidDelegateTest, NoPermissionDevice) {
-  const auto origin = url::Origin::Create(GURL(kDefaultTestUrl));
-
-  // Connect two devices.
-  auto allowed_device1 = CreateFakeDevice();
-  AddDevice(allowed_device1);
-  auto other_device1 = CreateFakeDevice();
-  AddDevice(other_device1);
-
-  // Grant permission to access `allowed_device1` from `origin`.
-  GetChooserContext()->GrantDevicePermission(origin, *allowed_device1);
-
-  // Create the HidService and register a `mock_client` to receive
-  // notifications on device connections and disconnections.
-  mojo::Remote<blink::mojom::HidService> hid_service;
-  ConnectToService(hid_service.BindNewPipeAndPassReceiver());
-  NiceMock<MockHidManagerClient> mock_client;
-  hid_service->RegisterClient(mock_client.BindReceiverAndPassRemote());
-
-  // Call GetDevices to ensure the service is started and the client is set.
-  TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
-  hid_service->GetDevices(devices_future.GetCallback());
-  EXPECT_THAT(devices_future.Get(),
-              ElementsAre(HasGuid(allowed_device1->guid)));
-
-  // Connect two more devices.
-  auto allowed_device2 = CreateFakeDevice();
-  AddDevice(allowed_device2);
-  auto other_device2 = CreateFakeDevice();
-  AddDevice(other_device2);
-
-  // Grant permission to access `allowed_device2` from `origin`.
-  GetChooserContext()->GrantDevicePermission(origin, *allowed_device2);
-
-  // Disconnect all four devices. The `mock_client` should be notified only for
-  // the devices it has permission to access.
-  RepeatingTestFuture<device::mojom::HidDeviceInfoPtr> device_removed_future;
-  EXPECT_CALL(mock_client, DeviceRemoved).Times(2).WillRepeatedly([&](auto d) {
-    device_removed_future.AddValue(std::move(d));
-  });
-  RemoveDevice(allowed_device1);
-  RemoveDevice(allowed_device2);
-  RemoveDevice(other_device1);
-  RemoveDevice(other_device2);
-  EXPECT_EQ(device_removed_future.Take()->guid, allowed_device1->guid);
-  EXPECT_EQ(device_removed_future.Take()->guid, allowed_device2->guid);
-
-  // Reconnect all four devices. The `mock_client` should be notified only for
-  // the devices it has permission to access.
-  RepeatingTestFuture<device::mojom::HidDeviceInfoPtr> device_added_future;
-  EXPECT_CALL(mock_client, DeviceAdded).Times(2).WillRepeatedly([&](auto d) {
-    device_added_future.AddValue(std::move(d));
-  });
-  AddDevice(allowed_device1);
-  AddDevice(allowed_device2);
-  AddDevice(other_device1);
-  AddDevice(other_device2);
-  EXPECT_EQ(device_added_future.Take()->guid, allowed_device1->guid);
-  EXPECT_EQ(device_added_future.Take()->guid, allowed_device2->guid);
+TEST_F(ChromeHidDelegateRenderFrameTest, NoPermissionDevice) {
+  TestNoPermissionDevice();
 }
 
-TEST_F(ChromeHidDelegateTest, ReconnectHidService) {
-  const auto origin = url::Origin::Create(GURL(kDefaultTestUrl));
-
-  // Connect two devices. Configure `ephemeral_device` with no serial number so
-  // it is not eligible for persistent permissions.
-  auto device = CreateFakeDevice();
-  auto ephemeral_device = CreateFakeDevice();
-  ephemeral_device->serial_number = "";
-  AddDevice(device);
-  AddDevice(ephemeral_device);
-
-  // Grant permission for `origin` to access both devices. `device` is eligible
-  // for persistent permissions and `ephemeral_device` is only eligible for
-  // ephemeral permissions.
-  GetChooserContext()->GrantDevicePermission(origin, *device);
-  GetChooserContext()->GrantDevicePermission(origin, *ephemeral_device);
-
-  // Create the HidService and register a `mock_client` to receive
-  // notifications on device connections and disconnections. Call `GetDevices`
-  // to ensure the service is started and the client is set.
-  mojo::Remote<blink::mojom::HidService> hid_service;
-  ConnectToService(hid_service.BindNewPipeAndPassReceiver());
-  NiceMock<MockHidManagerClient> mock_client;
-  hid_service->RegisterClient(mock_client.BindReceiverAndPassRemote());
-  {
-    TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
-    hid_service->GetDevices(devices_future.GetCallback());
-    EXPECT_THAT(devices_future.Get(),
-                UnorderedElementsAre(HasGuid(device->guid),
-                                     HasGuid(ephemeral_device->guid)));
-  }
-
-  // Both permissions are granted.
-  EXPECT_TRUE(GetChooserContext()->HasDevicePermission(origin, *device));
-  EXPECT_TRUE(
-      GetChooserContext()->HasDevicePermission(origin, *ephemeral_device));
-
-  // Simulate a device service crash.
-  base::RunLoop loop;
-  EXPECT_CALL(mock_client, ConnectionError).WillOnce([&]() { loop.Quit(); });
-  SimulateDeviceServiceCrash();
-  loop.Run();
-
-  // The ephemeral permission is revoked.
-  EXPECT_TRUE(GetChooserContext()->HasDevicePermission(origin, *device));
-  EXPECT_FALSE(
-      GetChooserContext()->HasDevicePermission(origin, *ephemeral_device));
-
-  // Add a new device eligible for persistent permissions.
-  auto another_device = CreateFakeDevice();
-  AddDevice(another_device);
-  EXPECT_CALL(mock_client, DeviceAdded).Times(0);
-  base::RunLoop().RunUntilIdle();
-
-  // Grant the device permission while the service is off.
-  GetChooserContext()->GrantDevicePermission(origin, *another_device);
-
-  // `mock_client` is not notified when `device` is removed because the service
-  // is off.
-  RemoveDevice(device);
-  EXPECT_CALL(mock_client, DeviceRemoved).Times(0);
-  base::RunLoop().RunUntilIdle();
-
-  // Reconnect the service.
-  hid_service.reset();
-  ConnectToService(hid_service.BindNewPipeAndPassReceiver());
-  hid_service->RegisterClient(mock_client.BindReceiverAndPassRemote());
-  {
-    TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
-    hid_service->GetDevices(devices_future.GetCallback());
-    EXPECT_THAT(devices_future.Get(),
-                ElementsAre(HasGuid(another_device->guid)));
-  }
-
-  // The persistent permissions are still granted.
-  EXPECT_TRUE(GetChooserContext()->HasDevicePermission(origin, *device));
-  EXPECT_TRUE(
-      GetChooserContext()->HasDevicePermission(origin, *another_device));
-  EXPECT_FALSE(
-      GetChooserContext()->HasDevicePermission(origin, *ephemeral_device));
+TEST_F(ChromeHidDelegateRenderFrameTest, ReconnectHidService) {
+  TestReconnectHidService();
 }
 
-TEST_F(ChromeHidDelegateTest, RevokeDevicePermission) {
-  const auto origin = url::Origin::Create(GURL(kDefaultTestUrl));
-
-  // Connect a device.
-  auto device = CreateFakeDevice();
-  AddDevice(device);
-
-  // Create the `HidService`.
-  mojo::Remote<blink::mojom::HidService> hid_service;
-  ConnectToService(hid_service.BindNewPipeAndPassReceiver());
-
-  // Call GetDevices to ensure the service is started.
-  TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
-  hid_service->GetDevices(devices_future.GetCallback());
-  EXPECT_TRUE(devices_future.Get().empty());
-
-  // Grant permission to access the connected device.
-  GetChooserContext()->GrantDevicePermission(origin, *device);
-  auto objects = GetChooserContext()->GetGrantedObjects(origin);
-  ASSERT_EQ(1u, objects.size());
-
-  // Open a connection to `device`.
-  FakeHidConnectionClient connection_client;
-  mojo::PendingRemote<device::mojom::HidConnectionClient> hid_connection_client;
-  connection_client.Bind(
-      hid_connection_client.InitWithNewPipeAndPassReceiver());
-  TestFuture<mojo::PendingRemote<device::mojom::HidConnection>>
-      pending_remote_future;
-  hid_service->Connect(device->guid, std::move(hid_connection_client),
-                       pending_remote_future.GetCallback());
-  mojo::Remote<device::mojom::HidConnection> connection;
-  connection.Bind(pending_remote_future.Take());
-  ASSERT_TRUE(connection);
-
-  // Revoke the permission. The device should be disconnected.
-  base::RunLoop disconnect_loop;
-  connection.set_disconnect_handler(disconnect_loop.QuitClosure());
-  GetChooserContext()->RevokeDevicePermission(origin, *device);
-  disconnect_loop.Run();
+TEST_F(ChromeHidDelegateRenderFrameTest, RevokeDevicePermission) {
+  TestRevokeDevicePermission();
 }
 
-TEST_F(ChromeHidDelegateTest, RevokeDevicePermissionEphemeral) {
-  const auto origin = url::Origin::Create(GURL(kDefaultTestUrl));
-
-  // Connect a device. Configure it with no serial number so it is not eligible
-  // for persistent permissions.
-  auto device = CreateFakeDevice();
-  device->serial_number = "";
-  AddDevice(device);
-
-  // Create the `HidService`.
-  mojo::Remote<blink::mojom::HidService> hid_service;
-  ConnectToService(hid_service.BindNewPipeAndPassReceiver());
-
-  // Call GetDevices to ensure the service is started.
-  TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
-  hid_service->GetDevices(devices_future.GetCallback());
-  EXPECT_TRUE(devices_future.Get().empty());
-
-  // Grant permission to access the connected device.
-  GetChooserContext()->GrantDevicePermission(origin, *device);
-  auto objects = GetChooserContext()->GetGrantedObjects(origin);
-  ASSERT_EQ(1u, objects.size());
-
-  // Open a connection to `device`.
-  FakeHidConnectionClient connection_client;
-  mojo::PendingRemote<device::mojom::HidConnectionClient> hid_connection_client;
-  connection_client.Bind(
-      hid_connection_client.InitWithNewPipeAndPassReceiver());
-  TestFuture<mojo::PendingRemote<device::mojom::HidConnection>>
-      pending_remote_future;
-  hid_service->Connect(device->guid, std::move(hid_connection_client),
-                       pending_remote_future.GetCallback());
-  mojo::Remote<device::mojom::HidConnection> connection;
-  connection.Bind(pending_remote_future.Take());
-  ASSERT_TRUE(connection);
-
-  // Revoke the permission. The device should be disconnected.
-  base::RunLoop disconnect_loop;
-  connection.set_disconnect_handler(disconnect_loop.QuitClosure());
-  GetChooserContext()->RevokeDevicePermission(origin, *device);
-  disconnect_loop.Run();
+TEST_F(ChromeHidDelegateRenderFrameTest, RevokeDevicePermissionEphemeral) {
+  TestRevokeDevicePermissionEphemeral();
 }
 
-TEST_F(ChromeHidDelegateTest, ConnectAndDisconnect) {
-  const auto origin = url::Origin::Create(GURL(kDefaultTestUrl));
-
-  // Create the `HidService`.
-  mojo::Remote<blink::mojom::HidService> hid_service;
-  ConnectToService(hid_service.BindNewPipeAndPassReceiver());
-
-  // Connect a device.
-  auto device = CreateFakeDevice();
-  AddDevice(device);
-
-  // Grant permission to access `device` from `origin`.
-  GetChooserContext()->GrantDevicePermission(origin, *device);
-
-  // Call `GetDevices` and expect the device to be returned.
-  TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
-  hid_service->GetDevices(devices_future.GetCallback());
-  EXPECT_THAT(devices_future.Take(), ElementsAre(HasGuid(device->guid)));
-
-  // The `WebContents` should not indicate we are connected to a device.
-  EXPECT_FALSE(web_contents()->IsConnectedToHidDevice());
-
-  // Open a connection to `device`.
-  FakeHidConnectionClient connection_client;
-  mojo::PendingRemote<device::mojom::HidConnectionClient> hid_connection_client;
-  connection_client.Bind(
-      hid_connection_client.InitWithNewPipeAndPassReceiver());
-  TestFuture<mojo::PendingRemote<device::mojom::HidConnection>>
-      pending_remote_future;
-  hid_service->Connect(device->guid, std::move(hid_connection_client),
-                       pending_remote_future.GetCallback());
-  mojo::Remote<device::mojom::HidConnection> connection;
-  connection.Bind(pending_remote_future.Take());
-  ASSERT_TRUE(connection);
-
-  // Now the `WebContents` should indicate we are connected to a device.
-  EXPECT_TRUE(web_contents()->IsConnectedToHidDevice());
-
-  // Close `connection` and check that the `WebContents` no longer indicates we
-  // are connected.
-  connection.reset();
-  base::RunLoop().RunUntilIdle();
-
-  EXPECT_FALSE(web_contents()->IsConnectedToHidDevice());
+TEST_F(ChromeHidDelegateRenderFrameTest, ConnectAndDisconnect) {
+  TestConnectAndDisconnect(web_contents());
 }
 
-TEST_F(ChromeHidDelegateTest, ConnectAndRemove) {
-  const auto origin = url::Origin::Create(GURL(kDefaultTestUrl));
-
-  // Create the `HidService`.
-  mojo::Remote<blink::mojom::HidService> hid_service;
-  ConnectToService(hid_service.BindNewPipeAndPassReceiver());
-
-  // Connect a device.
-  auto device = CreateFakeDevice();
-  AddDevice(device);
-
-  // Grant permission to access `device` from `origin`.
-  GetChooserContext()->GrantDevicePermission(origin, *device);
-
-  // Call `GetDevices` and expect the device to be returned.
-  TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
-  hid_service->GetDevices(devices_future.GetCallback());
-  EXPECT_THAT(devices_future.Take(), ElementsAre(HasGuid(device->guid)));
-
-  // The `WebContents` should not indicate we are connected to a device.
-  EXPECT_FALSE(web_contents()->IsConnectedToHidDevice());
-
-  // Open a connection to `device`.
-  FakeHidConnectionClient connection_client;
-  mojo::PendingRemote<device::mojom::HidConnectionClient> hid_connection_client;
-  connection_client.Bind(
-      hid_connection_client.InitWithNewPipeAndPassReceiver());
-  TestFuture<mojo::PendingRemote<device::mojom::HidConnection>>
-      pending_remote_future;
-  hid_service->Connect(device->guid, std::move(hid_connection_client),
-                       pending_remote_future.GetCallback());
-  mojo::Remote<device::mojom::HidConnection> connection;
-  connection.Bind(pending_remote_future.Take());
-  ASSERT_TRUE(connection);
-
-  // Now the `WebContents` should indicate we are connected to a device.
-  EXPECT_TRUE(web_contents()->IsConnectedToHidDevice());
-
-  // Remove `device` and check that the `WebContents` no longer indicates we are
-  // connected.
-  RemoveDevice(device);
-  base::RunLoop().RunUntilIdle();
-
-  EXPECT_FALSE(web_contents()->IsConnectedToHidDevice());
+TEST_F(ChromeHidDelegateRenderFrameTest, ConnectAndRemove) {
+  TestConnectAndRemove(web_contents());
 }
 
-TEST_F(ChromeHidDelegateTest, ConnectAndNavigateCrossDocument) {
-  // The test assumes the previous page gets deleted after navigation,
-  // disconnecting the device. Disable back/forward cache to ensure that it
-  // doesn't get preserved in the cache.
-  // TODO(crbug.com/1346021): Integrate WebHID with bfcache and remove this.
-  content::DisableBackForwardCacheForTesting(
-      web_contents(), content::BackForwardCache::TEST_REQUIRES_NO_CACHING);
+TEST_F(ChromeHidDelegateRenderFrameTest, ConnectAndNavigateCrossDocument) {
+  TestConnectAndNavigateCrossDocument(web_contents());
+}
 
-  const auto origin = url::Origin::Create(GURL(kDefaultTestUrl));
+TEST_F(ChromeHidDelegateExtensionServiceWorkerTest, HidServiceNotConnected) {
+  TestHidServiceNotConnected();
+}
 
-  // Create the `HidService`.
-  mojo::Remote<blink::mojom::HidService> hid_service;
-  ConnectToService(hid_service.BindNewPipeAndPassReceiver());
+TEST_F(ChromeHidDelegateServiceWorkerTest, HidServiceNotConnected) {
+  TestHidServiceNotConnected();
+}
 
-  // Connect a device.
-  auto device = CreateFakeDevice();
-  AddDevice(device);
-
-  // Grant permission to access `device` from `origin`.
-  GetChooserContext()->GrantDevicePermission(origin, *device);
-
-  // Call `GetDevices` and expect the device to be returned.
-  TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
-  hid_service->GetDevices(devices_future.GetCallback());
-  EXPECT_THAT(devices_future.Take(), ElementsAre(HasGuid(device->guid)));
-
-  // The `WebContents` should not indicate we are connected to a device.
-  EXPECT_FALSE(web_contents()->IsConnectedToHidDevice());
-
-  // Open a connection to `device`.
-  FakeHidConnectionClient connection_client;
-  mojo::PendingRemote<device::mojom::HidConnectionClient> hid_connection_client;
-  connection_client.Bind(
-      hid_connection_client.InitWithNewPipeAndPassReceiver());
-  TestFuture<mojo::PendingRemote<device::mojom::HidConnection>>
-      pending_remote_future;
-  hid_service->Connect(device->guid, std::move(hid_connection_client),
-                       pending_remote_future.GetCallback());
-  mojo::Remote<device::mojom::HidConnection> connection;
-  connection.Bind(pending_remote_future.Take());
-  ASSERT_TRUE(connection);
-
-  // Now the `WebContents` should indicate we are connected to a device.
-  EXPECT_TRUE(web_contents()->IsConnectedToHidDevice());
-
-  // Perform a cross-document navigation. The `WebContents` should no longer
-  // indicate we are connected.
-  NavigateAndCommit(GURL(kCrossOriginTestUrl));
-  base::RunLoop().RunUntilIdle();
-
-  EXPECT_FALSE(web_contents()->IsConnectedToHidDevice());
+TEST_F(ChromeHidDelegateServiceWorkerTestFeatureEnabledTest,
+       HidServiceNotConnected) {
+  TestHidServiceNotConnected();
 }
 
 #if BUILDFLAG(ENABLE_EXTENSIONS)
-TEST_F(ChromeHidDelegateTest, FidoDeviceAllowedWithPrivilegedOrigin) {
-  // Create an extension with an allowlisted extension ID.
-  absl::optional<GURL> privileged_url =
-      CreateExtensionWithId(kPrivilegedExtensionId);
-  ASSERT_TRUE(privileged_url);
+TEST_F(ChromeHidDelegateExtensionRenderFrameTest,
+       FidoDeviceAllowedWithPrivilegedOrigin) {
+  TestFidoDeviceAllowedWithPrivilegedOrigin(web_contents());
+}
 
-  const auto privileged_origin = url::Origin::Create(*privileged_url);
+TEST_F(ChromeHidDelegateExtensionRenderFrameTest, AddChangeRemoveDevice) {
+  TestAddChangeRemoveDevice();
+}
 
-  // Connect a FIDO device.
-  auto device = CreateFakeFidoDevice();
-  AddDevice(device);
+TEST_F(ChromeHidDelegateExtensionRenderFrameTest, NoPermissionDevice) {
+  TestNoPermissionDevice();
+}
 
-  // Grant permission to access `device` from `privileged_origin`.
-  GetChooserContext()->GrantDevicePermission(privileged_origin, *device);
+TEST_F(ChromeHidDelegateExtensionRenderFrameTest, ReconnectHidService) {
+  TestReconnectHidService();
+}
 
-  // Navigate to `privileged_url` so the current frame is privileged.
-  NavigateAndCommit(*privileged_url);
+TEST_F(ChromeHidDelegateExtensionRenderFrameTest, RevokeDevicePermission) {
+  TestRevokeDevicePermission();
+}
 
-  // Create the `HidService`.
-  mojo::Remote<blink::mojom::HidService> hid_service;
-  ConnectToService(hid_service.BindNewPipeAndPassReceiver());
+TEST_F(ChromeHidDelegateExtensionRenderFrameTest,
+       RevokeDevicePermissionEphemeral) {
+  TestRevokeDevicePermissionEphemeral();
+}
 
-  // Call `GetDevices` and expect the device to be returned.
-  TestFuture<std::vector<device::mojom::HidDeviceInfoPtr>> devices_future;
-  hid_service->GetDevices(devices_future.GetCallback());
-  EXPECT_THAT(devices_future.Take(), ElementsAre(HasGuid(device->guid)));
+TEST_F(ChromeHidDelegateExtensionRenderFrameTest, ConnectAndDisconnect) {
+  TestConnectAndDisconnect(web_contents());
+}
 
-  // The `WebContents` should not indicate we are connected to a device.
-  EXPECT_FALSE(web_contents()->IsConnectedToHidDevice());
+TEST_F(ChromeHidDelegateExtensionRenderFrameTest, ConnectAndRemove) {
+  TestConnectAndRemove(web_contents());
+}
 
-  // Open a connection to `device`.
-  FakeHidConnectionClient connection_client;
-  mojo::PendingRemote<device::mojom::HidConnectionClient> hid_connection_client;
-  connection_client.Bind(
-      hid_connection_client.InitWithNewPipeAndPassReceiver());
-  TestFuture<mojo::PendingRemote<device::mojom::HidConnection>>
-      pending_remote_future;
-  hid_service->Connect(device->guid, std::move(hid_connection_client),
-                       pending_remote_future.GetCallback());
-  mojo::Remote<device::mojom::HidConnection> connection;
-  connection.Bind(pending_remote_future.Take());
-  ASSERT_TRUE(connection);
+TEST_F(ChromeHidDelegateExtensionRenderFrameTest,
+       ConnectAndNavigateCrossDocument) {
+  TestConnectAndNavigateCrossDocument(web_contents());
+}
 
-  // Now the `WebContents` should indicate we are connected to a device.
-  EXPECT_TRUE(web_contents()->IsConnectedToHidDevice());
+TEST_F(ChromeHidDelegateExtensionServiceWorkerFeatureEnabledTest,
+       AddChangeRemoveDevice) {
+  TestAddChangeRemoveDevice();
+}
+
+TEST_F(ChromeHidDelegateExtensionServiceWorkerFeatureEnabledTest,
+       NoPermissionDevice) {
+  TestNoPermissionDevice();
+}
+
+TEST_F(ChromeHidDelegateExtensionServiceWorkerFeatureEnabledTest,
+       ReconnectHidService) {
+  TestReconnectHidService();
+}
+
+TEST_F(ChromeHidDelegateExtensionServiceWorkerFeatureEnabledTest,
+       RevokeDevicePermission) {
+  TestRevokeDevicePermission();
+}
+
+TEST_F(ChromeHidDelegateExtensionServiceWorkerFeatureEnabledTest,
+       RevokeDevicePermissionEphemeral) {
+  TestRevokeDevicePermissionEphemeral();
+}
+
+TEST_F(ChromeHidDelegateExtensionServiceWorkerFeatureEnabledTest,
+       ConnectAndDisconnect) {
+  TestConnectAndDisconnect(/*web_contents=*/nullptr);
+}
+
+TEST_F(ChromeHidDelegateExtensionServiceWorkerFeatureEnabledTest,
+       ConnectAndRemove) {
+  TestConnectAndRemove(/*web_contents=*/nullptr);
 }
 #endif  // BUILDFLAG(ENABLE_EXTENSIONS)
 
diff --git a/chrome/browser/lacros/cert/cert_db_initializer_browsertest.cc b/chrome/browser/lacros/cert/cert_db_initializer_browsertest.cc
index 360dc0ad..dcbf3390 100644
--- a/chrome/browser/lacros/cert/cert_db_initializer_browsertest.cc
+++ b/chrome/browser/lacros/cert/cert_db_initializer_browsertest.cc
@@ -17,7 +17,7 @@
 #include "chrome/common/chrome_paths.h"
 #include "chrome/test/base/in_process_browser_test.h"
 #include "chromeos/crosapi/cpp/keystore_service_util.h"
-#include "chromeos/crosapi/mojom/cert_database.mojom.h"
+#include "chromeos/crosapi/mojom/keystore_service.mojom.h"
 #include "chromeos/lacros/lacros_service.h"
 #include "chromeos/lacros/lacros_test_helper.h"
 #include "components/version_info/version_info.h"
@@ -51,12 +51,6 @@
 // |kRootCaCert|.
 constexpr char kServerCert[] = "ok_cert.pem";
 
-bool IsMojoCertDatabaseVersionAtLeast(int required_version) {
-  DCHECK(chromeos::LacrosService::Get());
-  return (chromeos::LacrosService::Get()->GetInterfaceVersion(
-              crosapi::mojom::CertDatabase::Uuid_) >= required_version);
-}
-
 base::FilePath GetTestCertsPath() {
   base::FilePath test_data_dir;
   EXPECT_TRUE(base::PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir));
@@ -277,14 +271,6 @@
 // Tests that when Ash imports a new certificate, Lacros receives a
 // notification about it.
 IN_PROC_BROWSER_TEST_F(CertDbInitializerTest, CertsChangedNotificationFromAsh) {
-  if (!IsMojoCertDatabaseVersionAtLeast(
-          crosapi::mojom::CertDatabase::
-              kAddAshCertDatabaseObserverMinVersion) &&
-      !chromeos::IsAshVersionAtLeastForTesting(base::Version({101, 0, 4917}))) {
-    LOG(WARNING) << "Ash is too old, skipping the test.";
-    return;
-  }
-
   auto& keystore_crosapi = chromeos::LacrosService::Get()
                                ->GetRemote<crosapi::mojom::KeystoreService>();
 
diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java
index fe84362..717d1ed 100644
--- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java
+++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java
@@ -43,6 +43,7 @@
 import java.util.HashMap;
 import java.util.LinkedHashSet;
 import java.util.Locale;
+import java.util.Set;
 
 /**
  * Implements a modal dialog that prompts the user to change their UI language. Displayed once at
@@ -419,8 +420,14 @@
      */
     private static LinkedHashSet<LanguageItem> getTopLanguages(
             Collection<LanguageItem> uiLanguages, LanguageItem currentOverrideLanguage) {
-        LinkedHashSet<String> topLanguageCodes =
-                new LinkedHashSet<>(GeoLanguageProviderBridge.getCurrentGeoLanguages());
+        LinkedHashSet<String> topLanguageCodes = new LinkedHashSet<>();
+
+        if (ChromeFeatureList.isEnabled(ChromeFeatureList.APP_LANGUAGE_PROMPT_ULP)) {
+            topLanguageCodes.addAll(LanguageBridge.getULPFromPreference());
+        } else {
+            topLanguageCodes.addAll(GeoLanguageProviderBridge.getCurrentGeoLanguages());
+        }
+        // Add current Accept-Languages to bottom of top languages list.
         topLanguageCodes.addAll(TranslateBridge.getUserLanguageCodes());
 
         Locale originalSystemLocale =
@@ -432,9 +439,9 @@
     }
 
     /**
-     * Helper function isolating the logic for making the top language list for testing. Adds the
-     * system default language to the top of the list if needed and only adds top languages that are
-     * possible UI languages.
+     * Helper function isolating the top language list logic for testing.
+     * The original system language is replaced by the system default language
+     * which is added to the top of the list. Languages that can not be UI languages are removed.
      * @param uiLanguages Collection of possible UI languages.
      * @param topLanguageCodes Ordered set of potential top languages tags.
      * @param currentOverrideLanguage The LanguageItem representing the current UI language.
@@ -445,64 +452,67 @@
     static LinkedHashSet<LanguageItem> getTopLanguagesHelper(Collection<LanguageItem> uiLanguages,
             LinkedHashSet<String> topLanguageCodes, LanguageItem currentOverrideLanguage,
             Locale originalSystemLocale) {
-        // Remove the exact language from top language codes if there are multiple UI languages
-        // with the same base, otherwise remove the base language.
-        if (AppLocaleUtils.hasMultipleUiLanguageVariants(originalSystemLocale.toLanguageTag())) {
-            topLanguageCodes.remove(originalSystemLocale.toLanguageTag());
-        } else {
-            topLanguageCodes.remove(originalSystemLocale.getLanguage());
-        }
-
-        // The system default language should always be at the top of the list unless the current
-        // override language is equal to the original system language. In that case only the
-        // current override language is added to the top of the list.
         LinkedHashSet<LanguageItem> topLanguages = new LinkedHashSet<>();
-        if (currentOverrideLanguage.isSystemDefault()) {
-            topLanguages.add(LanguageItem.makeFollowSystemLanguageItem());
-        } else if (!isOverrideLanguageOriginalSystemLanguage(
-                           currentOverrideLanguage, originalSystemLocale)) {
-            topLanguages.add(LanguageItem.makeFollowSystemLanguageItem());
-            topLanguages.add(currentOverrideLanguage);
-        } else {
-            // The current override language can only be the original system language if it has
-            // already been changed in settings. The option to track the system language is not
-            // given in the app language promo - but can be reset from Language Settings.
-            topLanguages.add(currentOverrideLanguage);
-        }
 
         // Make a map of code -> LanguageItem for UI languages
         HashMap<String, LanguageItem> uiLanguagesMap = new HashMap<>();
         for (LanguageItem item : uiLanguages) {
             uiLanguagesMap.put(item.getCode(), item);
         }
-        // Only add top languages that can be UI languages.
+
+        String originalSystemLocalAsUILanguage = getPotentialUILanguage(
+                originalSystemLocale.toLanguageTag(), uiLanguagesMap.keySet());
+
+        // The system default language should always be at the top of the list unless the current
+        // override language is equal to the original system language. In that case only the
+        // current override language is added to the top of the list.
+        if (currentOverrideLanguage.isSystemDefault()) {
+            topLanguages.add(LanguageItem.makeFollowSystemLanguageItem());
+        } else if (TextUtils.equals(
+                           currentOverrideLanguage.getCode(), originalSystemLocalAsUILanguage)) {
+            // The override language is set to original system language, this can only happen if
+            // the App Language has been changed in settings. In this case the option to track the
+            // system language is not given in the app language promo - but can be reset from
+            // Language Settings.
+            topLanguages.add(currentOverrideLanguage);
+        } else {
+            topLanguages.add(LanguageItem.makeFollowSystemLanguageItem());
+            topLanguages.add(currentOverrideLanguage);
+        }
+
+        // Only add top languages that can be UI languages and are not the original system language.
         for (String code : topLanguageCodes) {
+            // Check for exact match
             LanguageItem item = uiLanguagesMap.get(code);
-            if (item != null) topLanguages.add(item);
+            if (item != null) {
+                if (!TextUtils.equals(item.getCode(), originalSystemLocalAsUILanguage)) {
+                    topLanguages.add(item);
+                }
+                continue;
+            }
+            // Check for base match
+            item = uiLanguagesMap.get(LocaleUtils.toLanguage(code));
+            if (item != null
+                    && !LocaleUtils.isBaseLanguageEqual(code, originalSystemLocalAsUILanguage)) {
+                topLanguages.add(item);
+            }
         }
         return topLanguages;
     }
 
     /**
-     * Returns true if the current override language is the same as the original system language.
-     * For languages that have only one Chrome UI language variant the base languages are compared
-     * and for languages with multiple Chrome UI languages the full language tag is compared.
-     * @param overrideLanguage LanguageItem for the current override language.
-     * @param originalSystemLocale String language code for the original system locale.
-     * @return Whether or not the override language is the same as the original system language.
+     * If |language| is in |uiLanguages| return it otherwise return the base language. If the
+     * return value is a country specific language that means it is a UI variant.
+     * @param language ISO 639 language code (e.g. en-US or en).
+     * @param uiLanguages Set of ISO 639 languages that are potential UI languages.
+     * @return |language| converted to a potential UI language.
      */
     @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
-    static boolean isOverrideLanguageOriginalSystemLanguage(
-            LanguageItem overrideLanguage, Locale originalSystemLocale) {
-        if (overrideLanguage.isSystemDefault()) {
-            return false;
+    static String getPotentialUILanguage(String language, Set<String> uiLanguages) {
+        if (uiLanguages.contains(language)) {
+            return language;
         }
-        if (AppLocaleUtils.hasMultipleUiLanguageVariants(overrideLanguage.getCode())) {
-            return TextUtils.equals(
-                    overrideLanguage.getCode(), originalSystemLocale.toLanguageTag());
-        }
-        return LocaleUtils.isBaseLanguageEqual(
-                overrideLanguage.getCode(), originalSystemLocale.toLanguageTag());
+        return LocaleUtils.toLanguage(language);
     }
 
     /**
diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialogTest.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialogTest.java
index 0fd66779..79424a4b 100644
--- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialogTest.java
+++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialogTest.java
@@ -120,10 +120,10 @@
 
         // Current override language is en-US, System Language is en-US
         topLanguages = AppLanguagePromoDialog.getTopLanguagesHelper(mUiLanguages,
-                new LinkedHashSet<>(Arrays.asList("zu", "af", "an", "en-AU", "en-US")), mLangEnUs,
-                LocaleUtils.forLanguageTag("en-US"));
-        Assert.assertEquals(
-                new ArrayList<>(topLanguages), Arrays.asList(mLangEnUs, mLangZu, mLangAf));
+                new LinkedHashSet<>(Arrays.asList("zu", "af", "an", "en-AU", "en-US", "en-GB")),
+                mLangEnUs, LocaleUtils.forLanguageTag("en-US"));
+        Assert.assertEquals(new ArrayList<>(topLanguages),
+                Arrays.asList(mLangEnUs, mLangZu, mLangAf, mLangEnGb));
 
         // Current override language is Afrikaans, System Language is Zulu
         topLanguages = AppLanguagePromoDialog.getTopLanguagesHelper(mUiLanguages,
@@ -152,25 +152,32 @@
                 mFollowSystem, LocaleUtils.forLanguageTag("af-ZA"));
         Assert.assertEquals(
                 new ArrayList<>(topLanguages), Arrays.asList(mFollowSystem, mLangEnUs, mLangZu));
+
+        // Test that country specific top languages are converted to their base language.
+        topLanguages = AppLanguagePromoDialog.getTopLanguagesHelper(mUiLanguages,
+                new LinkedHashSet<>(
+                        Arrays.asList("af-ZA", "af-NA", "an", "as", "en-US", "en-AU", "zu-XX")),
+                mFollowSystem, LocaleUtils.forLanguageTag("en-US"));
+        Assert.assertEquals(
+                new ArrayList<>(topLanguages), Arrays.asList(mFollowSystem, mLangAf, mLangZu));
     }
 
     // Test isOverrideLanguageOriginalSystemLanguage
     @Test
     @SmallTest
-    public void testIsOverrideLanguageOriginalSystemLanguage() {
-        // Only one UI variant: Afrikaans
-        Assert.assertTrue(AppLanguagePromoDialog.isOverrideLanguageOriginalSystemLanguage(
-                mLangAf, LocaleUtils.forLanguageTag("af-ZA")));
-
-        // Multiple UI variants: en-US
-        Assert.assertFalse(AppLanguagePromoDialog.isOverrideLanguageOriginalSystemLanguage(
-                mLangEnGb, LocaleUtils.forLanguageTag("en-US")));
-        Assert.assertTrue(AppLanguagePromoDialog.isOverrideLanguageOriginalSystemLanguage(
-                mLangEnUs, LocaleUtils.forLanguageTag("en-US")));
-
-        // Follow system language
-        Assert.assertFalse(AppLanguagePromoDialog.isOverrideLanguageOriginalSystemLanguage(
-                mFollowSystem, LocaleUtils.forLanguageTag("zu")));
+    public void testGetPotentialUILanguage() {
+        LinkedHashSet<String> uiLanguages =
+                new LinkedHashSet<>(Arrays.asList("af", "en-US", "en-GB", "es", "es-419"));
+        Assert.assertEquals(
+                AppLanguagePromoDialog.getPotentialUILanguage("af-ZA", uiLanguages), "af");
+        Assert.assertEquals(
+                AppLanguagePromoDialog.getPotentialUILanguage("en-GB", uiLanguages), "en-GB");
+        Assert.assertEquals(
+                AppLanguagePromoDialog.getPotentialUILanguage("en-ZA", uiLanguages), "en");
+        Assert.assertEquals(
+                AppLanguagePromoDialog.getPotentialUILanguage("es-AR", uiLanguages), "es");
+        Assert.assertEquals(
+                AppLanguagePromoDialog.getPotentialUILanguage("es-419", uiLanguages), "es-419");
     }
 
     // Test LanguageItemAdapter
diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtils.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtils.java
index b209ef2..7a7be258 100644
--- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtils.java
+++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtils.java
@@ -24,7 +24,6 @@
 
 import java.util.Arrays;
 import java.util.Comparator;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 
@@ -228,28 +227,6 @@
     }
 
     /**
-     * Return true if the base language of |languageCode| has multiple UI language variants (e.g.
-     * pt-BR and pt-PT).
-     * @param languageCode Language tag to look up.
-     * @return Whether or not |languageCode| has multiple UI language variants.
-     */
-    public static boolean hasMultipleUiLanguageVariants(String languageCode) {
-        if (isFollowSystemLanguage(languageCode)) {
-            return false;
-        }
-        String baseLanguage = LocaleUtils.toLanguage(languageCode);
-        HashSet<String> baseLanguages = new HashSet<String>();
-        for (String code : ResourceBundle.getAvailableLocales()) {
-            String base = LocaleUtils.toLanguage(code);
-            if (baseLanguages.contains(base) && TextUtils.equals(base, baseLanguage)) {
-                return true;
-            }
-            baseLanguages.add(LocaleUtils.toLanguage(code));
-        }
-        return false;
-    }
-
-    /**
      * Return true if the locale is an exact match for an available UI language.
      * Note: "en" and "en-AU" will return false since the available locales are "en-GB" and "en-US".
      * @param potentialUiLanguage BCP-47 language tag representing a locale (e.g. "en-US")
diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtilsTest.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtilsTest.java
index 2a2ef8f..02c2b0d 100644
--- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtilsTest.java
+++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLocaleUtilsTest.java
@@ -126,23 +126,6 @@
         }
     }
 
-    @Test
-    @SmallTest
-    public void testHasMultipleUiLanguageVariants() {
-        Assert.assertTrue(AppLocaleUtils.hasMultipleUiLanguageVariants("en-US"));
-        Assert.assertTrue(AppLocaleUtils.hasMultipleUiLanguageVariants("en-AU"));
-        Assert.assertTrue(AppLocaleUtils.hasMultipleUiLanguageVariants("pt-BR"));
-        Assert.assertTrue(AppLocaleUtils.hasMultipleUiLanguageVariants("es"));
-
-        Assert.assertFalse(AppLocaleUtils.hasMultipleUiLanguageVariants("af"));
-        Assert.assertFalse(AppLocaleUtils.hasMultipleUiLanguageVariants("af-ZA"));
-        Assert.assertFalse(AppLocaleUtils.hasMultipleUiLanguageVariants("fil"));
-        Assert.assertFalse(AppLocaleUtils.hasMultipleUiLanguageVariants("zu"));
-
-        // Non existent UI language is false.
-        Assert.assertFalse(AppLocaleUtils.hasMultipleUiLanguageVariants("dne"));
-    }
-
     // Helper function to manually get and check AppLanguagePref.
     private void assertLanguagePrefEquals(String language) {
         Assert.assertEquals(language,
diff --git a/chrome/browser/net/profile_network_context_service.cc b/chrome/browser/net/profile_network_context_service.cc
index b344169..efebd1c7 100644
--- a/chrome/browser/net/profile_network_context_service.cc
+++ b/chrome/browser/net/profile_network_context_service.cc
@@ -429,6 +429,14 @@
       block_trust_tokens));
 }
 
+void ProfileNetworkContextService::OnFirstPartySetsEnabledChanged(
+    bool enabled) {
+  // Update all FPS Access Delegates on the FPS service to be `enabled`.
+  first_party_sets::FirstPartySetsPolicyServiceFactory::GetForBrowserContext(
+      profile_)
+      ->OnFirstPartySetsEnabledChanged(enabled);
+}
+
 std::string ProfileNetworkContextService::ComputeAcceptLanguage() const {
   // If reduce accept language is enabled, only return the first language
   // without expanding the language list.
diff --git a/chrome/browser/net/profile_network_context_service.h b/chrome/browser/net/profile_network_context_service.h
index 792c6942..18e39251 100644
--- a/chrome/browser/net/profile_network_context_service.h
+++ b/chrome/browser/net/profile_network_context_service.h
@@ -192,6 +192,7 @@
 
   // PrivacySandboxSettings::Observer:
   void OnTrustTokenBlockingChanged(bool block_trust_tokens) override;
+  void OnFirstPartySetsEnabledChanged(bool enabled) override;
 
   const raw_ptr<Profile> profile_;
 
diff --git a/chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper.cc b/chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper.cc
index 2de52a2..b4967c779 100644
--- a/chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper.cc
+++ b/chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper.cc
@@ -7,8 +7,14 @@
 #include "base/memory/raw_ptr.h"
 #include "base/scoped_observation.h"
 #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
+#include "components/content_settings/core/browser/content_settings_observer.h"
+#include "components/content_settings/core/browser/content_settings_type_set.h"
+#include "components/content_settings/core/browser/host_content_settings_map.h"
+#include "components/content_settings/core/common/content_settings_pattern.h"
+#include "components/content_settings/core/common/content_settings_types.h"
 #include "components/performance_manager/public/decorators/page_live_state_decorator.h"
 #include "components/performance_manager/public/performance_manager.h"
+#include "components/permissions/permissions_client.h"
 #include "content/public/browser/web_contents_observer.h"
 
 #if !BUILDFLAG(IS_ANDROID)
@@ -78,7 +84,8 @@
 // and updates the PageLiveStateDecorator accordingly. Destroys itself when the
 // WebContents it observes is destroyed.
 class PageLiveStateDecoratorHelper::WebContentsObserver
-    : public content::WebContentsObserver {
+    : public content::WebContentsObserver,
+      public content_settings::Observer {
  public:
   explicit WebContentsObserver(content::WebContents* web_contents,
                                PageLiveStateDecoratorHelper* outer)
@@ -92,6 +99,10 @@
       next_->prev_ = this;
     }
     outer_->first_web_contents_observer_ = this;
+
+    content_settings_observation_.Observe(
+        permissions::PermissionsClient::Get()->GetSettingsMap(
+            web_contents->GetBrowserContext()));
   }
 
   WebContentsObserver(const WebContentsObserver&) = delete;
@@ -101,6 +112,28 @@
     DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   }
 
+  // content_settings::Observer:
+  void OnContentSettingChanged(
+      const ContentSettingsPattern& primary_pattern,
+      const ContentSettingsPattern& secondary_pattern,
+      ContentSettingsTypeSet content_type_set) override {
+    DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+    GURL url = web_contents()->GetLastCommittedURL();
+    if (content_type_set.Contains(ContentSettingsType::NOTIFICATIONS) &&
+        primary_pattern.Matches(url)) {
+      // This web contents is affected by this content settings change, get the
+      // latest value and send it over to the PageLiveStateDecorator so it can
+      // be attached to the corresponding PageNode.
+      ContentSetting setting =
+          permissions::PermissionsClient::Get()
+              ->GetSettingsMap(web_contents()->GetBrowserContext())
+              ->GetContentSetting(url, url, ContentSettingsType::NOTIFICATIONS);
+
+      PageLiveStateDecorator::SetContentSettings(
+          web_contents(), {{ContentSettingsType::NOTIFICATIONS, setting}});
+    }
+  }
+
   // content::WebContentsObserver:
   void OnIsConnectedToBluetoothDeviceChanged(
       bool is_connected_to_bluetooth_device) override {
@@ -144,6 +177,9 @@
   raw_ptr<WebContentsObserver> prev_;
   raw_ptr<WebContentsObserver> next_;
 
+  base::ScopedObservation<HostContentSettingsMap, content_settings::Observer>
+      content_settings_observation_{this};
+
   SEQUENCE_CHECKER(sequence_checker_);
 };
 
diff --git a/chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper_unittest.cc b/chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper_unittest.cc
index 419bb0c..ca63b7d 100644
--- a/chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper_unittest.cc
+++ b/chrome/browser/performance_manager/decorators/helpers/page_live_state_decorator_helper_unittest.cc
@@ -6,9 +6,11 @@
 
 #include "base/callback.h"
 #include "base/callback_helpers.h"
+#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
 #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h"
 #include "chrome/browser/media/webrtc/media_stream_capture_indicator.h"
 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
+#include "components/content_settings/core/browser/host_content_settings_map.h"
 #include "components/performance_manager/embedder/performance_manager_registry.h"
 #include "components/performance_manager/performance_manager_impl.h"
 #include "components/performance_manager/public/decorators/page_live_state_decorator.h"
@@ -196,6 +198,73 @@
       &PageLiveStateDecorator::Data::IsConnectedToUSBDevice, false);
 }
 
+TEST_F(PageLiveStateDecoratorHelperTest, ContentSettingsChanged) {
+  base::WeakPtr<PageNode> node =
+      PerformanceManager::GetPrimaryPageNodeForWebContents(web_contents());
+  content::WebContentsTester::For(web_contents())
+      ->NavigateAndCommit(GURL("https://www.example.com/path"));
+
+  {
+    base::RunLoop run_loop;
+    PerformanceManager::CallOnGraph(
+        FROM_HERE, base::BindLambdaForTesting([&]() {
+          ASSERT_TRUE(node);
+          const PageLiveStateDecorator::Data* data =
+              PageLiveStateDecorator::Data::FromPageNode(node.get());
+          ASSERT_TRUE(data);
+          EXPECT_EQ(data->IsContentSettingTypeAllowed(
+                        ContentSettingsType::NOTIFICATIONS),
+                    false);
+          run_loop.Quit();
+        }));
+    run_loop.Run();
+  }
+
+  HostContentSettingsMap* host_content_settings_map =
+      HostContentSettingsMapFactory::GetForProfile(
+          web_contents()->GetBrowserContext());
+  host_content_settings_map->SetContentSettingDefaultScope(
+      GURL("https://www.example.com/"), GURL(),
+      ContentSettingsType::NOTIFICATIONS, CONTENT_SETTING_ALLOW);
+
+  {
+    base::RunLoop run_loop;
+    PerformanceManager::CallOnGraph(
+        FROM_HERE, base::BindLambdaForTesting([&]() {
+          ASSERT_TRUE(node);
+          const PageLiveStateDecorator::Data* data =
+              PageLiveStateDecorator::Data::FromPageNode(node.get());
+          ASSERT_TRUE(data);
+          EXPECT_EQ(data->IsContentSettingTypeAllowed(
+                        ContentSettingsType::NOTIFICATIONS),
+                    true);
+          run_loop.Quit();
+        }));
+    run_loop.Run();
+  }
+
+  // Changing content settings for a different URL doesn't affect this one.
+  host_content_settings_map->SetContentSettingDefaultScope(
+      GURL("https://other.url.com/"), GURL(),
+      ContentSettingsType::NOTIFICATIONS, CONTENT_SETTING_BLOCK);
+
+  {
+    base::RunLoop run_loop;
+    PerformanceManager::CallOnGraph(
+        FROM_HERE, base::BindLambdaForTesting([&]() {
+          ASSERT_TRUE(node);
+          const PageLiveStateDecorator::Data* data =
+              PageLiveStateDecorator::Data::FromPageNode(node.get());
+          ASSERT_TRUE(data);
+          EXPECT_EQ(data->IsContentSettingTypeAllowed(
+                        ContentSettingsType::NOTIFICATIONS),
+                    true);
+          run_loop.Quit();
+        }));
+    run_loop.Run();
+  }
+}
+
 // Create many WebContents to exercice the code that maintains the linked list
 // of PageLiveStateDecoratorHelper::WebContentsObservers.
 TEST_F(PageLiveStateDecoratorHelperTest, ManyPageNodes) {
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
index 535b2789..824a098 100644
--- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
+++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
@@ -1000,9 +1000,6 @@
     public static final KeyPrefix WEB_FEED_INTRO_WEB_FEED_ID_SHOWN_COUNT_PREFIX =
             new KeyPrefix("Chrome.WebFeed.IntroWebFeedIdShownCount.*");
 
-    public static final String LOCK_ICON_IN_ADDRESS_BAR_ENABLED =
-            "omnibox.lock_icon_in_address_bar_enabled";
-
     /** Cached Suggestions and Suggestion Headers. */
     public static final String KEY_ZERO_SUGGEST_LIST_SIZE = "zero_suggest_list_size";
     public static final KeyPrefix KEY_ZERO_SUGGEST_URL_PREFIX = new KeyPrefix("zero_suggest_url*");
diff --git a/chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h b/chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h
index 4a7808b..276e493 100644
--- a/chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h
+++ b/chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h
@@ -31,7 +31,7 @@
   // Mock this method to enable opening the settings page in tests.
   MOCK_METHOD(bool, IsPrivacySandboxRestricted, (), (override));
   MOCK_METHOD((base::flat_map<net::SchemefulSite, net::SchemefulSite>),
-              GetFirstPartySets,
+              GetSampleFirstPartySets,
               (),
               (override, const));
   MOCK_METHOD(absl::optional<net::SchemefulSite>,
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc
index 35f3727b..5d93e2d 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc
@@ -16,6 +16,7 @@
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/time/time.h"
+#include "base/types/optional_util.h"
 #include "chrome/common/webui_url_constants.h"
 #include "components/browsing_topics/browsing_topics_service.h"
 #include "components/content_settings/core/browser/cookie_settings.h"
@@ -26,10 +27,14 @@
 #include "components/strings/grit/components_strings.h"
 #include "content/public/browser/browsing_data_filter_builder.h"
 #include "content/public/browser/browsing_data_remover.h"
+#include "content/public/browser/first_party_sets_handler.h"
 #include "content/public/browser/interest_group_manager.h"
 #include "content/public/common/content_features.h"
 #include "google_apis/gaia/google_service_auth_error.h"
 #include "net/base/registry_controlled_domains/registry_controlled_domain.h"
+#include "net/base/schemeful_site.h"
+#include "net/first_party_sets/first_party_set_entry.h"
+#include "net/first_party_sets/global_first_party_sets.h"
 #include "third_party/blink/public/common/features.h"
 #include "ui/base/l10n/l10n_util.h"
 
@@ -98,7 +103,8 @@
 #if !BUILDFLAG(IS_ANDROID)
     TrustSafetySentimentService* sentiment_service,
 #endif
-    browsing_topics::BrowsingTopicsService* browsing_topics_service)
+    browsing_topics::BrowsingTopicsService* browsing_topics_service,
+    first_party_sets::FirstPartySetsPolicyService* first_party_sets_service)
     : privacy_sandbox_settings_(privacy_sandbox_settings),
       cookie_settings_(cookie_settings),
       pref_service_(pref_service),
@@ -108,7 +114,8 @@
 #if !BUILDFLAG(IS_ANDROID)
       sentiment_service_(sentiment_service),
 #endif
-      browsing_topics_service_(browsing_topics_service) {
+      browsing_topics_service_(browsing_topics_service),
+      first_party_sets_policy_service_(first_party_sets_service) {
   DCHECK(privacy_sandbox_settings_);
   DCHECK(pref_service_);
   DCHECK(cookie_settings_);
@@ -632,19 +639,7 @@
 }
 
 base::flat_map<net::SchemefulSite, net::SchemefulSite>
-PrivacySandboxService::GetFirstPartySets() const {
-  // If FPS is not affecting cookie access, then there are effectively no
-  // first party sets.
-  if (!(cookie_settings_->ShouldBlockThirdPartyCookies() &&
-        cookie_settings_->GetDefaultCookieSetting(/*provider_id=*/nullptr) !=
-            CONTENT_SETTING_BLOCK &&
-        pref_service_->GetBoolean(
-            prefs::kPrivacySandboxFirstPartySetsEnabled) &&
-        base::FeatureList::IsEnabled(
-            privacy_sandbox::kPrivacySandboxFirstPartySetsUI))) {
-    return {};
-  }
-
+PrivacySandboxService::GetSampleFirstPartySets() const {
   if (privacy_sandbox::kPrivacySandboxFirstPartySetsUISampleSets.Get()) {
     return {{net::SchemefulSite(GURL("https://youtube.com")),
              net::SchemefulSite(GURL("https://google.com"))},
@@ -660,43 +655,66 @@
              net::SchemefulSite(GURL("https://chromium.org"))}};
   }
 
-  // TODO(crbug.com/1332513): Retrieve set information from FPS delegate.
   return {};
 }
 
 absl::optional<net::SchemefulSite> PrivacySandboxService::GetFirstPartySetOwner(
     const GURL& site_url) const {
-  auto sets = GetFirstPartySets();
-  auto schemeful_site = net::SchemefulSite(site_url);
+  // If FPS is not affecting cookie access, then there are effectively no
+  // first party sets.
+  if (!(cookie_settings_->ShouldBlockThirdPartyCookies() &&
+        cookie_settings_->GetDefaultCookieSetting(/*provider_id=*/nullptr) !=
+            CONTENT_SETTING_BLOCK &&
+        base::FeatureList::IsEnabled(
+            privacy_sandbox::kPrivacySandboxFirstPartySetsUI))) {
+    return absl::nullopt;
+  }
 
-  if (!sets.count(schemeful_site))
+  // Return the owner according to the sample sets if they're provided.
+  if (privacy_sandbox::kPrivacySandboxFirstPartySetsUISampleSets.Get()) {
+    const base::flat_map<net::SchemefulSite, net::SchemefulSite> sets =
+        GetSampleFirstPartySets();
+    net::SchemefulSite schemeful_site(site_url);
+
+    base::flat_map<net::SchemefulSite, net::SchemefulSite>::const_iterator
+        site_entry = sets.find(schemeful_site);
+    if (site_entry == sets.end())
+      return absl::nullopt;
+
+    return site_entry->second;
+  }
+
+  absl::optional<net::FirstPartySetEntry> site_entry =
+      first_party_sets_policy_service_->FindEntry(net::SchemefulSite(site_url));
+  if (!site_entry.has_value())
     return absl::nullopt;
 
-  return sets[schemeful_site];
+  return site_entry->primary();
 }
 
 absl::optional<std::u16string>
 PrivacySandboxService::GetFirstPartySetOwnerForDisplay(
     const GURL& site_url) const {
-  auto fpsOwner = GetFirstPartySetOwner(site_url);
-  if (!fpsOwner.has_value()) {
+  absl::optional<net::SchemefulSite> site_owner =
+      GetFirstPartySetOwner(site_url);
+  if (!site_owner.has_value()) {
     return absl::nullopt;
   }
 
   // TODO(crbug.com/1332513): Apply formatting that correctly displays unicode
   // domains.
-  return base::UTF8ToUTF16(fpsOwner->GetURL().host());
+  return base::UTF8ToUTF16(site_owner->GetURL().host());
 }
 
 bool PrivacySandboxService::IsPartOfManagedFirstPartySet(
     const net::SchemefulSite& site) const {
   if (privacy_sandbox::kPrivacySandboxFirstPartySetsUISampleSets.Get()) {
     return IsFirstPartySetsDataAccessManaged() ||
-           GetFirstPartySets()[site] ==
+           GetSampleFirstPartySets()[site] ==
                net::SchemefulSite(GURL("https://chromium.org"));
   }
-  // TODO(crbug.com/1332513): Retrieve set information from FPS delegate.
-  return IsFirstPartySetsDataAccessManaged();
+
+  return first_party_sets_policy_service_->IsSiteInManagedSet(site);
 }
 
 /*static*/ PrivacySandboxService::PromptType
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service.h b/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
index d97b3e9..6b01016 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
@@ -9,9 +9,7 @@
 
 #include "base/gtest_prod_util.h"
 #include "base/memory/raw_ptr.h"
-#include "base/scoped_observation.h"
-#include "base/time/time.h"
-#include "components/content_settings/core/common/content_settings.h"
+#include "chrome/browser/first_party_sets/first_party_sets_policy_service.h"
 #include "components/keyed_service/core/keyed_service.h"
 #include "components/prefs/pref_change_registrar.h"
 #include "components/privacy_sandbox/canonical_topic.h"
@@ -99,7 +97,8 @@
 #if !BUILDFLAG(IS_ANDROID)
       TrustSafetySentimentService* sentiment_service,
 #endif
-      browsing_topics::BrowsingTopicsService* browsing_topics_service);
+      browsing_topics::BrowsingTopicsService* browsing_topics_service,
+      first_party_sets::FirstPartySetsPolicyService* first_party_sets_service);
 
   ~PrivacySandboxService() override;
 
@@ -215,17 +214,11 @@
   virtual void SetTopicAllowed(privacy_sandbox::CanonicalTopic topic,
                                bool allowed);
 
-  // DEPRECATED - Do not use in new code. It will be replaced with the in-memory
-  // FPS map.
-  // Returns the first party sets recognised by the current profile. If FPS is
-  // disabled, or if sets have not been loaded yet, an empty map is returned.
-  // Encapsulates logic about whether FPS information should be shown, if it
-  // should not, an empty map is always returned.
+  // DEPRECATED - Do not use in new code. It will be replaced with queries to
+  // the First-Party Sets that are in the browser-process.
   // Virtual for mocking in tests.
-  // TODO (crbug.com/1350062): Reconsider whether ignoring async FPS information
-  // is appropriate.
   virtual base::flat_map<net::SchemefulSite, net::SchemefulSite>
-  GetFirstPartySets() const;
+  GetSampleFirstPartySets() const;
 
   // Returns the owner domain of the first party set that `site_url` is a member
   // of, or absl::nullopt if `site_url` is not recognised as a member of an FPS.
@@ -241,6 +234,11 @@
 
   // Returns true if `site`'s membership in an FPS is being managed by policy or
   // if FirstPartySets preference is managed. Virtual for mocking in tests.
+  //
+  // Note: Enterprises can use the First-Party Set Overrides policy to either
+  // add or remove a site from a First-Party Set. This method returns true only
+  // if `site` is being added into a First-Party Set since there's no UI use for
+  // whether `site` is being removed by an enterprise yet.
   virtual bool IsPartOfManagedFirstPartySet(
       const net::SchemefulSite& site) const;
 
@@ -415,6 +413,8 @@
   raw_ptr<TrustSafetySentimentService> sentiment_service_;
 #endif
   raw_ptr<browsing_topics::BrowsingTopicsService> browsing_topics_service_;
+  raw_ptr<first_party_sets::FirstPartySetsPolicyService>
+      first_party_sets_policy_service_;
 
   PrefChangeRegistrar user_prefs_registrar_;
 
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.cc
index bf87496b..74af31d 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.cc
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.cc
@@ -7,6 +7,7 @@
 #include "base/memory/singleton.h"
 #include "chrome/browser/browsing_topics/browsing_topics_service_factory.h"
 #include "chrome/browser/content_settings/cookie_settings_factory.h"
+#include "chrome/browser/first_party_sets/first_party_sets_policy_service_factory.h"
 #include "chrome/browser/privacy_sandbox/privacy_sandbox_service.h"
 #include "chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.h"
 #include "chrome/browser/profiles/profile.h"
@@ -41,6 +42,8 @@
 #if !BUILDFLAG(IS_ANDROID)
   DependsOn(TrustSafetySentimentServiceFactory::GetInstance());
 #endif
+  DependsOn(
+      first_party_sets::FirstPartySetsPolicyServiceFactory::GetInstance());
 }
 
 KeyedService* PrivacySandboxServiceFactory::BuildServiceInstanceFor(
@@ -57,5 +60,7 @@
 #if !BUILDFLAG(IS_ANDROID)
       TrustSafetySentimentServiceFactory::GetForProfile(profile),
 #endif
-      browsing_topics::BrowsingTopicsServiceFactory::GetForProfile(profile));
+      browsing_topics::BrowsingTopicsServiceFactory::GetForProfile(profile),
+      first_party_sets::FirstPartySetsPolicyServiceFactory::
+          GetForBrowserContext(context));
 }
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc
index 6238add4..a992b690 100644
--- a/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc
+++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc
@@ -13,6 +13,7 @@
 #include "base/test/scoped_feature_list.h"
 #include "chrome/browser/content_settings/cookie_settings_factory.h"
 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
+#include "chrome/browser/first_party_sets/first_party_sets_policy_service.h"
 #include "chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.h"
 #include "chrome/browser/signin/identity_manager_factory.h"
 #include "chrome/common/chrome_features.h"
@@ -35,9 +36,14 @@
 #include "components/sync/test/test_sync_service.h"
 #include "components/sync_preferences/testing_pref_service_syncable.h"
 #include "content/public/browser/browsing_data_remover.h"
+#include "content/public/browser/first_party_sets_handler.h"
 #include "content/public/browser/interest_group_manager.h"
 #include "content/public/common/content_features.h"
 #include "content/public/test/browser_task_environment.h"
+#include "net/base/schemeful_site.h"
+#include "net/first_party_sets/first_party_set_entry.h"
+#include "net/first_party_sets/first_party_sets_context_config.h"
+#include "net/first_party_sets/global_first_party_sets.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/features.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -675,7 +681,10 @@
       : browser_task_environment_(
             base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
 
-  void SetUp() override { CreateService(); }
+  void SetUp() override {
+    CreateService();
+    SetGlobalFirstPartySetsAndWait();
+  }
 
   virtual std::unique_ptr<
       privacy_sandbox_test_util::MockPrivacySandboxSettingsDelegate>
@@ -703,7 +712,7 @@
 #if !BUILDFLAG(IS_ANDROID)
         mock_sentiment_service(),
 #endif
-        mock_browsing_topics_service());
+        mock_browsing_topics_service(), first_party_sets_policy_service());
   }
 
   virtual profile_metrics::BrowserProfileType GetProfileType() {
@@ -743,12 +752,26 @@
   browsing_topics::MockBrowsingTopicsService* mock_browsing_topics_service() {
     return &mock_browsing_topics_service_;
   }
+  first_party_sets::FirstPartySetsPolicyService*
+  first_party_sets_policy_service() {
+    return &first_party_sets_policy_service_;
+  }
 #if !BUILDFLAG(IS_ANDROID)
   MockTrustSafetySentimentService* mock_sentiment_service() {
     return mock_sentiment_service_.get();
   }
 #endif
 
+  void SetGlobalFirstPartySetsAndWait() {
+    content::FirstPartySetsHandler::GetInstance()->ResetForTesting();
+    content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting({});
+    base::RunLoop run_loop;
+    first_party_sets_policy_service_.WaitForFirstInitCompleteForTesting(
+        run_loop.QuitClosure());
+    run_loop.Run();
+    first_party_sets_policy_service_.ResetForTesting();
+  }
+
  private:
   content::BrowserTaskEnvironment browser_task_environment_;
 
@@ -756,6 +779,10 @@
   base::test::ScopedFeatureList feature_list_;
   TestInterestGroupManager test_interest_group_manager_;
   browsing_topics::MockBrowsingTopicsService mock_browsing_topics_service_;
+  first_party_sets::FirstPartySetsPolicyService
+      first_party_sets_policy_service_ =
+          first_party_sets::FirstPartySetsPolicyService(
+              profile_.GetOriginalProfile());
 #if !BUILDFLAG(IS_ANDROID)
   std::unique_ptr<MockTrustSafetySentimentService> mock_sentiment_service_;
 #endif
@@ -2072,6 +2099,355 @@
                 GURL("https://example.com")));
 }
 
+TEST_F(PrivacySandboxServiceTest,
+       GetFirstPartySetOwner_SimulatedFpsData_DisabledWhen3pcAllowed) {
+  GURL associate1_gurl("https://associate1.test");
+  net::SchemefulSite primary_site(GURL("https://primary.test"));
+  net::SchemefulSite associate1_site(associate1_gurl);
+
+  // Create Global First-Party Sets with the following set:
+  // { primary: "https://primary.test",
+  // associatedSites: ["https://associate1.test"}
+  net::GlobalFirstPartySets global_sets(
+      {{associate1_site,
+        {net::FirstPartySetEntry(primary_site, net::SiteType::kAssociated,
+                                 0)}}},
+      {});
+
+  // Simulate 3PC are allowed while:
+  // - FPS pref is enabled
+  // - FPS backend Feature is enabled
+  // - FPS UI Feature is enabled
+  feature_list()->InitWithFeatures(
+      {privacy_sandbox::kPrivacySandboxFirstPartySetsUI,
+       features::kFirstPartySets},
+      {});
+  CreateService();
+  ClearFpsUserPrefs(prefs());
+  prefs()->SetUserPref(prefs::kCookieControlsMode,
+                       std::make_unique<base::Value>(static_cast<int>(
+                           content_settings::CookieControlsMode::kOff)));
+  prefs()->SetUserPref(prefs::kPrivacySandboxFirstPartySetsEnabled,
+                       std::make_unique<base::Value>(true));
+  // Reset test state to reflect required state above.
+  content::FirstPartySetsHandler::GetInstance()->ResetForTesting();
+
+  content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting(
+      global_sets.Clone());
+  first_party_sets_policy_service()->InitForTesting(
+      [](PrefService* prefs,
+         base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) {
+        std::move(callback).Run(net::FirstPartySetsContextConfig());
+      });
+  // We shouldn't get associate1's owner since FPS is disabled.
+  EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner(associate1_gurl),
+            absl::nullopt);
+}
+
+TEST_F(PrivacySandboxServiceTest,
+       GetFirstPartySetOwner_SimulatedFpsData_DisabledWhenAllCookiesBlocked) {
+  GURL associate1_gurl("https://associate1.test");
+  net::SchemefulSite primary_site(GURL("https://primary.test"));
+  net::SchemefulSite associate1_site(associate1_gurl);
+
+  // Create Global First-Party Sets with the following set:
+  // { primary: "https://primary.test",
+  // associatedSites: ["https://associate1.test"}
+  net::GlobalFirstPartySets global_sets(
+      {{associate1_site,
+        {net::FirstPartySetEntry(primary_site, net::SiteType::kAssociated,
+                                 0)}}},
+      {});
+
+  // Simulate all cookies are blocked while:
+  // - FPS pref is enabled
+  // - FPS backend Feature is enabled
+  // - FPS UI Feature is enabled
+  feature_list()->InitWithFeatures(
+      {privacy_sandbox::kPrivacySandboxFirstPartySetsUI,
+       features::kFirstPartySets},
+      {});
+  prefs()->SetUserPref(
+      prefs::kCookieControlsMode,
+      std::make_unique<base::Value>(static_cast<int>(
+          content_settings::CookieControlsMode::kBlockThirdParty)));
+  cookie_settings()->SetDefaultCookieSetting(CONTENT_SETTING_BLOCK);
+  CreateService();
+  ClearFpsUserPrefs(prefs());
+  prefs()->SetUserPref(prefs::kPrivacySandboxFirstPartySetsEnabled,
+                       std::make_unique<base::Value>(true));
+
+  // Reset test state to reflect required state above.
+  content::FirstPartySetsHandler::GetInstance()->ResetForTesting();
+
+  content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting(
+      global_sets.Clone());
+  first_party_sets_policy_service()->InitForTesting(
+      [](PrefService* prefs,
+         base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) {
+        std::move(callback).Run(net::FirstPartySetsContextConfig());
+      });
+  // We shouldn't get associate1's owner since FPS is disabled.
+  EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner(associate1_gurl),
+            absl::nullopt);
+}
+
+TEST_F(PrivacySandboxServiceTest,
+       GetFirstPartySetOwner_SimulatedFpsData_DisabledByFpsUiFeature) {
+  GURL associate1_gurl("https://associate1.test");
+  net::SchemefulSite primary_site(GURL("https://primary.test"));
+  net::SchemefulSite associate1_site(associate1_gurl);
+
+  // Create Global First-Party Sets with the following set:
+  // { primary: "https://primary.test",
+  // associatedSites: ["https://associate1.test"}
+  net::GlobalFirstPartySets global_sets(
+      {{associate1_site,
+        {net::FirstPartySetEntry(primary_site, net::SiteType::kAssociated,
+                                 0)}}},
+      {});
+
+  // Simulate FPS UI feature disabled while:
+  // - FPS pref is enabled
+  // - FPS backend Feature is enabled
+  // - 3PC are being blocked
+  feature_list()->InitWithFeatures(
+      {features::kFirstPartySets},
+      {privacy_sandbox::kPrivacySandboxFirstPartySetsUI});
+  privacy_sandbox_test_util::SetupTestState(
+      prefs(), host_content_settings_map(),
+      /*privacy_sandbox_enabled=*/true,
+      /*block_third_party_cookies=*/true,
+      /*default_cookie_setting=*/ContentSetting::CONTENT_SETTING_ALLOW,
+      /*user_cookie_exceptions=*/{},
+      /*managed_cookie_setting=*/privacy_sandbox_test_util::kNoSetting,
+      /*managed_cookie_exceptions=*/{});
+  CreateService();
+  ClearFpsUserPrefs(prefs());
+  prefs()->SetUserPref(prefs::kPrivacySandboxFirstPartySetsEnabled,
+                       std::make_unique<base::Value>(true));
+
+  // Reset test state to reflect required state above.
+  content::FirstPartySetsHandler::GetInstance()->ResetForTesting();
+
+  content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting(
+      global_sets.Clone());
+  first_party_sets_policy_service()->InitForTesting(
+      [](PrefService* prefs,
+         base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) {
+        std::move(callback).Run(net::FirstPartySetsContextConfig());
+      });
+
+  // We shouldn't get associate1's owner since FPS is disabled.
+  EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner(associate1_gurl),
+            absl::nullopt);
+}
+
+TEST_F(PrivacySandboxServiceTest,
+       GetFirstPartySetOwner_SimulatedFpsData_DisabledByFpsFeature) {
+  GURL associate1_gurl("https://associate1.test");
+  net::SchemefulSite primary_site(GURL("https://primary.test"));
+  net::SchemefulSite associate1_site(associate1_gurl);
+
+  // Create Global First-Party Sets with the following set:
+  // { primary: "https://primary.test",
+  // associatedSites: ["https://associate1.test"}
+  net::GlobalFirstPartySets global_sets(
+      {{associate1_site,
+        {net::FirstPartySetEntry(primary_site, net::SiteType::kAssociated,
+                                 0)}}},
+      {});
+
+  // Simulate FPS backend feature disabled while:
+  // - FPS pref is enabled
+  // - FPS UI Feature is enabled
+  // - 3PC are being blocked
+  feature_list()->InitWithFeatures(
+      {privacy_sandbox::kPrivacySandboxFirstPartySetsUI},
+      {features::kFirstPartySets});
+  privacy_sandbox_test_util::SetupTestState(
+      prefs(), host_content_settings_map(),
+      /*privacy_sandbox_enabled=*/true,
+      /*block_third_party_cookies=*/true,
+      /*default_cookie_setting=*/ContentSetting::CONTENT_SETTING_ALLOW,
+      /*user_cookie_exceptions=*/{},
+      /*managed_cookie_setting=*/privacy_sandbox_test_util::kNoSetting,
+      /*managed_cookie_exceptions=*/{});
+  CreateService();
+  ClearFpsUserPrefs(prefs());
+  prefs()->SetUserPref(prefs::kPrivacySandboxFirstPartySetsEnabled,
+                       std::make_unique<base::Value>(true));
+
+  // Reset test state to reflect required state above.
+  content::FirstPartySetsHandler::GetInstance()->ResetForTesting();
+
+  content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting(
+      global_sets.Clone());
+  first_party_sets_policy_service()->InitForTesting(
+      [](PrefService* prefs,
+         base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) {
+        std::move(callback).Run(net::FirstPartySetsContextConfig());
+      });
+
+  // We shouldn't get associate1's owner since FPS is disabled.
+  EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner(associate1_gurl),
+            absl::nullopt);
+}
+
+TEST_F(PrivacySandboxServiceTest,
+       GetFirstPartySetOwner_SimulatedFpsData_DisabledByFpsPref) {
+  GURL associate1_gurl("https://associate1.test");
+  net::SchemefulSite primary_site(GURL("https://primary.test"));
+  net::SchemefulSite associate1_site(associate1_gurl);
+
+  // Create Global First-Party Sets with the following set:
+  // { primary: "https://primary.test",
+  // associatedSites: ["https://associate1.test"}
+  net::GlobalFirstPartySets global_sets(
+      {{associate1_site,
+        {net::FirstPartySetEntry(primary_site, net::SiteType::kAssociated,
+                                 0)}}},
+      {});
+
+  // Simulate FPS pref disabled while:
+  // - FPS UI Feature is enabled
+  // - FPS backend Feature is enabled
+  // - 3PC are being blocked
+  feature_list()->InitWithFeatures(
+      {features::kFirstPartySets,
+       privacy_sandbox::kPrivacySandboxFirstPartySetsUI},
+      {});
+  privacy_sandbox_test_util::SetupTestState(
+      prefs(), host_content_settings_map(),
+      /*privacy_sandbox_enabled=*/true,
+      /*block_third_party_cookies=*/true,
+      /*default_cookie_setting=*/ContentSetting::CONTENT_SETTING_ALLOW,
+      /*user_cookie_exceptions=*/{},
+      /*managed_cookie_setting=*/privacy_sandbox_test_util::kNoSetting,
+      /*managed_cookie_exceptions=*/{});
+  CreateService();
+  ClearFpsUserPrefs(prefs());
+  prefs()->SetUserPref(prefs::kPrivacySandboxFirstPartySetsEnabled,
+                       std::make_unique<base::Value>(false));
+
+  // Reset test state to reflect required state above.
+  content::FirstPartySetsHandler::GetInstance()->ResetForTesting();
+
+  content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting(
+      global_sets.Clone());
+  first_party_sets_policy_service()->InitForTesting(
+      [](PrefService* prefs,
+         base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) {
+        std::move(callback).Run(net::FirstPartySetsContextConfig());
+      });
+
+  // We shouldn't get associate1's owner since FPS is disabled.
+  EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner(associate1_gurl),
+            absl::nullopt);
+}
+
+TEST_F(PrivacySandboxServiceTest,
+       SimulatedFpsData_FpsEnabled_WithoutGlobalSets) {
+  GURL primary_gurl("https://primary.test");
+  GURL associate1_gurl("https://associate1.test");
+  GURL associate2_gurl("https://associate2.test");
+  net::SchemefulSite primary_site(primary_gurl);
+  net::SchemefulSite associate1_site(associate1_gurl);
+  net::SchemefulSite associate2_site(associate2_gurl);
+
+  // Set up state that fully enables the First-Party Sets for UI; blocking 3PC,
+  // and enabling the FPS UI and backend features and the FPS enabled pref.
+  feature_list()->InitWithFeatures(
+      {features::kFirstPartySets,
+       privacy_sandbox::kPrivacySandboxFirstPartySetsUI},
+      {});
+  privacy_sandbox_test_util::SetupTestState(
+      prefs(), host_content_settings_map(),
+      /*privacy_sandbox_enabled=*/true,
+      /*block_third_party_cookies=*/true,
+      /*default_cookie_setting=*/ContentSetting::CONTENT_SETTING_ALLOW,
+      /*user_cookie_exceptions=*/{},
+      /*managed_cookie_setting=*/privacy_sandbox_test_util::kNoSetting,
+      /*managed_cookie_exceptions=*/{});
+  CreateService();
+  ClearFpsUserPrefs(prefs());
+  prefs()->SetUserPref(prefs::kPrivacySandboxFirstPartySetsEnabled,
+                       std::make_unique<base::Value>(true));
+
+  // Reset test state to reflect required state above.
+  content::FirstPartySetsHandler::GetInstance()->ResetForTesting();
+
+  // Verify `GetFirstPartySetOwner` returns empty if FPS is enabled but the
+  // Global sets are not ready yet.
+  EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner(associate1_gurl),
+            absl::nullopt);
+  EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner(associate2_gurl),
+            absl::nullopt);
+}
+
+TEST_F(PrivacySandboxServiceTest,
+       SimulatedFpsData_FpsEnabled_WithGlobalSetsAndProfileSets) {
+  GURL primary_gurl("https://primary.test");
+  GURL associate1_gurl("https://associate1.test");
+  GURL associate2_gurl("https://associate2.test");
+  net::SchemefulSite primary_site(primary_gurl);
+  net::SchemefulSite associate1_site(associate1_gurl);
+  net::SchemefulSite associate2_site(associate2_gurl);
+
+  // Set up state that fully enables the First-Party Sets for UI; blocking 3PC,
+  // and enabling the FPS UI and backend features and the FPS enabled pref.
+  feature_list()->InitWithFeatures(
+      {features::kFirstPartySets,
+       privacy_sandbox::kPrivacySandboxFirstPartySetsUI},
+      {});
+  privacy_sandbox_test_util::SetupTestState(
+      prefs(), host_content_settings_map(),
+      /*privacy_sandbox_enabled=*/true,
+      /*block_third_party_cookies=*/true,
+      /*default_cookie_setting=*/ContentSetting::CONTENT_SETTING_ALLOW,
+      /*user_cookie_exceptions=*/{},
+      /*managed_cookie_setting=*/privacy_sandbox_test_util::kNoSetting,
+      /*managed_cookie_exceptions=*/{});
+  CreateService();
+  ClearFpsUserPrefs(prefs());
+  prefs()->SetUserPref(prefs::kPrivacySandboxFirstPartySetsEnabled,
+                       std::make_unique<base::Value>(true));
+
+  // Reset test state to reflect required state above.
+  content::FirstPartySetsHandler::GetInstance()->ResetForTesting();
+
+  // Simulate that the Global First-Party Sets are ready with the following set:
+  // { primary: "https://primary.test",
+  // associatedSites: ["https://associate1.test", "https://associate2.test"] }
+  content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting(
+      net::GlobalFirstPartySets(
+          {{associate1_site,
+            {net::FirstPartySetEntry(primary_site, net::SiteType::kAssociated,
+                                     0)}},
+           {associate2_site,
+            {net::FirstPartySetEntry(primary_site, net::SiteType::kAssociated,
+                                     1)}}},
+          {}));
+
+  // Simulate that associate2 is removed from the Global First-Party Sets for
+  // this profile.
+  first_party_sets_policy_service()->InitForTesting(
+      [](PrefService* prefs,
+         base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) {
+        std::move(callback).Run(net::FirstPartySetsContextConfig(
+            net::FirstPartySetsContextConfig::OverrideSets{
+                {net::SchemefulSite(GURL("https://associate2.test")),
+                 {absl::nullopt}}}));
+      });
+
+  // Verify that primary owns associate1, but no longer owns associate2.
+  EXPECT_EQ(
+      privacy_sandbox_service()->GetFirstPartySetOwner(associate1_gurl).value(),
+      primary_site);
+  EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner(associate2_gurl),
+            absl::nullopt);
+}
+
 TEST_F(PrivacySandboxServiceTest, FpsPrefInit) {
   // Check that the init of the FPS pref occurs correctly.
   ClearFpsUserPrefs(prefs());
@@ -2137,51 +2513,101 @@
       prefs::kPrivacySandboxFirstPartySetsDataAccessAllowedInitialized));
 }
 
-TEST_F(PrivacySandboxServiceTest, NoFpsWhileNotAffected) {
-  // Confirm that when FPS is not involved in access decisions, that the set
-  // of returned First Party Sets is empty.
-  // TODO(crbug.com/1332513): Move away from this demo parameter.
-  feature_list()->InitAndEnableFeatureWithParameters(
-      privacy_sandbox::kPrivacySandboxFirstPartySetsUI,
-      {{"use-sample-sets", "true"}});
+TEST_F(PrivacySandboxServiceTest, UsesFpsSampleSetsWhenProvided) {
+  // Confirm that when the FPS sample sets are provided, they are used to answer
+  // First-Party Sets queries instead of the actual sets.
 
-  // When 3PC are blocked, and FPS is enabled, sets should be returned.
-  prefs()->SetUserPref(
-      prefs::kCookieControlsMode,
-      std::make_unique<base::Value>(static_cast<int>(
-          content_settings::CookieControlsMode::kBlockThirdParty)));
-  cookie_settings()->SetDefaultCookieSetting(CONTENT_SETTING_ALLOW);
-  prefs()->SetBoolean(prefs::kPrivacySandboxFirstPartySetsEnabled, true);
-  EXPECT_GT(privacy_sandbox_service()->GetFirstPartySets().size(), 0u);
+  // Set up state that fully enables the First-Party Sets for UI; blocking
+  // 3PC, and enabling the FPS UI and backend features and the FPS enabled pref.
+  //
+  // Note: this indicates that the sample sets should be used.
+  feature_list()->InitWithFeaturesAndParameters(
+      /*enabled_features=*/{{features::kFirstPartySets, {}},
+                            {privacy_sandbox::kPrivacySandboxFirstPartySetsUI,
+                             {{"use-sample-sets", "true"}}}},
+      /*disabled_features=*/{});
+  privacy_sandbox_test_util::SetupTestState(
+      prefs(), host_content_settings_map(),
+      /*privacy_sandbox_enabled=*/true,
+      /*block_third_party_cookies=*/true,
+      /*default_cookie_setting=*/ContentSetting::CONTENT_SETTING_ALLOW,
+      /*user_cookie_exceptions=*/{},
+      /*managed_cookie_setting=*/privacy_sandbox_test_util::kNoSetting,
+      /*managed_cookie_exceptions=*/{});
+  CreateService();
+  ClearFpsUserPrefs(prefs());
+  prefs()->SetUserPref(prefs::kPrivacySandboxFirstPartySetsEnabled,
+                       std::make_unique<base::Value>(true));
 
-  // When 3PC are enabled, no sets should be returned.
-  prefs()->SetUserPref(prefs::kCookieControlsMode,
-                       std::make_unique<base::Value>(static_cast<int>(
-                           content_settings::CookieControlsMode::kOff)));
-  EXPECT_EQ(0u, privacy_sandbox_service()->GetFirstPartySets().size());
+  // Reset test state to reflect required state above.
+  content::FirstPartySetsHandler::GetInstance()->ResetForTesting();
 
-  // When all cookies are blocked, no sets should be returned.
-  prefs()->SetUserPref(
-      prefs::kCookieControlsMode,
-      std::make_unique<base::Value>(static_cast<int>(
-          content_settings::CookieControlsMode::kBlockThirdParty)));
-  cookie_settings()->SetDefaultCookieSetting(CONTENT_SETTING_BLOCK);
+  // Simulate that the Global First-Party Sets are ready with the following
+  // set:
+  // { primary: "https://youtube-primary.test",
+  // associatedSites: ["https://youtube.com"]
+  // }
+  net::SchemefulSite youtube_primary_site(GURL("https://youtube-primary.test"));
+  GURL youtube_gurl("https://youtube.com");
+  net::SchemefulSite youtube_site(youtube_gurl);
 
-  EXPECT_EQ(0u, privacy_sandbox_service()->GetFirstPartySets().size());
+  content::FirstPartySetsHandler::GetInstance()->SetGlobalSetsForTesting(
+      net::GlobalFirstPartySets(
+          {{youtube_site,
+            {net::FirstPartySetEntry(youtube_primary_site,
+                                     net::SiteType::kAssociated, 0)}}},
+          {}));
 
-  // When FPS is disabled, no sets should be returned.
-  cookie_settings()->SetDefaultCookieSetting(CONTENT_SETTING_ALLOW);
-  prefs()->SetBoolean(prefs::kPrivacySandboxFirstPartySetsEnabled, false);
+  // Simulate that https://google.de is moved into a new First-Party Set for
+  // this profile.
+  first_party_sets_policy_service()->InitForTesting(
+      [](PrefService* prefs,
+         base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback) {
+        std::move(callback).Run(
+            net::FirstPartySetsContextConfig(net::FirstPartySetsContextConfig(
+                net::FirstPartySetsContextConfig::OverrideSets{
+                    {net::SchemefulSite(GURL("https://google.de")),
+                     {net::FirstPartySetEntry(
+                         net::SchemefulSite(GURL("https://new-primary.test")),
+                         net::SiteType::kAssociated, 0)}}})));
+      });
 
-  EXPECT_EQ(0u, privacy_sandbox_service()->GetFirstPartySets().size());
+  // Expect queries to be resolved based on the FPS sample sets.
+  EXPECT_GT(privacy_sandbox_service()->GetSampleFirstPartySets().size(), 0u);
+  EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner(
+                GURL("https://youtube.com")),
+            net::SchemefulSite(GURL("https://google.com")));
+  EXPECT_TRUE(privacy_sandbox_service()->IsPartOfManagedFirstPartySet(
+      net::SchemefulSite(GURL("https://googlesource.com"))));
+  EXPECT_FALSE(privacy_sandbox_service()->IsPartOfManagedFirstPartySet(
+      net::SchemefulSite(GURL("https://google.de"))));
 
-  // When the UI feature is disabled, no sets should be returned.
   feature_list()->Reset();
-  feature_list()->InitAndDisableFeature(
-      privacy_sandbox::kPrivacySandboxFirstPartySetsUI);
-  prefs()->SetBoolean(prefs::kPrivacySandboxFirstPartySetsEnabled, true);
+  feature_list()->InitWithFeatures(
+      {features::kFirstPartySets,
+       privacy_sandbox::kPrivacySandboxFirstPartySetsUI},
+      {});
+  privacy_sandbox_test_util::SetupTestState(
+      prefs(), host_content_settings_map(),
+      /*privacy_sandbox_enabled=*/true,
+      /*block_third_party_cookies=*/true,
+      /*default_cookie_setting=*/ContentSetting::CONTENT_SETTING_ALLOW,
+      /*user_cookie_exceptions=*/{},
+      /*managed_cookie_setting=*/privacy_sandbox_test_util::kNoSetting,
+      /*managed_cookie_exceptions=*/{});
+  CreateService();
+  ClearFpsUserPrefs(prefs());
+  prefs()->SetUserPref(prefs::kPrivacySandboxFirstPartySetsEnabled,
+                       std::make_unique<base::Value>(true));
 
-  EXPECT_EQ(0u, privacy_sandbox_service()->GetFirstPartySets().size());
+  // Expect queries to be resolved based on the FPS backend.
+  EXPECT_EQ(privacy_sandbox_service()->GetSampleFirstPartySets().size(), 0u);
+  EXPECT_EQ(privacy_sandbox_service()->GetFirstPartySetOwner(youtube_gurl),
+            youtube_primary_site);
+  EXPECT_FALSE(privacy_sandbox_service()->IsPartOfManagedFirstPartySet(
+      net::SchemefulSite(GURL("https://googlesource.com"))));
+  EXPECT_TRUE(privacy_sandbox_service()->IsPartOfManagedFirstPartySet(
+      net::SchemefulSite(GURL("https://google.de"))));
 }
 
 class PrivacySandboxServiceTestNonRegularProfile
diff --git a/chrome/browser/profiles/profile_manager_unittest.cc b/chrome/browser/profiles/profile_manager_unittest.cc
index 8e2958c5..b51a7d6 100644
--- a/chrome/browser/profiles/profile_manager_unittest.cc
+++ b/chrome/browser/profiles/profile_manager_unittest.cc
@@ -53,6 +53,7 @@
 #include "content/public/common/content_switches.h"
 #include "content/public/test/browser_task_environment.h"
 #include "content/public/test/test_utils.h"
+#include "services/data_decoder/public/cpp/test_support/in_process_data_decoder.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "ui/base/l10n/l10n_util.h"
@@ -169,9 +170,13 @@
     session_type_ = extensions::ScopedCurrentFeatureSessionType(
         extensions::GetCurrentFeatureSessionType());
 #endif
+
+    in_process_data_decoder_ =
+        std::make_unique<data_decoder::test::InProcessDataDecoder>();
   }
 
   void TearDown() override {
+    in_process_data_decoder_.reset();
     TestingBrowserProcess::GetGlobal()->SetProfileManager(nullptr);
     content::RunAllTasksUntilIdle();
 #if BUILDFLAG(IS_CHROMEOS_ASH)
@@ -315,6 +320,9 @@
   base::ScopedTempDir temp_dir_;
   ScopedTestingLocalState local_state_;
 
+  std::unique_ptr<data_decoder::test::InProcessDataDecoder>
+      in_process_data_decoder_;
+
   content::BrowserTaskEnvironment task_environment_;
 
 #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu.cc b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
index 23c39692..a4c41a8 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu.cc
@@ -3286,7 +3286,7 @@
   if (!service)
     return false;
 
-// Region selection is broken in PWAs on Mac
+// Region selection is broken in PWAs on Mac b/250074889
 #if BUILDFLAG(IS_MAC)
   if (IsInProgressiveWebApp())
     return false;
diff --git a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
index f7d8c8a..c856b79 100644
--- a/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
+++ b/chrome/browser/renderer_context_menu/render_view_context_menu_unittest.cc
@@ -1363,8 +1363,17 @@
 }
 
 // Verify that the Lens Region Search menu item is enabled for Progressive Web
-// Apps
-TEST_F(RenderViewContextMenuPrefsTest, LensRegionSearchProgressiveWebApp) {
+// Apps. Region Search on PWAs is currently broken and therefore disabled on
+// Mac. b/250074889
+#if BUILDFLAG(IS_MAC)
+#define MAYBE_LensRegionSearchProgressiveWebApp \
+  DISABLED_LensRegionSearchProgressiveWebApp
+#else
+#define MAYBE_LensRegionSearchProgressiveWebApp \
+  LensRegionSearchProgressiveWebApp
+#endif
+TEST_F(RenderViewContextMenuPrefsTest,
+       MAYBE_LensRegionSearchProgressiveWebApp) {
   base::test::ScopedFeatureList features;
   features.InitAndEnableFeature(lens::features::kLensStandalone);
   SetUserSelectedDefaultSearchProvider("https://www.google.com",
diff --git a/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/BUILD.gn b/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/BUILD.gn
index 088aef7..4b8cea7 100644
--- a/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/BUILD.gn
+++ b/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/BUILD.gn
@@ -72,8 +72,8 @@
 
 js_library("bluetooth_pairing_dialog") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/bluetooth:bluetooth_pairing_ui",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:cr.m",
   ]
   externs_list = chrome_extension_public_externs + [
diff --git a/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/bluetooth_pairing_dialog.js b/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/bluetooth_pairing_dialog.js
index 3c1af0a..a95a76a 100644
--- a/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/bluetooth_pairing_dialog.js
+++ b/chrome/browser/resources/chromeos/bluetooth_pairing_dialog/bluetooth_pairing_dialog.js
@@ -8,7 +8,7 @@
 import 'chrome://resources/cr_elements/cr_page_host_style.css.js';
 import './strings.m.js';
 
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
diff --git a/chrome/browser/resources/chromeos/edu_coexistence/BUILD.gn b/chrome/browser/resources/chromeos/edu_coexistence/BUILD.gn
index 4532321..fa87468 100644
--- a/chrome/browser/resources/chromeos/edu_coexistence/BUILD.gn
+++ b/chrome/browser/resources/chromeos/edu_coexistence/BUILD.gn
@@ -33,10 +33,10 @@
     ":edu_coexistence_error",
     ":edu_coexistence_offline",
     ":edu_coexistence_ui",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//chrome/browser/resources/chromeos/arc_account_picker:arc_account_picker_app",
     "//chrome/browser/resources/chromeos/arc_account_picker:arc_util",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:assert",
   ]
 
@@ -45,8 +45,8 @@
 
 js_library("edu_coexistence_button") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:util",
   ]
 }
@@ -73,8 +73,8 @@
     ":edu_coexistence_button",
     ":edu_coexistence_controller",
     ":edu_coexistence_template",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
   externs_list = [
     "$externs_path/chrome_extensions.js",
@@ -84,8 +84,8 @@
 
 js_library("edu_coexistence_template") {
   deps = [
+    "//ash/webui/common/resources:cr_scrollable_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:cr_scrollable_behavior",
   ]
 }
 
diff --git a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_app.js b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_app.js
index c23c36a..e160b0e 100644
--- a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_app.js
+++ b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_app.js
@@ -14,7 +14,7 @@
 import {assert} from 'chrome://resources/js/assert.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 
 import {getAccountAdditionOptionsFromJSON} from './arc_account_picker/arc_util.js';
 import {EduCoexistenceBrowserProxyImpl} from './edu_coexistence_browser_proxy.js';
diff --git a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_button.js b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_button.js
index d00d3983..52b8eb9 100644
--- a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_button.js
+++ b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_button.js
@@ -8,7 +8,7 @@
 import './strings.m.js';
 
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {isRTL} from 'chrome://resources/js/util.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_template.js b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_template.js
index f903968..8e83eeb 100644
--- a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_template.js
+++ b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_template.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {CrScrollableBehavior} from 'chrome://resources/cr_elements/cr_scrollable_behavior.js';
+import {CrScrollableBehavior} from 'chrome://resources/ash/common/cr_scrollable_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 Polymer({
diff --git a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_ui.js b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_ui.js
index 2c67441..907d409 100644
--- a/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_ui.js
+++ b/chrome/browser/resources/chromeos/edu_coexistence/edu_coexistence_ui.js
@@ -8,7 +8,7 @@
 import './gaia_action_buttons/gaia_action_buttons.js';
 import 'chrome://resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js';
 
-import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {AuthParams} from '../../gaia_auth_host/authenticator.js';
diff --git a/chrome/browser/resources/chromeos/emulator/BUILD.gn b/chrome/browser/resources/chromeos/emulator/BUILD.gn
index 62db60e5..d5b215c 100644
--- a/chrome/browser/resources/chromeos/emulator/BUILD.gn
+++ b/chrome/browser/resources/chromeos/emulator/BUILD.gn
@@ -26,24 +26,24 @@
 
 js_library("bluetooth_settings") {
   deps = [
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
   externs_list = [ "$externs_path/chrome_send.js" ]
 }
 
 js_library("battery_settings") {
   deps = [
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
   externs_list = [ "$externs_path/chrome_send.js" ]
 }
 
 js_library("input_device_settings") {
   deps = [
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
   externs_list = [ "$externs_path/chrome_send.js" ]
 }
diff --git a/chrome/browser/resources/chromeos/emulator/battery_settings.js b/chrome/browser/resources/chromeos/emulator/battery_settings.js
index a67a7da..25a7585 100644
--- a/chrome/browser/resources/chromeos/emulator/battery_settings.js
+++ b/chrome/browser/resources/chromeos/emulator/battery_settings.js
@@ -15,7 +15,7 @@
 import './icons.js';
 import './shared_styles.js';
 
-import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 Polymer({
diff --git a/chrome/browser/resources/chromeos/emulator/bluetooth_settings.js b/chrome/browser/resources/chromeos/emulator/bluetooth_settings.js
index 2a9478ee..717d799 100644
--- a/chrome/browser/resources/chromeos/emulator/bluetooth_settings.js
+++ b/chrome/browser/resources/chromeos/emulator/bluetooth_settings.js
@@ -14,7 +14,7 @@
 import './icons.js';
 import './shared_styles.js';
 
-import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 
diff --git a/chrome/browser/resources/chromeos/emulator/input_device_settings.js b/chrome/browser/resources/chromeos/emulator/input_device_settings.js
index be34f719..e80c749be 100644
--- a/chrome/browser/resources/chromeos/emulator/input_device_settings.js
+++ b/chrome/browser/resources/chromeos/emulator/input_device_settings.js
@@ -9,7 +9,7 @@
 import './icons.js';
 import './shared_styles.js';
 
-import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 Polymer({
diff --git a/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn b/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn
index 1b86ac6a..64c1568 100644
--- a/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn
+++ b/chrome/browser/resources/chromeos/internet_config_dialog/BUILD.gn
@@ -67,10 +67,10 @@
 
 js_library("internet_config_dialog") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/network:cr_policy_network_behavior_mojo",
     "//ash/webui/common/resources/network:network_config",
     "//ash/webui/common/resources/network:onc_mojo",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
   ]
 
diff --git a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js
index 1edd2710..71d6eeb 100644
--- a/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js
+++ b/chrome/browser/resources/chromeos/internet_config_dialog/internet_config_dialog.js
@@ -11,7 +11,7 @@
 import 'chrome://resources/cr_elements/cr_shared_style.css.js';
 import './strings.m.js';
 
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn b/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn
index 9088dd9..6e49416 100644
--- a/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn
+++ b/chrome/browser/resources/chromeos/internet_detail_dialog/BUILD.gn
@@ -89,10 +89,10 @@
 
 js_library("internet_detail_dialog") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/network:cr_policy_network_behavior_mojo",
     "//ash/webui/common/resources/network:network_listener_behavior",
     "//ash/webui/common/resources/network:onc_mojo",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
   ]
   externs_list = [ "$externs_path/chrome_send.js" ]
diff --git a/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js b/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js
index bc46452..751ce6b 100644
--- a/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js
+++ b/chrome/browser/resources/chromeos/internet_detail_dialog/internet_detail_dialog.js
@@ -23,7 +23,7 @@
 import {MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js';
 import {NetworkListenerBehavior} from 'chrome://resources/ash/common/network/network_listener_behavior.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {ApnProperties, ConfigProperties, CrosNetworkConfigRemote, GlobalPolicy, IPConfigProperties, ManagedProperties, NetworkStateProperties, ProxySettings, StartConnectResult} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/chrome/browser/resources/chromeos/login/components/behaviors/BUILD.gn b/chrome/browser/resources/chromeos/login/components/behaviors/BUILD.gn
index 198dd6f..f9ba77d 100644
--- a/chrome/browser/resources/chromeos/login/components/behaviors/BUILD.gn
+++ b/chrome/browser/resources/chromeos/login/components/behaviors/BUILD.gn
@@ -52,8 +52,8 @@
 js_library("oobe_i18n_behavior.m") {
   sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.m.js" ]
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:parse_html_subset",
   ]
   extra_deps = [ ":modulize" ]
diff --git a/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.js b/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.js
index 9801deb..35a819e 100644
--- a/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.js
+++ b/chrome/browser/resources/chromeos/login/components/behaviors/oobe_i18n_behavior.js
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 // clang-format off
-// #import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+// #import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 // #import {SanitizeInnerHtmlOpts} from 'chrome://resources/js/parse_html_subset.js';
 // #import {Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 // clang-format on
diff --git a/chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog.html b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog.html
index 2eed68c0..93fa23e 100644
--- a/chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog.html
+++ b/chrome/browser/resources/chromeos/login/components/dialogs/oobe_adaptive_dialog.html
@@ -7,7 +7,7 @@
 <link rel="import" href="chrome://resources/html/polymer.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_shared_style.css.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_scrollable_behavior.html">
+<link rel="import" href="chrome://resources/ash/common/cr_scrollable_behavior.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_lazy_render/cr_lazy_render.html">
 
 <link rel="import" href="../behaviors/oobe_focus_behavior.html">
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_apps_list.html b/chrome/browser/resources/chromeos/login/components/oobe_apps_list.html
index 05efd69e..de92369e 100644
--- a/chrome/browser/resources/chromeos/login/components/oobe_apps_list.html
+++ b/chrome/browser/resources/chromeos/login/components/oobe_apps_list.html
@@ -9,7 +9,7 @@
 <link rel="import" href="chrome://resources/cr_elements/cr_checkbox/cr_checkbox.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_icon_button/cr_icon_button.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_expand_button/cr_expand_button.html">
-<link rel="import" href="chrome://resources/cr_elements/cr_scrollable_behavior.html">
+<link rel="import" href="chrome://resources/ash/common/cr_scrollable_behavior.html">
 <link rel="import" href="chrome://resources/cr_elements/icons.html">
 
 <link rel="import" href="./behaviors/oobe_i18n_behavior.html">
diff --git a/chrome/browser/resources/chromeos/login/oobe_auto_imports.gni b/chrome/browser/resources/chromeos/login/oobe_auto_imports.gni
index 199ca20..0ed2209f 100644
--- a/chrome/browser/resources/chromeos/login/oobe_auto_imports.gni
+++ b/chrome/browser/resources/chromeos/login/oobe_auto_imports.gni
@@ -91,6 +91,9 @@
 
 oobe_migrated_imports = [
   "chrome/browser/resources/gaia_auth_host/authenticator.html",
+  "ash/webui/common/resources/cr_scrollable_behavior.html",
+  "ash/webui/common/resources/i18n_behavior.html",
+  "ash/webui/common/resources/web_ui_listener_behavior.html",
   "ash/webui/common/resources/bluetooth/bluetooth_pairing_enter_code_page.html",
   "ash/webui/common/resources/multidevice_setup/button_bar.html",
   "ash/webui/common/resources/multidevice_setup/fake_mojo_service.html",
@@ -130,13 +133,10 @@
   "ui/webui/resources/cr_elements/cr_lottie/cr_lottie.html",
   "ui/webui/resources/cr_elements/cr_radio_button/cr_card_radio_button.html",
   "ui/webui/resources/cr_elements/cr_radio_group/cr_radio_group.html",
-  "ui/webui/resources/cr_elements/cr_scrollable_behavior.html",
   "ui/webui/resources/cr_elements/cr_shared_style.css.html",
   "ui/webui/resources/cr_elements/cr_shared_vars.css.html",
   "ui/webui/resources/cr_elements/cr_toggle/cr_toggle.html",
   "ui/webui/resources/cr_elements/md_select.css.html",
-  "ui/webui/resources/cr_elements/i18n_behavior.html",
-  "ui/webui/resources/cr_elements/web_ui_listener_behavior.html",
   "ui/webui/resources/html/assert.html",
   "ui/webui/resources/html/parse_html_subset.html",
   "ui/webui/resources/html/util.html",
diff --git a/chrome/browser/resources/chromeos/login/screens/common/family_link_notice.html b/chrome/browser/resources/chromeos/login/screens/common/family_link_notice.html
index e562a2e..1b2afc26 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/family_link_notice.html
+++ b/chrome/browser/resources/chromeos/login/screens/common/family_link_notice.html
@@ -7,7 +7,7 @@
 <link rel="import" href="chrome://resources/html/polymer.html">
 
 <link rel="import" href="chrome://resources/cr_elements/cr_shared_vars.css.html">
-<link rel="import" href="chrome://resources/cr_elements/i18n_behavior.html">
+<link rel="import" href="chrome://resources/ash/common/i18n_behavior.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
 
 <link rel="import" href="../../components/oobe_icons.html">
diff --git a/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js b/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js
index ffe3575..1fa25a4 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js
@@ -14,7 +14,7 @@
 import '../../components/common_styles/oobe_dialog_host_styles.m.js';
 import '../../components/dialogs/oobe_adaptive_dialog.m.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from '//resources/js/load_time_data.m.js';
 import {afterNextRender, dom, flush, html, mixinBehaviors, Polymer, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/chromeos/login/screens/common/managed_terms_of_service.js b/chrome/browser/resources/chromeos/login/screens/common/managed_terms_of_service.js
index d9247f7..045eacb 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/managed_terms_of_service.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/managed_terms_of_service.js
@@ -16,7 +16,7 @@
 import '../../components/dialogs/oobe_adaptive_dialog.m.js';
 import '../../components/dialogs/oobe_loading_dialog.m.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {LoginScreenBehavior, LoginScreenBehaviorInterface} from '../../components/behaviors/login_screen_behavior.m.js';
diff --git a/chrome/browser/resources/chromeos/login/screens/common/multidevice_setup.html b/chrome/browser/resources/chromeos/login/screens/common/multidevice_setup.html
index 8fb808c..b0680c3 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/multidevice_setup.html
+++ b/chrome/browser/resources/chromeos/login/screens/common/multidevice_setup.html
@@ -11,8 +11,8 @@
 <link rel="import" href="chrome://resources/ash/common/multidevice_setup/multidevice_setup.html">
 <link rel="import" href="chrome://resources/ash/common/multidevice_setup/multidevice_setup_delegate.html">
 <link rel="import" href="chrome://resources/html/assert.html">
-<link rel="import" href="chrome://resources/cr_elements/i18n_behavior.html">
-<link rel="import" href="chrome://resources/cr_elements/web_ui_listener_behavior.html">
+<link rel="import" href="chrome://resources/ash/common/i18n_behavior.html">
+<link rel="import" href="chrome://resources/ash/common/web_ui_listener_behavior.html">
 
 <link rel="import" href="../../components/behaviors/login_screen_behavior.html">
 <link rel="import" href="../../components/behaviors/multi_step_behavior.html">
diff --git a/chrome/browser/resources/chromeos/login/screens/common/offline_ad_login.js b/chrome/browser/resources/chromeos/login/screens/common/offline_ad_login.js
index 6070607..5304f1c 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/offline_ad_login.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/offline_ad_login.js
@@ -19,7 +19,7 @@
 import '../../components/common_styles/oobe_dialog_host_styles.m.js';
 import '../../components/dialogs/oobe_adaptive_dialog.m.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from '//resources/js/load_time_data.m.js';
 import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/chromeos/login/screens/common/pin_setup.js b/chrome/browser/resources/chromeos/login/screens/common/pin_setup.js
index d876f70..8cfe6fbc 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/pin_setup.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/pin_setup.js
@@ -15,7 +15,7 @@
 import '../../components/buttons/oobe_text_button.m.js';
 
 import {recordLockScreenProgress} from '//resources/ash/common/quick_unlock/lock_screen_constants.js';
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {assert, assertNotReached} from '//resources/js/assert.js';
 import {dom, html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/demo_preferences.js b/chrome/browser/resources/chromeos/login/screens/oobe/demo_preferences.js
index faa52c5..9b1b76d 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/demo_preferences.js
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/demo_preferences.js
@@ -11,7 +11,7 @@
 import '../../components/common_styles/oobe_dialog_host_styles.m.js';
 import '../../components/dialogs/oobe_adaptive_dialog.m.js';
 
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {assert} from '//resources/js/assert.js';
 import {loadTimeData} from '//resources/js/load_time_data.m.js';
 import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.js b/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.js
index 6e4d1291..f3137c3a 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.js
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.js
@@ -16,7 +16,7 @@
 import '../../components/dialogs/oobe_adaptive_dialog.m.js';
 
 import {NetworkList} from '//resources/ash/common/network/network_list_types.js';
-import {I18nBehavior} from '//resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from '//resources/ash/common/i18n_behavior.js';
 import {assert} from '//resources/js/assert.js';
 import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/packaged_license.html b/chrome/browser/resources/chromeos/login/screens/oobe/packaged_license.html
index 10dd9c6..3ae7692 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/packaged_license.html
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/packaged_license.html
@@ -7,7 +7,7 @@
 <link rel="import" href="chrome://resources/html/polymer.html">
 
 <link rel="import" href="chrome://resources/cr_elements/cr_shared_vars.css.html">
-<link rel="import" href="chrome://resources/cr_elements/i18n_behavior.html">
+<link rel="import" href="chrome://resources/ash/common/i18n_behavior.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
 
 <link rel="import" href="../../components/oobe_icons.html">
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/welcome.html b/chrome/browser/resources/chromeos/login/screens/oobe/welcome.html
index 4ce8b11..559d9327 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/welcome.html
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/welcome.html
@@ -8,7 +8,7 @@
 
 <link rel="import" href="chrome://resources/cr_elements/cr_input/cr_input.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_shared_vars.css.html">
-<link rel="import" href="chrome://resources/cr_elements/i18n_behavior.html">
+<link rel="import" href="chrome://resources/ash/common/i18n_behavior.html">
 <link rel="import" href="chrome://resources/html/load_time_data.html">
 <link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html">
 
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.html b/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.html
index 2229977..259bc10c 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.html
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/welcome_dialog.html
@@ -9,7 +9,7 @@
 <link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html">
 <link rel="import" href="chrome://resources/html/action_link.html">
 <link rel="import" href="chrome://resources/html/assert.html">
-<link rel="import" href="chrome://resources/cr_elements/i18n_behavior.html">
+<link rel="import" href="chrome://resources/ash/common/i18n_behavior.html">
 <link rel="import" href="chrome://resources/html/load_time_data.html">
 <link rel="import" href="chrome://resources/cr_elements/cr_shared_style.css.html">
 
diff --git a/chrome/browser/resources/chromeos/multidevice_internals/BUILD.gn b/chrome/browser/resources/chromeos/multidevice_internals/BUILD.gn
index 257e006f..20db57bd 100644
--- a/chrome/browser/resources/chromeos/multidevice_internals/BUILD.gn
+++ b/chrome/browser/resources/chromeos/multidevice_internals/BUILD.gn
@@ -96,7 +96,7 @@
   deps = [
     ":multidevice_phonehub_browser_proxy",
     ":types",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
   ]
 }
 
@@ -134,8 +134,8 @@
     ":log_object",
     ":multidevice_logs_browser_proxy",
     ":types",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:cr.m",
   ]
 }
@@ -180,7 +180,7 @@
   deps = [
     ":multidevice_phonehub_browser_proxy",
     ":types",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
   ]
 }
 
@@ -194,7 +194,7 @@
     ":phone_status_model_form",
     ":quick_action_controller_form",
     ":types",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
 }
diff --git a/chrome/browser/resources/chromeos/multidevice_internals/camera_roll_manager_form.js b/chrome/browser/resources/chromeos/multidevice_internals/camera_roll_manager_form.js
index 40294d2..ae8ef62 100644
--- a/chrome/browser/resources/chromeos/multidevice_internals/camera_roll_manager_form.js
+++ b/chrome/browser/resources/chromeos/multidevice_internals/camera_roll_manager_form.js
@@ -8,7 +8,7 @@
 import 'chrome://resources/cr_elements/cr_input/cr_input.js';
 import './shared_style.js';
 
-import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {MultidevicePhoneHubBrowserProxy} from './multidevice_phonehub_browser_proxy.js';
diff --git a/chrome/browser/resources/chromeos/multidevice_internals/logging_tab.js b/chrome/browser/resources/chromeos/multidevice_internals/logging_tab.js
index cf35d0d..14b13f6d 100644
--- a/chrome/browser/resources/chromeos/multidevice_internals/logging_tab.js
+++ b/chrome/browser/resources/chromeos/multidevice_internals/logging_tab.js
@@ -8,7 +8,7 @@
 import './log_object.js';
 import './shared_style.js';
 
-import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {MultideviceLogsBrowserProxy} from './multidevice_logs_browser_proxy.js';
diff --git a/chrome/browser/resources/chromeos/multidevice_internals/notification_form.js b/chrome/browser/resources/chromeos/multidevice_internals/notification_form.js
index 35eee5d6..a8c427b 100644
--- a/chrome/browser/resources/chromeos/multidevice_internals/notification_form.js
+++ b/chrome/browser/resources/chromeos/multidevice_internals/notification_form.js
@@ -7,7 +7,7 @@
 import 'chrome://resources/cr_elements/cr_input/cr_input.js';
 import './shared_style.js';
 
-import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {MultidevicePhoneHubBrowserProxy} from './multidevice_phonehub_browser_proxy.js';
diff --git a/chrome/browser/resources/chromeos/multidevice_internals/phonehub_tab.js b/chrome/browser/resources/chromeos/multidevice_internals/phonehub_tab.js
index 29f1cd5..56454d10 100644
--- a/chrome/browser/resources/chromeos/multidevice_internals/phonehub_tab.js
+++ b/chrome/browser/resources/chromeos/multidevice_internals/phonehub_tab.js
@@ -16,7 +16,7 @@
 import './quick_action_controller_form.js';
 
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {flush, html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {MultidevicePhoneHubBrowserProxy} from './multidevice_phonehub_browser_proxy.js';
diff --git a/chrome/browser/resources/chromeos/multidevice_internals/quick_action_controller_form.js b/chrome/browser/resources/chromeos/multidevice_internals/quick_action_controller_form.js
index 719546b3..25fce37 100644
--- a/chrome/browser/resources/chromeos/multidevice_internals/quick_action_controller_form.js
+++ b/chrome/browser/resources/chromeos/multidevice_internals/quick_action_controller_form.js
@@ -7,7 +7,7 @@
 import 'chrome://resources/cr_elements/md_select.css.js';
 import './shared_style.js';
 
-import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {MultidevicePhoneHubBrowserProxy} from './multidevice_phonehub_browser_proxy.js';
diff --git a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js
index 1e4e230..a16cc56 100644
--- a/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js
+++ b/chrome/browser/resources/chromeos/multidevice_setup/multidevice_setup_post_oobe.js
@@ -8,7 +8,7 @@
 import {loadTimeData} from '//resources/js/load_time_data.m.js';
 import {PageName} from 'chrome://resources/ash/common/multidevice_setup/multidevice_setup.js';
 import {MultiDeviceSetupDelegate} from 'chrome://resources/ash/common/multidevice_setup/multidevice_setup_delegate.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {PostOobeDelegate} from './post_oobe_delegate.js';
diff --git a/chrome/browser/resources/chromeos/multidevice_setup/post_oobe_delegate.js b/chrome/browser/resources/chromeos/multidevice_setup/post_oobe_delegate.js
index ab60f5e..fbc037d8 100644
--- a/chrome/browser/resources/chromeos/multidevice_setup/post_oobe_delegate.js
+++ b/chrome/browser/resources/chromeos/multidevice_setup/post_oobe_delegate.js
@@ -4,7 +4,7 @@
 
 import {MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/multidevice_setup/mojo_api.js';
 import {MultiDeviceSetupDelegate} from 'chrome://resources/ash/common/multidevice_setup/multidevice_setup_delegate.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/chromeos/network_ui/BUILD.gn b/chrome/browser/resources/chromeos/network_ui/BUILD.gn
index 5cc0f78..0833a758 100644
--- a/chrome/browser/resources/chromeos/network_ui/BUILD.gn
+++ b/chrome/browser/resources/chromeos/network_ui/BUILD.gn
@@ -84,9 +84,9 @@
 js_library("network_ui") {
   deps = [
     ":network_ui_browser_proxy",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/network:onc_mojo",
     "//ash/webui/common/resources/network_health:network_diagnostics",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
 }
@@ -94,14 +94,14 @@
 js_library("network_logs_ui") {
   deps = [
     ":network_ui_browser_proxy",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
   ]
 }
 
 js_library("network_metrics_ui") {
   deps = [
     ":network_ui_browser_proxy",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
   ]
 }
 
diff --git a/chrome/browser/resources/chromeos/network_ui/network_logs_ui.js b/chrome/browser/resources/chromeos/network_ui/network_logs_ui.js
index 1b7f91bf6..4b76556 100644
--- a/chrome/browser/resources/chromeos/network_ui/network_logs_ui.js
+++ b/chrome/browser/resources/chromeos/network_ui/network_logs_ui.js
@@ -8,7 +8,7 @@
 import 'chrome://resources/cr_elements/cr_radio_group/cr_radio_group.js';
 import 'chrome://resources/cr_elements/cr_shared_style.css.js';
 
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {NetworkUIBrowserProxy, NetworkUIBrowserProxyImpl} from './network_ui_browser_proxy.js';
diff --git a/chrome/browser/resources/chromeos/network_ui/network_metrics_ui.js b/chrome/browser/resources/chromeos/network_ui/network_metrics_ui.js
index d79f5ee..99da00f 100644
--- a/chrome/browser/resources/chromeos/network_ui/network_metrics_ui.js
+++ b/chrome/browser/resources/chromeos/network_ui/network_metrics_ui.js
@@ -6,7 +6,7 @@
 import 'chrome://resources/cr_elements/cr_radio_button/cr_radio_button.js';
 import 'chrome://resources/cr_elements/cr_shared_style.css.js';
 
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {NetworkUIBrowserProxy, NetworkUIBrowserProxyImpl} from './network_ui_browser_proxy.js';
diff --git a/chrome/browser/resources/chromeos/network_ui/network_ui.js b/chrome/browser/resources/chromeos/network_ui/network_ui.js
index 414deeea..d101029 100644
--- a/chrome/browser/resources/chromeos/network_ui/network_ui.js
+++ b/chrome/browser/resources/chromeos/network_ui/network_ui.js
@@ -18,7 +18,7 @@
 import './network_metrics_ui.js';
 
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {CrosNetworkConfig, CrosNetworkConfigRemote, StartConnectResult} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/chromeos/parent_access/BUILD.gn b/chrome/browser/resources/chromeos/parent_access/BUILD.gn
index 8462fd3..1e128fe 100644
--- a/chrome/browser/resources/chromeos/parent_access/BUILD.gn
+++ b/chrome/browser/resources/chromeos/parent_access/BUILD.gn
@@ -6,10 +6,7 @@
 import("//tools/polymer/html_to_js.gni")
 
 group("closure_compile") {
-  deps = [
-    ":closure_compile_local",
-    "flows:closure_compile",
-  ]
+  deps = [ ":closure_compile_local" ]
 }
 
 js_type_check("closure_compile_local") {
@@ -27,6 +24,7 @@
     ":parent_access_ui",
     ":parent_access_ui_handler",
     ":webview_manager",
+    "flows:local_web_approvals_after",
   ]
 }
 
@@ -43,6 +41,8 @@
   deps = [
     ":parent_access_after",
     ":parent_access_ui",
+    ":parent_access_ui_handler",
+    "//chrome/browser/ui/webui/chromeos/parent_access:mojo_bindings_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
   ]
   externs_list = [ "//ui/webui/resources/cr_elements/cr_view_manager/cr_view_manager_externs.js" ]
diff --git a/chrome/browser/resources/chromeos/parent_access/flows/BUILD.gn b/chrome/browser/resources/chromeos/parent_access/flows/BUILD.gn
index 89a8c4db..ee56b3d 100644
--- a/chrome/browser/resources/chromeos/parent_access/flows/BUILD.gn
+++ b/chrome/browser/resources/chromeos/parent_access/flows/BUILD.gn
@@ -5,15 +5,11 @@
 import("//third_party/closure_compiler/compile_js.gni")
 import("//tools/polymer/html_to_js.gni")
 
-js_type_check("closure_compile") {
-  is_polymer3 = true
-  deps = [ ":local_web_approvals_after" ]
-}
-
 js_library("local_web_approvals_after") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
+    "//chrome/browser/ui/webui/chromeos/parent_access:mojo_bindings_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
diff --git a/chrome/browser/resources/chromeos/parent_access/flows/local_web_approvals_after.html b/chrome/browser/resources/chromeos/parent_access/flows/local_web_approvals_after.html
index 82c58c2..9af60e8 100644
--- a/chrome/browser/resources/chromeos/parent_access/flows/local_web_approvals_after.html
+++ b/chrome/browser/resources/chromeos/parent_access/flows/local_web_approvals_after.html
@@ -17,8 +17,6 @@
   }
 
   .favicon {
-    /* TODO(b/199753545) remove bg color once favicon available. */
-    background-color: var(--google-grey-400); 
     height: 28px;
     margin: 0 16px;
     width: 28px;
@@ -28,11 +26,9 @@
 <div class="after-screen-content">
   <!-- TODO(b/199753545): Replace the hardcoded content when it's
     available. -->
-  <div class="subtitle">
-    [[i18n('localWebApprovalsAfterSubtitle', 'Child')]]
-  </div>
+  <div class="subtitle"></div>
   <div class="details">
-    <div class="favicon"></div>
-    <span>[[i18n('localWebApprovalsAfterDetails', 'google.com')]]</span>
+    <image class="favicon"></image>
+    <div class="details-text"></div>
   </div>
-</div>
\ No newline at end of file
+</div>
diff --git a/chrome/browser/resources/chromeos/parent_access/flows/local_web_approvals_after.js b/chrome/browser/resources/chromeos/parent_access/flows/local_web_approvals_after.js
index 5b37757ab..3c5607f 100644
--- a/chrome/browser/resources/chromeos/parent_access/flows/local_web_approvals_after.js
+++ b/chrome/browser/resources/chromeos/parent_access/flows/local_web_approvals_after.js
@@ -4,9 +4,13 @@
 
 import 'chrome://resources/cr_elements/cr_shared_vars.css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {String16} from 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {WebApprovalsParams} from '../parent_access_ui.mojom-webui.js';
+import {getParentAccessParams} from '../parent_access_ui_handler.js';
+
 /**
  * @constructor
  * @extends {PolymerElement}
@@ -15,7 +19,7 @@
 const LocalWebApprovalsAfterBase =
     mixinBehaviors([I18nBehavior], PolymerElement);
 
-class LocalWebApprovalsAfterElement extends LocalWebApprovalsAfterBase {
+export class LocalWebApprovalsAfterElement extends LocalWebApprovalsAfterBase {
   static get is() {
     return 'local-web-approvals-after';
   }
@@ -23,6 +27,55 @@
   static get template() {
     return html`{__html_template__}`;
   }
+
+  constructor() {
+    super();
+    this.attachShadow({mode: 'open', delegatesFocus: true});
+  }
+
+  /** @override */
+  ready() {
+    super.ready();
+    this.configureWithParams_();
+  }
+
+  /** @private */
+  async configureWithParams_() {
+    const response = await getParentAccessParams();
+    const params = response.params.flowTypeParams.webApprovalsParams;
+    if (params) {
+      this.renderDetails_(params);
+    } else {
+      console.error('Failed to fetch web approvals params.');
+    }
+  }
+
+  /**
+   * Renders local approvals specific information from the WebApprovalsParams
+   * @param {!WebApprovalsParams} params
+   * @private
+   */
+  renderDetails_(params) {
+    const childName = this.decodeMojoString16_(params.childDisplayName);
+    const url = params.url.url;
+    // Convert the PNG bytes to a Base64 encoded string.
+    const favicon = btoa(String.fromCharCode(...params.faviconPngBytes));
+
+    this.shadowRoot.querySelector('.subtitle').innerText =
+        this.i18n('localWebApprovalsAfterSubtitle', childName);
+    this.shadowRoot.querySelector('.details-text').innerText =
+        this.i18n('localWebApprovalsAfterDetails', url);
+    this.shadowRoot.querySelector('.favicon').src =
+        'data:image/png;base64,' + favicon;
+  }
+
+  /**
+   * @param {!String16} str
+   * @private
+   */
+  decodeMojoString16_(str) {
+    return str.data.map((ch) => String.fromCodePoint(ch)).join('');
+  }
 }
 
 customElements.define(
diff --git a/chrome/browser/resources/chromeos/parent_access/parent_access_after.html b/chrome/browser/resources/chromeos/parent_access/parent_access_after.html
index b706fd1..b0375fa 100644
--- a/chrome/browser/resources/chromeos/parent_access/parent_access_after.html
+++ b/chrome/browser/resources/chromeos/parent_access/parent_access_after.html
@@ -28,9 +28,7 @@
   <img class="google-logo" src="chrome://theme/IDR_LOGO_GOOGLE_COLOR_90"
     alt="Google">
   </img>
-  <template is="dom-if" if="[[isLocalWebApprovalsFlow_]]">
-    <local-web-approvals-after></local-web-approvals-after>
-  </template>
+  <div id="after-screen-body"></div>
   <div id="after-screen-buttons">
     <cr-button>$i18n{denyButtonText}</cr-button>
     <cr-button class="action-button">$i18n{approveButtonText}</cr-button>
diff --git a/chrome/browser/resources/chromeos/parent_access/parent_access_after.js b/chrome/browser/resources/chromeos/parent_access/parent_access_after.js
index 2a9a34e3..b07593fe9 100644
--- a/chrome/browser/resources/chromeos/parent_access/parent_access_after.js
+++ b/chrome/browser/resources/chromeos/parent_access/parent_access_after.js
@@ -7,6 +7,10 @@
 
 import {html, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {LocalWebApprovalsAfterElement} from './flows/local_web_approvals_after.js';
+import {ParentAccessParams, ParentAccessParams_FlowType} from './parent_access_ui.mojom-webui.js';
+import {getParentAccessParams} from './parent_access_ui_handler.js';
+
 class ParentAccessAfter extends PolymerElement {
   static get is() {
     return 'parent-access-after';
@@ -19,17 +23,25 @@
   /** @override */
   ready() {
     super.ready();
+    this.renderFlowSpecificContent_();
     // TODO(b/199753153): Implement handlers for deny and approve buttons.
   }
 
   /**
+   * Renders the correct after screen based on the ParentAccessParams flowtype.
    * @private
-   * @return {boolean}
    */
-  isLocalWebApprovalsFlow_() {
-    // TODO(b/199753545): Use the passed in loadTimeData value for the flowtype
-    // when it is available.
-    return true;
+  async renderFlowSpecificContent_() {
+    const response = await getParentAccessParams();
+    switch (response.params.flowType) {
+      case ParentAccessParams_FlowType.kWebsiteAccess:
+        this.shadowRoot.querySelector('#after-screen-body')
+            .appendChild(new LocalWebApprovalsAfterElement());
+        return;
+      default:
+        return;
+    }
   }
 }
-customElements.define(ParentAccessAfter.is, ParentAccessAfter);
\ No newline at end of file
+
+customElements.define(ParentAccessAfter.is, ParentAccessAfter);
diff --git a/chrome/browser/resources/chromeos/parent_access/parent_access_ui_handler.js b/chrome/browser/resources/chromeos/parent_access/parent_access_ui_handler.js
index e17d4324..76205e9 100644
--- a/chrome/browser/resources/chromeos/parent_access/parent_access_ui_handler.js
+++ b/chrome/browser/resources/chromeos/parent_access/parent_access_ui_handler.js
@@ -2,15 +2,32 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {ParentAccessUIHandler, ParentAccessUIHandlerRemote} from './parent_access_ui.mojom-webui.js';
+import {ParentAccessParams, ParentAccessUIHandler, ParentAccessUIHandlerRemote} from './parent_access_ui.mojom-webui.js';
 
 /** @type {?ParentAccessUIHandlerRemote} */
 let parentAccessUIHandler = null;
 
+/** @type {?{params: !ParentAccessParams}} */
+let parentAccessParams = null;
+
 /** @return  {!ParentAccessUIHandlerRemote} */
 export function getParentAccessUIHandler() {
   if (!parentAccessUIHandler) {
     parentAccessUIHandler = ParentAccessUIHandler.getRemote();
   }
   return parentAccessUIHandler;
+}
+
+/** @return  {!Promise<{params: !ParentAccessParams}>} */
+export async function getParentAccessParams() {
+  if (!parentAccessParams) {
+    parentAccessParams =
+        await getParentAccessUIHandler().getParentAccessParams();
+  }
+  return parentAccessParams;
+}
+
+/** @param  {!{params: !ParentAccessParams}} params*/
+export function setParentAccessParamsForTest(params) {
+  parentAccessParams = params;
 }
\ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/password_change/BUILD.gn b/chrome/browser/resources/chromeos/password_change/BUILD.gn
index efe1ab7c..92c6424 100644
--- a/chrome/browser/resources/chromeos/password_change/BUILD.gn
+++ b/chrome/browser/resources/chromeos/password_change/BUILD.gn
@@ -96,9 +96,9 @@
 js_library("password_change") {
   sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/password_change/password_change.js" ]
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//chrome/browser/resources/gaia_auth_host:password_change_authenticator",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
   externs_list = [ "$externs_path/webview_tag.js" ]
@@ -108,9 +108,9 @@
 
 js_library("lock_screen_network") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/network:network_select",
     "//ash/webui/common/resources/network:onc_mojo",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
   externs_list = [
diff --git a/chrome/browser/resources/chromeos/password_change/confirm_password_change.js b/chrome/browser/resources/chromeos/password_change/confirm_password_change.js
index ec5efb3b..def2e92f 100644
--- a/chrome/browser/resources/chromeos/password_change/confirm_password_change.js
+++ b/chrome/browser/resources/chromeos/password_change/confirm_password_change.js
@@ -23,9 +23,9 @@
 import 'chrome://resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js';
 
 import {sendWithPromise} from 'chrome://resources/js/cr.m.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /** @enum{number} */
diff --git a/chrome/browser/resources/chromeos/password_change/lock_screen_reauth.js b/chrome/browser/resources/chromeos/password_change/lock_screen_reauth.js
index 2918610e2..1882ba46 100644
--- a/chrome/browser/resources/chromeos/password_change/lock_screen_reauth.js
+++ b/chrome/browser/resources/chromeos/password_change/lock_screen_reauth.js
@@ -15,7 +15,7 @@
 import 'chrome://resources/cr_elements/cr_shared_vars.css.js';
 import './components/oobe_icons.m.js';
 
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {$} from 'chrome://resources/js/util.js';
diff --git a/chrome/browser/resources/chromeos/password_change/password_change.js b/chrome/browser/resources/chromeos/password_change/password_change.js
index 440adfd..2466f418 100644
--- a/chrome/browser/resources/chromeos/password_change/password_change.js
+++ b/chrome/browser/resources/chromeos/password_change/password_change.js
@@ -11,7 +11,7 @@
 import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js';
 import 'chrome://resources/cr_elements/icons.html.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/chromeos/password_change/urgent_password_expiry_notification_app.js b/chrome/browser/resources/chromeos/password_change/urgent_password_expiry_notification_app.js
index 76d87af..bd6538c 100644
--- a/chrome/browser/resources/chromeos/password_change/urgent_password_expiry_notification_app.js
+++ b/chrome/browser/resources/chromeos/password_change/urgent_password_expiry_notification_app.js
@@ -16,9 +16,9 @@
 import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 import './strings.m.js';
 
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 const ONE_SECOND_IN_MS = 1000;
diff --git a/chrome/browser/resources/chromeos/set_time_dialog/BUILD.gn b/chrome/browser/resources/chromeos/set_time_dialog/BUILD.gn
index 8a6fbf49..f9daecf 100644
--- a/chrome/browser/resources/chromeos/set_time_dialog/BUILD.gn
+++ b/chrome/browser/resources/chromeos/set_time_dialog/BUILD.gn
@@ -16,8 +16,8 @@
 js_library("set_time_dialog") {
   deps = [
     ":set_time_browser_proxy",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:cr.m",
     "//ui/webui/resources/js:load_time_data.m",
diff --git a/chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.js b/chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.js
index 5a90a31a..e91c4a8 100644
--- a/chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.js
+++ b/chrome/browser/resources/chromeos/set_time_dialog/set_time_dialog.js
@@ -21,7 +21,7 @@
 
 import {assert} from 'chrome://resources/js/assert.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {SetTimeBrowserProxy, SetTimeBrowserProxyImpl} from './set_time_browser_proxy.js';
diff --git a/chrome/browser/resources/chromeos/smb_shares/BUILD.gn b/chrome/browser/resources/chromeos/smb_shares/BUILD.gn
index bf7283c6..de13b6cb 100644
--- a/chrome/browser/resources/chromeos/smb_shares/BUILD.gn
+++ b/chrome/browser/resources/chromeos/smb_shares/BUILD.gn
@@ -15,17 +15,17 @@
 
 js_library("smb_share_dialog") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/smb_shares:add_smb_share_dialog",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
 js_library("smb_credentials_dialog") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/smb_shares:smb_browser_proxy",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:cr.m",
     "//ui/webui/resources/js:load_time_data.m",
diff --git a/chrome/browser/resources/chromeos/smb_shares/DIR_METADATA b/chrome/browser/resources/chromeos/smb_shares/DIR_METADATA
index 5b8d7cd..e9400b87 100644
--- a/chrome/browser/resources/chromeos/smb_shares/DIR_METADATA
+++ b/chrome/browser/resources/chromeos/smb_shares/DIR_METADATA
@@ -1,3 +1 @@
-monorail {
-  component: "Platform>Apps>FileManager"
-}
+mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chrome/browser/resources/chromeos/smb_shares/smb_credentials_dialog.js b/chrome/browser/resources/chromeos/smb_shares/smb_credentials_dialog.js
index 2604315b..925ce5e 100644
--- a/chrome/browser/resources/chromeos/smb_shares/smb_credentials_dialog.js
+++ b/chrome/browser/resources/chromeos/smb_shares/smb_credentials_dialog.js
@@ -8,7 +8,7 @@
 import './strings.m.js';
 
 import {SmbBrowserProxy, SmbBrowserProxyImpl} from 'chrome://resources/ash/common/smb_shares/smb_browser_proxy.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/chromeos/smb_shares/smb_share_dialog.js b/chrome/browser/resources/chromeos/smb_shares/smb_share_dialog.js
index f43df8334..87e09dd 100644
--- a/chrome/browser/resources/chromeos/smb_shares/smb_share_dialog.js
+++ b/chrome/browser/resources/chromeos/smb_shares/smb_share_dialog.js
@@ -5,7 +5,7 @@
 import 'chrome://resources/ash/common/smb_shares/add_smb_share_dialog.js';
 import './strings.m.js';
 
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
diff --git a/chrome/browser/resources/nearby_internals/BUILD.gn b/chrome/browser/resources/nearby_internals/BUILD.gn
index bdf31a99..820df5e 100644
--- a/chrome/browser/resources/nearby_internals/BUILD.gn
+++ b/chrome/browser/resources/nearby_internals/BUILD.gn
@@ -128,8 +128,8 @@
     ":nearby_logs_browser_proxy",
     ":nearby_prefs_browser_proxy",
     ":types",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:cr.m",
   ]
 }
diff --git a/chrome/browser/resources/nearby_internals/contact_tab.js b/chrome/browser/resources/nearby_internals/contact_tab.js
index 699f3cf..5b618cb1 100644
--- a/chrome/browser/resources/nearby_internals/contact_tab.js
+++ b/chrome/browser/resources/nearby_internals/contact_tab.js
@@ -8,7 +8,7 @@
 import './contact_object.js';
 import './shared_style.js';
 
-import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {NearbyContactBrowserProxy} from './nearby_contact_browser_proxy.js';
diff --git a/chrome/browser/resources/nearby_internals/http_tab.js b/chrome/browser/resources/nearby_internals/http_tab.js
index eea423b..57211823 100644
--- a/chrome/browser/resources/nearby_internals/http_tab.js
+++ b/chrome/browser/resources/nearby_internals/http_tab.js
@@ -8,7 +8,7 @@
 import './http_message_object.js';
 import './shared_style.js';
 
-import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {NearbyHttpBrowserProxy} from './nearby_http_browser_proxy.js';
diff --git a/chrome/browser/resources/nearby_internals/logging_tab.js b/chrome/browser/resources/nearby_internals/logging_tab.js
index 46d445c..5b1fb46 100644
--- a/chrome/browser/resources/nearby_internals/logging_tab.js
+++ b/chrome/browser/resources/nearby_internals/logging_tab.js
@@ -8,7 +8,7 @@
 import './log_object.js';
 import './shared_style.js';
 
-import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {NearbyLogsBrowserProxy} from './nearby_logs_browser_proxy.js';
diff --git a/chrome/browser/resources/nearby_internals/ui_trigger_tab.js b/chrome/browser/resources/nearby_internals/ui_trigger_tab.js
index c815f32..708f7243 100644
--- a/chrome/browser/resources/nearby_internals/ui_trigger_tab.js
+++ b/chrome/browser/resources/nearby_internals/ui_trigger_tab.js
@@ -7,7 +7,7 @@
 import './ui_trigger_list_object.js';
 import './shared_style.js';
 
-import {WebUIListenerBehavior} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {NearbyPrefsBrowserProxy} from './nearby_prefs_browser_proxy.js';
diff --git a/chrome/browser/resources/nearby_share/BUILD.gn b/chrome/browser/resources/nearby_share/BUILD.gn
index 2e685bf..85bfd0f1 100644
--- a/chrome/browser/resources/nearby_share/BUILD.gn
+++ b/chrome/browser/resources/nearby_share/BUILD.gn
@@ -179,10 +179,10 @@
     "./shared:nearby_preview",
     "./shared:nearby_progress",
     "./shared:types",
+    "//ash/webui/common/resources:i18n_behavior",
     "//chrome/browser/ui/webui/nearby_share:mojom_js_library_for_compile",
     "//chrome/browser/ui/webui/nearby_share:share_type_js_library_for_compile",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list =
       [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js" ]
diff --git a/chrome/browser/resources/nearby_share/nearby_confirmation_page.js b/chrome/browser/resources/nearby_share/nearby_confirmation_page.js
index e0f34ce..538ae630 100644
--- a/chrome/browser/resources/nearby_share/nearby_confirmation_page.js
+++ b/chrome/browser/resources/nearby_share/nearby_confirmation_page.js
@@ -23,7 +23,7 @@
 import './shared/nearby_progress.js';
 import './strings.m.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getDiscoveryManager} from './discovery_manager.js';
diff --git a/chrome/browser/resources/nearby_share/nearby_discovery_page.js b/chrome/browser/resources/nearby_share/nearby_discovery_page.js
index d3d6a96..e302fa63 100644
--- a/chrome/browser/resources/nearby_share/nearby_discovery_page.js
+++ b/chrome/browser/resources/nearby_share/nearby_discovery_page.js
@@ -23,7 +23,7 @@
 import './strings.m.js';
 
 import {assert, assertNotReached} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getDiscoveryManager, observeDiscoveryManager} from './discovery_manager.js';
diff --git a/chrome/browser/resources/nearby_share/shared/BUILD.gn b/chrome/browser/resources/nearby_share/shared/BUILD.gn
index 83bd133..4610169d 100644
--- a/chrome/browser/resources/nearby_share/shared/BUILD.gn
+++ b/chrome/browser/resources/nearby_share/shared/BUILD.gn
@@ -123,8 +123,8 @@
   deps = [
     ":nearby_contact_manager",
     ":nearby_share_settings_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:cr.m",
     "//ui/webui/resources/js:load_time_data.m",
@@ -153,8 +153,8 @@
     ":nearby_metrics_logger",
     ":nearby_page_template",
     ":nearby_share_settings_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -163,8 +163,8 @@
     ":nearby_metrics_logger",
     ":nearby_page_template",
     ":nearby_share_settings_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -174,11 +174,11 @@
 
 js_library("nearby_preview") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//chrome/browser/ui/webui/nearby_share:mojom_js_library_for_compile",
     "//chrome/browser/ui/webui/nearby_share:share_type_js_library_for_compile",
     "//chromeos/ash/services/nearby/public/mojom:nearby_share_target_types_js_library_for_compile",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
   ]
 }
@@ -210,8 +210,8 @@
     ":nearby_contact_visibility",
     ":nearby_page_template",
     ":nearby_share_settings_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
 }
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_contact_visibility.js b/chrome/browser/resources/nearby_share/shared/nearby_contact_visibility.js
index 46066140..db058d9 100644
--- a/chrome/browser/resources/nearby_share/shared/nearby_contact_visibility.js
+++ b/chrome/browser/resources/nearby_share/shared/nearby_contact_visibility.js
@@ -20,7 +20,7 @@
 
 import {assert, assertNotReached} from 'chrome://resources/js/assert.js';
 import {sendWithPromise} from 'chrome://resources/js/cr.m.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_onboarding_one_page.js b/chrome/browser/resources/nearby_share/shared/nearby_onboarding_one_page.js
index c6b2152..16963d89 100644
--- a/chrome/browser/resources/nearby_share/shared/nearby_onboarding_one_page.js
+++ b/chrome/browser/resources/nearby_share/shared/nearby_onboarding_one_page.js
@@ -16,7 +16,7 @@
 import 'chrome://resources/polymer/v3_0/iron-media-query/iron-media-query.js';
 import './nearby_page_template.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {NearbyShareOnboardingFinalState, processOnePageOnboardingCancelledMetrics, processOnePageOnboardingCompleteMetrics, processOnePageOnboardingInitiatedMetrics, processOnePageOnboardingVisibilityButtonOnInitialPageClickedMetrics} from './nearby_metrics_logger.js';
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.js b/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.js
index 33c3cae..dda4e45 100644
--- a/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.js
+++ b/chrome/browser/resources/nearby_share/shared/nearby_onboarding_page.js
@@ -15,7 +15,7 @@
 import 'chrome://resources/polymer/v3_0/iron-media-query/iron-media-query.js';
 import './nearby_page_template.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {NearbyShareOnboardingFinalState, processOnboardingCancelledMetrics, processOnboardingInitiatedMetrics} from './nearby_metrics_logger.js';
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_preview.js b/chrome/browser/resources/nearby_share/shared/nearby_preview.js
index 53d4da6b..17191f30 100644
--- a/chrome/browser/resources/nearby_share/shared/nearby_preview.js
+++ b/chrome/browser/resources/nearby_share/shared/nearby_preview.js
@@ -14,7 +14,7 @@
 import './nearby_shared_share_type_icons.html.js';
 
 import {assertNotReached} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getTemplate} from './nearby_preview.html.js';
diff --git a/chrome/browser/resources/nearby_share/shared/nearby_visibility_page.js b/chrome/browser/resources/nearby_share/shared/nearby_visibility_page.js
index 49a7bbb..f1695ca 100644
--- a/chrome/browser/resources/nearby_share/shared/nearby_visibility_page.js
+++ b/chrome/browser/resources/nearby_share/shared/nearby_visibility_page.js
@@ -15,7 +15,7 @@
 import 'chrome://resources/cr_elements/cr_shared_style.css.js';
 import 'chrome://resources/cr_elements/cr_icons.css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/ntp4/new_tab.js b/chrome/browser/resources/ntp4/new_tab.js
index c8dc19bf..d873b0f 100644
--- a/chrome/browser/resources/ntp4/new_tab.js
+++ b/chrome/browser/resources/ntp4/new_tab.js
@@ -6,9 +6,7 @@
 
 import {assert} from 'chrome://resources/js/assert.js';
 import {addWebUIListener} from 'chrome://resources/js/cr.m.js';
-import {getUrlForCss} from 'chrome://resources/js/icon.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {parseHtmlSubset} from 'chrome://resources/js/parse_html_subset.js';
 import {$, appendParam, getRequiredElement} from 'chrome://resources/js/util.js';
 
 import {AppInfo} from './app_info.js';
diff --git a/chrome/browser/resources/pdf/pdf_viewer.ts b/chrome/browser/resources/pdf/pdf_viewer.ts
index faa76a4..12173c9 100644
--- a/chrome/browser/resources/pdf/pdf_viewer.ts
+++ b/chrome/browser/resources/pdf/pdf_viewer.ts
@@ -500,39 +500,53 @@
     this.currentController.setDisplayAnnotations(e.detail);
   }
 
-  private onPresentClick_() {
+  private async enterPresentationMode_(): Promise<void> {
     const scroller = this.$.scroller;
 
-    Promise
-        .all([
-          eventToPromise('fullscreenchange', scroller),
-          scroller.requestFullscreen(),
-        ])
-        .then(() => {
-          this.forceFit(FittingType.FIT_TO_HEIGHT);
+    this.viewport.saveZoomState();
 
-          // Switch viewport's wheel behavior.
-          this.viewport.setPresentationMode(true);
+    await Promise.all([
+      eventToPromise('fullscreenchange', scroller),
+      scroller.requestFullscreen(),
+    ]);
 
-          // Set presentation mode, which restricts the content to read only
-          // (e.g. disable forms and links).
-          this.pluginController_!.setPresentationMode(true);
+    this.forceFit(FittingType.FIT_TO_HEIGHT);
 
-          // Revert back to the normal state when exiting Presentation mode.
-          eventToPromise('fullscreenchange', scroller).then(() => {
-            assert(document.fullscreenElement === null);
-            this.viewport.setPresentationMode(false);
-            this.pluginController_!.setPresentationMode(false);
+    // Switch viewport's wheel behavior.
+    this.viewport.setPresentationMode(true);
 
-            // Ensure that directional keys still work after exiting.
-            this.shadowRoot!.querySelector('embed')!.focus();
-          });
+    // Set presentation mode, which restricts the content to read only
+    // (e.g. disable forms and links).
+    this.pluginController_!.setPresentationMode(true);
 
-          // Nothing else to do here. The viewport will be updated as a result
-          // of a 'resize' event callback.
-        });
+    // Nothing else to do here. The viewport will be updated as a result
+    // of a 'resize' event callback.
   }
 
+  private exitPresentationMode_(): void {
+    // Revert back to the normal state when exiting Presentation mode.
+    assert(document.fullscreenElement === null);
+    this.viewport.setPresentationMode(false);
+    this.pluginController_!.setPresentationMode(false);
+
+    // Ensure that directional keys still work after exiting.
+    this.shadowRoot!.querySelector('embed')!.focus();
+
+    // Set zoom back to original zoom before presentation mode.
+    this.viewport.restoreZoomState();
+  }
+
+  private async onPresentClick_() {
+    await this.enterPresentationMode_();
+
+    // When fullscreen changes, it means that the user exited Presentation
+    // mode.
+    await eventToPromise('fullscreenchange', this.$.scroller);
+
+    this.exitPresentationMode_();
+  }
+
+
   private onPropertiesClick_() {
     assert(!this.showPropertiesDialog_);
     this.showPropertiesDialog_ = true;
diff --git a/chrome/browser/resources/pdf/viewport.ts b/chrome/browser/resources/pdf/viewport.ts
index f334ef2..edbfc3e 100644
--- a/chrome/browser/resources/pdf/viewport.ts
+++ b/chrome/browser/resources/pdf/viewport.ts
@@ -77,6 +77,13 @@
   private internalZoom_: number = 1;
 
   /**
+   * Zoom state used to change zoom and fitting type to what it was
+   * originally when saved.
+   */
+  private savedZoom_: number|null = null;
+  private savedFittingType_: FittingType|null = null;
+
+  /**
    * Predefined zoom factors to be used when zooming in/out. These are in
    * ascending order.
    */
@@ -591,6 +598,30 @@
     });
   }
 
+  /**
+   * Save the current zoom and fitting type.
+   */
+  saveZoomState() {
+    this.savedZoom_ = this.internalZoom_;
+    this.savedFittingType_ = this.fittingType_;
+  }
+
+  /**
+   * Set zoom and fitting type to what it was when saved. See saveZoomState().
+   */
+  restoreZoomState() {
+    assert(
+        this.savedZoom_ !== null && this.savedFittingType_ !== null,
+        'No saved zoom state exists');
+    if (this.savedFittingType_ === FittingType.NONE) {
+      this.setZoom(this.savedZoom_);
+    } else {
+      this.setFittingType(this.savedFittingType_);
+    }
+    this.savedZoom_ = null;
+    this.savedFittingType_ = null;
+  }
+
   /** @param e Event containing the old browser zoom. */
   private updateZoomFromBrowserChange_(e: CustomEvent<number>) {
     const oldBrowserZoom = e.detail;
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn
index 8a6ad10..30ae4a57 100644
--- a/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/crostini_page/BUILD.gn
@@ -37,9 +37,9 @@
     "..:os_route",
     "..:route_observer_behavior",
     "../..:router",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
-    "//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior",
+    "//ash/webui/common/resources:cr_policy_indicator_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
   externs_list = [
@@ -52,7 +52,7 @@
   deps = [
     ":crostini_browser_proxy",
     "..:metrics_recorder",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js",
@@ -81,9 +81,9 @@
 js_library("crostini_disk_resize_dialog") {
   deps = [
     ":crostini_browser_proxy",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js",
@@ -95,8 +95,8 @@
 js_library("crostini_disk_resize_confirmation_dialog") {
   deps = [
     ":crostini_browser_proxy",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js",
@@ -114,8 +114,8 @@
     "../..:router",
     "../guest_os:guest_os_browser_proxy",
     "../guest_os:guest_os_container_select",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
   ]
   externs_list =
       [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js" ]
@@ -125,7 +125,7 @@
   deps = [
     ":crostini_browser_proxy",
     "../guest_os:guest_os_browser_proxy",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js",
@@ -150,8 +150,8 @@
     "../..:router",
     "../guest_os:guest_os_shared_paths",
     "../guest_os:guest_os_shared_usb_devices",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js",
@@ -167,9 +167,9 @@
     "..:prefs_behavior",
     "../guest_os:guest_os_browser_proxy",
     "../guest_os:guest_os_container_select",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
 
@@ -185,7 +185,7 @@
     "..:metrics_recorder",
     "../guest_os:guest_os_browser_proxy",
     "../guest_os:guest_os_container_select",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ui/webui/resources/js:cr.m",
     "//ui/webui/resources/js:load_time_data.m",
   ]
@@ -203,9 +203,9 @@
     "..:metrics_recorder",
     "..:prefs_behavior",
     "../guest_os:guest_os_browser_proxy",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
 
@@ -219,8 +219,8 @@
     ":crostini_browser_proxy",
     "..:metrics_recorder",
     "../guest_os:guest_os_browser_proxy",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:cr.m",
   ]
 }
@@ -240,8 +240,8 @@
     "..:route_observer_behavior",
     "..:route_origin_behavior",
     "../..:router",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
   externs_list = [
@@ -267,8 +267,8 @@
     "..:route_observer_behavior",
     "..:route_origin_behavior",
     "../..:router",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
   externs_list = [
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_arc_adb.js b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_arc_adb.js
index b8379274..151fe1d9d 100644
--- a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_arc_adb.js
+++ b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_arc_adb.js
@@ -13,10 +13,10 @@
 import 'chrome://resources/cr_components/localized_link/localized_link.js';
 import '../../settings_shared.css.js';
 
-import {CrPolicyIndicatorType} from 'chrome://resources/cr_elements/policy/cr_policy_indicator_behavior.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {CrPolicyIndicatorType} from 'chrome://resources/ash/common/cr_policy_indicator_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_export_import.js b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_export_import.js
index 4b2e036..9d8283c 100644
--- a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_export_import.js
+++ b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_export_import.js
@@ -12,7 +12,7 @@
 import './crostini_import_confirmation_dialog.js';
 import '../../settings_shared.css.js';
 
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_extra_containers.js b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_extra_containers.js
index 4f32236..0f95e95d 100644
--- a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_extra_containers.js
+++ b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_extra_containers.js
@@ -17,7 +17,7 @@
 
 import {assert} from 'chrome://resources/js/assert.js';
 import {hexColorToSkColor} from 'chrome://resources/js/color_utils.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {ContainerInfo, GuestId} from '../guest_os/guest_os_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.js b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.js
index e5fa2160..89fcd3b 100644
--- a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.js
+++ b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_page.js
@@ -26,9 +26,9 @@
 import './crostini_subpage.js';
 import './bruschetta_subpage.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_port_forwarding.js b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_port_forwarding.js
index 13191e4..3e70443 100644
--- a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_port_forwarding.js
+++ b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_port_forwarding.js
@@ -20,7 +20,7 @@
 import 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js';
 
 import {assert} from 'chrome://resources/js/assert.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {ContainerInfo, GuestId} from '../guest_os/guest_os_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.js b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.js
index 152dd5b..6a1f99c 100644
--- a/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/crostini_page/crostini_subpage.js
@@ -19,7 +19,7 @@
 import './crostini_extra_containers.js';
 
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn
index 973a769..34bb216 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/device_page/BUILD.gn
@@ -33,8 +33,8 @@
     "..:os_route",
     "..:route_observer_behavior",
     "../..:router",
+    "//ash/webui/common/resources:i18n_behavior",
     "//chromeos/ash/components/audio/public/mojom:mojom_webui_js",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 
   externs_list =
@@ -123,8 +123,8 @@
     "..:os_route",
     "..:route_observer_behavior",
     "../..:router",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
   ]
 }
 
@@ -136,7 +136,7 @@
     "..:route_origin_behavior",
     "../..:router",
     "//ash/webui/common/resources:focus_without_ink_js",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:load_time_data.m",
   ]
@@ -145,15 +145,15 @@
 js_library("storage_external") {
   deps = [
     ":device_page_browser_proxy",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
   ]
 }
 
 js_library("storage_external_entry") {
   deps = [
     "..:prefs_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
   ]
 }
 
diff --git a/chrome/browser/resources/settings/chromeos/device_page/audio.js b/chrome/browser/resources/settings/chromeos/device_page/audio.js
index 7de7efd..312760ac 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/audio.js
+++ b/chrome/browser/resources/settings/chromeos/device_page/audio.js
@@ -6,7 +6,7 @@
 import '../../icons.html.js';
 import '../../settings_shared.css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {AudioSystemProperties, AudioSystemPropertiesObserverInterface, AudioSystemPropertiesObserverReceiver, CrosAudioConfigInterface, MuteState} from '../../mojom-webui/audio/cros_audio_config.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/device_page/display.js b/chrome/browser/resources/settings/chromeos/device_page/display.js
index 49d3927..ad711a4 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/display.js
+++ b/chrome/browser/resources/settings/chromeos/device_page/display.js
@@ -24,7 +24,7 @@
 import 'chrome://resources/cr_elements/cr_slider/cr_slider.js';
 
 import {focusWithoutInk} from 'chrome://resources/ash/common/focus_without_ink_js.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {flush, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/device_page/keyboard.js b/chrome/browser/resources/settings/chromeos/device_page/keyboard.js
index 220fc5db9..03b45b3 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/keyboard.js
+++ b/chrome/browser/resources/settings/chromeos/device_page/keyboard.js
@@ -10,7 +10,7 @@
 import '../../controls/settings_dropdown_menu.js';
 
 import {focusWithoutInk} from 'chrome://resources/ash/common/focus_without_ink_js.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/device_page/power.js b/chrome/browser/resources/settings/chromeos/device_page/power.js
index 2d1d7b8e..6209bca4 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/power.js
+++ b/chrome/browser/resources/settings/chromeos/device_page/power.js
@@ -15,9 +15,9 @@
 import '../../settings_shared.css.js';
 
 import {assertNotReached} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {SettingChangeValue} from '../../mojom-webui/search/user_action_recorder.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/device_page/storage.js b/chrome/browser/resources/settings/chromeos/device_page/storage.js
index 17176e9..705cc7a 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/storage.js
+++ b/chrome/browser/resources/settings/chromeos/device_page/storage.js
@@ -12,7 +12,7 @@
 import '../../settings_shared.css.js';
 
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
diff --git a/chrome/browser/resources/settings/chromeos/device_page/storage_external.js b/chrome/browser/resources/settings/chromeos/device_page/storage_external.js
index 2377ece..83f39d5 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/storage_external.js
+++ b/chrome/browser/resources/settings/chromeos/device_page/storage_external.js
@@ -13,8 +13,8 @@
 import '../../prefs/prefs.js';
 import '../../settings_shared.css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {DevicePageBrowserProxy, DevicePageBrowserProxyImpl, ExternalStorage} from './device_page_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/device_page/storage_external_entry.js b/chrome/browser/resources/settings/chromeos/device_page/storage_external_entry.js
index c8d0ab4..d282fec 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/storage_external_entry.js
+++ b/chrome/browser/resources/settings/chromeos/device_page/storage_external_entry.js
@@ -11,7 +11,7 @@
 import '../../prefs/prefs.js';
 import '../../settings_shared.css.js';
 
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {PrefsBehavior, PrefsBehaviorInterface} from '../prefs_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/device_page/stylus.ts b/chrome/browser/resources/settings/chromeos/device_page/stylus.ts
index 910977a..8987d02 100644
--- a/chrome/browser/resources/settings/chromeos/device_page/stylus.ts
+++ b/chrome/browser/resources/settings/chromeos/device_page/stylus.ts
@@ -15,7 +15,7 @@
 import '../../controls/settings_toggle_button.js';
 import '../../settings_shared.css.js';
 
-import {CrPolicyIndicatorType} from 'chrome://resources/cr_elements/policy/cr_policy_indicator_behavior.js';
+import {CrPolicyIndicatorType} from 'chrome://resources/ash/common/cr_policy_indicator_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {microTask, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/guest_os/BUILD.gn b/chrome/browser/resources/settings/chromeos/guest_os/BUILD.gn
index dc95e10..adf4f89 100644
--- a/chrome/browser/resources/settings/chromeos/guest_os/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/guest_os/BUILD.gn
@@ -39,8 +39,8 @@
     ":guest_os_container_select",
     ":guest_os_shared_usb_devices_add_dialog",
     "..:metrics_recorder",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
   ]
   externs_list =
       [ "//ui/webui/resources/cr_elements/cr_toggle/cr_toggle_externs.js" ]
@@ -51,7 +51,7 @@
     ":guest_os_browser_proxy",
     ":guest_os_container_select",
     "..:metrics_recorder",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ui/webui/resources/js:cr.m",
     "//ui/webui/resources/js:load_time_data.m",
   ]
@@ -65,8 +65,8 @@
   deps = [
     ":guest_os_browser_proxy",
     "..:metrics_recorder",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
diff --git a/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_paths.js b/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_paths.js
index e696b9e..9dd3666 100644
--- a/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_paths.js
+++ b/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_paths.js
@@ -12,7 +12,7 @@
 import '../../settings_shared.css.js';
 
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {recordSettingChange} from '../metrics_recorder.js';
diff --git a/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_usb_devices.js b/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_usb_devices.js
index a447cc7..cba48e6 100644
--- a/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_usb_devices.js
+++ b/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_usb_devices.js
@@ -11,8 +11,8 @@
 import 'chrome://resources/cr_elements/cr_toggle/cr_toggle.js';
 import './guest_os_shared_usb_devices_add_dialog.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {recordSettingChange} from '../metrics_recorder.js';
diff --git a/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_usb_devices_add_dialog.js b/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_usb_devices_add_dialog.js
index e125939..f9e86ee 100644
--- a/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_usb_devices_add_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/guest_os/guest_os_shared_usb_devices_add_dialog.js
@@ -14,7 +14,7 @@
 import './guest_os_container_select.js';
 
 import {assert} from 'chrome://resources/js/assert_ts.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, microTask, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {recordSettingChange} from '../metrics_recorder.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn
index 35e5fc3..64ea135 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/internet_page/BUILD.gn
@@ -37,10 +37,10 @@
 
 js_library("cellular_setup_dialog") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/cellular_setup:cellular_setup",
     "//ash/webui/common/resources/cellular_setup:cellular_setup_delegate",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list =
       [ "//ui/webui/resources/cr_elements/cr_dialog/cr_dialog_externs.js" ]
@@ -49,6 +49,7 @@
 js_library("internet_config") {
   deps = [
     ":internet_shared_css",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/network:network_config",
     "//ash/webui/common/resources/network:onc_mojo",
     "//chrome/browser/resources/settings:router",
@@ -56,7 +57,6 @@
     "//chrome/browser/resources/settings/chromeos:route_observer_behavior",
     "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:util",
   ]
   externs_list = [
@@ -67,6 +67,8 @@
 
 js_library("internet_detail_menu") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//ash/webui/common/resources/cellular_setup:esim_manager_listener_behavior",
     "//ash/webui/common/resources/network:mojo_interface_provider",
     "//ash/webui/common/resources/network:onc_mojo",
@@ -75,8 +77,6 @@
     "//chrome/browser/resources/settings/chromeos:route_observer_behavior",
     "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
 
   externs_list = [
@@ -92,6 +92,8 @@
     ":network_proxy_section",
     ":settings_traffic_counters",
     ":tether_connection_dialog",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//ash/webui/common/resources/network:cr_policy_network_behavior_mojo",
     "//ash/webui/common/resources/network:cr_policy_network_indicator_mojo",
     "//ash/webui/common/resources/network:mojo_interface_provider",
@@ -117,8 +119,6 @@
     "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon",
     "//third_party/polymer/v3_0/components-chromium/paper-spinner:paper-spinner-lite",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:assert",
   ]
   externs_list = [
@@ -132,6 +132,7 @@
 js_library("internet_known_networks_page") {
   deps = [
     ":internet_shared_css",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/network:cr_policy_network_behavior_mojo",
     "//ash/webui/common/resources/network:mojo_interface_provider",
     "//ash/webui/common/resources/network:network_listener_behavior",
@@ -142,7 +143,6 @@
     "//chrome/browser/resources/settings/chromeos:os_route",
     "//chrome/browser/resources/settings/chromeos:route_observer_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
   ]
 
@@ -162,6 +162,8 @@
     ":internet_page_browser_proxy",
     ":internet_subpage",
     ":network_summary",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//ash/webui/common/resources/cellular_setup:cellular_types",
     "//ash/webui/common/resources/cellular_setup:esim_manager_utils",
     "//ash/webui/common/resources/network:cellular_utils",
@@ -176,8 +178,6 @@
     "//chrome/browser/resources/settings/chromeos:route_observer_behavior",
     "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_toast/cr_toast_externs.js",
@@ -203,6 +203,7 @@
     ":cellular_networks_list",
     ":internet_page_browser_proxy",
     ":network_always_on_vpn",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/cellular_setup:cellular_types",
     "//ash/webui/common/resources/network:cr_policy_network_behavior_mojo",
     "//ash/webui/common/resources/network:network_list",
@@ -217,7 +218,6 @@
     "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
     "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_toggle/cr_toggle_externs.js",
@@ -228,9 +228,9 @@
 js_library("network_always_on_vpn") {
   deps = [
     ":internet_shared_css",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/network:onc_mojo",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
   ]
 }
@@ -238,6 +238,7 @@
 js_library("network_proxy_section") {
   deps = [
     ":internet_shared_css",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/network:cr_policy_network_behavior_mojo",
     "//ash/webui/common/resources/network:cr_policy_network_indicator_mojo",
     "//ash/webui/common/resources/network:network_proxy",
@@ -247,7 +248,6 @@
     "//chrome/browser/resources/settings/chromeos:route_observer_behavior",
     "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list = [
     "../settings_controls_types.js",
@@ -268,6 +268,8 @@
 
 js_library("network_summary_item") {
   deps = [
+    "//ash/webui/common/resources:cr_policy_indicator_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/network:cellular_utils",
     "//ash/webui/common/resources/network:cr_policy_network_behavior_mojo",
     "//ash/webui/common/resources/network:network_icon",
@@ -276,8 +278,6 @@
     "//ash/webui/common/resources/traffic_counters:traffic_counters",
     "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements/policy:cr_policy_indicator_behavior",
     "//ui/webui/resources/js:assert",
   ]
   externs_list =
@@ -286,6 +286,7 @@
 
 js_library("tether_connection_dialog") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/network:network_icon",
     "//ash/webui/common/resources/network:onc_mojo",
     "//chrome/browser/resources/settings/chromeos:os_route",
@@ -293,7 +294,6 @@
     "//third_party/polymer/v3_0/components-chromium/iron-flex-layout:iron-flex-layout-classes",
     "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js",
@@ -306,6 +306,8 @@
     ":esim_install_error_dialog",
     "../multidevice_page:multidevice_browser_proxy",
     "../multidevice_page:multidevice_constants",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//ash/webui/common/resources/cellular_setup:cellular_types",
     "//ash/webui/common/resources/cellular_setup:esim_manager_listener_behavior",
     "//ash/webui/common/resources/cellular_setup:esim_manager_utils",
@@ -313,8 +315,6 @@
     "//ash/webui/common/resources/network:network_list_types",
     "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:assert",
   ]
 
@@ -326,12 +326,12 @@
 js_library("cellular_roaming_toggle_button") {
   deps = [
     ":internet_shared_css",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/network:mojo_interface_provider",
     "//ash/webui/common/resources/network:onc_mojo",
     "//chrome/browser/resources/settings/chromeos:metrics_recorder",
     "//chrome/browser/resources/settings/chromeos:prefs_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:load_time_data.m",
   ]
@@ -343,10 +343,10 @@
 
 js_library("esim_install_error_dialog") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/cellular_setup:esim_manager_utils",
     "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/paper-spinner:paper-spinner-lite",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_dialog/cr_dialog_externs.js",
@@ -356,9 +356,9 @@
 
 js_library("esim_rename_dialog") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/cellular_setup:esim_manager_utils",
     "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_dialog/cr_dialog_externs.js",
@@ -368,13 +368,13 @@
 
 js_library("esim_remove_profile_dialog") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/cellular_setup:esim_manager_utils",
     "//ash/webui/common/resources/network:onc_mojo",
     "//chrome/browser/resources/settings:router",
     "//chrome/browser/resources/settings/chromeos:os_route",
     "//chrome/browser/resources/settings/chromeos:route_observer_behavior",
     "//chromeos/ash/services/cellular_setup/public/mojom:mojom_webui_js",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_dialog/cr_dialog_externs.js",
@@ -385,13 +385,13 @@
 js_library("settings_traffic_counters") {
   deps = [
     ":internet_shared_css",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/network:onc_mojo",
     "//ash/webui/common/resources/traffic_counters:traffic_counters",
     "//ash/webui/common/resources/traffic_counters:traffic_counters_adapter",
     "//chromeos/services/network_config/public/mojom:mojom_webui_js",
     "//chromeos/services/network_config/public/mojom:network_types_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list =
       [ "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js" ]
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/cellular_networks_list.js b/chrome/browser/resources/settings/chromeos/internet_page/cellular_networks_list.js
index cfc460a..8e97943a3 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/cellular_networks_list.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/cellular_networks_list.js
@@ -25,8 +25,8 @@
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js';
 import {NetworkList} from 'chrome://resources/ash/common/network/network_list_types.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {assert, assertNotReached} from 'chrome://resources/js/assert.js';
 import {ESimProfileProperties, ESimProfileRemote, EuiccRemote, ProfileInstallResult, ProfileState} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.js';
 import {CrosNetworkConfigRemote, GlobalPolicy, InhibitReason} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/cellular_roaming_toggle_button.js b/chrome/browser/resources/settings/chromeos/internet_page/cellular_roaming_toggle_button.js
index ae89227b..f4d4ae7 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/cellular_roaming_toggle_button.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/cellular_roaming_toggle_button.js
@@ -18,7 +18,7 @@
 import {CrPolicyNetworkBehaviorMojo} from 'chrome://resources/ash/common/network/cr_policy_network_behavior_mojo.js';
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {CrosNetworkConfigRemote, ManagedProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/cellular_setup_dialog.js b/chrome/browser/resources/settings/chromeos/internet_page/cellular_setup_dialog.js
index 8811762..eaf6c28 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/cellular_setup_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/cellular_setup_dialog.js
@@ -13,7 +13,7 @@
 
 import {CellularSetupDelegate} from 'chrome://resources/ash/common/cellular_setup/cellular_setup_delegate.js';
 import {CellularSetupPageName} from 'chrome://resources/ash/common/cellular_setup/cellular_types.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {CellularSetupSettingsDelegate} from './cellular_setup_settings_delegate.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/esim_install_error_dialog.js b/chrome/browser/resources/settings/chromeos/internet_page/esim_install_error_dialog.js
index 35a23d49..a365357 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/esim_install_error_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/esim_install_error_dialog.js
@@ -11,7 +11,7 @@
 import 'chrome://resources/cr_elements/cr_input/cr_input.js';
 import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {ESimOperationResult, ESimProfileRemote, ProfileInstallResult} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/esim_remove_profile_dialog.js b/chrome/browser/resources/settings/chromeos/internet_page/esim_remove_profile_dialog.js
index 9375481..2ad55c7 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/esim_remove_profile_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/esim_remove_profile_dialog.js
@@ -12,7 +12,7 @@
 
 import {getESimProfile} from 'chrome://resources/ash/common/cellular_setup/esim_manager_utils.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {ESimOperationResult, ESimProfileRemote} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.js';
 import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/esim_rename_dialog.js b/chrome/browser/resources/settings/chromeos/internet_page/esim_rename_dialog.js
index a1dec3a5..f3dc16f5 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/esim_rename_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/esim_rename_dialog.js
@@ -13,7 +13,7 @@
 
 import {getESimProfile} from 'chrome://resources/ash/common/cellular_setup/esim_manager_utils.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {ESimOperationResult, ESimProfileRemote} from 'chrome://resources/mojo/chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom-webui.js';
 import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_config.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_config.js
index f69755f..40f71bd 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_config.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_config.js
@@ -13,7 +13,7 @@
 import './internet_shared_css.js';
 
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {HTMLEscape} from 'chrome://resources/js/util.js';
 import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js
index 0539adc..134bf35 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_detail_page.js
@@ -40,8 +40,8 @@
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js';
 import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/ash/common/network/network_listener_behavior.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {ActivationStateType, ApnProperties, ConfigProperties, CrosNetworkConfigRemote, FilterType, GlobalPolicy, HiddenSsidMode, IPConfigProperties, ManagedProperties, NetworkStateProperties, NO_LIMIT, ProxySettings, SecurityType, VpnType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_known_networks_page.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_known_networks_page.js
index 6897736..8e735ef 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_known_networks_page.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_known_networks_page.js
@@ -18,7 +18,7 @@
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js';
 import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/ash/common/network/network_listener_behavior.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {ConfigProperties, CrosNetworkConfigRemote, FilterType, NO_LIMIT} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js
index b170e81..919fd80 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_page.js
@@ -36,8 +36,8 @@
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js';
 import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/ash/common/network/network_listener_behavior.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {assert, assertNotReached} from 'chrome://resources/js/assert.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {CrosNetworkConfigRemote, GlobalPolicy, NetworkStateProperties, StartConnectResult, VpnProvider} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.js b/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.js
index 3ea85379..3c7a8df 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/internet_subpage.js
@@ -27,7 +27,7 @@
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js';
 import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/ash/common/network/network_listener_behavior.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert, assertNotReached} from 'chrome://resources/js/assert.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {AlwaysOnVpnMode, AlwaysOnVpnProperties, CrosNetworkConfigRemote, FilterType, GlobalPolicy, NO_LIMIT, VpnProvider, VpnType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/network_always_on_vpn.js b/chrome/browser/resources/settings/chromeos/internet_page/network_always_on_vpn.js
index 17ca825..282d8c973 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/network_always_on_vpn.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/network_always_on_vpn.js
@@ -11,7 +11,7 @@
 import 'chrome://resources/ash/common/network/network_shared.css.js';
 
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {AlwaysOnVpnMode} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.js b/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.js
index 3dbc85e7..e8d97ce 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/network_proxy_section.js
@@ -22,7 +22,7 @@
 
 import {CrPolicyNetworkBehaviorMojo, CrPolicyNetworkBehaviorMojoInterface} from 'chrome://resources/ash/common/network/cr_policy_network_behavior_mojo.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {ManagedProperties, ManagedString} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {OncSource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/network_summary_item.js b/chrome/browser/resources/settings/chromeos/internet_page/network_summary_item.js
index 7021bb4..aefb75b 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/network_summary_item.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/network_summary_item.js
@@ -19,8 +19,8 @@
 import {getSimSlotCount} from 'chrome://resources/ash/common/network/cellular_utils.js';
 import {CrPolicyNetworkBehaviorMojo, CrPolicyNetworkBehaviorMojoInterface} from 'chrome://resources/ash/common/network/cr_policy_network_behavior_mojo.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {CrPolicyIndicatorType} from 'chrome://resources/cr_elements/policy/cr_policy_indicator_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {CrPolicyIndicatorType} from 'chrome://resources/ash/common/cr_policy_indicator_behavior.js';
 import {assert, assertNotReached} from 'chrome://resources/js/assert.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {GlobalPolicy, VpnType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/settings_traffic_counters.js b/chrome/browser/resources/settings/chromeos/internet_page/settings_traffic_counters.js
index 72bec6bb..a7e0e203 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/settings_traffic_counters.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/settings_traffic_counters.js
@@ -14,7 +14,7 @@
 import 'chrome://resources/ash/common/traffic_counters/traffic_counters.js';
 
 import {Network, TrafficCountersAdapter} from 'chrome://resources/ash/common/traffic_counters/traffic_counters_adapter.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
diff --git a/chrome/browser/resources/settings/chromeos/internet_page/tether_connection_dialog.js b/chrome/browser/resources/settings/chromeos/internet_page/tether_connection_dialog.js
index cf9434e..ae1566f 100644
--- a/chrome/browser/resources/settings/chromeos/internet_page/tether_connection_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/internet_page/tether_connection_dialog.js
@@ -12,7 +12,7 @@
 import '../../settings_shared.css.js';
 
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {HTMLEscape} from 'chrome://resources/js/util.js';
 import {ManagedProperties} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/kerberos_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/kerberos_page/BUILD.gn
index 554d42b..bd13cbd 100644
--- a/chrome/browser/resources/settings/chromeos/kerberos_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/kerberos_page/BUILD.gn
@@ -26,9 +26,9 @@
     "..:route_observer_behavior",
     "../..:router",
     "../os_people_page:account_manager_browser_proxy",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:cr.m",
     "//ui/webui/resources/js:icon",
   ]
@@ -49,9 +49,9 @@
   deps = [
     ":kerberos_accounts_browser_proxy",
     "..:metrics_recorder",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:cr.m",
   ]
@@ -66,9 +66,9 @@
     "..:os_route",
     "..:route_observer_behavior",
     "../..:router",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:assert",
   ]
 }
diff --git a/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_accounts.js b/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_accounts.js
index 3b8213e..767cf48 100644
--- a/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_accounts.js
+++ b/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_accounts.js
@@ -18,9 +18,9 @@
 import '../../settings_shared.css.js';
 import './kerberos_add_account_dialog.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {getImage} from 'chrome://resources/js/icon.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {loadTimeData} from '../../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_add_account_dialog.js b/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_add_account_dialog.js
index 6127453d..90b40bc 100644
--- a/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_add_account_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_add_account_dialog.js
@@ -20,7 +20,7 @@
 import '../../settings_shared.css.js';
 
 import {assert, assertNotReached} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {flush, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_page.js b/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_page.js
index 528115d..8596117 100644
--- a/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_page.js
+++ b/chrome/browser/resources/settings/chromeos/kerberos_page/kerberos_page.js
@@ -16,8 +16,8 @@
 import '../../settings_shared.css.js';
 import './kerberos_accounts.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Router} from '../../router.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn
index bbea957f..c86a2e5 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/BUILD.gn
@@ -46,8 +46,8 @@
 js_library("multidevice_feature_behavior") {
   deps = [
     ":multidevice_constants",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -86,9 +86,9 @@
     "..:prefs_behavior",
     "..:route_observer_behavior",
     "../..:router",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//chrome/browser/resources/nearby_share/shared:nearby_share_settings_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:assert",
   ]
 }
@@ -96,8 +96,8 @@
 js_library("multidevice_notification_access_setup_dialog") {
   deps = [
     ":multidevice_constants",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
 }
@@ -105,8 +105,8 @@
 js_library("multidevice_permissions_setup_dialog") {
   deps = [
     ":multidevice_constants",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
   ]
 }
 
@@ -130,8 +130,8 @@
     "..:prefs_behavior",
     "..:route_observer_behavior",
     "../..:router",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
   externs_list = [
     "$externs_path/quick_unlock_private.js",
@@ -161,8 +161,8 @@
     ":multidevice_constants",
     ":multidevice_feature_behavior",
     ":multidevice_feature_item",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
   externs_list = [ "../settings_controls_types.js" ]
 }
@@ -185,8 +185,8 @@
     ":multidevice_feature_behavior",
     ":multidevice_feature_item",
     ":multidevice_task_continuation_disabled_link",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
   externs_list = [ "../settings_controls_types.js" ]
 }
@@ -200,9 +200,9 @@
     "..:route_origin_behavior",
     "../..:router",
     "../os_people_page:os_sync_browser_proxy",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
   externs_list = [ "../settings_controls_types.js" ]
@@ -212,8 +212,8 @@
   deps = [
     "..:os_route",
     "../..:router",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
 }
@@ -224,8 +224,8 @@
     "..:os_route",
     "..:route_origin_behavior",
     "../..:router",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
 }
@@ -235,9 +235,9 @@
     "../os_people_page:lock_screen_password_prompt_dialog",
     "../os_people_page:lock_state_behavior",
     "//ash/webui/common/resources:focus_without_ink_js",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/quick_unlock:lock_screen_constants",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:load_time_data.m",
   ]
@@ -251,8 +251,8 @@
     ":multidevice_feature_behavior",
     ":multidevice_feature_item",
     "..:metrics_recorder",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
 }
 
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_combined_setup_item.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_combined_setup_item.js
index 1ae7162a..c0b6c04 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_combined_setup_item.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_combined_setup_item.js
@@ -11,7 +11,7 @@
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
 import './multidevice_feature_item.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {MultiDeviceBrowserProxy, MultiDeviceBrowserProxyImpl} from './multidevice_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_behavior.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_behavior.js
index 701fb37..4a1e5d0 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_behavior.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_feature_behavior.js
@@ -8,7 +8,7 @@
  * cleanly and concisely. It includes some constants and utility methods.
  */
 
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 
 import {MultiDeviceFeature, MultiDeviceFeatureState, MultiDevicePageContentData, MultiDeviceSettingsMode, PhoneHubFeatureAccessStatus} from './multidevice_constants.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_notification_access_setup_dialog.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_notification_access_setup_dialog.js
index b75bb1f2..8b228c28 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_notification_access_setup_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_notification_access_setup_dialog.js
@@ -17,8 +17,8 @@
 import '../os_icons.js';
 import '../../settings_shared.css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {MultiDeviceBrowserProxy, MultiDeviceBrowserProxyImpl} from './multidevice_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.js
index 051c9019..b90a89f 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_page.js
@@ -19,8 +19,8 @@
 import './multidevice_subpage.js';
 
 import {assert, assertNotReached} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {beforeNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {loadTimeData} from '../../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_permissions_setup_dialog.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_permissions_setup_dialog.js
index ecc5cd1..1ed9732 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_permissions_setup_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_permissions_setup_dialog.js
@@ -20,9 +20,9 @@
 import '../../settings_shared.css.js';
 
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {LockStateBehavior, LockStateBehaviorInterface} from '../os_people_page/lock_state_behavior.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_screen_lock_subpage.html b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_screen_lock_subpage.html
index d33b0251..928eb9b6 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_screen_lock_subpage.html
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_screen_lock_subpage.html
@@ -82,10 +82,10 @@
           selected="{{selectedUnlockType}}"
           deep-link-focus-id$="[[Setting.kChangeAuthPinV2]]">
         <cr-radio-button id="passwordRadioButton" name="password"
-            label=$i18n{lockScreenPasswordOnly}>
+            label="$i18n{lockScreenPasswordOnly}">
         </cr-radio-button>
         <cr-radio-button id="pinRadioButton" name="pin+password"
-            label=$i18n{lockScreenPinOrPassword}>
+            label="$i18n{lockScreenPinOrPassword}">
         </cr-radio-button>
       </cr-radio-group>
     </template>
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_screen_lock_subpage.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_screen_lock_subpage.js
index 8368d6b..95a742f9 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_screen_lock_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_screen_lock_subpage.js
@@ -13,7 +13,7 @@
 import '../os_people_page/setup_pin_dialog.js';
 
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_item.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_item.js
index 750e991a..8de043f4 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_item.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_item.js
@@ -12,7 +12,7 @@
 
 import './multidevice_feature_item.js';
 
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {loadTimeData} from '../../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.js
index 727ff958..0f82566 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_smartlock_subpage.js
@@ -8,7 +8,7 @@
 import './multidevice_radio_button.js';
 import '../../settings_shared.css.js';
 
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_subpage.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_subpage.js
index 15adc69..72e30d65 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_subpage.js
@@ -20,7 +20,7 @@
 import './multidevice_tether_item.js';
 import './multidevice_wifi_sync_item.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {loadTimeData} from '../../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_disabled_link.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_disabled_link.js
index f1b3dc23..3b313387 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_disabled_link.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_disabled_link.js
@@ -15,7 +15,7 @@
 
 import '../../settings_shared.css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_item.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_item.js
index d7840b0..64b6d11c 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_item.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_task_continuation_item.js
@@ -22,7 +22,7 @@
 import 'chrome://resources/cr_elements/cr_toggle/cr_toggle.js';
 import '../../settings_shared.css.js';
 
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {SyncBrowserProxyImpl} from '../../people_page/sync_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js
index ad382159..50ecd82 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_disabled_link.js
@@ -14,7 +14,7 @@
 
 import '../../settings_shared.css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.js b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.js
index 54f22a54..2acc0d1b 100644
--- a/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.js
+++ b/chrome/browser/resources/settings/chromeos/multidevice_page/multidevice_wifi_sync_item.js
@@ -21,7 +21,7 @@
 import '../../settings_shared.css.js';
 
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {SyncBrowserProxyImpl} from '../../people_page/sync_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/nearby_share_page/BUILD.gn
index 9c696e1..67265a9 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/BUILD.gn
@@ -27,11 +27,11 @@
 
 js_library("nearby_share_confirm_page") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//chrome/browser/resources/nearby_share/shared:nearby_device",
     "//chrome/browser/resources/nearby_share/shared:nearby_page_template",
     "//chrome/browser/resources/nearby_share/shared:nearby_preview",
     "//chrome/browser/resources/nearby_share/shared:nearby_progress",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -49,9 +49,9 @@
 js_library("nearby_share_data_usage_dialog") {
   deps = [
     ":types",
+    "//ash/webui/common/resources:i18n_behavior",
     "//chrome/browser/resources/nearby_share/shared:nearby_share_settings",
     "//chrome/browser/resources/nearby_share/shared:nearby_share_settings_behavior",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js",
@@ -62,8 +62,8 @@
 
 js_library("nearby_share_device_name_dialog") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//chrome/browser/resources/nearby_share/shared:nearby_share_settings_behavior",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js",
@@ -74,8 +74,8 @@
 
 js_library("nearby_share_high_visibility_page") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//chrome/browser/resources/nearby_share/shared:nearby_page_template",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list =
       [ "//ui/webui/resources/cr_elements/cr_lottie/cr_lottie_externs.js" ]
@@ -86,11 +86,11 @@
     ":nearby_share_confirm_page",
     ":nearby_share_high_visibility_page",
     ":nearby_share_receive_manager",
+    "//ash/webui/common/resources:i18n_behavior",
     "//chrome/browser/resources/nearby_share/shared:nearby_onboarding_one_page",
     "//chrome/browser/resources/nearby_share/shared:nearby_onboarding_page",
     "//chrome/browser/resources/nearby_share/shared:nearby_share_settings_behavior",
     "//chrome/browser/resources/nearby_share/shared:nearby_visibility_page",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:load_time_data.m",
   ]
@@ -105,9 +105,9 @@
   deps = [
     ":nearby_share_confirm_page",
     ":nearby_share_high_visibility_page",
+    "//ash/webui/common/resources:i18n_behavior",
     "//chrome/browser/resources/nearby_share/shared:nearby_share_settings_behavior",
     "//chrome/browser/ui/webui/nearby_share:mojom_js_library_for_compile",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js",
@@ -129,11 +129,11 @@
     "..:prefs_behavior",
     "..:route_observer_behavior",
     "../..:router",
+    "//ash/webui/common/resources:i18n_behavior",
     "//chrome/browser/resources/nearby_share/shared:nearby_onboarding_one_page",
     "//chrome/browser/resources/nearby_share/shared:nearby_onboarding_page",
     "//chrome/browser/resources/nearby_share/shared:nearby_share_settings_behavior",
     "//chrome/browser/resources/nearby_share/shared:nearby_visibility_page",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:cr.m",
     "//ui/webui/resources/js:load_time_data.m",
   ]
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_confirm_page.js b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_confirm_page.js
index fafa9dc..54a0f715e 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_confirm_page.js
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_confirm_page.js
@@ -14,7 +14,7 @@
 import '../../shared/nearby_preview.js';
 import '../../shared/nearby_progress.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.js b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.js
index dfe816b..f9ddd82 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_data_usage_dialog.js
@@ -13,7 +13,7 @@
 import 'chrome://resources/cr_elements/cr_radio_button/cr_radio_button.js';
 import 'chrome://resources/cr_elements/cr_radio_group/cr_radio_group.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getNearbyShareSettings} from '../../shared/nearby_share_settings.js';
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_device_name_dialog.js b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_device_name_dialog.js
index b7cd9ed..785d3e42 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_device_name_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_device_name_dialog.js
@@ -12,7 +12,7 @@
 import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
 import 'chrome://resources/cr_elements/cr_input/cr_input.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {getNearbyShareSettings} from '../../shared/nearby_share_settings.js';
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_high_visibility_page.js b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_high_visibility_page.js
index ba4edf5..fe64ff6 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_high_visibility_page.js
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_high_visibility_page.js
@@ -14,7 +14,7 @@
 import '../../shared/nearby_page_template.js';
 import '../../shared/nearby_shared_icons.html.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
diff --git a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.js b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.js
index cac07bb..72e1191 100644
--- a/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/nearby_share_page/nearby_share_subpage.js
@@ -19,7 +19,7 @@
 import './nearby_share_data_usage_dialog.js';
 import './nearby_share_receive_dialog.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {flush, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn
index 8ce4e94d..90c8c80 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/BUILD.gn
@@ -43,11 +43,11 @@
 
 js_library("change_dictation_locale_dialog") {
   deps = [
+    "//ash/webui/common/resources:cr_scrollable_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//chrome/browser/resources/settings/chromeos:prefs_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:cr_scrollable_behavior",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
   externs_list = [
@@ -60,14 +60,14 @@
 js_library("manage_a11y_page") {
   deps = [
     ":manage_a11y_page_browser_proxy",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//chrome/browser/resources/settings:router",
     "//chrome/browser/resources/settings/chromeos:deep_linking_behavior",
     "//chrome/browser/resources/settings/chromeos:os_route",
     "//chrome/browser/resources/settings/chromeos:route_observer_behavior",
     "//chrome/browser/resources/settings/chromeos:route_origin_behavior",
     "//chrome/browser/resources/settings/chromeos/device_page:device_page_browser_proxy",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
 }
@@ -80,14 +80,14 @@
 js_library("text_to_speech_page") {
   deps = [
     ":text_to_speech_page_browser_proxy",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//chrome/browser/resources/settings:router",
     "//chrome/browser/resources/settings/chromeos:deep_linking_behavior",
     "//chrome/browser/resources/settings/chromeos:os_route",
     "//chrome/browser/resources/settings/chromeos:route_observer_behavior",
     "//chrome/browser/resources/settings/chromeos:route_origin_behavior",
     "//chrome/browser/resources/settings/chromeos/device_page:device_page_browser_proxy",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
 }
 
@@ -98,28 +98,28 @@
 
 js_library("display_and_magnification_page") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//chrome/browser/resources/settings:router",
     "//chrome/browser/resources/settings/chromeos:deep_linking_behavior",
     "//chrome/browser/resources/settings/chromeos:os_route",
     "//chrome/browser/resources/settings/chromeos:route_observer_behavior",
     "//chrome/browser/resources/settings/chromeos:route_origin_behavior",
     "//chrome/browser/resources/settings/chromeos/device_page:device_page_browser_proxy",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
 }
 
 js_library("keyboard_and_text_input_page") {
   deps = [
     ":keyboard_and_text_input_page_browser_proxy",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//chrome/browser/resources/settings:router",
     "//chrome/browser/resources/settings/chromeos:deep_linking_behavior",
     "//chrome/browser/resources/settings/chromeos:os_route",
     "//chrome/browser/resources/settings/chromeos:route_observer_behavior",
     "//chrome/browser/resources/settings/chromeos:route_origin_behavior",
     "//chrome/browser/resources/settings/chromeos/device_page:device_page_browser_proxy",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
 }
 
@@ -131,14 +131,14 @@
 js_library("cursor_and_touchpad_page") {
   deps = [
     ":cursor_and_touchpad_page_browser_proxy",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//chrome/browser/resources/settings:router",
     "//chrome/browser/resources/settings/chromeos:deep_linking_behavior",
     "//chrome/browser/resources/settings/chromeos:os_route",
     "//chrome/browser/resources/settings/chromeos:route_observer_behavior",
     "//chrome/browser/resources/settings/chromeos:route_origin_behavior",
     "//chrome/browser/resources/settings/chromeos/device_page:device_page_browser_proxy",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
 }
 
@@ -150,14 +150,14 @@
 js_library("audio_and_captions_page") {
   deps = [
     ":audio_and_captions_page_browser_proxy",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//chrome/browser/resources/settings:router",
     "//chrome/browser/resources/settings/chromeos:deep_linking_behavior",
     "//chrome/browser/resources/settings/chromeos:os_route",
     "//chrome/browser/resources/settings/chromeos:route_observer_behavior",
     "//chrome/browser/resources/settings/chromeos:route_origin_behavior",
     "//chrome/browser/resources/settings/chromeos/device_page:device_page_browser_proxy",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
 }
 
@@ -169,12 +169,12 @@
 js_library("os_a11y_page") {
   deps = [
     ":os_a11y_page_browser_proxy",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//chrome/browser/resources/settings:router",
     "//chrome/browser/resources/settings/chromeos:deep_linking_behavior",
     "//chrome/browser/resources/settings/chromeos:os_route",
     "//chrome/browser/resources/settings/chromeos:route_observer_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
   externs_list = [ "../settings_controls_types.js" ]
@@ -187,10 +187,10 @@
 js_library("switch_access_action_assignment_dialog") {
   deps = [
     ":switch_access_constants",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//chrome/browser/resources/settings/chromeos:prefs_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
   externs_list = [
@@ -202,9 +202,9 @@
 js_library("switch_access_action_assignment_pane") {
   deps = [
     ":switch_access_constants",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
   externs_list = [
@@ -222,10 +222,10 @@
 js_library("switch_access_setup_guide_dialog") {
   deps = [
     ":switch_access_constants",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//chrome/browser/resources/settings/chromeos:prefs_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
   externs_list = [
@@ -237,8 +237,8 @@
 
 js_library("switch_access_setup_guide_warning_dialog") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js",
@@ -250,13 +250,13 @@
   deps = [
     ":switch_access_constants",
     ":switch_access_subpage_browser_proxy",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//chrome/browser/resources/settings:router",
     "//chrome/browser/resources/settings/chromeos:deep_linking_behavior",
     "//chrome/browser/resources/settings/chromeos:os_route",
     "//chrome/browser/resources/settings/chromeos:prefs_behavior",
     "//chrome/browser/resources/settings/chromeos:route_observer_behavior",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
   externs_list =
@@ -271,14 +271,14 @@
 js_library("tts_subpage") {
   deps = [
     ":tts_subpage_browser_proxy",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//chrome/browser/resources/settings:router",
     "//chrome/browser/resources/settings/chromeos:deep_linking_behavior",
     "//chrome/browser/resources/settings/chromeos:os_route",
     "//chrome/browser/resources/settings/chromeos:route_observer_behavior",
     "//chrome/browser/resources/settings/chromeos/os_languages_page:languages_browser_proxy",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js",
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/audio_and_captions_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/audio_and_captions_page.js
index 97a341c..fc534e2 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/audio_and_captions_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/audio_and_captions_page.js
@@ -17,9 +17,9 @@
 import '../../settings_shared.css.js';
 import 'chrome://resources/cr_components/localized_link/localized_link.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/change_dictation_locale_dialog.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/change_dictation_locale_dialog.js
index fec1eac..fb708cc 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/change_dictation_locale_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/change_dictation_locale_dialog.js
@@ -9,7 +9,7 @@
 
 import 'chrome://resources/cr_elements/cr_button/cr_button.js';
 import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
-import 'chrome://resources/cr_elements/cr_scrollable_behavior.js';
+import 'chrome://resources/ash/common/cr_scrollable_behavior.js';
 import 'chrome://resources/cr_elements/cr_search_field/cr_search_field.js';
 import 'chrome://resources/cr_elements/cr_shared_style.css.js';
 import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
@@ -17,7 +17,7 @@
 import 'chrome://resources/polymer/v3_0/paper-ripple/paper-ripple.js';
 import '../../settings_shared.css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/cursor_and_touchpad_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/cursor_and_touchpad_page.js
index 4d3ea2d..b758743 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/cursor_and_touchpad_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/cursor_and_touchpad_page.js
@@ -17,9 +17,9 @@
 import '../../settings_shared.css.js';
 import 'chrome://resources/cr_components/localized_link/localized_link.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/display_and_magnification_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/display_and_magnification_page.js
index a395909..9a3f08d 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/display_and_magnification_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/display_and_magnification_page.js
@@ -17,9 +17,9 @@
 import '../../settings_shared.css.js';
 import 'chrome://resources/cr_components/localized_link/localized_link.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/keyboard_and_text_input_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/keyboard_and_text_input_page.js
index 35ba4b40..32c2556 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/keyboard_and_text_input_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/keyboard_and_text_input_page.js
@@ -17,9 +17,9 @@
 import '../../settings_shared.css.js';
 import 'chrome://resources/cr_components/localized_link/localized_link.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
index cfa1d7b..012cb81 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/manage_a11y_page.js
@@ -17,9 +17,9 @@
 import '../../settings_shared.css.js';
 import 'chrome://resources/cr_components/localized_link/localized_link.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.js
index 027c956..055d0a3 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/os_a11y_page.js
@@ -23,7 +23,7 @@
 import './tts_subpage.js';
 
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_dialog.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_dialog.js
index af8baed..35681ff8 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_dialog.js
@@ -13,7 +13,7 @@
 import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
 import 'chrome://resources/cr_elements/cr_shared_style.css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {SwitchAccessCommand} from './switch_access_constants.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_pane.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_pane.js
index a818098..bc258f4 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_pane.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_action_assignment_pane.js
@@ -14,8 +14,8 @@
 import 'chrome://resources/cr_elements/cr_shared_style.css.js';
 import '../os_icons.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {actionToPref, AssignmentContext, SwitchAccessCommand, SwitchAccessDeviceType} from './switch_access_constants.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_setup_guide_dialog.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_setup_guide_dialog.js
index be13384..43de5a4 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_setup_guide_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_setup_guide_dialog.js
@@ -13,7 +13,7 @@
 import '../../controls/settings_slider.js';
 import '../os_icons.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Router} from '../../router.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.js
index 72a03b4..38983af6 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/switch_access_subpage.js
@@ -15,9 +15,9 @@
 import './switch_access_setup_guide_dialog.js';
 import './switch_access_setup_guide_warning_dialog.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/text_to_speech_page.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/text_to_speech_page.js
index 570d1a03..2fee5753b 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/text_to_speech_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/text_to_speech_page.js
@@ -12,8 +12,8 @@
 import '../../controls/settings_toggle_button.js';
 import '../../settings_shared.css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_a11y_page/tts_subpage.js b/chrome/browser/resources/settings/chromeos/os_a11y_page/tts_subpage.js
index 00d546fa..aa61cbd 100644
--- a/chrome/browser/resources/settings/chromeos/os_a11y_page/tts_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/os_a11y_page/tts_subpage.js
@@ -15,8 +15,8 @@
 import '../../controls/settings_slider.js';
 import '../../settings_shared.css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_apps_page/BUILD.gn
index b015517..750def5 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/BUILD.gn
@@ -29,8 +29,8 @@
     "..:route_observer_behavior",
     "../..:router",
     "//ash/webui/common/resources:focus_without_ink_js",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
   ]
 }
@@ -45,8 +45,8 @@
     "../../:router",
     "./app_management_page:store_client",
     "./app_notifications_page:mojo_interface_provider",
+    "//ash/webui/common/resources:i18n_behavior",
     "//chrome/browser/ui/webui/settings/ash/os_apps_page/mojom:mojom_js_library_for_compile",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:cr.m",
   ]
   externs_list = [
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.js b/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.js
index 9d55ceb..0c28d457 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/android_apps_subpage.js
@@ -13,7 +13,7 @@
 import '../../settings_shared.css.js';
 
 import {focusWithoutInk} from 'chrome://resources/ash/common/focus_without_ink_js.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn
index 48747b7..14729d63 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/BUILD.gn
@@ -77,7 +77,7 @@
     ":actions",
     ":store_client",
     ":util",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
   externs_list = [ "./types.js" ]
@@ -229,7 +229,7 @@
 js_library("supported_links_overlapping_apps_dialog") {
   deps = [
     ":store_client",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ui/webui/resources/js:assert",
   ]
   externs_list = [
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/app_details_item.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/app_details_item.js
index eb244bb..37c0d202 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/app_details_item.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/app_details_item.js
@@ -6,7 +6,7 @@
 import 'chrome://resources/cr_elements/policy/cr_tooltip_icon.js';
 
 import {AppType, InstallSource} from 'chrome://resources/cr_components/app_management/constants.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/BUILD.gn
index c72cb0b..a004f0d 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/BUILD.gn
@@ -26,8 +26,8 @@
     "../:util",
     "../../..:os_route",
     "../../../..:router",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:load_time_data.m",
   ]
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_detail_view.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_detail_view.js
index 7b8205b8..cacb3abe 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_detail_view.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/plugin_vm_page/plugin_vm_detail_view.js
@@ -12,7 +12,7 @@
 import {getSelectedApp} from 'chrome://resources/cr_components/app_management/util.js';
 import {assertNotReached} from 'chrome://resources/js/assert.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Router} from '../../../../router.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_dialog.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_dialog.js
index 33cb2437..f6caef7 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_dialog.js
@@ -5,7 +5,7 @@
 import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
 import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_item.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_item.js
index 009cc01e..cddc496 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_item.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_item.js
@@ -11,7 +11,7 @@
 import {focusWithoutInk} from 'chrome://resources/ash/common/focus_without_ink_js.js';
 import {AppManagementUserAction, AppType, WindowMode} from 'chrome://resources/cr_components/app_management/constants.js';
 import {recordAppManagementUserAction} from 'chrome://resources/cr_components/app_management/util.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_overlapping_apps_dialog.js b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_overlapping_apps_dialog.js
index 1d9b964..17a4a8f 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_overlapping_apps_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/app_management_page/supported_links_overlapping_apps_dialog.js
@@ -5,7 +5,7 @@
 import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
 
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {AppManagementStoreClient, AppManagementStoreClientInterface} from './store_client.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.js b/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.js
index 78ccf7c..628150a 100644
--- a/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_apps_page/os_apps_page.js
@@ -28,7 +28,7 @@
 import {AppManagementEntryPoint, AppManagementEntryPointsHistogramName} from 'chrome://resources/cr_components/app_management/constants.js';
 import {getAppIcon, getSelectedApp} from 'chrome://resources/cr_components/app_management/util.js';
 import {assert, assertNotReached} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {loadTimeData} from '../../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/BUILD.gn
index 7226ab7..4d515a9 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/BUILD.gn
@@ -33,10 +33,10 @@
     ":os_bluetooth_devices_subpage",
     ":os_bluetooth_pairing_dialog",
     ":os_bluetooth_summary",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/bluetooth:cros_bluetooth_config",
     "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -49,12 +49,12 @@
     "..:os_route",
     "..:route_observer_behavior",
     "../..:router",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//ash/webui/common/resources/bluetooth:bluetooth_metrics_utils",
     "//ash/webui/common/resources/bluetooth:cros_bluetooth_config",
     "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
   externs_list = [ "//ui/webui/resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer_externs.js" ]
 }
@@ -70,21 +70,21 @@
     "..:route_observer_behavior",
     "..:route_origin_behavior",
     "../..:router",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/bluetooth:bluetooth_utils",
     "//ash/webui/common/resources/bluetooth:cros_bluetooth_config",
     "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
 js_library("os_paired_bluetooth_list") {
   deps = [
     ":os_paired_bluetooth_list_item",
+    "//ash/webui/common/resources:cr_scrollable_behavior",
     "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:cr_scrollable_behavior",
   ]
 }
 
@@ -92,21 +92,21 @@
   deps = [
     "..:os_route",
     "../..:router",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/bluetooth:bluetooth_device_battery_info",
     "//ash/webui/common/resources/bluetooth:bluetooth_icon",
     "//ash/webui/common/resources/bluetooth:bluetooth_utils",
     "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
 js_library("os_bluetooth_true_wireless_images") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/bluetooth:bluetooth_utils",
     "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -119,12 +119,12 @@
     "..:route_observer_behavior",
     "..:route_origin_behavior",
     "../..:router",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/bluetooth:bluetooth_device_battery_info",
     "//ash/webui/common/resources/bluetooth:bluetooth_metrics_utils",
     "//ash/webui/common/resources/bluetooth:bluetooth_utils",
     "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -138,22 +138,22 @@
     "..:route_observer_behavior",
     "..:route_origin_behavior",
     "../..:router",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/bluetooth:bluetooth_device_battery_info",
     "//ash/webui/common/resources/bluetooth:bluetooth_metrics_utils",
     "//ash/webui/common/resources/bluetooth:bluetooth_utils",
     "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
 js_library("os_bluetooth_change_device_name_dialog") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/bluetooth:bluetooth_utils",
     "//ash/webui/common/resources/bluetooth:cros_bluetooth_config",
     "//chromeos/ash/services/bluetooth_config/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -196,9 +196,9 @@
   deps = [
     ":os_saved_devices_list_item",
     ":settings_fast_pair_constants",
+    "//ash/webui/common/resources:cr_scrollable_behavior",
     "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:cr_scrollable_behavior",
   ]
 }
 
@@ -206,9 +206,9 @@
   deps = [
     ":os_remove_saved_device_dialog",
     ":settings_fast_pair_constants",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/bluetooth:bluetooth_utils",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_action_menu/cr_action_menu_externs.js",
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_change_device_name_dialog.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_change_device_name_dialog.js
index 30618eae..6b527fa 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_change_device_name_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_change_device_name_dialog.js
@@ -12,7 +12,7 @@
 
 import {getDeviceName} from 'chrome://resources/ash/common/bluetooth/bluetooth_utils.js';
 import {getBluetoothConfig} from 'chrome://resources/ash/common/bluetooth/cros_bluetooth_config.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {PairedBluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js
index fae7d3c..1890fb30 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_device_detail_subpage.js
@@ -19,8 +19,8 @@
 import {BatteryType} from 'chrome://resources/ash/common/bluetooth/bluetooth_types.js';
 import {getBatteryPercentage, getDeviceName, hasAnyDetailedBatteryInfo, hasDefaultImage, hasTrueWirelessImages} from 'chrome://resources/ash/common/bluetooth/bluetooth_utils.js';
 import {getBluetoothConfig} from 'chrome://resources/ash/common/bluetooth/cros_bluetooth_config.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {assertNotReached} from 'chrome://resources/js/assert.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {AudioOutputCapability, BluetoothSystemProperties, DeviceConnectionState, DeviceType, PairedBluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_devices_subpage.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_devices_subpage.js
index 7db03172..9b924f89 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_devices_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_devices_subpage.js
@@ -14,9 +14,9 @@
 import {BluetoothUiSurface, recordBluetoothUiSurfaceMetrics} from 'chrome://resources/ash/common/bluetooth/bluetooth_metrics_utils.js';
 import {getBluetoothConfig} from 'chrome://resources/ash/common/bluetooth/cros_bluetooth_config.js';
 import {getInstance as getAnnouncerInstance} from 'chrome://resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {BluetoothSystemProperties, BluetoothSystemState, DeviceConnectionState, PairedBluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_forget_device_dialog.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_forget_device_dialog.js
index c9d74f8..db08ad7d 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_forget_device_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_forget_device_dialog.js
@@ -10,7 +10,7 @@
 import 'chrome://resources/cr_elements/cr_input/cr_input.js';
 
 import {getDeviceName} from 'chrome://resources/ash/common/bluetooth/bluetooth_utils.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {PairedBluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.js
index 6287ec29..a3fbaff 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_page.js
@@ -18,7 +18,7 @@
 import './os_bluetooth_pairing_dialog.js';
 
 import {getBluetoothConfig} from 'chrome://resources/ash/common/bluetooth/cros_bluetooth_config.js';
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {BluetoothSystemProperties, BluetoothSystemState, SystemPropertiesObserverInterface, SystemPropertiesObserverReceiver} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.js
index ae10bf2..82ca01a 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.js
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.js
@@ -12,9 +12,9 @@
 
 import {FastPairSavedDevicesUiEvent, recordSavedDevicesUiEventMetrics} from 'chrome://resources/ash/common/bluetooth/bluetooth_metrics_utils.js';
 import {assertNotReached} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route, Router} from '../../router.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_summary.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_summary.js
index 9f98491..bb6e829 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_summary.js
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_summary.js
@@ -15,7 +15,7 @@
 import {getDeviceName} from 'chrome://resources/ash/common/bluetooth/bluetooth_utils.js';
 import {getBluetoothConfig} from 'chrome://resources/ash/common/bluetooth/cros_bluetooth_config.js';
 import {getInstance as getAnnouncerInstance} from 'chrome://resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {BluetoothSystemProperties, BluetoothSystemState, DeviceConnectionState, PairedBluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_true_wireless_images.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_true_wireless_images.js
index cfcfa36..f331df95 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_true_wireless_images.js
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_true_wireless_images.js
@@ -14,7 +14,7 @@
 import {BatteryType} from 'chrome://resources/ash/common/bluetooth/bluetooth_types.js';
 import {getBatteryPercentage, hasAnyDetailedBatteryInfo, hasDefaultImage, hasTrueWirelessImages} from 'chrome://resources/ash/common/bluetooth/bluetooth_utils.js';
 import {assertNotReached} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {BluetoothDeviceProperties, DeviceConnectionState} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list.js
index 37c3b9e..2ee011b5 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list.js
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list.js
@@ -11,7 +11,7 @@
 import './os_paired_bluetooth_list_item.js';
 import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
 
-import {CrScrollableBehavior, CrScrollableBehaviorInterface} from 'chrome://resources/cr_elements/cr_scrollable_behavior.js';
+import {CrScrollableBehavior, CrScrollableBehaviorInterface} from 'chrome://resources/ash/common/cr_scrollable_behavior.js';
 import {PairedBluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.js
index 88f021a..d0b46b7 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.js
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_paired_bluetooth_list_item.js
@@ -18,7 +18,7 @@
 import {BatteryType} from 'chrome://resources/ash/common/bluetooth/bluetooth_types.js';
 import {getBatteryPercentage, getDeviceName, hasAnyDetailedBatteryInfo} from 'chrome://resources/ash/common/bluetooth/bluetooth_utils.js';
 import {FocusRowBehavior, FocusRowBehaviorInterface} from 'chrome://resources/ash/common/focus_row_behavior.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert, assertNotReached} from 'chrome://resources/js/assert.js';
 import {DeviceConnectionState, DeviceType, PairedBluetoothDeviceProperties} from 'chrome://resources/mojo/chromeos/ash/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom-webui.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_remove_saved_device_dialog.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_remove_saved_device_dialog.js
index b19774ee..87ec463 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_remove_saved_device_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_remove_saved_device_dialog.js
@@ -12,8 +12,8 @@
 import {FastPairSavedDevicesUiEvent, recordSavedDevicesUiEventMetrics} from 'chrome://resources/ash/common/bluetooth/bluetooth_metrics_utils.js';
 import {getDeviceName} from 'chrome://resources/ash/common/bluetooth/bluetooth_utils.js';
 import {addWebUIListener, removeWebUIListener, WebUIListener} from 'chrome://resources/js/cr.m.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {loadTimeData} from '../../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list.js
index 9742fc3..1eaa774 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list.js
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list.js
@@ -11,9 +11,9 @@
 import './os_saved_devices_list_item.js';
 import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
 
-import {CrScrollableBehavior, CrScrollableBehaviorInterface} from 'chrome://resources/cr_elements/cr_scrollable_behavior.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {CrScrollableBehavior, CrScrollableBehaviorInterface} from 'chrome://resources/ash/common/cr_scrollable_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {OsBluetoothDevicesSubpageBrowserProxy, OsBluetoothDevicesSubpageBrowserProxyImpl} from './os_bluetooth_devices_subpage_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list_item.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list_item.js
index dbc8167a..6ae1897 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list_item.js
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list_item.js
@@ -15,8 +15,8 @@
 
 import {FastPairSavedDevicesUiEvent, recordSavedDevicesUiEventMetrics} from 'chrome://resources/ash/common/bluetooth/bluetooth_metrics_utils.js';
 import {FocusRowBehavior, FocusRowBehaviorInterface} from 'chrome://resources/ash/common/focus_row_behavior.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {addWebUIListener, removeWebUIListener, WebUIListener} from 'chrome://resources/js/cr.m.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn
index 893d77c1..0d3ed8eb 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/BUILD.gn
@@ -44,8 +44,8 @@
     ":languages_browser_proxy",
     ":languages_types",
     "..:prefs_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:cr.m",
     "//ui/webui/resources/js:load_time_data.m",
@@ -93,9 +93,9 @@
   deps = [
     ":cr_checkbox_with_policy",
     "..:find_shortcut_behavior",
+    "//ash/webui/common/resources:cr_scrollable_behavior",
     "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:cr_scrollable_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js",
@@ -117,8 +117,8 @@
 js_library("change_device_language_dialog") {
   deps = [
     ":languages",
+    "//ash/webui/common/resources:cr_scrollable_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:cr_scrollable_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_search_field/cr_search_field_externs.js",
@@ -155,7 +155,7 @@
 js_library("input_method_options_page") {
   deps = [
     ":input_method_util",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
   ]
 }
 
@@ -172,7 +172,7 @@
     "..:route_observer_behavior",
     "../..:router",
     "//ash/webui/common/resources:focus_without_ink_js",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:load_time_data.m",
   ]
@@ -243,7 +243,7 @@
     "..:os_route",
     "../..:router",
     "//ash/webui/common/resources:focus_without_ink_js",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:cr.m",
     "//ui/webui/resources/js:load_time_data.m",
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/add_items_dialog.js b/chrome/browser/resources/settings/chromeos/os_languages_page/add_items_dialog.js
index 193eef61..22f0f7c 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/add_items_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/add_items_dialog.js
@@ -16,7 +16,7 @@
 import './shared_style.css.js';
 import '../../settings_shared.css.js';
 
-import {CrScrollableBehavior, CrScrollableBehaviorInterface} from 'chrome://resources/cr_elements/cr_scrollable_behavior.js';
+import {CrScrollableBehavior, CrScrollableBehaviorInterface} from 'chrome://resources/ash/common/cr_scrollable_behavior.js';
 import {FindShortcutBehavior, FindShortcutBehaviorInterface} from '../find_shortcut_behavior.js';
 import {afterNextRender, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/change_device_language_dialog.js b/chrome/browser/resources/settings/chromeos/os_languages_page/change_device_language_dialog.js
index 0cff5ad..30da5f2 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/change_device_language_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/change_device_language_dialog.js
@@ -17,9 +17,9 @@
 import './languages.js';
 import '../../settings_shared.css.js';
 
-import {CrScrollableBehavior, CrScrollableBehaviorInterface} from 'chrome://resources/cr_elements/cr_scrollable_behavior.js';
+import {CrScrollableBehavior, CrScrollableBehaviorInterface} from 'chrome://resources/ash/common/cr_scrollable_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {LifetimeBrowserProxyImpl} from '../../lifetime_browser_proxy.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_options_page.js b/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_options_page.js
index 9ecfb77a..c1ce2a17 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_options_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/input_method_options_page.js
@@ -13,7 +13,7 @@
 import './os_japanese_clear_ime_data_dialog.js';
 import './os_japanese_manage_user_dictionary_page.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert, assertNotReached} from 'chrome://resources/js/assert.js';
 import {afterNextRender, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/input_page.js b/chrome/browser/resources/settings/chromeos/os_languages_page/input_page.js
index 5a0732f9..c9a49fc6 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/input_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/input_page.js
@@ -21,7 +21,7 @@
 import '../../settings_page/settings_animated_pages.js';
 
 import {focusWithoutInk} from 'chrome://resources/ash/common/focus_without_ink_js.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_edit_dictionary_page.js b/chrome/browser/resources/settings/chromeos/os_languages_page/os_edit_dictionary_page.js
index 105ea6d8..9c2656ec 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/os_edit_dictionary_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_edit_dictionary_page.js
@@ -15,7 +15,7 @@
 import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
 import '../../settings_shared.css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route} from '../../router.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_japanese_manage_user_dictionary_page.js b/chrome/browser/resources/settings/chromeos/os_languages_page/os_japanese_manage_user_dictionary_page.js
index 8ce55ed..9a52c29 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/os_japanese_manage_user_dictionary_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_japanese_manage_user_dictionary_page.js
@@ -10,7 +10,7 @@
 
 import '../../settings_shared.css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Route} from '../../router.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page_v2.js b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page_v2.js
index 2b60d86..3c4c8d2 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page_v2.js
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_page_v2.js
@@ -23,7 +23,7 @@
 import '../../settings_shared.css.js';
 
 import {focusWithoutInk} from 'chrome://resources/ash/common/focus_without_ink_js.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.js b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.js
index 5f10371..5dd1a865 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.js
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/os_languages_section.js
@@ -21,7 +21,7 @@
 import '../../settings_shared.css.js';
 import '../../settings_vars.css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {loadTimeData} from '../../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_languages_page/smart_inputs_page.js b/chrome/browser/resources/settings/chromeos/os_languages_page/smart_inputs_page.js
index 9866d2d..432f04ac8 100644
--- a/chrome/browser/resources/settings/chromeos/os_languages_page/smart_inputs_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_languages_page/smart_inputs_page.js
@@ -11,7 +11,7 @@
 import '../../controls/settings_toggle_button.js';
 import '../../settings_shared.css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {loadTimeData} from '../../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn
index 8927136e..944d364 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/BUILD.gn
@@ -40,9 +40,9 @@
     "..:os_route",
     "..:route_observer_behavior",
     "../..:router",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:cr.m",
     "//ui/webui/resources/js:icon",
   ]
@@ -68,11 +68,11 @@
     "..:route_observer_behavior",
     "../..:router",
     "//ash/webui/common/resources:focus_without_ink_js",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/iron-resizable-behavior:iron-resizable-behavior",
     "//third_party/polymer/v3_0/components-chromium/paper-ripple:paper-ripple",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:cr.m",
   ]
@@ -89,11 +89,11 @@
     "../..:router",
     "../multidevice_page:multidevice_smartlock_item",
     "//ash/webui/common/resources:focus_without_ink_js",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//ash/webui/common/resources/quick_unlock:lock_screen_constants",
     "//chromeos/ash/services/auth_factor_config/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:load_time_data.m",
   ]
@@ -111,10 +111,10 @@
 js_library("lock_state_behavior") {
   deps = [
     "../..:router",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//chromeos/ash/services/auth_factor_config/public/mojom:mojom_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:load_time_data.m",
   ]
   externs_list = [ "$externs_path/quick_unlock_private.js" ]
@@ -133,11 +133,11 @@
     "..:route_observer_behavior",
     "../..:router",
     "//ash/webui/common/resources:focus_without_ink_js",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//ash/webui/common/resources/cr_picture:png",
     "//ash/webui/common/resources/quick_unlock:lock_screen_constants",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:icon",
     "//ui/webui/resources/js:load_time_data.m",
@@ -161,8 +161,8 @@
     "..:metrics_recorder",
     "..:os_route",
     "../../:router",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:load_time_data.m",
   ]
@@ -174,9 +174,9 @@
   deps = [
     ":fingerprint_browser_proxy",
     "..:metrics_recorder",
+    "//ash/webui/common/resources:i18n_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_fingerprint/cr_fingerprint_progress_arc_externs.js",
@@ -188,9 +188,9 @@
   deps = [
     ":lock_screen_password_prompt_dialog",
     "../..:router",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/quick_unlock:setup_pin_keyboard",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
 }
 
@@ -199,9 +199,9 @@
     "..:os_route",
     "..:route_observer_behavior",
     "../..:router",
+    "//ash/webui/common/resources:cr_scrollable_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:cr_scrollable_behavior",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list = [
     "$externs_path/settings_private.js",
@@ -212,8 +212,8 @@
 
 js_library("users_add_user_dialog") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
     "//ui/webui/resources/js:assert",
   ]
   externs_list = [
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.js b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.js
index 69462e7e..53c5a53 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/account_manager.js
@@ -17,9 +17,9 @@
 import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
 import '../../settings_shared.css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {getImage} from 'chrome://resources/js/icon.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {loadTimeData} from '../../i18n_setup.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.js b/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.js
index 4181eb5..19b04b7 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/fingerprint_list.js
@@ -15,8 +15,8 @@
 import '../../settings_shared.css.js';
 
 import {focusWithoutInk} from 'chrome://resources/ash/common/focus_without_ink_js.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.js b/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.js
index 499300d..861121a8 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/lock_screen.js
@@ -29,8 +29,8 @@
 
 import {focusWithoutInk} from 'chrome://resources/ash/common/focus_without_ink_js.js';
 import {LockScreenProgress, recordLockScreenProgress} from 'chrome://resources/ash/common/quick_unlock/lock_screen_constants.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {assert, assertNotReached} from 'chrome://resources/js/assert.js';
 import {AuthFactor, FactorObserverInterface, FactorObserverReceiver, ManagementType, RecoveryFactorEditor_ConfigureResult} from 'chrome://resources/mojo/chromeos/ash/services/auth_factor_config/public/mojom/auth_factor_config.mojom-webui.js';
 import {afterNextRender, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/lock_state_behavior.js b/chrome/browser/resources/settings/chromeos/os_people_page/lock_state_behavior.js
index aed6c33..0b89cfb3 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/lock_state_behavior.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/lock_state_behavior.js
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {AuthFactorConfig, AuthFactorConfigInterface, RecoveryFactorEditor, RecoveryFactorEditorInterface} from 'chrome://resources/mojo/chromeos/ash/services/auth_factor_config/public/mojom/auth_factor_config.mojom-webui.js';
 
 /**
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.js b/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.js
index 41c2d74..1d46ef6 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/os_people_page.js
@@ -29,8 +29,8 @@
 
 import {convertImageSequenceToPng} from 'chrome://resources/ash/common/cr_picture/png.js';
 import {focusWithoutInk} from 'chrome://resources/ash/common/focus_without_ink_js.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {sendWithPromise} from 'chrome://resources/js/cr.m.js';
 import {getImage} from 'chrome://resources/js/icon.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.js b/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.js
index ef1e3e4..e51a38c 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/os_sync_controls.js
@@ -9,9 +9,9 @@
 import '../../settings_shared.css.js';
 
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Setting} from '../../mojom-webui/setting.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/pin_autosubmit_dialog.js b/chrome/browser/resources/settings/chromeos/os_people_page/pin_autosubmit_dialog.js
index 592e85fd..c583f30 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/pin_autosubmit_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/pin_autosubmit_dialog.js
@@ -17,7 +17,7 @@
 import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 import '../../settings_shared.css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 // Maximum length supported by auto submit
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/setup_fingerprint_dialog.js b/chrome/browser/resources/settings/chromeos/os_people_page/setup_fingerprint_dialog.js
index 987cba8..47e2c490 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/setup_fingerprint_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/setup_fingerprint_dialog.js
@@ -9,8 +9,8 @@
 import '../../settings_shared.css.js';
 
 import {assertNotReached} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {recordSettingChange} from '../metrics_recorder.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/setup_pin_dialog.js b/chrome/browser/resources/settings/chromeos/os_people_page/setup_pin_dialog.js
index 54f84e9..70f871e 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/setup_pin_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/setup_pin_dialog.js
@@ -16,7 +16,7 @@
 import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js';
 import '../../settings_shared.css.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/user_list.js b/chrome/browser/resources/settings/chromeos/os_people_page/user_list.js
index 886cb84..803233a 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/user_list.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/user_list.js
@@ -21,8 +21,8 @@
 import '../../settings_vars.css.js';
 
 import {getInstance as getAnnouncerInstance} from 'chrome://resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer.js';
-import {CrScrollableBehavior, CrScrollableBehaviorInterface} from 'chrome://resources/cr_elements/cr_scrollable_behavior.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {CrScrollableBehavior, CrScrollableBehaviorInterface} from 'chrome://resources/ash/common/cr_scrollable_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {Router} from '../../router.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_people_page/users_add_user_dialog.js b/chrome/browser/resources/settings/chromeos/os_people_page/users_add_user_dialog.js
index 114e27e..6668d1d 100644
--- a/chrome/browser/resources/settings/chromeos/os_people_page/users_add_user_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_people_page/users_add_user_dialog.js
@@ -16,7 +16,7 @@
 
 import {getInstance as getAnnouncerInstance} from 'chrome://resources/cr_elements/cr_a11y_announcer/cr_a11y_announcer.js';
 import {assert} from 'chrome://resources/js/assert.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 /**
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn b/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn
index c399e3d..ccadb0d 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/BUILD.gn
@@ -73,7 +73,7 @@
 js_library("cups_edit_printer_dialog") {
   deps = [
     ":cups_printer_dialog_util",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
+    "//ash/webui/common/resources:i18n_behavior",
   ]
 }
 
@@ -108,9 +108,9 @@
     "..:os_route",
     "..:route_observer_behavior",
     "../..:router",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
     "//ash/webui/common/resources/network:network_listener_behavior",
     "//ash/webui/common/resources/network:onc_mojo",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
     "//ui/webui/resources/js:assert",
     "//ui/webui/resources/js:cr.m",
     "//ui/webui/resources/js:load_time_data.m",
@@ -146,7 +146,7 @@
     ":cups_printer_types",
     ":cups_printers_browser_proxy",
     "//ash/webui/common/resources:list_property_update_behavior",
-    "//ui/webui/resources/cr_elements:web_ui_listener_behavior",
+    "//ash/webui/common/resources:web_ui_listener_behavior",
   ]
 
   externs_list = [
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.js
index 53135cc..86541b4 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.js
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_edit_printer_dialog.js
@@ -20,7 +20,7 @@
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js';
 import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/ash/common/network/network_listener_behavior.js';
 import {OncMojo} from 'chrome://resources/ash/common/network/onc_mojo.js';
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {CrosNetworkConfigRemote, FilterType, NetworkStateProperties, NO_LIMIT} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/cros_network_config.mojom-webui.js';
 import {NetworkType} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.html b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.html
index acdab94e..c9ecdca4 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.html
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.html
@@ -61,7 +61,7 @@
     <cr-icon-button class="action-button" id="show-more-icon"
         iron-icon="cr:expand-more"
         on-click="onShowMoreTap_"
-        title=$i18n{showMorePrinters}>
+        title="$i18n{showMorePrinters}">
     </cr-icon-button>
   </div>
 </template>
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.js
index 2165fd31..aa0a081d 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.js
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_enterprise_printers.js
@@ -15,7 +15,7 @@
 import '../../settings_shared.css.js';
 
 import {ListPropertyUpdateBehavior, ListPropertyUpdateBehaviorInterface} from 'chrome://resources/ash/common/list_property_update_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {matchesSearchTerm, sortPrinters} from './cups_printer_dialog_util.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_nearby_printers.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_nearby_printers.js
index 69bf363..1540244a 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_nearby_printers.js
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_nearby_printers.js
@@ -11,7 +11,7 @@
 import '../../settings_shared.css.js';
 
 import {ListPropertyUpdateBehavior, ListPropertyUpdateBehaviorInterface} from 'chrome://resources/ash/common/list_property_update_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {recordSettingChange} from '../metrics_recorder.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.js
index bed7d1b..a538503 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.js
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_printers.js
@@ -30,7 +30,7 @@
 import {focusWithoutInk} from 'chrome://resources/ash/common/focus_without_ink_js.js';
 import {MojoInterfaceProvider, MojoInterfaceProviderImpl} from 'chrome://resources/ash/common/network/mojo_interface_provider.js';
 import {NetworkListenerBehavior, NetworkListenerBehaviorInterface} from 'chrome://resources/ash/common/network/network_listener_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {assert, assertNotReached} from 'chrome://resources/js/assert.js';
 import {addWebUIListener, removeWebUIListener, sendWithPromise, WebUIListener} from 'chrome://resources/js/cr.m.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.html b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.html
index bc4d59c..0c5317a 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.html
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.html
@@ -61,7 +61,7 @@
     <cr-icon-button class="action-button" id="show-more-icon"
         iron-icon="cr:expand-more"
         on-click="onShowMoreTap_"
-        title=$i18n{showMorePrinters}>
+        title="$i18n{showMorePrinters}">
     </cr-icon-button>
   </div>
 </template>
diff --git a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.js b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.js
index 7c80805..2dd6d02 100644
--- a/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.js
+++ b/chrome/browser/resources/settings/chromeos/os_printing_page/cups_saved_printers.js
@@ -15,7 +15,7 @@
 import '../../settings_shared.css.js';
 
 import {ListPropertyUpdateBehavior, ListPropertyUpdateBehaviorInterface} from 'chrome://resources/ash/common/list_property_update_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {recordSettingChange} from '../metrics_recorder.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_privacy_page/privacy_hub_page.js b/chrome/browser/resources/settings/chromeos/os_privacy_page/privacy_hub_page.js
index e0097ef..71f4b80a5 100644
--- a/chrome/browser/resources/settings/chromeos/os_privacy_page/privacy_hub_page.js
+++ b/chrome/browser/resources/settings/chromeos/os_privacy_page/privacy_hub_page.js
@@ -13,8 +13,8 @@
 import '../../controls/settings_toggle_button.js';
 import './metrics_consent_toggle_button.js';
 
-import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/cr_elements/i18n_behavior.js';
-import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/cr_elements/web_ui_listener_behavior.js';
+import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js';
+import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/ash/common/web_ui_listener_behavior.js';
 import {assert} from 'chrome://resources/js/assert.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.ts b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.ts
index 6eb071e..22543a4 100644
--- a/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.ts
+++ b/chrome/browser/resources/settings/chromeos/os_settings_ui/os_settings_ui.ts
@@ -22,7 +22,7 @@
 import '../../prefs/prefs.js';
 import '../../settings_vars.css.js';
 
-import {CrContainerShadowBehavior} from 'chrome://resources/cr_elements/cr_container_shadow_behavior.js';
+import {CrContainerShadowBehavior} from 'chrome://resources/ash/common/cr_container_shadow_behavior.js';
 import {CrDrawerElement} from 'chrome://resources/cr_elements/cr_drawer/cr_drawer.js';
 import {FindShortcutMixin, FindShortcutMixinInterface} from 'chrome://resources/cr_elements/find_shortcut_mixin.js';
 import {assert} from 'chrome://resources/js/assert_ts.js';
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.html b/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.html
index 07b82501..1f3fb51 100644
--- a/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.html
+++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.html
@@ -110,7 +110,8 @@
 <div id="container" role="treeitem">
   <button id="rowButton" class="row"
       title="[[bookmark.title]]"
-      data-bookmark="[[bookmark]]">
+      data-bookmark="[[bookmark]]"
+      on-click="onRowClicked_">
     <div id="bookmarkImage" class="bookmark-image"></div>
     <div class="text-container">
       <div class="content">[[bookmark.title]]</div>
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.ts b/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.ts
index cbc86a5..8effb1f 100644
--- a/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.ts
+++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmark_row.ts
@@ -73,6 +73,22 @@
       this.$.bookmarkImage.style.backgroundColor = 'red';
     }
   }
+
+  /**
+   * Dispatches a custom click event when the user clicks anywhere on the row.
+   */
+  private onRowClicked_(event: MouseEvent) {
+    event.preventDefault();
+    event.stopPropagation();
+    this.dispatchEvent(new CustomEvent('row-clicked', {
+      bubbles: true,
+      composed: true,
+      detail: {
+        bookmark: this.bookmark,
+        event: event,
+      },
+    }));
+  }
 }
 
 
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html
index a49bb70..e8dd296 100644
--- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html
+++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.html
@@ -36,11 +36,13 @@
   }
 </style>
 
-<template is="dom-repeat" items="[[topLevelBookmarks_]]"
+<template is="dom-repeat"
+    items="[[getShownBookmarks_(topLevelBookmarks_, activeFolder_)]]"
     id="powerBookmarksContainer">
   <power-bookmark-row id="bookmark-[[item.id]]" bookmark="[[item]]"
       description="[[getBookmarkDescription_(item, descriptions_.*)]]"
-      compact="[[compact_]]">
+      compact="[[compact_]]"
+      on-row-clicked="onRowClicked_">
     <div slot="extra-content-container">
       <template is="dom-if"
           if="[[isPriceTracked_(item, showPriceTracking_)]]" restamp>
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts
index 774cf44..d6872fce 100644
--- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts
+++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_list.ts
@@ -10,6 +10,7 @@
 import {listenOnce} from 'chrome://resources/js/util.js';
 import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
+import {ActionSource} from './bookmarks.mojom-webui.js';
 import {BookmarksApiProxy, BookmarksApiProxyImpl} from './bookmarks_api_proxy.js';
 import {BookmarkProductInfo} from './commerce/shopping_list.mojom-webui.js';
 import {ShoppingListApiProxy, ShoppingListApiProxyImpl} from './commerce/shopping_list_api_proxy.js';
@@ -42,6 +43,15 @@
         value: true,
       },
 
+      activeFolder_: {
+        type: Object,
+      },
+
+      depth_: {
+        type: Number,
+        value: 0,
+      },
+
       showPriceTracking_: {
         type: Boolean,
         value: false,
@@ -57,6 +67,8 @@
   private productInfos_ = new Map<string, BookmarkProductInfo>();
   private shoppingListenerIds_: number[] = [];
   private compact_: boolean;
+  private activeFolder_: chrome.bookmarks.BookmarkTreeNode|undefined;
+  private depth_: number;
   private descriptions_ = new Map<string, string>();
   private showPriceTracking_: boolean;
 
@@ -135,6 +147,42 @@
   }
 
   /**
+   * Returns a list of bookmarks and folders to display to the user.
+   */
+  private getShownBookmarks_(): chrome.bookmarks.BookmarkTreeNode[] {
+    if (this.activeFolder_) {
+      return this.activeFolder_.children!;
+    }
+    return this.topLevelBookmarks_;
+  }
+
+  /**
+   * Invoked when the user clicks a power bookmarks row. This will either
+   * display children in the case of a folder row, or open the URL in the case
+   * of a bookmark row.
+   */
+  private onRowClicked_(
+      event: CustomEvent<
+          {bookmark: chrome.bookmarks.BookmarkTreeNode, event: MouseEvent}>) {
+    event.preventDefault();
+    event.stopPropagation();
+    if (event.detail.bookmark.children) {
+      this.activeFolder_ = event.detail.bookmark;
+      this.depth_++;
+    } else {
+      this.bookmarksApi_.openBookmark(
+          event.detail.bookmark.id, this.depth_, {
+            middleButton: false,
+            altKey: event.detail.event.altKey,
+            ctrlKey: event.detail.event.ctrlKey,
+            metaKey: event.detail.event.metaKey,
+            shiftKey: event.detail.event.shiftKey,
+          },
+          ActionSource.kBookmark);
+    }
+  }
+
+  /**
    * Whether the given price-tracked bookmark should display as if discounted.
    */
   private showDiscountedPrice_(bookmark: chrome.bookmarks.BookmarkTreeNode):
diff --git a/chrome/browser/resources/webui_gallery/app.html b/chrome/browser/resources/webui_gallery/app.html
index 9800ac1..846de72 100644
--- a/chrome/browser/resources/webui_gallery/app.html
+++ b/chrome/browser/resources/webui_gallery/app.html
@@ -7,6 +7,7 @@
   #sidebar {
     border-inline-end: 1px solid black;
     box-sizing: border-box;
+    overflow: auto;
     width: 256px;
   }
 
diff --git a/chrome/browser/speech/speech_recognition_service_browsertest.cc b/chrome/browser/speech/speech_recognition_service_browsertest.cc
index bba88cb3..fd4fef2 100644
--- a/chrome/browser/speech/speech_recognition_service_browsertest.cc
+++ b/chrome/browser/speech/speech_recognition_service_browsertest.cc
@@ -5,11 +5,13 @@
 #include <algorithm>
 
 #include "base/files/file_util.h"
+#include "base/files/scoped_temp_dir.h"
 #include "base/notreached.h"
 #include "base/path_service.h"
 #include "base/sync_socket.h"
 #include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
+#include "base/threading/thread_restrictions.h"
 #include "base/timer/timer.h"
 #include "build/build_config.h"
 #include "chrome/browser/browser_process.h"
@@ -269,7 +271,8 @@
       speech_recognition_client_receiver_.BindNewPipeAndPassRemote(),
       media::mojom::SpeechRecognitionOptions::New(
           media::mojom::SpeechRecognitionMode::kCaption,
-          /*enable_formatting=*/true, "en-US", /* is_server_based=*/false,
+          /*enable_formatting=*/true, kUsEnglishLocale,
+          /*is_server_based=*/false,
           media::mojom::RecognizerClientType::kLiveCaption),
       base::BindOnce(
           [](bool* p_is_multichannel_supported, base::RunLoop* run_loop,
@@ -300,7 +303,7 @@
       speech_recognition_client_receiver_.BindNewPipeAndPassRemote(),
       media::mojom::SpeechRecognitionOptions::New(
           media::mojom::SpeechRecognitionMode::kIme,
-          /*enable_formatting=*/false, "en-US"),
+          /*enable_formatting=*/false, kUsEnglishLocale),
       base::BindOnce(
           [](bool* p_is_multichannel_supported, base::RunLoop* run_loop,
              bool is_multichannel_supported) {
@@ -507,4 +510,51 @@
   base::RunLoop().RunUntilIdle();
 }
 
+IN_PROC_BROWSER_TEST_F(SpeechRecognitionServiceTest, CompromisedRenderer) {
+  // Create temporary SODA files.
+  SetUpPrefs();
+  base::ScopedAllowBlockingForTesting allow_blocking;
+  base::FilePath config_dir =
+      GetSodaLanguagePacksDirectory()
+          .AppendASCII(kUsEnglishLocale)
+          .Append("1.1.1")
+          .Append(kSodaLanguagePackDirectoryRelativePath);
+  base::CreateDirectory(config_dir);
+  ASSERT_TRUE(base::PathExists(config_dir));
+  base::FilePath config_file_path = config_dir.Append("config_file");
+  ASSERT_EQ(base::WriteFile(config_file_path, nullptr, 0), 0);
+  ASSERT_TRUE(base::PathExists(config_file_path));
+  g_browser_process->local_state()->SetFilePath(prefs::kSodaEnUsConfigPath,
+                                                config_file_path);
+
+  // Launch the Speech Recognition service.
+  auto* browser_context =
+      static_cast<content::BrowserContext*>(browser()->profile());
+  auto* service = new ChromeSpeechRecognitionService(browser_context);
+  service->BindSpeechRecognitionContext(
+      speech_recognition_context_.BindNewPipeAndPassReceiver());
+
+  // Bind the recognizer pipes used to send audio and receive results.
+  auto run_loop = std::make_unique<base::RunLoop>();
+  speech_recognition_context_->BindRecognizer(
+      speech_recognition_recognizer_.BindNewPipeAndPassReceiver(),
+      speech_recognition_client_receiver_.BindNewPipeAndPassRemote(),
+      media::mojom::SpeechRecognitionOptions::New(
+          media::mojom::SpeechRecognitionMode::kCaption,
+          /*enable_formatting=*/true, kUsEnglishLocale,
+          /*is_server_based=*/false,
+          media::mojom::RecognizerClientType::kLiveCaption),
+      base::BindOnce([](base::RunLoop* run_loop,
+                        bool is_multichannel_supported) { run_loop->Quit(); },
+                     run_loop.get()));
+  run_loop->Run();
+
+  // Simulate a compromised renderer by changing the language and immediately
+  // resetting the recognizer and verify that the subsequent callbacks do not
+  // cause any crashes.
+  speech_recognition_recognizer_->OnLanguageChanged(kUsEnglishLocale);
+  speech_recognition_recognizer_.reset();
+  base::RunLoop().RunUntilIdle();
+}
+
 }  // namespace speech
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TrustedCdn.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TrustedCdn.java
index 3d81d52..65b7276 100644
--- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TrustedCdn.java
+++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TrustedCdn.java
@@ -22,7 +22,8 @@
  * Provides a trusted CDN publisher URL for the current web contents in a Tab.
  */
 public class TrustedCdn extends TabWebContentsUserData {
-    private static final Class<TrustedCdn> USER_DATA_KEY = TrustedCdn.class;
+    @VisibleForTesting
+    public static final Class<TrustedCdn> USER_DATA_KEY = TrustedCdn.class;
 
     private final Tab mTab;
     private final long mNativeTrustedCdn;
@@ -141,7 +142,8 @@
     }
 
     @Nullable
-    private String getPublisherUrl() {
+    @VisibleForTesting
+    public String getPublisherUrl() {
         WebContents webContents = mTab.getWebContents();
         if (webContents == null) return null;
 
diff --git a/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml b/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml
index 6e149f14..4640f52 100644
--- a/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml
+++ b/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml
@@ -14,6 +14,8 @@
     <dimen name="toolbar_identity_disc_size">24dp</dimen>
     <dimen name="toolbar_identity_disc_size_duet">32dp</dimen>
     <dimen name="toolbar_url_focus_translation_x">10dp</dimen>
+    <dimen name="toolbar_url_focus_height_increase">16dp</dimen>
+    <dimen name="toolbar_url_focus_bottom_padding_increase">8dp</dimen>
 
     <!-- Bottom Toolbar -->
     <dimen name="split_toolbar_button_height">56dp</dimen>
@@ -42,6 +44,7 @@
     <dimen name="location_bar_url_action_padding">8dp</dimen>
 
     <dimen name="location_bar_status_view_left_space_width">8dp</dimen>
+    <dimen name="location_bar_vertical_padding_phase2_active_color">4dp</dimen>
 
     <dimen name="tablet_toolbar_start_padding">4dp</dimen>
 
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
index a6237d473..508b429 100644
--- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
+++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -312,13 +312,15 @@
     }
 
     /**
-     * Set the url focus change percent, expand the left and right space besides the status view.
+     * Expand the left and right space besides the status view, and increase the location bar
+     * vertical padding based on current animation progress percent.
      *
-     * @param percent The current focus percent.
+     * @param percent The current animation progress percent.
      */
-    public void setUrlFocusChangePercent(float percent) {
+    protected void setUrlFocusChangePercent(float percent) {
         setStatusViewLeftSpacePercent(percent);
-        setStatusViewRightSpacePrecent(percent);
+        setStatusViewRightSpacePercent(percent);
+        setLocationBarPaddingPercent(percent);
     }
 
     /**
@@ -326,7 +328,7 @@
      *
      * @param percent The animation progress percent.
      */
-    public void setStatusViewLeftSpacePercent(float percent) {
+    protected void setStatusViewLeftSpacePercent(float percent) {
         if (!OmniboxFeatures.shouldShowModernizeVisualUpdate(getContext())) {
             return;
         }
@@ -344,7 +346,7 @@
      *
      * @param percent The animation progress percent.
      */
-    public void setStatusViewRightSpacePrecent(float percent) {
+    protected void setStatusViewRightSpacePercent(float percent) {
         // Status view's right space does not need to expand for tablets.
         if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(getContext())) {
             return;
@@ -356,5 +358,26 @@
         mStatusViewRightSpace.setLayoutParams(rightSpacingParams);
     }
 
+    /**
+     * Set the location bar's padding based on current animation progress percent.
+     *
+     * @param percent The current animation progress percent.
+     */
+    protected void setLocationBarPaddingPercent(float percent) {
+        // The height increase should only be applied to omnibox phase 2 feature enabled and active
+        // color parameter enabled at the same time
+        if (!(OmniboxFeatures.shouldShowModernizeVisualUpdate(getContext())
+                    && OmniboxFeatures.shouldShowActiveColorOnOmnibox())) {
+            return;
+        }
+
+        int verticalPadding =
+                (int) (getResources().getDimensionPixelSize(
+                               R.dimen.location_bar_vertical_padding_phase2_active_color)
+                        * percent);
+
+        setPaddingRelative(getPaddingStart(), verticalPadding, getPaddingEnd(), verticalPadding);
+    }
+
     public void notifyVoiceRecognitionCanceled() {}
 }
diff --git a/chrome/browser/ui/android/toolbar/OWNERS b/chrome/browser/ui/android/toolbar/OWNERS
index ac87d1f..8f52270 100644
--- a/chrome/browser/ui/android/toolbar/OWNERS
+++ b/chrome/browser/ui/android/toolbar/OWNERS
@@ -1,4 +1,5 @@
 mdjones@chromium.org
+pnoland@chromium.org
 tedchoc@chromium.org
 twellington@chromium.org
 
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java
index cfdddbb..ab82ed2 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java
@@ -31,7 +31,6 @@
 import org.chromium.chrome.browser.omnibox.UrlBarData;
 import org.chromium.chrome.browser.omnibox.styles.OmniboxResourceProvider;
 import org.chromium.chrome.browser.paint_preview.TabbedPaintPreview;
-import org.chromium.chrome.browser.preferences.ChromePreferenceKeys;
 import org.chromium.chrome.browser.profiles.Profile;
 import org.chromium.chrome.browser.tab.Tab;
 import org.chromium.chrome.browser.tab.TrustedCdn;
@@ -45,10 +44,8 @@
 import org.chromium.components.omnibox.AutocompleteSchemeClassifier;
 import org.chromium.components.omnibox.OmniboxUrlEmphasizer;
 import org.chromium.components.omnibox.SecurityStatusIcon;
-import org.chromium.components.prefs.PrefService;
 import org.chromium.components.security_state.ConnectionSecurityLevel;
 import org.chromium.components.security_state.SecurityStateModel;
-import org.chromium.components.user_prefs.UserPrefs;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.base.WindowAndroid;
 import org.chromium.url.GURL;
@@ -335,45 +332,47 @@
             }
 
             String url = gurl.getSpec().trim();
+            boolean isOfflinePage = isOfflinePage();
             String formattedUrl = getFormattedFullUrl();
-            if (mTab.isFrozen()) return buildUrlBarData(url, formattedUrl);
+            if (mTab.isFrozen()) return buildUrlBarData(url, isOfflinePage, formattedUrl);
 
             if (DomDistillerUrlUtils.isDistilledPage(url)) {
                 GURL originalUrl =
                         DomDistillerUrlUtils.getOriginalUrlFromDistillerUrl(new GURL(url));
-                return buildUrlBarData(mUrlFormatter.format(originalUrl));
+                return buildUrlBarData(mUrlFormatter.format(originalUrl), isOfflinePage);
             }
 
-            if (isOfflinePage()) {
+            if (isOfflinePage) {
                 GURL originalUrl = mTab.getOriginalUrl();
                 formattedUrl = UrlUtilities.stripScheme(mUrlFormatter.format(originalUrl));
 
                 // Clear the editing text for untrusted offline pages.
                 if (!mOfflineStatus.isShowingTrustedOfflinePage(mTab)) {
-                    return buildUrlBarData(url, formattedUrl, "");
+                    return buildUrlBarData(url, true, formattedUrl, "");
                 }
 
-                return buildUrlBarData(url, formattedUrl);
+                return buildUrlBarData(url, true, formattedUrl);
             }
 
             String urlForDisplay = getUrlForDisplay();
             if (!urlForDisplay.equals(formattedUrl)) {
-                return buildUrlBarData(url, urlForDisplay, formattedUrl);
+                return buildUrlBarData(url, false, urlForDisplay, formattedUrl);
             }
 
-            return buildUrlBarData(url, formattedUrl);
+            return buildUrlBarData(url, false, formattedUrl);
         }
     }
 
-    private UrlBarData buildUrlBarData(String url) {
-        return buildUrlBarData(url, url, url);
+    private UrlBarData buildUrlBarData(String url, boolean isOfflinePage) {
+        return buildUrlBarData(url, isOfflinePage, url, url);
     }
 
-    private UrlBarData buildUrlBarData(String url, String displayText) {
-        return buildUrlBarData(url, displayText, displayText);
+    private UrlBarData buildUrlBarData(String url, boolean isOfflinePage, String displayText) {
+        return buildUrlBarData(url, isOfflinePage, displayText, displayText);
     }
 
-    private UrlBarData buildUrlBarData(String url, String displayText, String editingText) {
+    private UrlBarData buildUrlBarData(
+            String url, boolean isOfflinePage, String displayText, String editingText) {
         SpannableStringBuilder spannableDisplayText = new SpannableStringBuilder(displayText);
         if (mNativeLocationBarModelAndroid != 0 && spannableDisplayText.length() > 0
                 && shouldEmphasizeUrl()) {
@@ -391,8 +390,9 @@
                     OmniboxResourceProvider.getUrlBarSecureColor(mContext, brandedColorScheme);
 
             AutocompleteSchemeClassifier autocompleteSchemeClassifier;
+            int securityLevel = getSecurityLevel(getTab(), isOfflinePage);
             SpannableDisplayTextCacheKey cacheKey =
-                    new SpannableDisplayTextCacheKey(url, displayText, getSecurityLevel(),
+                    new SpannableDisplayTextCacheKey(url, displayText, securityLevel,
                             nonEmphasizedColor, emphasizedColor, dangerColor, secureColor);
             SpannableStringBuilder cachedSpannableDisplayText = null;
             if (mOptimizationsEnabled) {
@@ -573,9 +573,7 @@
 
     @Override
     public int getSecurityLevel() {
-        Tab tab = getTab();
-        String publisherUrl = tab != null ? TrustedCdn.getPublisherUrl(tab) : null;
-        return getSecurityLevel(tab, isOfflinePage(), publisherUrl);
+        return getSecurityLevel(getTab(), isOfflinePage());
     }
 
     @Override
@@ -592,8 +590,9 @@
 
     @Override
     public @DrawableRes int getSecurityIconResource(boolean isTablet) {
-        return getSecurityIconResource(
-                getSecurityLevel(), !isTablet, isOfflinePage(), isPaintPreview());
+        boolean isOfflinePage = isOfflinePage();
+        return getSecurityIconResource(getSecurityLevel(getTab(), isOfflinePage), !isTablet,
+                isOfflinePage, isPaintPreview());
     }
 
     @Override
@@ -604,11 +603,14 @@
 
     @VisibleForTesting
     @ConnectionSecurityLevel
-    int getSecurityLevel(Tab tab, boolean isOfflinePage, @Nullable String publisherUrl) {
+    int getSecurityLevel(Tab tab, boolean isOfflinePage) {
         if (tab == null || isOfflinePage || isInOverviewAndShowingOmnibox()) {
             return ConnectionSecurityLevel.NONE;
         }
 
+        @Nullable
+        String publisherUrl = TrustedCdn.getPublisherUrl(tab);
+
         if (publisherUrl != null) {
             assert getSecurityLevelFromStateModel(tab.getWebContents())
                     != ConnectionSecurityLevel.DANGEROUS;
@@ -627,11 +629,6 @@
     }
 
     @VisibleForTesting
-    PrefService getPrefService() {
-        return UserPrefs.get(Profile.getLastUsedRegularProfile());
-    }
-
-    @VisibleForTesting
     @DrawableRes
     int getSecurityIconResource(int securityLevel, boolean isSmallDevice, boolean isOfflinePage,
             boolean isPaintPreview) {
@@ -656,20 +653,10 @@
                 !mSearchEngineLogoUtils.shouldShowSearchEngineLogo(isIncognito())
                 || mNtpDelegate.isCurrentlyVisible() || isInOverviewAndShowingOmnibox();
 
-        boolean useLockIconEnabled = false;
-        if (mNativeLocationBarModelAndroid != 0) {
-            PrefService prefService = getPrefService();
-            if (prefService.isManagedPreference(
-                        ChromePreferenceKeys.LOCK_ICON_IN_ADDRESS_BAR_ENABLED)) {
-                useLockIconEnabled = prefService.getBoolean(
-                        ChromePreferenceKeys.LOCK_ICON_IN_ADDRESS_BAR_ENABLED);
-            }
-        }
-
         boolean useUpdatedConnectionSecurityIndicators = FeatureList.isInitialized()
                 && ChromeFeatureList.isEnabled(
                         ChromeFeatureList.OMNIBOX_UPDATED_CONNECTION_SECURITY_INDICATORS)
-                && !useLockIconEnabled && !(hasTab() && mTab.isCustomTab());
+                && !(hasTab() && mTab.isCustomTab());
 
         return SecurityStatusIcon.getSecurityIconResource(securityLevel, isSmallDevice,
                 skipIconForNeutralState, useUpdatedConnectionSecurityIndicators);
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
index e9656e3..5c92c4f 100644
--- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
+++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
@@ -972,6 +972,7 @@
             mHomeButton.setVisibility(toolbarButtonVisibility);
         }
 
+        updateToolbarLayoutForExpansionAnimationOnActiveColor();
         updateLocationBarLayoutForExpansionAnimation();
     }
 
@@ -1098,6 +1099,33 @@
     }
 
     /**
+     * Updates the toolbar height and bottom padding, as the result of either a focus change or
+     * scrolling the New Tab Page.
+     */
+    private void updateToolbarLayoutForExpansionAnimationOnActiveColor() {
+        if (!(OmniboxFeatures.shouldShowModernizeVisualUpdate(getContext())
+                    && OmniboxFeatures.shouldShowActiveColorOnOmnibox())) {
+            return;
+        }
+
+        int heightIncrease = (int) (getResources().getDimensionPixelSize(
+                                            R.dimen.toolbar_url_focus_height_increase)
+                * mUrlExpansionFraction);
+        int bottomPaddingIncrease =
+                (int) (getResources().getDimensionPixelSize(
+                               R.dimen.toolbar_url_focus_bottom_padding_increase)
+                        * mUrlExpansionFraction);
+
+        var layoutParams = getLayoutParams();
+        layoutParams.height = getResources().getDimensionPixelSize(R.dimen.toolbar_height_no_shadow)
+                + heightIncrease;
+        setLayoutParams(layoutParams);
+
+        setPaddingRelative(
+                getPaddingStart(), getPaddingTop(), getPaddingEnd(), bottomPaddingIncrease);
+    }
+
+    /**
      * Calculates the translation X for the URL actions container for use in the URL expansion
      * animation.
      *
diff --git a/chrome/browser/ui/app_list/search/chrome_search_result.cc b/chrome/browser/ui/app_list/search/chrome_search_result.cc
index f6481449..a441c62 100644
--- a/chrome/browser/ui/app_list/search/chrome_search_result.cc
+++ b/chrome/browser/ui/app_list/search/chrome_search_result.cc
@@ -80,6 +80,11 @@
   SetSearchResultMetadata();
 }
 
+void ChromeSearchResult::SetMultilineTitle(bool multiline_title) {
+  metadata_->multiline_title = multiline_title;
+  SetSearchResultMetadata();
+}
+
 void ChromeSearchResult::SetDetailsTextVector(const TextVector& text_vector) {
   metadata_->details_vector = text_vector;
   explicit_details_vector_ = true;
diff --git a/chrome/browser/ui/app_list/search/chrome_search_result.h b/chrome/browser/ui/app_list/search/chrome_search_result.h
index 226a904..5de33fc 100644
--- a/chrome/browser/ui/app_list/search/chrome_search_result.h
+++ b/chrome/browser/ui/app_list/search/chrome_search_result.h
@@ -66,6 +66,7 @@
   const TextVector& title_text_vector() const {
     return metadata_->title_vector;
   }
+  bool multiline_title() const { return metadata_->multiline_title; }
   const TextVector& details_text_vector() const {
     return metadata_->details_vector;
   }
@@ -116,6 +117,7 @@
   void SetDetailsTags(const Tags& tags);
   void MaybeUpdateDetailsVector();
   void SetTitleTextVector(const TextVector& text_vector);
+  void SetMultilineTitle(bool multiline_title);
   void SetDetailsTextVector(const TextVector& text_vector);
   void SetMultilineDetails(bool multiline_details);
   void SetBigTitleTextVector(const TextVector& text_vector);
diff --git a/chrome/browser/ui/app_list/search/ranking/answer_ranker.cc b/chrome/browser/ui/app_list/search/ranking/answer_ranker.cc
index e0e960f..a7f39e1b0 100644
--- a/chrome/browser/ui/app_list/search/ranking/answer_ranker.cc
+++ b/chrome/browser/ui/app_list/search/ranking/answer_ranker.cc
@@ -138,6 +138,7 @@
     return;
 
   chosen_answer_->SetDisplayType(DisplayType::kAnswerCard);
+  chosen_answer_->SetMultilineTitle(true);
   chosen_answer_->SetIconDimension(GetAnswerCardIconDimension());
   chosen_answer_->scoring().filter = false;
 }
diff --git a/chrome/browser/ui/app_list/search/ranking/answer_ranker_unittest.cc b/chrome/browser/ui/app_list/search/ranking/answer_ranker_unittest.cc
index f57c0f4..dc08e5e2 100644
--- a/chrome/browser/ui/app_list/search/ranking/answer_ranker_unittest.cc
+++ b/chrome/browser/ui/app_list/search/ranking/answer_ranker_unittest.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/ui/app_list/search/ranking/answer_ranker.h"
 
 #include "chrome/browser/ui/app_list/search/chrome_search_result.h"
+#include "chrome/browser/ui/app_list/search/common/icon_constants.h"
 #include "chrome/browser/ui/app_list/search/ranking/types.h"
 #include "chrome/browser/ui/app_list/search/test/ranking_test_util.h"
 #include "testing/gmock/include/gmock/gmock.h"
@@ -13,7 +14,7 @@
 namespace app_list {
 namespace {
 
-Results make_omnibox_candidates(std::vector<double> relevances) {
+Results MakeOmniboxCandidates(std::vector<double> relevances) {
   Results results;
   for (const double relevance : relevances) {
     // |id| and |normalized_relevance| must be set but are not used.
@@ -25,7 +26,7 @@
   return results;
 }
 
-Results make_shortcut_candidates(std::vector<bool> best_matches) {
+Results MakeShortcutCandidates(std::vector<bool> best_matches) {
   Results results;
   for (const double best_match : best_matches) {
     // |id| and |normalized_relevance| must be set but are not used.
@@ -37,13 +38,20 @@
   return results;
 }
 
+bool AnswerFieldsAreSet(const std::unique_ptr<ChromeSearchResult>& result) {
+  return result->display_type() == ash::SearchResultDisplayType::kAnswerCard &&
+         result->multiline_title() &&
+         result->icon().dimension == GetAnswerCardIconDimension() &&
+         !result->scoring().filter;
+}
+
 }  // namespace
 
 // Tests that the best Omnibox answer is selected and all others are filtered
 // out.
 TEST(AnswerRankerTest, SelectAndFilterOmnibox) {
   ResultsMap results_map;
-  results_map[ResultType::kOmnibox] = make_omnibox_candidates({0.3, 0.5, 0.4});
+  results_map[ResultType::kOmnibox] = MakeOmniboxCandidates({0.3, 0.5, 0.4});
 
   AnswerRanker ranker;
   ranker.UpdateResultRanks(results_map, ProviderType::kOmnibox);
@@ -53,9 +61,7 @@
   ASSERT_EQ(results.size(), 3u);
 
   // The highest scoring Omnibox answer is selected.
-  EXPECT_EQ(results[1]->display_type(),
-            ash::SearchResultDisplayType::kAnswerCard);
-  EXPECT_FALSE(results[1]->scoring().filter);
+  EXPECT_TRUE(AnswerFieldsAreSet(results[1]));
 
   // Others are filtered out.
   EXPECT_TRUE(results[0]->scoring().filter);
@@ -66,7 +72,7 @@
 TEST(AnswerRankerTest, SelectBestShortcut) {
   ResultsMap results_map;
   results_map[ResultType::kKeyboardShortcut] =
-      make_shortcut_candidates({false, true});
+      MakeShortcutCandidates({false, true});
 
   AnswerRanker ranker;
   ranker.UpdateResultRanks(results_map, ProviderType::kKeyboardShortcut);
@@ -76,9 +82,7 @@
   ASSERT_EQ(results.size(), 2u);
 
   // The best match shortcut is selected.
-  EXPECT_EQ(results[1]->display_type(),
-            ash::SearchResultDisplayType::kAnswerCard);
-  EXPECT_FALSE(results[1]->scoring().filter);
+  EXPECT_TRUE(AnswerFieldsAreSet(results[1]));
 
   EXPECT_NE(results[0]->display_type(),
             ash::SearchResultDisplayType::kAnswerCard);
@@ -89,7 +93,7 @@
 TEST(AnswerRankerTest, OnlySelectIfOneBestShortcut) {
   ResultsMap results_map;
   results_map[ResultType::kKeyboardShortcut] =
-      make_shortcut_candidates({true, true});
+      MakeShortcutCandidates({true, true});
 
   AnswerRanker ranker;
   ranker.UpdateResultRanks(results_map, ProviderType::kKeyboardShortcut);
@@ -108,8 +112,8 @@
 // Tests that Omnibox answers take priority over Shortcuts.
 TEST(AnswerRankerTest, OmniboxOverShortcuts) {
   ResultsMap results_map;
-  results_map[ResultType::kOmnibox] = make_omnibox_candidates({0.4});
-  results_map[ResultType::kKeyboardShortcut] = make_shortcut_candidates({true});
+  results_map[ResultType::kOmnibox] = MakeOmniboxCandidates({0.4});
+  results_map[ResultType::kKeyboardShortcut] = MakeShortcutCandidates({true});
 
   AnswerRanker ranker;
   ranker.UpdateResultRanks(results_map, ProviderType::kKeyboardShortcut);
@@ -125,15 +129,13 @@
   // Omnibox candidate should be selected.
   const auto& omnibox_results = results_map[ResultType::kOmnibox];
   ASSERT_EQ(omnibox_results.size(), 1u);
-  EXPECT_EQ(omnibox_results[0]->display_type(),
-            ash::SearchResultDisplayType::kAnswerCard);
-  EXPECT_FALSE(omnibox_results[0]->scoring().filter);
+  EXPECT_TRUE(AnswerFieldsAreSet(omnibox_results[0]));
 }
 
 // Tests that a chosen answer is not changed after burn-in.
 TEST(AnswerRankerTest, SelectedAnswerNotChangedAfterBurnIn) {
   ResultsMap results_map;
-  results_map[ResultType::kKeyboardShortcut] = make_shortcut_candidates({true});
+  results_map[ResultType::kKeyboardShortcut] = MakeShortcutCandidates({true});
 
   AnswerRanker ranker;
   ranker.UpdateResultRanks(results_map, ProviderType::kKeyboardShortcut);
@@ -142,11 +144,10 @@
   // The shortcut answer is selected.
   const auto& shortcut_results = results_map[ResultType::kKeyboardShortcut];
   ASSERT_EQ(shortcut_results.size(), 1u);
-  EXPECT_EQ(shortcut_results[0]->display_type(),
-            ash::SearchResultDisplayType::kAnswerCard);
+  EXPECT_TRUE(AnswerFieldsAreSet(shortcut_results[0]));
 
   // New Omnibox candidates should still be filtered out.
-  results_map[ResultType::kOmnibox] = make_omnibox_candidates({0.5});
+  results_map[ResultType::kOmnibox] = MakeOmniboxCandidates({0.5});
   ranker.UpdateResultRanks(results_map, ProviderType::kOmnibox);
 
   const auto& omnibox_results = results_map[ResultType::kOmnibox];
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_file_system_delegate.cc b/chrome/browser/ui/ash/holding_space/holding_space_file_system_delegate.cc
index 1032607..f40997206 100644
--- a/chrome/browser/ui/ash/holding_space/holding_space_file_system_delegate.cc
+++ b/chrome/browser/ui/ash/holding_space/holding_space_file_system_delegate.cc
@@ -502,38 +502,34 @@
             profile(), /*base_path=*/base::FilePath());
   }
 
-  // Resolve conflicts with existing items that arise from the move.
+  // Mark items that were moved to an enabled Trash location for removal.
   std::set<std::string> item_ids_to_remove;
-  for (auto& item : model()->items()) {
-    if (dst == item->file_path() || dst.IsParent(item->file_path())) {
-      item_ids_to_remove.insert(item->id());
-      continue;
-    }
-
-    // Files that are sent to the Trash are actually moved to a folder, e.g.
-    // My files/.Trash/files. This means the files still appear in holding space
-    // despite the user intending to delete them. These should be removed from
-    // the model.
-    if (base::ranges::any_of(enabled_trash_locations, [&dst](const auto& it) {
-          const base::FilePath trash_location =
-              it.first.Append(it.second.relative_folder_path);
-          return trash_location.IsParent(dst);
-        })) {
-      item_ids_to_remove.insert(item->id());
+  for (const auto& it : enabled_trash_locations) {
+    const base::FilePath& trash_location =
+        it.first.Append(it.second.relative_folder_path);
+    for (const auto& [id, file_path] : items_to_move) {
+      if (trash_location.IsParent(file_path))
+        item_ids_to_remove.insert(id);
     }
   }
+
+  // Mark conflicts with existing items that arise from the move for removal.
+  for (auto& item : model()->items()) {
+    if (dst == item->file_path() || dst.IsParent(item->file_path()))
+      item_ids_to_remove.insert(item->id());
+  }
+
+  // Remove items which have been marked for removal.
   model()->RemoveItems(item_ids_to_remove);
 
   // Finally, update the files that have been moved.
-  for (const auto& to_move : items_to_move) {
-    if (item_ids_to_remove.count(to_move.first))
+  for (const auto& [id, file_path] : items_to_move) {
+    if (item_ids_to_remove.count(id))
       continue;
 
-    model()
-        ->UpdateItem(/*id=*/to_move.first)
-        ->SetBackingFile(/*file_path=*/to_move.second,
-                         holding_space_util::ResolveFileSystemUrl(
-                             profile(), /*file_path=*/to_move.second));
+    model()->UpdateItem(id)->SetBackingFile(
+        file_path,
+        holding_space_util::ResolveFileSystemUrl(profile(), file_path));
   }
 
   // If a backing file update occurred, it's possible that there are no longer
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc
index ee5cf01..2965e206 100644
--- a/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc
+++ b/chrome/browser/ui/ash/holding_space/holding_space_keyed_service_unittest.cc
@@ -22,15 +22,15 @@
 #include "base/files/file_util.h"
 #include "base/scoped_observation.h"
 #include "base/test/bind.h"
-#include "base/test/gmock_callback_support.h"
 #include "base/test/metrics/histogram_tester.h"
-#include "base/test/mock_callback.h"
+#include "base/test/test_future.h"
 #include "base/time/time.h"
 #include "base/time/time_override.h"
 #include "chrome/browser/ash/arc/fileapi/arc_file_system_bridge.h"
 #include "chrome/browser/ash/file_manager/fake_disk_mount_manager.h"
 #include "chrome/browser/ash/file_manager/fileapi_util.h"
 #include "chrome/browser/ash/file_manager/path_util.h"
+#include "chrome/browser/ash/file_manager/trash_common_util.h"
 #include "chrome/browser/ash/file_manager/trash_io_task.h"
 #include "chrome/browser/ash/file_manager/volume_manager.h"
 #include "chrome/browser/ash/file_manager/volume_manager_factory.h"
@@ -146,12 +146,6 @@
   return deserialized_item_ptr;
 }
 
-base::FilePath MakeRelativePath(const base::FilePath& absolute_path,
-                                const base::FilePath& parent) {
-  return base::FilePath(absolute_path.value().substr(
-      parent.AsEndingWithSeparator().value().size()));
-}
-
 // Utility class which can wait until a `HoldingSpaceModel` for a given profile
 // is attached to the `HoldingSpaceController`.
 class HoldingSpaceModelAttachedWaiter : public HoldingSpaceControllerObserver {
@@ -1090,6 +1084,14 @@
       ScopedTestMountPoint::CreateAndMountDownloads(GetProfile());
   ASSERT_TRUE(downloads_mount->IsValid());
 
+  // Ensure that required trash folders exist for the `downloads_mount`.
+  const base::FilePath trash_path = downloads_mount->GetRootPath().Append(
+      file_manager::trash::kTrashFolderName);
+  ASSERT_TRUE(base::CreateDirectory(
+      trash_path.Append(file_manager::trash::kFilesFolderName)));
+  ASSERT_TRUE(base::CreateDirectory(
+      trash_path.Append(file_manager::trash::kInfoFolderName)));
+
   // Cache the holding space model for the primary profile.
   HoldingSpaceKeyedService* const primary_holding_space_service =
       HoldingSpaceKeyedServiceFactory::GetInstance()->GetService(GetProfile());
@@ -1117,10 +1119,11 @@
     primary_holding_space_model->AddItem(std::move(holding_space_item));
   }
 
-  // Create a context for testing.
-  scoped_refptr<storage::FileSystemContext> file_system_context =
-      storage::CreateFileSystemContextForTesting(
-          nullptr, downloads_mount->GetRootPath());
+  // Use the File Manager's context for testing. Note that we specifically do
+  // not use a test context since we want a production context which uses file
+  // system operations that notify the `FileChangeService` on completion.
+  storage::FileSystemContext* file_system_context =
+      file_manager::util::GetFileManagerFileSystemContext(GetProfile());
   const blink::StorageKey kTestStorageKey =
       blink::StorageKey::CreateFromStringForTesting("chrome-extension://abc");
 
@@ -1132,25 +1135,15 @@
     base::FilePath file_path = holding_space_item->file_path();
 
     ItemRemovedWaiter waiter(primary_holding_space_model, holding_space_item);
-    base::MockOnceCallback<void(file_manager::io_task::ProgressStatus)>
-        complete_callback;
 
-    EXPECT_CALL(complete_callback,
-                Run(Field(&file_manager::io_task::ProgressStatus::state,
-                          file_manager::io_task::State::kSuccess)));
+    base::test::TestFuture<file_manager::io_task::ProgressStatus> status;
+    file_manager::io_task::TrashIOTask task(
+        {file_system_context->CrackURLInFirstPartyContext(
+            GetFileSystemUrl(GetProfile(), file_path))},
+        GetProfile(), file_system_context, /*base_path=*/base::FilePath());
+    task.Execute(base::DoNothing(), status.GetCallback());
+    EXPECT_EQ(status.Get().state, file_manager::io_task::State::kSuccess);
 
-    // Paths sent to the test `FileSystemContext` must be relative to the base
-    // path supplied when the context was setup.
-    base::FilePath relative_path =
-        MakeRelativePath(file_path, downloads_mount->GetRootPath());
-    std::vector<storage::FileSystemURL> source_urls = {
-        file_system_context->CreateCrackedFileSystemURL(
-            kTestStorageKey, storage::kFileSystemTypeTest, relative_path),
-    };
-    file_manager::io_task::TrashIOTask task(source_urls, GetProfile(),
-                                            file_system_context,
-                                            downloads_mount->GetRootPath());
-    task.Execute(base::DoNothing(), complete_callback.Get());
     waiter.Wait();
   }
 
@@ -3254,6 +3247,38 @@
   EXPECT_EQ(expected, GetSuggestionsInModel(model));
 }
 
+TEST_P(HoldingSpaceSuggestionsDelegateTest, DownloadsFolderNotSuggested) {
+  auto downloads_mount = mount_point()->CreateAndMountDownloads(profile());
+  auto downloads_path =
+      file_manager::util::GetDownloadsFolderForProfile(GetProfile());
+  auto other_folder_path = downloads_path.Append("contained_folder");
+  ASSERT_TRUE(base::CreateDirectory(other_folder_path));
+  const base::FilePath file_path = mount_point()->CreateArbitraryFile();
+
+  GetFileSuggestKeyedService()->SetSuggestionsForType(
+      app_list::FileSuggestionType::kLocalFile,
+      /*suggestions=*/std::vector<app_list::FileSuggestData>{
+          {app_list::FileSuggestionType::kLocalFile, downloads_path,
+           /*new_prediction_reason=*/absl::nullopt,
+           /*new_score=*/absl::nullopt},
+          {app_list::FileSuggestionType::kLocalFile, other_folder_path,
+           /*new_prediction_reason=*/absl::nullopt,
+           /*new_score=*/absl::nullopt},
+          {app_list::FileSuggestionType::kLocalFile, file_path,
+           /*new_prediction_reason=*/absl::nullopt,
+           /*new_score=*/absl::nullopt}});
+  task_environment()->FastForwardBy(base::Seconds(1));
+
+  std::vector<std::pair<HoldingSpaceItem::Type, base::FilePath>> expected;
+  if (features::IsHoldingSpaceSuggestionsEnabled()) {
+    expected = {{HoldingSpaceItem::Type::kLocalSuggestion, file_path},
+                {HoldingSpaceItem::Type::kLocalSuggestion, other_folder_path}};
+  }
+
+  EXPECT_EQ(GetSuggestionsInModel(HoldingSpaceController::Get()->model()),
+            expected);
+}
+
 TEST_P(HoldingSpaceSuggestionsDelegateTest, PinAndUnpinSuggestions) {
   const base::FilePath file_path_1 = mount_point()->CreateArbitraryFile();
 
diff --git a/chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.cc b/chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.cc
index c8499d6..719725f7 100644
--- a/chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.cc
+++ b/chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.cc
@@ -5,6 +5,7 @@
 #include "chrome/browser/ui/ash/holding_space/holding_space_suggestions_delegate.h"
 
 #include "ash/constants/ash_features.h"
+#include "chrome/browser/ash/file_manager/path_util.h"
 #include "chrome/browser/ui/app_list/search/files/file_suggest_keyed_service_factory.h"
 
 namespace ash {
@@ -131,10 +132,13 @@
 void HoldingSpaceSuggestionsDelegate::UpdateSuggestionsInModel() {
   std::vector<std::pair<HoldingSpaceItem::Type, base::FilePath>>
       suggestion_items;
+  base::FilePath downloads_folder =
+      file_manager::util::GetDownloadsFolderForProfile(profile());
   for (const auto& [type, raw_suggestions] : suggestions_by_type_) {
     HoldingSpaceItem::Type item_type = GetItemTypeFromSuggestionType(type);
     for (const auto& suggestion : raw_suggestions) {
-      if (!model()->ContainsItem(HoldingSpaceItem::Type::kPinnedFile,
+      if (suggestion.file_path != downloads_folder &&
+          !model()->ContainsItem(HoldingSpaceItem::Type::kPinnedFile,
                                  suggestion.file_path)) {
         suggestion_items.emplace_back(item_type, suggestion.file_path);
       }
diff --git a/chrome/browser/ui/cocoa/accelerators_cocoa.h b/chrome/browser/ui/cocoa/accelerators_cocoa.h
index b873e56..8346a63 100644
--- a/chrome/browser/ui/cocoa/accelerators_cocoa.h
+++ b/chrome/browser/ui/cocoa/accelerators_cocoa.h
@@ -52,6 +52,8 @@
   friend struct base::DefaultSingletonTraits<AcceleratorsCocoa>;
   FRIEND_TEST_ALL_PREFIXES(AcceleratorsCocoaBrowserTest,
                            MappingAcceleratorsInMainMenu);
+  FRIEND_TEST_ALL_PREFIXES(AcceleratorsCocoaBrowserTestRTL,
+                           HistoryAcceleratorsReversedForRTL);
 
   AcceleratorsCocoa();
   ~AcceleratorsCocoa();
diff --git a/chrome/browser/ui/cocoa/accelerators_cocoa.mm b/chrome/browser/ui/cocoa/accelerators_cocoa.mm
index 57421ffb..53f4ce6 100644
--- a/chrome/browser/ui/cocoa/accelerators_cocoa.mm
+++ b/chrome/browser/ui/cocoa/accelerators_cocoa.mm
@@ -10,6 +10,7 @@
 #include <utility>
 
 #include "base/cxx17_backports.h"
+#include "base/i18n/rtl.h"
 #include "base/mac/mac_util.h"
 #include "base/memory/singleton.h"
 #include "build/branding_buildflags.h"
@@ -143,6 +144,17 @@
                        ui::Accelerator(ui::VKEY_SPACE, ui::EF_CONTROL_DOWN)));
     DCHECK(result.second);
   }
+
+  if (!base::i18n::IsRTL())
+    return;
+
+  // If running in RTL, swap the keyboard shortcuts for History -> Forward
+  // and Back.
+  ui::Accelerator history_forward = accelerators_[IDC_FORWARD];
+  ui::Accelerator history_back = accelerators_[IDC_BACK];
+
+  accelerators_[IDC_FORWARD] = history_back;
+  accelerators_[IDC_BACK] = history_forward;
 }
 
 AcceleratorsCocoa::~AcceleratorsCocoa() {}
diff --git a/chrome/browser/ui/cocoa/accelerators_cocoa_browsertest.mm b/chrome/browser/ui/cocoa/accelerators_cocoa_browsertest.mm
index 724157086..87392078 100644
--- a/chrome/browser/ui/cocoa/accelerators_cocoa_browsertest.mm
+++ b/chrome/browser/ui/cocoa/accelerators_cocoa_browsertest.mm
@@ -4,6 +4,7 @@
 
 #import <Cocoa/Cocoa.h>
 
+#include "base/i18n/base_i18n_switches.h"
 #include "chrome/app/chrome_command_ids.h"
 #import "chrome/browser/ui/cocoa/accelerators_cocoa.h"
 #include "chrome/grit/generated_resources.h"
@@ -80,6 +81,16 @@
 
 }  // namespace
 
+class AcceleratorsCocoaBrowserTestRTL : public AcceleratorsCocoaBrowserTest {
+ public:
+  void SetUpCommandLine(base::CommandLine* command_line) override {
+    command_line->AppendSwitchASCII(::switches::kForceUIDirection,
+                                    ::switches::kForceDirectionRTL);
+    command_line->AppendSwitchASCII(::switches::kForceTextDirection,
+                                    ::switches::kForceDirectionRTL);
+  }
+};
+
 // Checks that each NSMenuItem in the main menu has a corresponding accelerator,
 // and the keyEquivalent/modifiers match.
 IN_PROC_BROWSER_TEST_F(AcceleratorsCocoaBrowserTest,
@@ -145,3 +156,14 @@
       EXPECT_EQ(item.tag, it.first);
   }
 }
+
+IN_PROC_BROWSER_TEST_F(AcceleratorsCocoaBrowserTestRTL,
+                       HistoryAcceleratorsReversedForRTL) {
+  AcceleratorsCocoa* keymap = AcceleratorsCocoa::GetInstance();
+  ui::Accelerator history_forward = keymap->accelerators_[IDC_FORWARD];
+  ui::Accelerator history_back = keymap->accelerators_[IDC_BACK];
+
+  // In LTR, History -> Forward is VKEY_OEM_6 and Back is VKEY_OEM_4.
+  EXPECT_EQ(ui::VKEY_OEM_4, history_forward.key_code());
+  EXPECT_EQ(ui::VKEY_OEM_6, history_back.key_code());
+}
diff --git a/chrome/browser/ui/commerce/price_tracking/shopping_list_ui_tab_helper.cc b/chrome/browser/ui/commerce/price_tracking/shopping_list_ui_tab_helper.cc
index 61b849a..a9638a9 100644
--- a/chrome/browser/ui/commerce/price_tracking/shopping_list_ui_tab_helper.cc
+++ b/chrome/browser/ui/commerce/price_tracking/shopping_list_ui_tab_helper.cc
@@ -15,6 +15,7 @@
 #include "components/commerce/core/price_tracking_utils.h"
 #include "components/image_fetcher/core/image_fetcher_service.h"
 #include "components/prefs/pref_service.h"
+#include "content/public/browser/navigation_details.h"
 #include "content/public/browser/web_contents.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
 #include "url/gurl.h"
@@ -85,6 +86,12 @@
 
 void ShoppingListUiTabHelper::NavigationEntryCommitted(
     const content::LoadCommittedDetails& load_details) {
+  if (!load_details.is_in_active_page ||
+      web_contents()->GetLastCommittedURL() ==
+          load_details.previous_main_frame_url) {
+    return;
+  }
+
   last_fetched_image_ = gfx::Image();
   last_fetched_image_url_ = GURL();
 
diff --git a/chrome/browser/ui/views/commerce/price_tracking_icon_view_integration_test.cc b/chrome/browser/ui/views/commerce/price_tracking_icon_view_integration_test.cc
index e6b490a..bb22901c 100644
--- a/chrome/browser/ui/views/commerce/price_tracking_icon_view_integration_test.cc
+++ b/chrome/browser/ui/views/commerce/price_tracking_icon_view_integration_test.cc
@@ -4,6 +4,7 @@
 
 #include "chrome/browser/ui/views/commerce/price_tracking_icon_view.h"
 
+#include "base/test/metrics/user_action_tester.h"
 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
 #include "chrome/browser/bookmarks/managed_bookmark_service_factory.h"
 #include "chrome/browser/ui/browser_element_identifiers.h"
@@ -110,6 +111,7 @@
 
  protected:
   raw_ptr<MockShoppingListUiTabHelper> mock_tab_helper_;
+  base::UserActionTester user_action_tester_;
 
  private:
   base::test::ScopedFeatureList test_features_;
@@ -129,10 +131,17 @@
   ON_CALL(*GetTabHelper(), ShouldShowPriceTrackingIconView)
       .WillByDefault(testing::Return(true));
 
+  EXPECT_EQ(user_action_tester_.GetActionCount(
+                "Commerce.PriceTracking.OmniboxChipShown"),
+            0);
+
   NavigateAndCommitActiveTab(GURL(kTrackableUrl));
 
   auto* icon_view = GetChip();
   VerifyIconState(icon_view, /*is_price_tracked=*/true);
+  EXPECT_EQ(user_action_tester_.GetActionCount(
+                "Commerce.PriceTracking.OmniboxChipShown"),
+            1);
 }
 
 TEST_F(PriceTrackingIconViewIntegrationTest,
diff --git a/chrome/browser/ui/webauthn/sheet_models.cc b/chrome/browser/ui/webauthn/sheet_models.cc
index 89a8d935b..a78d3bff 100644
--- a/chrome/browser/ui/webauthn/sheet_models.cc
+++ b/chrome/browser/ui/webauthn/sheet_models.cc
@@ -410,16 +410,30 @@
 const gfx::VectorIcon&
 AuthenticatorAlreadyRegisteredErrorModel::GetStepIllustration(
     ImageColorScheme color_scheme) const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    return color_scheme == ImageColorScheme::kDark ? kPasskeyErrorDarkIcon
+                                                   : kPasskeyErrorIcon;
+  }
   return color_scheme == ImageColorScheme::kDark ? kWebauthnErrorDarkIcon
                                                  : kWebauthnErrorIcon;
 }
 
 std::u16string AuthenticatorAlreadyRegisteredErrorModel::GetStepTitle() const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    return l10n_util::GetStringUTF16(IDS_WEBAUTHN_ERROR_WRONG_DEVICE_TITLE);
+  }
   return l10n_util::GetStringUTF16(IDS_WEBAUTHN_ERROR_WRONG_KEY_TITLE);
 }
 
 std::u16string AuthenticatorAlreadyRegisteredErrorModel::GetStepDescription()
     const {
+  if (base::FeatureList::IsEnabled(
+          device::kWebAuthnNewDiscoverableCredentialsUi)) {
+    return l10n_util::GetStringUTF16(
+        IDS_WEBAUTHN_ERROR_WRONG_DEVICE_REGISTER_DESCRIPTION);
+  }
   return l10n_util::GetStringUTF16(
       IDS_WEBAUTHN_ERROR_WRONG_KEY_REGISTER_DESCRIPTION);
 }
diff --git a/chrome/browser/ui/webui/chrome_untrusted_web_ui_configs_chromeos.cc b/chrome/browser/ui/webui/chrome_untrusted_web_ui_configs_chromeos.cc
index 860200b..b8b6eec 100644
--- a/chrome/browser/ui/webui/chrome_untrusted_web_ui_configs_chromeos.cc
+++ b/chrome/browser/ui/webui/chrome_untrusted_web_ui_configs_chromeos.cc
@@ -62,7 +62,7 @@
   }
   map.AddUntrustedWebUIConfig(
       std::make_unique<ash::DemoModeAppUntrustedUIConfig>(base::BindRepeating(
-          [] { return ash::DemoSession::Get()->DemoAppComponentPath(); })));
+          [] { return ash::DemoSession::Get()->GetDemoAppComponentPath(); })));
 #if !defined(OFFICIAL_BUILD)
   map.AddUntrustedWebUIConfig(
       std::make_unique<ash::SampleSystemWebAppUntrustedUIConfig>());
diff --git a/chrome/browser/ui/webui/chromeos/user_image_source.cc b/chrome/browser/ui/webui/chromeos/user_image_source.cc
index 7afcfe1..705fa24 100644
--- a/chrome/browser/ui/webui/chromeos/user_image_source.cc
+++ b/chrome/browser/ui/webui/chromeos/user_image_source.cc
@@ -140,7 +140,8 @@
           !user->HasDefaultImage() || user->has_image_bytes());
 
     if (user->has_image_bytes()) {
-      if (user->image_format() == user_manager::UserImage::FORMAT_PNG) {
+      if (user->image_format() == user_manager::UserImage::FORMAT_PNG ||
+          user->image_format() == user_manager::UserImage::FORMAT_WEBP) {
         return GetUserImageFrame(user->image_bytes(), user->image_format(),
                                  frame);
       } else {
diff --git a/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc b/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
index cfaae49..6e44fa51 100644
--- a/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
+++ b/chrome/browser/ui/webui/print_preview/local_printer_handler_default.cc
@@ -70,13 +70,15 @@
     PrinterHandler::DefaultPrinterCallback callback,
     mojom::DefaultPrinterNameResultPtr printer_name) {
   if (printer_name->is_result_code()) {
-    PRINTER_LOG(ERROR) << "Failure getting default printer, result: "
-                       << printer_name->get_result_code();
+    PRINTER_LOG(ERROR)
+        << "Failure getting default printer via service, result: "
+        << printer_name->get_result_code();
     std::move(callback).Run(std::string());
     return;
   }
 
-  VLOG(1) << "Default Printer: " << printer_name->get_default_printer_name();
+  PRINTER_LOG(EVENT) << "Default Printer from service: "
+                     << printer_name->get_default_printer_name();
   std::move(callback).Run(printer_name->get_default_printer_name());
 }
 
@@ -85,8 +87,9 @@
     PrinterHandler::GetPrintersDoneCallback done_callback,
     mojom::PrinterListResultPtr printer_list) {
   if (printer_list->is_result_code()) {
-    PRINTER_LOG(ERROR) << "Failure enumerating local printers, result: "
-                       << printer_list->get_result_code();
+    PRINTER_LOG(ERROR)
+        << "Failure enumerating local printers via service, result: "
+        << printer_list->get_result_code();
   }
 
   ConvertPrinterListForCallback(
@@ -102,8 +105,10 @@
     PrinterHandler::GetCapabilityCallback callback,
     mojom::PrinterCapsAndInfoResultPtr printer_caps_and_info) {
   if (printer_caps_and_info->is_result_code()) {
-    LOG(WARNING) << "Failure fetching printer capabilities for " << device_name
-                 << " - error " << printer_caps_and_info->get_result_code();
+    PRINTER_LOG(ERROR)
+        << "Failure fetching printer capabilities via service for "
+        << device_name
+        << ", result: " << printer_caps_and_info->get_result_code();
 
     // If we failed because of access denied then we could retry at an elevated
     // privilege (if not already elevated).
@@ -130,7 +135,8 @@
     return;
   }
 
-  VLOG(1) << "Received printer info & capabilities for " << device_name;
+  PRINTER_LOG(EVENT) << "Received printer info & capabilities via service for "
+                     << device_name;
   const mojom::PrinterCapsAndInfoPtr& caps_and_info =
       printer_caps_and_info->get_printer_caps_and_info();
   base::Value::Dict settings = AssemblePrinterSettings(
@@ -186,9 +192,11 @@
   VLOG(1) << "Get printer capabilities start for " << device_name;
 
   PrinterBasicInfo basic_info;
-  if (print_backend->GetPrinterBasicInfo(device_name, &basic_info) !=
-      mojom::ResultCode::kSuccess) {
-    LOG(WARNING) << "Invalid printer " << device_name;
+  mojom::ResultCode result =
+      print_backend->GetPrinterBasicInfo(device_name, &basic_info);
+  if (result != mojom::ResultCode::kSuccess) {
+    PRINTER_LOG(ERROR) << "Invalid printer when getting basic info for "
+                       << device_name << ", result: " << result;
     return base::Value::Dict();
   }
 
@@ -217,7 +225,7 @@
                        << result;
     return std::string();
   }
-  VLOG(1) << "Default Printer: " << default_printer;
+  PRINTER_LOG(EVENT) << "Default Printer: " << default_printer;
   return default_printer;
 }
 
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index e7d6174..30fac55 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1665575931-7a7f321e27b06315460f8a75b7bd9d32f53b4987.profdata
+chrome-linux-main-1665597506-69424600cd8ac8ad57eee50de5f83fc641d993fb.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index d20ea79d..d816e01 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1665575931-b54eb498dd4b0589c6ea03c084015f8d82b54bad.profdata
+chrome-mac-main-1665597506-38a49e6c5f2d58a0a4894c1acd49bcb7b8d3fb60.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 72b586a..5c1fa16 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1665586466-c7cc31370b6807fde1cf26a4051835f758f5374d.profdata
+chrome-win64-main-1665597506-133eabc042ccf9f1157cba488b723bcca2cfd73d.profdata
diff --git a/chrome/common/extensions/api/file_browser_handlers/DIR_METADATA b/chrome/common/extensions/api/file_browser_handlers/DIR_METADATA
new file mode 100644
index 0000000..e9400b87
--- /dev/null
+++ b/chrome/common/extensions/api/file_browser_handlers/DIR_METADATA
@@ -0,0 +1 @@
+mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chrome/common/extensions/api/file_system_provider/DIR_METADATA b/chrome/common/extensions/api/file_system_provider/DIR_METADATA
new file mode 100644
index 0000000..e9400b87
--- /dev/null
+++ b/chrome/common/extensions/api/file_system_provider/DIR_METADATA
@@ -0,0 +1 @@
+mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chrome/common/extensions/api/file_system_provider_capabilities/DIR_METADATA b/chrome/common/extensions/api/file_system_provider_capabilities/DIR_METADATA
new file mode 100644
index 0000000..e9400b87
--- /dev/null
+++ b/chrome/common/extensions/api/file_system_provider_capabilities/DIR_METADATA
@@ -0,0 +1 @@
+mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chrome/services/speech/speech_recognition_recognizer_impl.cc b/chrome/services/speech/speech_recognition_recognizer_impl.cc
index cc78088..142ba9b 100644
--- a/chrome/services/speech/speech_recognition_recognizer_impl.cc
+++ b/chrome/services/speech/speech_recognition_recognizer_impl.cc
@@ -12,6 +12,7 @@
 #include "base/files/file_path.h"
 #include "base/files/file_util.h"
 #include "base/metrics/histogram_functions.h"
+#include "base/task/task_runner.h"
 #include "base/task/task_traits.h"
 #include "base/task/thread_pool.h"
 #include "build/build_config.h"
@@ -190,7 +191,6 @@
           &SpeechRecognitionRecognizerImpl::OnRecognitionStoppedCallback,
           weak_factory_.GetWeakPtr()));
 
-  // Unretained is safe because |this| owns the mojo::Remote.
   client_remote_.set_disconnect_handler(
       base::BindOnce(&SpeechRecognitionRecognizerImpl::OnClientHostDisconnected,
                      weak_factory_.GetWeakPtr()));
@@ -293,25 +293,6 @@
 
 void SpeechRecognitionRecognizerImpl::OnLanguageChanged(
     const std::string& language) {
-  if (!task_runner_) {
-    task_runner_ = base::ThreadPool::CreateSequencedTaskRunner(
-        {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
-         base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN});
-  }
-
-  // Changing the language requires a blocking call to check if the language
-  // pack exists on the device.
-  scoped_refptr<base::SequencedTaskRunner> current_task_runner =
-      base::SequencedTaskRunnerHandle::Get();
-  task_runner_->PostTask(
-      FROM_HERE,
-      base::BindOnce(&SpeechRecognitionRecognizerImpl::ChangeLanguage,
-                     base::Unretained(this), language, current_task_runner));
-}
-
-void SpeechRecognitionRecognizerImpl::ChangeLanguage(
-    const std::string& language,
-    scoped_refptr<base::SequencedTaskRunner> main_sequence) {
   absl::optional<speech::SodaLanguagePackComponentConfig>
       language_component_config = GetLanguageComponentConfig(language);
   if (!language_component_config.has_value())
@@ -322,17 +303,40 @@
   if (language_code == language_ || language_code == LanguageCode::kNone)
     return;
 
-  // Only change the language if the new language pack is installed.
-  base::FilePath config_path = GetLatestSodaLanguagePackDirectory(language);
-  if (base::PathExists(config_path)) {
-    config_path_ = config_path;
-    language_ = language_component_config.value().language_code;
+  if (!task_runner_) {
+    task_runner_ = base::ThreadPool::CreateSequencedTaskRunner(
+        {base::MayBlock(), base::TaskPriority::BEST_EFFORT,
+         base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN});
+  }
 
-    // SODA must be reset on the same sequence where it's actively used in order
-    // to avoid race conditions.
-    main_sequence->PostTask(
-        FROM_HERE, base::BindOnce(&SpeechRecognitionRecognizerImpl::ResetSoda,
-                                  base::Unretained(this)));
+  // Changing the language requires a blocking call to check if the language
+  // pack exists on the device.
+  scoped_refptr<base::SequencedTaskRunner> current_task_runner =
+      base::SequencedTaskRunnerHandle::Get();
+
+  base::FilePath config_file_path =
+      GetLatestSodaLanguagePackDirectory(language);
+
+  task_runner_->PostTaskAndReplyWithResult(
+      FROM_HERE,
+      base::BindOnce(
+          [](base::FilePath config_path) {
+            return base::PathExists(config_path);
+          },
+          config_file_path),
+      base::BindOnce(&SpeechRecognitionRecognizerImpl::ResetSodaWithNewLanguage,
+                     weak_factory_.GetWeakPtr(), config_file_path,
+                     language_code));
+}
+
+void SpeechRecognitionRecognizerImpl::ResetSodaWithNewLanguage(
+    base::FilePath config_path,
+    speech::LanguageCode language_code,
+    bool config_exists) {
+  if (config_exists) {
+    config_path_ = config_path;
+    language_ = language_code;
+    ResetSoda();
   }
 }
 
diff --git a/chrome/services/speech/speech_recognition_recognizer_impl.h b/chrome/services/speech/speech_recognition_recognizer_impl.h
index 0c8dcd1..5edbbff 100644
--- a/chrome/services/speech/speech_recognition_recognizer_impl.h
+++ b/chrome/services/speech/speech_recognition_recognizer_impl.h
@@ -102,8 +102,9 @@
  private:
   void OnLanguageChanged(const std::string& language) final;
 
-  void ChangeLanguage(const std::string& language,
-                      scoped_refptr<base::SequencedTaskRunner> main_sequence);
+  void ResetSodaWithNewLanguage(base::FilePath config_path,
+                                speech::LanguageCode language_code,
+                                bool config_exists);
   void RecordDuration();
 
   // Called as a response to sending a SpeechRecognitionEvent to the client
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/BUILD.gn b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/BUILD.gn
index e580d72..eb6b658 100644
--- a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/BUILD.gn
+++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/BUILD.gn
@@ -18,6 +18,8 @@
   sources = [
     "big_file/sw.js",
     "big_file/test.js",
+    "configure/sw.js",
+    "configure/test.js",
     "copy_entry/sw.js",
     "copy_entry/test.js",
     "create_file/sw.js",
@@ -27,6 +29,8 @@
     "get_all/sw.js",
     "get_all/test.js",
     "helpers.js",
+    "move_entry/sw.js",
+    "move_entry/test.js",
     "provider.js",
     "read_directory/sw.js",
     "read_directory/test.js",
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/manifest.json b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/manifest.json
new file mode 100644
index 0000000..d63a398
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/manifest.json
@@ -0,0 +1,24 @@
+{
+  // chrome-extension://pkplfbidichfdicaijlchgnapepdginl
+  "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtDfX9dHNh948bt00YhZBm3P6E5QLaOt+v8kXVtibQfiPtOD2FTScB/f0wX/EQWVO7BkaSOsRkTPcPIgocyMPYr2FLgqGLFlYT9nQpKJZUFNF5oJ5rG6Nv7ppf4zEB3j6da1IBRTz2yOZ+6O1TMZxol/V62/QcqrJeggsHTEPGLdr9Ua4b1Ka0xKJnJngZljsbw93FI1o+P9dAh5BS6wTPiZI/vmJVjvMTkSTnaZ3n9Go2t7A0XLcSxLcVyuLAd2mAvSN0mIviOukdM66wr7llif71nKuUt+4qvlr/r9HfwzN6pA4jkwhtS1UD+3CmB+wsHwsnohNcuu4FIQ6rgq/7QIDAQAB",
+  "name": "chrome.fileSystemProvider.onConfigureRequested",
+  "version": "0.1",
+  "manifest_version": 3,
+  "description":
+      "Test for chrome.fileSystemProvider.onConfigureRequested() for service workers.",
+  "permissions": [
+    "fileSystemProvider",
+    {
+      "fileSystem": ["requestFileSystem", "write"]
+    },
+    "fileManagerPrivate"
+  ],
+  "file_system_provider_capabilities": {
+    "configurable": true,
+    "source": "device"
+  },
+  "background": {
+    "service_worker": "sw.js",
+    "type": "module"
+  }
+}
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/sw.js b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/sw.js
new file mode 100644
index 0000000..ac074135
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/sw.js
@@ -0,0 +1,7 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {serviceWorkerMain} from '/_test_resources/api_test/file_system_provider/service_worker/provider.js';
+
+serviceWorkerMain(self);
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/test.html b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/test.html
new file mode 100644
index 0000000..9980fda0
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/test.html
@@ -0,0 +1 @@
+<script type="module" src="test.js"></script>
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/test.js b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/test.js
new file mode 100644
index 0000000..0ced1b3
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/configure/test.js
@@ -0,0 +1,81 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {mountTestFileSystem, promisifyWithLastError, remoteProvider} from '/_test_resources/api_test/file_system_provider/service_worker/helpers.js';
+// For shared constants.
+import {TestFileSystemProvider} from '/_test_resources/api_test/file_system_provider/service_worker/provider.js';
+
+
+async function main() {
+  await navigator.serviceWorker.ready;
+
+  const fileSystem = await mountTestFileSystem();
+
+  chrome.test.runTests([
+    // Verify that the configuration flag is propagated properly.
+    async function configureConfigurable() {
+      try {
+        let providers = await promisifyWithLastError(
+            chrome.fileManagerPrivate.getProviders);
+        // Filter out native providers.
+        providers = providers.filter(
+            provider => provider.providerId.length == 0 ||
+                provider.providerId[0] != '@');
+        chrome.test.assertEq(providers.length, 1);
+        // For extension based providers, provider id is the same as
+        // extension id.
+        chrome.test.assertEq(chrome.runtime.id, providers[0].providerId);
+        chrome.test.assertEq(
+            chrome.runtime.getManifest().name, providers[0].name);
+        chrome.test.assertTrue(providers[0].configurable);
+        chrome.test.assertFalse(providers[0].multipleMounts);
+        chrome.test.assertEq('device', providers[0].source);
+        await new Promise(
+            resolve => chrome.fileManagerPrivate.configureVolume(
+                fileSystem.volumeInfo.volumeId, resolve));
+        chrome.test.succeed();
+      } catch (e) {
+        chrome.test.fail(e);
+      }
+    },
+
+    // Verify that chrome.fileManager.configureVolume is well wired
+    // to onConfigureRequested().
+    async function configureSuccess() {
+      try {
+        await promisifyWithLastError(
+            chrome.fileManagerPrivate.configureVolume,
+            fileSystem.volumeInfo.volumeId);
+        await remoteProvider.waitForEvent('onConfigureRequested');
+        chrome.test.succeed();
+      } catch (e) {
+        chrome.test.fail(e);
+      }
+    },
+
+    // Verify that a failure is propagated properly.
+    async function configureFailure() {
+      try {
+        // Next call to configure should return error.
+        await remoteProvider.setConfig(
+            'onConfigureRequestedError',
+            chrome.fileSystemProvider.ProviderError.FAILED,
+        );
+        try {
+          await promisifyWithLastError(
+              chrome.fileManagerPrivate.configureVolume,
+              fileSystem.volumeInfo.volumeId);
+          chrome.test.fail('Configuration should have failed.');
+        } catch (e) {
+          chrome.test.assertEq('Failed to complete configuration.', e.message);
+          chrome.test.succeed();
+        }
+      } catch (e) {
+        chrome.test.fail(e);
+      }
+    }
+  ]);
+}
+
+main();
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/helpers.js b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/helpers.js
index 94e9737..a265b8a 100644
--- a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/helpers.js
+++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/helpers.js
@@ -8,7 +8,7 @@
  * @param {...?} args
  * @returns {!Promise<?>}
  */
-async function promisifyWithLastError(fn, ...args) {
+export async function promisifyWithLastError(fn, ...args) {
   return new Promise((resolve, reject) => {
     fn(...args, (result) => {
       if (chrome.runtime.lastError) {
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/manifest.json b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/manifest.json
new file mode 100644
index 0000000..d7d9ed8
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/manifest.json
@@ -0,0 +1,25 @@
+{
+    // chrome-extension://pkplfbidichfdicaijlchgnapepdginl
+    "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtDfX9dHNh948bt00YhZBm3P6E5QLaOt+v8kXVtibQfiPtOD2FTScB/f0wX/EQWVO7BkaSOsRkTPcPIgocyMPYr2FLgqGLFlYT9nQpKJZUFNF5oJ5rG6Nv7ppf4zEB3j6da1IBRTz2yOZ+6O1TMZxol/V62/QcqrJeggsHTEPGLdr9Ua4b1Ka0xKJnJngZljsbw93FI1o+P9dAh5BS6wTPiZI/vmJVjvMTkSTnaZ3n9Go2t7A0XLcSxLcVyuLAd2mAvSN0mIviOukdM66wr7llif71nKuUt+4qvlr/r9HfwzN6pA4jkwhtS1UD+3CmB+wsHwsnohNcuu4FIQ6rgq/7QIDAQAB",
+    "name": "chrome.fileSystemProvider.onMoveEntryRequested",
+    "version": "0.1",
+    "manifest_version": 3,
+    "description": "Test for chrome.fileSystemProvider.onMoveEntryRequested() in service worker.",
+    "permissions": [
+        "fileSystemProvider",
+        {
+            "fileSystem": [
+                "requestFileSystem",
+                "write"
+            ]
+        },
+        "fileManagerPrivate"
+    ],
+    "file_system_provider_capabilities": {
+        "source": "device"
+    },
+    "background": {
+        "service_worker": "sw.js",
+        "type": "module"
+    }
+}
\ No newline at end of file
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/sw.js b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/sw.js
new file mode 100644
index 0000000..120fa1fc
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/sw.js
@@ -0,0 +1,7 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {serviceWorkerMain} from '/_test_resources/api_test/file_system_provider/service_worker/provider.js';
+
+serviceWorkerMain(self);
\ No newline at end of file
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/test.html b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/test.html
new file mode 100644
index 0000000..766f17d
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/test.html
@@ -0,0 +1 @@
+<script type="module" src="test.js"></script>
\ No newline at end of file
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/test.js b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/test.js
new file mode 100644
index 0000000..ee1db1ac
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/move_entry/test.js
@@ -0,0 +1,76 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {mountTestFileSystem, remoteProvider} from '/_test_resources/api_test/file_system_provider/service_worker/helpers.js';
+// For shared constants.
+import {TestFileSystemProvider} from '/_test_resources/api_test/file_system_provider/service_worker/provider.js';
+
+async function main() {
+  await navigator.serviceWorker.ready;
+  const fileSystem = await mountTestFileSystem();
+
+  const srcPath = TestFileSystemProvider.FILE_READ_SUCCESS;
+  const dstPath = srcPath + '-moved';
+  const FILE_MOVE_FAIL = 'move-fail.txt'
+
+  await remoteProvider.addFiles({
+    // Moving this file to a location which already holds a file will fail.
+    [`/${FILE_MOVE_FAIL}`]: {
+      metadata: {
+        isDirectory: false,
+        name: FILE_MOVE_FAIL,
+        modificationTime: new Date(2014, 4, 28, 10, 39, 15),
+      },
+    },
+  });
+
+  chrome.test.runTests([
+    // Move an existing file to a non-existing destination. Should succeed.
+    async function moveEntrySuccess() {
+      try {
+        const sourceEntry =
+            await fileSystem.getFileEntry(srcPath, {create: false});
+        chrome.test.assertFalse(sourceEntry.isDirectory);
+        const targetEntry = await new Promise(
+            (resolve, reject) => sourceEntry.moveTo(
+                fileSystem.fileSystem.root, dstPath, resolve, reject));
+        chrome.test.assertEq(dstPath, targetEntry.name);
+        chrome.test.assertFalse(targetEntry.isDirectory);
+        // The source file should be deleted.
+        try {
+          await fileSystem.getFileEntry(srcPath, {create: false});
+          chrome.test.fail('Source file not deleted.');
+        } catch (e) {
+          chrome.test.assertEq('NotFoundError', e.name);
+          chrome.test.succeed();
+        }
+      } catch (e) {
+        chrome.test.fail(e);
+      }
+    },
+
+    // Move an existing file to a location which already holds a file. Should
+    // fail.
+    async function moveEntryExistsError() {
+      try {
+        const sourceEntry =
+            await fileSystem.getFileEntry(FILE_MOVE_FAIL, {create: false});
+        chrome.test.assertFalse(sourceEntry.isDirectory);
+        try {
+          await new Promise(
+              (resolve, reject) => sourceEntry.moveTo(
+                  fileSystem.fileSystem.root, dstPath, resolve, reject));
+          chrome.test.fail('Succeeded, but should fail.');
+        } catch (e) {
+          chrome.test.assertEq('InvalidModificationError', e.name);
+          chrome.test.succeed();
+        }
+      } catch (e) {
+        chrome.test.fail(e);
+      }
+    },
+  ]);
+}
+
+main();
\ No newline at end of file
diff --git a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/provider.js b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/provider.js
index d8918c1a..51d33250 100644
--- a/chrome/test/data/extensions/api_test/file_system_provider/service_worker/provider.js
+++ b/chrome/test/data/extensions/api_test/file_system_provider/service_worker/provider.js
@@ -202,10 +202,12 @@
     this.setHandlerEnabled('onAbortRequested', true);
     this.setHandlerEnabled('onAddWatcherRequested', true);
     this.setHandlerEnabled('onCloseFileRequested', true);
+    this.setHandlerEnabled('onConfigureRequested', true);
     this.setHandlerEnabled('onCopyEntryRequested', true);
     this.setHandlerEnabled('onCreateFileRequested', true);
     this.setHandlerEnabled('onDeleteEntryRequested', true);
     this.setHandlerEnabled('onGetMetadataRequested', true);
+    this.setHandlerEnabled('onMoveEntryRequested', true);
     this.setHandlerEnabled('onOpenFileRequested', true);
     this.setHandlerEnabled('onReadDirectoryRequested', true);
     this.setHandlerEnabled('onReadFileRequested', true);
@@ -456,6 +458,23 @@
   };
 
   /**
+   *
+   * @param {!chrome.fileSystemProvider.ConfigureRequestedOptions} options
+   * @param {function()} onSuccess
+   * @param {function(chrome.fileSystemProvider.ProviderError)} onError Error
+   *     callback.
+   */
+  onConfigureRequested(options, onSuccess, onError) {
+    this.recordEvent('onConfigureRequested', options);
+    const error = this.testConfig['onConfigureRequestedError'];
+    if (error) {
+      onError(error);
+    } else {
+      onSuccess();
+    }
+  }
+
+  /**
    * FSP: implementation of copying an entry within the same file system.
    *
    * @param {!chrome.fileSystemProvider.CopyEntryRequestedOptions} options
@@ -594,6 +613,58 @@
   };
 
   /**
+   * FSP: implementation of moving an entry within the same file system.
+   *
+   * @param {!chrome.fileSystemProvider.MoveEntryRequestedOptions} options
+   *  Options.
+   * @param {function()} onSuccess Success callback
+   * @param {function(chrome.fileSystemProvider.ProviderError)} onError Error
+   *  callback with an error code.
+   */
+  onMoveEntryRequested(options, onSuccess, onError) {
+    if (options.fileSystemId !== this.fileSystemId) {
+      onError(chrome.fileSystemProvider.ProviderError.SECURITY);
+      return;
+    }
+
+    if (options.sourcePath === '/') {
+      onError(chrome.fileSystemProvider.ProviderError.INVALID_OPERATION);
+      return;
+    }
+
+    const source = this.findEntryByPath(options.sourcePath);
+    if (!source) {
+      onError(chrome.fileSystemProvider.ProviderError.NOT_FOUND);
+      return;
+    }
+
+    if (this.findEntryByPath(options.targetPath)) {
+      onError(chrome.fileSystemProvider.ProviderError.EXISTS);
+      return;
+    }
+
+    // Move the metadata with changing the 'name' field.
+    let {dirPath, fileName} = splitPath(options.targetPath);
+    const dir = this.findEntryByPath(dirPath);
+    if (!dir) {
+      onError(chrome.fileSystemProvider.ProviderError.NOT_FOUND);
+      return;
+    }
+    if (!dir.metadata.isDirectory) {
+      onError(chrome.fileSystemProvider.ProviderError.NOT_A_DIRECTORY);
+      return;
+    }
+    source.metadata.name = fileName;
+    dir.children[fileName] = source;
+
+    // Remove the source file.
+    ({dirPath, fileName} = splitPath(options.sourcePath));
+    delete this.findEntryByPath(dirPath).children[fileName];
+
+    onSuccess();
+  }
+
+  /**
    * Returns entries in the requested directory.
    *
    * @param {!chrome.fileSystemProvider.ReadDirectoryRequestedOptions} options
diff --git a/chrome/test/data/pdf/fullscreen_test.ts b/chrome/test/data/pdf/fullscreen_test.ts
index 3fa33f9..bf41392 100644
--- a/chrome/test/data/pdf/fullscreen_test.ts
+++ b/chrome/test/data/pdf/fullscreen_test.ts
@@ -23,6 +23,35 @@
   await eventToPromise('fullscreenchange', scroller);
 }
 
+async function enterAndExitFullscreen(): Promise<void> {
+  // Subsequent calls to requestFullScreen() fail with an "API can only be
+  // initiated by a user gesture" error, so we need to run with user
+  // gesture.
+  function enterFullscreenWithUserGesture(): Promise<void> {
+    return new Promise(res => {
+      chrome.test.runWithUserGesture(() => {
+        ensureFullscreen().then(res);
+      });
+    });
+  }
+
+  await enterFullscreenWithUserGesture();
+  document.exitFullscreen();
+  await eventToPromise('fullscreenchange', scroller);
+}
+
+async function assertEnterAndExitFullscreenWithType(fittingType: FittingType):
+    Promise<void> {
+  // Fullscreen must be exited at the start of this test in order for it to
+  // function properly.
+  chrome.test.assertTrue(document.fullscreenElement === null);
+
+  viewer.viewport.setFittingType(fittingType);
+  await enterAndExitFullscreen();
+  chrome.test.assertTrue(document.fullscreenElement === null);
+  chrome.test.assertEq(fittingType, viewer.viewport.fittingType);
+}
+
 const tests = [
   async function testFullscreen() {
     chrome.test.assertTrue(scroller !== null);
@@ -138,9 +167,6 @@
       chrome.test.succeed();
     });
   },
-  // Note: The following test needs to be the last one, because subsequent calls
-  // to requestFullScreen() fail with an "API can only be initiated by a user
-  // gesture" error.
   async function testFocusAfterExiting() {
     await ensureFullscreen();
     document.exitFullscreen();
@@ -148,6 +174,32 @@
     chrome.test.assertEq('EMBED', getDeepActiveElement()!.nodeName);
     chrome.test.succeed();
   },
+  async function testZoomAfterExiting() {
+    // Fullscreen must be exited at the start of this test in order for it to
+    // function properly.
+    chrome.test.assertTrue(document.fullscreenElement === null);
+
+    // Zoom before fullscreen should be restored after entering and exiting
+    // fullscreen.
+    viewer.viewport.setZoom(0.5);
+    await enterAndExitFullscreen();
+    chrome.test.assertEq(0.5, viewer.viewport.getZoom());
+    chrome.test.assertEq(FittingType.NONE, viewer.viewport.fittingType);
+
+    chrome.test.succeed();
+  },
+  async function testEnterAndExitFullscreenWithType_FitToPage() {
+    assertEnterAndExitFullscreenWithType(FittingType.FIT_TO_PAGE);
+    chrome.test.succeed();
+  },
+  async function testEnterAndExitFullscreenWithType_FitToWidth() {
+    assertEnterAndExitFullscreenWithType(FittingType.FIT_TO_WIDTH);
+    chrome.test.succeed();
+  },
+  async function testEnterAndExitFullscreenWithType_FitToHeight() {
+    assertEnterAndExitFullscreenWithType(FittingType.FIT_TO_HEIGHT);
+    chrome.test.succeed();
+  },
 ];
 
 chrome.test.runTests(tests);
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn
index c530c5f..bef3c3d 100644
--- a/chrome/test/data/webui/BUILD.gn
+++ b/chrome/test/data/webui/BUILD.gn
@@ -444,10 +444,7 @@
   ]
 
   if (is_chromeos_ash) {
-    in_files += [
-      "cr_focus_row_behavior_test.ts",
-      "chromeos/ash_common/list_property_update_behavior_tests.ts",
-    ]
+    in_files += [ "cr_focus_row_behavior_test.ts" ]
   }
 
   deps = [ "//ui/webui/resources:library" ]
@@ -483,7 +480,10 @@
   ]
 
   if (is_chromeos_ash) {
-    input_files += [ "chromeos/arc_account_picker/test_util.js" ]
+    input_files += [
+      "chromeos/arc_account_picker/test_util.js",
+      "chromeos/ash_common/i18n_behavior_test.js",
+    ]
   }
 
   if (enable_webui_certificate_viewer) {
@@ -609,6 +609,7 @@
   if (is_chromeos_ash) {
     input_files += [ "chromeos/test_store.js" ]
     deps += [
+      "chromeos/ash_common:build_grdp",
       "chromeos/cloud_upload:build_grdp",
       "chromeos/manage_mirrorsync:build_grdp",
       "chromeos/personalization_app:build_grdp",
@@ -619,6 +620,7 @@
       "//ui/file_manager:build_tests_grdp",
     ]
     grdp_files += [
+      "$target_gen_dir/chromeos/ash_common/resources.grdp",
       "$target_gen_dir/chromeos/cloud_upload/resources.grdp",
       "$target_gen_dir/chromeos/personalization_app/resources.grdp",
       "$target_gen_dir/chromeos/shortcut_customization/resources.grdp",
diff --git a/chrome/test/data/webui/chromeos/ash_common/BUILD.gn b/chrome/test/data/webui/chromeos/ash_common/BUILD.gn
index d93cc88..90584a2 100644
--- a/chrome/test/data/webui/chromeos/ash_common/BUILD.gn
+++ b/chrome/test/data/webui/chromeos/ash_common/BUILD.gn
@@ -3,6 +3,39 @@
 # found in the LICENSE file.
 
 import("//third_party/closure_compiler/compile_js.gni")
+import("//tools/typescript/ts_library.gni")
+import("//ui/webui/resources/tools/generate_grd.gni")
+
+ts_library("build_ts") {
+  root_dir = "."
+  out_dir = "$target_gen_dir/tsc"
+  tsconfig_base = "tsconfig_base.json"
+  path_mappings = [ "chrome://webui-test/*|" +
+                    rebase_path("$root_gen_dir/chrome/test/data/webui/tsc/*",
+                                target_gen_dir) ]
+  in_files = [
+    "cr_container_shadow_behavior_test.ts",
+    "cr_policy_indicator_behavior_tests.ts",
+    "cr_policy_strings.ts",
+    "cr_scrollable_behavior_tests.ts",
+    "list_property_update_behavior_tests.ts",
+  ]
+  deps = [
+    "../..:build_ts",
+    "//ui/webui/resources:library",
+  ]
+  extra_deps = [ "//ash/webui/common/resources:generate_definitions" ]
+}
+
+generate_grd("build_grdp") {
+  grd_prefix = "webui_chromeos_ash_common"
+  out_grd = "$target_gen_dir/resources.grdp"
+
+  deps = [ ":build_ts" ]
+  manifest_files =
+      filter_include(get_target_outputs(":build_ts"), [ "*.manifest" ])
+  resource_path_prefix = "chromeos/ash_common"
+}
 
 js_type_check("closure_compile") {
   is_polymer3 = true
diff --git a/chrome/test/data/webui/chromeos/ash_common/ash_common_resources_browsertest.js b/chrome/test/data/webui/chromeos/ash_common/ash_common_resources_browsertest.js
index bb8c23e8..c9bbc6b2c 100644
--- a/chrome/test/data/webui/chromeos/ash_common/ash_common_resources_browsertest.js
+++ b/chrome/test/data/webui/chromeos/ash_common/ash_common_resources_browsertest.js
@@ -32,3 +32,52 @@
 TEST_F('AshCommonResourcesListPropertyUpdateBehaviorTest', 'All', function() {
   mocha.run();
 });
+
+var AshCommonResourcesI18nBehaviorTest =
+    class extends AshCommonResourcesBrowserTest {
+  /** @override */
+  get browsePreload() {
+    return 'chrome://webui-test/test_loader.html?module=chromeos/ash_common/i18n_behavior_test.js';
+  }
+};
+
+TEST_F('AshCommonResourcesI18nBehaviorTest', 'All', function() {
+  mocha.run();
+});
+
+var AshCommonResourcesContainerShadowBehaviorTest =
+    class extends AshCommonResourcesBrowserTest {
+  /** @override */
+  get browsePreload() {
+    return 'chrome://webui-test/test_loader.html?module=chromeos/ash_common/cr_container_shadow_behavior_test.js';
+  }
+};
+
+TEST_F('AshCommonResourcesContainerShadowBehaviorTest', 'All', function() {
+  mocha.run();
+});
+
+
+var AshCommonResourcesPolicyIndicatorBehaviorTest =
+    class extends AshCommonResourcesBrowserTest {
+  /** @override */
+  get browsePreload() {
+    return 'chrome://webui-test/test_loader.html?module=chromeos/ash_common/cr_policy_indicator_behavior_tests.js';
+  }
+};
+
+TEST_F('AshCommonResourcesPolicyIndicatorBehaviorTest', 'All', function() {
+  mocha.run();
+});
+
+var AshCommonResourcesScrollableBehaviorTest =
+    class extends AshCommonResourcesBrowserTest {
+  /** @override */
+  get browsePreload() {
+    return 'chrome://webui-test/test_loader.html?module=chromeos/ash_common/cr_scrollable_behavior_tests.js';
+  }
+};
+
+TEST_F('AshCommonResourcesScrollableBehaviorTest', 'All', function() {
+  mocha.run();
+});
diff --git a/chrome/test/data/webui/cr_elements/cr_container_shadow_behavior_test.ts b/chrome/test/data/webui/chromeos/ash_common/cr_container_shadow_behavior_test.ts
similarity index 95%
rename from chrome/test/data/webui/cr_elements/cr_container_shadow_behavior_test.ts
rename to chrome/test/data/webui/chromeos/ash_common/cr_container_shadow_behavior_test.ts
index 1779a109..0f8401c 100644
--- a/chrome/test/data/webui/cr_elements/cr_container_shadow_behavior_test.ts
+++ b/chrome/test/data/webui/chromeos/ash_common/cr_container_shadow_behavior_test.ts
@@ -3,7 +3,7 @@
 // found in the LICENSE file.
 
 // clang-format off
-import {CrContainerShadowBehavior} from 'chrome://resources/cr_elements/cr_container_shadow_behavior.js';
+import {CrContainerShadowBehavior} from 'chrome://resources/ash/common/cr_container_shadow_behavior.js';
 import {html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
 
diff --git a/chrome/test/data/webui/cr_elements/cr_policy_indicator_behavior_tests.ts b/chrome/test/data/webui/chromeos/ash_common/cr_policy_indicator_behavior_tests.ts
similarity index 98%
rename from chrome/test/data/webui/cr_elements/cr_policy_indicator_behavior_tests.ts
rename to chrome/test/data/webui/chromeos/ash_common/cr_policy_indicator_behavior_tests.ts
index a11ba88f..733ec13 100644
--- a/chrome/test/data/webui/cr_elements/cr_policy_indicator_behavior_tests.ts
+++ b/chrome/test/data/webui/chromeos/ash_common/cr_policy_indicator_behavior_tests.ts
@@ -7,7 +7,7 @@
 // clang-format off
 import './cr_policy_strings.js';
 
-import {CrPolicyIndicatorBehavior, CrPolicyIndicatorType} from 'chrome://resources/cr_elements/policy/cr_policy_indicator_behavior.js';
+import {CrPolicyIndicatorBehavior, CrPolicyIndicatorType} from 'chrome://resources/ash/common/cr_policy_indicator_behavior.js';
 import {isChromeOS} from 'chrome://resources/js/cr.m.js';
 import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
diff --git a/chrome/test/data/webui/chromeos/ash_common/cr_policy_strings.ts b/chrome/test/data/webui/chromeos/ash_common/cr_policy_strings.ts
new file mode 100644
index 0000000..2be4e3a
--- /dev/null
+++ b/chrome/test/data/webui/chromeos/ash_common/cr_policy_strings.ts
@@ -0,0 +1,22 @@
+// Copyright 2017 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import {CrPolicyStringsType} from 'chrome://resources/cr_elements/policy/cr_policy_indicator_mixin.js';
+
+/** @fileoverview Sets up strings used by policy indicator elements. */
+export const CrPolicyStrings: CrPolicyStringsType = {
+  controlledSettingExtension: 'extension: $1',
+  controlledSettingExtensionWithoutName: 'extension',
+  controlledSettingPolicy: 'policy',
+  controlledSettingRecommendedMatches: 'matches',
+  controlledSettingRecommendedDiffers: 'differs',
+  controlledSettingShared: 'shared: $1',
+  controlledSettingWithOwner: 'owner: $1',
+  controlledSettingNoOwner: 'owner',
+  controlledSettingParent: 'parent',
+  controlledSettingChildRestriction: 'Restricted for child',
+};
+
+// Necessary for tests residing within a JS module.
+Object.assign(window, {CrPolicyStrings});
diff --git a/chrome/test/data/webui/cr_elements/cr_scrollable_behavior_tests.ts b/chrome/test/data/webui/chromeos/ash_common/cr_scrollable_behavior_tests.ts
similarity index 97%
rename from chrome/test/data/webui/cr_elements/cr_scrollable_behavior_tests.ts
rename to chrome/test/data/webui/chromeos/ash_common/cr_scrollable_behavior_tests.ts
index c29525f..e15160bb 100644
--- a/chrome/test/data/webui/cr_elements/cr_scrollable_behavior_tests.ts
+++ b/chrome/test/data/webui/chromeos/ash_common/cr_scrollable_behavior_tests.ts
@@ -5,7 +5,7 @@
 // clang-format off
 import 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
 
-import {CrScrollableBehavior} from 'chrome://resources/cr_elements/cr_scrollable_behavior.js';
+import {CrScrollableBehavior} from 'chrome://resources/ash/common/cr_scrollable_behavior.js';
 import {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-list.js';
 import {flush, html, mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
diff --git a/chrome/test/data/webui/cr_elements/i18n_behavior_test.js b/chrome/test/data/webui/chromeos/ash_common/i18n_behavior_test.js
similarity index 95%
rename from chrome/test/data/webui/cr_elements/i18n_behavior_test.js
rename to chrome/test/data/webui/chromeos/ash_common/i18n_behavior_test.js
index 559a296..b0af9d7 100644
--- a/chrome/test/data/webui/cr_elements/i18n_behavior_test.js
+++ b/chrome/test/data/webui/chromeos/ash_common/i18n_behavior_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 
 suite('I18nBehaviorModuleTest', function() {
   const allowedByDefault = '<a href="https://google.com">Google!</a>';
diff --git a/chrome/test/data/webui/chromeos/ash_common/tsconfig_base.json b/chrome/test/data/webui/chromeos/ash_common/tsconfig_base.json
new file mode 100644
index 0000000..5d3097c9
--- /dev/null
+++ b/chrome/test/data/webui/chromeos/ash_common/tsconfig_base.json
@@ -0,0 +1,10 @@
+{
+  "extends": "../../../../../../tools/typescript/tsconfig_base.json",
+  "compilerOptions": {
+    "allowJs": true,
+    "typeRoots": [
+       "./../../../../../../third_party/node/node_modules/@types"
+    ],
+    "types": ["mocha", "trusted-types"]
+  }
+}
diff --git a/chrome/test/data/webui/chromeos/diagnostics/drawing_provider_test.js b/chrome/test/data/webui/chromeos/diagnostics/drawing_provider_test.js
index 9a16475..8a7a6f6 100644
--- a/chrome/test/data/webui/chromeos/diagnostics/drawing_provider_test.js
+++ b/chrome/test/data/webui/chromeos/diagnostics/drawing_provider_test.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {CanvasDrawingProvider, DESTINATION_OVER, LINE_CAP, LINE_WIDTH, MARK_COLOR, MARK_RADIUS, TRAIL_COLOR} from 'chrome://diagnostics/drawing_provider.js';
+import {CanvasDrawingProvider, DESTINATION_OVER, LINE_CAP, LINE_WIDTH, MARK_COLOR, MARK_RADIUS, MAX_TOUCH_PRESSURE, TRAIL_COLOR, TRAIL_MAX_OPACITY} from 'chrome://diagnostics/drawing_provider.js';
 
 import {assertDeepEquals, assertEquals} from '../../chai_assert.js';
 
@@ -61,18 +61,21 @@
     const y0 = 15;
     const x1 = 20;
     const y1 = 25;
+    const pressure = 100;
     const expectedMock = [
       'beginPath',
       `moveTo:${x0}~${y0}`,
       `lineTo:${x1}~${y1}`,
       'stroke',
     ];
+    const expectedStrokeStyle = `rgba(${TRAIL_COLOR}, ${
+        TRAIL_MAX_OPACITY * (pressure / MAX_TOUCH_PRESSURE)})`;
 
     const drawingProvider = initializeDrawingProvider();
-    drawingProvider.drawTrail(x0, y0, x1, y1);
+    drawingProvider.drawTrail(x0, y0, x1, y1, pressure);
 
     assertDeepEquals(expectedMock, drawingProvider.getCtx().getMock());
-    assertEquals(TRAIL_COLOR, drawingProvider.getStrokeStyle());
+    assertEquals(expectedStrokeStyle, drawingProvider.getStrokeStyle());
   });
 
   test('TestDrawTrailMark', () => {
diff --git a/chrome/test/data/webui/chromeos/parent_access/parent_access_app_test.js b/chrome/test/data/webui/chromeos/parent_access/parent_access_app_test.js
index 3a264f90c..e9114937 100644
--- a/chrome/test/data/webui/chromeos/parent_access/parent_access_app_test.js
+++ b/chrome/test/data/webui/chromeos/parent_access/parent_access_app_test.js
@@ -6,29 +6,59 @@
 import 'chrome://parent-access/parent_access_app.js';
 
 import {Screens} from 'chrome://parent-access/parent_access_app.js';
-import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {ParentAccessParams, ParentAccessParams_FlowType, WebApprovalsParams} from 'chrome://parent-access/parent_access_ui.mojom-webui.js';
+import {setParentAccessParamsForTest} from 'chrome://parent-access/parent_access_ui_handler.js';
+import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
 
 window.parent_access_app_tests = {};
 parent_access_app_tests.suiteName = 'ParentAccessAppTest';
 
 /** @enum {string} */
 parent_access_app_tests.TestNames = {
-  TestShowAfterFlow: 'Tests that the after flow is shown',
+  TestShowWebApprovalsAfterFlow:
+      'Tests that the web approvals after flow is shown',
 };
 
-suite(parent_access_app_tests.suiteName, function() {
-  let parentAccessApp;
+function strToMojoString16(str) {
+  return {data: str.split('').map(ch => ch.charCodeAt(0))};
+}
 
+suite(parent_access_app_tests.suiteName, function() {
   setup(function() {
     PolymerTest.clearBody();
-    parentAccessApp = document.createElement('parent-access-app');
-    document.body.appendChild(parentAccessApp);
-    flush();
   });
 
-  test(parent_access_app_tests.TestNames.TestShowAfterFlow, function() {
-    assertEquals(parentAccessApp.currentScreen_, Screens.ONLINE_FLOW);
-    parentAccessApp.dispatchEvent(new CustomEvent('show-after'));
-    assertEquals(parentAccessApp.currentScreen_, Screens.AFTER_FLOW);
-  });
+  test(
+      parent_access_app_tests.TestNames.TestShowWebApprovalsAfterFlow,
+      async () => {
+        // Set up the ParentAccessParams for the web approvals flow.
+        const parentAccessParams = new ParentAccessParams();
+        parentAccessParams.flowType =
+            ParentAccessParams_FlowType.kWebsiteAccess;
+        const webApprovalsParams = new WebApprovalsParams();
+        webApprovalsParams.url = {url: 'https://testing.com'};
+        webApprovalsParams.childDisplayName = strToMojoString16('Child Name');
+        webApprovalsParams.faviconPngBytes = [];
+        parentAccessParams.flowTypeParams = {webApprovalsParams};
+        setParentAccessParamsForTest({params: parentAccessParams});
+
+        // Create app element.
+        const parentAccessApp = document.createElement('parent-access-app');
+        document.body.appendChild(parentAccessApp);
+        await flushTasks();
+
+        // Verify online flow is showing and switch to the after screen.
+        assertEquals(parentAccessApp.currentScreen_, Screens.ONLINE_FLOW);
+        parentAccessApp.dispatchEvent(new CustomEvent('show-after'));
+        await flushTasks();
+
+        // Verify after flow is showing.
+        assertEquals(parentAccessApp.currentScreen_, Screens.AFTER_FLOW);
+        // Verify the local web approvals after screen is showing.
+        const parentAccessAfter =
+            parentAccessApp.shadowRoot.querySelector('parent-access-after');
+        const webApprovalsAfter = parentAccessAfter.shadowRoot.querySelector(
+            'local-web-approvals-after');
+        assertNotEquals(null, webApprovalsAfter);
+      });
 });
diff --git a/chrome/test/data/webui/chromeos/parent_access/parent_access_browsertest.js b/chrome/test/data/webui/chromeos/parent_access/parent_access_browsertest.js
index a5797d1..8b3070c 100644
--- a/chrome/test/data/webui/chromeos/parent_access/parent_access_browsertest.js
+++ b/chrome/test/data/webui/chromeos/parent_access/parent_access_browsertest.js
@@ -23,8 +23,9 @@
   }
 };
 
-TEST_F('ParentAccessAppTest', 'TestShowAfterFlow', function() {
-  this.runMochaTest(parent_access_app_tests.TestNames.TestShowAfterFlow);
+TEST_F('ParentAccessAppTest', 'TestShowWebApprovalsAfterFlow', function() {
+  this.runMochaTest(
+      parent_access_app_tests.TestNames.TestShowWebApprovalsAfterFlow);
 });
 
 var ParentAccessControllerTest = class extends testing.Test {
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_app_test.js b/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_app_test.js
index 3422732..e5f60933 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_app_test.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_app_test.js
@@ -13,7 +13,7 @@
 import {flushTasks} from 'chrome://webui-test/polymer_test_util.js';
 
 import {assertEquals, assertFalse, assertTrue} from '../../chai_assert.js';
-import {isVisible} from '../../test_util.js';
+import {eventToPromise, isVisible} from '../../test_util.js';
 
 export function shimlessRMAAppTest() {
   /** @type {?ShimlessRma} */
@@ -795,4 +795,28 @@
     assertTrue(!!logsDialog);
     assertFalse(logsDialog.open);
   });
+
+  test('KeyboardShortcutOpensLogsDialog', async () => {
+    await initializeShimlessRMAApp(fakeStates, fakeChromeVersion[0]);
+
+    // Confirm logs dialog starts closed.
+    const logsDialog = component.shadowRoot.querySelector('#logsDialog');
+    assertTrue(!!logsDialog);
+    assertFalse(logsDialog.open);
+
+    const keydownEventPromise = eventToPromise('keydown', component);
+    component.dispatchEvent(new KeyboardEvent(
+        'keydown',
+        {
+          bubbles: true,
+          composed: true,
+          key: 'L',
+          altKey: true,
+          shiftKey: true,
+        },
+        ));
+
+    await keydownEventPromise;
+    assertTrue(logsDialog.open);
+  });
 }
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/BUILD.gn b/chrome/test/data/webui/chromeos/shortcut_customization/BUILD.gn
index 9eee6b1..b1bdc5ba 100644
--- a/chrome/test/data/webui/chromeos/shortcut_customization/BUILD.gn
+++ b/chrome/test/data/webui/chromeos/shortcut_customization/BUILD.gn
@@ -26,6 +26,7 @@
     "accelerator_subsection_test.ts",
     "accelerator_view_test.ts",
     "fake_shortcut_provider_test.ts",
+    "input_key_test.ts",
     "shortcut_customization_test.ts",
     "shortcut_customization_test_util.ts",
     "shortcut_utils_test.ts",
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/input_key_test.ts b/chrome/test/data/webui/chromeos/shortcut_customization/input_key_test.ts
new file mode 100644
index 0000000..cd9ccd8
--- /dev/null
+++ b/chrome/test/data/webui/chromeos/shortcut_customization/input_key_test.ts
@@ -0,0 +1,58 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'chrome://shortcut-customization/js/input_key.js';
+import 'chrome://webui-test/mojo_webui_test_support.js';
+
+import {IronIconElement} from '//resources/polymer/v3_0/iron-icon/iron-icon.js';
+import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
+import {InputKeyElement} from 'chrome://shortcut-customization/js/input_key.js';
+import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {isVisible} from 'chrome://webui-test/test_util.js';
+
+function initInputKeyElement(): InputKeyElement {
+  const element = document.createElement('input-key');
+  document.body.appendChild(element);
+  flush();
+  return element;
+}
+
+suite('inputKeyTest', function() {
+  let inputKeyElement: InputKeyElement|null = null;
+
+  teardown(() => {
+    if (inputKeyElement) {
+      inputKeyElement.remove();
+    }
+    inputKeyElement = null;
+  });
+
+  test('BasicKeys', async () => {
+    inputKeyElement = initInputKeyElement();
+    inputKeyElement.key = 'a';
+    await flush();
+
+    const keyElement = inputKeyElement.shadowRoot!.querySelector('#key-text');
+    assertTrue(!!keyElement);
+    assertTrue(isVisible(keyElement));
+    assertEquals('a', keyElement.textContent);
+
+    const iconElement = inputKeyElement.shadowRoot!.querySelector('#key-icon');
+    assertFalse(isVisible(iconElement));
+  });
+
+  test('IconKeys', async () => {
+    inputKeyElement = initInputKeyElement();
+    inputKeyElement.key = 'PrintScreen';
+    await flush();
+
+    const iconElement = inputKeyElement.shadowRoot!.querySelector(
+                            '#key-icon') as IronIconElement;
+    assertTrue(isVisible(iconElement));
+    assertEquals('shortcut-customization:overview', iconElement.icon);
+
+    const keyElement = inputKeyElement.shadowRoot!.querySelector('#key-text');
+    assertFalse(isVisible(keyElement));
+  });
+});
\ No newline at end of file
diff --git a/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_browsertest.js b/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_browsertest.js
index 0a83e5e13..16d14459 100644
--- a/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_browsertest.js
+++ b/chrome/test/data/webui/chromeos/shortcut_customization/shortcut_customization_browsertest.js
@@ -39,6 +39,7 @@
   ['AcceleratorEditDialogTest', 'accelerator_edit_dialog_test.js'],
   ['AcceleratorSubsectionTest', 'accelerator_subsection_test.js'],
   ['FakeShortcutProviderTest', 'fake_shortcut_provider_test.js'],
+  ['InputKeyTest', 'input_key_test.js'],
   ['ShortcutCustomizationApp', 'shortcut_customization_test.js'],
   ['ShortcutUtils', 'shortcut_utils_test.js'],
 ];
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/cr_policy_network_behavior_mojo_tests.js b/chrome/test/data/webui/cr_components/chromeos/network/cr_policy_network_behavior_mojo_tests.js
index 95efc76..b5e2f9b8 100644
--- a/chrome/test/data/webui/cr_components/chromeos/network/cr_policy_network_behavior_mojo_tests.js
+++ b/chrome/test/data/webui/cr_components/chromeos/network/cr_policy_network_behavior_mojo_tests.js
@@ -4,8 +4,8 @@
 
 /** @fileoverview Suite of tests for CrPolicyIndicatorBehavior. */
 
+import {CrPolicyIndicatorType} from 'chrome://resources/ash/common/cr_policy_indicator_behavior.js';
 import {CrPolicyNetworkBehaviorMojo} from 'chrome://resources/ash/common/network/cr_policy_network_behavior_mojo.js';
-import {CrPolicyIndicatorType} from 'chrome://resources/cr_elements/policy/cr_policy_indicator_behavior.js';
 import {PolicySource} from 'chrome://resources/mojo/chromeos/services/network_config/public/mojom/network_types.mojom-webui.js';
 import {Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
diff --git a/chrome/test/data/webui/cr_components/chromeos/traffic_counters/BUILD.gn b/chrome/test/data/webui/cr_components/chromeos/traffic_counters/BUILD.gn
index 062f8fa..d36a6894 100644
--- a/chrome/test/data/webui/cr_components/chromeos/traffic_counters/BUILD.gn
+++ b/chrome/test/data/webui/cr_components/chromeos/traffic_counters/BUILD.gn
@@ -21,6 +21,7 @@
 js_library("traffic_counters_test") {
   deps = [
     "../../..:chai_assert",
+    "//ash/webui/common/resources:i18n_behavior",
     "//ash/webui/common/resources/network:mojo_interface_provider",
     "//ash/webui/common/resources/network:onc_mojo",
     "//ash/webui/common/resources/network_health:network_health_container",
@@ -29,7 +30,6 @@
     "//chromeos/services/network_config/public/mojom:mojom_webui_js",
     "//chromeos/services/network_config/public/mojom:network_types_webui_js",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list = [ "$externs_path/mocha-2.5.js" ]
 }
diff --git a/chrome/test/data/webui/cr_elements/BUILD.gn b/chrome/test/data/webui/cr_elements/BUILD.gn
index cefacd9a..ae86822e 100644
--- a/chrome/test/data/webui/cr_elements/BUILD.gn
+++ b/chrome/test/data/webui/cr_elements/BUILD.gn
@@ -55,7 +55,6 @@
   "cr_tree_test.ts",
   "cr_view_manager_test.ts",
   "find_shortcut_mixin_test.ts",
-  "i18n_behavior_test.js",
   "i18n_mixin_test.ts",
   "iron_list_focus_test.ts",
   "list_property_update_mixin_tests.ts",
@@ -63,12 +62,7 @@
 ]
 
 if (is_chromeos_ash) {
-  non_preprocessed_files += [
-    "cr_container_shadow_behavior_test.ts",
-    "cr_policy_indicator_behavior_tests.ts",
-    "cr_scrollable_behavior_tests.ts",
-    "cr_searchable_drop_down_tests.ts",
-  ]
+  non_preprocessed_files += [ "cr_searchable_drop_down_tests.ts" ]
 }
 
 preprocessed_folder = "$target_gen_dir/preprocessed"
diff --git a/chrome/test/data/webui/cr_elements/cr_elements_browsertest.js b/chrome/test/data/webui/cr_elements/cr_elements_browsertest.js
index 3aaa4fbf..541b441 100644
--- a/chrome/test/data/webui/cr_elements/cr_elements_browsertest.js
+++ b/chrome/test/data/webui/cr_elements/cr_elements_browsertest.js
@@ -47,20 +47,6 @@
   mocha.run();
 });
 
-GEN('#if BUILDFLAG(IS_CHROMEOS_ASH)');
-var CrElementsContainerShadowBehaviorTest =
-    class extends CrElementsBrowserTest {
-  /** @override */
-  get browsePreload() {
-    return 'chrome://webui-test/test_loader.html?module=cr_elements/cr_container_shadow_behavior_test.js';
-  }
-};
-
-TEST_F('CrElementsContainerShadowBehaviorTest', 'All', function() {
-  mocha.run();
-});
-GEN('#endif');
-
 var CrElementsContainerShadowMixinTest = class extends CrElementsBrowserTest {
   /** @override */
   get browsePreload() {
@@ -146,17 +132,6 @@
   mocha.run();
 });
 
-var CrElementsI18nBehaviorTest = class extends CrElementsBrowserTest {
-  /** @override */
-  get browsePreload() {
-    return 'chrome://webui-test/test_loader.html?module=cr_elements/i18n_behavior_test.js';
-  }
-};
-
-TEST_F('CrElementsI18nBehaviorTest', 'All', function() {
-  mocha.run();
-});
-
 var CrElementsI18nMixinTest = class extends CrElementsBrowserTest {
   /** @override */
   get browsePreload() {
@@ -247,19 +222,6 @@
   mocha.run();
 });
 
-GEN('#if BUILDFLAG(IS_CHROMEOS_ASH)');
-var CrElementsScrollableBehaviorTest = class extends CrElementsBrowserTest {
-  /** @override */
-  get browsePreload() {
-    return 'chrome://webui-test/test_loader.html?module=cr_elements/cr_scrollable_behavior_tests.js';
-  }
-};
-
-TEST_F('CrElementsScrollableBehaviorTest', 'All', function() {
-  mocha.run();
-});
-GEN('#endif');
-
 var CrElementsScrollableMixinTest = class extends CrElementsBrowserTest {
   /** @override */
   get browsePreload() {
@@ -373,20 +335,6 @@
   mocha.run();
 });
 
-GEN('#if BUILDFLAG(IS_CHROMEOS_ASH)');
-var CrElementsPolicyIndicatorBehaviorTest =
-    class extends CrElementsBrowserTest {
-  /** @override */
-  get browsePreload() {
-    return 'chrome://webui-test/test_loader.html?module=cr_elements/cr_policy_indicator_behavior_tests.js';
-  }
-};
-
-TEST_F('CrElementsPolicyIndicatorBehaviorTest', 'All', function() {
-  mocha.run();
-});
-GEN('#endif');
-
 var CrElementsPolicyIndicatorMixinTest = class extends CrElementsBrowserTest {
   /** @override */
   get browsePreload() {
diff --git a/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js b/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
index 3fa519e..3476cace 100644
--- a/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
+++ b/chrome/test/data/webui/settings/chromeos/os_about_page_tests.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-import {CrPolicyIndicatorType} from '//resources/cr_elements/policy/cr_policy_indicator_behavior.js';
+import {CrPolicyIndicatorType} from '//resources/ash/common/cr_policy_indicator_behavior.js';
 import {AboutPageBrowserProxyImpl, BrowserChannel, DeviceNameBrowserProxyImpl, DeviceNameState, LifetimeBrowserProxyImpl, Router, routes, SetDeviceNameResult, UpdateStatus} from 'chrome://os-settings/chromeos/os_settings.js';
 import {webUIListenerCallback} from 'chrome://resources/js/cr.m.js';
 import {PromiseResolver} from 'chrome://resources/js/promise_resolver.js';
diff --git a/chromecast/media/cma/backend/mixer/mixer_input.cc b/chromecast/media/cma/backend/mixer/mixer_input.cc
index 67dcc5a..6233606 100644
--- a/chromecast/media/cma/backend/mixer/mixer_input.cc
+++ b/chromecast/media/cma/backend/mixer/mixer_input.cc
@@ -146,6 +146,7 @@
     filter_group_tag_ = filter_group->tag();
 
     prerender_pipeline_ = filter_group->CreatePrerenderPipeline(num_channels_);
+    playout_channel_ = source_->playout_channel();
 
     AudioPostProcessor2::Config config;
     config.output_sample_rate = output_samples_per_second_;
@@ -154,23 +155,13 @@
     config.output_frames_per_write = filter_group->input_frames_per_write();
     CHECK(prerender_pipeline_->SetOutputConfig(config));
     prerender_pipeline_->SetContentType(content_type_);
-    prerender_pipeline_->UpdatePlayoutChannel(source_->playout_channel());
+    prerender_pipeline_->UpdatePlayoutChannel(playout_channel_);
     DCHECK_EQ(prerender_pipeline_->GetInputSampleRate(),
               output_samples_per_second_);
     DCHECK_EQ(prerender_pipeline_->NumOutputChannels(), num_channels_);
     prerender_delay_seconds_ = prerender_pipeline_->GetDelaySeconds();
 
-    int effective_channels = num_channels_;
-    ::media::ChannelLayout channel_layout = channel_layout_;
-    const int playout_channel = source_->playout_channel();
-    if (playout_channel != kChannelAll && playout_channel < num_channels_) {
-      effective_channels = 1;
-      channel_layout = ::media::CHANNEL_LAYOUT_MONO;
-    }
-    channel_mixer_ = std::make_unique<InterleavedChannelMixer>(
-        channel_layout, effective_channels,
-        mixer::GuessChannelLayout(filter_group->num_channels()),
-        filter_group->num_channels(), filter_group->input_frames_per_write());
+    CreateChannelMixer(playout_channel_, filter_group);
   }
   filter_group_ = filter_group;
   return (filter_group != nullptr);
@@ -181,6 +172,20 @@
   prerender_pipeline_->SetPostProcessorConfig(name, config);
 }
 
+void MixerInput::CreateChannelMixer(int playout_channel,
+                                    FilterGroup* filter_group) {
+  int effective_channels = num_channels_;
+  ::media::ChannelLayout channel_layout = channel_layout_;
+  if (playout_channel != kChannelAll && playout_channel < num_channels_) {
+    effective_channels = 1;
+    channel_layout = ::media::CHANNEL_LAYOUT_MONO;
+  }
+  channel_mixer_ = std::make_unique<InterleavedChannelMixer>(
+      channel_layout, effective_channels,
+      mixer::GuessChannelLayout(filter_group->num_channels()),
+      filter_group->num_channels(), filter_group->input_frames_per_write());
+}
+
 void MixerInput::AddAudioOutputRedirector(
     AudioOutputRedirectorInput* redirector) {
   AUDIO_LOG(INFO) << "Add redirector to " << device_id_ << "(" << source_
@@ -240,6 +245,13 @@
                            num_output_frames, num_channels_,
                            interleaved_.data());
 
+  const int playout_channel = source_->playout_channel();
+  if (playout_channel != playout_channel_) {
+    prerender_pipeline_->UpdatePlayoutChannel(playout_channel);
+    CreateChannelMixer(playout_channel, filter_group_);
+    playout_channel_ = playout_channel;
+  }
+
   const bool is_silence = (filled == 0);
   prerender_pipeline_->ProcessFrames(interleaved_.data(), num_output_frames,
                                      InstantaneousVolume(), TargetVolume(),
@@ -257,12 +269,12 @@
   // bother doing channel selection since the result would be the same as
   // doing nothing anyway.
   float* data = prerender_pipeline_->GetOutputBuffer();
-  const int playout_channel = source_->playout_channel();
-  if (playout_channel != kChannelAll && playout_channel < num_channels_) {
+
+  if (playout_channel_ != kChannelAll && playout_channel_ < num_channels_) {
     // Keep only the samples from the selected channel.
     float* dest = interleaved_.data();
     for (int f = 0; f < num_output_frames; ++f) {
-      dest[f] = data[f * num_channels_ + playout_channel];
+      dest[f] = data[f * num_channels_ + playout_channel_];
     }
     data = dest;
   }
diff --git a/chromecast/media/cma/backend/mixer/mixer_input.h b/chromecast/media/cma/backend/mixer/mixer_input.h
index d3a0835c..01508fe 100644
--- a/chromecast/media/cma/backend/mixer/mixer_input.h
+++ b/chromecast/media/cma/backend/mixer/mixer_input.h
@@ -183,6 +183,7 @@
 
  private:
   bool SetFilterGroupInternal(FilterGroup* filter_group);
+  void CreateChannelMixer(int playout_channel, FilterGroup* filter_group);
   // Reads data from the source. Returns the number of frames actually filled
   // (<= |num_frames|).
   int FillAudioData(int num_frames,
@@ -204,6 +205,7 @@
   const std::string device_id_;
   const AudioContentType content_type_;
   int source_read_size_ = 0;
+  int playout_channel_ = 0;
 
   FilterGroup* filter_group_ = nullptr;
   scoped_refptr<FilterGroupTag> filter_group_tag_;
diff --git a/chromeos/ash/components/disks/DIR_METADATA b/chromeos/ash/components/disks/DIR_METADATA
index 5b8d7cd..e9400b87 100644
--- a/chromeos/ash/components/disks/DIR_METADATA
+++ b/chromeos/ash/components/disks/DIR_METADATA
@@ -1,3 +1 @@
-monorail {
-  component: "Platform>Apps>FileManager"
-}
+mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chromeos/ash/components/drivefs/DIR_METADATA b/chromeos/ash/components/drivefs/DIR_METADATA
index 5b8d7cd..e9400b87 100644
--- a/chromeos/ash/components/drivefs/DIR_METADATA
+++ b/chromeos/ash/components/drivefs/DIR_METADATA
@@ -1,3 +1 @@
-monorail {
-  component: "Platform>Apps>FileManager"
-}
+mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chromeos/ash/components/smbfs/DIR_METADATA b/chromeos/ash/components/smbfs/DIR_METADATA
index 5b8d7cd..e9400b87 100644
--- a/chromeos/ash/components/smbfs/DIR_METADATA
+++ b/chromeos/ash/components/smbfs/DIR_METADATA
@@ -1,3 +1 @@
-monorail {
-  component: "Platform>Apps>FileManager"
-}
+mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/chromeos/ash/services/libassistant/libassistant_loader_impl_unittest.cc b/chromeos/ash/services/libassistant/libassistant_loader_impl_unittest.cc
index d13381b..d551669 100644
--- a/chromeos/ash/services/libassistant/libassistant_loader_impl_unittest.cc
+++ b/chromeos/ash/services/libassistant/libassistant_loader_impl_unittest.cc
@@ -57,24 +57,25 @@
   EXPECT_TRUE(loader);
 
   // Should fail without dlcservice client.
-  base::RunLoop run_loop;
+  base::RunLoop run_loop1;
   loader->Load(base::BindOnce(
       [](base::RunLoop* run_loop, bool success) {
         EXPECT_FALSE(success);
         run_loop->Quit();
       },
-      &run_loop));
-  run_loop.Run();
+      &run_loop1));
+  run_loop1.Run();
 
   // Should success with dlcservice client.
+  base::RunLoop run_loop2;
   DlcserviceClient::InitializeFake();
   loader->Load(base::BindOnce(
       [](base::RunLoop* run_loop, bool success) {
         EXPECT_TRUE(success);
         run_loop->Quit();
       },
-      &run_loop));
-  run_loop.Run();
+      &run_loop2));
+  run_loop2.Run();
   DlcserviceClient::Shutdown();
 }
 
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn
index 565039d6..dd36057 100644
--- a/components/autofill/core/browser/BUILD.gn
+++ b/components/autofill/core/browser/BUILD.gn
@@ -195,6 +195,8 @@
     "form_parsing/merchant_promo_code_field.h",
     "form_parsing/name_field.cc",
     "form_parsing/name_field.h",
+    "form_parsing/numeric_quantity_field.cc",
+    "form_parsing/numeric_quantity_field.h",
     "form_parsing/phone_field.cc",
     "form_parsing/phone_field.h",
     "form_parsing/price_field.cc",
@@ -841,6 +843,7 @@
     "form_parsing/iban_field_unittest.cc",
     "form_parsing/merchant_promo_code_field_unittest.cc",
     "form_parsing/name_field_unittest.cc",
+    "form_parsing/numeric_quantity_field_unittest.cc",
     "form_parsing/parsing_test_utils.cc",
     "form_parsing/parsing_test_utils.h",
     "form_parsing/phone_field_unittest.cc",
diff --git a/components/autofill/core/browser/autofill_field.cc b/components/autofill/core/browser/autofill_field.cc
index 5db7dd7e..2c24430 100644
--- a/components/autofill/core/browser/autofill_field.cc
+++ b/components/autofill/core/browser/autofill_field.cc
@@ -204,6 +204,16 @@
     // predictions get precedence over the server predictions.
     believe_server = believe_server && (heuristic_type() != IBAN_VALUE);
 
+    // The numeric quanity heuristic should get granted precedence over the
+    // server prediction since it tries to catch false-positive server
+    // predictions.
+    believe_server =
+        believe_server &&
+        !(heuristic_type() == NUMERIC_QUANTITY &&
+          server_type() != UNKNOWN_TYPE &&
+          base::FeatureList::IsEnabled(
+              features::kAutofillGivePrecedenceToNumericQuantitites));
+
     if (believe_server)
       return AutofillType(server_type());
   }
diff --git a/components/autofill/core/browser/autofill_type.cc b/components/autofill/core/browser/autofill_type.cc
index 12ba1841..9210bee 100644
--- a/components/autofill/core/browser/autofill_type.cc
+++ b/components/autofill/core/browser/autofill_type.cc
@@ -116,6 +116,7 @@
 
     case PRICE:
     case SEARCH_TERM:
+    case NUMERIC_QUANTITY:
       return FieldTypeGroup::kUnfillable;
 
     case UNKNOWN_TYPE:
diff --git a/components/autofill/core/browser/field_types.cc b/components/autofill/core/browser/field_types.cc
index 92392e0e..bfbdf55 100644
--- a/components/autofill/core/browser/field_types.cc
+++ b/components/autofill/core/browser/field_types.cc
@@ -141,6 +141,7 @@
     case FIELD_WITH_DEFAULT_VALUE:
     case MERCHANT_EMAIL_SIGNUP:
     case PRICE:
+    case NUMERIC_QUANTITY:
     case SEARCH_TERM:
     case BIRTHDATE_DAY:
     case BIRTHDATE_MONTH:
@@ -293,6 +294,8 @@
       return "SEARCH_TERM";
     case PRICE:
       return "PRICE";
+    case NUMERIC_QUANTITY:
+      return "NUMERIC_QUANTITY";
     case NOT_PASSWORD:
       return "NOT_PASSWORD";
     case SINGLE_USERNAME:
diff --git a/components/autofill/core/browser/field_types.h b/components/autofill/core/browser/field_types.h
index 332c19b..7c26d70d 100644
--- a/components/autofill/core/browser/field_types.h
+++ b/components/autofill/core/browser/field_types.h
@@ -348,11 +348,16 @@
 
   // Reserved for a server-side-only use: 127
 
+  // Type of a field that asks for a numeric quantity. Not fillable by Autofill.
+  // The purpose is to ignore false positive server classification for numeric
+  // types that a prone to false-positive votes.
+  NUMERIC_QUANTITY = 128,
+
   // No new types can be added without a corresponding change to the Autofill
   // server.
   // Please update enum `AutofillServerFieldType` in
   // `tools/metrics/histogram/enums.xml` for metrics tracking.
-  MAX_VALID_FIELD_TYPE = 128,
+  MAX_VALID_FIELD_TYPE = 129,
 };
 
 enum class FieldTypeGroup {
diff --git a/components/autofill/core/browser/field_types_unittest.cc b/components/autofill/core/browser/field_types_unittest.cc
index 7b194dad..a29050d 100644
--- a/components/autofill/core/browser/field_types_unittest.cc
+++ b/components/autofill/core/browser/field_types_unittest.cc
@@ -92,6 +92,7 @@
       BIRTHDATE_DAY,
       BIRTHDATE_MONTH,
       BIRTHDATE_4_DIGIT_YEAR,
+      NUMERIC_QUANTITY,
   };
   ServerFieldType kInvalidValue = static_cast<ServerFieldType>(123456);
   ASSERT_FALSE(kValidFieldTypes.count(kInvalidValue));
diff --git a/components/autofill/core/browser/form_parsing/address_field.cc b/components/autofill/core/browser/form_parsing/address_field.cc
index 6fc42efe..1415214 100644
--- a/components/autofill/core/browser/form_parsing/address_field.cc
+++ b/components/autofill/core/browser/form_parsing/address_field.cc
@@ -11,7 +11,6 @@
 #include <utility>
 
 #include "base/check.h"
-#include "base/strings/string_util.h"
 #include "components/autofill/core/browser/autofill_field.h"
 #include "components/autofill/core/browser/field_types.h"
 #include "components/autofill/core/browser/form_parsing/autofill_scanner.h"
diff --git a/components/autofill/core/browser/form_parsing/form_field.cc b/components/autofill/core/browser/form_parsing/form_field.cc
index 9a3bfe9..7e89349 100644
--- a/components/autofill/core/browser/form_parsing/form_field.cc
+++ b/components/autofill/core/browser/form_parsing/form_field.cc
@@ -28,14 +28,15 @@
 #include "components/autofill/core/browser/form_parsing/iban_field.h"
 #include "components/autofill/core/browser/form_parsing/merchant_promo_code_field.h"
 #include "components/autofill/core/browser/form_parsing/name_field.h"
+#include "components/autofill/core/browser/form_parsing/numeric_quantity_field.h"
 #include "components/autofill/core/browser/form_parsing/phone_field.h"
 #include "components/autofill/core/browser/form_parsing/price_field.h"
 #include "components/autofill/core/browser/form_parsing/search_field.h"
 #include "components/autofill/core/browser/form_parsing/standalone_cvc_field.h"
 #include "components/autofill/core/browser/form_parsing/travel_field.h"
-#include "components/autofill/core/common/autocomplete_parsing_util.h"
 #include "components/autofill/core/browser/form_structure.h"
 #include "components/autofill/core/browser/logging/log_manager.h"
+#include "components/autofill/core/common/autocomplete_parsing_util.h"
 #include "components/autofill/core/common/autofill_constants.h"
 #include "components/autofill/core/common/autofill_features.h"
 #include "components/autofill/core/common/autofill_internals/log_message.h"
@@ -104,6 +105,11 @@
                         log_manager);
   }
 
+  // Numeric quantity pass.
+  ParseFormFieldsPass(NumericQuantityField::Parse, processed_fields,
+                      field_candidates, page_language, pattern_source,
+                      log_manager);
+
   // Credit card pass.
   ParseFormFieldsPass(CreditCardField::Parse, processed_fields,
                       field_candidates, page_language, pattern_source,
diff --git a/components/autofill/core/browser/form_parsing/form_field.h b/components/autofill/core/browser/form_parsing/form_field.h
index 4d15cf3..962308ce 100644
--- a/components/autofill/core/browser/form_parsing/form_field.h
+++ b/components/autofill/core/browser/form_parsing/form_field.h
@@ -105,6 +105,7 @@
   static constexpr float kBaseNameParserScore = 0.9f;
   static constexpr float kBaseMerchantPromoCodeParserScore = 0.85f;
   static constexpr float kBaseSearchParserScore = 0.8f;
+  static constexpr float kBaseNumericQuantityParserScore = 0.75f;
   static constexpr float kBaseAutocompleteParserScore = 0.05f;
 
   // Only derived classes may instantiate.
diff --git a/components/autofill/core/browser/form_parsing/form_field_unittest.cc b/components/autofill/core/browser/form_parsing/form_field_unittest.cc
index c3997d1..dd0be09 100644
--- a/components/autofill/core/browser/form_parsing/form_field_unittest.cc
+++ b/components/autofill/core/browser/form_parsing/form_field_unittest.cc
@@ -10,7 +10,6 @@
 #include "base/test/scoped_feature_list.h"
 #include "components/autofill/core/browser/autofill_field.h"
 #include "components/autofill/core/browser/form_parsing/autofill_scanner.h"
-#include "components/autofill/core/browser/form_parsing/buildflags.h"
 #include "components/autofill/core/browser/form_parsing/form_field.h"
 #include "components/autofill/core/browser/form_parsing/parsing_test_utils.h"
 #include "components/autofill/core/browser/form_structure.h"
diff --git a/components/autofill/core/browser/form_parsing/numeric_quantity_field.cc b/components/autofill/core/browser/form_parsing/numeric_quantity_field.cc
new file mode 100644
index 0000000..54a0592
--- /dev/null
+++ b/components/autofill/core/browser/form_parsing/numeric_quantity_field.cc
@@ -0,0 +1,45 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/autofill/core/browser/form_parsing/numeric_quantity_field.h"
+
+#include "components/autofill/core/browser/autofill_field.h"
+#include "components/autofill/core/browser/form_parsing/autofill_scanner.h"
+#include "components/autofill/core/browser/form_parsing/regex_patterns.h"
+#include "components/autofill/core/common/autofill_regex_constants.h"
+
+namespace autofill {
+
+// static
+std::unique_ptr<FormField> NumericQuantityField::Parse(
+    AutofillScanner* scanner,
+    const LanguageCode& page_language,
+    PatternSource pattern_source,
+    LogManager* log_manager) {
+  AutofillField* field;
+  base::span<const MatchPatternRef> quantity_patterns =
+      GetMatchPatterns("NUMERIC_QUANTITY", page_language, pattern_source);
+
+  if (ParseFieldSpecifics(
+          scanner, kNumericQuantityRe,
+          kDefaultMatchParamsWith<
+              MatchFieldType::kNumber, MatchFieldType::kSelect,
+              MatchFieldType::kTextArea, MatchFieldType::kSearch>,
+          quantity_patterns, &field, {log_manager, "kNumericQuantityRe"})) {
+    return base::WrapUnique(new NumericQuantityField(field));
+  }
+
+  return nullptr;
+}
+
+NumericQuantityField::NumericQuantityField(const AutofillField* field)
+    : field_(field) {}
+
+void NumericQuantityField::AddClassifications(
+    FieldCandidatesMap& field_candidates) const {
+  AddClassification(field_, NUMERIC_QUANTITY, kBaseNumericQuantityParserScore,
+                    field_candidates);
+}
+
+}  // namespace autofill
diff --git a/components/autofill/core/browser/form_parsing/numeric_quantity_field.h b/components/autofill/core/browser/form_parsing/numeric_quantity_field.h
new file mode 100644
index 0000000..d70241d
--- /dev/null
+++ b/components/autofill/core/browser/form_parsing/numeric_quantity_field.h
@@ -0,0 +1,42 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_PARSING_NUMERIC_QUANTITY_FIELD_H_
+#define COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_PARSING_NUMERIC_QUANTITY_FIELD_H_
+
+#include <memory>
+
+#include "base/memory/raw_ptr.h"
+#include "components/autofill/core/browser/form_parsing/form_field.h"
+#include "components/autofill/core/common/language_code.h"
+
+namespace autofill {
+
+class AutofillField;
+class AutofillScanner;
+class LogManager;
+
+// Numeric quantities that are not eligible to be filled by Autofill.
+class NumericQuantityField : public FormField {
+ public:
+  static std::unique_ptr<FormField> Parse(AutofillScanner* scanner,
+                                          const LanguageCode& page_language,
+                                          PatternSource pattern_source,
+                                          LogManager* log_manager);
+
+  NumericQuantityField(const NumericQuantityField&) = delete;
+  NumericQuantityField& operator=(const NumericQuantityField&) = delete;
+
+ protected:
+  void AddClassifications(FieldCandidatesMap& field_candidates) const override;
+
+ private:
+  explicit NumericQuantityField(const AutofillField* field);
+
+  raw_ptr<const AutofillField> field_;
+};
+
+}  // namespace autofill
+
+#endif  // COMPONENTS_AUTOFILL_CORE_BROWSER_FORM_PARSING_NUMERIC_QUANTITY_FIELD_H_
diff --git a/components/autofill/core/browser/form_parsing/numeric_quantity_field_unittest.cc b/components/autofill/core/browser/form_parsing/numeric_quantity_field_unittest.cc
new file mode 100644
index 0000000..dca79c6
--- /dev/null
+++ b/components/autofill/core/browser/form_parsing/numeric_quantity_field_unittest.cc
@@ -0,0 +1,46 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/autofill/core/browser/form_parsing/numeric_quantity_field.h"
+
+#include "components/autofill/core/browser/form_parsing/parsing_test_utils.h"
+
+namespace autofill {
+
+class NumericQuantityFieldTest
+    : public FormFieldTestBase,
+      public testing::TestWithParam<PatternProviderFeatureState> {
+ public:
+  explicit NumericQuantityFieldTest() : FormFieldTestBase(GetParam()) {}
+  NumericQuantityFieldTest(const NumericQuantityFieldTest&) = delete;
+  NumericQuantityFieldTest& operator=(const NumericQuantityFieldTest&) = delete;
+
+ protected:
+  std::unique_ptr<FormField> Parse(
+      AutofillScanner* scanner,
+      const LanguageCode& page_language = LanguageCode("en")) override {
+    return NumericQuantityField::Parse(scanner, page_language,
+                                       GetActivePatternSource(),
+                                       /*log_manager=*/nullptr);
+  }
+};
+
+INSTANTIATE_TEST_SUITE_P(
+    NumericQuantityFieldTest,
+    NumericQuantityFieldTest,
+    ::testing::ValuesIn(PatternProviderFeatureState::All()));
+
+TEST_P(NumericQuantityFieldTest, ParseNumericQuantity) {
+  AddTextFormFieldData("quantity", "quantity", NUMERIC_QUANTITY);
+
+  ClassifyAndVerify(ParseResult::PARSED);
+}
+
+TEST_P(NumericQuantityFieldTest, ParseNonNumericQuantity) {
+  AddTextFormFieldData("name", "Name", UNKNOWN_TYPE);
+
+  ClassifyAndVerify(ParseResult::NOT_PARSED);
+}
+
+}  // namespace autofill
diff --git a/components/autofill/core/browser/form_parsing/resources/legacy_regex_patterns.json b/components/autofill/core/browser/form_parsing/resources/legacy_regex_patterns.json
index eab373e..d5c4b67 100644
--- a/components/autofill/core/browser/form_parsing/resources/legacy_regex_patterns.json
+++ b/components/autofill/core/browser/form_parsing/resources/legacy_regex_patterns.json
@@ -1298,6 +1298,18 @@
       }
     ]
   },
+  "NUMERIC_QUANTITY": {
+    "en": [
+      {
+        "pattern_identifier": "en_numeric_quantity_preserving",
+        "positive_pattern": "size|height|quantity|length|amount",
+        "positive_score": 0.95,
+        "negative_pattern": null,
+        "match_field_attributes": ["LABEL", "NAME"],
+        "match_field_input_types": ["TEXT", "SELECT", "TEXT_AREA", "NUMBER", "SEARCH"]
+      }
+    ]
+   },
   "PRICE": {
     "en": [
       {
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc
index 3864abe8..1a75b6b8 100644
--- a/components/autofill/core/browser/form_structure.cc
+++ b/components/autofill/core/browser/form_structure.cc
@@ -1007,6 +1007,33 @@
     const ServerFieldTypeSet& field_types = field->possible_types();
     DCHECK(!field_types.empty());
 
+    // For every field that has a heuristics prediction for a
+    // NUMERIC_QUANTITY, log if there was a colliding server
+    // prediction and if the NUMERIC_QUANTITY was a false-positive prediction.
+    // The latter is true when the field was correctly filled. This can
+    // only be recorded when the feature to grant precedence to
+    // NUMERIC_QUANTITY predictions is disabled.
+    if (observed_submission && field->heuristic_type() == NUMERIC_QUANTITY) {
+      bool field_has_non_empty_server_prediction =
+          field->server_type() != UNKNOWN_TYPE &&
+          field->server_type() != NO_SERVER_DATA;
+
+      // Log if there was a colliding server prediction.
+      AutofillMetrics::LogNumericQuantityCollidesWithServerPrediction(
+          field_has_non_empty_server_prediction);
+
+      // If there was a collision, log if the NUMERIC_QUANTITY was a false
+      // positive since the field was correctly filled.
+      if ((field->is_autofilled || field->previously_autofilled()) &&
+          field_has_non_empty_server_prediction &&
+          !base::FeatureList::IsEnabled(
+              features::kAutofillGivePrecedenceToNumericQuantitites)) {
+        AutofillMetrics::
+            LogAcceptedFilledFieldWithNumericQuantityHeuristicPrediction(
+                !field->previously_autofilled());
+      }
+    }
+
     if (field_types.count(EMPTY_TYPE) || field_types.count(UNKNOWN_TYPE)) {
       DCHECK_EQ(field_types.size(), 1u);
       continue;
diff --git a/components/autofill/core/browser/metrics/autofill_metrics.cc b/components/autofill/core/browser/metrics/autofill_metrics.cc
index e97984e0..c24d1a49 100644
--- a/components/autofill/core/browser/metrics/autofill_metrics.cc
+++ b/components/autofill/core/browser/metrics/autofill_metrics.cc
@@ -363,6 +363,7 @@
         case AMBIGUOUS_TYPE:
         case SEARCH_TERM:
         case PRICE:
+        case NUMERIC_QUANTITY:
         case NOT_PASSWORD:
         case SINGLE_USERNAME:
         case NOT_USERNAME:
@@ -3241,4 +3242,20 @@
   return result_suffix;
 }
 
+// // static
+void AutofillMetrics::LogNumericQuantityCollidesWithServerPrediction(
+    bool collision) {
+  base::UmaHistogramBoolean(
+      "Autofill.NumericQuantityCollidesWithServerPrediction", collision);
+}
+
+// static
+void AutofillMetrics::
+    LogAcceptedFilledFieldWithNumericQuantityHeuristicPrediction(
+        bool accepted) {
+  base::UmaHistogramBoolean(
+      "Autofill.AcceptedFilledFieldWithNumericQuantityHeuristicPrediction",
+      accepted);
+}
+
 }  // namespace autofill
diff --git a/components/autofill/core/browser/metrics/autofill_metrics.h b/components/autofill/core/browser/metrics/autofill_metrics.h
index 3a31e41..f6140ff 100644
--- a/components/autofill/core/browser/metrics/autofill_metrics.h
+++ b/components/autofill/core/browser/metrics/autofill_metrics.h
@@ -1755,6 +1755,16 @@
       ServerFieldType server_type,
       ServerFieldType heuristic_types);
 
+  // Logs whether a heuristic detection for an NUMERIC_QUANTITY collides with a
+  // server prediction.
+  static void LogNumericQuantityCollidesWithServerPrediction(bool collision);
+
+  // Logs if the filling of a field was accepted even though it had a
+  // NUMERIC_QUANTITY. This metric is only emitted if the feature to grant the
+  // heuristic precedence is disabled.
+  static void LogAcceptedFilledFieldWithNumericQuantityHeuristicPrediction(
+      bool accepted);
+
  private:
   static void Log(AutocompleteEvent event);
 };
diff --git a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
index c813e22..81f70df2 100644
--- a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
+++ b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
@@ -648,6 +648,78 @@
       BucketsAre(test_case.credit_card_buckets));
 }
 
+// Test the emission of collisions between NUMERIC_QUANTITY and server
+// predictions as well as the potential false positives.
+TEST_F(AutofillMetricsTest, NumericQuantityCollision) {
+  // Those metrics are only collected when the numeric quantities are not
+  // getting precedence over server predictions.
+  base::test::ScopedFeatureList numeric_quanity_feature_list;
+  numeric_quanity_feature_list.InitAndDisableFeature(
+      features::kAutofillGivePrecedenceToNumericQuantitites);
+
+  // Set up our form data.
+  test::FormDescription form_description = {
+      .description_for_logging = "AutofilledStateFieldSource",
+      .fields = {{.server_type = NO_SERVER_DATA,
+                  .heuristic_type = NUMERIC_QUANTITY,
+                  .is_autofilled = false},
+                 // We add a second field to make sure the metrics are only
+                 // recorded for the field with the numeric quantity prediction.
+                 {.server_type = ADDRESS_HOME_LINE1,
+                  .heuristic_type = ADDRESS_HOME_LINE1,
+                  .is_autofilled = false}}};
+
+  // Helper to submit the `form` and test the expectations. `collision`
+  // indicates that there was a collision between the NUMERIC_QUANTITY
+  // prediction and a server prediction.
+  // If `autofill_used` and a `collision` exists, the histogram to
+  // track `false_positive` is checked.
+  auto SubmitAndTest = [this](const FormData& form, bool collision,
+                              bool autofill_used, bool false_positive) {
+    base::HistogramTester histogram_tester;
+    SubmitForm(form);
+    histogram_tester.ExpectUniqueSample(
+        "Autofill.NumericQuantityCollidesWithServerPrediction", collision, 1);
+    if (collision && autofill_used) {
+      histogram_tester.ExpectUniqueSample(
+          "Autofill.AcceptedFilledFieldWithNumericQuantityHeuristicPrediction",
+          false_positive, 1);
+    }
+  };
+
+  {
+    SCOPED_TRACE(
+        "No collision case - The numeric quanity does not collide with a "
+        "server prediction.");
+    FormData form = GetAndAddSeenForm(form_description);
+    SubmitAndTest(form, /*collision=*/false, /*autofill_used=*/false,
+                  /*false_positive=*/false);
+  }
+  {
+    SCOPED_TRACE("Collision, but nothing is filled.");
+    // Add a server prediction to create a collision.
+    form_description.fields[0].server_type = NAME_FIRST;
+    FormData form = GetAndAddSeenForm(form_description);
+    SubmitAndTest(form, /*collision=*/true, /*autofill_used=*/false,
+                  /*false_positive=*/false);
+  }
+  {
+    SCOPED_TRACE("Collision, the field is autofilled.");
+    form_description.fields[0].is_autofilled = true;
+    FormData form = GetAndAddSeenForm(form_description);
+    SubmitAndTest(form, /*collision=*/true, /*autofill_used=*/true,
+                  /*false_positive=*/true);
+  }
+  {
+    SCOPED_TRACE(
+        "Collision, the field is autofilled and subsequently changed.");
+    FormData form = GetAndAddSeenForm(form_description);
+    SimulateUserChangedTextField(form, form.fields[0]);
+    SubmitAndTest(form, /*collision=*/true, /*autofill_used=*/true,
+                  /*false_positive=*/false);
+  }
+}
+
 // Test that we log quality metrics appropriately.
 TEST_F(AutofillMetricsTest, QualityMetrics) {
   // Set up our form data.
diff --git a/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc b/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc
index 1929b17d..b2dc979 100644
--- a/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc
+++ b/components/autofill/core/browser/metrics/shadow_prediction_metrics_unittest.cc
@@ -96,8 +96,7 @@
   // If this test fails after adding a type, update
   // `AutofillPredictionsComparisonResult` in tools/metrics/histograms/enums.xml
   // and set `last_known_type` to the last entry in the enum.
-  constexpr ServerFieldType last_known_type =
-      CREDIT_CARD_STANDALONE_VERIFICATION_CODE;
+  constexpr ServerFieldType last_known_type = NUMERIC_QUANTITY;
   int max_comparison =
       GetShadowPrediction(last_known_type, NAME_FIRST, {NAME_LAST});
 
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc
index 35366806..b7f68aa 100644
--- a/components/autofill/core/common/autofill_features.cc
+++ b/components/autofill/core/common/autofill_features.cc
@@ -63,6 +63,12 @@
              "AutofillAddressProfileSavePromptAddressVerificationSupport",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+// Use the heuristic parser to detected unfillable numeric types in field labels
+// and grant the heuristic precedence over non-override server predictions.
+BASE_FEATURE(kAutofillGivePrecedenceToNumericQuantitites,
+             "AutofillGivePrecedenceToNumericQuantitites",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // TODO(crbug.com/1135188): Remove this feature flag after the explicit save
 // prompts for address profiles is complete.
 // When enabled, address profile save problem will contain a dropdown for
@@ -320,7 +326,7 @@
 // TODO(crbug.com/1314360): Remove once launched.
 BASE_FEATURE(kAutofillRefillModifiedCreditCardExpirationDates,
              "AutofillRefillModifiedCreditCardExpirationDates",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Enables autofill to function within a FencedFrame, and is disabled by
 // default.
@@ -459,7 +465,7 @@
 // TODO(crbug.com/1326425): Remove once feature is lanuched.
 BASE_FEATURE(kAutofillRationalizeStreetAddressAndAddressLine,
              "AutofillRationalizeStreetAddressAndAddressLine",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // Removes setting-inaccessible field types from existing profiles on startup.
 // TODO(crbug.com/1300548): Cleanup when launched.
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h
index e5b3f084..305216ad 100644
--- a/components/autofill/core/common/autofill_features.h
+++ b/components/autofill/core/common/autofill_features.h
@@ -39,6 +39,8 @@
 BASE_DECLARE_FEATURE(
     kAutofillAddressProfileSavePromptAddressVerificationSupport);
 COMPONENT_EXPORT(AUTOFILL)
+BASE_DECLARE_FEATURE(kAutofillGivePrecedenceToNumericQuantitites);
+COMPONENT_EXPORT(AUTOFILL)
 BASE_DECLARE_FEATURE(kAutofillAddressProfileSavePromptNicknameSupport);
 COMPONENT_EXPORT(AUTOFILL)
 BASE_DECLARE_FEATURE(kAutofillAllowDuplicateFormSubmissions);
diff --git a/components/autofill/core/common/autofill_payments_features.cc b/components/autofill/core/common/autofill_payments_features.cc
index 3944aa05..e753b428 100644
--- a/components/autofill/core/common/autofill_payments_features.cc
+++ b/components/autofill/core/common/autofill_payments_features.cc
@@ -198,7 +198,7 @@
 // fields when parsing forms.
 BASE_FEATURE(kAutofillParseMerchantPromoCodeFields,
              "AutofillParseMerchantPromoCodeFields",
-             base::FEATURE_DISABLED_BY_DEFAULT);
+             base::FEATURE_ENABLED_BY_DEFAULT);
 
 // When enabled, Autofill will attempt to find standalone CVC fields for VCN
 // card on file when parsing forms.
diff --git a/components/autofill/core/common/autofill_regex_constants.h b/components/autofill/core/common/autofill_regex_constants.h
index 0d71910..3c9870b 100644
--- a/components/autofill/core/common/autofill_regex_constants.h
+++ b/components/autofill/core/common/autofill_regex_constants.h
@@ -206,6 +206,12 @@
     u"|\\bprix\\b|\\bcoût\\b|\\bcout\\b|\\btarif\\b";  // fr-CA
 
 /////////////////////////////////////////////////////////////////////////////
+// numeric_quanitity.cc
+/////////////////////////////////////////////////////////////////////////////
+inline constexpr char16_t kNumericQuantityRe[] =
+    u"size|height|quantity|length|amount";
+
+/////////////////////////////////////////////////////////////////////////////
 // credit_card_field.cc
 /////////////////////////////////////////////////////////////////////////////
 inline constexpr char16_t kNameOnCardRe[] =
diff --git a/components/autofill_assistant/browser/service.proto b/components/autofill_assistant/browser/service.proto
index ca714516..23fe10c0 100644
--- a/components/autofill_assistant/browser/service.proto
+++ b/components/autofill_assistant/browser/service.proto
@@ -1624,8 +1624,6 @@
     optional SelectorProto.SemanticFilter semantic_filter = 4;
     // The element's backend node id.
     optional int32 backend_node_id = 3;
-    // Whether this element was found using a feature override.
-    optional bool used_override = 5;
 
     reserved 1, 2;
   }
diff --git a/components/autofill_assistant/browser/web/element_finder.cc b/components/autofill_assistant/browser/web/element_finder.cc
index 6c59879b2..a5e7ca8 100644
--- a/components/autofill_assistant/browser/web/element_finder.cc
+++ b/components/autofill_assistant/browser/web/element_finder.cc
@@ -123,7 +123,7 @@
 
   if (selector_.proto.filters_size() > 1) {
     // The semantic filter was only the root, there are more filters to run.
-    // Log and retain the current result and start a CSS lookup from here.
+    // Log and retain teh current result and start a CSS lookup from here.
     UpdateLogInfo(status);
     current_result_ = std::move(result);
 
diff --git a/components/autofill_assistant/browser/web/semantic_element_finder.cc b/components/autofill_assistant/browser/web/semantic_element_finder.cc
index 546d41a..726b5b55 100644
--- a/components/autofill_assistant/browser/web/semantic_element_finder.cc
+++ b/components/autofill_assistant/browser/web/semantic_element_finder.cc
@@ -21,7 +21,6 @@
 #include "content/public/browser/global_routing_id.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/web_contents.h"
-#include "element.h"
 
 namespace autofill_assistant {
 
@@ -75,7 +74,7 @@
   SendResult(status, ElementFinderResult::EmptyResult());
 }
 
-void SemanticElementFinder::ResultFound(const SemanticNodeResult& node,
+void SemanticElementFinder::ResultFound(const GlobalBackendNodeId& node_id,
                                         const std::string& object_id,
                                         const std::string& devtools_frame_id) {
   if (!callback_) {
@@ -83,10 +82,10 @@
   }
 
   ElementFinderResult result;
-  result.SetRenderFrameHostGlobalId(node.id.host_id());
+  result.SetRenderFrameHostGlobalId(node_id.host_id());
   result.SetObjectId(object_id);
   result.SetNodeFrameId(devtools_frame_id);
-  result.SetBackendNodeId(node.id.backend_node_id());
+  result.SetBackendNodeId(node_id.backend_node_id());
 
   SendResult(OkClientStatus(), result);
 }
@@ -121,15 +120,13 @@
     auto* predicted_element =
         info.mutable_semantic_inference_result()->add_predicted_elements();
     predicted_element->set_backend_node_id(
-        semantic_node_result.id.backend_node_id());
+        semantic_node_result.backend_node_id());
     *predicted_element->mutable_semantic_filter() = filter_;
     // TODO(b/217160707): For the ignore_objective case this is not correct
     // and the inferred objective should be returned from the Agent and used
     // here.
-    if (semantic_node_result.used_override) {
-      predicted_element->set_used_override(semantic_node_result.used_override);
-    }
   }
+
   return info;
 }
 
@@ -159,6 +156,7 @@
 }
 
 void SemanticElementFinder::OnTimeout() {
+  VLOG(1) << "AnnotateDomModel timeout.";
   Finalize();
 }
 
@@ -196,22 +194,20 @@
 
   node_data_frame_status_.emplace_back(status);
 
-  std::vector<SemanticNodeResult> results;
+  std::vector<GlobalBackendNodeId> node_ids;
   for (const auto& node : node_data) {
-    SemanticNodeResult node_result;
-    node_result.id = GlobalBackendNodeId(host_id, node.backend_node_id);
-    node_result.used_override = node.used_override;
-    results.emplace_back(node_result);
+    node_ids.emplace_back(GlobalBackendNodeId(host_id, node.backend_node_id));
   }
-  received_results_.emplace(host_id, std::move(results));
+
+  received_results_.emplace(host_id, std::move(node_ids));
 
   MarkRenderFrameProcessed(host_id);
 }
 
 void SemanticElementFinder::OnRunAnnotateDomModel() {
-  for (const auto& [backend_id, results] : received_results_) {
-    semantic_node_results_.insert(semantic_node_results_.end(), results.begin(),
-                                  results.end());
+  for (const auto& [backend_id, node_ids] : received_results_) {
+    semantic_node_results_.insert(semantic_node_results_.end(),
+                                  node_ids.begin(), node_ids.end());
   }
 
   // For now we only support finding a single element.
@@ -242,7 +238,7 @@
   // not have a session id in our |DevtoolsClient|).
   std::string devtools_frame_id;
   auto* frame =
-      content::RenderFrameHost::FromID(semantic_node_result.id.host_id());
+      content::RenderFrameHost::FromID(semantic_node_result.host_id());
   if (frame != nullptr && frame->IsRenderFrameLive() &&
       web_contents_->GetPrimaryMainFrame()->GetProcess() !=
           frame->GetProcess()) {
@@ -253,7 +249,7 @@
 
   devtools_client_->GetDOM()->ResolveNode(
       dom::ResolveNodeParams::Builder()
-          .SetBackendNodeId(semantic_node_result.id.backend_node_id())
+          .SetBackendNodeId(semantic_node_result.backend_node_id())
           .Build(),
       devtools_frame_id,
       base::BindOnce(&SemanticElementFinder::OnResolveNodeForAnnotateDom,
@@ -262,7 +258,7 @@
 }
 
 void SemanticElementFinder::OnResolveNodeForAnnotateDom(
-    const SemanticNodeResult& node,
+    const GlobalBackendNodeId& node,
     const std::string& devtools_frame_id,
     const DevtoolsClient::ReplyStatus& reply_status,
     std::unique_ptr<dom::ResolveNodeResult> result) {
diff --git a/components/autofill_assistant/browser/web/semantic_element_finder.h b/components/autofill_assistant/browser/web/semantic_element_finder.h
index a54d68d9..d558be94 100644
--- a/components/autofill_assistant/browser/web/semantic_element_finder.h
+++ b/components/autofill_assistant/browser/web/semantic_element_finder.h
@@ -36,11 +36,6 @@
 class SemanticElementFinder : public BaseElementFinder,
                               public content::WebContentsObserver {
  public:
-  struct SemanticNodeResult {
-    GlobalBackendNodeId id = GlobalBackendNodeId(nullptr, -1);
-    bool used_override = false;
-  };
-
   SemanticElementFinder(content::WebContents* web_contents,
                         DevtoolsClient* devtools_client,
                         AnnotateDomModelService* annotate_dom_model_service,
@@ -64,7 +59,7 @@
 
   // Builds a result from the provided information and returns it with an
   // ok status.
-  void ResultFound(const SemanticNodeResult& node_id,
+  void ResultFound(const GlobalBackendNodeId& node_id,
                    const std::string& object_id,
                    const std::string& devtools_frame_id);
 
@@ -89,7 +84,7 @@
   void OnRunAnnotateDomModel();
 
   void OnResolveNodeForAnnotateDom(
-      const SemanticNodeResult& node,
+      const GlobalBackendNodeId& node,
       const std::string& devtools_frame_id,
       const DevtoolsClient::ReplyStatus& reply_status,
       std::unique_ptr<dom::ResolveNodeResult> result);
@@ -116,11 +111,11 @@
 
   // Elements gathered through all frames. Unused if the |selector_| does not
   // contain |SemanticInformation|.
-  std::vector<SemanticNodeResult> semantic_node_results_;
+  std::vector<GlobalBackendNodeId> semantic_node_results_;
   std::vector<mojom::NodeDataStatus> node_data_frame_status_;
 
   std::set<content::GlobalRenderFrameHostId> expected_frame_ids_;
-  std::map<content::GlobalRenderFrameHostId, std::vector<SemanticNodeResult>>
+  std::map<content::GlobalRenderFrameHostId, std::vector<GlobalBackendNodeId>>
       received_results_;
 
   std::unique_ptr<base::OneShotTimer> timer_ = nullptr;
diff --git a/components/autofill_assistant/browser/web/semantic_element_finder_browsertest.cc b/components/autofill_assistant/browser/web/semantic_element_finder_browsertest.cc
index 18937ea1..bbacd796 100644
--- a/components/autofill_assistant/browser/web/semantic_element_finder_browsertest.cc
+++ b/components/autofill_assistant/browser/web/semantic_element_finder_browsertest.cc
@@ -328,15 +328,6 @@
   ClientStatus status = RunWaitForDom(action_proto, /* use_observers= */ false,
                                       run_expectations.Get());
   EXPECT_EQ(status.proto_status(), ACTION_APPLIED);
-
-  ASSERT_EQ(log_info_.element_finder_info().size(), 1);
-  const auto& result =
-      log_info_.element_finder_info(0).semantic_inference_result();
-  ASSERT_EQ(1, result.predicted_elements().size());
-  EXPECT_EQ(backend_node_id, result.predicted_elements(0).backend_node_id());
-  EXPECT_THAT(1, result.predicted_elements(0).semantic_filter().role());
-  EXPECT_THAT(2, result.predicted_elements(0).semantic_filter().objective());
-  EXPECT_FALSE(result.predicted_elements(0).used_override());
 }
 
 IN_PROC_BROWSER_TEST_F(SemanticElementFinderBrowserTest,
@@ -825,56 +816,4 @@
   EXPECT_EQ(option_status.proto_status(), TIMED_OUT);
 }
 
-#if BUILDFLAG(IS_ANDROID)
-IN_PROC_BROWSER_TEST_F(SemanticElementFinderBrowserTest,
-                       WaitForDomForSemanticElementWithOverride) {
-  // This element is unique.
-  SelectorProto baseline_selector = ToSelectorProto("#select");
-
-  ClientStatus element_status;
-  int backend_node_id =
-      GetBackendNodeId(Selector(baseline_selector), &element_status);
-  EXPECT_TRUE(element_status.ok());
-
-  NodeData node_data;
-  node_data.backend_node_id = backend_node_id;
-  node_data.used_override = true;
-  EXPECT_CALL(autofill_assistant_agent_,
-              GetSemanticNodes(1, 2, false, base::Milliseconds(5000), _))
-      .WillOnce(RunOnceCallback<4>(mojom::NodeDataStatus::kSuccess,
-                                   std::vector<NodeData>{node_data}))
-      // Capture any other frames.
-      .WillRepeatedly(RunOnceCallback<4>(
-          mojom::NodeDataStatus::kUnexpectedError, std::vector<NodeData>()));
-
-  ActionProto action_proto;
-  auto* wait_for_dom = action_proto.mutable_wait_for_dom();
-  auto* condition = wait_for_dom->mutable_wait_condition();
-  condition->mutable_client_id()->set_identifier("e");
-  condition->set_require_unique_element(true);
-  auto* semantic_filter =
-      condition->mutable_match()->add_filters()->mutable_semantic();
-  semantic_filter->set_role(1);
-  semantic_filter->set_objective(2);
-
-  base::MockCallback<base::OnceCallback<void(ScriptExecutor*)>>
-      run_expectations;
-  EXPECT_CALL(run_expectations, Run(_))
-      .WillOnce([](ScriptExecutor* script_executor) {
-        EXPECT_TRUE(script_executor->GetElementStore()->HasElement("e"));
-      });
-  ClientStatus status = RunWaitForDom(action_proto, /* use_observers= */ false,
-                                      run_expectations.Get());
-  EXPECT_EQ(status.proto_status(), ACTION_APPLIED);
-  ASSERT_EQ(log_info_.element_finder_info().size(), 1);
-  const auto& result =
-      log_info_.element_finder_info(0).semantic_inference_result();
-  ASSERT_EQ(1, result.predicted_elements().size());
-  EXPECT_EQ(backend_node_id, result.predicted_elements(0).backend_node_id());
-  EXPECT_THAT(1, result.predicted_elements(0).semantic_filter().role());
-  EXPECT_THAT(2, result.predicted_elements(0).semantic_filter().objective());
-  EXPECT_TRUE(result.predicted_elements(0).used_override());
-}
-#endif
-
 }  // namespace autofill_assistant
diff --git a/components/autofill_assistant/content/browser/content_autofill_assistant_driver.cc b/components/autofill_assistant/content/browser/content_autofill_assistant_driver.cc
index 1ecfb916..2aaf5a6 100644
--- a/components/autofill_assistant/content/browser/content_autofill_assistant_driver.cc
+++ b/components/autofill_assistant/content/browser/content_autofill_assistant_driver.cc
@@ -7,6 +7,7 @@
 #include "base/files/file.h"
 #include "base/guid.h"
 #include "base/location.h"
+#include "base/logging.h"
 #include "components/autofill_assistant/content/common/proto/semantic_feature_overrides.pb.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
@@ -34,6 +35,7 @@
         pending_receiver,
     content::RenderFrameHost* render_frame_host) {
   DCHECK(render_frame_host);
+
   auto* driver = ContentAutofillAssistantDriver::GetOrCreateForCurrentDocument(
       render_frame_host);
   if (driver) {
@@ -76,6 +78,7 @@
     base::TimeDelta timeout,
     GetAnnotateDomModelCallback callback) {
   if (!annotate_dom_model_service_) {
+    LOG(ERROR) << "No model service";
     std::move(callback).Run(mojom::ModelStatus::kUnexpectedError, base::File(),
                             /*overrides_policy=*/"");
     return;
@@ -128,6 +131,7 @@
   if (it == pending_calls_.end()) {
     return;
   }
+
   DCHECK(it->second->callback_);
   std::move(it->second->callback_)
       .Run(model_status, std::move(model_file), GetOverridesPolicy());
@@ -136,13 +140,12 @@
 
 void ContentAutofillAssistantDriver::SetAnnotateDomModelService(
     AnnotateDomModelService* annotate_dom_model_service) {
+  DCHECK(annotate_dom_model_service);
   annotate_dom_model_service_ = annotate_dom_model_service;
 }
 
 std::string ContentAutofillAssistantDriver::GetOverridesPolicy() const {
-  if (!annotate_dom_model_service_) {
-    return "";
-  }
+  DCHECK(annotate_dom_model_service_);
   return annotate_dom_model_service_->GetOverridesPolicy();
 }
 
diff --git a/components/autofill_assistant/content/common/autofill_assistant_types.mojom b/components/autofill_assistant/content/common/autofill_assistant_types.mojom
index 0f594cf..38b4d90 100644
--- a/components/autofill_assistant/content/common/autofill_assistant_types.mojom
+++ b/components/autofill_assistant/content/common/autofill_assistant_types.mojom
@@ -24,7 +24,4 @@
 struct NodeData {
   // The BackendNodeId of this element.
   int32 backend_node_id;
-
-  // Whether an override was used.
-  bool used_override;
 };
diff --git a/components/autofill_assistant/content/common/autofill_assistant_types_mojom_traits.cc b/components/autofill_assistant/content/common/autofill_assistant_types_mojom_traits.cc
index 7aa16daa..07a9348 100644
--- a/components/autofill_assistant/content/common/autofill_assistant_types_mojom_traits.cc
+++ b/components/autofill_assistant/content/common/autofill_assistant_types_mojom_traits.cc
@@ -14,7 +14,6 @@
     Read(autofill_assistant::mojom::NodeDataDataView data,
          autofill_assistant::NodeData* out) {
   out->backend_node_id = data.backend_node_id();
-  out->used_override = data.used_override();
   return true;
 }
 
diff --git a/components/autofill_assistant/content/common/autofill_assistant_types_mojom_traits.h b/components/autofill_assistant/content/common/autofill_assistant_types_mojom_traits.h
index 70b25a5..874b764 100644
--- a/components/autofill_assistant/content/common/autofill_assistant_types_mojom_traits.h
+++ b/components/autofill_assistant/content/common/autofill_assistant_types_mojom_traits.h
@@ -20,10 +20,6 @@
     return r.backend_node_id;
   }
 
-  static bool used_override(const autofill_assistant::NodeData& r) {
-    return r.used_override;
-  }
-
   static bool Read(autofill_assistant::mojom::NodeDataDataView data,
                    autofill_assistant::NodeData* out);
 };
diff --git a/components/autofill_assistant/content/common/node_data.h b/components/autofill_assistant/content/common/node_data.h
index 1b827fc..b0cec1e 100644
--- a/components/autofill_assistant/content/common/node_data.h
+++ b/components/autofill_assistant/content/common/node_data.h
@@ -18,7 +18,6 @@
   ~NodeData();
 
   int32_t backend_node_id;
-  bool used_override;
 };
 
 }  // namespace autofill_assistant
diff --git a/components/autofill_assistant/content/renderer/BUILD.gn b/components/autofill_assistant/content/renderer/BUILD.gn
index a5fa3cd..81035a9c 100644
--- a/components/autofill_assistant/content/renderer/BUILD.gn
+++ b/components/autofill_assistant/content/renderer/BUILD.gn
@@ -13,7 +13,8 @@
   sources = [
     "autofill_assistant_agent.cc",
     "autofill_assistant_agent.h",
-    "autofill_assistant_model_executor_result.h",
+    "autofill_assistant_agent_debug_utils.cc",
+    "autofill_assistant_agent_debug_utils.h",
   ]
 
   deps = [
@@ -33,8 +34,6 @@
 
   if (build_with_tflite_lib) {
     sources += [
-      "autofill_assistant_agent_debug_utils.cc",
-      "autofill_assistant_agent_debug_utils.h",
       "autofill_assistant_model_executor.cc",
       "autofill_assistant_model_executor.h",
     ]
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_agent.cc b/components/autofill_assistant/content/renderer/autofill_assistant_agent.cc
index 67ef6cd8a..7d0d7590 100644
--- a/components/autofill_assistant/content/renderer/autofill_assistant_agent.cc
+++ b/components/autofill_assistant/content/renderer/autofill_assistant_agent.cc
@@ -22,7 +22,6 @@
 
 #if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
 #include "components/autofill_assistant/content/common/proto/semantic_feature_overrides.pb.h"
-#include "components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils.h"
 #include "components/autofill_assistant/content/renderer/autofill_assistant_model_executor.h"
 #endif  // BUILDFLAG(BUILD_WITH_TFLITE_LIB)
 
@@ -87,10 +86,8 @@
     std::string jsonEncodedSemanticEnums =
         base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII(
             autofill_assistant::switches::kAutofillAssistantDebugAnnotateDom);
-#if BUILDFLAG(BUILD_WITH_TFLITE_LIB)
     semantic_labels =
         DecodeSemanticPredictionLabelsJson(jsonEncodedSemanticEnums);
-#endif
   }
 }
 
@@ -222,11 +219,10 @@
       }
     }
 
-    if (result && result->role == role &&
-        (result->objective == objective || ignore_objective)) {
+    if (result && result->first == role &&
+        (result->second == objective || ignore_objective)) {
       NodeData node_data;
       node_data.backend_node_id = node_signal.backend_node_id;
-      node_data.used_override = result->used_override;
       nodes.push_back(node_data);
     }
   }
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_agent.h b/components/autofill_assistant/content/renderer/autofill_assistant_agent.h
index b1e4044..06962af8 100644
--- a/components/autofill_assistant/content/renderer/autofill_assistant_agent.h
+++ b/components/autofill_assistant/content/renderer/autofill_assistant_agent.h
@@ -12,6 +12,7 @@
 #include "components/autofill_assistant/content/common/autofill_assistant_agent.mojom.h"
 #include "components/autofill_assistant/content/common/autofill_assistant_driver.mojom.h"
 #include "components/autofill_assistant/content/common/node_data.h"
+#include "components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils.h"
 #include "content/public/renderer/render_frame_observer.h"
 #include "mojo/public/cpp/bindings/associated_receiver.h"
 #include "mojo/public/cpp/bindings/associated_remote.h"
@@ -82,9 +83,6 @@
                            const std::u16string& value,
                            bool send_events);
 
-  using SemanticPredictionLabelMap = base::flat_map<int, std::string>;
-  using SemanticLabelsPair =
-      std::pair<SemanticPredictionLabelMap, SemanticPredictionLabelMap>;
   SemanticLabelsPair semantic_labels;
 
   mojo::AssociatedRemote<mojom::AutofillAssistantDriver> driver_;
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_agent_browsertest.cc b/components/autofill_assistant/content/renderer/autofill_assistant_agent_browsertest.cc
index 8357414..a548d57 100644
--- a/components/autofill_assistant/content/renderer/autofill_assistant_agent_browsertest.cc
+++ b/components/autofill_assistant/content/renderer/autofill_assistant_agent_browsertest.cc
@@ -18,7 +18,6 @@
 #include "content/public/renderer/render_frame.h"
 #include "content/public/test/render_view_test.h"
 #include "mojo/public/cpp/bindings/associated_receiver_set.h"
-#include "testing/gmock/include/gmock/gmock-matchers.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h"
@@ -33,7 +32,6 @@
 
 using ::base::test::RunOnceCallback;
 using ::testing::_;
-using ::testing::Field;
 using ::testing::SizeIs;
 
 constexpr int kDummySemanticRole = 9999;
@@ -109,9 +107,7 @@
   base::MockCallback<base::OnceCallback<void(mojom::NodeDataStatus,
                                              const std::vector<NodeData>&)>>
       callback;
-  EXPECT_CALL(callback,
-              Run(mojom::NodeDataStatus::kSuccess,
-                  ElementsAre(Field(&NodeData::used_override, false))));
+  EXPECT_CALL(callback, Run(mojom::NodeDataStatus::kSuccess, SizeIs(1)));
 
   LoadHTML(R"(
     <div>
@@ -295,9 +291,7 @@
   base::MockCallback<base::OnceCallback<void(mojom::NodeDataStatus,
                                              const std::vector<NodeData>&)>>
       callback;
-  EXPECT_CALL(callback,
-              Run(mojom::NodeDataStatus::kSuccess,
-                  ElementsAre(Field(&NodeData::used_override, true))));
+  EXPECT_CALL(callback, Run(mojom::NodeDataStatus::kSuccess, SizeIs(1)));
 
   autofill_assistant_agent_->GetSemanticNodes(
       kDummySemanticRole, kDummyObjective,
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils.cc b/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils.cc
index ee30af96..2144f16 100644
--- a/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils.cc
+++ b/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils.cc
@@ -86,30 +86,27 @@
 std::u16string SemanticPredictionResultToDebugString(
     SemanticPredictionLabelMap roles,
     SemanticPredictionLabelMap objectives,
-    const ModelExecutorResult& result,
+    const std::pair<int, int>& result,
     bool ignore_objective) {
-  int role = result.role;
-  int objective = result.objective;
   if (!roles.empty() || !objectives.empty()) {
     std::string result_label =
-        roles.contains(role) ? roles.at(role)
-                             : "(missing-label) " + base::NumberToString(role);
+        roles.contains(result.first)
+            ? roles.at(result.first)
+            : "(missing-label) " + base::NumberToString(result.first);
     std::string objective_label =
-        objectives.contains(objective)
-            ? objectives.at(objective)
-            : "(missing-label) " + base::NumberToString(objective);
+        objectives.contains(result.second)
+            ? objectives.at(result.second)
+            : "(missing-label) " + base::NumberToString(result.second);
     return base::StrCat(
         {u"{role: ", std::u16string(result_label.begin(), result_label.end()),
          u", objective: ",
          std::u16string(objective_label.begin(), objective_label.end()),
-         (ignore_objective ? u"(ignored)}" : u"}"),
-         (result.used_override ? u"[override]" : u"")});
+         (ignore_objective ? u"(ignored)}" : u"}")});
   }
 
-  return base::StrCat({u"{role: ", base::NumberToString16(role),
-                       u", objective: ", base::NumberToString16(objective),
-                       (ignore_objective ? u"(ignored)}" : u"}"),
-                       (result.used_override ? u"[override]" : u"")});
+  return base::StrCat({u"{role: ", base::NumberToString16(result.first),
+                       u", objective: ", base::NumberToString16(result.second),
+                       (ignore_objective ? u"(ignored)}" : u"}")});
 }
 
 }  // namespace autofill_assistant
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils.h b/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils.h
index 1ef8ac6..df96538 100644
--- a/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils.h
+++ b/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils.h
@@ -8,7 +8,6 @@
 #include <string>
 
 #include "base/containers/flat_map.h"
-#include "components/autofill_assistant/content/renderer/autofill_assistant_model_executor_result.h"
 #include "third_party/blink/public/web/modules/autofill_assistant/node_signals.h"
 
 namespace autofill_assistant {
@@ -34,7 +33,7 @@
 std::u16string SemanticPredictionResultToDebugString(
     SemanticPredictionLabelMap roles,
     SemanticPredictionLabelMap objectives,
-    const ModelExecutorResult& result,
+    const std::pair<int, int>& result,
     bool ignore_objective);
 
 }  // namespace autofill_assistant
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils_unittest.cc b/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils_unittest.cc
index 6c5d8cd1..f32b6808 100644
--- a/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils_unittest.cc
+++ b/components/autofill_assistant/content/renderer/autofill_assistant_agent_debug_utils_unittest.cc
@@ -11,11 +11,7 @@
 namespace autofill_assistant {
 namespace {
 
-class SemanticLabelsJsonParsingTest : public ::testing::Test {
- protected:
-  ModelExecutorResult model_executor_result_ =
-      ModelExecutorResult(47, 7, false);
-};
+using SemanticLabelsJsonParsingTest = ::testing::Test;
 
 TEST_F(SemanticLabelsJsonParsingTest, ValidJson) {
   std::string json_input = R"({
@@ -32,27 +28,7 @@
   SemanticLabelsPair labels = DecodeSemanticPredictionLabelsJson(base64_json);
 
   std::u16string debug_string = SemanticPredictionResultToDebugString(
-      labels.first, labels.second, model_executor_result_, false);
-  EXPECT_EQ(debug_string,
-            std::u16string(expected_output.begin(), expected_output.end()));
-}
-
-TEST_F(SemanticLabelsJsonParsingTest, UseOverrideField) {
-  std::string json_input = R"({
-      "roles": [{"id": 47, "name": "ADDRESS_LINE1"}],
-      "objectives": [{"id": 7, "name": "FILL_DELIVERY_ADDRESS"}]
-    })";
-  std::string expected_output =
-      "{role: ADDRESS_LINE1, objective: FILL_DELIVERY_ADDRESS}[override]";
-
-  // Encode the JSON and add it to the debug DOM annotations switch
-  std::string base64_json;
-  base::Base64Encode(json_input, &base64_json);
-
-  SemanticLabelsPair labels = DecodeSemanticPredictionLabelsJson(base64_json);
-
-  std::u16string debug_string = SemanticPredictionResultToDebugString(
-      labels.first, labels.second, ModelExecutorResult(47, 7, true), false);
+      labels.first, labels.second, {47, 7}, false);
   EXPECT_EQ(debug_string,
             std::u16string(expected_output.begin(), expected_output.end()));
 }
@@ -78,7 +54,7 @@
   SemanticLabelsPair labels = DecodeSemanticPredictionLabelsJson(base64_json);
 
   std::u16string debug_string = SemanticPredictionResultToDebugString(
-      labels.first, labels.second, model_executor_result_, false);
+      labels.first, labels.second, {47, 7}, false);
   EXPECT_EQ(debug_string,
             std::u16string(expected_output.begin(), expected_output.end()));
 }
@@ -94,7 +70,7 @@
   SemanticLabelsPair labels = DecodeSemanticPredictionLabelsJson(base64_json);
 
   std::u16string debug_string = SemanticPredictionResultToDebugString(
-      labels.first, labels.second, model_executor_result_, false);
+      labels.first, labels.second, {47, 7}, false);
   EXPECT_EQ(debug_string,
             std::u16string(expected_output.begin(), expected_output.end()));
 }
@@ -114,7 +90,7 @@
   SemanticLabelsPair labels = DecodeSemanticPredictionLabelsJson(base64_json);
 
   std::u16string debug_string = SemanticPredictionResultToDebugString(
-      labels.first, labels.second, model_executor_result_, false);
+      labels.first, labels.second, {47, 7}, false);
   EXPECT_EQ(debug_string,
             std::u16string(expected_output.begin(), expected_output.end()));
 }
@@ -134,7 +110,7 @@
   SemanticLabelsPair labels = DecodeSemanticPredictionLabelsJson(base64_json);
 
   std::u16string debug_string = SemanticPredictionResultToDebugString(
-      labels.first, labels.second, model_executor_result_, false);
+      labels.first, labels.second, {47, 7}, false);
   EXPECT_EQ(debug_string,
             std::u16string(expected_output.begin(), expected_output.end()));
 }
@@ -153,7 +129,7 @@
   SemanticLabelsPair labels = DecodeSemanticPredictionLabelsJson(base64_json);
 
   std::u16string debug_string = SemanticPredictionResultToDebugString(
-      labels.first, labels.second, model_executor_result_, false);
+      labels.first, labels.second, {47, 7}, false);
   EXPECT_EQ(debug_string,
             std::u16string(expected_output.begin(), expected_output.end()));
 }
@@ -173,7 +149,7 @@
   SemanticLabelsPair labels = DecodeSemanticPredictionLabelsJson(base64_json);
 
   std::u16string debug_string = SemanticPredictionResultToDebugString(
-      labels.first, labels.second, model_executor_result_, false);
+      labels.first, labels.second, {47, 7}, false);
   EXPECT_EQ(debug_string,
             std::u16string(expected_output.begin(), expected_output.end()));
 }
@@ -193,7 +169,7 @@
   SemanticLabelsPair labels = DecodeSemanticPredictionLabelsJson(base64_json);
 
   std::u16string debug_string = SemanticPredictionResultToDebugString(
-      labels.first, labels.second, model_executor_result_, false);
+      labels.first, labels.second, {47, 7}, false);
   EXPECT_EQ(debug_string,
             std::u16string(expected_output.begin(), expected_output.end()));
 }
@@ -209,7 +185,7 @@
   SemanticLabelsPair labels = DecodeSemanticPredictionLabelsJson(base64_json);
 
   std::u16string debug_string = SemanticPredictionResultToDebugString(
-      labels.first, labels.second, model_executor_result_, false);
+      labels.first, labels.second, {47, 7}, false);
   EXPECT_EQ(debug_string,
             std::u16string(expected_output.begin(), expected_output.end()));
 }
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_model_executor.cc b/components/autofill_assistant/content/renderer/autofill_assistant_model_executor.cc
index 8b3a60b..496d218ac 100644
--- a/components/autofill_assistant/content/renderer/autofill_assistant_model_executor.cc
+++ b/components/autofill_assistant/content/renderer/autofill_assistant_model_executor.cc
@@ -6,7 +6,6 @@
 
 #include <ostream>
 
-#include "autofill_assistant_model_executor.h"
 #include "base/command_line.h"
 #include "base/i18n/case_conversion.h"
 #include "base/no_destructor.h"
@@ -113,7 +112,7 @@
       std::make_unique<ExecutionTask>(std::move(tflite_engine), this);
 }
 
-absl::optional<ModelExecutorResult>
+absl::optional<std::pair<int, int>>
 AutofillAssistantModelExecutor::ExecuteModelWithInput(
     const blink::AutofillAssistantNodeSignals& node_signals) {
   if (!execution_task_) {
@@ -253,7 +252,7 @@
   return true;
 }
 
-absl::optional<ModelExecutorResult> AutofillAssistantModelExecutor::Postprocess(
+absl::optional<std::pair<int, int>> AutofillAssistantModelExecutor::Postprocess(
     const std::vector<const TfLiteTensor*>& output_tensors) {
   // Check if we have an override for this execution and return that instead.
   if (overrides_result_) {
@@ -263,8 +262,7 @@
               << ", objective: " << overrides_result_->second << ")";
     }
     // Cleanup the result in case this executor is reused.
-    ModelExecutorResult result(overrides_result_->first,
-                               overrides_result_->second, true);
+    std::pair<int, int> result = *overrides_result_;
     overrides_result_.reset();
     return result;
   }
@@ -298,7 +296,7 @@
   int semantic_role =
       model_metadata_.output().semantic_role().classes(index_of_best_role);
   if (semantic_role == 0) {
-    return ModelExecutorResult(/*r=*/0, /*o=*/0, /*with_override=*/false);
+    return std::pair<int, int>(semantic_role, 0);
   }
 
   int block_index;
@@ -310,8 +308,7 @@
     return absl::nullopt;
   }
 
-  ModelExecutorResult result(semantic_role, objective, false);
-  return result;
+  return std::pair<int, int>(semantic_role, objective);
 }
 
 void AutofillAssistantModelExecutor::Tokenize(
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_model_executor.h b/components/autofill_assistant/content/renderer/autofill_assistant_model_executor.h
index 88d662b..7e8822e 100644
--- a/components/autofill_assistant/content/renderer/autofill_assistant_model_executor.h
+++ b/components/autofill_assistant/content/renderer/autofill_assistant_model_executor.h
@@ -11,7 +11,6 @@
 
 #include "base/files/file.h"
 #include "base/files/memory_mapped_file.h"
-#include "components/autofill_assistant/content/renderer/autofill_assistant_model_executor_result.h"
 #include "components/autofill_assistant/content/renderer/model_metadata.pb.h"
 #include "components/optimization_guide/core/base_model_executor.h"
 #include "components/optimization_guide/core/base_model_executor_helpers.h"
@@ -28,11 +27,11 @@
 // node signals.
 class AutofillAssistantModelExecutor
     : public optimization_guide::BaseModelExecutor<
-          ModelExecutorResult,
+          std::pair<int, int>,
           const blink::AutofillAssistantNodeSignals&> {
  public:
   using ExecutionTask = optimization_guide::GenericModelExecutionTask<
-      ModelExecutorResult,
+      std::pair<int, int>,
       const blink::AutofillAssistantNodeSignals&>;
   using SparseVector = std::vector<std::pair<std::pair<int, int>, int>>;
   using SparseMap = base::flat_map<std::pair<int, int>, int>;
@@ -50,7 +49,7 @@
   bool InitializeModelFromFile(base::File model_file);
 
   // Execute the model with the given input.
-  absl::optional<ModelExecutorResult> ExecuteModelWithInput(
+  absl::optional<std::pair<int, int>> ExecuteModelWithInput(
       const blink::AutofillAssistantNodeSignals& node_signals);
 
  protected:
@@ -58,7 +57,7 @@
   bool Preprocess(
       const std::vector<TfLiteTensor*>& input_tensors,
       const blink::AutofillAssistantNodeSignals& node_signals) override;
-  absl::optional<ModelExecutorResult> Postprocess(
+  absl::optional<std::pair<int, int>> Postprocess(
       const std::vector<const TfLiteTensor*>& output_tensors) override;
 
  private:
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_model_executor_result.h b/components/autofill_assistant/content/renderer/autofill_assistant_model_executor_result.h
deleted file mode 100644
index 42c40fd..0000000
--- a/components/autofill_assistant/content/renderer/autofill_assistant_model_executor_result.h
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef COMPONENTS_AUTOFILL_ASSISTANT_CONTENT_RENDERER_AUTOFILL_ASSISTANT_MODEL_EXECUTOR_RESULT_H_
-#define COMPONENTS_AUTOFILL_ASSISTANT_CONTENT_RENDERER_AUTOFILL_ASSISTANT_MODEL_EXECUTOR_RESULT_H_
-
-namespace autofill_assistant {
-
-// Result used to communicated model execution results between interested
-// parties.
-struct ModelExecutorResult {
-  ModelExecutorResult() = default;
-  ModelExecutorResult(int r, int o, bool with_override)
-      : role(r), objective(o), used_override(with_override) {}
-
-  // Role and objective pair.
-  int role = 0;
-  int objective = 0;
-  // Whether this result came from an override.
-  bool used_override = false;
-};
-
-}  // namespace autofill_assistant
-
-#endif  // COMPONENTS_AUTOFILL_ASSISTANT_CONTENT_RENDERER_AUTOFILL_ASSISTANT_MODEL_EXECUTOR_RESULT_H_
diff --git a/components/autofill_assistant/content/renderer/autofill_assistant_model_executor_unittest.cc b/components/autofill_assistant/content/renderer/autofill_assistant_model_executor_unittest.cc
index 862620e..1212e00 100644
--- a/components/autofill_assistant/content/renderer/autofill_assistant_model_executor_unittest.cc
+++ b/components/autofill_assistant/content/renderer/autofill_assistant_model_executor_unittest.cc
@@ -101,8 +101,8 @@
 
   auto result = model_executor_.ExecuteModelWithInput(node_signals);
   ASSERT_TRUE(result.has_value());
-  EXPECT_EQ(result->role, 47 /* ADDRESS_LINE1 */);
-  EXPECT_EQ(result->objective, 7 /* FILL_DELIVERY_ADDRESS */);
+  EXPECT_EQ(result->first, 47 /* ADDRESS_LINE1 */);
+  EXPECT_EQ(result->second, 7 /* FILL_DELIVERY_ADDRESS */);
 }
 
 TEST_F(AutofillAssistantModelExecutorTest, OverridesMatch) {
@@ -119,9 +119,8 @@
 
   auto result = model_executor.ExecuteModelWithInput(node_signals);
   ASSERT_TRUE(result.has_value());
-  EXPECT_EQ(result->role, 9999);
-  EXPECT_EQ(result->objective, 1111);
-  EXPECT_TRUE(result->used_override);
+  EXPECT_EQ(result->first, 9999);
+  EXPECT_EQ(result->second, 1111);
 }
 
 TEST_F(AutofillAssistantModelExecutorTest, OverridesNoMatch) {
@@ -136,9 +135,8 @@
 
   auto result = model_executor.ExecuteModelWithInput(node_signals);
   ASSERT_TRUE(result.has_value());
-  EXPECT_NE(result->role, 9999);
-  EXPECT_NE(result->objective, 1111);
-  EXPECT_FALSE(result->used_override);
+  EXPECT_NE(result->first, 9999);
+  EXPECT_NE(result->second, 1111);
 }
 
 TEST_F(AutofillAssistantModelExecutorTest, OverridesResultNotReused) {
@@ -155,9 +153,8 @@
 
     auto result = model_executor.ExecuteModelWithInput(node_signals);
     ASSERT_TRUE(result.has_value());
-    EXPECT_EQ(result->role, 9999);
-    EXPECT_EQ(result->objective, 1111);
-    EXPECT_TRUE(result->used_override);
+    EXPECT_EQ(result->first, 9999);
+    EXPECT_EQ(result->second, 1111);
   }
 
   // We expect the internal overrides result from the previous execution to have
@@ -169,9 +166,8 @@
 
     auto result = model_executor.ExecuteModelWithInput(node_signals);
     ASSERT_TRUE(result.has_value());
-    EXPECT_NE(result->role, 9999);
-    EXPECT_NE(result->objective, 1111);
-    EXPECT_FALSE(result->used_override);
+    EXPECT_NE(result->first, 9999);
+    EXPECT_NE(result->second, 1111);
   }
 }
 
diff --git a/components/desks_storage/DIR_METADATA b/components/desks_storage/DIR_METADATA
new file mode 100644
index 0000000..af853d76
--- /dev/null
+++ b/components/desks_storage/DIR_METADATA
@@ -0,0 +1,4 @@
+buganizer {
+  component_id: 1020793
+}
+team_email: "cros-commercial-productivity-eng@google.com"
diff --git a/components/device_signals/core/browser/BUILD.gn b/components/device_signals/core/browser/BUILD.gn
index e80af04e..f53c5c7 100644
--- a/components/device_signals/core/browser/BUILD.gn
+++ b/components/device_signals/core/browser/BUILD.gn
@@ -105,4 +105,8 @@
   if (is_win) {
     deps += [ "//components/device_signals/core/browser/win:unit_tests" ]
   }
+
+  if (is_mac) {
+    deps += [ "//components/device_signals/core/browser/mac:unit_tests" ]
+  }
 }
diff --git a/components/device_signals/core/browser/mac/BUILD.gn b/components/device_signals/core/browser/mac/BUILD.gn
index 22dfe93..dd997ca 100644
--- a/components/device_signals/core/browser/mac/BUILD.gn
+++ b/components/device_signals/core/browser/mac/BUILD.gn
@@ -9,8 +9,22 @@
 
   deps = [
     "//base",
-    "//components/device_signals/core/browser:browser",
+    "//components/device_signals/core/browser",
+    "//components/device_signals/core/common/",
   ]
 
   frameworks = [ "Foundation.framework" ]
 }
+
+source_set("unit_tests") {
+  testonly = true
+  sources = [ "plist_settings_client_unittest.mm" ]
+
+  deps = [
+    ":mac",
+    "//base/test:test_support",
+    "//components/device_signals/test:test_support",
+    "//testing/gmock",
+    "//testing/gtest",
+  ]
+}
diff --git a/components/device_signals/core/browser/mac/plist_settings_client.mm b/components/device_signals/core/browser/mac/plist_settings_client.mm
index 73a0159..d0a14d5 100644
--- a/components/device_signals/core/browser/mac/plist_settings_client.mm
+++ b/components/device_signals/core/browser/mac/plist_settings_client.mm
@@ -8,10 +8,175 @@
 
 #include <utility>
 
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#import "base/mac/foundation_util.h"
+#include "base/mac/scoped_nsobject.h"
+#include "base/strings/sys_string_conversions.h"
+#include "base/task/thread_pool.h"
+#include "components/device_signals/core/browser/settings_client.h"
 #include "components/device_signals/core/browser/signals_types.h"
+#include "components/device_signals/core/common/platform_utils.h"
 
 namespace device_signals {
 
+namespace {
+
+// Max plist file size.
+constexpr int kMaxFileSizeInMb = 500;
+
+// Max size of the setting element.
+constexpr size_t kMaxStringSizeInBytes = 1024;
+
+// Parses the `data_obj` for the item at the given key `path`. Returns the
+// object in the event of a successful parse, and nil otherwise.
+id ParseArrays(id data_obj, NSString* path) {
+  NSArray* indexes = [path componentsSeparatedByString:@"["];
+
+  for (NSString* index_str in indexes) {
+    if (![data_obj isKindOfClass:[NSArray class]]) {
+      return nil;
+    }
+
+    if (![index_str length])
+      continue;
+
+    // Checking for the square brackets being closed. If they are not, then the
+    // key path is malformed.
+    NSRange range = [index_str rangeOfString:@"]"];
+    if (range.location == NSNotFound ||
+        range.location < [index_str length] - 1) {
+      return nil;
+    }
+    index_str = [index_str substringToIndex:range.location];
+
+    // Validate that the index is a numeric. If the index is an alpha, issues
+    // will occur during string to integer conversion.
+    NSCharacterSet* numeric_set = [NSCharacterSet decimalDigitCharacterSet];
+    if (![numeric_set
+            isSupersetOfSet:[NSCharacterSet characterSetWithCharactersInString:
+                                                index_str]]) {
+      return nil;
+    }
+
+    NSUInteger index = base::checked_cast<NSUInteger>([index_str integerValue]);
+    if (index > [data_obj count])
+      return nil;
+
+    data_obj = [data_obj objectAtIndex:index];
+  }
+
+  return data_obj;
+}
+
+// Parses the loaded plist `dict` for the setting item at `key_path`. Returns
+// the setting object if it is found or nil otherwise.
+id ParsePlist(NSDictionary* dict, NSString* key_path) {
+  // Check if an array exists in the path, If not, the plist can be parsed
+  // directly.
+  NSRange test_range = [key_path rangeOfString:@"["];
+  if (test_range.location == NSNotFound)
+    return [dict valueForKeyPath:key_path];
+
+  NSDictionary* current_obj = dict;
+  for (NSString* sub_path in [key_path componentsSeparatedByString:@"."]) {
+    NSRange range = [sub_path rangeOfString:@"["];
+    if (range.location == NSNotFound) {
+      current_obj = [current_obj valueForKey:sub_path];
+    } else {
+      current_obj =
+          [current_obj valueForKey:[sub_path substringToIndex:range.location]];
+      current_obj = ParseArrays(current_obj,
+                                [sub_path substringFromIndex:range.location]);
+    }
+  }
+
+  // This will occur if the key path is incorrect and does not actually point to
+  // a setting item. At the end of a parse, the only remaining object should be
+  // the single setting item.
+  if ([current_obj isKindOfClass:[NSArray class]] && [current_obj count] != 1) {
+    return nil;
+  }
+  return current_obj;
+}
+
+// Using the setting `options`, this is responsible for loading and parsing the
+// plists for setting values specified for the setting options. A collection of
+// the setting items are returned to the caller.
+std::vector<SettingsItem> GetSettingItems(
+    const std::vector<GetSettingsOptions>& options) {
+  std::vector<SettingsItem> items;
+
+  for (GetSettingsOptions option : options) {
+    SettingsItem item;
+    item.key = option.key;
+    item.path = option.path;
+
+    // Load Plist file into memory.
+    base::FilePath resolved_path;
+    if (!ResolvePath(base::FilePath(option.path), &resolved_path)) {
+      item.presence = PresenceValue::kNotFound;
+      items.push_back(item);
+      continue;
+    }
+
+    int64_t plist_file_size = 0;
+    if (!base::GetFileSize(resolved_path, &plist_file_size) ||
+        plist_file_size > (kMaxFileSizeInMb << 20)) {
+      item.presence = PresenceValue::kNotFound;
+      items.push_back(item);
+      continue;
+    }
+
+    NSError* error = nil;
+    NSURL* url = base::mac::FilePathToNSURL(resolved_path);
+    base::scoped_nsobject<NSDictionary> plist_dict(
+        [[NSDictionary alloc] initWithContentsOfURL:url error:&error]);
+    if (error && [error code] == NSFileReadNoPermissionError) {
+      item.presence = PresenceValue::kAccessDenied;
+      items.push_back(item);
+      continue;
+    }
+
+    if (!plist_dict) {
+      item.presence = PresenceValue::kNotFound;
+      items.push_back(item);
+    }
+
+    id value_ptr = ParsePlist(plist_dict, base::SysUTF8ToNSString(option.key));
+    if (!value_ptr) {
+      item.presence = PresenceValue::kNotFound;
+      items.push_back(item);
+      continue;
+    }
+
+    item.presence = PresenceValue::kFound;
+    if (!option.get_value) {
+      items.push_back(item);
+      continue;
+    }
+
+    if (NSString* setting_str = base::mac::ObjCCast<NSString>(value_ptr)) {
+      if ([setting_str length] <= kMaxStringSizeInBytes)
+        item.setting_value = base::Value(base::SysNSStringToUTF8(setting_str));
+    } else if (NSNumber* value_num = base::mac::ObjCCast<NSNumber>(value_ptr)) {
+      // Differentiating between integer and float types.
+      const char* value_type = [value_num objCType];
+      if (strcmp(value_type, "d") == 0 || strcmp(value_type, "f") == 0) {
+        double setting_num = [value_num doubleValue];
+        item.setting_value = base::Value(setting_num);
+      } else {
+        int setting_num = [value_num integerValue];
+        item.setting_value = base::Value(setting_num);
+      }
+    }
+    items.push_back(item);
+  }
+  return items;
+}
+
+}  // namespace
+
 PlistSettingsClient::PlistSettingsClient() = default;
 
 PlistSettingsClient::~PlistSettingsClient() = default;
@@ -19,8 +184,22 @@
 void PlistSettingsClient::GetSettings(
     const std::vector<GetSettingsOptions>& options,
     GetSettingsSignalsCallback callback) {
-  // TODO(b:245524787): Implement.
-  std::move(callback).Run(std::vector<SettingsItem>());
+  std::vector<SettingsItem> items;
+
+  // Used to ensure that this function is being called on the main thread.
+  SEQUENCE_CHECKER(sequence_checker_);
+
+  if (options.empty()) {
+    std::move(callback).Run(std::vector<SettingsItem>());
+    return;
+  }
+
+  base::ThreadPool::PostTaskAndReplyWithResult(
+      FROM_HERE,
+      {base::MayBlock(), base::TaskPriority::USER_BLOCKING,
+       base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN},
+      base::BindOnce(&GetSettingItems, std::move(options)),
+      std::move(callback));
 }
 
 }  // namespace device_signals
diff --git a/components/device_signals/core/browser/mac/plist_settings_client_unittest.mm b/components/device_signals/core/browser/mac/plist_settings_client_unittest.mm
new file mode 100644
index 0000000..586ae8a
--- /dev/null
+++ b/components/device_signals/core/browser/mac/plist_settings_client_unittest.mm
@@ -0,0 +1,300 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "components/device_signals/core/browser/mac/plist_settings_client.h"
+
+#import <Foundation/Foundation.h>
+
+#include <string>
+
+#include "base/files/file_path.h"
+#include "base/test/task_environment.h"
+#include "base/test/test_future.h"
+#include "components/device_signals/test/test_constants.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace device_signals {
+
+class PlistSettingsClientTest : public testing::Test {
+ protected:
+  GetSettingsOptions CreateOption(const std::string& key_path, bool value) {
+    GetSettingsOptions option;
+    option.path = test_file_path_.value();
+    option.key = key_path;
+    option.get_value = value;
+    return option;
+  }
+
+  SettingsItem CreateSettingItem(const std::string& key_path,
+                                 PresenceValue value,
+                                 const std::string& setting_value) {
+    SettingsItem item;
+    if (!setting_value.empty())
+      item.setting_value = base::Value(setting_value);
+    return FinishSettingItemSetup(item, key_path, value);
+  }
+
+  SettingsItem CreateSettingItem(const std::string& key_path,
+                                 PresenceValue value,
+                                 const int setting_value) {
+    SettingsItem item;
+    item.setting_value = base::Value(setting_value);
+    return FinishSettingItemSetup(item, key_path, value);
+  }
+
+  SettingsItem CreateSettingItem(const std::string& key_path,
+                                 PresenceValue value,
+                                 const double setting_value) {
+    SettingsItem item;
+    item.setting_value = base::Value(setting_value);
+    return FinishSettingItemSetup(item, key_path, value);
+  }
+
+  SettingsItem FinishSettingItemSetup(SettingsItem item,
+                                      const std::string& key_path,
+                                      PresenceValue value) {
+    item.path = test_file_path_.value();
+    item.key = key_path;
+    item.presence = value;
+    return item;
+  }
+
+  PlistSettingsClient client_;
+  base::FilePath test_file_path_;
+  base::test::TaskEnvironment task_environment_;
+  base::test::TestFuture<const std::vector<SettingsItem>&> future_;
+};
+
+// Tests an empty request to GetSettings. In this case we should have no setting
+// items.
+TEST_F(PlistSettingsClientTest, GetSettings_EmptyOptions) {
+  client_.GetSettings(std::vector<GetSettingsOptions>(), future_.GetCallback());
+  EXPECT_EQ(std::vector<SettingsItem>(), future_.Get());
+}
+
+// Tests when the request to GetSettings contains one invalid request. In this
+// case we should have no setting items.
+TEST_F(PlistSettingsClientTest, GetSettings_InvalidOptions) {
+  test_file_path_ = test::GetMixArrayDictionaryPlistPath();
+
+  std::vector<GetSettingsOptions> options;
+  options.push_back(CreateOption("", false));
+
+  std::vector<SettingsItem> items;
+  items.push_back(CreateSettingItem("", PresenceValue::kNotFound, ""));
+
+  client_.GetSettings(options, future_.GetCallback());
+  EXPECT_EQ(items, future_.Get());
+}
+
+// Tests a request to GetSettings from a plist that does not exist.
+TEST_F(PlistSettingsClientTest, GetSettings_PlistDoesNotExist) {
+  test_file_path_ =
+      test::GetTestDataDir().AppendASCII("plist-doesnt-exist.plist");
+
+  std::vector<GetSettingsOptions> options;
+  std::string key_path = "Key1.SubKey1.SubSubKey1[0]";
+  options.push_back(CreateOption(key_path, true));
+
+  std::vector<SettingsItem> items;
+  items.push_back(CreateSettingItem(key_path, PresenceValue::kNotFound, ""));
+
+  client_.GetSettings(options, future_.GetCallback());
+  EXPECT_EQ(items, future_.Get());
+}
+
+// Tests a request to GetSettings from an empty plist.
+TEST_F(PlistSettingsClientTest, GetSettings_Plist_EmptyPlist) {
+  test_file_path_ = test::GetEmptyPlistPath();
+
+  std::vector<GetSettingsOptions> options;
+  std::string key_path = "Key1.SubKey1";
+  options.push_back(CreateOption(key_path, true));
+
+  std::vector<SettingsItem> items;
+  items.push_back(CreateSettingItem(key_path, PresenceValue::kNotFound, ""));
+
+  client_.GetSettings(options, future_.GetCallback());
+  EXPECT_EQ(items, future_.Get());
+}
+
+// Tests a request to GetSettings from a plist containing a mix of dictionaries
+// and arrays with nested key paths that do not exist in the plist.
+TEST_F(PlistSettingsClientTest,
+       GetSettings_Plist_MixOfArrayDictItems_InvalidKeyPath) {
+  test_file_path_ = test::GetMixArrayDictionaryPlistPath();
+
+  std::string key_path1 = "Key1.SubKey1.SubSubKey1[0][20]";
+  std::string key_path2 = "Key1.SubKey1.SubSubKey5[1";
+  std::string key_path3 = "Key1.Array]";
+  std::string key_path4 = "Key1.Array[1000000][";
+  std::string key_path5 = "Key1..";
+  std::string key_path6 = "Key1.Array[a]";
+  std::string key_path7 = "Key1.Array[";
+  std::string key_path8 = "Key1.Array[1]]";
+  std::string key_path9 = "Key1.Array[]";
+
+  std::vector<GetSettingsOptions> options;
+  options.push_back(CreateOption(key_path1, true));
+  options.push_back(CreateOption(key_path2, false));
+  options.push_back(CreateOption(key_path3, false));
+  options.push_back(CreateOption(key_path4, true));
+  options.push_back(CreateOption(key_path5, true));
+  options.push_back(CreateOption(key_path6, false));
+  options.push_back(CreateOption(key_path7, false));
+  options.push_back(CreateOption(key_path8, true));
+  options.push_back(CreateOption(key_path9, true));
+
+  std::vector<SettingsItem> items;
+  items.push_back(CreateSettingItem(key_path1, PresenceValue::kNotFound, ""));
+  items.push_back(CreateSettingItem(key_path2, PresenceValue::kNotFound, ""));
+  items.push_back(CreateSettingItem(key_path3, PresenceValue::kNotFound, ""));
+  items.push_back(CreateSettingItem(key_path4, PresenceValue::kNotFound, ""));
+  items.push_back(CreateSettingItem(key_path5, PresenceValue::kNotFound, ""));
+  items.push_back(CreateSettingItem(key_path6, PresenceValue::kNotFound, ""));
+  items.push_back(CreateSettingItem(key_path7, PresenceValue::kNotFound, ""));
+  items.push_back(CreateSettingItem(key_path8, PresenceValue::kNotFound, ""));
+  items.push_back(CreateSettingItem(key_path9, PresenceValue::kNotFound, ""));
+
+  client_.GetSettings(options, future_.GetCallback());
+  EXPECT_EQ(items, future_.Get());
+}
+
+// Tests a request to GetSettings from a plist containing a mix of dictionaries
+// and arrays with a nested key path that exists in the plist.
+TEST_F(PlistSettingsClientTest,
+       GetSettings_Plist_MixOfArrayDictItems_ValidKeyPath) {
+  test_file_path_ = test::GetMixArrayDictionaryPlistPath();
+
+  std::string key_path = "Key1.SubKey1.SubSubKey1[0][10]";
+
+  std::vector<GetSettingsOptions> options;
+  options.push_back(CreateOption(key_path, true));
+  options.push_back(CreateOption(key_path, false));
+
+  std::vector<SettingsItem> items;
+  items.push_back(
+      CreateSettingItem(key_path, PresenceValue::kFound, "string10"));
+  items.push_back(CreateSettingItem(key_path, PresenceValue::kFound, ""));
+
+  client_.GetSettings(options, future_.GetCallback());
+  EXPECT_EQ(items, future_.Get());
+}
+
+// Tests a request to GetSettings with an invalid setting path from a plist
+// containing only dictionary elements.
+TEST_F(PlistSettingsClientTest,
+       GetSettings_Plist_OnlyDictionaryItems_InvalidKeyPath) {
+  test_file_path_ = test::GetOnlyDictionaryPlistPath();
+
+  std::string key_path1 = "Key1.InvalidKeyValue";
+  std::string key_path2 = "Key1.InvalidKeyValue.SubKey1";
+  std::string key_path3 = "Key1.SubKey1.SubKey2.SubKey3.SubKey4";
+
+  std::vector<GetSettingsOptions> options;
+  options.push_back(CreateOption(key_path1, true));
+  options.push_back(CreateOption(key_path2, false));
+  options.push_back(CreateOption(key_path3, true));
+
+  std::vector<SettingsItem> items;
+  items.push_back(CreateSettingItem(key_path1, PresenceValue::kNotFound, ""));
+  items.push_back(CreateSettingItem(key_path2, PresenceValue::kNotFound, ""));
+  items.push_back(CreateSettingItem(key_path3, PresenceValue::kNotFound, ""));
+
+  client_.GetSettings(options, future_.GetCallback());
+  EXPECT_EQ(items, future_.Get());
+}
+
+// Tests a request to GetSettings with a path to a data type setting value from
+// a plist containing only dictionary elements.
+TEST_F(PlistSettingsClientTest,
+       GetSettings_Plist_OnlyDictionaryItems_DataType) {
+  test_file_path_ = test::GetOnlyDictionaryPlistPath();
+
+  std::string key_path = "DataKeyValue";
+
+  std::vector<GetSettingsOptions> options;
+  options.push_back(CreateOption(key_path, true));
+
+  std::vector<SettingsItem> items;
+  items.push_back(CreateSettingItem(key_path, PresenceValue::kFound, ""));
+
+  client_.GetSettings(options, future_.GetCallback());
+  EXPECT_EQ(items, future_.Get());
+}
+
+// Tests a request to GetSettings with a path to a float type setting value from
+// a plist containing only dictionary elements.
+TEST_F(PlistSettingsClientTest,
+       GetSettings_Plist_OnlyDictionaryItems_FloatType) {
+  test_file_path_ = test::GetOnlyDictionaryPlistPath();
+
+  std::string key_path = "RealKeyValue";
+
+  std::vector<GetSettingsOptions> options;
+  options.push_back(CreateOption(key_path, true));
+
+  std::vector<SettingsItem> items;
+  items.push_back(CreateSettingItem(key_path, PresenceValue::kFound, 0.123));
+
+  client_.GetSettings(options, future_.GetCallback());
+  EXPECT_EQ(items, future_.Get());
+}
+
+// Tests a request to GetSettings with a path to a integer type setting value
+// from a plist containing only dictionary elements.
+TEST_F(PlistSettingsClientTest,
+       GetSettings_Plist_OnlyDictionaryItems_IntegerType) {
+  test_file_path_ = test::GetOnlyDictionaryPlistPath();
+
+  std::string key_path = "Key1.SubKey1.IntegerKeyValue";
+
+  std::vector<GetSettingsOptions> options;
+  options.push_back(CreateOption(key_path, true));
+
+  std::vector<SettingsItem> items;
+  items.push_back(CreateSettingItem(key_path, PresenceValue::kFound, 100));
+
+  client_.GetSettings(options, future_.GetCallback());
+  EXPECT_EQ(items, future_.Get());
+}
+
+// Tests a request to GetSettings with a path to a string type setting value
+// from a plist containing only dictionary elements.
+TEST_F(PlistSettingsClientTest,
+       GetSettings_Plist_OnlyDictionaryItems_StringType) {
+  test_file_path_ = test::GetOnlyDictionaryPlistPath();
+
+  std::string key_path = "Key1.SubKey1.StringKeyValue";
+
+  std::vector<GetSettingsOptions> options;
+  options.push_back(CreateOption(key_path, true));
+
+  std::vector<SettingsItem> items;
+  items.push_back(CreateSettingItem(key_path, PresenceValue::kFound, "string"));
+
+  client_.GetSettings(options, future_.GetCallback());
+  EXPECT_EQ(items, future_.Get());
+}
+
+// Tests a request to GetSettings with a path to a boolean type setting value
+// from a plist containing only dictionary elements.
+TEST_F(PlistSettingsClientTest,
+       GetSettings_Plist_OnlyDictionaryItems_BooleanType) {
+  test_file_path_ = test::GetOnlyDictionaryPlistPath();
+
+  std::string key_path = "Key1.BooleanKeyValue";
+
+  std::vector<GetSettingsOptions> options;
+  options.push_back(CreateOption(key_path, true));
+
+  std::vector<SettingsItem> items;
+  items.push_back(CreateSettingItem(key_path, PresenceValue::kFound, 1));
+
+  client_.GetSettings(options, future_.GetCallback());
+  EXPECT_EQ(items, future_.Get());
+}
+
+}  // namespace device_signals
diff --git a/components/device_signals/test/signals_contract.cc b/components/device_signals/test/signals_contract.cc
index 480435b..7894ac158 100644
--- a/components/device_signals/test/signals_contract.cc
+++ b/components/device_signals/test/signals_contract.cc
@@ -140,6 +140,8 @@
       base::BindRepeating(VerifyIsString, names::kDeviceHostName);
   contract[names::kMacAddresses] = base::BindRepeating(
       VerifyIsStringArray, names::kMacAddresses, /*enforce_value=*/false);
+  contract[names::kScreenLockSecured] =
+      base::BindRepeating(VerifyIsSettingInteger, names::kScreenLockSecured);
 
 #if BUILDFLAG(IS_WIN)
   contract[names::kChromeCleanupEnabled] =
@@ -163,9 +165,6 @@
 #endif
 
 #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
-  contract[names::kScreenLockSecured] =
-      base::BindRepeating(VerifyIsSettingInteger, names::kScreenLockSecured);
-
   contract[names::kAllowScreenLock] =
       base::BindRepeating(VerifyUnset, names::kAllowScreenLock);
   contract[names::kImei] = base::BindRepeating(VerifyUnset, names::kImei);
@@ -174,9 +173,6 @@
   // Chrome OS Signals.
   contract[names::kAllowScreenLock] =
       base::BindRepeating(VerifyIsBoolean, names::kAllowScreenLock);
-
-  contract[names::kScreenLockSecured] =
-      base::BindRepeating(VerifyUnset, names::kScreenLockSecured);
 #endif  // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX)
 
   return contract;
diff --git a/components/device_signals/test/test_constants.cc b/components/device_signals/test/test_constants.cc
index 69f401a..b58e5db 100644
--- a/components/device_signals/test/test_constants.cc
+++ b/components/device_signals/test/test_constants.cc
@@ -77,4 +77,16 @@
   return GetTestDataDir().AppendASCII("Unused");
 }
 
+base::FilePath GetEmptyPlistPath() {
+  return GetTestDataDir().AppendASCII("empty.plist");
+}
+
+base::FilePath GetMixArrayDictionaryPlistPath() {
+  return GetTestDataDir().AppendASCII("mix_array_dictionary.plist");
+}
+
+base::FilePath GetOnlyDictionaryPlistPath() {
+  return GetTestDataDir().AppendASCII("only_dictionary.plist");
+}
+
 }  // namespace device_signals::test
diff --git a/components/device_signals/test/test_constants.h b/components/device_signals/test/test_constants.h
index a1bb650..a8f9c03 100644
--- a/components/device_signals/test/test_constants.h
+++ b/components/device_signals/test/test_constants.h
@@ -53,6 +53,16 @@
 // Returns an absolute path to nothing (no file/directory).
 base::FilePath GetUnusedPath();
 
+// Returns an absolute path to a test empty plist.
+base::FilePath GetEmptyPlistPath();
+
+// Returns an absolute path to a test plist containing only dictionary items.
+base::FilePath GetOnlyDictionaryPlistPath();
+
+// Returns an absolute path to a test plist containing a mix of dictionary and
+// array items.
+base::FilePath GetMixArrayDictionaryPlistPath();
+
 }  // namespace device_signals::test
 
 #endif  // COMPONENTS_DEVICE_SIGNALS_TEST_TEST_CONSTANTS_H_
diff --git a/components/lens/DIR_METADATA b/components/lens/DIR_METADATA
new file mode 100644
index 0000000..749bdad
--- /dev/null
+++ b/components/lens/DIR_METADATA
@@ -0,0 +1,4 @@
+monorail {
+  component: "UI>Browser"
+}
+team_email: "lens-chrome-eng+bugs@google.com"
diff --git a/components/nacl/features.gni b/components/nacl/features.gni
index ba0f7e1..ba7f9d1 100644
--- a/components/nacl/features.gni
+++ b/components/nacl/features.gni
@@ -5,15 +5,26 @@
 import("//build/config/chromecast_build.gni")
 import("//build/config/gclient_args.gni")
 
+# The NaCl sandbox and toolchain currently only support x86-32, x86-64
+# and ARM32.
+#
+# The NaCl sandbox itself supports MIPS32, but the Clang toolchain
+# support for that is no longer up-to-date, so we don't include that
+# in the list of CPU architectures to enable NaCl on.
+#
+# NaCl is also supported on ARM64 Chrome OS, where the ARM32 NaCl
+# sandbox is used.  We don't enable that by default here, but Chrome
+# OS builds override "enable_nacl" to enable that.
+_cpu_is_supported =
+    target_cpu == "x86" || target_cpu == "x64" || target_cpu == "arm"
+
 declare_args() {
   # Enables Native Client support.
-  # Temporarily disable nacl on arm64 linux to get rid of compilation errors.
+  #
   # Intentionally and permanently disable nacl on arm64 mac.
-  # TODO: When mipsel-nacl-clang is available, drop the exclusion.
   enable_nacl =
-      checkout_nacl && target_os != "ios" && !is_android && !is_fuchsia &&
-      !is_castos && current_cpu != "mipsel" && current_cpu != "mips64el" &&
-      target_cpu != "arm64" && !(is_win && host_os != "win") &&
+      checkout_nacl && _cpu_is_supported && target_os != "ios" && !is_android &&
+      !is_fuchsia && !is_castos && !(is_win && host_os != "win") &&
       !(is_mac && (host_os != "mac" || target_cpu != "x64"))
 }
 
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc
index a98fde2b..e6d82a5 100644
--- a/components/omnibox/browser/autocomplete_controller.cc
+++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -947,7 +947,13 @@
   const AutocompleteMatch* preserve_default_match = nullptr;
   if (last_default_match && ShouldPreserveDefault(in_start_, input_))
     preserve_default_match = &last_default_match.value();
-  result_.SortAndCull(input_, template_url_service_, preserve_default_match);
+
+  static bool single_sort_and_cull_pass =
+      base::FeatureList::IsEnabled(omnibox::kSingleSortAndCullPass);
+  // If `done_`, the below `SortAndCull()` is skipped, so this is the single
+  // pass.
+  if (!single_sort_and_cull_pass || done_)
+    result_.SortAndCull(input_, template_url_service_, preserve_default_match);
 
   if (!done_) {
     // This conditional needs to match the conditional in Start that invokes
diff --git a/components/omnibox/browser/autocomplete_controller_metrics_unittest.cc b/components/omnibox/browser/autocomplete_controller_metrics_unittest.cc
index 4deeda9..441c9d05 100644
--- a/components/omnibox/browser/autocomplete_controller_metrics_unittest.cc
+++ b/components/omnibox/browser/autocomplete_controller_metrics_unittest.cc
@@ -433,7 +433,8 @@
   auto create_result = [&](std::vector<int> ids) {
     std::vector<AutocompleteResult::MatchDedupComparator> result;
     base::ranges::transform(ids, std::back_inserter(result), [](int id) {
-      return std::pair<GURL, bool>{"http://" + base::NumberToString(id), false};
+      return AutocompleteResult::MatchDedupComparator{
+          "http://" + base::NumberToString(id), false};
     });
     return result;
   };
diff --git a/components/omnibox/browser/autocomplete_match.cc b/components/omnibox/browser/autocomplete_match.cc
index 4a31af8..47ca6d86 100644
--- a/components/omnibox/browser/autocomplete_match.cc
+++ b/components/omnibox/browser/autocomplete_match.cc
@@ -115,8 +115,30 @@
   return it->second;
 }
 
+// Implementation of boost::hash_combine
+// http://www.boost.org/doc/libs/1_43_0/doc/html/hash/reference.html#boost.hash_combine
+template <typename T>
+inline void hash_combine(std::size_t& seed, const T& value) {
+  std::hash<T> hasher;
+  seed ^= hasher(value) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
+}
+
 }  // namespace
 
+template <typename S, typename T>
+size_t ACMatchKeyHash<S, T>::operator()(const ACMatchKey<S, T>& key) const {
+  size_t seed = 0;
+  hash_combine(seed, key.first);
+  hash_combine(seed, key.second);
+  return seed;
+}
+
+// This trick allows implementing ACMatchKeyHash in the implementation file.
+template struct ACMatchKeyHash<std::u16string, std::string>;
+template struct ACMatchKeyHash<std::string, bool>;
+
+// RichAutocompletionParams ---------------------------------------------------
+
 RichAutocompletionParams::RichAutocompletionParams()
     : enabled(OmniboxFieldTrial::IsRichAutocompletionEnabled()),
       autocomplete_titles(
diff --git a/components/omnibox/browser/autocomplete_match.h b/components/omnibox/browser/autocomplete_match.h
index bae3154..5555410 100644
--- a/components/omnibox/browser/autocomplete_match.h
+++ b/components/omnibox/browser/autocomplete_match.h
@@ -58,6 +58,8 @@
 // scoring non-default match.
 const char kACMatchPropertyScoreBoostedFrom[] = "score_boosted_from";
 
+// RichAutocompletionParams ---------------------------------------------------
+
 // `RichAutocompletionParams` is a cache for the params used by
 // `TryRichAutocompletion()`. `TryRichAutocompletion()` is called about 80 times
 // per keystroke; fetching all 16 params each time causes measurable timing
@@ -831,4 +833,15 @@
 typedef std::vector<ACMatchClassification> ACMatchClassifications;
 typedef std::vector<AutocompleteMatch> ACMatches;
 
+// Can be used as the key for grouping AutocompleteMatches in a map based on a
+// std::pair of fields. This can be generalized to a std::tuple if ever needed.
+// The accompanying hash function makes the key usable in an std::unordered_map.
+template <typename S, typename T>
+using ACMatchKey = std::pair<S, T>;
+
+template <typename S, typename T>
+struct ACMatchKeyHash {
+  size_t operator()(const ACMatchKey<S, T>& key) const;
+};
+
 #endif  // COMPONENTS_OMNIBOX_BROWSER_AUTOCOMPLETE_MATCH_H_
diff --git a/components/omnibox/browser/autocomplete_result.cc b/components/omnibox/browser/autocomplete_result.cc
index 6fcb25e..c5f8398 100644
--- a/components/omnibox/browser/autocomplete_result.cc
+++ b/components/omnibox/browser/autocomplete_result.cc
@@ -75,14 +75,6 @@
 
 }  // namespace
 
-struct MatchGURLHash {
-  // The |bool| is whether the match is a calculator suggestion. We want them
-  // compare differently against other matches with the same URL.
-  size_t operator()(const std::pair<GURL, bool>& p) const {
-    return std::hash<std::string>()(p.first.spec()) + p.second;
-  }
-};
-
 // static
 size_t AutocompleteResult::GetMaxMatches(bool is_zero_suggest) {
 #if BUILDFLAG(IS_ANDROID)
@@ -311,14 +303,14 @@
     // If we are trying to keep a default match from a previous pass stable,
     // search the current results for it, and if found, make it the top match.
     if (preserve_default_match) {
-      std::pair<GURL, bool> default_match_fields =
+      const auto default_match_fields =
           GetMatchComparisonFields(*preserve_default_match);
-
       top_match =
-          base::ranges::find_if(matches_, [&](const AutocompleteMatch& m) {
+          base::ranges::find_if(matches_, [&](const AutocompleteMatch& match) {
             // Find a match that is a duplicate AND has the same fill_into_edit.
-            return default_match_fields == GetMatchComparisonFields(m) &&
-                   preserve_default_match->fill_into_edit == m.fill_into_edit;
+            return default_match_fields == GetMatchComparisonFields(match) &&
+                   preserve_default_match->fill_into_edit ==
+                       match.fill_into_edit;
           });
     }
 
@@ -895,21 +887,21 @@
 // static
 void AutocompleteResult::DeduplicateMatches(ACMatches* matches) {
   // Group matches by stripped URL and whether it's a calculator suggestion.
-  std::unordered_map<std::pair<GURL, bool>, std::vector<ACMatches::iterator>,
-                     MatchGURLHash>
+  std::unordered_map<AutocompleteResult::MatchDedupComparator,
+                     std::vector<ACMatches::iterator>,
+                     ACMatchKeyHash<std::string, bool>>
       url_to_matches;
   for (auto i = matches->begin(); i != matches->end(); ++i) {
-    std::pair<GURL, bool> p = GetMatchComparisonFields(*i);
-    url_to_matches[p].push_back(i);
+    url_to_matches[GetMatchComparisonFields(*i)].push_back(i);
   }
 
   // For each group of duplicate matches, choose the one that's considered best.
   for (auto& group : url_to_matches) {
     const auto& key = group.first;
-    const GURL& gurl = key.first;
+
     // The vector of matches whose URL are equivalent.
     std::vector<ACMatches::iterator>& duplicate_matches = group.second;
-    if (gurl.is_empty() || duplicate_matches.size() == 1)
+    if (key.first.empty() || duplicate_matches.size() == 1)
       continue;
 
     // Sort the matches best to worst, according to the deduplication criteria.
@@ -943,10 +935,10 @@
   }
 
   // Erase duplicate matches.
-  base::EraseIf(*matches, [&url_to_matches](const AutocompleteMatch& m) {
-    std::pair<GURL, bool> p = GetMatchComparisonFields(m);
-    return !m.stripped_destination_url.is_empty() &&
-           &(*url_to_matches[p].front()) != &m;
+  base::EraseIf(*matches, [&url_to_matches](const AutocompleteMatch& match) {
+    auto match_comparison_fields = GetMatchComparisonFields(match);
+    return !match.stripped_destination_url.is_empty() &&
+           &(*url_to_matches[match_comparison_fields].front()) != &match;
   });
 }
 
@@ -993,9 +985,9 @@
 
 std::vector<AutocompleteResult::MatchDedupComparator>
 AutocompleteResult::GetMatchDedupComparators() const {
-  std::vector<MatchDedupComparator> comparators;
+  std::vector<AutocompleteResult::MatchDedupComparator> comparators;
   for (const auto& match : *this)
-    comparators.push_back(AutocompleteResult::GetMatchComparisonFields(match));
+    comparators.push_back(GetMatchComparisonFields(match));
   return comparators;
 }
 
@@ -1199,9 +1191,9 @@
   }
 }
 
-std::pair<GURL, bool> AutocompleteResult::GetMatchComparisonFields(
-    const AutocompleteMatch& match) {
-  return std::make_pair(match.stripped_destination_url,
+AutocompleteResult::MatchDedupComparator
+AutocompleteResult::GetMatchComparisonFields(const AutocompleteMatch& match) {
+  return std::make_pair(match.stripped_destination_url.spec(),
                         match.type == ACMatchType::CALCULATOR);
 }
 
diff --git a/components/omnibox/browser/autocomplete_result.h b/components/omnibox/browser/autocomplete_result.h
index f218c847..34d0715 100644
--- a/components/omnibox/browser/autocomplete_result.h
+++ b/components/omnibox/browser/autocomplete_result.h
@@ -36,7 +36,7 @@
  public:
   typedef ACMatches::const_iterator const_iterator;
   typedef ACMatches::iterator iterator;
-  using MatchDedupComparator = std::pair<GURL, bool>;
+  using MatchDedupComparator = ACMatchKey<std::string, bool>;
 
   // Max number of matches we'll show from the various providers. This limit
   // may be different for zero suggest and non zero suggest. Does not take into
diff --git a/components/omnibox/browser/base_search_provider.h b/components/omnibox/browser/base_search_provider.h
index 6fa4d68..999447d 100644
--- a/components/omnibox/browser/base_search_provider.h
+++ b/components/omnibox/browser/base_search_provider.h
@@ -180,10 +180,10 @@
 
   ~BaseSearchProvider() override;
 
-  typedef std::pair<std::u16string, std::string> MatchKey;
-  typedef std::map<MatchKey, AutocompleteMatch> MatchMap;
-  typedef std::vector<std::unique_ptr<SuggestionDeletionHandler>>
-      SuggestionDeletionHandlers;
+  using MatchKey = ACMatchKey<std::u16string, std::string>;
+  using MatchMap = std::map<MatchKey, AutocompleteMatch>;
+  using SuggestionDeletionHandlers =
+      std::vector<std::unique_ptr<SuggestionDeletionHandler>>;
 
   // Returns the appropriate value for the fill_into_edit field of an
   // AutcompleteMatch. The result consists of the suggestion text from
diff --git a/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc
index 7c9afb9..9c9c73c 100644
--- a/components/omnibox/common/omnibox_features.cc
+++ b/components/omnibox/common/omnibox_features.cc
@@ -93,11 +93,18 @@
              "OmniboxStrippedGurlOptimization",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
-// Feature to debounce `AutocompleteController::UpdateResult()`.
+// Feature to debounce `AutocompleteController::NotifyChanged()`.
 BASE_FEATURE(kUpdateResultDebounce,
              "OmniboxUpdateResultDebounce",
              base::FEATURE_DISABLED_BY_DEFAULT);
 
+// When disabled, when providers update their matches, the new set of matches
+// are sorted and culled, then merged with the old matches, then sorted and
+// culled again. When enabled, the first sort and cull is skipped.
+BASE_FEATURE(kSingleSortAndCullPass,
+             "OmniboxSingleSortAndCullPass",
+             base::FEATURE_DISABLED_BY_DEFAULT);
+
 // Feature used to cap max zero suggestions shown according to the param
 // OmniboxMaxZeroSuggestMatches. If omitted,
 // OmniboxUIExperimentMaxAutocompleteMatches will be used instead. If present,
diff --git a/components/omnibox/common/omnibox_features.h b/components/omnibox/common/omnibox_features.h
index 2be31a8..7fbf469 100644
--- a/components/omnibox/common/omnibox_features.h
+++ b/components/omnibox/common/omnibox_features.h
@@ -26,6 +26,7 @@
 BASE_DECLARE_FEATURE(kPreserveDefault);
 BASE_DECLARE_FEATURE(kStrippedGurlOptimization);
 BASE_DECLARE_FEATURE(kUpdateResultDebounce);
+BASE_DECLARE_FEATURE(kSingleSortAndCullPass);
 
 // Features below this line should be sorted alphabetically by their comments.
 
diff --git a/components/performance_manager/user_tuning/prefs.cc b/components/performance_manager/user_tuning/prefs.cc
index b8bf7b36..eb8704c0 100644
--- a/components/performance_manager/user_tuning/prefs.cc
+++ b/components/performance_manager/user_tuning/prefs.cc
@@ -30,7 +30,8 @@
 }
 
 void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry) {
-  registry->RegisterListPref(kTabDiscardingExceptions);
+  registry->RegisterListPref(kTabDiscardingExceptions,
+                             user_prefs::PrefRegistrySyncable::SYNCABLE_PREF);
   registry->RegisterListPref(kManagedTabDiscardingExceptions);
 }
 
diff --git a/components/reporting/proto/synced/security_xdr_events.proto b/components/reporting/proto/synced/security_xdr_events.proto
index baf84ff..6f3b34f 100644
--- a/components/reporting/proto/synced/security_xdr_events.proto
+++ b/components/reporting/proto/synced/security_xdr_events.proto
@@ -2,6 +2,10 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+// TODO(b/250633393): This proto will need to be moved to the events directory.
+// It is not currently possible because the events directory is not yet
+// replicated to ChromeOS.
+
 syntax = "proto2";
 
 option optimize_for = LITE_RUNTIME;
diff --git a/components/services/storage/public/cpp/filesystem/filesystem_impl.cc b/components/services/storage/public/cpp/filesystem/filesystem_impl.cc
index 40461fe..27e5c5b 100644
--- a/components/services/storage/public/cpp/filesystem/filesystem_impl.cc
+++ b/components/services/storage/public/cpp/filesystem/filesystem_impl.cc
@@ -117,7 +117,7 @@
   const base::FilePath full_path = MakeAbsolute(path);
   base::FileErrorOr<std::vector<base::FilePath>> result =
       GetDirectoryEntries(full_path, mode);
-  if (result.is_error()) {
+  if (!result.has_value()) {
     std::move(callback).Run(result.error(), std::vector<base::FilePath>());
     return;
   }
@@ -255,7 +255,7 @@
 void FilesystemImpl::LockFile(const base::FilePath& path,
                               LockFileCallback callback) {
   base::FileErrorOr<base::File> result = LockFileLocal(MakeAbsolute(path));
-  if (result.is_error()) {
+  if (!result.has_value()) {
     std::move(callback).Run(result.error(), mojo::NullRemote());
     return;
   }
@@ -282,15 +282,15 @@
   base::File file(path, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ |
                             base::File::FLAG_WRITE);
   if (!file.IsValid())
-    return file.error_details();
+    return base::unexpected(file.error_details());
 
   if (!GetLockTable().AddLock(path))
-    return base::File::FILE_ERROR_IN_USE;
+    return base::unexpected(base::File::FILE_ERROR_IN_USE);
 
 #if !BUILDFLAG(IS_FUCHSIA)
   base::File::Error error = file.Lock(base::File::LockMode::kExclusive);
   if (error != base::File::FILE_OK)
-    return error;
+    return base::unexpected(error);
 #endif
 
   return file;
@@ -343,7 +343,7 @@
     entries.push_back(entry);
   }
   if (enumerator.GetError() != base::File::FILE_OK)
-    return enumerator.GetError();
+    return base::unexpected(enumerator.GetError());
   return entries;
 }
 
diff --git a/components/services/storage/public/cpp/filesystem/filesystem_proxy.cc b/components/services/storage/public/cpp/filesystem/filesystem_proxy.cc
index d99e4bc..1e389c2e 100644
--- a/components/services/storage/public/cpp/filesystem/filesystem_proxy.cc
+++ b/components/services/storage/public/cpp/filesystem/filesystem_proxy.cc
@@ -8,15 +8,13 @@
 #include <utility>
 #include <vector>
 
-#include "base/bind.h"
 #include "base/files/file.h"
 #include "base/files/file_util.h"
 #include "base/files/important_file_writer.h"
-#include "base/types/pass_key.h"
+#include "base/types/expected.h"
 #include "build/build_config.h"
 #include "components/services/storage/public/cpp/filesystem/filesystem_impl.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
-#include "mojo/public/cpp/bindings/self_owned_receiver.h"
 
 namespace storage {
 
@@ -112,7 +110,7 @@
   std::vector<base::FilePath> entries;
   remote_directory_->GetEntries(MakeRelative(path), mode, &error, &entries);
   if (error != base::File::FILE_OK)
-    return error;
+    return base::unexpected(error);
 
   // Fix up all the relative paths to be absolute.
   const base::FilePath root = path.IsAbsolute() ? path : root_.Append(path);
@@ -127,7 +125,7 @@
   if (!remote_directory_) {
     base::File file(MaybeMakeAbsolute(path), flags);
     if (!file.IsValid())
-      return file.error_details();
+      return base::unexpected(file.error_details());
     return file;
   }
 
@@ -161,7 +159,7 @@
       break;
     default:
       NOTREACHED() << "Invalid open mode flags: " << mode_flags;
-      return base::File::FILE_ERROR_FAILED;
+      return base::unexpected(base::File::FILE_ERROR_FAILED);
   }
 
   mojom::FileReadAccess read_access =
@@ -183,7 +181,7 @@
       break;
     default:
       NOTREACHED() << "Invalid write access flags: " << write_flags;
-      return base::File::FILE_ERROR_FAILED;
+      return base::unexpected(base::File::FILE_ERROR_FAILED);
   }
 
   base::File::Error error = base::File::FILE_ERROR_IO;
@@ -191,7 +189,7 @@
   remote_directory_->OpenFile(MakeRelative(path), mode, read_access,
                               write_access, &error, &file);
   if (error != base::File::FILE_OK)
-    return error;
+    return base::unexpected(error);
   return file;
 }
 
@@ -306,8 +304,8 @@
     base::FilePath full_path = MaybeMakeAbsolute(path);
     base::FileErrorOr<base::File> result =
         FilesystemImpl::LockFileLocal(full_path);
-    if (result.is_error())
-      return result.error();
+    if (!result.has_value())
+      return base::unexpected(result.error());
     std::unique_ptr<FileLock> lock = std::make_unique<LocalFileLockImpl>(
         std::move(full_path), std::move(result.value()));
     return lock;
@@ -316,9 +314,9 @@
   mojo::PendingRemote<mojom::FileLock> remote_lock;
   base::File::Error error = base::File::FILE_ERROR_IO;
   if (!remote_directory_->LockFile(MakeRelative(path), &error, &remote_lock))
-    return error;
+    return base::unexpected(error);
   if (error != base::File::FILE_OK)
-    return error;
+    return base::unexpected(error);
 
   std::unique_ptr<FileLock> lock =
       std::make_unique<RemoteFileLockImpl>(std::move(remote_lock));
diff --git a/components/services/storage/public/cpp/filesystem/filesystem_proxy_unittest.cc b/components/services/storage/public/cpp/filesystem/filesystem_proxy_unittest.cc
index dca0b4c..520b592 100644
--- a/components/services/storage/public/cpp/filesystem/filesystem_proxy_unittest.cc
+++ b/components/services/storage/public/cpp/filesystem/filesystem_proxy_unittest.cc
@@ -136,28 +136,28 @@
 TEST_P(FilesystemProxyTest, GetDirectoryEntries) {
   FileErrorOr<std::vector<base::FilePath>> result = proxy().GetDirectoryEntries(
       base::FilePath(), FilesystemProxy::DirectoryEntryType::kFilesOnly);
-  ASSERT_FALSE(result.is_error());
+  ASSERT_TRUE(result.has_value());
   EXPECT_THAT(result.value(),
               UnorderedElementsAre(MakeAbsolute(kFile1), MakeAbsolute(kFile2)));
 
   result = proxy().GetDirectoryEntries(
       base::FilePath(),
       FilesystemProxy::DirectoryEntryType::kFilesAndDirectories);
-  ASSERT_FALSE(result.is_error());
+  ASSERT_TRUE(result.has_value());
   EXPECT_THAT(result.value(),
               UnorderedElementsAre(MakeAbsolute(kFile1), MakeAbsolute(kFile2),
                                    MakeAbsolute(kDir1), MakeAbsolute(kDir2)));
 
   result = proxy().GetDirectoryEntries(
       kDir1, FilesystemProxy::DirectoryEntryType::kFilesOnly);
-  ASSERT_FALSE(result.is_error());
+  ASSERT_TRUE(result.has_value());
   EXPECT_THAT(result.value(),
               UnorderedElementsAre(MakeAbsolute(kDir1.Append(kDir1File1)),
                                    MakeAbsolute(kDir1.Append(kDir1File2))));
 
   result = proxy().GetDirectoryEntries(
       kDir1, FilesystemProxy::DirectoryEntryType::kFilesAndDirectories);
-  ASSERT_FALSE(result.is_error());
+  ASSERT_TRUE(result.has_value());
   EXPECT_THAT(result.value(),
               UnorderedElementsAre(MakeAbsolute(kDir1.Append(kDir1File1)),
                                    MakeAbsolute(kDir1.Append(kDir1File2)),
@@ -183,7 +183,7 @@
   FileErrorOr<base::File> file1 =
       proxy().OpenFile(kFile1, base::File::FLAG_OPEN | base::File::FLAG_READ |
                                    base::File::FLAG_WRITE);
-  EXPECT_FALSE(file1.is_error());
+  EXPECT_TRUE(file1.has_value());
   EXPECT_EQ(kFile1Contents, ReadFileContents(&file1.value()));
 }
 
@@ -199,7 +199,7 @@
   FileErrorOr<base::File> new_file = proxy().OpenFile(
       kNewFilename,
       base::File::FLAG_CREATE | base::File::FLAG_READ | base::File::FLAG_WRITE);
-  ASSERT_FALSE(new_file.is_error());
+  ASSERT_TRUE(new_file.has_value());
   EXPECT_EQ("", ReadFileContents(&new_file.value()));
 
   const std::string kData = "yeet";
@@ -212,7 +212,7 @@
   FileErrorOr<base::File> file1 = proxy().OpenFile(
       kFile1, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ |
                   base::File::FLAG_WRITE);
-  ASSERT_FALSE(file1.is_error());
+  ASSERT_TRUE(file1.has_value());
   EXPECT_TRUE(file1->IsValid());
   EXPECT_EQ(kFile1Contents, ReadFileContents(&file1.value()));
 
@@ -220,7 +220,7 @@
   FileErrorOr<base::File> new_file = proxy().OpenFile(
       kNewFilename, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ |
                         base::File::FLAG_WRITE);
-  ASSERT_FALSE(new_file.is_error());
+  ASSERT_TRUE(new_file.has_value());
   EXPECT_TRUE(new_file->IsValid());
   EXPECT_EQ("", ReadFileContents(&new_file.value()));
 }
@@ -229,7 +229,7 @@
   FileErrorOr<base::File> file1 = proxy().OpenFile(
       kFile1, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_READ |
                   base::File::FLAG_WRITE);
-  ASSERT_FALSE(file1.is_error());
+  ASSERT_TRUE(file1.has_value());
   EXPECT_TRUE(file1->IsValid());
   EXPECT_EQ("", ReadFileContents(&file1.value()));
 
@@ -237,7 +237,7 @@
   FileErrorOr<base::File> new_file = proxy().OpenFile(
       kNewFilename, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_READ |
                         base::File::FLAG_WRITE);
-  ASSERT_FALSE(new_file.is_error());
+  ASSERT_TRUE(new_file.has_value());
   EXPECT_TRUE(new_file->IsValid());
   EXPECT_EQ("", ReadFileContents(&new_file.value()));
 }
@@ -254,7 +254,7 @@
   FileErrorOr<base::File> file1 = proxy().OpenFile(
       kFile1, base::File::FLAG_OPEN_TRUNCATED | base::File::FLAG_READ |
                   base::File::FLAG_WRITE);
-  ASSERT_FALSE(file1.is_error());
+  ASSERT_TRUE(file1.has_value());
   EXPECT_TRUE(file1->IsValid());
   EXPECT_EQ("", ReadFileContents(&file1.value()));
 }
@@ -262,7 +262,7 @@
 TEST_P(FilesystemProxyTest, OpenFileReadOnly) {
   FileErrorOr<base::File> file =
       proxy().OpenFile(kFile1, base::File::FLAG_OPEN | base::File::FLAG_READ);
-  ASSERT_FALSE(file.is_error());
+  ASSERT_TRUE(file.has_value());
   EXPECT_TRUE(file->IsValid());
 
   // Writes should fail.
@@ -280,7 +280,7 @@
 TEST_P(FilesystemProxyTest, MAYBE_OpenFileWriteOnly) {
   FileErrorOr<base::File> file = proxy().OpenFile(
       kFile2, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
-  ASSERT_FALSE(file.is_error());
+  ASSERT_TRUE(file.has_value());
   EXPECT_TRUE(file->IsValid());
 
   const std::string kData{"files can have a little data, as a treat"};
@@ -305,7 +305,7 @@
   const base::FilePath kFile3{FILE_PATH_LITERAL("file3")};
   FileErrorOr<base::File> file = proxy().OpenFile(
       kFile3, base::File::FLAG_CREATE | base::File::FLAG_APPEND);
-  ASSERT_FALSE(file.is_error());
+  ASSERT_TRUE(file.has_value());
   EXPECT_TRUE(file->IsValid());
 
   const std::string kData{"files can have a little data, as a treat"};
@@ -336,14 +336,14 @@
 TEST_P(FilesystemProxyTest, MAYBE_DeleteFile) {
   FileErrorOr<base::File> file =
       proxy().OpenFile(kFile1, base::File::FLAG_OPEN | base ::File::FLAG_READ);
-  ASSERT_FALSE(file.is_error());
+  ASSERT_TRUE(file.has_value());
   EXPECT_TRUE(file->IsValid());
   file->Close();
 
   EXPECT_TRUE(proxy().DeleteFile(kFile1));
   file =
       proxy().OpenFile(kFile1, base::File::FLAG_OPEN | base ::File::FLAG_READ);
-  EXPECT_TRUE(file.is_error());
+  EXPECT_FALSE(file.has_value());
   EXPECT_EQ(base::File::FILE_ERROR_NOT_FOUND, file.error());
 }
 
@@ -426,7 +426,7 @@
   FileErrorOr<base::File> new_file = proxy().OpenFile(
       kNewFilename,
       base::File::FLAG_OPEN | base::File::FLAG_READ | base::File::FLAG_WRITE);
-  ASSERT_FALSE(new_file.is_error());
+  ASSERT_TRUE(new_file.has_value());
   EXPECT_TRUE(new_file->IsValid());
   EXPECT_EQ(kFile1Contents, ReadFileContents(&new_file.value()));
 }
@@ -442,27 +442,27 @@
   const base::FilePath kLockFilename{FILE_PATH_LITERAL("lox")};
   FileErrorOr<std::unique_ptr<FilesystemProxy::FileLock>> result =
       proxy().LockFile(kLockFilename);
-  ASSERT_FALSE(result.is_error());
+  ASSERT_FALSE(!result.has_value());
   EXPECT_NE(nullptr, result.value());
 
   FileErrorOr<std::unique_ptr<FilesystemProxy::FileLock>> result2 =
       proxy().LockFile(kLockFilename);
-  EXPECT_TRUE(result2.is_error());
+  EXPECT_FALSE(result2.has_value());
   EXPECT_EQ(base::File::FILE_ERROR_IN_USE, result2.error());
 
   // Synchronously release so we can re-acquire the lock.
   EXPECT_EQ(base::File::Error::FILE_OK, result.value()->Release());
 
   result2 = proxy().LockFile(kLockFilename);
-  ASSERT_FALSE(result2.is_error());
+  ASSERT_TRUE(result2.has_value());
   EXPECT_NE(nullptr, result2.value());
 
   // Test that destruction also implicitly releases the lock.
-  result2 = base::File::FILE_ERROR_FAILED;
+  result2 = base::unexpected(base::File::FILE_ERROR_FAILED);
 
   // And once again we should be able to reacquire the lock.
   result = proxy().LockFile(kLockFilename);
-  ASSERT_FALSE(result.is_error());
+  ASSERT_FALSE(!result.has_value());
   EXPECT_NE(nullptr, result.value());
 }
 
@@ -479,7 +479,7 @@
   // operate correctly.
   FileErrorOr<std::vector<base::FilePath>> result = proxy().GetDirectoryEntries(
       GetTestRoot(), FilesystemProxy::DirectoryEntryType::kFilesAndDirectories);
-  ASSERT_FALSE(result.is_error());
+  ASSERT_FALSE(!result.has_value());
   EXPECT_THAT(result.value(),
               UnorderedElementsAre(MakeAbsolute(kFile1), MakeAbsolute(kFile2),
                                    MakeAbsolute(kDir1), MakeAbsolute(kDir2)));
@@ -492,7 +492,7 @@
   FileErrorOr<std::vector<base::FilePath>> result = proxy().GetDirectoryEntries(
       GetTestRoot().Append(kDir1),
       FilesystemProxy::DirectoryEntryType::kFilesAndDirectories);
-  ASSERT_FALSE(result.is_error());
+  ASSERT_FALSE(!result.has_value());
   EXPECT_THAT(result.value(),
               UnorderedElementsAre(MakeAbsolute(kDir1.Append(kDir1File1)),
                                    MakeAbsolute(kDir1.Append(kDir1File2)),
diff --git a/components/services/storage/sandboxed_vfs_delegate.cc b/components/services/storage/sandboxed_vfs_delegate.cc
index 9f0df7c..6a3615c 100644
--- a/components/services/storage/sandboxed_vfs_delegate.cc
+++ b/components/services/storage/sandboxed_vfs_delegate.cc
@@ -26,7 +26,7 @@
   base::FileErrorOr<base::File> result = filesystem_->OpenFile(
       file_path, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_READ |
                      base::File::FLAG_WRITE);
-  if (result.is_error())
+  if (!result.has_value())
     return base::File();
   return std::move(result.value());
 }
diff --git a/components/test/data/autofill/heuristics/output/147_panera.custhelp.com_app_ask.out b/components/test/data/autofill/heuristics/output/147_panera.custhelp.com_app_ask.out
index a879f8e..1261b49 100644
--- a/components/test/data/autofill/heuristics/output/147_panera.custhelp.com_app_ask.out
+++ b/components/test/data/autofill/heuristics/output/147_panera.custhelp.com_app_ask.out
@@ -27,10 +27,10 @@
 UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_action | Gift Card Action |  | Incident.CustomFields.c.escalated_gift_card_devalue_1
 UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_issuer_person | Gift Card Issuer (person) | 588 | Incident.CustomFields.c.escalated_gift_card_devalue_1
 UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_appeasement_amt | Gift Card Appeasement $ Optional Optional |  | Incident.CustomFields.c.escalated_gift_card_devalue_1
-UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_amount_new | Gift Card Amount (new) Optional Optional |  | Incident.CustomFields.c.escalated_gift_card_devalue_1
+NUMERIC_QUANTITY | Incident.CustomFields.c.gift_card_amount_new | Gift Card Amount (new) Optional Optional |  | Incident.CustomFields.c.escalated_gift_card_devalue_1
 UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_new_card | Gift Card - New Card # Optional Optional |  | Incident.CustomFields.c.escalated_gift_card_devalue_1
 UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_box_number | Gift Card Box # Optional Optional |  | Incident.CustomFields.c.escalated_gift_card_devalue_1
-UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_frozen_amount | Gift Card Amount (frozen) Optional Optional |  | Incident.CustomFields.c.escalated_gift_card_devalue_1
+NUMERIC_QUANTITY | Incident.CustomFields.c.gift_card_frozen_amount | Gift Card Amount (frozen) Optional Optional |  | Incident.CustomFields.c.escalated_gift_card_devalue_1
 UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_frozen_card_number | Gift Card Frozen Card # Optional Optional |  | Incident.CustomFields.c.escalated_gift_card_devalue_1
 UNKNOWN_TYPE | Incident.CustomFields.c.gift_card_issuing_location | Gift Card Issuing Location Optional Optional |  | Incident.CustomFields.c.escalated_gift_card_devalue_1
 UNKNOWN_TYPE | Incident.CustomFields.c.chat_type | Chat Topic Please select the Chat topic that best fits the issue |  | Incident.CustomFields.c.escalated_gift_card_devalue_1
diff --git a/components/test/data/device_signals/empty.plist b/components/test/data/device_signals/empty.plist
new file mode 100644
index 0000000..36a8706
--- /dev/null
+++ b/components/test/data/device_signals/empty.plist
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+    <dict>
+    </dict>
+</plist>
diff --git a/components/test/data/device_signals/mix_array_dictionary.plist b/components/test/data/device_signals/mix_array_dictionary.plist
new file mode 100644
index 0000000..5aeb745
--- /dev/null
+++ b/components/test/data/device_signals/mix_array_dictionary.plist
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+    <dict>
+       <key>Key1</key>
+         <dict>
+          <key>SubKey1</key>
+          <dict>
+             <key>SubSubKey1</key>
+             <array>
+               <array>
+                 <string>string0</string>
+                 <string>string1</string>
+                 <string>string2</string>
+                 <string>string3</string>
+                 <string>string4</string>
+                 <string>string5</string>
+                 <string>string6</string>
+                 <string>string7</string>
+                 <string>string8</string>
+                 <string>string9</string>
+                <string>string10</string>
+                <string>string11</string>
+               </array>
+             </array>
+          </dict>
+         </dict>
+</dict>
+</plist>
diff --git a/components/test/data/device_signals/only_dictionary.plist b/components/test/data/device_signals/only_dictionary.plist
new file mode 100644
index 0000000..1e76924
--- /dev/null
+++ b/components/test/data/device_signals/only_dictionary.plist
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+	<key>RealKeyValue</key>
+	<real>0.123</real>
+	<key>DataKeyValue</key>
+	<data>SGVsbG8sIHdvcmxkIQ==</data>
+	<key>Key1</key>
+	<dict>
+		<key>SubKey1</key>
+		<dict>
+			<key>StringKeyValue</key>
+			<string>string</string>
+			<key>IntegerKeyValue</key>
+			<integer>100</integer>
+		</dict>
+			<key>BooleanKeyValue</key>
+			<true/>
+	</dict>
+</dict>
+</plist>
diff --git a/components/translate/content/android/BUILD.gn b/components/translate/content/android/BUILD.gn
index e2e7e3f..65fb37e 100644
--- a/components/translate/content/android/BUILD.gn
+++ b/components/translate/content/android/BUILD.gn
@@ -96,18 +96,26 @@
 }
 
 robolectric_library("junit") {
-  sources =
-      [ "java/src/org/chromium/components/translate/TranslateOptionsTest.java" ]
+  sources = [
+    "java/src/org/chromium/components/translate/TranslateMessageTest.java",
+    "java/src/org/chromium/components/translate/TranslateOptionsTest.java",
+  ]
   deps = [
     ":java",
+    "//base:base_java",
     "//base:base_java_test_support",
     "//base:base_junit_test_support",
+    "//components/browser_ui/widget/android:java",
+    "//components/messages/android:java",
+    "//content/public/android:content_java",
     "//third_party/android_deps:robolectric_all_java",
     "//third_party/android_support_test_runner:rules_java",
     "//third_party/android_support_test_runner:runner_java",
     "//third_party/androidx:androidx_appcompat_appcompat_java",
     "//third_party/androidx:androidx_test_runner_java",
     "//third_party/junit:junit",
+    "//third_party/mockito:mockito_java",
+    "//ui/android:ui_java",
   ]
 }
 
diff --git a/components/translate/content/android/java/src/org/chromium/components/translate/TranslateMessage.java b/components/translate/content/android/java/src/org/chromium/components/translate/TranslateMessage.java
index 892efe7b..2880a4bb 100644
--- a/components/translate/content/android/java/src/org/chromium/components/translate/TranslateMessage.java
+++ b/components/translate/content/android/java/src/org/chromium/components/translate/TranslateMessage.java
@@ -11,6 +11,7 @@
 import android.view.View;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
 
 import org.chromium.base.annotations.CalledByNative;
 import org.chromium.base.annotations.JNINamespace;
@@ -95,7 +96,8 @@
                 dismissalDurationSeconds);
     }
 
-    private TranslateMessage(@NonNull Context context, @NonNull MessageDispatcher messageDispatcher,
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)
+    TranslateMessage(@NonNull Context context, @NonNull MessageDispatcher messageDispatcher,
             @NonNull WebContents webContents, long nativeTranslateMessage,
             int dismissalDurationSeconds) {
         mContext = context;
diff --git a/components/translate/content/android/java/src/org/chromium/components/translate/TranslateMessageTest.java b/components/translate/content/android/java/src/org/chromium/components/translate/TranslateMessageTest.java
new file mode 100644
index 0000000..eacb949
--- /dev/null
+++ b/components/translate/content/android/java/src/org/chromium/components/translate/TranslateMessageTest.java
@@ -0,0 +1,327 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package org.chromium.components.translate;
+
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.eq;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoMoreInteractions;
+import static org.mockito.Mockito.verifyZeroInteractions;
+
+import android.app.Activity;
+import android.content.Context;
+
+import androidx.test.filters.SmallTest;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.mockito.MockitoAnnotations;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
+
+import org.chromium.base.UnownedUserDataHost;
+import org.chromium.base.test.BaseRobolectricTestRunner;
+import org.chromium.base.test.util.JniMocker;
+import org.chromium.components.messages.DismissReason;
+import org.chromium.components.messages.MessageBannerProperties;
+import org.chromium.components.messages.MessageDispatcher;
+import org.chromium.components.messages.MessageIdentifier;
+import org.chromium.components.messages.MessageScopeType;
+import org.chromium.components.messages.PrimaryActionClickBehavior;
+import org.chromium.components.messages.PrimaryWidgetAppearance;
+import org.chromium.components.messages.SecondaryMenuMaxSize;
+import org.chromium.content_public.browser.WebContents;
+import org.chromium.ui.base.WindowAndroid;
+import org.chromium.ui.modelutil.PropertyModel;
+
+import java.lang.ref.WeakReference;
+
+/**
+ * Unit tests for TranslateMessage.
+ */
+@RunWith(BaseRobolectricTestRunner.class)
+public final class TranslateMessageTest {
+    private static final long NATIVE_TRANSLATE_MESSAGE = 1337;
+    private static final int DISMISSAL_DURATION_SECONDS = 15;
+
+    private static final String TITLE_BEFORE_TRANSLATE = "Translate Page?";
+    private static final String TITLE_AFTER_TRANSLATE = "Page Translated";
+    private static final String PRIMARY_TEXT_TRANSLATE = "Translate";
+    private static final String PRIMARY_TEXT_UNDO = "Undo";
+    private static final String DESCRIPTION = "French to English";
+
+    @Rule
+    public JniMocker mJniMocker = new JniMocker();
+
+    @Mock
+    WebContents mWebContents;
+    @Mock
+    TranslateMessage.Natives mMockJni;
+    @Mock
+    Context mContext;
+    @Mock
+    MessageDispatcher mMessageDispatcher;
+
+    @Captor
+    ArgumentCaptor<PropertyModel> mPropertyModelCaptor;
+
+    @Before
+    public void setUp() {
+        MockitoAnnotations.initMocks(this);
+
+        mJniMocker.mock(TranslateMessageJni.TEST_HOOKS, mMockJni);
+    }
+
+    @Test
+    @SmallTest
+    public void testCreateWithNullWindowAndroid() {
+        doReturn(null).when(mWebContents).getTopLevelNativeWindow();
+        Assert.assertNull(TranslateMessage.create(
+                mWebContents, NATIVE_TRANSLATE_MESSAGE, DISMISSAL_DURATION_SECONDS));
+    }
+
+    @Test
+    @SmallTest
+    public void testCreateWithNullActivityWeakReference() {
+        WindowAndroid windowAndroid = Mockito.mock(WindowAndroid.class);
+        doReturn(null).when(windowAndroid).getActivity();
+        doReturn(windowAndroid).when(mWebContents).getTopLevelNativeWindow();
+        Assert.assertNull(TranslateMessage.create(
+                mWebContents, NATIVE_TRANSLATE_MESSAGE, DISMISSAL_DURATION_SECONDS));
+    }
+
+    @Test
+    @SmallTest
+    public void testCreateWithNullActivity() {
+        WindowAndroid windowAndroid = Mockito.mock(WindowAndroid.class);
+        doReturn(new WeakReference<Activity>(null)).when(windowAndroid).getActivity();
+        doReturn(windowAndroid).when(mWebContents).getTopLevelNativeWindow();
+        Assert.assertNull(TranslateMessage.create(
+                mWebContents, NATIVE_TRANSLATE_MESSAGE, DISMISSAL_DURATION_SECONDS));
+    }
+
+    @Test
+    @SmallTest
+    public void testCreateWithNullMessageDispatcher() {
+        Activity activity = Mockito.mock(Activity.class);
+        WindowAndroid windowAndroid = Mockito.mock(WindowAndroid.class);
+
+        doReturn(new WeakReference<Activity>(activity)).when(windowAndroid).getActivity();
+        doReturn(windowAndroid).when(mWebContents).getTopLevelNativeWindow();
+        doReturn(new UnownedUserDataHost()).when(windowAndroid).getUnownedUserDataHost();
+
+        Assert.assertNull(TranslateMessage.create(
+                mWebContents, NATIVE_TRANSLATE_MESSAGE, DISMISSAL_DURATION_SECONDS));
+    }
+
+    @Test
+    @SmallTest
+    public void testFullTranslateFlowThenDismissViaGesture() {
+        TranslateMessage translateMessage = new TranslateMessage(mContext, mMessageDispatcher,
+                mWebContents, NATIVE_TRANSLATE_MESSAGE, DISMISSAL_DURATION_SECONDS);
+
+        // Show the before translate message.
+        translateMessage.showMessage(TITLE_BEFORE_TRANSLATE, DESCRIPTION, PRIMARY_TEXT_TRANSLATE,
+                /*hasOverflowMenu=*/true);
+
+        verify(mMessageDispatcher)
+                .enqueueMessage(mPropertyModelCaptor.capture(), eq(mWebContents),
+                        eq(MessageScopeType.NAVIGATION), /*highPriority=*/eq(false));
+        PropertyModel messageProperties = mPropertyModelCaptor.getValue();
+
+        assertHasCommonProperties(messageProperties);
+        assertHasOverflowMenuProperties(messageProperties);
+        Assert.assertEquals(
+                TITLE_BEFORE_TRANSLATE, messageProperties.get(MessageBannerProperties.TITLE));
+        Assert.assertEquals(
+                DESCRIPTION, messageProperties.get(MessageBannerProperties.DESCRIPTION));
+        Assert.assertEquals(PrimaryWidgetAppearance.BUTTON_IF_TEXT_IS_SET,
+                messageProperties.get(MessageBannerProperties.PRIMARY_WIDGET_APPEARANCE));
+        Assert.assertEquals(PRIMARY_TEXT_TRANSLATE,
+                messageProperties.get(MessageBannerProperties.PRIMARY_BUTTON_TEXT));
+
+        // Show the translation-in-progress state upon clicking "Translate".
+        doAnswer(new Answer() {
+            @Override
+            public Object answer(InvocationOnMock invocation) {
+                translateMessage.showMessage(
+                        TITLE_BEFORE_TRANSLATE, DESCRIPTION, "", /*hasOverflowMenu=*/true);
+                return null;
+            }
+        })
+                .when(mMockJni)
+                .handlePrimaryAction(NATIVE_TRANSLATE_MESSAGE);
+
+        Assert.assertEquals(new Integer(PrimaryActionClickBehavior.DO_NOT_DISMISS),
+                messageProperties.get(MessageBannerProperties.ON_PRIMARY_ACTION).get());
+
+        verifyNoMoreInteractions(mMessageDispatcher);
+
+        assertHasCommonProperties(messageProperties);
+        assertHasOverflowMenuProperties(messageProperties);
+        Assert.assertEquals(
+                TITLE_BEFORE_TRANSLATE, messageProperties.get(MessageBannerProperties.TITLE));
+        Assert.assertEquals(
+                DESCRIPTION, messageProperties.get(MessageBannerProperties.DESCRIPTION));
+        Assert.assertEquals(PrimaryWidgetAppearance.PROGRESS_SPINNER,
+                messageProperties.get(MessageBannerProperties.PRIMARY_WIDGET_APPEARANCE));
+
+        // Show the after translate message.
+        translateMessage.showMessage(
+                TITLE_AFTER_TRANSLATE, DESCRIPTION, PRIMARY_TEXT_UNDO, /*hasOverflowMenu=*/true);
+
+        verifyNoMoreInteractions(mMessageDispatcher);
+
+        assertHasCommonProperties(messageProperties);
+        assertHasOverflowMenuProperties(messageProperties);
+        Assert.assertEquals(
+                TITLE_AFTER_TRANSLATE, messageProperties.get(MessageBannerProperties.TITLE));
+        Assert.assertEquals(
+                DESCRIPTION, messageProperties.get(MessageBannerProperties.DESCRIPTION));
+        Assert.assertEquals(PrimaryWidgetAppearance.BUTTON_IF_TEXT_IS_SET,
+                messageProperties.get(MessageBannerProperties.PRIMARY_WIDGET_APPEARANCE));
+        Assert.assertEquals(PRIMARY_TEXT_UNDO,
+                messageProperties.get(MessageBannerProperties.PRIMARY_BUTTON_TEXT));
+
+        messageProperties.get(MessageBannerProperties.ON_DISMISSED).onResult(DismissReason.GESTURE);
+        verify(mMockJni).handleDismiss(NATIVE_TRANSLATE_MESSAGE, DismissReason.GESTURE);
+    }
+
+    @Test
+    @SmallTest
+    public void testShowMessageWithoutOverflowMenu() {
+        TranslateMessage translateMessage = new TranslateMessage(mContext, mMessageDispatcher,
+                mWebContents, NATIVE_TRANSLATE_MESSAGE, DISMISSAL_DURATION_SECONDS);
+
+        // Show the message.
+        translateMessage.showMessage(TITLE_BEFORE_TRANSLATE, DESCRIPTION, PRIMARY_TEXT_TRANSLATE,
+                /*hasOverflowMenu=*/false);
+
+        verify(mMessageDispatcher)
+                .enqueueMessage(mPropertyModelCaptor.capture(), eq(mWebContents),
+                        eq(MessageScopeType.NAVIGATION), /*highPriority=*/eq(false));
+        PropertyModel messageProperties = mPropertyModelCaptor.getValue();
+
+        assertHasCommonProperties(messageProperties);
+        Assert.assertFalse(messageProperties.getAllSetProperties().contains(
+                MessageBannerProperties.SECONDARY_ICON_RESOURCE_ID));
+        Assert.assertEquals(
+                TITLE_BEFORE_TRANSLATE, messageProperties.get(MessageBannerProperties.TITLE));
+        Assert.assertEquals(
+                DESCRIPTION, messageProperties.get(MessageBannerProperties.DESCRIPTION));
+        Assert.assertEquals(PrimaryWidgetAppearance.BUTTON_IF_TEXT_IS_SET,
+                messageProperties.get(MessageBannerProperties.PRIMARY_WIDGET_APPEARANCE));
+        Assert.assertEquals(PRIMARY_TEXT_TRANSLATE,
+                messageProperties.get(MessageBannerProperties.PRIMARY_BUTTON_TEXT));
+    }
+
+    @Test
+    @SmallTest
+    public void testDismissFromNative() {
+        TranslateMessage translateMessage = new TranslateMessage(mContext, mMessageDispatcher,
+                mWebContents, NATIVE_TRANSLATE_MESSAGE, DISMISSAL_DURATION_SECONDS);
+        translateMessage.showMessage(TITLE_BEFORE_TRANSLATE, DESCRIPTION, PRIMARY_TEXT_TRANSLATE,
+                /*hasOverflowMenu=*/true);
+
+        verify(mMessageDispatcher)
+                .enqueueMessage(mPropertyModelCaptor.capture(), eq(mWebContents),
+                        eq(MessageScopeType.NAVIGATION), /*highPriority=*/eq(false));
+        PropertyModel messageProperties = mPropertyModelCaptor.getValue();
+
+        // Call the ON_DISMISSED callback from MessageDispatcher.dismissMessage.
+        doAnswer(new Answer() {
+            @Override
+            public Object answer(InvocationOnMock invocation) {
+                messageProperties.get(MessageBannerProperties.ON_DISMISSED)
+                        .onResult(DismissReason.DISMISSED_BY_FEATURE);
+                return null;
+            }
+        })
+                .when(mMessageDispatcher)
+                .dismissMessage(messageProperties, DismissReason.DISMISSED_BY_FEATURE);
+
+        translateMessage.dismiss();
+
+        verify(mMockJni).handleDismiss(
+                NATIVE_TRANSLATE_MESSAGE, DismissReason.DISMISSED_BY_FEATURE);
+    }
+
+    @Test
+    @SmallTest
+    public void testClearNativePointer() {
+        TranslateMessage translateMessage = new TranslateMessage(mContext, mMessageDispatcher,
+                mWebContents, NATIVE_TRANSLATE_MESSAGE, DISMISSAL_DURATION_SECONDS);
+        translateMessage.showMessage(TITLE_BEFORE_TRANSLATE, DESCRIPTION, PRIMARY_TEXT_TRANSLATE,
+                /*hasOverflowMenu=*/true);
+
+        verify(mMessageDispatcher)
+                .enqueueMessage(mPropertyModelCaptor.capture(), eq(mWebContents),
+                        eq(MessageScopeType.NAVIGATION), /*highPriority=*/eq(false));
+        PropertyModel messageProperties = mPropertyModelCaptor.getValue();
+
+        translateMessage.clearNativePointer();
+
+        // No native methods should be called after clearing the native pointer.
+        messageProperties.get(MessageBannerProperties.ON_PRIMARY_ACTION).get();
+        messageProperties.get(MessageBannerProperties.ON_DISMISSED).onResult(DismissReason.GESTURE);
+        Assert.assertNull(translateMessage.handleSecondaryMenuItemClicked(
+                new TranslateMessage.MenuItem("More languages", "", false, 2, "")));
+
+        verifyZeroInteractions(mMockJni);
+    }
+
+    @Test
+    @SmallTest
+    public void testConstructMenuItemArray() {
+        final String[] titles = new String[] {"foo", "bar", "", "English", "French"};
+        final String[] subtitles = new String[] {"", "", "", "", "Français"};
+        final boolean[] hasCheckmarks = new boolean[] {false, true, false, false, false};
+        final int[] overflowMenuItemIds = new int[] {0, 1, 2, 3, 4};
+        final String[] languageCodes = new String[] {"", "", "", "en", "fr"};
+
+        TranslateMessage.MenuItem[] menuItems = TranslateMessage.constructMenuItemArray(
+                titles, subtitles, hasCheckmarks, overflowMenuItemIds, languageCodes);
+        Assert.assertEquals(titles.length, menuItems.length);
+        for (int i = 0; i < menuItems.length; ++i) {
+            Assert.assertEquals(titles[i], menuItems[i].title);
+            Assert.assertEquals(subtitles[i], menuItems[i].subtitle);
+            Assert.assertEquals(hasCheckmarks[i], menuItems[i].hasCheckmark);
+            Assert.assertEquals(overflowMenuItemIds[i], menuItems[i].overflowMenuItemId);
+            Assert.assertEquals(languageCodes[i], menuItems[i].languageCode);
+        }
+    }
+
+    private static void assertHasCommonProperties(PropertyModel messageProperties) {
+        Assert.assertEquals(MessageIdentifier.TRANSLATE,
+                messageProperties.get(MessageBannerProperties.MESSAGE_IDENTIFIER));
+        Assert.assertEquals(R.drawable.infobar_translate_compact,
+                messageProperties.get(MessageBannerProperties.ICON_RESOURCE_ID));
+        Assert.assertEquals(MessageBannerProperties.TINT_NONE,
+                messageProperties.get(MessageBannerProperties.ICON_TINT_COLOR));
+        Assert.assertEquals(DISMISSAL_DURATION_SECONDS,
+                messageProperties.get(MessageBannerProperties.DISMISSAL_DURATION));
+        Assert.assertNotNull(messageProperties.get(MessageBannerProperties.ON_PRIMARY_ACTION));
+        Assert.assertNotNull(messageProperties.get(MessageBannerProperties.ON_DISMISSED));
+    }
+
+    private static void assertHasOverflowMenuProperties(PropertyModel messageProperties) {
+        Assert.assertEquals(R.drawable.settings_cog,
+                messageProperties.get(MessageBannerProperties.SECONDARY_ICON_RESOURCE_ID));
+        Assert.assertNotNull(
+                messageProperties.get(MessageBannerProperties.SECONDARY_MENU_BUTTON_DELEGATE));
+        Assert.assertEquals(SecondaryMenuMaxSize.LARGE,
+                messageProperties.get(MessageBannerProperties.SECONDARY_MENU_MAX_SIZE));
+        Assert.assertEquals(MessageIdentifier.TRANSLATE,
+                messageProperties.get(MessageBannerProperties.MESSAGE_IDENTIFIER));
+    }
+}
diff --git a/components/user_manager/user_image/user_image.h b/components/user_manager/user_image/user_image.h
index 17c9402..e3331cdb 100644
--- a/components/user_manager/user_image/user_image.h
+++ b/components/user_manager/user_image/user_image.h
@@ -26,6 +26,8 @@
     FORMAT_JPEG,
     FORMAT_PNG,
     FORMAT_UNKNOWN,
+    // Useful when the image is external and animated.
+    FORMAT_WEBP,
   };
 
   // Encodes the given bitmap to bytes representation in |image_format| for
diff --git a/components/viz/common/quads/render_pass_io.cc b/components/viz/common/quads/render_pass_io.cc
index 3e665ae..0d4c56e 100644
--- a/components/viz/common/quads/render_pass_io.cc
+++ b/components/viz/common/quads/render_pass_io.cc
@@ -210,12 +210,10 @@
   return dict;
 }
 
-bool PointFFromDict(const base::Value& dict, gfx::PointF* point) {
+bool PointFFromDict(const base::Value::Dict& dict, gfx::PointF* point) {
   DCHECK(point);
-  if (!dict.is_dict())
-    return false;
-  absl::optional<double> x = dict.FindDoubleKey("x");
-  absl::optional<double> y = dict.FindDoubleKey("y");
+  absl::optional<double> x = dict.FindDouble("x");
+  absl::optional<double> y = dict.FindDouble("y");
   if (!x || !y) {
     return false;
   }
@@ -230,9 +228,13 @@
 
 bool Vector2dFFromDict(const base::Value& dict, gfx::Vector2dF* v) {
   DCHECK(v);
-  gfx::PointF point;
-  if (!PointFFromDict(dict, &point))
+  if (!dict.is_dict())
     return false;
+
+  gfx::PointF point;
+  if (!PointFFromDict(dict.GetDict(), &point))
+    return false;
+
   v->set_x(point.x());
   v->set_y(point.y());
   return true;
@@ -1418,7 +1420,7 @@
   const base::Value::Dict* mask_texture_size =
       dict.FindDict("mask_texture_size");
   const base::Value* filters_scale = dict_value.FindDictKey("filters_scale");
-  const base::Value* filters_origin = dict_value.FindDictKey("filters_origin");
+  const base::Value::Dict* filters_origin = dict.FindDict("filters_origin");
   const base::Value::Dict* tex_coord_rect = dict.FindDict("tex_coord_rect");
   absl::optional<double> backdrop_filter_quality =
       dict.FindDouble("backdrop_filter_quality");
@@ -1512,29 +1514,29 @@
   return true;
 }
 
-bool TextureDrawQuadFromDict(const base::Value& dict,
+bool TextureDrawQuadFromDict(const base::Value& dict_value,
                              const DrawQuadCommon& common,
                              TextureDrawQuad* draw_quad) {
   DCHECK(draw_quad);
-  if (!dict.is_dict())
+  if (!dict_value.is_dict())
     return false;
   if (common.resources.count != 1u)
     return false;
 
+  const base::Value::Dict& dict = dict_value.GetDict();
   absl::optional<bool> premultiplied_alpha =
-      dict.FindBoolKey("premultiplied_alpha");
-  const base::Value* uv_top_left = dict.FindDictKey("uv_top_left");
-  const base::Value* uv_bottom_right = dict.FindDictKey("uv_bottom_right");
-  const base::Value* vertex_opacity = dict.FindListKey("vertex_opacity");
-  const base::Value* damage_rect = dict.FindDictKey("damage_rect");
-  absl::optional<bool> y_flipped = dict.FindBoolKey("y_flipped");
-  absl::optional<bool> nearest_neighbor = dict.FindBoolKey("nearest_neighbor");
-  absl::optional<bool> secure_output_only =
-      dict.FindBoolKey("secure_output_only");
+      dict.FindBool("premultiplied_alpha");
+  const base::Value::Dict* uv_top_left = dict.FindDict("uv_top_left");
+  const base::Value::Dict* uv_bottom_right = dict.FindDict("uv_bottom_right");
+  const base::Value* vertex_opacity = dict_value.FindListKey("vertex_opacity");
+  const base::Value* damage_rect = dict_value.FindDictKey("damage_rect");
+  absl::optional<bool> y_flipped = dict.FindBool("y_flipped");
+  absl::optional<bool> nearest_neighbor = dict.FindBool("nearest_neighbor");
+  absl::optional<bool> secure_output_only = dict.FindBool("secure_output_only");
   const std::string* protected_video_type =
-      dict.FindStringKey("protected_video_type");
+      dict.FindString("protected_video_type");
   const base::Value::Dict* resource_size_in_pixels =
-      dict.GetDict().FindDict("resource_size_in_pixels");
+      dict.FindDict("resource_size_in_pixels");
 
   if (!premultiplied_alpha || !uv_top_left || !uv_bottom_right ||
       !vertex_opacity || !y_flipped || !nearest_neighbor ||
@@ -1552,7 +1554,7 @@
   if (!PointFFromDict(*uv_top_left, &t_uv_top_left) ||
       !PointFFromDict(*uv_bottom_right, &t_uv_bottom_right) ||
       !SizeFromDict(*resource_size_in_pixels, &t_resource_size_in_pixels) ||
-      !ColorFromDict(dict, "background_color", &t_background_color)) {
+      !ColorFromDict(dict_value, "background_color", &t_background_color)) {
     return false;
   }
   float t_vertex_opacity[4];
@@ -1568,8 +1570,7 @@
       nearest_neighbor.value(), secure_output_only.value(),
       static_cast<gfx::ProtectedVideoType>(protected_video_type_index));
 
-  draw_quad->is_stream_video =
-      dict.FindBoolKey("is_stream_video").value_or(false);
+  draw_quad->is_stream_video = dict.FindBool("is_stream_video").value_or(false);
 
   gfx::Rect t_damage_rect;
   if (damage_rect && RectFromDict(*damage_rect, &t_damage_rect)) {
diff --git a/components/viz/common/resources/transferable_resource.h b/components/viz/common/resources/transferable_resource.h
index db88f375..de70043 100644
--- a/components/viz/common/resources/transferable_resource.h
+++ b/components/viz/common/resources/transferable_resource.h
@@ -53,6 +53,7 @@
   ReturnedResource ToReturnedResource() const;
   static std::vector<ReturnedResource> ReturnResources(
       const std::vector<TransferableResource>& input);
+  bool is_null() const { return mailbox_holder.mailbox.IsZero(); }
 
   static TransferableResource MakeSoftware(const SharedBitmapId& id,
                                            const gfx::Size& size,
diff --git a/components/viz/service/surfaces/surface_saved_frame.cc b/components/viz/service/surfaces/surface_saved_frame.cc
index 3b9f6a4..498a171 100644
--- a/components/viz/service/surfaces/surface_saved_frame.cc
+++ b/components/viz/service/surfaces/surface_saved_frame.cc
@@ -97,7 +97,7 @@
   DCHECK_EQ(copy_request_count_, ExpectedResultCount());
 
   if (copy_request_count_ == 0) {
-    frame_result_.emplace();
+    InitFrameResult();
     std::move(directive_finished_callback_).Run(directive_.sequence_id());
   }
 }
@@ -157,7 +157,7 @@
 
   ++valid_result_count_;
   if (!frame_result_) {
-    frame_result_.emplace();
+    InitFrameResult();
     // Resize to the number of shared elements, even if some will be nullopts.
     frame_result_->shared_results.resize(directive_.shared_elements().size());
   }
@@ -206,7 +206,7 @@
       SkImageInfo::MakeN32Premul(kDefaultTextureSizeForTesting.width(),
                                  kDefaultTextureSizeForTesting.height()));
 
-  frame_result_.emplace();
+  InitFrameResult();
   frame_result_->root_result.bitmap = std::move(bitmap);
   frame_result_->root_result.draw_data.size = kDefaultTextureSizeForTesting;
   frame_result_->root_result.draw_data.target_transform.MakeIdentity();
@@ -220,6 +220,11 @@
   DCHECK(IsValid());
 }
 
+void SurfaceSavedFrame::InitFrameResult() {
+  frame_result_.emplace();
+  frame_result_->empty_resource_ids = GetEmptyResourceIds();
+}
+
 SurfaceSavedFrame::RenderPassDrawData::RenderPassDrawData() = default;
 SurfaceSavedFrame::RenderPassDrawData::RenderPassDrawData(
     const CompositorRenderPass& render_pass,
diff --git a/components/viz/service/surfaces/surface_saved_frame.h b/components/viz/service/surfaces/surface_saved_frame.h
index 33570b3..0b1ed4d 100644
--- a/components/viz/service/surfaces/surface_saved_frame.h
+++ b/components/viz/service/surfaces/surface_saved_frame.h
@@ -76,6 +76,7 @@
 
     OutputCopyResult root_result;
     std::vector<absl::optional<OutputCopyResult>> shared_results;
+    base::flat_set<SharedElementResourceId> empty_resource_ids;
   };
 
   SurfaceSavedFrame(CompositorFrameTransitionDirective directive,
@@ -111,6 +112,7 @@
                                   std::unique_ptr<CopyOutputResult> result);
 
   size_t ExpectedResultCount() const;
+  void InitFrameResult();
 
   // Collects metadata to create a copy of the source CompositorFrame for shared
   // element snapshots.
diff --git a/components/viz/service/transitions/surface_animation_manager.cc b/components/viz/service/transitions/surface_animation_manager.cc
index d5a8a18..027cf1fd 100644
--- a/components/viz/service/transitions/surface_animation_manager.cc
+++ b/components/viz/service/transitions/surface_animation_manager.cc
@@ -444,6 +444,7 @@
   // structure which has transferable resources.
   saved_textures_.emplace(
       transferable_resource_tracker_.ImportResources(std::move(saved_frame)));
+  empty_resource_ids_.clear();
   return true;
 }
 
@@ -1208,6 +1209,9 @@
 
     if (texture_it != saved_textures_->element_id_to_resource.end()) {
       const auto& transferable_resource = texture_it->second;
+      if (transferable_resource.is_null())
+        return true;
+
       resource_list->push_back(transferable_resource);
 
       // GPU textures are flipped but software bitmaps are not.
diff --git a/components/viz/service/transitions/transferable_resource_tracker.cc b/components/viz/service/transitions/transferable_resource_tracker.cc
index 1e4cb52..a6cd399 100644
--- a/components/viz/service/transitions/transferable_resource_tracker.cc
+++ b/components/viz/service/transitions/transferable_resource_tracker.cc
@@ -58,6 +58,12 @@
       }
     }
   }
+
+  for (auto resource_id : frame_copy->empty_resource_ids) {
+    DCHECK(!resource_frame.element_id_to_resource.contains(resource_id));
+    resource_frame.element_id_to_resource[resource_id] = TransferableResource();
+  }
+
   return resource_frame;
 }
 
diff --git a/content/browser/accessibility/browser_accessibility_state_impl_android.cc b/content/browser/accessibility/browser_accessibility_state_impl_android.cc
index 9cc6bf63..e134262 100644
--- a/content/browser/accessibility/browser_accessibility_state_impl_android.cc
+++ b/content/browser/accessibility/browser_accessibility_state_impl_android.cc
@@ -21,6 +21,23 @@
 
 namespace {
 
+// These are hashes of different accessibility services which are generally used
+// as part of an assistive technology.
+const uint32_t kAssistiveTechPackageHashes[] = {
+    0x349d4b1a,  // Android Accessibility Suite
+    0xa5a469fc,  // Sound Amplifier
+    0xb13e6179,  // Action Blocks Accessibility
+    0xb38ef877,  // Voice Access
+    0xbc2897b4,  // BrailleBack
+};
+
+// These are hashes of different "accessibility" services that enable
+// accessibility but are only using it in the context of password management.
+const uint32_t kPasswordPackageHashes[] = {
+    0x013b76f2, 0x31cd47e3, 0x353cf6c5, 0x48723526, 0x4a8cfa8a,
+    0x7e0ad835, 0x7e3515d0, 0x8e4c009f, 0x920ad3bd, 0xca841f39,
+};
+
 // IMPORTANT!
 // These values are written to logs.  Do not renumber or delete
 // existing items; add new entries to the end of the list.
@@ -76,7 +93,7 @@
   UMA_FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 42,
   UMA_FLAG_RETRIEVE_INTERACTIVE_WINDOWS = 43,
   UMA_SERVICE_TYPE_UNKNOWN = 44,
-  UMA_SERVICE_TYPE_PASSWORD_MANAGER = 45,  // unused
+  UMA_SERVICE_TYPE_PASSWORD_MANAGER = 45,
   UMA_SERVICE_TYPE_ASSISTIVE_TECH = 46,
 
   UMA_CAPABILITY_CAN_REQUEST_FINGERPRINT_GESTURES = 47,
@@ -88,6 +105,17 @@
   UMA_FLAG_REQUEST_SHORTCUT_WARNING_DIALOG_SPOKEN_FEEDBACK = 53,
   UMA_FLAG_SERVICE_HANDLES_DOUBLE_TAP = 54,
 
+  UMA_SERVICE_TYPE_ASSISTIVE_TECH_WITH_PASSWORD_MANAGER = 55,
+  UMA_SERVICE_TYPE_ASSISTIVE_TECH_WITH_UNKNOWN = 56,
+  UMA_SERVICE_TYPE_PASSWORD_MANAGER_WITH_UNKNOWN = 57,
+  UMA_SERVICE_TYPE_ALL_VARIANTS = 58,
+
+  UMA_EVENT_SPEECH_STATE_CHANGE = 59,
+  UMA_FEEDBACK_ALL_MASK = 60,
+  UMA_FLAG_REQUEST_2_FINGER_PASSTHROUGH = 61,
+  UMA_FLAG_SEND_MOTION_EVENTS = 62,
+  UMA_FLAG_INPUT_METHOD_EDITOR = 63,
+
   // This must always be the last enum. It's okay for its value to
   // increase, but none of the other enum values may change.
   UMA_ACCESSIBILITYSERVICEINFO_MAX
@@ -97,7 +125,7 @@
 // android.view.accessibility.AccessibilityEvent in Java.
 //
 // If you add a new constant, add a new UMA enum above and add a line
-// to CollectAccessibilityServiceStats(), below.
+// to RecordAccessibilityServiceStatsHistogram(), below.
 enum {
   ACCESSIBILITYEVENT_TYPE_VIEW_CLICKED = 0x00000001,
   ACCESSIBILITYEVENT_TYPE_VIEW_LONG_CLICKED = 0x00000002,
@@ -125,13 +153,14 @@
   ACCESSIBILITYEVENT_TYPE_WINDOWS_CHANGED = 0x00400000,
   ACCESSIBILITYEVENT_TYPE_VIEW_CONTEXT_CLICKED = 0x00800000,
   ACCESSIBILITYEVENT_TYPE_ASSIST_READING_CONTEXT = 0x01000000,
+  ACCESSIBILITYEVENT_TYPE_SPEECH_STATE_CHANGE = 0x02000000,
 };
 
 // These are constants from
 // android.accessibilityservice.AccessibilityServiceInfo in Java:
 //
 // If you add a new constant, add a new UMA enum above and add a line
-// to CollectAccessibilityServiceStats(), below.
+// to RecordAccessibilityServiceStatsHistogram(), below.
 enum {
   ACCESSIBILITYSERVICEINFO_CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 0x00000001,
   ACCESSIBILITYSERVICEINFO_CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION =
@@ -151,20 +180,25 @@
   ACCESSIBILITYSERVICEINFO_FEEDBACK_VISUAL = 0x0000008,
   ACCESSIBILITYSERVICEINFO_FEEDBACK_GENERIC = 0x0000010,
   ACCESSIBILITYSERVICEINFO_FEEDBACK_BRAILLE = 0x0000020,
+  ACCESSIBILITYSERVICEINFO_FEEDBACK_ALL_MASK = 0xFFFFFFFF,
   ACCESSIBILITYSERVICEINFO_FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 0x0000002,
   ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 0x0000004,
   ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 0x00000008,
   ACCESSIBILITYSERVICEINFO_FLAG_REPORT_VIEW_IDS = 0x00000010,
   ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_FILTER_KEY_EVENTS = 0x00000020,
   ACCESSIBILITYSERVICEINFO_FLAG_RETRIEVE_INTERACTIVE_WINDOWS = 0x00000040,
-  ACCESSIBILITYSERVICEINFO_FLAG_FORCE_DIRECT_BOOT_AWARE = 0x00010000,
+
   ACCESSIBILITYSERVICEINFO_FLAG_ENABLE_ACCESSIBILITY_VOLUME = 0x00000080,
   ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_ACCESSIBILITY_BUTTON = 0x00000100,
   ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_FINGERPRINT_GESTURES = 0x00000200,
-  ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_MULTI_FINGER_GESTURES = 0x00001000,
   ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_SHORTCUT_WARNING_DIALOG_SPOKEN_FEEDBACK =
       0x00000400,
   ACCESSIBILITYSERVICEINFO_FLAG_SERVICE_HANDLES_DOUBLE_TAP = 0x00000800,
+  ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_MULTI_FINGER_GESTURES = 0x00001000,
+  ACCESSIBILITYSERVICEINFO_FLAG_REQUEST_2_FINGER_PASSTHROUGH = 0x0002000,
+  ACCESSIBILITYSERVICEINFO_FLAG_SEND_MOTION_EVENTS = 0x0004000,
+  ACCESSIBILITYSERVICEINFO_FLAG_INPUT_METHOD_EDITOR = 0x0008000,
+  ACCESSIBILITYSERVICEINFO_FLAG_FORCE_DIRECT_BOOT_AWARE = 0x00010000,
 };
 
 // These macros simplify recording a histogram based on information we get
@@ -176,33 +210,46 @@
 // Doing this with macros reduces the chance for human error by
 // recording the wrong histogram for the wrong flag.
 //
-// These macros are used by CollectAccessibilityServiceStats(), below.
-#define EVENT_TYPE_HISTOGRAM(event_type_mask, event_type)       \
-  if (event_type_mask & ACCESSIBILITYEVENT_TYPE_##event_type)   \
-  UMA_HISTOGRAM_ENUMERATION("Accessibility.AndroidServiceInfo", \
-                            UMA_EVENT_##event_type,             \
+// These macros are used by RecordAccessibilityServiceStatsHistogram(), below.
+#define EVENT_TYPE_HISTOGRAM(event_type_mask, event_type, histogram) \
+  if (event_type_mask & ACCESSIBILITYEVENT_TYPE_##event_type)        \
+  UMA_HISTOGRAM_ENUMERATION(histogram, UMA_EVENT_##event_type,       \
                             UMA_ACCESSIBILITYSERVICEINFO_MAX)
-#define FLAGS_HISTOGRAM(flags_mask, flag)                       \
-  if (flags_mask & ACCESSIBILITYSERVICEINFO_FLAG_##flag)        \
-  UMA_HISTOGRAM_ENUMERATION("Accessibility.AndroidServiceInfo", \
-                            UMA_FLAG_##flag, UMA_ACCESSIBILITYSERVICEINFO_MAX)
-#define FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, feedback_type)            \
+#define FLAGS_HISTOGRAM(flags_mask, flag, histogram)     \
+  if (flags_mask & ACCESSIBILITYSERVICEINFO_FLAG_##flag) \
+  UMA_HISTOGRAM_ENUMERATION(histogram, UMA_FLAG_##flag,  \
+                            UMA_ACCESSIBILITYSERVICEINFO_MAX)
+#define FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, feedback_type, histogram) \
   if (feedback_type_mask & ACCESSIBILITYSERVICEINFO_FEEDBACK_##feedback_type) \
-  UMA_HISTOGRAM_ENUMERATION("Accessibility.AndroidServiceInfo",               \
-                            UMA_FEEDBACK_##feedback_type,                     \
+  UMA_HISTOGRAM_ENUMERATION(histogram, UMA_FEEDBACK_##feedback_type,          \
                             UMA_ACCESSIBILITYSERVICEINFO_MAX)
-#define CAPABILITY_TYPE_HISTOGRAM(capability_type_mask, capability_type) \
+#define CAPABILITY_TYPE_HISTOGRAM(capability_type_mask, capability_type, \
+                                  histogram)                             \
   if (capability_type_mask &                                             \
       ACCESSIBILITYSERVICEINFO_CAPABILITY_##capability_type)             \
-  UMA_HISTOGRAM_ENUMERATION("Accessibility.AndroidServiceInfo",          \
-                            UMA_CAPABILITY_##capability_type,            \
+  UMA_HISTOGRAM_ENUMERATION(histogram, UMA_CAPABILITY_##capability_type, \
                             UMA_ACCESSIBILITYSERVICEINFO_MAX)
-#define SERVICE_TYPE_HISTOGRAM(check, name)                       \
-  if (check)                                                      \
-    UMA_HISTOGRAM_ENUMERATION("Accessibility.AndroidServiceInfo", \
-                              UMA_SERVICE_TYPE_##name,            \
-                              UMA_ACCESSIBILITYSERVICEINFO_MAX);
+#define SERVICE_TYPE_HISTOGRAM(service_type, histogram) \
+  UMA_HISTOGRAM_ENUMERATION(histogram, service_type,    \
+                            UMA_ACCESSIBILITYSERVICEINFO_MAX);
 
+// This macro simplifies the recording of the aggregate accessibility
+// information in the CollectAccessibilityServiceStats() method, below.
+//
+// There are 7 possible variants of the "Accessibility.AndroidServiceInfo.{}"
+// histogram. We consider users that have: assistive tech, password managers, or
+// an unknown service enabled. We track the 7 possible subsets of these (the
+// empty set of nothing enabled is implicitly tracked by whichever users do not
+// belong to one of the other groups). Requested event, feedback, flag, and
+// capabilities are recorded per subset.
+#define RECORD_ALL_HISTOGRAMS(event, feedback, flag, capability,  \
+                              service_type_variant)               \
+  RecordAccessibilityServiceStatsHistogram(                       \
+      event, feedback, flag, capability,                          \
+      "Accessibility.AndroidServiceInfo." #service_type_variant); \
+  SERVICE_TYPE_HISTOGRAM(                                         \
+      UMA_SERVICE_TYPE_##service_type_variant,                    \
+      "Accessibility.AndroidServiceInfo." #service_type_variant)
 }  // namespace
 
 BrowserAccessibilityStateImplAndroid::BrowserAccessibilityStateImplAndroid() {
@@ -216,87 +263,26 @@
   JNIEnv* env = AttachCurrentThread();
   int event_type_mask =
       Java_BrowserAccessibilityState_getAccessibilityServiceEventTypeMask(env);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, ANNOUNCEMENT);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, ASSIST_READING_CONTEXT);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, GESTURE_DETECTION_END);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, GESTURE_DETECTION_START);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, NOTIFICATION_STATE_CHANGED);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, TOUCH_EXPLORATION_GESTURE_END);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, TOUCH_EXPLORATION_GESTURE_START);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, TOUCH_INTERACTION_END);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, TOUCH_INTERACTION_START);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_ACCESSIBILITY_FOCUSED);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_ACCESSIBILITY_FOCUS_CLEARED);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_CLICKED);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_CONTEXT_CLICKED);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_FOCUSED);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_HOVER_ENTER);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_HOVER_EXIT);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_LONG_CLICKED);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_SCROLLED);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_SELECTED);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_TEXT_CHANGED);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_TEXT_SELECTION_CHANGED);
-  EVENT_TYPE_HISTOGRAM(event_type_mask,
-                       VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, WINDOWS_CHANGED);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, WINDOW_CONTENT_CHANGED);
-  EVENT_TYPE_HISTOGRAM(event_type_mask, WINDOW_STATE_CHANGED);
 
   int feedback_type_mask =
       Java_BrowserAccessibilityState_getAccessibilityServiceFeedbackTypeMask(
           env);
-  FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, SPOKEN);
-  FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, HAPTIC);
-  FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, AUDIBLE);
-  FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, VISUAL);
-  FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, GENERIC);
-  FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, BRAILLE);
 
   int flags_mask =
       Java_BrowserAccessibilityState_getAccessibilityServiceFlagsMask(env);
-  FLAGS_HISTOGRAM(flags_mask, INCLUDE_NOT_IMPORTANT_VIEWS);
-  FLAGS_HISTOGRAM(flags_mask, REQUEST_TOUCH_EXPLORATION_MODE);
-  FLAGS_HISTOGRAM(flags_mask, REQUEST_ENHANCED_WEB_ACCESSIBILITY);
-  FLAGS_HISTOGRAM(flags_mask, REPORT_VIEW_IDS);
-  FLAGS_HISTOGRAM(flags_mask, REQUEST_FILTER_KEY_EVENTS);
-  FLAGS_HISTOGRAM(flags_mask, RETRIEVE_INTERACTIVE_WINDOWS);
-  FLAGS_HISTOGRAM(flags_mask, FORCE_DIRECT_BOOT_AWARE);
-  FLAGS_HISTOGRAM(flags_mask, ENABLE_ACCESSIBILITY_VOLUME);
-  FLAGS_HISTOGRAM(flags_mask, REQUEST_ACCESSIBILITY_BUTTON);
-  FLAGS_HISTOGRAM(flags_mask, REQUEST_FINGERPRINT_GESTURES);
-  FLAGS_HISTOGRAM(flags_mask, REQUEST_MULTI_FINGER_GESTURES);
-  FLAGS_HISTOGRAM(flags_mask, REQUEST_SHORTCUT_WARNING_DIALOG_SPOKEN_FEEDBACK);
-  FLAGS_HISTOGRAM(flags_mask, SERVICE_HANDLES_DOUBLE_TAP);
 
   int capabilities_mask =
       Java_BrowserAccessibilityState_getAccessibilityServiceCapabilitiesMask(
           env);
-  CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_RETRIEVE_WINDOW_CONTENT);
-  CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_REQUEST_TOUCH_EXPLORATION);
-  CAPABILITY_TYPE_HISTOGRAM(capabilities_mask,
-                            CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY);
-  CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_REQUEST_FILTER_KEY_EVENTS);
-  CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_CONTROL_MAGNIFICATION);
-  CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_PERFORM_GESTURES);
-  CAPABILITY_TYPE_HISTOGRAM(capabilities_mask,
-                            CAN_REQUEST_FINGERPRINT_GESTURES);
-  CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_TAKE_SCREENSHOT);
 
   auto service_ids =
       Java_BrowserAccessibilityState_getAccessibilityServiceIds(env);
+
   jsize len = env->GetArrayLength(service_ids.obj());
   bool has_assistive_tech = false;
+  bool has_password_manager = false;
   bool has_unknown = false;
 
-  const uint32_t kAssistiveTechPackageHashes[] = {
-      0x349d4b1a,  // Android Accessibility Suite
-      0xa5a469fc,  // Sound Amplifier
-      0xb13e6179,  // Action Blocks Accessibility
-      0xb38ef877,  // Voice Access
-      0xbc2897b4,  // BrailleBack
-  };
-  // TODO(crbug.com/1197608): Consider adding further categories.
   for (jsize i = 0; i < len; ++i) {
     auto* id = env->GetObjectArrayElement(service_ids.obj(), i);
     std::string service_id =
@@ -306,13 +292,115 @@
 
     if (base::Contains(kAssistiveTechPackageHashes, service_hash)) {
       has_assistive_tech = true;
+    } else if (base::Contains(kPasswordPackageHashes, service_hash)) {
+      has_password_manager = true;
     } else {
       has_unknown = true;
     }
   }
 
-  SERVICE_TYPE_HISTOGRAM(has_assistive_tech, ASSISTIVE_TECH);
-  SERVICE_TYPE_HISTOGRAM(has_unknown, UNKNOWN);
+  if (has_assistive_tech && has_password_manager && has_unknown) {
+    RECORD_ALL_HISTOGRAMS(event_type_mask, feedback_type_mask, flags_mask,
+                          capabilities_mask, ALL_VARIANTS);
+  } else if (has_assistive_tech && has_password_manager) {
+    RECORD_ALL_HISTOGRAMS(event_type_mask, feedback_type_mask, flags_mask,
+                          capabilities_mask,
+                          ASSISTIVE_TECH_WITH_PASSWORD_MANAGER);
+  } else if (has_assistive_tech && has_unknown) {
+    RECORD_ALL_HISTOGRAMS(event_type_mask, feedback_type_mask, flags_mask,
+                          capabilities_mask, ASSISTIVE_TECH_WITH_UNKNOWN);
+  } else if (has_password_manager && has_unknown) {
+    RECORD_ALL_HISTOGRAMS(event_type_mask, feedback_type_mask, flags_mask,
+                          capabilities_mask, PASSWORD_MANAGER_WITH_UNKNOWN);
+  } else if (has_assistive_tech) {
+    RECORD_ALL_HISTOGRAMS(event_type_mask, feedback_type_mask, flags_mask,
+                          capabilities_mask, ASSISTIVE_TECH);
+  } else if (has_password_manager) {
+    RECORD_ALL_HISTOGRAMS(event_type_mask, feedback_type_mask, flags_mask,
+                          capabilities_mask, PASSWORD_MANAGER);
+  } else if (has_unknown) {
+    RECORD_ALL_HISTOGRAMS(event_type_mask, feedback_type_mask, flags_mask,
+                          capabilities_mask, UNKNOWN);
+  }
+}
+
+void BrowserAccessibilityStateImplAndroid::
+    RecordAccessibilityServiceStatsHistogram(int event_type_mask,
+                                             int feedback_type_mask,
+                                             int flags_mask,
+                                             int capabilities_mask,
+                                             std::string histogram) {
+  EVENT_TYPE_HISTOGRAM(event_type_mask, ANNOUNCEMENT, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, ASSIST_READING_CONTEXT, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, GESTURE_DETECTION_END, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, GESTURE_DETECTION_START, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, NOTIFICATION_STATE_CHANGED, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, TOUCH_EXPLORATION_GESTURE_END,
+                       histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, TOUCH_EXPLORATION_GESTURE_START,
+                       histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, TOUCH_INTERACTION_END, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, TOUCH_INTERACTION_START, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_ACCESSIBILITY_FOCUSED, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_ACCESSIBILITY_FOCUS_CLEARED,
+                       histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_CLICKED, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_CONTEXT_CLICKED, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_FOCUSED, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_HOVER_ENTER, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_HOVER_EXIT, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_LONG_CLICKED, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_SCROLLED, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_SELECTED, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_TEXT_CHANGED, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, VIEW_TEXT_SELECTION_CHANGED, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask,
+                       VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, WINDOWS_CHANGED, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, WINDOW_CONTENT_CHANGED, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, WINDOW_STATE_CHANGED, histogram);
+  EVENT_TYPE_HISTOGRAM(event_type_mask, SPEECH_STATE_CHANGE, histogram);
+
+  FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, SPOKEN, histogram);
+  FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, HAPTIC, histogram);
+  FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, AUDIBLE, histogram);
+  FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, VISUAL, histogram);
+  FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, GENERIC, histogram);
+  FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, BRAILLE, histogram);
+  FEEDBACK_TYPE_HISTOGRAM(feedback_type_mask, ALL_MASK, histogram);
+
+  FLAGS_HISTOGRAM(flags_mask, INCLUDE_NOT_IMPORTANT_VIEWS, histogram);
+  FLAGS_HISTOGRAM(flags_mask, REQUEST_TOUCH_EXPLORATION_MODE, histogram);
+  FLAGS_HISTOGRAM(flags_mask, REQUEST_ENHANCED_WEB_ACCESSIBILITY, histogram);
+  FLAGS_HISTOGRAM(flags_mask, REPORT_VIEW_IDS, histogram);
+  FLAGS_HISTOGRAM(flags_mask, REQUEST_FILTER_KEY_EVENTS, histogram);
+  FLAGS_HISTOGRAM(flags_mask, RETRIEVE_INTERACTIVE_WINDOWS, histogram);
+  FLAGS_HISTOGRAM(flags_mask, FORCE_DIRECT_BOOT_AWARE, histogram);
+  FLAGS_HISTOGRAM(flags_mask, ENABLE_ACCESSIBILITY_VOLUME, histogram);
+  FLAGS_HISTOGRAM(flags_mask, REQUEST_ACCESSIBILITY_BUTTON, histogram);
+  FLAGS_HISTOGRAM(flags_mask, REQUEST_FINGERPRINT_GESTURES, histogram);
+  FLAGS_HISTOGRAM(flags_mask, REQUEST_MULTI_FINGER_GESTURES, histogram);
+  FLAGS_HISTOGRAM(flags_mask, REQUEST_SHORTCUT_WARNING_DIALOG_SPOKEN_FEEDBACK,
+                  histogram);
+  FLAGS_HISTOGRAM(flags_mask, SERVICE_HANDLES_DOUBLE_TAP, histogram);
+  FLAGS_HISTOGRAM(flags_mask, REQUEST_2_FINGER_PASSTHROUGH, histogram);
+  FLAGS_HISTOGRAM(flags_mask, SEND_MOTION_EVENTS, histogram);
+  FLAGS_HISTOGRAM(flags_mask, INPUT_METHOD_EDITOR, histogram);
+
+  CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_RETRIEVE_WINDOW_CONTENT,
+                            histogram);
+  CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_REQUEST_TOUCH_EXPLORATION,
+                            histogram);
+  CAPABILITY_TYPE_HISTOGRAM(capabilities_mask,
+                            CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY, histogram);
+  CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_REQUEST_FILTER_KEY_EVENTS,
+                            histogram);
+  CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_CONTROL_MAGNIFICATION,
+                            histogram);
+  CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_PERFORM_GESTURES, histogram);
+  CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_REQUEST_FINGERPRINT_GESTURES,
+                            histogram);
+  CAPABILITY_TYPE_HISTOGRAM(capabilities_mask, CAN_TAKE_SCREENSHOT, histogram);
 }
 
 void BrowserAccessibilityStateImplAndroid::UpdateHistogramsOnOtherThread() {
diff --git a/content/browser/accessibility/browser_accessibility_state_impl_android.h b/content/browser/accessibility/browser_accessibility_state_impl_android.h
index 5518786..3d7e7bd 100644
--- a/content/browser/accessibility/browser_accessibility_state_impl_android.h
+++ b/content/browser/accessibility/browser_accessibility_state_impl_android.h
@@ -7,9 +7,6 @@
 
 #include "content/browser/accessibility/browser_accessibility_state_impl.h"
 
-#include "base/android/jni_android.h"
-#include "base/android/jni_array.h"
-
 namespace content {
 
 class BrowserContext;
@@ -18,9 +15,14 @@
     : public BrowserAccessibilityStateImpl {
  public:
   BrowserAccessibilityStateImplAndroid();
-  ~BrowserAccessibilityStateImplAndroid() override {}
+  ~BrowserAccessibilityStateImplAndroid() override = default;
 
   void CollectAccessibilityServiceStats();
+  void RecordAccessibilityServiceStatsHistogram(int event_type_mask,
+                                                int feedback_type_mask,
+                                                int flags_mask,
+                                                int capabilities_mask,
+                                                std::string histogram);
 
  protected:
   void UpdateHistogramsOnOtherThread() override;
diff --git a/content/browser/android/java/gin_java_method_invocation_helper.cc b/content/browser/android/java/gin_java_method_invocation_helper.cc
index 70a2c1e03..0f578f0 100644
--- a/content/browser/android/java/gin_java_method_invocation_helper.cc
+++ b/content/browser/android/java/gin_java_method_invocation_helper.cc
@@ -133,7 +133,7 @@
   for (size_t i = 0; i < method->num_parameters(); ++i) {
     const base::Value& argument = arguments_[i];
     parameters[i] = CoerceJavaScriptValueToJavaValue(
-        env, &argument, method->parameter_type(i), true, object_refs_,
+        env, argument, method->parameter_type(i), true, object_refs_,
         &coercion_error);
   }
 
diff --git a/content/browser/android/java/gin_java_script_to_java_types_coercion.cc b/content/browser/android/java/gin_java_script_to_java_types_coercion.cc
index ca2e77f..00d5830 100644
--- a/content/browser/android/java/gin_java_script_to_java_types_coercion.cc
+++ b/content/browser/android/java/gin_java_script_to_java_types_coercion.cc
@@ -16,6 +16,7 @@
 #include "base/android/jni_string.h"
 #include "base/check_op.h"
 #include "base/notreached.h"
+#include "base/numerics/safe_conversions.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
 #include "base/strings/utf_string_conversions.h"
@@ -106,14 +107,14 @@
     case JavaType::TypeObject:
       // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to null. Spec
       // requires handling object equivalents of primitive types.
-      result.l = NULL;
+      result.l = nullptr;
       break;
     case JavaType::TypeString:
       result.l = coerce_to_string
                      ? ConvertUTF8ToJavaString(
                            env, base::NumberToString(integer_value))
                            .Release()
-                     : NULL;
+                     : nullptr;
       break;
     case JavaType::TypeBoolean:
       // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to false. Spec
@@ -123,7 +124,7 @@
     case JavaType::TypeArray:
       // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to null. Spec
       // requires raising a JavaScript exception.
-      result.l = NULL;
+      result.l = nullptr;
       break;
     case JavaType::TypeVoid:
       // Conversion to void must never happen.
@@ -170,14 +171,14 @@
     case JavaType::TypeObject:
       // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to null. Spec
       // requires handling object equivalents of primitive types.
-      result.l = NULL;
+      result.l = nullptr;
       break;
     case JavaType::TypeString:
-      result.l =
-          coerce_to_string
-              ? ConvertUTF8ToJavaString(
-                    env, base::StringPrintf("%.6lg", double_value)).Release()
-              : NULL;
+      result.l = coerce_to_string
+                     ? ConvertUTF8ToJavaString(
+                           env, base::StringPrintf("%.6lg", double_value))
+                           .Release()
+                     : nullptr;
       break;
     case JavaType::TypeBoolean:
       // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to false. Spec
@@ -187,7 +188,7 @@
     case JavaType::TypeArray:
       // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to null. Spec
       // requires raising a JavaScript exception.
-      result.l = NULL;
+      result.l = nullptr;
       break;
     case JavaType::TypeVoid:
       // Conversion to void must never happen.
@@ -198,27 +199,27 @@
 }
 
 jvalue CoerceJavaScriptBooleanToJavaValue(JNIEnv* env,
-                                          const base::Value* value,
+                                          const base::Value& value,
                                           const JavaType& target_type,
                                           bool coerce_to_string,
                                           GinJavaBridgeError* error) {
   // See http://jdk6.java.net/plugin2/liveconnect/#JS_BOOLEAN_VALUES.
-  bool boolean_value = value->GetBool();
+  bool boolean_value = value.GetBool();
   jvalue result;
   switch (target_type.type) {
     case JavaType::TypeBoolean:
       result.z = boolean_value ? JNI_TRUE : JNI_FALSE;
       break;
     case JavaType::TypeObject:
-      // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to NULL. Spec
+      // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to null. Spec
       // requires handling java.lang.Boolean and java.lang.Object.
-      result.l = NULL;
+      result.l = nullptr;
       break;
     case JavaType::TypeString:
-      result.l = coerce_to_string
-                     ? ConvertUTF8ToJavaString(
-                           env, boolean_value ? "true" : "false").Release()
-                     : NULL;
+      result.l = coerce_to_string ? ConvertUTF8ToJavaString(
+                                        env, boolean_value ? "true" : "false")
+                                        .Release()
+                                  : nullptr;
       break;
     case JavaType::TypeByte:
     case JavaType::TypeChar:
@@ -234,9 +235,9 @@
       break;
     }
     case JavaType::TypeArray:
-      // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to NULL. Spec
+      // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to null. Spec
       // requires raising a JavaScript exception.
-      result.l = NULL;
+      result.l = nullptr;
       break;
     case JavaType::TypeVoid:
       // Conversion to void must never happen.
@@ -247,20 +248,20 @@
 }
 
 jvalue CoerceJavaScriptStringToJavaValue(JNIEnv* env,
-                                         const base::Value* value,
+                                         const base::Value& value,
                                          const JavaType& target_type,
                                          GinJavaBridgeError* error) {
   // See http://jdk6.java.net/plugin2/liveconnect/#JS_STRING_VALUES.
   jvalue result;
   switch (target_type.type) {
     case JavaType::TypeString: {
-      result.l = ConvertUTF8ToJavaString(env, value->GetString()).Release();
+      result.l = ConvertUTF8ToJavaString(env, value.GetString()).Release();
       break;
     }
     case JavaType::TypeObject:
-      // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to NULL. Spec
+      // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to null. Spec
       // requires handling java.lang.Object.
-      result.l = NULL;
+      result.l = nullptr;
       break;
     case JavaType::TypeByte:
     case JavaType::TypeShort:
@@ -285,9 +286,9 @@
       result.z = JNI_FALSE;
       break;
     case JavaType::TypeArray:
-      // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to NULL. Spec
+      // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to null. Spec
       // requires raising a JavaScript exception.
-      result.l = NULL;
+      result.l = nullptr;
       break;
     case JavaType::TypeVoid:
       // Conversion to void must never happen.
@@ -319,7 +320,7 @@
     case JavaType::TypeString: {
       ScopedJavaLocalRef<jclass> clazz(
           base::android::GetClass(env, kJavaLangString));
-      return env->NewObjectArray(length, clazz.obj(), NULL);
+      return env->NewObjectArray(length, clazz.obj(), nullptr);
     }
     case JavaType::TypeVoid:
       // Conversion to void must never happen.
@@ -328,7 +329,7 @@
       // Not handled.
       NOTREACHED();
   }
-  return NULL;
+  return nullptr;
 }
 
 // Sets the specified element of the supplied array to the value of the
@@ -388,14 +389,14 @@
 }
 
 jvalue CoerceJavaScriptNullOrUndefinedToJavaValue(JNIEnv* env,
-                                                  const base::Value* value,
+                                                  const base::Value& value,
                                                   const JavaType& target_type,
                                                   bool coerce_to_string,
                                                   GinJavaBridgeError* error) {
   bool is_undefined = false;
   std::unique_ptr<const GinJavaBridgeValue> gin_value;
-  if (GinJavaBridgeValue::ContainsGinJavaBridgeValue(value)) {
-    gin_value = GinJavaBridgeValue::FromValue(value);
+  if (GinJavaBridgeValue::ContainsGinJavaBridgeValue(&value)) {
+    gin_value = GinJavaBridgeValue::FromValue(&value);
     if (gin_value->IsType(GinJavaBridgeValue::TYPE_UNDEFINED)) {
       is_undefined = true;
     }
@@ -403,14 +404,14 @@
   jvalue result;
   switch (target_type.type) {
     case JavaType::TypeObject:
-      result.l = NULL;
+      result.l = nullptr;
       break;
     case JavaType::TypeString:
       // LIVECONNECT_COMPLIANCE: Existing behavior is to convert undefined to
-      // "undefined". Spec requires converting undefined to NULL.
+      // "undefined". Spec requires converting undefined to null.
       result.l = (coerce_to_string && is_undefined)
                      ? ConvertUTF8ToJavaString(env, kUndefined).Release()
-                     : NULL;
+                     : nullptr;
       break;
     case JavaType::TypeByte:
     case JavaType::TypeChar:
@@ -427,9 +428,9 @@
       result.z = JNI_FALSE;
       break;
     case JavaType::TypeArray:
-      // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to NULL. Spec
+      // LIVECONNECT_COMPLIANCE: Existing behavior is to convert to null. Spec
       // requires raising a JavaScript exception.
-      result.l = NULL;
+      result.l = nullptr;
       break;
     case JavaType::TypeVoid:
       // Conversion to void must never happen.
@@ -440,7 +441,7 @@
 }
 
 jobject CoerceJavaScriptListToArray(JNIEnv* env,
-                                    const base::Value* value,
+                                    const base::Value::List& list,
                                     const JavaType& target_type,
                                     const ObjectRefs& object_refs,
                                     GinJavaBridgeError* error) {
@@ -449,26 +450,31 @@
   // LIVECONNECT_COMPLIANCE: Existing behavior is to return null for
   // multi-dimensional arrays. Spec requires handling multi-demensional arrays.
   if (target_inner_type.type == JavaType::TypeArray) {
-    return NULL;
+    return nullptr;
   }
 
   // LIVECONNECT_COMPLIANCE: Existing behavior is to return null for object
   // arrays. Spec requires handling object arrays.
   if (target_inner_type.type == JavaType::TypeObject) {
-    return NULL;
+    return nullptr;
   }
 
+  // Coerce the length.
+  if (!base::IsValueInRangeForNumericType<jsize>(list.size())) {
+    return nullptr;
+  }
+  jsize length = static_cast<jsize>(list.size());
+
   // Create the Java array.
-  jsize length = static_cast<jsize>(value->GetListDeprecated().size());
   jobject result = CreateJavaArray(env, target_inner_type, length);
   if (!result) {
-    return NULL;
+    return nullptr;
   }
 
   jsize i = 0;
-  for (const auto& value_element : value->GetListDeprecated()) {
+  for (const auto& value_element : list) {
     jvalue element = CoerceJavaScriptValueToJavaValue(
-        env, &value_element, target_inner_type, false, object_refs, error);
+        env, value_element, target_inner_type, false, object_refs, error);
     SetArrayElement(env, result, target_inner_type, i++, element);
     // CoerceJavaScriptValueToJavaValue() creates new local references to
     // strings, objects and arrays. Of these, only strings can occur here.
@@ -483,7 +489,7 @@
 }
 
 jobject CoerceJavaScriptDictionaryToArray(JNIEnv* env,
-                                          const base::Value* value,
+                                          const base::Value::Dict& dict,
                                           const JavaType& target_type,
                                           const ObjectRefs& object_refs,
                                           GinJavaBridgeError* error) {
@@ -493,21 +499,19 @@
   // LIVECONNECT_COMPLIANCE: Existing behavior is to return null for
   // multi-dimensional arrays. Spec requires handling multi-demensional arrays.
   if (target_inner_type.type == JavaType::TypeArray) {
-    return NULL;
+    return nullptr;
   }
 
   // LIVECONNECT_COMPLIANCE: Existing behavior is to return null for object
   // arrays. Spec requires handling object arrays.
   if (target_inner_type.type == JavaType::TypeObject) {
-    return NULL;
+    return nullptr;
   }
 
-  const base::DictionaryValue* dictionary_value;
-  value->GetAsDictionary(&dictionary_value);
-  const base::Value* length_value;
   // If the object does not have a length property, return null.
-  if (!dictionary_value->Get("length", &length_value)) {
-    return NULL;
+  const base::Value* length_value = dict.Find("length");
+  if (!length_value) {
+    return nullptr;
   }
 
   // If the length property does not have numeric type, or is outside the valid
@@ -526,21 +530,21 @@
     }
   }
   if (length == -1) {
-    return NULL;
+    return nullptr;
   }
 
   jobject result = CreateJavaArray(env, target_inner_type, length);
   if (!result) {
-    return NULL;
+    return nullptr;
   }
-  auto null_value = std::make_unique<base::Value>();
+  base::Value null_value;
   for (jsize i = 0; i < length; ++i) {
     const std::string key(base::NumberToString(i));
-    const base::Value* value_element = dictionary_value->FindKey(key);
+    const base::Value* value_element = dict.Find(key);
     if (!value_element)
-      value_element = null_value.get();
+      value_element = &null_value;
     jvalue element = CoerceJavaScriptValueToJavaValue(
-        env, value_element, target_inner_type, false, object_refs, error);
+        env, *value_element, target_inner_type, false, object_refs, error);
     SetArrayElement(env, result, target_inner_type, i, element);
     // CoerceJavaScriptValueToJavaValue() creates new local references to
     // strings, objects and arrays. Of these, only strings can occur here.
@@ -555,7 +559,7 @@
 }
 
 jvalue CoerceJavaScriptObjectToJavaValue(JNIEnv* env,
-                                         const base::Value* value,
+                                         const base::Value& value,
                                          const JavaType& target_type,
                                          bool coerce_to_string,
                                          const ObjectRefs& object_refs,
@@ -567,9 +571,9 @@
   jvalue result;
   switch (target_type.type) {
     case JavaType::TypeObject: {
-      if (GinJavaBridgeValue::ContainsGinJavaBridgeValue(value)) {
+      if (GinJavaBridgeValue::ContainsGinJavaBridgeValue(&value)) {
         std::unique_ptr<const GinJavaBridgeValue> gin_value(
-            GinJavaBridgeValue::FromValue(value));
+            GinJavaBridgeValue::FromValue(&value));
         DCHECK(gin_value);
         DCHECK(gin_value->IsType(GinJavaBridgeValue::TYPE_OBJECT_ID));
         ScopedJavaLocalRef<jobject> obj;
@@ -586,7 +590,7 @@
             JNI_TRUE) {
           result.l = obj.Release();
         } else {
-          result.l = NULL;
+          result.l = nullptr;
           *error = kGinJavaBridgeNonAssignableTypes;
         }
       } else {
@@ -594,7 +598,7 @@
         // requires converting if the target type is
         // netscape.javascript.JSObject, otherwise raising a JavaScript
         // exception.
-        result.l = NULL;
+        result.l = nullptr;
       }
       break;
     }
@@ -603,7 +607,7 @@
       // "undefined". Spec requires calling toString() on the Java object.
       result.l = coerce_to_string
                      ? ConvertUTF8ToJavaString(env, kUndefined).Release()
-                     : NULL;
+                     : nullptr;
       break;
     case JavaType::TypeByte:
     case JavaType::TypeShort:
@@ -624,14 +628,14 @@
       result.z = JNI_FALSE;
       break;
     case JavaType::TypeArray:
-      if (value->is_dict()) {
+      if (value.is_dict()) {
         result.l = CoerceJavaScriptDictionaryToArray(
-            env, value, target_type, object_refs, error);
-      } else if (value->is_list()) {
-        result.l = CoerceJavaScriptListToArray(
-            env, value, target_type, object_refs, error);
+            env, value.GetDict(), target_type, object_refs, error);
+      } else if (value.is_list()) {
+        result.l = CoerceJavaScriptListToArray(env, value.GetList(),
+                                               target_type, object_refs, error);
       } else {
-        result.l = NULL;
+        result.l = nullptr;
       }
       break;
     case JavaType::TypeVoid:
@@ -643,14 +647,14 @@
 }
 
 jvalue CoerceGinJavaBridgeValueToJavaValue(JNIEnv* env,
-                                           const base::Value* value,
+                                           const base::Value& value,
                                            const JavaType& target_type,
                                            bool coerce_to_string,
                                            const ObjectRefs& object_refs,
                                            GinJavaBridgeError* error) {
-  DCHECK(GinJavaBridgeValue::ContainsGinJavaBridgeValue(value));
+  DCHECK(GinJavaBridgeValue::ContainsGinJavaBridgeValue(&value));
   std::unique_ptr<const GinJavaBridgeValue> gin_value(
-      GinJavaBridgeValue::FromValue(value));
+      GinJavaBridgeValue::FromValue(&value));
   switch (gin_value->GetType()) {
     case GinJavaBridgeValue::TYPE_UNDEFINED:
       return CoerceJavaScriptNullOrUndefinedToJavaValue(
@@ -687,12 +691,12 @@
   if (type.type == JavaType::TypeString || type.type == JavaType::TypeObject ||
       type.type == JavaType::TypeArray) {
     env->DeleteLocalRef(value->l);
-    value->l = NULL;
+    value->l = nullptr;
   }
 }
 
 jvalue CoerceJavaScriptValueToJavaValue(JNIEnv* env,
-                                        const base::Value* value,
+                                        const base::Value& value,
                                         const JavaType& target_type,
                                         bool coerce_to_string,
                                         const ObjectRefs& object_refs,
@@ -700,13 +704,13 @@
   // Note that in all these conversions, the relevant field of the jvalue must
   // always be explicitly set, as jvalue does not initialize its fields.
 
-  switch (value->type()) {
+  switch (value.type()) {
     case base::Value::Type::INTEGER:
       return CoerceJavaScriptIntegerToJavaValue(
-          env, value->GetInt(), target_type, coerce_to_string, error);
+          env, value.GetInt(), target_type, coerce_to_string, error);
     case base::Value::Type::DOUBLE: {
       return CoerceJavaScriptDoubleToJavaValue(
-          env, value->GetDouble(), target_type, coerce_to_string, error);
+          env, value.GetDouble(), target_type, coerce_to_string, error);
     }
     case base::Value::Type::BOOLEAN:
       return CoerceJavaScriptBooleanToJavaValue(
diff --git a/content/browser/android/java/gin_java_script_to_java_types_coercion.h b/content/browser/android/java/gin_java_script_to_java_types_coercion.h
index 4d9e79c..e661f2ea 100644
--- a/content/browser/android/java/gin_java_script_to_java_types_coercion.h
+++ b/content/browser/android/java/gin_java_script_to_java_types_coercion.h
@@ -18,13 +18,12 @@
 typedef std::map<GinJavaBoundObject::ObjectID, JavaObjectWeakGlobalRef>
     ObjectRefs;
 
-jvalue CoerceJavaScriptValueToJavaValue(
-    JNIEnv* env,
-    const base::Value* value,
-    const JavaType& target_type,
-    bool coerce_to_string,
-    const ObjectRefs& object_refs,
-    GinJavaBridgeError* error);
+jvalue CoerceJavaScriptValueToJavaValue(JNIEnv* env,
+                                        const base::Value& value,
+                                        const JavaType& target_type,
+                                        bool coerce_to_string,
+                                        const ObjectRefs& object_refs,
+                                        GinJavaBridgeError* error);
 
 void ReleaseJavaValueIfRequired(JNIEnv* env,
                                 jvalue* value,
diff --git a/content/browser/background_sync/background_sync_manager_unittest.cc b/content/browser/background_sync/background_sync_manager_unittest.cc
index b26d203..37d77ad 100644
--- a/content/browser/background_sync/background_sync_manager_unittest.cc
+++ b/content/browser/background_sync/background_sync_manager_unittest.cc
@@ -134,8 +134,8 @@
     ON_CALL(*mock_permission_manager,
             GetPermissionStatusForWorker(PermissionType::NOTIFICATIONS, _, _))
         .WillByDefault(Return(blink::mojom::PermissionStatus::DENIED));
-    helper_->browser_context()->SetPermissionControllerDelegate(
-        std::move(mock_permission_manager));
+    TestBrowserContext::FromBrowserContext(helper_->browser_context())
+        ->SetPermissionControllerDelegate(std::move(mock_permission_manager));
 
     // Create a StoragePartition with the correct BrowserContext so that the
     // BackgroundSyncManager can find the BrowserContext through it.
diff --git a/content/browser/background_sync/background_sync_service_impl_test_harness.cc b/content/browser/background_sync/background_sync_service_impl_test_harness.cc
index 0b578bf..f3d52e55 100644
--- a/content/browser/background_sync/background_sync_service_impl_test_harness.cc
+++ b/content/browser/background_sync/background_sync_service_impl_test_harness.cc
@@ -135,8 +135,9 @@
   ON_CALL(*mock_permission_manager,
           GetPermissionStatus(blink::PermissionType::BACKGROUND_SYNC, _, _))
       .WillByDefault(testing::Return(blink::mojom::PermissionStatus::GRANTED));
-  embedded_worker_helper_->browser_context()->SetPermissionControllerDelegate(
-      std::move(mock_permission_manager));
+  TestBrowserContext::FromBrowserContext(
+      embedded_worker_helper_->browser_context())
+      ->SetPermissionControllerDelegate(std::move(mock_permission_manager));
 }
 
 void BackgroundSyncServiceImplTestHarness::CreateStoragePartition() {
diff --git a/content/browser/fenced_frame/fenced_frame_browsertest.cc b/content/browser/fenced_frame/fenced_frame_browsertest.cc
index 0a5af4f..cfa4dbb 100644
--- a/content/browser/fenced_frame/fenced_frame_browsertest.cc
+++ b/content/browser/fenced_frame/fenced_frame_browsertest.cc
@@ -2260,6 +2260,80 @@
   EXPECT_EQ(0, EvalJs(root, "window.frames.length"));
 }
 
+IN_PROC_BROWSER_TEST_P(FencedFrameParameterizedBrowserTest,
+                       SharedStorageMetadataInNestedFencedFrame) {
+  GURL main_url = https_server()->GetURL("a.test", "/hello.html");
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  // It is safe to obtain the root frame tree node here, as it doesn't change.
+  FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents())
+                            ->GetPrimaryFrameTree()
+                            .root();
+
+  FencedFrameURLMapping& url_mapping1 =
+      root->current_frame_host()->GetPage().fenced_frame_urls_map();
+  auto urn_uuid1 = GenerateAndVerifyPendingMappedURN(&url_mapping1);
+  const GURL mapped_url1 =
+      https_server()->GetURL("b.test", "/fenced_frames/title1.html");
+  SimulateSharedStorageURNMappingComplete(
+      url_mapping1, urn_uuid1, mapped_url1,
+      /*shared_storage_origin=*/url::Origin::Create(GURL("https://foo.com")),
+      /*budget_to_charge=*/2.0);
+
+  EXPECT_TRUE(ExecJs(root,
+                     "var f1 = document.createElement('fencedframe');"
+                     "f1.mode = 'opaque-ads';"
+                     "document.body.appendChild(f1);"));
+
+  EXPECT_EQ(1U, root->child_count());
+  FrameTreeNode* fenced_frame_root_node1 =
+      GetFencedFrameRootNode(root->child_at(0));
+
+  TestFrameNavigationObserver observer1(
+      fenced_frame_root_node1->current_frame_host());
+  std::string navigate_urn_script1 = JsReplace("f1.src = $1;", urn_uuid1);
+  EXPECT_EQ(urn_uuid1.spec(), EvalJs(root, navigate_urn_script1));
+  observer1.Wait();
+
+  FencedFrameURLMapping& url_mapping2 =
+      fenced_frame_root_node1->current_frame_host()
+          ->GetPage()
+          .fenced_frame_urls_map();
+  auto urn_uuid2 = GenerateAndVerifyPendingMappedURN(&url_mapping2);
+  const GURL mapped_url2 =
+      https_server()->GetURL("c.test", "/fenced_frames/title1.html");
+  SimulateSharedStorageURNMappingComplete(
+      url_mapping2, urn_uuid2, mapped_url2,
+      /*shared_storage_origin=*/url::Origin::Create(GURL("https://bar.com")),
+      /*budget_to_charge=*/3.0);
+
+  EXPECT_TRUE(ExecJs(fenced_frame_root_node1,
+                     "var f2 = document.createElement('fencedframe');"
+                     "f2.mode = 'opaque-ads';"
+                     "document.body.appendChild(f2);"));
+
+  EXPECT_EQ(1U, fenced_frame_root_node1->child_count());
+  FrameTreeNode* fenced_frame_root_node2 =
+      GetFencedFrameRootNode(fenced_frame_root_node1->child_at(0));
+
+  TestFrameNavigationObserver observer2(
+      fenced_frame_root_node2->current_frame_host());
+  std::string navigate_urn_script2 = JsReplace("f2.src = $1;", urn_uuid2);
+  EXPECT_EQ(urn_uuid2.spec(),
+            EvalJs(fenced_frame_root_node1, navigate_urn_script2));
+  observer2.Wait();
+
+  auto metadata = fenced_frame_root_node2->FindSharedStorageBudgetMetadata();
+
+  EXPECT_EQ(metadata.size(), 2u);
+
+  EXPECT_EQ(metadata[0]->origin, url::Origin::Create(GURL("https://bar.com")));
+  EXPECT_DOUBLE_EQ(metadata[0]->budget_to_charge, 3.0);
+
+  EXPECT_EQ(metadata[1]->origin, url::Origin::Create(GURL("https://foo.com")));
+  EXPECT_DOUBLE_EQ(metadata[1]->budget_to_charge, 2.0);
+}
+
 IN_PROC_BROWSER_TEST_P(
     FencedFrameParameterizedBrowserTest,
     TwoFencedFrameNavigationToSameSharedStorageOriginatedUUID_SameMetadata) {
@@ -2315,7 +2389,8 @@
     observer.Wait();
   }
 
-  EXPECT_TRUE(fenced_frame_root_node1->FindSharedStorageBudgetMetadata());
+  EXPECT_EQ(fenced_frame_root_node1->FindSharedStorageBudgetMetadata().size(),
+            1u);
 
   EXPECT_EQ(fenced_frame_root_node1->FindSharedStorageBudgetMetadata(),
             fenced_frame_root_node2->FindSharedStorageBudgetMetadata());
@@ -2377,7 +2452,7 @@
 
   auto budget_metadata =
       fenced_frame_root_node->FindSharedStorageBudgetMetadata();
-  EXPECT_FALSE(budget_metadata.has_value());
+  EXPECT_EQ(budget_metadata.size(), 0u);
 
   // Trigger the mapping to resume the deferred navigation.
   SimulateSharedStorageURNMappingComplete(
@@ -2394,10 +2469,10 @@
       fenced_frame_root_node->current_frame_host()->GetLastCommittedURL());
 
   budget_metadata = fenced_frame_root_node->FindSharedStorageBudgetMetadata();
-  EXPECT_TRUE(budget_metadata.has_value());
-  EXPECT_EQ((*budget_metadata)->origin,
+  EXPECT_EQ(budget_metadata.size(), 1u);
+  EXPECT_EQ(budget_metadata[0]->origin,
             url::Origin::Create(GURL("https://bar.com")));
-  EXPECT_DOUBLE_EQ((*budget_metadata)->budget_to_charge, 2.0);
+  EXPECT_DOUBLE_EQ(budget_metadata[0]->budget_to_charge, 2.0);
 }
 
 // Test the scenario where the FF navigation is deferred and then resumed, and
@@ -2469,7 +2544,7 @@
 
   // Despite the error, the budget metadata should be valid.
   auto metadata = fenced_frame_root_node->FindSharedStorageBudgetMetadata();
-  EXPECT_TRUE(metadata);
+  EXPECT_EQ(metadata.size(), 1u);
 }
 
 IN_PROC_BROWSER_TEST_P(
diff --git a/content/browser/fenced_frame/fenced_frame_url_mapping.h b/content/browser/fenced_frame/fenced_frame_url_mapping.h
index 69fc5a2..4284b127 100644
--- a/content/browser/fenced_frame/fenced_frame_url_mapping.h
+++ b/content/browser/fenced_frame/fenced_frame_url_mapping.h
@@ -201,16 +201,14 @@
     // fenced frame page's urn/url mapping when the urn navigation commits.
     absl::optional<PendingAdComponentsMap> pending_ad_components_map;
 
-    // This can only be possibly set for the outermost fenced frame root,
-    // because selectURL() is disallowed inside fenced frame, and the URN
-    // generated outside the a fenced frame cannot be recognized from inside,
-    // so a nested fenced frame can never navigate to a shared storage
-    // generated URN.
-    //
-    // This pointer to the outermost page's FencedFrameURLMapping is copied
+    // The pointer to the outer document page's FencedFrameURLMapping is copied
     // into the fenced frame root's FrameTreeNode. This is safe because a page
     // will outlive any NavigationRequest occurring in fenced frames in the
     // page.
+    //
+    // The metadata can be on fenced frame roots, and if `kAllowURNsInIframes`
+    // is enabled, it can also be on any node except for the main frame node in
+    // the outermost frame tree.
     absl::optional<raw_ptr<const SharedStorageBudgetMetadata>>
         shared_storage_budget_metadata;
 
diff --git a/content/browser/file_system_access/file_system_access_file_handle_impl.cc b/content/browser/file_system_access/file_system_access_file_handle_impl.cc
index 2601ea0..65bc598 100644
--- a/content/browser/file_system_access/file_system_access_file_handle_impl.cc
+++ b/content/browser/file_system_access/file_system_access_file_handle_impl.cc
@@ -61,7 +61,7 @@
     base::File file) {
   int64_t file_length = file.GetLength();
   if (file_length < 0)
-    return {std::move(file), base::File::GetLastFileError()};
+    return {std::move(file), base::unexpected(base::File::GetLastFileError())};
   return {std::move(file), std::move(file_length)};
 }
 
@@ -332,7 +332,7 @@
   base::FileErrorOr<int64_t> length_or_error =
       std::move(file_and_length.second);
 
-  if (length_or_error.is_error()) {
+  if (!length_or_error.has_value()) {
     std::move(callback).Run(
         file_system_access_error::FromFileError(length_or_error.error()),
         blink::mojom::FileSystemAccessAccessHandleFilePtr(),
diff --git a/content/browser/first_party_sets/first_party_sets_handler_impl.cc b/content/browser/first_party_sets/first_party_sets_handler_impl.cc
index 7b0f1e8..3fafdd8 100644
--- a/content/browser/first_party_sets/first_party_sets_handler_impl.cc
+++ b/content/browser/first_party_sets/first_party_sets_handler_impl.cc
@@ -27,6 +27,10 @@
 #include "net/first_party_sets/global_first_party_sets.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
+namespace net {
+class SchemefulSite;
+}  // namespace net
+
 namespace content {
 
 namespace {
@@ -212,12 +216,6 @@
   global_sets_ = std::move(global_sets);
 }
 
-const net::GlobalFirstPartySets*
-FirstPartySetsHandlerImpl::GetGlobalSetsIfReady() const {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  return base::OptionalToPtr(global_sets_);
-}
-
 void FirstPartySetsHandlerImpl::GetPersistedGlobalSetsForTesting(
     const std::string& browser_context_id,
     base::OnceCallback<void(absl::optional<net::GlobalFirstPartySets>)>
@@ -287,11 +285,24 @@
   }
 }
 
+absl::optional<net::FirstPartySetEntry> FirstPartySetsHandlerImpl::FindEntry(
+    const net::SchemefulSite& site,
+    const net::FirstPartySetsContextConfig& config) const {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+  if (!base::FeatureList::IsEnabled(features::kFirstPartySets))
+    return absl::nullopt;
+
+  if (!global_sets_.has_value()) {
+    // TODO(crbug.com/1366918) : Add metrics to see how often this occurs.
+    return absl::nullopt;
+  }
+  return global_sets_->FindEntry(site, config);
+}
+
 net::GlobalFirstPartySets FirstPartySetsHandlerImpl::GetGlobalSetsSync() const {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
-  const net::GlobalFirstPartySets* sets = GetGlobalSetsIfReady();
-  DCHECK(sets);
-  return sets->Clone();
+  DCHECK(global_sets_.has_value());
+  return global_sets_->Clone();
 }
 
 void FirstPartySetsHandlerImpl::ClearSiteDataOnChangedSetsForContext(
diff --git a/content/browser/first_party_sets/first_party_sets_handler_impl.h b/content/browser/first_party_sets/first_party_sets_handler_impl.h
index 893bc70..81fc869 100644
--- a/content/browser/first_party_sets/first_party_sets_handler_impl.h
+++ b/content/browser/first_party_sets/first_party_sets_handler_impl.h
@@ -28,6 +28,11 @@
 #include "net/first_party_sets/global_first_party_sets.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
+namespace net {
+class FirstPartySetEntry;
+class SchemefulSite;
+}  // namespace net
+
 namespace content {
 
 class BrowserContext;
@@ -105,7 +110,9 @@
                                base::File sets_file) override;
   void ResetForTesting() override;
   void SetGlobalSetsForTesting(net::GlobalFirstPartySets global_sets) override;
-  const net::GlobalFirstPartySets* GetGlobalSetsIfReady() const override;
+  absl::optional<net::FirstPartySetEntry> FindEntry(
+      const net::SchemefulSite& site,
+      const net::FirstPartySetsContextConfig& config) const override;
   void GetContextConfigForPolicy(
       const base::Value::Dict* policy,
       base::OnceCallback<void(net::FirstPartySetsContextConfig)> callback)
diff --git a/content/browser/first_party_sets/first_party_sets_handler_impl_unittest.cc b/content/browser/first_party_sets/first_party_sets_handler_impl_unittest.cc
index e5bf749..ce7156c 100644
--- a/content/browser/first_party_sets/first_party_sets_handler_impl_unittest.cc
+++ b/content/browser/first_party_sets/first_party_sets_handler_impl_unittest.cc
@@ -509,51 +509,6 @@
                                example, net::SiteType::kAssociated, 0))));
 }
 
-TEST_F(FirstPartySetsHandlerImplEnabledTest,
-       GetGlobalSetsIfReady_BeforeSetsReady) {
-  FirstPartySetsHandlerImpl::GetInstance()
-      ->SetEmbedderWillProvidePublicSetsForTesting(true);
-
-  FirstPartySetsHandlerImpl::GetInstance()->Init(scoped_dir_.GetPath(),
-                                                 LocalSetDeclaration());
-
-  EXPECT_EQ(FirstPartySetsHandlerImpl::GetInstance()->GetGlobalSetsIfReady(),
-            nullptr);
-}
-
-TEST_F(FirstPartySetsHandlerImplEnabledTest,
-       GetGlobalSetsIfReady_AfterSetsReady) {
-  net::SchemefulSite example(GURL("https://example.test"));
-  net::SchemefulSite associated(GURL("https://associatedsite.test"));
-
-  FirstPartySetsHandlerImpl::GetInstance()
-      ->SetEmbedderWillProvidePublicSetsForTesting(true);
-
-  const std::string input =
-      R"({"primary": "https://example.test", )"
-      R"("associatedSites": ["https://associatedsite.test"]})";
-  ASSERT_TRUE(base::JSONReader::Read(input));
-  FirstPartySetsHandlerImpl::GetInstance()->SetPublicFirstPartySets(
-      base::Version(), WritePublicSetsFile(input));
-
-  FirstPartySetsHandlerImpl::GetInstance()->Init(scoped_dir_.GetPath(),
-                                                 LocalSetDeclaration());
-
-  // Wait until initialization is complete.
-  GetSetsAndWait();
-
-  EXPECT_THAT(
-      FirstPartySetsHandlerImpl::GetInstance()
-          ->GetGlobalSetsIfReady()
-          ->FindEntries({example, associated},
-                        net::FirstPartySetsContextConfig()),
-      UnorderedElementsAre(
-          Pair(example, net::FirstPartySetEntry(
-                            example, net::SiteType::kPrimary, absl::nullopt)),
-          Pair(associated, net::FirstPartySetEntry(
-                               example, net::SiteType::kAssociated, 0))));
-}
-
 class FirstPartySetsHandlerGetContextConfigForPolicyTest
     : public FirstPartySetsHandlerImplEnabledTest {
  public:
diff --git a/content/browser/indexed_db/indexed_db_leveldb_operations.cc b/content/browser/indexed_db/indexed_db_leveldb_operations.cc
index cec6c45f..18722c8 100644
--- a/content/browser/indexed_db/indexed_db_leveldb_operations.cc
+++ b/content/browser/indexed_db/indexed_db_leveldb_operations.cc
@@ -153,7 +153,7 @@
 
   base::FileErrorOr<base::File> file_or_error = filesystem_proxy->OpenFile(
       info_path, base::File::FLAG_OPEN | base::File::FLAG_READ);
-  if (!file_or_error.is_error()) {
+  if (file_or_error.has_value()) {
     auto& file = file_or_error.value();
     if (file.IsValid()) {
       std::string input_js(file_info->size, '\0');
diff --git a/content/browser/plugin_list.cc b/content/browser/plugin_list.cc
index 483163f..f6a5b2c 100644
--- a/content/browser/plugin_list.cc
+++ b/content/browser/plugin_list.cc
@@ -16,6 +16,7 @@
 #include "base/strings/sys_string_conversions.h"
 #include "base/strings/utf_string_conversions.h"
 #include "build/build_config.h"
+#include "content/public/browser/browser_thread.h"
 #include "content/public/common/content_switches.h"
 #include "net/base/mime_util.h"
 #include "url/gurl.h"
@@ -67,17 +68,18 @@
 
 // static
 PluginList* PluginList::Singleton() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   return g_singleton.Pointer();
 }
 
 void PluginList::RefreshPlugins() {
-  base::AutoLock lock(lock_);
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   loading_state_ = LOADING_STATE_NEEDS_REFRESH;
 }
 
 void PluginList::RegisterInternalPlugin(const WebPluginInfo& info,
                                         bool add_at_beginning) {
-  base::AutoLock lock(lock_);
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   internal_plugins_.push_back(info);
   if (add_at_beginning) {
@@ -90,7 +92,8 @@
 }
 
 void PluginList::UnregisterInternalPlugin(const base::FilePath& path) {
-  base::AutoLock lock(lock_);
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
   bool found = false;
   for (size_t i = 0; i < internal_plugins_.size(); i++) {
     if (internal_plugins_[i].path == path) {
@@ -100,12 +103,12 @@
     }
   }
   DCHECK(found);
-  RemoveExtraPluginPathLocked(path);
+  RemoveExtraPluginPath(path);
 }
 
 void PluginList::GetInternalPlugins(
     std::vector<WebPluginInfo>* internal_plugins) {
-  base::AutoLock lock(lock_);
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   for (const auto& plugin : internal_plugins_)
     internal_plugins->push_back(plugin);
@@ -113,7 +116,8 @@
 
 bool PluginList::ReadPluginInfo(const base::FilePath& filename,
                                 WebPluginInfo* info) {
-  base::AutoLock lock(lock_);
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
   for (const auto& plugin : internal_plugins_) {
     if (filename == plugin.path) {
       *info = plugin;
@@ -123,10 +127,13 @@
   return false;
 }
 
-PluginList::PluginList() = default;
+PluginList::PluginList() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+}
 
 bool PluginList::PrepareForPluginLoading() {
-  base::AutoLock lock(lock_);
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
   if (loading_state_ == LOADING_STATE_UP_TO_DATE)
     return false;
 
@@ -135,18 +142,12 @@
 }
 
 void PluginList::LoadPlugins() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
   if (!PrepareForPluginLoading())
     return;
 
   std::vector<WebPluginInfo> new_plugins;
-  base::OnceClosure will_load_callback;
-  {
-    base::AutoLock lock(lock_);
-    will_load_callback = will_load_plugins_callback_;
-  }
-  if (will_load_callback)
-    std::move(will_load_callback).Run();
-
   std::vector<base::FilePath> plugin_paths;
   GetPluginPathsToLoad(&plugin_paths);
 
@@ -161,6 +162,8 @@
 bool PluginList::LoadPluginIntoPluginList(const base::FilePath& path,
                                           std::vector<WebPluginInfo>* plugins,
                                           WebPluginInfo* plugin_info) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
   if (!ReadPluginInfo(path, plugin_info))
     return false;
 
@@ -178,15 +181,9 @@
 
 void PluginList::GetPluginPathsToLoad(
     std::vector<base::FilePath>* plugin_paths) {
-  // Don't want to hold the lock while loading new plugins, so we don't block
-  // other methods if they're called on other threads.
-  std::vector<base::FilePath> extra_plugin_paths;
-  {
-    base::AutoLock lock(lock_);
-    extra_plugin_paths = extra_plugin_paths_;
-  }
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
-  for (const base::FilePath& path : extra_plugin_paths) {
+  for (const base::FilePath& path : extra_plugin_paths_) {
     if (base::Contains(*plugin_paths, path))
       continue;
     plugin_paths->push_back(path);
@@ -194,7 +191,7 @@
 }
 
 void PluginList::SetPlugins(const std::vector<WebPluginInfo>& plugins) {
-  base::AutoLock lock(lock_);
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   // If we haven't been invalidated in the mean time, mark the plugin list as
   // up to date.
@@ -204,20 +201,14 @@
   plugins_list_ = plugins;
 }
 
-void PluginList::set_will_load_plugins_callback(
-    const base::RepeatingClosure& callback) {
-  base::AutoLock lock(lock_);
-  will_load_plugins_callback_ = callback;
-}
-
 void PluginList::GetPlugins(std::vector<WebPluginInfo>* plugins) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   LoadPlugins();
-  base::AutoLock lock(lock_);
   plugins->insert(plugins->end(), plugins_list_.begin(), plugins_list_.end());
 }
 
 bool PluginList::GetPluginsNoRefresh(std::vector<WebPluginInfo>* plugins) {
-  base::AutoLock lock(lock_);
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   plugins->insert(plugins->end(), plugins_list_.begin(), plugins_list_.end());
 
   return loading_state_ == LOADING_STATE_UP_TO_DATE;
@@ -229,10 +220,10 @@
     bool allow_wildcard,
     std::vector<WebPluginInfo>* info,
     std::vector<std::string>* actual_mime_types) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   DCHECK(mime_type == base::ToLowerASCII(mime_type));
   DCHECK(info);
 
-  base::AutoLock lock(lock_);
   bool is_stale = loading_state_ != LOADING_STATE_UP_TO_DATE;
   info->clear();
   if (actual_mime_types)
@@ -279,9 +270,8 @@
   return is_stale;
 }
 
-void PluginList::RemoveExtraPluginPathLocked(
-    const base::FilePath& plugin_path) {
-  lock_.AssertAcquired();
+void PluginList::RemoveExtraPluginPath(const base::FilePath& plugin_path) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   std::vector<base::FilePath>::iterator it =
       base::ranges::find(extra_plugin_paths_, plugin_path);
   if (it != extra_plugin_paths_.end())
diff --git a/content/browser/plugin_list.h b/content/browser/plugin_list.h
index 0949b863b..0b0a860 100644
--- a/content/browser/plugin_list.h
+++ b/content/browser/plugin_list.h
@@ -10,11 +10,8 @@
 #include <utility>
 #include <vector>
 
-#include "base/callback.h"
 #include "base/files/file_path.h"
 #include "base/lazy_instance.h"
-#include "base/synchronization/lock.h"
-#include "base/thread_annotations.h"
 #include "build/build_config.h"
 #include "content/common/content_export.h"
 #include "content/public/common/webplugininfo.h"
@@ -28,14 +25,8 @@
 
 namespace content {
 
-// The PluginList is responsible for loading our NPAPI based plugins. It does
-// so in whatever manner is appropriate for the platform. On Windows, it loads
-// plugins from a known directory by looking for DLLs which start with "NP",
-// and checking to see if they are valid NPAPI libraries. On the Mac, it walks
-// the machine-wide and user plugin directories and loads anything that has
-// the correct types. On Linux, it walks the plugin directories as well
-// (e.g. /usr/lib/browser-plugins/).
-// This object is thread safe.
+// Manages the list of plugins. At this point, there are no external plugins.
+// This object lives on the UI thread.
 class CONTENT_EXPORT PluginList {
  public:
   // Gets the one instance of the PluginList.
@@ -86,8 +77,6 @@
                           std::vector<WebPluginInfo>* info,
                           std::vector<std::string>* actual_mime_types);
 
-  void set_will_load_plugins_callback(const base::RepeatingClosure& callback);
-
  private:
   enum LoadingState {
     LOADING_STATE_NEEDS_REFRESH,
@@ -120,10 +109,8 @@
   // Load all plugins from the default plugins directory.
   void LoadPlugins();
 
-  // Removes |plugin_path| from the list of extra plugin paths. Should only be
-  // called while holding |lock_|.
-  void RemoveExtraPluginPathLocked(const base::FilePath& plugin_path)
-      EXCLUSIVE_LOCKS_REQUIRED(lock_);
+  // Removes |plugin_path| from the list of extra plugin paths.
+  void RemoveExtraPluginPath(const base::FilePath& plugin_path);
 
   // Creates a WebPluginInfo structure given a plugin's path.  On success
   // returns true, with the information being put into "info".
@@ -143,23 +130,16 @@
   // States whether we will load the plugin list the next time we try to access
   // it, whether we are currently in the process of loading it, or whether we
   // consider it up to date.
-  LoadingState loading_state_ GUARDED_BY(lock_) = LOADING_STATE_NEEDS_REFRESH;
+  LoadingState loading_state_ = LOADING_STATE_NEEDS_REFRESH;
 
   // Extra plugin paths that we want to search when loading.
-  std::vector<base::FilePath> extra_plugin_paths_ GUARDED_BY(lock_);
+  std::vector<base::FilePath> extra_plugin_paths_;
 
   // Holds information about internal plugins.
-  std::vector<WebPluginInfo> internal_plugins_ GUARDED_BY(lock_);
+  std::vector<WebPluginInfo> internal_plugins_;
 
   // A list holding all plugins.
-  std::vector<WebPluginInfo> plugins_list_ GUARDED_BY(lock_);
-
-  // Callback that is invoked whenever the PluginList will reload the plugins.
-  base::RepeatingClosure will_load_plugins_callback_ GUARDED_BY(lock_);
-
-  // Need synchronization for the above members since this object can be
-  // accessed on multiple threads.
-  base::Lock lock_;
+  std::vector<WebPluginInfo> plugins_list_;
 };
 
 }  // namespace content
diff --git a/content/browser/plugin_list_unittest.cc b/content/browser/plugin_list_unittest.cc
index 7f31948..7cda980 100644
--- a/content/browser/plugin_list_unittest.cc
+++ b/content/browser/plugin_list_unittest.cc
@@ -6,7 +6,8 @@
 
 #include <string>
 
-#include "base/strings/utf_string_conversions.h"
+#include "base/files/file_path.h"
+#include "content/public/test/browser_task_environment.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "url/gurl.h"
 
@@ -16,9 +17,8 @@
 
 base::FilePath::CharType kFooPath[] = FILE_PATH_LITERAL("/plugins/foo.plugin");
 base::FilePath::CharType kBarPath[] = FILE_PATH_LITERAL("/plugins/bar.plugin");
-const char* kFooName = "Foo Plugin";
-const char* kFooMimeType = "application/x-foo-mime-type";
-const char* kFooFileType = "foo";
+const char kFooMimeType[] = "application/x-foo-mime-type";
+const char kFooFileType[] = "foo";
 
 bool Equals(const WebPluginInfo& a, const WebPluginInfo& b) {
   return (a.name == b.name && a.path == b.path && a.version == b.version &&
@@ -40,7 +40,7 @@
 class PluginListTest : public testing::Test {
  public:
   PluginListTest()
-      : foo_plugin_(base::ASCIIToUTF16(kFooName),
+      : foo_plugin_(u"Foo PluginListTest",
                     base::FilePath(kFooPath),
                     u"1.2.3",
                     u"foo"),
@@ -48,21 +48,33 @@
   }
 
   void SetUp() override {
-    plugin_list_.RegisterInternalPlugin(bar_plugin_, false);
+    // Cannot use std::unique_ptr due to private ctor.
+    plugin_list_ = new PluginList();
+    plugin_list_->RegisterInternalPlugin(bar_plugin_, false);
     foo_plugin_.mime_types.emplace_back(kFooMimeType, kFooFileType,
                                         std::string());
-    plugin_list_.RegisterInternalPlugin(foo_plugin_, false);
+    plugin_list_->RegisterInternalPlugin(foo_plugin_, false);
+  }
+
+  void TearDown() override {
+    // Cannot use std::unique_ptr due to private dtor.
+    delete plugin_list_;
   }
 
  protected:
-  PluginList plugin_list_;
+  // Must be first.
+  BrowserTaskEnvironment task_environment_;
+
+  // Owns the PluginList but cannot be a std::unique_ptr due to private
+  // ctor/dtor.
+  PluginList* plugin_list_;
   WebPluginInfo foo_plugin_;
   WebPluginInfo bar_plugin_;
 };
 
 TEST_F(PluginListTest, GetPlugins) {
   std::vector<WebPluginInfo> plugins;
-  plugin_list_.GetPlugins(&plugins);
+  plugin_list_->GetPlugins(&plugins);
   EXPECT_EQ(2u, plugins.size());
   EXPECT_TRUE(Contains(plugins, foo_plugin_));
   EXPECT_TRUE(Contains(plugins, bar_plugin_));
@@ -73,11 +85,11 @@
       std::u16string(), base::FilePath(FILE_PATH_LITERAL("/myplugin.3.0.43")),
       std::u16string(), std::u16string());
   // Simulate loading of the plugins.
-  plugin_list_.RegisterInternalPlugin(plugin_3043, false);
+  plugin_list_->RegisterInternalPlugin(plugin_3043, false);
   // Now we should have them in the state we specified above.
-  plugin_list_.RefreshPlugins();
+  plugin_list_->RefreshPlugins();
   std::vector<WebPluginInfo> plugins;
-  plugin_list_.GetPlugins(&plugins);
+  plugin_list_->GetPlugins(&plugins);
   ASSERT_TRUE(Contains(plugins, plugin_3043));
 }
 
@@ -89,7 +101,7 @@
   bool is_stale;
 
   // The PluginList starts out in a stale state.
-  is_stale = plugin_list_.GetPluginInfoArray(
+  is_stale = plugin_list_->GetPluginInfoArray(
       target_url, "application/octet-stream",
       /*allow_wildcard=*/false, &plugins, &actual_mime_types);
   EXPECT_TRUE(is_stale);
@@ -97,13 +109,13 @@
   EXPECT_EQ(0u, actual_mime_types.size());
 
   // Refresh it.
-  plugin_list_.GetPlugins(&plugins);
+  plugin_list_->GetPlugins(&plugins);
   plugins.clear();
 
   // The file type of the URL is supported by |foo_plugin_|. However,
   // GetPluginInfoArray should not match |foo_plugin_| because the MIME type is
   // application/octet-stream.
-  is_stale = plugin_list_.GetPluginInfoArray(
+  is_stale = plugin_list_->GetPluginInfoArray(
       target_url, "application/octet-stream",
       /*allow_wildcard=*/false, &plugins, &actual_mime_types);
   EXPECT_FALSE(is_stale);
@@ -113,9 +125,9 @@
   // |foo_plugin_| matches due to the MIME type.
   plugins.clear();
   actual_mime_types.clear();
-  is_stale = plugin_list_.GetPluginInfoArray(target_url, kFooMimeType,
-                                             /*allow_wildcard=*/false, &plugins,
-                                             &actual_mime_types);
+  is_stale = plugin_list_->GetPluginInfoArray(target_url, kFooMimeType,
+                                              /*allow_wildcard=*/false,
+                                              &plugins, &actual_mime_types);
   EXPECT_FALSE(is_stale);
   EXPECT_EQ(1u, plugins.size());
   EXPECT_TRUE(Contains(plugins, foo_plugin_));
@@ -125,9 +137,9 @@
   // |foo_plugin_| matches due to the file type and empty MIME type.
   plugins.clear();
   actual_mime_types.clear();
-  is_stale = plugin_list_.GetPluginInfoArray(target_url, "",
-                                             /*allow_wildcard=*/false, &plugins,
-                                             &actual_mime_types);
+  is_stale = plugin_list_->GetPluginInfoArray(target_url, "",
+                                              /*allow_wildcard=*/false,
+                                              &plugins, &actual_mime_types);
   EXPECT_FALSE(is_stale);
   EXPECT_EQ(1u, plugins.size());
   EXPECT_TRUE(Contains(plugins, foo_plugin_));
diff --git a/content/browser/plugin_service_impl.cc b/content/browser/plugin_service_impl.cc
index 59e73c99..ab3e8c8 100644
--- a/content/browser/plugin_service_impl.cc
+++ b/content/browser/plugin_service_impl.cc
@@ -19,6 +19,7 @@
 #include "base/strings/string_util.h"
 #include "base/strings/utf_string_conversions.h"
 #include "base/synchronization/waitable_event.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/task/task_runner_util.h"
 #include "base/task/thread_pool.h"
 #include "base/threading/thread.h"
@@ -54,18 +55,6 @@
 
 namespace {
 
-std::vector<WebPluginInfo> GetPluginsHelper() {
-  std::vector<WebPluginInfo> plugins;
-  PluginList::Singleton()->GetPlugins(&plugins);
-  return plugins;
-}
-
-// Callback set on the PluginList to assert that plugin loading happens on the
-// correct thread.
-void WillLoadPluginsCallback(base::SequenceChecker* sequence_checker) {
-  DCHECK(sequence_checker->CalledOnValidSequence());
-}
-
 #if BUILDFLAG(ENABLE_PPAPI)
 int CountPpapiPluginProcessesForProfile(
     const base::FilePath& plugin_path,
@@ -90,6 +79,8 @@
 
 void PluginService::PurgePluginListCache(BrowserContext* browser_context,
                                          bool reload_pages) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
   for (RenderProcessHost::iterator it = RenderProcessHost::AllHostsIterator();
        !it.IsAtEnd(); it.Advance()) {
     RenderProcessHost* host = it.GetCurrentValue();
@@ -108,14 +99,7 @@
 PluginServiceImpl::~PluginServiceImpl() = default;
 
 void PluginServiceImpl::Init() {
-  plugin_list_task_runner_ = base::ThreadPool::CreateSequencedTaskRunner(
-      {base::MayBlock(), base::TaskPriority::USER_VISIBLE,
-       base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN});
-
-  // Setup the sequence checker right after setting up the task runner.
-  plugin_list_sequence_checker_.DetachFromSequence();
-  PluginList::Singleton()->set_will_load_plugins_callback(base::BindRepeating(
-      &WillLoadPluginsCallback, &plugin_list_sequence_checker_));
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
 
   RegisterPlugins();
 }
@@ -125,6 +109,8 @@
     const base::FilePath& plugin_path,
     const base::FilePath& profile_data_directory,
     const absl::optional<url::Origin>& origin_lock) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
   for (PpapiPluginProcessHostIterator iter; !iter.Done(); ++iter) {
     if (iter->plugin_path() == plugin_path &&
         iter->profile_data_directory() == profile_data_directory &&
@@ -184,6 +170,8 @@
     const base::FilePath& profile_data_directory,
     const absl::optional<url::Origin>& origin_lock,
     PpapiPluginProcessHost::PluginClient* client) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
   PpapiPluginProcessHost* plugin_host = FindOrStartPpapiPluginProcess(
       render_process_id, plugin_path, profile_data_directory, origin_lock);
   if (plugin_host) {
@@ -201,6 +189,8 @@
     bool allow_wildcard,
     std::vector<WebPluginInfo>* plugins,
     std::vector<std::string>* actual_mime_types) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
   return PluginList::Singleton()->GetPluginInfoArray(
       url, mime_type, allow_wildcard, plugins, actual_mime_types);
 }
@@ -234,6 +224,8 @@
 
 bool PluginServiceImpl::GetPluginInfoByPath(const base::FilePath& plugin_path,
                                             WebPluginInfo* info) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
   std::vector<WebPluginInfo> plugins;
   PluginList::Singleton()->GetPluginsNoRefresh(&plugins);
 
@@ -249,6 +241,8 @@
 
 std::u16string PluginServiceImpl::GetPluginDisplayNameByPath(
     const base::FilePath& path) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
   std::u16string plugin_name = path.LossyDisplayName();
   WebPluginInfo info;
   if (PluginService::GetInstance()->GetPluginInfoByPath(path, &info) &&
@@ -266,16 +260,23 @@
 }
 
 void PluginServiceImpl::GetPlugins(GetPluginsCallback callback) {
-  base::PostTaskAndReplyWithResult(plugin_list_task_runner_.get(), FROM_HERE,
-                                   base::BindOnce(&GetPluginsHelper),
-                                   std::move(callback));
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
+  // Run `callback` later, to stay compatible with prior behavior.
+  base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
+      FROM_HERE, base::BindOnce(std::move(callback), GetPluginsSynchronous()));
 }
 
 std::vector<WebPluginInfo> PluginServiceImpl::GetPluginsSynchronous() {
-  return GetPluginsHelper();
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+  std::vector<WebPluginInfo> plugins;
+  PluginList::Singleton()->GetPlugins(&plugins);
+  return plugins;
 }
 
 void PluginServiceImpl::RegisterPlugins() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
 #if BUILDFLAG(ENABLE_PPAPI)
   ComputePepperPluginList(&plugins_);
 #else
@@ -288,6 +289,8 @@
 // There should generally be very few plugins so a brute-force search is fine.
 const ContentPluginInfo* PluginServiceImpl::GetRegisteredPluginInfo(
     const base::FilePath& plugin_path) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
+
   for (auto& plugin : plugins_) {
     if (plugin.path == plugin_path)
       return &plugin;
@@ -313,10 +316,12 @@
 }
 
 void PluginServiceImpl::SetFilter(PluginServiceFilter* filter) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   filter_ = filter;
 }
 
 PluginServiceFilter* PluginServiceImpl::GetFilter() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   return filter_;
 }
 
@@ -352,27 +357,32 @@
 }
 
 void PluginServiceImpl::RefreshPlugins() {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   PluginList::Singleton()->RefreshPlugins();
 }
 
 void PluginServiceImpl::RegisterInternalPlugin(
     const WebPluginInfo& info,
     bool add_at_beginning) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   PluginList::Singleton()->RegisterInternalPlugin(info, add_at_beginning);
 }
 
 void PluginServiceImpl::UnregisterInternalPlugin(const base::FilePath& path) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   PluginList::Singleton()->UnregisterInternalPlugin(path);
 }
 
 void PluginServiceImpl::GetInternalPlugins(
     std::vector<WebPluginInfo>* plugins) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   PluginList::Singleton()->GetInternalPlugins(plugins);
 }
 
 bool PluginServiceImpl::PpapiDevChannelSupported(
     BrowserContext* browser_context,
     const GURL& document_url) {
+  DCHECK_CURRENTLY_ON(BrowserThread::UI);
   return GetContentClient()->browser()->IsPluginAllowedToUseDevChannelAPIs(
       browser_context, document_url);
 }
diff --git a/content/browser/plugin_service_impl.h b/content/browser/plugin_service_impl.h
index cf98068c..e179b53f 100644
--- a/content/browser/plugin_service_impl.h
+++ b/content/browser/plugin_service_impl.h
@@ -10,8 +10,6 @@
 
 #include "base/memory/raw_ptr.h"
 #include "base/memory/singleton.h"
-#include "base/sequence_checker.h"
-#include "base/task/sequenced_task_runner.h"
 #include "base/time/time.h"
 #include "build/build_config.h"
 #include "content/common/content_export.h"
@@ -34,7 +32,7 @@
 struct ContentPluginInfo;
 
 // This class responds to requests from renderers for the list of plugins, and
-// also a proxy object for plugin instances.
+// also a proxy object for plugin instances. It lives on the UI thread.
 class CONTENT_EXPORT PluginServiceImpl : public PluginService {
  public:
   // Returns the PluginServiceImpl singleton.
@@ -80,7 +78,7 @@
   // Returns the plugin process host corresponding to the plugin process that
   // has been started by this service. This will start a process to host the
   // 'plugin_path' if needed. If the process fails to start, the return value
-  // is NULL. Must be called on the IO thread.
+  // is NULL.
   PpapiPluginProcessHost* FindOrStartPpapiPluginProcess(
       int render_process_id,
       const base::FilePath& plugin_path,
@@ -88,8 +86,7 @@
       const absl::optional<url::Origin>& origin_lock);
 
   // Opens a channel to a plugin process for the given mime type, starting
-  // a new plugin process if necessary.  This must be called on the IO thread
-  // or else a deadlock can occur.
+  // a new plugin process if necessary.
   void OpenChannelToPpapiPlugin(int render_process_id,
                                 const base::FilePath& plugin_path,
                                 const base::FilePath& profile_data_directory,
@@ -132,15 +129,9 @@
 
   int max_ppapi_processes_per_profile_ = kDefaultMaxPpapiProcessesPerProfile;
 
-  // Weak pointer; set during the startup on UI thread and must outlive us.
+  // Weak pointer; set during the startup and must outlive us.
   raw_ptr<PluginServiceFilter> filter_ = nullptr;
 
-  // Used to load plugins from disk.
-  scoped_refptr<base::SequencedTaskRunner> plugin_list_task_runner_;
-
-  // Used to verify that loading plugins from disk is done sequentially.
-  base::SequenceChecker plugin_list_sequence_checker_;
-
   // Used to detect if a given plugin is crashing over and over.
   std::map<base::FilePath, std::vector<base::Time>> crash_times_;
 };
diff --git a/content/browser/renderer_host/frame_tree_node.cc b/content/browser/renderer_host/frame_tree_node.cc
index a8092e2..3d6b6de 100644
--- a/content/browser/renderer_host/frame_tree_node.cc
+++ b/content/browser/renderer_host/frame_tree_node.cc
@@ -979,6 +979,26 @@
   }
 }
 
+size_t FrameTreeNode::GetFencedFrameDepth() {
+  size_t depth = 0;
+  FrameTreeNode* node = this;
+
+  while (node->fenced_frame_status() !=
+         FencedFrameStatus::kNotNestedInFencedFrame) {
+    if (node->fenced_frame_status() == FencedFrameStatus::kFencedFrameRoot) {
+      depth += 1;
+    } else {
+      DCHECK_EQ(node->fenced_frame_status(),
+                FencedFrameStatus::kIframeNestedWithinFencedFrame);
+    }
+
+    DCHECK(node->GetParentOrOuterDocument());
+    node = node->GetParentOrOuterDocument()->frame_tree_node();
+  }
+
+  return depth;
+}
+
 absl::optional<base::UnguessableToken> FrameTreeNode::GetFencedFrameNonce() {
   auto& root_fenced_frame_properties = GetFencedFrameProperties();
   if (!root_fenced_frame_properties.has_value()) {
@@ -1037,15 +1057,16 @@
   srcdoc_value_ = srcdoc_value;
 }
 
-absl::optional<const FencedFrameURLMapping::SharedStorageBudgetMetadata*>
+std::vector<const FencedFrameURLMapping::SharedStorageBudgetMetadata*>
 FrameTreeNode::FindSharedStorageBudgetMetadata() {
+  std::vector<const FencedFrameURLMapping::SharedStorageBudgetMetadata*> result;
   FrameTreeNode* node = this;
 
   while (true) {
     if (node->fenced_frame_properties_ &&
         node->fenced_frame_properties_->shared_storage_budget_metadata) {
-      DCHECK(node->IsFencedFrameRoot());
-      return node->fenced_frame_properties_->shared_storage_budget_metadata;
+      result.emplace_back(node->fenced_frame_properties_
+                              ->shared_storage_budget_metadata.value());
     }
 
     if (node->GetParentOrOuterDocument()) {
@@ -1055,7 +1076,7 @@
     }
   }
 
-  return absl::nullopt;
+  return result;
 }
 
 const scoped_refptr<BrowsingContextState>&
diff --git a/content/browser/renderer_host/frame_tree_node.h b/content/browser/renderer_host/frame_tree_node.h
index 56c6ed77..a5eff101 100644
--- a/content/browser/renderer_host/frame_tree_node.h
+++ b/content/browser/renderer_host/frame_tree_node.h
@@ -574,12 +574,21 @@
   const absl::optional<FencedFrameURLMapping::FencedFrameProperties>&
   GetFencedFrameProperties();
 
-  // Traverse up from this node. The `shared_storage_budget_metadata()` of the
-  // first seen node with a non-null budget metadata will be returned (i.e. this
-  // node inherits that budget metadata), and this node is expected to be an
-  // outermost fenced frame root. Return nullptr if not found (i.e. this node is
-  // not subjected to shared storage budgeting).
-  absl::optional<const FencedFrameURLMapping::SharedStorageBudgetMetadata*>
+  // Return the number of fenced frame boundaries above this frame. The
+  // outermost main frame's frame tree has fenced frame depth 0, a topmost
+  // fenced frame tree embedded in the outermost main frame has fenced frame
+  // depth 1, etc.
+  size_t GetFencedFrameDepth();
+
+  // Traverse up from this node. Return all valid
+  // `node->fenced_frame_properties_->shared_storage_budget_metadata` (i.e. this
+  // node is subjected to the shared storage budgeting associated with those
+  // metadata). Every node that originates from sharedStorage.selectURL() will
+  // have an associated metadata. This indicates that the metadata can only
+  // possibly be associated with a fenced frame root, unless when
+  // `kAllowURNsInIframes` is enabled in which case they could be be associated
+  // with any node.
+  std::vector<const FencedFrameURLMapping::SharedStorageBudgetMetadata*>
   FindSharedStorageBudgetMetadata();
 
   // Accessor to BrowsingContextState for subframes only. Only main frame
diff --git a/content/browser/service_worker/embedded_worker_instance.h b/content/browser/service_worker/embedded_worker_instance.h
index 73cd7cc9..4107f6f 100644
--- a/content/browser/service_worker/embedded_worker_instance.h
+++ b/content/browser/service_worker/embedded_worker_instance.h
@@ -271,7 +271,7 @@
   typedef base::ObserverList<Listener>::Unchecked ListenerList;
   struct StartInfo;
   class WorkerProcessHandle;
-  friend class EmbeddedWorkerInstanceTest;
+  friend class EmbeddedWorkerInstanceTestHarness;
   FRIEND_TEST_ALL_PREFIXES(EmbeddedWorkerInstanceTest, StartAndStop);
   FRIEND_TEST_ALL_PREFIXES(EmbeddedWorkerInstanceTest, DetachDuringStart);
   FRIEND_TEST_ALL_PREFIXES(EmbeddedWorkerInstanceTest, StopDuringStart);
diff --git a/content/browser/service_worker/embedded_worker_instance_unittest.cc b/content/browser/service_worker/embedded_worker_instance_unittest.cc
index e7eca8f..1030ee9 100644
--- a/content/browser/service_worker/embedded_worker_instance_unittest.cc
+++ b/content/browser/service_worker/embedded_worker_instance_unittest.cc
@@ -8,67 +8,40 @@
 #include <utility>
 #include <vector>
 
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/command_line.h"
 #include "base/run_loop.h"
-#include "base/test/metrics/histogram_tester.h"
 #include "base/test/scoped_feature_list.h"
+#include "base/test/test_future.h"
 #include "content/browser/service_worker/embedded_worker_status.h"
 #include "content/browser/service_worker/embedded_worker_test_helper.h"
 #include "content/browser/service_worker/fake_embedded_worker_instance_client.h"
 #include "content/browser/service_worker/service_worker_context_core.h"
-#include "content/browser/service_worker/service_worker_context_wrapper.h"
-#include "content/browser/service_worker/service_worker_registration.h"
-#include "content/browser/service_worker/service_worker_test_utils.h"
 #include "content/browser/service_worker/service_worker_version.h"
 #include "content/public/common/child_process_host.h"
-#include "content/public/common/content_switches.h"
-#include "content/public/test/browser_task_environment.h"
-#include "content/public/test/policy_container_utils.h"
+#include "content/public/test/embedded_worker_instance_test_harness.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
-#include "mojo/public/cpp/bindings/remote.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/blink/public/common/features.h"
-#include "third_party/blink/public/common/storage_key/storage_key.h"
 #include "third_party/blink/public/mojom/service_worker/embedded_worker.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_event_status.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_registration.mojom.h"
-#include "third_party/blink/public/mojom/service_worker/service_worker_registration_options.mojom.h"
-#include "url/origin.h"
 
 namespace content {
 
 namespace {
 
-EmbeddedWorkerInstance::StatusCallback ReceiveStatus(
-    absl::optional<blink::ServiceWorkerStatusCode>* out_status,
-    base::OnceClosure quit) {
-  return base::BindOnce(
-      [](absl::optional<blink::ServiceWorkerStatusCode>* out_status,
-         base::OnceClosure quit, blink::ServiceWorkerStatusCode status) {
-        *out_status = status;
-        std::move(quit).Run();
-      },
-      out_status, std::move(quit));
-}
+using RegistrationAndVersionPair =
+    EmbeddedWorkerTestHelper::RegistrationAndVersionPair;
 
 }  // namespace
 
-class EmbeddedWorkerInstanceTest : public testing::Test,
+class EmbeddedWorkerInstanceTest : public EmbeddedWorkerInstanceTestHarness,
                                    public EmbeddedWorkerInstance::Listener {
  public:
-  EmbeddedWorkerInstanceTest(const EmbeddedWorkerInstanceTest&) = delete;
-  EmbeddedWorkerInstanceTest& operator=(const EmbeddedWorkerInstanceTest&) =
-      delete;
+  EmbeddedWorkerInstanceTest()
+      : EmbeddedWorkerInstanceTestHarness(BrowserTaskEnvironment::IO_MAINLOOP) {
+  }
 
  protected:
-  EmbeddedWorkerInstanceTest()
-      : task_environment_(BrowserTaskEnvironment::IO_MAINLOOP) {}
-
   enum EventType {
     PROCESS_ALLOCATED,
     START_WORKER_MESSAGE_SENT,
@@ -108,125 +81,9 @@
     RecordEvent(DETACHED, old_status);
   }
 
-  void SetUp() override {
-    helper_ = std::make_unique<EmbeddedWorkerTestHelper>(base::FilePath());
-  }
-
-  void TearDown() override { helper_.reset(); }
-
-  using RegistrationAndVersionPair =
-      std::pair<scoped_refptr<ServiceWorkerRegistration>,
-                scoped_refptr<ServiceWorkerVersion>>;
-
-  RegistrationAndVersionPair PrepareRegistrationAndVersion(
-      const GURL& scope,
-      const GURL& script_url) {
-    RegistrationAndVersionPair pair;
-    blink::mojom::ServiceWorkerRegistrationOptions options;
-    options.scope = scope;
-    pair.first = CreateNewServiceWorkerRegistration(
-        context()->registry(), options,
-        blink::StorageKey(url::Origin::Create(scope)));
-    pair.second = CreateNewServiceWorkerVersion(
-        context()->registry(), pair.first, script_url,
-        blink::mojom::ScriptType::kClassic);
-    return pair;
-  }
-
-  // Calls worker->Start() and runs until the start IPC is sent.
-  //
-  // Expects success. For failure cases, call Start() manually.
-  void StartWorkerUntilStartSent(
-      EmbeddedWorkerInstance* worker,
-      blink::mojom::EmbeddedWorkerStartParamsPtr params) {
-    absl::optional<blink::ServiceWorkerStatusCode> status;
-    base::RunLoop loop;
-    worker->Start(std::move(params),
-                  ReceiveStatus(&status, loop.QuitClosure()));
-    loop.Run();
-    EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status);
-    EXPECT_EQ(EmbeddedWorkerStatus::STARTING, worker->status());
-  }
-
-  // Calls worker->Start() and runs until startup finishes.
-  //
-  // Expects success. For failure cases, call Start() manually.
-  void StartWorker(EmbeddedWorkerInstance* worker,
-                   blink::mojom::EmbeddedWorkerStartParamsPtr params) {
-    StartWorkerUntilStartSent(worker, std::move(params));
-    // TODO(falken): Listen for OnStarted() instead of this.
-    base::RunLoop().RunUntilIdle();
-    EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status());
-  }
-
-  blink::mojom::EmbeddedWorkerStartParamsPtr CreateStartParams(
-      scoped_refptr<ServiceWorkerVersion> version) {
-    auto params = blink::mojom::EmbeddedWorkerStartParams::New();
-    params->service_worker_version_id = version->version_id();
-    params->scope = version->scope();
-    params->script_url = version->script_url();
-    params->is_installed = false;
-
-    params->service_worker_receiver = CreateServiceWorker(version);
-    params->controller_receiver = CreateController();
-    params->installed_scripts_info = GetInstalledScriptsInfoPtr();
-    params->provider_info = CreateProviderInfo(std::move(version));
-    params->policy_container = CreateStubPolicyContainer();
-    return params;
-  }
-
-  blink::mojom::ServiceWorkerProviderInfoForStartWorkerPtr CreateProviderInfo(
-      scoped_refptr<ServiceWorkerVersion> version) {
-    auto provider_info =
-        blink::mojom::ServiceWorkerProviderInfoForStartWorker::New();
-    version->worker_host_ = std::make_unique<ServiceWorkerHost>(
-        provider_info->host_remote.InitWithNewEndpointAndPassReceiver(),
-        version.get(), context()->AsWeakPtr());
-    return provider_info;
-  }
-
-  mojo::PendingReceiver<blink::mojom::ServiceWorker> CreateServiceWorker(
-      scoped_refptr<ServiceWorkerVersion> version) {
-    version->service_worker_remote_.reset();
-    return version->service_worker_remote_.BindNewPipeAndPassReceiver();
-  }
-
-  mojo::PendingReceiver<blink::mojom::ControllerServiceWorker>
-  CreateController() {
-    controllers_.emplace_back();
-    return controllers_.back().BindNewPipeAndPassReceiver();
-  }
-
-  void SetWorkerStatus(EmbeddedWorkerInstance* worker,
-                       EmbeddedWorkerStatus status) {
-    worker->status_ = status;
-  }
-
-  blink::mojom::ServiceWorkerInstalledScriptsInfoPtr
-  GetInstalledScriptsInfoPtr() {
-    installed_scripts_managers_.emplace_back();
-    auto info = blink::mojom::ServiceWorkerInstalledScriptsInfo::New();
-    info->manager_receiver =
-        installed_scripts_managers_.back().BindNewPipeAndPassReceiver();
-    installed_scripts_manager_host_receivers_.push_back(
-        info->manager_host_remote.InitWithNewPipeAndPassReceiver());
-    return info;
-  }
-
   ServiceWorkerContextCore* context() { return helper_->context(); }
 
-  // Mojo endpoints.
-  std::vector<mojo::Remote<blink::mojom::ControllerServiceWorker>> controllers_;
-  std::vector<mojo::Remote<blink::mojom::ServiceWorkerInstalledScriptsManager>>
-      installed_scripts_managers_;
-  std::vector<mojo::PendingReceiver<
-      blink::mojom::ServiceWorkerInstalledScriptsManagerHost>>
-      installed_scripts_manager_host_receivers_;
-
-  BrowserTaskEnvironment task_environment_;
-  std::unique_ptr<EmbeddedWorkerTestHelper> helper_;
   std::vector<EventLog> events_;
-  base::test::ScopedFeatureList scoped_feature_list_;
   blink::mojom::ServiceWorkerFetchHandlerType fetch_handler_type_;
 };
 
@@ -234,13 +91,14 @@
   const GURL scope("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
-  RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url);
+  RegistrationAndVersionPair pair =
+      helper_->PrepareRegistrationAndVersion(scope, url);
   auto worker = std::make_unique<EmbeddedWorkerInstance>(pair.second.get());
   EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status());
   worker->AddObserver(this);
 
   // Start should succeed.
-  StartWorker(worker.get(), CreateStartParams(pair.second));
+  helper_->StartWorker(worker.get(), helper_->CreateStartParams(pair.second));
 
   // The 'WorkerStarted' message should have been sent by
   // EmbeddedWorkerTestHelper.
@@ -272,14 +130,15 @@
   const GURL scope("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
-  RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url);
+  RegistrationAndVersionPair pair =
+      helper_->PrepareRegistrationAndVersion(scope, url);
   const int64_t service_worker_version_id = pair.second->version_id();
   auto worker = std::make_unique<EmbeddedWorkerInstance>(pair.second.get());
   EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status());
 
   {
     // Start once normally.
-    StartWorker(worker.get(), CreateStartParams(pair.second));
+    helper_->StartWorker(worker.get(), helper_->CreateStartParams(pair.second));
     // The worker should be using the default render process.
     EXPECT_EQ(helper_->mock_render_process_id(), worker->process_id());
 
@@ -296,7 +155,7 @@
   {
     // Start again.
     base::RunLoop run_loop;
-    StartWorker(worker.get(), CreateStartParams(pair.second));
+    helper_->StartWorker(worker.get(), helper_->CreateStartParams(pair.second));
 
     // The worker should be using the new render process.
     EXPECT_EQ(helper_->new_render_process_id(), worker->process_id());
@@ -309,12 +168,13 @@
   const GURL scope("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
-  RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url);
+  RegistrationAndVersionPair pair =
+      helper_->PrepareRegistrationAndVersion(scope, url);
   auto worker = std::make_unique<EmbeddedWorkerInstance>(pair.second.get());
   EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status());
 
   // Start the worker and then call StopIfNotAttachedToDevTools().
-  StartWorker(worker.get(), CreateStartParams(pair.second));
+  helper_->StartWorker(worker.get(), helper_->CreateStartParams(pair.second));
   EXPECT_EQ(helper_->mock_render_process_id(), worker->process_id());
   worker->StopIfNotAttachedToDevTools();
   EXPECT_EQ(EmbeddedWorkerStatus::STOPPING, worker->status());
@@ -326,7 +186,7 @@
   // Set devtools_attached to true, and do the same.
   worker->SetDevToolsAttached(true);
 
-  StartWorker(worker.get(), CreateStartParams(pair.second));
+  helper_->StartWorker(worker.get(), helper_->CreateStartParams(pair.second));
   EXPECT_EQ(helper_->mock_render_process_id(), worker->process_id());
   worker->StopIfNotAttachedToDevTools();
   base::RunLoop().RunUntilIdle();
@@ -345,14 +205,16 @@
   const GURL scope("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
-  RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url);
+  RegistrationAndVersionPair pair =
+      helper_->PrepareRegistrationAndVersion(scope, url);
   auto worker = std::make_unique<EmbeddedWorkerInstance>(pair.second.get());
   worker->AddObserver(this);
 
   auto* client = helper_->AddNewPendingInstanceClient<
       DelayedFakeEmbeddedWorkerInstanceClient>(helper_.get());
   client->UnblockStopWorker();
-  StartWorkerUntilStartSent(worker.get(), CreateStartParams(pair.second));
+  helper_->StartWorkerUntilStartSent(worker.get(),
+                                     helper_->CreateStartParams(pair.second));
   ASSERT_EQ(2u, events_.size());
   EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type);
   EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type);
@@ -374,7 +236,8 @@
   const GURL scope("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
-  RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url);
+  RegistrationAndVersionPair pair =
+      helper_->PrepareRegistrationAndVersion(scope, url);
   auto worker = std::make_unique<EmbeddedWorkerInstance>(pair.second.get());
   worker->AddObserver(this);
 
@@ -382,7 +245,8 @@
       DelayedFakeEmbeddedWorkerInstanceClient>(helper_.get());
   client->UnblockStopWorker();
 
-  StartWorkerUntilStartSent(worker.get(), CreateStartParams(pair.second));
+  helper_->StartWorkerUntilStartSent(worker.get(),
+                                     helper_->CreateStartParams(pair.second));
   ASSERT_EQ(2u, events_.size());
   EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type);
   EXPECT_EQ(START_WORKER_MESSAGE_SENT, events_[1].type);
@@ -401,7 +265,7 @@
   events_.clear();
 
   // Restart the worker.
-  StartWorker(worker.get(), CreateStartParams(pair.second));
+  helper_->StartWorker(worker.get(), helper_->CreateStartParams(pair.second));
 
   // The worker should be started.
   ASSERT_EQ(3u, events_.size());
@@ -417,11 +281,12 @@
   const GURL scope("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
-  RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url);
+  RegistrationAndVersionPair pair =
+      helper_->PrepareRegistrationAndVersion(scope, url);
   auto worker = std::make_unique<EmbeddedWorkerInstance>(pair.second.get());
 
   // Start the worker.
-  StartWorker(worker.get(), CreateStartParams(pair.second));
+  helper_->StartWorker(worker.get(), helper_->CreateStartParams(pair.second));
 
   // Detach.
   worker->Detach();
@@ -436,18 +301,16 @@
   // Let StartWorker fail; mojo IPC fails to connect to a remote interface.
   helper_->AddPendingInstanceClient(nullptr);
 
-  RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url);
+  RegistrationAndVersionPair pair =
+      helper_->PrepareRegistrationAndVersion(scope, url);
   auto worker = std::make_unique<EmbeddedWorkerInstance>(pair.second.get());
   worker->AddObserver(this);
 
   // Attempt to start the worker. From the browser process's point of view, the
   // start IPC was sent.
-  absl::optional<blink::ServiceWorkerStatusCode> status;
-  base::RunLoop loop;
-  worker->Start(CreateStartParams(pair.second),
-                ReceiveStatus(&status, loop.QuitClosure()));
-  loop.Run();
-  EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status.value());
+  base::test::TestFuture<blink::ServiceWorkerStatusCode> future;
+  worker->Start(helper_->CreateStartParams(pair.second), future.GetCallback());
+  EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, future.Get());
 
   // But the renderer should not receive the message and the binding is broken.
   // Worker should handle the failure of binding on the remote side as detach.
@@ -465,19 +328,17 @@
   const GURL scope("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
-  RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url);
+  RegistrationAndVersionPair pair =
+      helper_->PrepareRegistrationAndVersion(scope, url);
   auto worker = std::make_unique<EmbeddedWorkerInstance>(pair.second.get());
   worker->AddObserver(this);
 
   // Attempt to start the worker.
-  absl::optional<blink::ServiceWorkerStatusCode> status;
-  base::RunLoop loop;
   auto* client = helper_->AddNewPendingInstanceClient<
       DelayedFakeEmbeddedWorkerInstanceClient>(helper_.get());
-  worker->Start(CreateStartParams(pair.second),
-                ReceiveStatus(&status, loop.QuitClosure()));
-  loop.Run();
-  EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, status.value());
+  base::test::TestFuture<blink::ServiceWorkerStatusCode> future;
+  worker->Start(helper_->CreateStartParams(pair.second), future.GetCallback());
+  EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, future.Get());
 
   // Disconnect the Mojo connection. Worker should handle the sudden shutdown as
   // detach.
@@ -516,7 +377,8 @@
   const GURL scope("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
-  RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url);
+  RegistrationAndVersionPair pair =
+      helper_->PrepareRegistrationAndVersion(scope, url);
   // We should set COEP, or cache storage pipe won't be made.
   pair.second->set_cross_origin_embedder_policy(
       network::CrossOriginEmbedderPolicy());
@@ -526,7 +388,7 @@
   auto* client =
       helper_->AddNewPendingInstanceClient<RecordCacheStorageInstanceClient>(
           helper_.get());
-  StartWorker(worker.get(), CreateStartParams(pair.second));
+  helper_->StartWorker(worker.get(), helper_->CreateStartParams(pair.second));
 
   // Cache storage should have been sent.
   EXPECT_TRUE(client->had_cache_storage());
@@ -546,7 +408,8 @@
   const GURL scope("http://example.com/");
   const GURL url("http://example.com/worker.js");
 
-  RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url);
+  RegistrationAndVersionPair pair =
+      helper_->PrepareRegistrationAndVersion(scope, url);
   auto worker = std::make_unique<EmbeddedWorkerInstance>(pair.second.get());
   auto* client =
       helper_->AddNewPendingInstanceClient<RecordCacheStorageInstanceClient>(
@@ -554,8 +417,8 @@
 
   // Start the worker.
   blink::mojom::EmbeddedWorkerStartParamsPtr params =
-      CreateStartParams(pair.second);
-  StartWorker(worker.get(), std::move(params));
+      helper_->CreateStartParams(pair.second);
+  helper_->StartWorker(worker.get(), std::move(params));
 
   // Cache storage should not have been sent.
   EXPECT_FALSE(client->had_cache_storage());
@@ -587,14 +450,15 @@
 TEST_F(EmbeddedWorkerInstanceTest, AbruptCompletion) {
   const GURL scope("http://example.com/");
   const GURL url("http://example.com/worker.js");
-  RegistrationAndVersionPair pair = PrepareRegistrationAndVersion(scope, url);
+  RegistrationAndVersionPair pair =
+      helper_->PrepareRegistrationAndVersion(scope, url);
   auto worker = std::make_unique<EmbeddedWorkerInstance>(pair.second.get());
   EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status());
   worker->AddObserver(this);
 
   helper_->AddPendingInstanceClient(
       std::make_unique<AbruptCompletionInstanceClient>(helper_.get()));
-  StartWorker(worker.get(), CreateStartParams(pair.second));
+  helper_->StartWorker(worker.get(), helper_->CreateStartParams(pair.second));
 
   ASSERT_EQ(3u, events_.size());
   EXPECT_EQ(PROCESS_ALLOCATED, events_[0].type);
@@ -634,7 +498,8 @@
 TEST_F(EmbeddedWorkerInstanceTest, HasFetchHandler) {
   const GURL scope("http://example.com/");
   const GURL url("http://example.com/worker.js");
-  RegistrationAndVersionPair pair1 = PrepareRegistrationAndVersion(scope, url);
+  RegistrationAndVersionPair pair1 =
+      helper_->PrepareRegistrationAndVersion(scope, url);
   auto worker1 = std::make_unique<EmbeddedWorkerInstance>(pair1.second.get());
   EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker1->status());
   worker1->AddObserver(this);
@@ -644,13 +509,14 @@
           helper_.get());
   fetch_handler_worker->set_fetch_handler_type(
       blink::mojom::ServiceWorkerFetchHandlerType::kNotSkippable);
-  StartWorker(worker1.get(), CreateStartParams(pair1.second));
+  helper_->StartWorker(worker1.get(), helper_->CreateStartParams(pair1.second));
 
   EXPECT_NE(blink::mojom::ServiceWorkerFetchHandlerType::kNoHandler,
             fetch_handler_type_);
   worker1->Stop();
 
-  RegistrationAndVersionPair pair2 = PrepareRegistrationAndVersion(scope, url);
+  RegistrationAndVersionPair pair2 =
+      helper_->PrepareRegistrationAndVersion(scope, url);
   auto worker2 = std::make_unique<EmbeddedWorkerInstance>(pair2.second.get());
   EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker2->status());
   worker2->AddObserver(this);
@@ -660,7 +526,7 @@
           helper_.get());
   no_fetch_handler_worker->set_fetch_handler_type(
       blink::mojom::ServiceWorkerFetchHandlerType::kNoHandler);
-  StartWorker(worker2.get(), CreateStartParams(pair2.second));
+  helper_->StartWorker(worker2.get(), helper_->CreateStartParams(pair2.second));
 
   EXPECT_EQ(blink::mojom::ServiceWorkerFetchHandlerType::kNoHandler,
             fetch_handler_type_);
diff --git a/content/browser/service_worker/embedded_worker_test_helper.cc b/content/browser/service_worker/embedded_worker_test_helper.cc
index 252a4ab1..7e8834c 100644
--- a/content/browser/service_worker/embedded_worker_test_helper.cc
+++ b/content/browser/service_worker/embedded_worker_test_helper.cc
@@ -9,6 +9,7 @@
 
 #include "base/callback.h"
 #include "base/memory/scoped_refptr.h"
+#include "base/test/test_future.h"
 #include "base/threading/sequenced_task_runner_handle.h"
 #include "base/threading/thread_task_runner_handle.h"
 #include "components/services/storage/service_worker/service_worker_storage_control_impl.h"
@@ -16,6 +17,7 @@
 #include "content/browser/service_worker/service_worker_context_wrapper.h"
 #include "content/browser/service_worker/service_worker_test_utils.h"
 #include "content/public/test/mock_render_process_host.h"
+#include "content/public/test/policy_container_utils.h"
 #include "content/public/test/test_browser_context.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
 #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
@@ -28,12 +30,29 @@
     const base::FilePath& user_data_directory)
     : EmbeddedWorkerTestHelper(
           user_data_directory,
-          base::MakeRefCounted<storage::MockSpecialStoragePolicy>()) {}
+          base::MakeRefCounted<storage::MockSpecialStoragePolicy>(),
+          std::make_unique<TestBrowserContext>()) {}
 
 EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper(
     const base::FilePath& user_data_directory,
     scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy)
-    : browser_context_(std::make_unique<TestBrowserContext>()),
+    : EmbeddedWorkerTestHelper(user_data_directory,
+                               special_storage_policy,
+                               std::make_unique<TestBrowserContext>()) {}
+
+EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper(
+    const base::FilePath& user_data_directory,
+    std::unique_ptr<BrowserContext> browser_context)
+    : EmbeddedWorkerTestHelper(
+          user_data_directory,
+          base::MakeRefCounted<storage::MockSpecialStoragePolicy>(),
+          std::move(browser_context)) {}
+
+EmbeddedWorkerTestHelper::EmbeddedWorkerTestHelper(
+    const base::FilePath& user_data_directory,
+    scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy,
+    std::unique_ptr<BrowserContext> browser_context)
+    : browser_context_(std::move(browser_context)),
       render_process_host_(
           std::make_unique<MockRenderProcessHost>(browser_context_.get())),
       new_render_process_host_(
@@ -243,4 +262,95 @@
       user_data_directory_, database_task_runner_, std::move(receiver));
 }
 
+EmbeddedWorkerTestHelper::RegistrationAndVersionPair
+EmbeddedWorkerTestHelper::PrepareRegistrationAndVersion(
+    const GURL& scope,
+    const GURL& script_url) {
+  RegistrationAndVersionPair pair;
+  blink::mojom::ServiceWorkerRegistrationOptions options;
+  options.scope = scope;
+  pair.first = CreateNewServiceWorkerRegistration(
+      context()->registry(), options,
+      blink::StorageKey(url::Origin::Create(scope)));
+  pair.second = CreateNewServiceWorkerVersion(
+      context()->registry(), pair.first, script_url,
+      blink::mojom::ScriptType::kClassic);
+  return pair;
+}
+
+// Calls worker->Start() and runs until the start IPC is sent.
+//
+// Expects success. For failure cases, call Start() manually.
+void EmbeddedWorkerTestHelper::StartWorkerUntilStartSent(
+    EmbeddedWorkerInstance* worker,
+    blink::mojom::EmbeddedWorkerStartParamsPtr params) {
+  base::test::TestFuture<blink::ServiceWorkerStatusCode> future;
+  worker->Start(std::move(params), future.GetCallback());
+  EXPECT_EQ(blink::ServiceWorkerStatusCode::kOk, future.Get());
+}
+
+// Calls worker->Start() and runs until startup finishes.
+//
+// Expects success. For failure cases, call Start() manually.
+void EmbeddedWorkerTestHelper::StartWorker(
+    EmbeddedWorkerInstance* worker,
+    blink::mojom::EmbeddedWorkerStartParamsPtr params) {
+  StartWorkerUntilStartSent(worker, std::move(params));
+  // TODO(falken): Listen for OnStarted() instead of this.
+  base::RunLoop().RunUntilIdle();
+  EXPECT_EQ(EmbeddedWorkerStatus::RUNNING, worker->status());
+}
+
+blink::mojom::EmbeddedWorkerStartParamsPtr
+EmbeddedWorkerTestHelper::CreateStartParams(
+    scoped_refptr<ServiceWorkerVersion> version) {
+  auto params = blink::mojom::EmbeddedWorkerStartParams::New();
+  params->service_worker_version_id = version->version_id();
+  params->scope = version->scope();
+  params->script_url = version->script_url();
+  params->is_installed = false;
+
+  params->service_worker_receiver = CreateServiceWorker(version);
+  params->controller_receiver = CreateController();
+  params->installed_scripts_info = GetInstalledScriptsInfoPtr();
+  params->provider_info = CreateProviderInfo(std::move(version));
+  params->policy_container = CreateStubPolicyContainer();
+  return params;
+}
+
+blink::mojom::ServiceWorkerProviderInfoForStartWorkerPtr
+EmbeddedWorkerTestHelper::CreateProviderInfo(
+    scoped_refptr<ServiceWorkerVersion> version) {
+  auto provider_info =
+      blink::mojom::ServiceWorkerProviderInfoForStartWorker::New();
+  version->worker_host_ = std::make_unique<ServiceWorkerHost>(
+      provider_info->host_remote.InitWithNewEndpointAndPassReceiver(),
+      version.get(), context()->AsWeakPtr());
+  return provider_info;
+}
+
+mojo::PendingReceiver<blink::mojom::ServiceWorker>
+EmbeddedWorkerTestHelper::CreateServiceWorker(
+    scoped_refptr<ServiceWorkerVersion> version) {
+  version->service_worker_remote_.reset();
+  return version->service_worker_remote_.BindNewPipeAndPassReceiver();
+}
+
+mojo::PendingReceiver<blink::mojom::ControllerServiceWorker>
+EmbeddedWorkerTestHelper::CreateController() {
+  controllers_.emplace_back();
+  return controllers_.back().BindNewPipeAndPassReceiver();
+}
+
+blink::mojom::ServiceWorkerInstalledScriptsInfoPtr
+EmbeddedWorkerTestHelper::GetInstalledScriptsInfoPtr() {
+  installed_scripts_managers_.emplace_back();
+  auto info = blink::mojom::ServiceWorkerInstalledScriptsInfo::New();
+  info->manager_receiver =
+      installed_scripts_managers_.back().BindNewPipeAndPassReceiver();
+  installed_scripts_manager_host_receivers_.push_back(
+      info->manager_host_remote.InitWithNewPipeAndPassReceiver());
+  return info;
+}
+
 }  // namespace content
diff --git a/content/browser/service_worker/embedded_worker_test_helper.h b/content/browser/service_worker/embedded_worker_test_helper.h
index 530f7a7..a25b298 100644
--- a/content/browser/service_worker/embedded_worker_test_helper.h
+++ b/content/browser/service_worker/embedded_worker_test_helper.h
@@ -38,7 +38,6 @@
 class MockRenderProcessHost;
 class ServiceWorkerContextCore;
 class ServiceWorkerContextWrapper;
-class TestBrowserContext;
 
 // In-Process EmbeddedWorker test helper.
 //
@@ -85,9 +84,15 @@
   // If |user_data_directory| is empty, the context makes storage stuff in
   // memory.
   explicit EmbeddedWorkerTestHelper(const base::FilePath& user_data_directory);
+  EmbeddedWorkerTestHelper(const base::FilePath& user_data_directory,
+                           std::unique_ptr<BrowserContext> browser_context);
   EmbeddedWorkerTestHelper(
       const base::FilePath& user_data_directory,
       scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy);
+  EmbeddedWorkerTestHelper(
+      const base::FilePath& user_data_directory,
+      scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy,
+      std::unique_ptr<BrowserContext> browser_context);
 
   EmbeddedWorkerTestHelper(const EmbeddedWorkerTestHelper&) = delete;
   EmbeddedWorkerTestHelper& operator=(const EmbeddedWorkerTestHelper&) = delete;
@@ -116,7 +121,7 @@
     return quota_manager_proxy_.get();
   }
 
-  TestBrowserContext* browser_context() { return browser_context_.get(); }
+  BrowserContext* browser_context() { return browser_context_.get(); }
 
   static std::unique_ptr<ServiceWorkerVersion::MainScriptResponse>
   CreateMainScriptResponse();
@@ -179,6 +184,42 @@
                                       base::OnceClosure callback);
   /////////////////////////////////////////////////////////////////////////////
 
+  using RegistrationAndVersionPair =
+      std::pair<scoped_refptr<ServiceWorkerRegistration>,
+                scoped_refptr<ServiceWorkerVersion>>;
+
+  RegistrationAndVersionPair PrepareRegistrationAndVersion(
+      const GURL& scope,
+      const GURL& script_url);
+
+  // Calls worker->Start() and runs until the start IPC is sent.
+  //
+  // Expects success. For failure cases, call Start() manually.
+  void StartWorkerUntilStartSent(
+      EmbeddedWorkerInstance* worker,
+      blink::mojom::EmbeddedWorkerStartParamsPtr params);
+
+  // Calls worker->Start() and runs until startup finishes.
+  //
+  // Expects success. For failure cases, call Start() manually.
+  void StartWorker(EmbeddedWorkerInstance* worker,
+                   blink::mojom::EmbeddedWorkerStartParamsPtr params);
+
+  blink::mojom::EmbeddedWorkerStartParamsPtr CreateStartParams(
+      scoped_refptr<ServiceWorkerVersion> version);
+
+  blink::mojom::ServiceWorkerProviderInfoForStartWorkerPtr CreateProviderInfo(
+      scoped_refptr<ServiceWorkerVersion> version);
+
+  mojo::PendingReceiver<blink::mojom::ServiceWorker> CreateServiceWorker(
+      scoped_refptr<ServiceWorkerVersion> version);
+
+  mojo::PendingReceiver<blink::mojom::ControllerServiceWorker>
+  CreateController();
+
+  blink::mojom::ServiceWorkerInstalledScriptsInfoPtr
+  GetInstalledScriptsInfoPtr();
+
  protected:
   // Subclasses can override these to change the default fakes. This saves tests
   // from calling AddPending*() for each start worker attempt.
@@ -191,7 +232,7 @@
       mojo::PendingReceiver<storage::mojom::ServiceWorkerStorageControl>
           receiver);
 
-  std::unique_ptr<TestBrowserContext> browser_context_;
+  std::unique_ptr<BrowserContext> browser_context_;
   std::unique_ptr<MockRenderProcessHost> render_process_host_;
   std::unique_ptr<MockRenderProcessHost> new_render_process_host_;
   scoped_refptr<storage::MockQuotaManager> quota_manager_;
@@ -222,6 +263,14 @@
   int new_mock_render_process_id_;
 
   scoped_refptr<URLLoaderFactoryGetter> url_loader_factory_getter_;
+
+  // Mojo endpoints.
+  std::vector<mojo::Remote<blink::mojom::ControllerServiceWorker>> controllers_;
+  std::vector<mojo::Remote<blink::mojom::ServiceWorkerInstalledScriptsManager>>
+      installed_scripts_managers_;
+  std::vector<mojo::PendingReceiver<
+      blink::mojom::ServiceWorkerInstalledScriptsManagerHost>>
+      installed_scripts_manager_host_receivers_;
 };
 
 template <typename MockType, typename... Args>
diff --git a/content/browser/service_worker/service_worker_version.h b/content/browser/service_worker/service_worker_version.h
index b2ee957..59dda077 100644
--- a/content/browser/service_worker/service_worker_version.h
+++ b/content/browser/service_worker/service_worker_version.h
@@ -687,7 +687,7 @@
 
  private:
   friend class base::RefCounted<ServiceWorkerVersion>;
-  friend class EmbeddedWorkerInstanceTest;
+  friend class EmbeddedWorkerTestHelper;
   friend class ServiceWorkerPingController;
   friend class ServiceWorkerContainerHostTest;
   friend class ServiceWorkerReadFromCacheJobTest;
diff --git a/content/browser/shared_storage/shared_storage_browsertest.cc b/content/browser/shared_storage/shared_storage_browsertest.cc
index 02cabb1..4aa615c 100644
--- a/content/browser/shared_storage/shared_storage_browsertest.cc
+++ b/content/browser/shared_storage/shared_storage_browsertest.cc
@@ -83,9 +83,9 @@
 const char kSelectFrom8URLsScript[] = R"(
     let urls = [];
     for (let i = 0; i < 8; ++i) {
-      urls.push({url: 'fenced_frames/title' + i.toString() + '.html',
+      urls.push({url: '/fenced_frames/title' + i.toString() + '.html',
                  reportingMetadata: {
-                   'click': 'fenced_frames/report' + i.toString() + '.html'
+                   'click': '/fenced_frames/report' + i.toString() + '.html'
                  }});
     }
 
@@ -1873,18 +1873,24 @@
     return child_node;
   }
 
-  // Create an iframe and run sharedStorage.selectURL() on 8 urls. This
-  // generates an URN associated with `origin` and 3 bits of shared storage
-  // budget. This can be called at most once per origin per test, because
-  // `GetAttachedWorkletHostForOrigin()` will expect only one worklet host for
-  // this origin, and `WaitForWorkletResponsesCount()` is expected to be invoked
-  // once per worklet host.
-  GURL SelectFrom8URLsInContext(const url::Origin& origin) {
-    FrameTreeNode* iframe =
-        CreateIFrame(PrimaryFrameTreeNodeRoot(), origin.GetURL());
+  // Create an iframe of origin `origin` inside `parent_node`, and run
+  // sharedStorage.selectURL() on 8 urls. If `parent_node` is not specified,
+  // the primary frame tree's root node will be chosen. This generates an URN
+  // associated with `origin` and 3 bits of shared storage budget.
+  GURL SelectFrom8URLsInContext(const url::Origin& origin,
+                                FrameTreeNode* parent_node = nullptr) {
+    if (!parent_node)
+      parent_node = PrimaryFrameTreeNodeRoot();
+
+    // If this is called inside a fenced frame, creating an iframe will need
+    // "Supports-Loading-Mode: fenced-frame" response header. Thus, we simply
+    // always set the path to `kFencedFramePath`.
+    GURL iframe_url = origin.GetURL().Resolve(kFencedFramePath);
+
+    FrameTreeNode* iframe = CreateIFrame(parent_node, iframe_url);
 
     EXPECT_TRUE(ExecJs(iframe, R"(
-        sharedStorage.worklet.addModule('shared_storage/simple_module.js');
+        sharedStorage.worklet.addModule('/shared_storage/simple_module.js');
       )"));
 
     std::string urn_uuid =
@@ -2045,35 +2051,6 @@
 }
 
 IN_PROC_BROWSER_TEST_P(SharedStorageFencedFrameInteractionBrowserTest,
-                       SelectURLNotAllowedInFencedFrame) {
-  GURL main_frame_url = https_server()->GetURL("a.test", kSimplePagePath);
-
-  EXPECT_TRUE(NavigateToURL(shell(), main_frame_url));
-
-  GURL fenced_frame_url =
-      https_server()->GetURL("a.test", "/fenced_frames/title1.html");
-
-  FrameTreeNode* fenced_frame_node = CreateFencedFrame(fenced_frame_url);
-
-  EXPECT_TRUE(ExecJs(fenced_frame_node, R"(
-      sharedStorage.worklet.addModule('/shared_storage/simple_module.js');
-    )"));
-
-  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
-  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
-
-  EvalJsResult result = EvalJs(fenced_frame_node, R"(
-      sharedStorage.selectURL(
-          'test-url-selection-operation',
-          [{url: "fenced_frames/title0.html"}], {data: {'mockResult': 0}});
-    )");
-
-  EXPECT_THAT(result.error,
-              testing::HasSubstr(
-                  "sharedStorage.selectURL() is not allowed in fenced frame"));
-}
-
-IN_PROC_BROWSER_TEST_P(SharedStorageFencedFrameInteractionBrowserTest,
                        SelectURL_FinishAfterStartingFencedFrameNavigation) {
   GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
   EXPECT_TRUE(NavigateToURL(shell(), main_url));
@@ -2691,6 +2668,81 @@
                                      1);
 }
 
+IN_PROC_BROWSER_TEST_P(
+    SharedStorageFencedFrameInteractionBrowserTest,
+    NestedFencedFrameNavigateTop_BudgetWithdrawalFromTwoMetadata) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  url::Origin shared_storage_origin1 =
+      url::Origin::Create(https_server()->GetURL("b.test", kSimplePagePath));
+
+  GURL urn_uuid1 = SelectFrom8URLsInContext(shared_storage_origin1);
+  FrameTreeNode* fenced_frame_root_node1 = CreateFencedFrame(urn_uuid1);
+
+  url::Origin shared_storage_origin2 =
+      url::Origin::Create(https_server()->GetURL("c.test", kSimplePagePath));
+
+  GURL urn_uuid2 =
+      SelectFrom8URLsInContext(shared_storage_origin2, fenced_frame_root_node1);
+
+  FrameTreeNode* fenced_frame_root_node2 =
+      CreateFencedFrame(fenced_frame_root_node1, urn_uuid2);
+
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin1), kBudgetAllowed);
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin2), kBudgetAllowed);
+
+  GURL new_page_url = https_server()->GetURL("d.test", kSimplePagePath);
+  TestNavigationObserver top_navigation_observer(shell()->web_contents());
+  EXPECT_TRUE(ExecJs(
+      fenced_frame_root_node2,
+      JsReplace("window.open($1, '_unfencedTop')", new_page_url.spec())));
+  top_navigation_observer.Wait();
+
+  // After the top navigation, log(8)=3 bits should have been withdrawn from
+  // both `shared_storage_origin1` and `shared_storage_origin2`.
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin1),
+                   kBudgetAllowed - 3);
+  EXPECT_DOUBLE_EQ(GetRemainingBudget(shared_storage_origin2),
+                   kBudgetAllowed - 3);
+}
+
+IN_PROC_BROWSER_TEST_P(SharedStorageFencedFrameInteractionBrowserTest,
+                       SelectURLNotAllowedInNestedFencedFrame) {
+  GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
+  EXPECT_TRUE(NavigateToURL(shell(), main_url));
+
+  url::Origin shared_storage_origin1 =
+      url::Origin::Create(https_server()->GetURL("b.test", kSimplePagePath));
+
+  GURL urn_uuid1 = SelectFrom8URLsInContext(shared_storage_origin1);
+  FrameTreeNode* fenced_frame_root_node1 = CreateFencedFrame(urn_uuid1);
+
+  url::Origin shared_storage_origin2 =
+      url::Origin::Create(https_server()->GetURL("c.test", kSimplePagePath));
+
+  GURL urn_uuid2 =
+      SelectFrom8URLsInContext(shared_storage_origin2, fenced_frame_root_node1);
+
+  FrameTreeNode* fenced_frame_root_node2 =
+      CreateFencedFrame(fenced_frame_root_node1, urn_uuid2);
+
+  EXPECT_TRUE(ExecJs(fenced_frame_root_node2, R"(
+      sharedStorage.worklet.addModule('/shared_storage/simple_module.js');
+    )"));
+
+  EvalJsResult result = EvalJs(fenced_frame_root_node2, R"(
+      sharedStorage.selectURL(
+          'test-url-selection-operation',
+          [{url: "/fenced_frames/title0.html"}], {data: {'mockResult': 0}});
+    )");
+
+  EXPECT_THAT(result.error,
+              testing::HasSubstr(
+                  "selectURL() is called in a context with a fenced frame "
+                  "depth (2) exceeding the maximum allowed number (1)."));
+}
+
 IN_PROC_BROWSER_TEST_P(SharedStorageFencedFrameInteractionBrowserTest,
                        IframeInFencedFrameNavigateTop_BudgetWithdrawal) {
   GURL main_url = https_server()->GetURL("a.test", kSimplePagePath);
@@ -2976,6 +3028,67 @@
         blink::features::FencedFramesImplementationType::kMPArch),
     &SharedStorageFencedFrameInteractionBrowserTest::DescribeParams);
 
+class SharedStorageSelectURLNotAllowedInFencedFrameBrowserTest
+    : public SharedStorageFencedFrameInteractionBrowserTest {
+ public:
+  SharedStorageSelectURLNotAllowedInFencedFrameBrowserTest() {
+    scoped_feature_list_
+        .InitWithFeaturesAndParameters(/*enabled_features=*/
+                                       {{blink::features::kSharedStorageAPI,
+                                         {{"SharedStorageBitBudget",
+                                           base::NumberToString(
+                                               kBudgetAllowed)},
+                                          {"SharedStorageMaxAllowedFencedFrameD"
+                                           "epthForSelectURL",
+                                           "0"}}},
+                                        {features::
+                                             kPrivacySandboxAdsAPIsOverride,
+                                         {}}},
+                                       /*disabled_features=*/{});
+  }
+
+ private:
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+IN_PROC_BROWSER_TEST_P(SharedStorageSelectURLNotAllowedInFencedFrameBrowserTest,
+                       SelectURLNotAllowedInFencedFrame) {
+  GURL main_frame_url = https_server()->GetURL("a.test", kSimplePagePath);
+
+  EXPECT_TRUE(NavigateToURL(shell(), main_frame_url));
+
+  GURL fenced_frame_url =
+      https_server()->GetURL("a.test", "/fenced_frames/title1.html");
+
+  FrameTreeNode* fenced_frame_node = CreateFencedFrame(fenced_frame_url);
+
+  EXPECT_TRUE(ExecJs(fenced_frame_node, R"(
+      sharedStorage.worklet.addModule('/shared_storage/simple_module.js');
+    )"));
+
+  EXPECT_EQ(1u, test_worklet_host_manager().GetAttachedWorkletHostsCount());
+  EXPECT_EQ(0u, test_worklet_host_manager().GetKeepAliveWorkletHostsCount());
+
+  EvalJsResult result = EvalJs(fenced_frame_node, R"(
+      sharedStorage.selectURL(
+          'test-url-selection-operation',
+          [{url: "fenced_frames/title0.html"}], {data: {'mockResult': 0}});
+    )");
+
+  EXPECT_THAT(result.error,
+              testing::HasSubstr(
+                  "selectURL() is called in a context with a fenced frame "
+                  "depth (1) exceeding the maximum allowed number (0)."));
+}
+
+INSTANTIATE_TEST_SUITE_P(
+    All,
+    SharedStorageSelectURLNotAllowedInFencedFrameBrowserTest,
+    ::testing::Values(
+        blink::features::FencedFramesImplementationType::kShadowDOM,
+        blink::features::FencedFramesImplementationType::kMPArch),
+    &SharedStorageSelectURLNotAllowedInFencedFrameBrowserTest::DescribeParams);
+
 class SharedStorageReportEventBrowserTest
     : public SharedStorageFencedFrameInteractionBrowserTest {
   void FinishSetup() override {
diff --git a/content/browser/shared_storage/shared_storage_budget_charger.cc b/content/browser/shared_storage/shared_storage_budget_charger.cc
index 01d8b69..56ae6cff 100644
--- a/content/browser/shared_storage/shared_storage_budget_charger.cc
+++ b/content/browser/shared_storage/shared_storage_budget_charger.cc
@@ -53,26 +53,25 @@
   if (!initiator_frame_host)
     return;
 
-  absl::optional<const FencedFrameURLMapping::SharedStorageBudgetMetadata*>
+  storage::SharedStorageManager* shared_storage_manager =
+      initiator_frame_host->GetStoragePartition()->GetSharedStorageManager();
+
+  std::vector<const FencedFrameURLMapping::SharedStorageBudgetMetadata*>
       shared_storage_budget_metadata = initiator_frame_host->frame_tree_node()
                                            ->FindSharedStorageBudgetMetadata();
 
-  // Skip if the initiator frame is not originated from shared storage.
-  if (!shared_storage_budget_metadata.has_value())
-    return;
+  for (const auto* metadata : shared_storage_budget_metadata) {
+    if (metadata->budget_to_charge == 0)
+      continue;
 
-  if ((*shared_storage_budget_metadata)->budget_to_charge > 0) {
-    storage::SharedStorageManager* shared_storage_manager =
-        initiator_frame_host->GetStoragePartition()->GetSharedStorageManager();
     shared_storage_manager->MakeBudgetWithdrawal(
-        (*shared_storage_budget_metadata)->origin,
-        (*shared_storage_budget_metadata)->budget_to_charge, base::DoNothing());
+        metadata->origin, metadata->budget_to_charge, base::DoNothing());
 
     // We only want to charge the budget the first time a navigation leaves the
     // fenced frame, across all fenced frames navigated to the same urn.
     // We can do this even though the pointer is const because
     // `budget_to_charge` is a mutable field of `SharedStorageBudgetMetadata`.
-    (*shared_storage_budget_metadata)->budget_to_charge = 0;
+    metadata->budget_to_charge = 0;
   }
 }
 
diff --git a/content/browser/shared_storage/shared_storage_document_service_impl.cc b/content/browser/shared_storage/shared_storage_document_service_impl.cc
index 3435653..0eb168a8 100644
--- a/content/browser/shared_storage/shared_storage_document_service_impl.cc
+++ b/content/browser/shared_storage/shared_storage_document_service_impl.cc
@@ -7,12 +7,15 @@
 #include "base/strings/strcat.h"
 #include "components/services/storage/shared_storage/shared_storage_database.h"
 #include "components/services/storage/shared_storage/shared_storage_manager.h"
+#include "content/browser/renderer_host/frame_tree_node.h"
+#include "content/browser/renderer_host/render_frame_host_impl.h"
 #include "content/browser/shared_storage/shared_storage_worklet_host.h"
 #include "content/browser/shared_storage/shared_storage_worklet_host_manager.h"
 #include "content/browser/storage_partition_impl.h"
 #include "content/public/browser/render_frame_host.h"
 #include "content/public/browser/render_process_host.h"
 #include "content/public/common/content_client.h"
+#include "third_party/blink/public/common/features.h"
 #include "third_party/blink/public/common/shared_storage/shared_storage_utils.h"
 #include "url/url_constants.h"
 
@@ -106,16 +109,6 @@
         urls_with_metadata,
     const std::vector<uint8_t>& serialized_data,
     RunURLSelectionOperationOnWorkletCallback callback) {
-  if (render_frame_host().IsNestedWithinFencedFrame()) {
-    // This could indicate a compromised renderer, so let's terminate it.
-    receiver_.ReportBadMessage(
-        "Attempted to execute RunURLSelectionOperationOnWorklet within a "
-        "fenced frame.");
-    LogSharedStorageWorkletError(
-        blink::SharedStorageWorkletErrorType::kSelectURLNonWebVisible);
-    return;
-  }
-
   if (!blink::IsValidSharedStorageURLsArrayLength(urls_with_metadata.size())) {
     // This could indicate a compromised renderer, so let's terminate it.
     receiver_.ReportBadMessage(
@@ -161,6 +154,27 @@
     return;
   }
 
+  int fenced_frame_depth = base::checked_cast<int>(
+      static_cast<RenderFrameHostImpl&>(render_frame_host())
+          .frame_tree_node()
+          ->GetFencedFrameDepth());
+  int max_allowed_fenced_frame_depth =
+      blink::features::kSharedStorageMaxAllowedFencedFrameDepthForSelectURL
+          .Get();
+
+  if (fenced_frame_depth > max_allowed_fenced_frame_depth) {
+    std::move(callback).Run(
+        /*success=*/false,
+        /*error_message=*/
+        base::StrCat(
+            {"selectURL() is called in a context with a fenced frame depth (",
+             base::NumberToString(fenced_frame_depth),
+             ") exceeding the maximum allowed number (",
+             base::NumberToString(max_allowed_fenced_frame_depth), ")."}),
+        GURL());
+    return;
+  }
+
   GetSharedStorageWorkletHost()->RunURLSelectionOperationOnWorklet(
       name, std::move(urls_with_metadata), serialized_data,
       std::move(callback));
diff --git a/content/public/browser/first_party_sets_handler.h b/content/public/browser/first_party_sets_handler.h
index 70b651198..4e83e14 100644
--- a/content/public/browser/first_party_sets_handler.h
+++ b/content/public/browser/first_party_sets_handler.h
@@ -17,7 +17,9 @@
 #include "third_party/abseil-cpp/absl/types/optional.h"
 
 namespace net {
+class FirstPartySetEntry;
 class GlobalFirstPartySets;
+class SchemefulSite;
 }
 
 namespace content {
@@ -137,11 +139,16 @@
   virtual void SetGlobalSetsForTesting(
       net::GlobalFirstPartySets global_sets) = 0;
 
-  // Returns all First-Party Sets that are scoped to the entire browser.
+  // Looks up `site` in the global First-Party Sets and `config` to find its
+  // associated FirstPartySetEntry.
   //
-  // If initialization is not yet complete, returns nullptr; otherwise, returns
-  // a pointer to the initialized GlobalFirstPartySets instance.
-  virtual const net::GlobalFirstPartySets* GetGlobalSetsIfReady() const = 0;
+  // This will return nullopt if:
+  // - First-Party Sets is disabled or
+  // - the list of First-Party Sets isn't initialized yet or
+  // - `site` isn't in the global First-Party Sets or `config`
+  virtual absl::optional<net::FirstPartySetEntry> FindEntry(
+      const net::SchemefulSite& site,
+      const net::FirstPartySetsContextConfig& config) const = 0;
 
   // Computes a representation of the changes that need to be made to the
   // browser's list of First-Party Sets to respect the `policy` value of the
diff --git a/content/public/browser/plugin_service.h b/content/public/browser/plugin_service.h
index 9c3d960..0cd7b92 100644
--- a/content/public/browser/plugin_service.h
+++ b/content/public/browser/plugin_service.h
@@ -30,12 +30,7 @@
 struct ContentPluginInfo;
 struct WebPluginInfo;
 
-// This must be created on the main thread but it's only called on the IO/file
-// thread unless otherwise noted. This is an asynchronous wrapper around the
-// PluginList interface for querying plugin information. This must be used
-// instead of that to avoid doing expensive disk operations on the IO/UI
-// threads.
-// TODO(http://crbug.com/990013): Only use this on the UI thread.
+// This class lives on the UI thread.
 class CONTENT_EXPORT PluginService {
  public:
   using GetPluginsCallback =
@@ -48,7 +43,6 @@
   // to throw away their cache of the plugin list, and optionally also reload
   // all the pages with plugins. If |browser_context| is nullptr, purges the
   // cache in all renderers.
-  // NOTE: can only be called on the UI thread.
   static void PurgePluginListCache(BrowserContext* browser_context,
                                    bool reload_pages);
 
@@ -58,8 +52,8 @@
   virtual void Init() = 0;
 
   // Gets the plugin in the list of plugins that matches the given url and mime
-  // type. Returns true if the data is frome a stale plugin list, false if it
-  // is up to date. This can be called from any thread.
+  // type. Returns true if the data is from a stale plugin list, false if it is
+  // up to date.
   virtual bool GetPluginInfoArray(
       const GURL& url,
       const std::string& mime_type,
@@ -69,8 +63,7 @@
 
   // Gets plugin info for an individual plugin and filters the plugins using
   // the |browser_context|. This will report whether the data is stale via
-  // |is_stale| and returns whether or not the plugin can be found. This must be
-  // called from the UI thread.
+  // |is_stale| and returns whether or not the plugin can be found.
   virtual bool GetPluginInfo(content::BrowserContext* browser_context,
                              const GURL& url,
                              const std::string& mime_type,
@@ -82,25 +75,21 @@
   // Get plugin info by plugin path (including disabled plugins). Returns true
   // if the plugin is found and WebPluginInfo has been filled in |info|. This
   // will use cached data in the plugin list.
-  // This can be called from any thread.
   virtual bool GetPluginInfoByPath(const base::FilePath& plugin_path,
                                    WebPluginInfo* info) = 0;
 
   // Returns the display name for the plugin identified by the given path. If
   // the path doesn't identify a plugin, or the plugin has no display name,
   // this will attempt to generate a display name from the path.
-  // This can be called from any thread.
   virtual std::u16string GetPluginDisplayNameByPath(
       const base::FilePath& plugin_path) = 0;
 
   // Asynchronously loads plugins if necessary and then calls back to the
   // provided function on the calling sequence on completion.
-  // This can be called from any thread.
   virtual void GetPlugins(GetPluginsCallback callback) = 0;
 
   // Synchronously loads plugins if necessary and returns the list of plugin
-  // infos. This can be called from any thread. This method is expected to
-  // not perform any disk IO.
+  // infos.
   virtual std::vector<WebPluginInfo> GetPluginsSynchronous() = 0;
 
   // Returns information about a plugin if it exists, otherwise `nullptr`. The
diff --git a/content/public/test/embedded_worker_instance_test_harness.cc b/content/public/test/embedded_worker_instance_test_harness.cc
new file mode 100644
index 0000000..c87af56
--- /dev/null
+++ b/content/public/test/embedded_worker_instance_test_harness.cc
@@ -0,0 +1,75 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/public/test/embedded_worker_instance_test_harness.h"
+
+#include <stdint.h>
+
+#include "base/run_loop.h"
+#include "content/browser/service_worker/embedded_worker_instance.h"
+#include "content/browser/service_worker/embedded_worker_test_helper.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "test_browser_context.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+namespace content {
+
+EmbeddedWorkerInstanceTestHarness::~EmbeddedWorkerInstanceTestHarness() =
+    default;
+
+void EmbeddedWorkerInstanceTestHarness::SetUp() {
+  helper_ = std::make_unique<EmbeddedWorkerTestHelper>(base::FilePath(),
+                                                       CreateBrowserContext());
+}
+
+void EmbeddedWorkerInstanceTestHarness::TearDown() {
+  helper_.reset();
+}
+
+std::unique_ptr<BrowserContext>
+EmbeddedWorkerInstanceTestHarness::CreateBrowserContext() {
+  return std::make_unique<TestBrowserContext>();
+}
+
+void EmbeddedWorkerInstanceTestHarness::CreateAndStartWorker(
+    const GURL& origin,
+    const GURL& worker_url) {
+  EXPECT_EQ(worker_, nullptr);
+  EmbeddedWorkerTestHelper::RegistrationAndVersionPair pair =
+      helper_->PrepareRegistrationAndVersion(origin, worker_url);
+  worker_ = std::make_unique<EmbeddedWorkerInstance>(pair.second.get());
+  helper_->StartWorker(worker_.get(), helper_->CreateStartParams(pair.second));
+}
+
+void EmbeddedWorkerInstanceTestHarness::StopAndResetWorker() {
+  EmbeddedWorkerInstance* worker = worker_.get();
+  EXPECT_NE(worker_, nullptr);
+  // Stop the worker.
+  worker->Stop();
+  EXPECT_EQ(EmbeddedWorkerStatus::STOPPING, worker->status());
+  base::RunLoop().RunUntilIdle();
+
+  // The 'WorkerStopped' message should have been sent by
+  // EmbeddedWorkerTestHelper.
+  EXPECT_EQ(EmbeddedWorkerStatus::STOPPED, worker->status());
+  worker_.reset();
+}
+
+#if !BUILDFLAG(IS_ANDROID)
+void EmbeddedWorkerInstanceTestHarness::BindHidServiceToWorker(
+    const GURL& origin,
+    mojo::PendingReceiver<blink::mojom::HidService> receiver) {
+  EXPECT_NE(worker_, nullptr);
+  worker_.get()->BindHidService(url::Origin::Create(origin),
+                                std::move(receiver));
+}
+#endif  // !BUILDFLAG(IS_ANDROID)
+
+EmbeddedWorkerInstanceTestHarness::EmbeddedWorkerInstanceTestHarness(
+    std::unique_ptr<BrowserTaskEnvironment> task_environment)
+    : task_environment_(std::move(task_environment)) {}
+
+}  // namespace content
diff --git a/content/public/test/embedded_worker_instance_test_harness.h b/content/public/test/embedded_worker_instance_test_harness.h
new file mode 100644
index 0000000..60118bb
--- /dev/null
+++ b/content/public/test/embedded_worker_instance_test_harness.h
@@ -0,0 +1,94 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CONTENT_PUBLIC_TEST_EMBEDDED_WORKER_INSTANCE_TEST_HARNESS_H_
+#define CONTENT_PUBLIC_TEST_EMBEDDED_WORKER_INSTANCE_TEST_HARNESS_H_
+
+#include <stdint.h>
+
+#include "browser_task_environment.h"
+#include "content/public/browser/browser_context.h"
+#include "mojo/public/cpp/bindings/pending_receiver.h"
+#include "mojo/public/cpp/bindings/pending_remote.h"
+#include "testing/gmock/include/gmock/gmock.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/blink/public/mojom/hid/hid.mojom.h"
+
+namespace content {
+
+class EmbeddedWorkerInstance;
+class EmbeddedWorkerTestHelper;
+
+// EmbeddedWorkerInstanceTestHarness provides helper functions to set up a test
+// environment with an EmbeddedWorkerInstance, and allow a test to test the
+// worker with bound services.
+//
+// Example:
+//
+//  class MyWorkerTest : public EmbeddedWorkerInstanceTestHarness {
+//    std::unique_ptr<BrowserContext> CreateBrowserContext() override {
+//      // Create the BrowserContext and store the raw pointer
+//      // to the created BrowserContext.
+//      ...
+//    }
+//  };
+//
+//  CreateAndStartWorker(); //  Create and start a worker!
+//
+//  mojo::Remote<Xyz> xyz_service;
+//  // Note a new binding function might need to be added to this harness file
+//  // if that is not available.
+//  BindXyzServiceToWorker(origin, xyz_service.BindNewPipeAndPassReceiver()));
+//  xyz_service->DoSomething();
+//
+//  StopAndResetWorker();  // Stop and delete the worker!
+
+class EmbeddedWorkerInstanceTestHarness : public testing::Test {
+ public:
+  // Constructs a EmbeddedWorkerInstanceTestHarness which uses |traits| to
+  // initialize its BrowserTaskEnvironment.
+  template <typename... TaskEnvironmentTraits>
+  explicit EmbeddedWorkerInstanceTestHarness(TaskEnvironmentTraits&&... traits)
+      : EmbeddedWorkerInstanceTestHarness(
+            std::make_unique<BrowserTaskEnvironment>(
+                std::forward<TaskEnvironmentTraits>(traits)...)) {}
+
+  EmbeddedWorkerInstanceTestHarness(const EmbeddedWorkerInstanceTestHarness&) =
+      delete;
+  EmbeddedWorkerInstanceTestHarness& operator=(
+      const EmbeddedWorkerInstanceTestHarness&) = delete;
+
+  ~EmbeddedWorkerInstanceTestHarness() override;
+
+  void SetUp() override;
+
+  void TearDown() override;
+
+  virtual std::unique_ptr<BrowserContext> CreateBrowserContext();
+
+  void CreateAndStartWorker(const GURL& origin, const GURL& worker_url);
+
+  void StopAndResetWorker();
+
+#if !BUILDFLAG(IS_ANDROID)
+  void BindHidServiceToWorker(
+      const GURL& origin,
+      mojo::PendingReceiver<blink::mojom::HidService> receiver);
+#endif
+
+ protected:
+  // The template constructor has to be in the header but it delegates to this
+  // constructor to initialize all other members out-of-line.
+  explicit EmbeddedWorkerInstanceTestHarness(
+      std::unique_ptr<BrowserTaskEnvironment> task_environment);
+  std::unique_ptr<EmbeddedWorkerTestHelper> helper_;
+
+ private:
+  std::unique_ptr<BrowserTaskEnvironment> task_environment_;
+  std::unique_ptr<EmbeddedWorkerInstance> worker_;
+};
+
+}  // namespace content
+
+#endif  // CONTENT_PUBLIC_TEST_EMBEDDED_WORKER_INSTANCE_TEST_HARNESS_H_
diff --git a/content/public/test/test_browser_context.cc b/content/public/test/test_browser_context.cc
index 439a7d9..559e0b86 100644
--- a/content/public/test/test_browser_context.cc
+++ b/content/public/test/test_browser_context.cc
@@ -177,4 +177,10 @@
   return origin_trials_controller_delegate_.get();
 }
 
+// static
+TestBrowserContext* TestBrowserContext::FromBrowserContext(
+    BrowserContext* browser_context) {
+  return static_cast<TestBrowserContext*>(browser_context);
+}
+
 }  // namespace content
diff --git a/content/public/test/test_browser_context.h b/content/public/test/test_browser_context.h
index ceb9b0a..caf37b7 100644
--- a/content/public/test/test_browser_context.h
+++ b/content/public/test/test_browser_context.h
@@ -30,6 +30,10 @@
 
   ~TestBrowserContext() override;
 
+  // Returns the TestBrowserContext corresponding to the given browser context.
+  static TestBrowserContext* FromBrowserContext(
+      BrowserContext* browser_context);
+
   // Takes ownership of the temporary directory so that it's not deleted when
   // this object is destructed.
   base::FilePath TakePath();
diff --git a/content/renderer/media/renderer_webmediaplayer_delegate.cc b/content/renderer/media/renderer_webmediaplayer_delegate.cc
index c4a4c8e..6e1d4b4 100644
--- a/content/renderer/media/renderer_webmediaplayer_delegate.cc
+++ b/content/renderer/media/renderer_webmediaplayer_delegate.cc
@@ -65,7 +65,9 @@
     return true;
 
   return render_frame()->GetWebView()->GetVisibilityState() !=
-         blink::mojom::PageVisibilityState::kVisible;
+             blink::mojom::PageVisibilityState::kVisible &&
+         render_frame()->GetWebView()->GetVisibilityState() !=
+             blink::mojom::PageVisibilityState::kHiddenButPainting;
 }
 
 int RendererWebMediaPlayerDelegate::AddObserver(Observer* observer) {
@@ -183,7 +185,17 @@
 
 void RendererWebMediaPlayerDelegate::OnPageVisibilityChanged(
     blink::mojom::PageVisibilityState visibility_state) {
-  if (visibility_state == blink::mojom::PageVisibilityState::kVisible) {
+  // Treat 'hidden but painting' as 'visible', since whatever is consuming the
+  // painted output (e.g., Picture in Picture), probably wants the video.
+  // Otherwise, the player might optimize the video away.
+  const bool is_shown =
+      visibility_state == blink::mojom::PageVisibilityState::kVisible ||
+      visibility_state == blink::mojom::PageVisibilityState::kHiddenButPainting;
+  if (is_shown_ == is_shown)
+    return;
+  is_shown_ = is_shown;
+
+  if (is_shown) {
     RecordAction(base::UserMetricsAction("Media.Shown"));
 
     for (base::IDMap<Observer*>::iterator it(&id_map_); !it.IsAtEnd();
diff --git a/content/renderer/media/renderer_webmediaplayer_delegate.h b/content/renderer/media/renderer_webmediaplayer_delegate.h
index c649ec2..b5f79f3b 100644
--- a/content/renderer/media/renderer_webmediaplayer_delegate.h
+++ b/content/renderer/media/renderer_webmediaplayer_delegate.h
@@ -148,6 +148,10 @@
   // Determined at construction time based on system information; determines
   // when the idle cleanup timer should be fired more aggressively.
   bool is_low_end_;
+
+  // Last page shown/hidden state sent to the player.  Unset if we have not sent
+  // any message.  Used to elide duplicates.
+  absl::optional<bool> is_shown_;
 };
 
 }  // namespace media
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn
index 1ef6121..f94e47a 100644
--- a/content/test/BUILD.gn
+++ b/content/test/BUILD.gn
@@ -191,6 +191,8 @@
     "../public/test/content_test_suite_base.h",
     "../public/test/download_test_observer.cc",
     "../public/test/download_test_observer.h",
+    "../public/test/embedded_worker_instance_test_harness.cc",
+    "../public/test/embedded_worker_instance_test_harness.h",
     "../public/test/fake_download_item.cc",
     "../public/test/fake_download_item.h",
     "../public/test/fake_frame_widget.cc",
diff --git a/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt
index 5f8cfd0..83f7191 100644
--- a/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt
+++ b/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt
@@ -90,10 +90,7 @@
 
 crbug.com/1338968 [ android android-nexus-5x ] WebCodecs_TexImage2d_hw_decoder [ Failure ]
 
-# Conservatively expect all macs to fail, I'm not sure if our try bots run arm64
-# devices. A later commit needs to put mac-x86_64 here, or better still fix the
-# bug and remove this expectation.
-crbug.com/1371749 [ mac ] WebCodecs_EncodeDecode_offscreen_avc1.42001E_prefer-hardware [ Failure ]
+crbug.com/1371749 [ mac-x86_64 ] WebCodecs_EncodeDecode_offscreen_avc1.42001E_prefer-hardware [ Failure ]
 #######################################################################
 # Automated Entries After This Point - Do Not Manually Add Below Here #
 #######################################################################
diff --git a/device/fido/mac/fake_keychain.mm b/device/fido/mac/fake_keychain.mm
index abb125f5..1fc4bbeb 100644
--- a/device/fido/mac/fake_keychain.mm
+++ b/device/fido/mac/fake_keychain.mm
@@ -7,6 +7,10 @@
 #import <Foundation/Foundation.h>
 #import <Security/Security.h>
 
+#if defined(LEAK_SANITIZER)
+#include <sanitizer/lsan_interface.h>
+#endif
+
 #include "base/check_op.h"
 #include "base/mac/foundation_util.h"
 #include "base/mac/scoped_cftyperef.h"
@@ -23,7 +27,13 @@
           CFStringCreateWithCString(kCFAllocatorDefault,
                                     keychain_access_group.data(),
                                     kCFStringEncodingUTF8)) {}
-FakeKeychain::~FakeKeychain() = default;
+FakeKeychain::~FakeKeychain() {
+  // Avoid shutdown leak of error string in Security.framework.
+  // See https://github.com/apple-oss-distributions/Security/blob/Security-60158.140.3/OSX/libsecurity_keychain/lib/SecBase.cpp#L88
+#if defined(LEAK_SANITIZER)
+  __lsan_do_leak_check();
+#endif
+}
 
 base::ScopedCFTypeRef<SecKeyRef> FakeKeychain::KeyCreateRandomKey(
     CFDictionaryRef params,
diff --git a/gpu/command_buffer/service/dawn_service_memory_transfer_service.cc b/gpu/command_buffer/service/dawn_service_memory_transfer_service.cc
index e05a148..4f12f4d 100644
--- a/gpu/command_buffer/service/dawn_service_memory_transfer_service.cc
+++ b/gpu/command_buffer/service/dawn_service_memory_transfer_service.cc
@@ -30,8 +30,13 @@
                            size_t offset,
                            size_t size,
                            void* serializePointer) override {
-    DCHECK_LE(offset, size_);
-    DCHECK_LE(size, size_ - offset);
+    // TODO(crbug.com/1373314): A compromised renderer could have a shared
+    // memory size not large enough to fit the GPU buffer contents. Instead of
+    // DCHECK, do a CHECK here to crash the release build. The crash is fine
+    // since it is not reachable from normal behavior. WebGPU post-V1 will have
+    // a refactored API.
+    CHECK_LE(offset, size_);
+    CHECK_LE(size, size_ - offset);
     // Copy the data into the shared memory allocation.
     // In the case of buffer mapping, this is the mapped GPU memory which we
     // copy into client-visible shared memory.
@@ -94,7 +99,10 @@
     size_t deserialize_size,
     ReadHandle** read_handle) {
   DCHECK(deserialize_pointer);
-  DCHECK_EQ(deserialize_size, sizeof(MemoryTransferHandle));
+  // Use CHECK instead of DCHECK because the cast of the memory to
+  // MemoryTransferHandle and subsequent reads won't be safe if deserialize_size
+  // is too small.
+  CHECK_EQ(deserialize_size, sizeof(MemoryTransferHandle));
   const volatile MemoryTransferHandle* handle =
       reinterpret_cast<const volatile MemoryTransferHandle*>(
           deserialize_pointer);
@@ -119,7 +127,10 @@
     size_t deserialize_size,
     WriteHandle** write_handle) {
   DCHECK(deserialize_pointer);
-  DCHECK_EQ(deserialize_size, sizeof(MemoryTransferHandle));
+  // Use CHECK instead of DCHECK because the cast of the memory to
+  // MemoryTransferHandle and subsequent reads won't be safe if deserialize_size
+  // is too small.
+  CHECK_EQ(deserialize_size, sizeof(MemoryTransferHandle));
   const volatile MemoryTransferHandle* handle =
       reinterpret_cast<const volatile MemoryTransferHandle*>(
           deserialize_pointer);
diff --git a/gpu/command_buffer/service/shared_image/compound_image_backing.cc b/gpu/command_buffer/service/shared_image/compound_image_backing.cc
index ddf6c281..7beeb6c 100644
--- a/gpu/command_buffer/service/shared_image/compound_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/compound_image_backing.cc
@@ -93,15 +93,17 @@
 
   void EndAccess() final { wrapped_->EndAccess(); }
 
-  gpu::TextureBase* GetTextureBase() final {
-    return wrapped_->GetTextureBase();
+  gpu::TextureBase* GetTextureBase(int plane_index) final {
+    return wrapped_->GetTextureBase(plane_index);
   }
 
   bool SupportsMultipleConcurrentReadAccess() final {
     return wrapped_->SupportsMultipleConcurrentReadAccess();
   }
 
-  gles2::Texture* GetTexture() final { return wrapped_->GetTexture(); }
+  gles2::Texture* GetTexture(int plane_index) final {
+    return wrapped_->GetTexture(plane_index);
+  }
 
  private:
   std::unique_ptr<GLTextureImageRepresentation> wrapped_;
@@ -134,17 +136,17 @@
   }
   void EndAccess() final { wrapped_->EndAccess(); }
 
-  gpu::TextureBase* GetTextureBase() final {
-    return wrapped_->GetTextureBase();
+  gpu::TextureBase* GetTextureBase(int plane_index) final {
+    return wrapped_->GetTextureBase(plane_index);
   }
 
   bool SupportsMultipleConcurrentReadAccess() final {
     return wrapped_->SupportsMultipleConcurrentReadAccess();
   }
 
-  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough()
-      final {
-    return wrapped_->GetTexturePassthrough();
+  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough(
+      int plane_index) final {
+    return wrapped_->GetTexturePassthrough(plane_index);
   }
 
  private:
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_backing_factory_unittest.cc b/gpu/command_buffer/service/shared_image/d3d_image_backing_factory_unittest.cc
index e502cade..f6f2673 100644
--- a/gpu/command_buffer/service/shared_image/d3d_image_backing_factory_unittest.cc
+++ b/gpu/command_buffer/service/shared_image/d3d_image_backing_factory_unittest.cc
@@ -1566,12 +1566,12 @@
 
     api->glActiveTextureFn(GL_TEXTURE0);
     api->glBindTextureFn(GL_TEXTURE_EXTERNAL_OES,
-                         y_texture->GetTextureBase()->service_id());
+                         y_texture->GetTexturePassthrough()->service_id());
     ASSERT_EQ(api->glGetErrorFn(), static_cast<GLenum>(GL_NO_ERROR));
 
     api->glActiveTextureFn(GL_TEXTURE1);
     api->glBindTextureFn(GL_TEXTURE_EXTERNAL_OES,
-                         uv_texture->GetTextureBase()->service_id());
+                         uv_texture->GetTexturePassthrough()->service_id());
     ASSERT_EQ(api->glGetErrorFn(), static_cast<GLenum>(GL_NO_ERROR));
 
     api->glUseProgramFn(program);
@@ -1770,7 +1770,7 @@
       SharedImageRepresentation::AllowUnclearedAccess::kNo);
   ASSERT_NE(y_access, nullptr);
 
-  GLuint y_texture_id = y_texture->GetTextureBase()->service_id();
+  GLuint y_texture_id = y_texture->GetTexturePassthrough()->service_id();
   api->glBindTextureFn(GL_TEXTURE_2D, y_texture_id);
   api->glFramebufferTexture2DEXTFn(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                                    GL_TEXTURE_2D, y_texture_id, 0);
@@ -1805,7 +1805,7 @@
       SharedImageRepresentation::AllowUnclearedAccess::kNo);
   ASSERT_NE(uv_access, nullptr);
 
-  GLuint uv_texture_id = uv_texture->GetTextureBase()->service_id();
+  GLuint uv_texture_id = uv_texture->GetTexturePassthrough()->service_id();
   api->glBindTextureFn(GL_TEXTURE_2D, uv_texture_id);
   api->glFramebufferTexture2DEXTFn(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
                                    GL_TEXTURE_2D, uv_texture_id, 0);
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_representation.cc b/gpu/command_buffer/service/shared_image/d3d_image_representation.cc
index 399cf66..238b653 100644
--- a/gpu/command_buffer/service/shared_image/d3d_image_representation.cc
+++ b/gpu/command_buffer/service/shared_image/d3d_image_representation.cc
@@ -22,7 +22,9 @@
       texture_(std::move(texture)) {}
 
 const scoped_refptr<gles2::TexturePassthrough>&
-GLTexturePassthroughD3DImageRepresentation::GetTexturePassthrough() {
+GLTexturePassthroughD3DImageRepresentation::GetTexturePassthrough(
+    int plane_index) {
+  DCHECK_EQ(plane_index, 0);
   return texture_;
 }
 
@@ -31,7 +33,8 @@
 
 bool GLTexturePassthroughD3DImageRepresentation::BeginAccess(GLenum mode) {
   // Bind the GLImage if necessary.
-  auto texture = GetTexturePassthrough();
+  auto texture =
+      GLTexturePassthroughImageRepresentation::GetTexturePassthrough();
   if (texture->is_bind_pending()) {
     GLenum target = texture->target();
     gl::GLImage* image = texture->GetLevelImage(target, 0);
diff --git a/gpu/command_buffer/service/shared_image/d3d_image_representation.h b/gpu/command_buffer/service/shared_image/d3d_image_representation.h
index 41330cd..f0704ede 100644
--- a/gpu/command_buffer/service/shared_image/d3d_image_representation.h
+++ b/gpu/command_buffer/service/shared_image/d3d_image_representation.h
@@ -34,8 +34,8 @@
       scoped_refptr<gles2::TexturePassthrough> texture);
   ~GLTexturePassthroughD3DImageRepresentation() override;
 
-  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough()
-      override;
+  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough(
+      int plane_index) override;
 
  private:
   bool BeginAccess(GLenum mode) override;
diff --git a/gpu/command_buffer/service/shared_image/egl_image_backing.cc b/gpu/command_buffer/service/shared_image/egl_image_backing.cc
index 5366b82..8f3ace21 100644
--- a/gpu/command_buffer/service/shared_image/egl_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/egl_image_backing.cc
@@ -130,7 +130,8 @@
 
   void EndAccess() override { shared_.EndAccess(); }
 
-  gles2::Texture* GetTexture() override {
+  gles2::Texture* GetTexture(int plane_index) override {
+    DCHECK_EQ(plane_index, 0);
     return shared_.texture_holder()->texture();
   }
 
@@ -162,8 +163,9 @@
 
   void EndAccess() override { shared_.EndAccess(); }
 
-  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough()
-      override {
+  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough(
+      int plane_index) override {
+    DCHECK_EQ(plane_index, 0);
     // TODO(https://crbug.com/1172769): Remove this CHECK.
     CHECK(shared_.texture_holder()->texture_passthrough());
     return shared_.texture_holder()->texture_passthrough();
diff --git a/gpu/command_buffer/service/shared_image/external_vk_image_gl_representation.cc b/gpu/command_buffer/service/shared_image/external_vk_image_gl_representation.cc
index b8b6f99..ec9fe8b 100644
--- a/gpu/command_buffer/service/shared_image/external_vk_image_gl_representation.cc
+++ b/gpu/command_buffer/service/shared_image/external_vk_image_gl_representation.cc
@@ -166,7 +166,8 @@
 
 ExternalVkImageGLRepresentation::~ExternalVkImageGLRepresentation() {}
 
-gles2::Texture* ExternalVkImageGLRepresentation::GetTexture() {
+gles2::Texture* ExternalVkImageGLRepresentation::GetTexture(int plane_index) {
+  DCHECK_EQ(plane_index, 0);
   return texture_;
 }
 
@@ -191,7 +192,9 @@
     ~ExternalVkImageGLPassthroughRepresentation() {}
 
 const scoped_refptr<gles2::TexturePassthrough>&
-ExternalVkImageGLPassthroughRepresentation::GetTexturePassthrough() {
+ExternalVkImageGLPassthroughRepresentation::GetTexturePassthrough(
+    int plane_index) {
+  DCHECK_EQ(plane_index, 0);
   return representation_shared_.backing_impl()->GetTexturePassthrough();
 }
 
diff --git a/gpu/command_buffer/service/shared_image/external_vk_image_gl_representation.h b/gpu/command_buffer/service/shared_image/external_vk_image_gl_representation.h
index 4df28a77..4a79767 100644
--- a/gpu/command_buffer/service/shared_image/external_vk_image_gl_representation.h
+++ b/gpu/command_buffer/service/shared_image/external_vk_image_gl_representation.h
@@ -66,7 +66,7 @@
   ~ExternalVkImageGLRepresentation() override;
 
   // GLTextureImageRepresentation implementation.
-  gles2::Texture* GetTexture() override;
+  gles2::Texture* GetTexture(int plane_index) override;
   bool BeginAccess(GLenum mode) override;
   void EndAccess() override;
 
@@ -91,8 +91,8 @@
   ~ExternalVkImageGLPassthroughRepresentation() override;
 
   // GLTexturePassthroughImageRepresentation implementation.
-  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough()
-      override;
+  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough(
+      int plane_index) override;
   bool BeginAccess(GLenum mode) override;
   void EndAccess() override;
 
diff --git a/gpu/command_buffer/service/shared_image/gl_image_backing.cc b/gpu/command_buffer/service/shared_image/gl_image_backing.cc
index 57f3f9c..21c18fa 100644
--- a/gpu/command_buffer/service/shared_image/gl_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/gl_image_backing.cc
@@ -57,7 +57,8 @@
     client_->GLTextureImageRepresentationRelease(has_context());
 }
 
-gles2::Texture* GLTextureGLCommonRepresentation::GetTexture() {
+gles2::Texture* GLTextureGLCommonRepresentation::GetTexture(int plane_index) {
+  DCHECK_EQ(plane_index, 0);
   return texture_;
 }
 
@@ -104,7 +105,9 @@
 }
 
 const scoped_refptr<gles2::TexturePassthrough>&
-GLTexturePassthroughGLCommonRepresentation::GetTexturePassthrough() {
+GLTexturePassthroughGLCommonRepresentation::GetTexturePassthrough(
+    int plane_index) {
+  DCHECK_EQ(plane_index, 0);
   return texture_passthrough_;
 }
 
diff --git a/gpu/command_buffer/service/shared_image/gl_image_backing.h b/gpu/command_buffer/service/shared_image/gl_image_backing.h
index 9fb665a8..51766b7 100644
--- a/gpu/command_buffer/service/shared_image/gl_image_backing.h
+++ b/gpu/command_buffer/service/shared_image/gl_image_backing.h
@@ -37,7 +37,7 @@
 
  private:
   // GLTextureImageRepresentation:
-  gles2::Texture* GetTexture() override;
+  gles2::Texture* GetTexture(int plane_index) override;
   bool BeginAccess(GLenum mode) override;
   void EndAccess() override;
 
@@ -65,8 +65,8 @@
 
  private:
   // GLTexturePassthroughImageRepresentation:
-  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough()
-      override;
+  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough(
+      int plane_index) override;
   bool BeginAccess(GLenum mode) override;
   void EndAccess() override;
 
diff --git a/gpu/command_buffer/service/shared_image/gl_ozone_image_representation.cc b/gpu/command_buffer/service/shared_image/gl_ozone_image_representation.cc
index 12d949c..51cfecf 100644
--- a/gpu/command_buffer/service/shared_image/gl_ozone_image_representation.cc
+++ b/gpu/command_buffer/service/shared_image/gl_ozone_image_representation.cc
@@ -193,7 +193,8 @@
     texture_holder_->MarkContextLost();
 }
 
-gles2::Texture* GLTextureOzoneImageRepresentation::GetTexture() {
+gles2::Texture* GLTextureOzoneImageRepresentation::GetTexture(int plane_index) {
+  DCHECK_EQ(plane_index, 0);
   return texture_holder_->texture();
 }
 
@@ -276,7 +277,9 @@
 }
 
 const scoped_refptr<gles2::TexturePassthrough>&
-GLTexturePassthroughOzoneImageRepresentation::GetTexturePassthrough() {
+GLTexturePassthroughOzoneImageRepresentation::GetTexturePassthrough(
+    int plane_index) {
+  DCHECK_EQ(plane_index, 0);
   return texture_holder_->texture_passthrough();
 }
 
diff --git a/gpu/command_buffer/service/shared_image/gl_ozone_image_representation.h b/gpu/command_buffer/service/shared_image/gl_ozone_image_representation.h
index 36b9c41..a93ecb8 100644
--- a/gpu/command_buffer/service/shared_image/gl_ozone_image_representation.h
+++ b/gpu/command_buffer/service/shared_image/gl_ozone_image_representation.h
@@ -81,7 +81,7 @@
   ~GLTextureOzoneImageRepresentation() override;
 
   // GLTextureImageRepresentation implementation.
-  gles2::Texture* GetTexture() override;
+  gles2::Texture* GetTexture(int plane_index) override;
   bool BeginAccess(GLenum mode) override;
   void EndAccess() override;
 
@@ -120,8 +120,8 @@
   ~GLTexturePassthroughOzoneImageRepresentation() override;
 
   // GLTexturePassthroughImageRepresentation implementation.
-  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough()
-      override;
+  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough(
+      int plane_index) override;
   bool BeginAccess(GLenum mode) override;
   void EndAccess() override;
 
diff --git a/gpu/command_buffer/service/shared_image/gl_texture_android_image_representation.cc b/gpu/command_buffer/service/shared_image/gl_texture_android_image_representation.cc
index 92554e7..a93be5504 100644
--- a/gpu/command_buffer/service/shared_image/gl_texture_android_image_representation.cc
+++ b/gpu/command_buffer/service/shared_image/gl_texture_android_image_representation.cc
@@ -24,7 +24,9 @@
     texture_->RemoveLightweightRef(has_context());
 }
 
-gles2::Texture* GLTextureAndroidImageRepresentation::GetTexture() {
+gles2::Texture* GLTextureAndroidImageRepresentation::GetTexture(
+    int plane_index) {
+  DCHECK_EQ(plane_index, 0);
   return texture_;
 }
 
diff --git a/gpu/command_buffer/service/shared_image/gl_texture_android_image_representation.h b/gpu/command_buffer/service/shared_image/gl_texture_android_image_representation.h
index 76fada95..3b1aeac 100644
--- a/gpu/command_buffer/service/shared_image/gl_texture_android_image_representation.h
+++ b/gpu/command_buffer/service/shared_image/gl_texture_android_image_representation.h
@@ -28,7 +28,7 @@
   GLTextureAndroidImageRepresentation& operator=(
       const GLTextureAndroidImageRepresentation&) = delete;
 
-  gles2::Texture* GetTexture() override;
+  gles2::Texture* GetTexture(int plane_index) override;
 
   bool BeginAccess(GLenum mode) override;
   void EndAccess() override;
diff --git a/gpu/command_buffer/service/shared_image/gl_texture_passthrough_android_image_representation.cc b/gpu/command_buffer/service/shared_image/gl_texture_passthrough_android_image_representation.cc
index a4971d6..838e301 100644
--- a/gpu/command_buffer/service/shared_image/gl_texture_passthrough_android_image_representation.cc
+++ b/gpu/command_buffer/service/shared_image/gl_texture_passthrough_android_image_representation.cc
@@ -29,7 +29,9 @@
 }
 
 const scoped_refptr<gles2::TexturePassthrough>&
-GLTexturePassthroughAndroidImageRepresentation::GetTexturePassthrough() {
+GLTexturePassthroughAndroidImageRepresentation::GetTexturePassthrough(
+    int plane_index) {
+  DCHECK_EQ(plane_index, 0);
   return texture_;
 }
 
diff --git a/gpu/command_buffer/service/shared_image/gl_texture_passthrough_android_image_representation.h b/gpu/command_buffer/service/shared_image/gl_texture_passthrough_android_image_representation.h
index 2ef895d..2f168f85 100644
--- a/gpu/command_buffer/service/shared_image/gl_texture_passthrough_android_image_representation.h
+++ b/gpu/command_buffer/service/shared_image/gl_texture_passthrough_android_image_representation.h
@@ -26,8 +26,8 @@
   GLTexturePassthroughAndroidImageRepresentation& operator=(
       const GLTexturePassthroughAndroidImageRepresentation&) = delete;
 
-  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough()
-      override;
+  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough(
+      int plane_index) override;
 
   bool BeginAccess(GLenum mode) override;
   void EndAccess() override;
diff --git a/gpu/command_buffer/service/shared_image/shared_image_representation.cc b/gpu/command_buffer/service/shared_image/shared_image_representation.cc
index d881870..11f2b07c 100644
--- a/gpu/command_buffer/service/shared_image/shared_image_representation.cc
+++ b/gpu/command_buffer/service/shared_image/shared_image_representation.cc
@@ -66,6 +66,11 @@
       base::PassKey<GLTextureImageRepresentationBase>(), this);
 }
 
+gpu::TextureBase* GLTextureImageRepresentationBase::GetTextureBase() {
+  DCHECK(format().is_single_plane());
+  return GetTextureBase(0);
+}
+
 bool GLTextureImageRepresentationBase::BeginAccess(GLenum mode) {
   return true;
 }
@@ -74,8 +79,14 @@
   return false;
 }
 
-gpu::TextureBase* GLTextureImageRepresentation::GetTextureBase() {
-  return GetTexture();
+gpu::TextureBase* GLTextureImageRepresentation::GetTextureBase(
+    int plane_index) {
+  return GetTexture(plane_index);
+}
+
+gles2::Texture* GLTextureImageRepresentation::GetTexture() {
+  DCHECK(format().is_single_plane());
+  return GetTexture(0);
 }
 
 void GLTextureImageRepresentation::UpdateClearedStateOnEndAccess() {
@@ -96,8 +107,15 @@
     texture->SetLevelClearedRect(texture->target(), 0, cleared_rect);
 }
 
-gpu::TextureBase* GLTexturePassthroughImageRepresentation::GetTextureBase() {
-  return GetTexturePassthrough().get();
+gpu::TextureBase* GLTexturePassthroughImageRepresentation::GetTextureBase(
+    int plane_index) {
+  return GetTexturePassthrough(plane_index).get();
+}
+
+const scoped_refptr<gles2::TexturePassthrough>&
+GLTexturePassthroughImageRepresentation::GetTexturePassthrough() {
+  DCHECK(format().is_single_plane());
+  return GetTexturePassthrough(0);
 }
 
 bool SkiaImageRepresentation::SupportsMultipleConcurrentReadAccess() {
diff --git a/gpu/command_buffer/service/shared_image/shared_image_representation.h b/gpu/command_buffer/service/shared_image/shared_image_representation.h
index bdc5ae6..73a86e7 100644
--- a/gpu/command_buffer/service/shared_image/shared_image_representation.h
+++ b/gpu/command_buffer/service/shared_image/shared_image_representation.h
@@ -192,7 +192,11 @@
       GLenum mode,
       AllowUnclearedAccess allow_uncleared);
 
-  virtual gpu::TextureBase* GetTextureBase() = 0;
+  // Gets the texture associated with the `plane_index` for SharedImageFormat.
+  virtual gpu::TextureBase* GetTextureBase(int plane_index) = 0;
+  // Calls GetTextureBase with `plane_index` = 0 for single planar formats eg.
+  // RGB.
+  gpu::TextureBase* GetTextureBase();
 
  protected:
   friend class SkiaGLImageRepresentation;
@@ -221,9 +225,12 @@
       : GLTextureImageRepresentationBase(manager, backing, tracker) {}
 
   // TODO(ericrk): Move this to the ScopedAccess object. crbug.com/1003686
-  virtual gles2::Texture* GetTexture() = 0;
+  // Gets the texture associated with the `plane_index` for SharedImageFormat.
+  virtual gles2::Texture* GetTexture(int plane_index) = 0;
+  // Calls GetTexture with `plane_index` = 0 for single planar formats eg. RGB.
+  gles2::Texture* GetTexture();
 
-  gpu::TextureBase* GetTextureBase() override;
+  gpu::TextureBase* GetTextureBase(int plane_index) override;
 
  protected:
   friend class WrappedGLTextureCompoundImageRepresentation;
@@ -241,10 +248,15 @@
       : GLTextureImageRepresentationBase(manager, backing, tracker) {}
 
   // TODO(ericrk): Move this to the ScopedAccess object. crbug.com/1003686
-  virtual const scoped_refptr<gles2::TexturePassthrough>&
-  GetTexturePassthrough() = 0;
+  // Gets the passthrough texture associated with the `plane_index` for
+  // SharedImageFormat.
+  virtual const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough(
+      int plane_index) = 0;
+  // Calls GetTexturePassthrough with `plane_index` = 0 for single planar
+  // formats eg. RGB.
+  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough();
 
-  gpu::TextureBase* GetTextureBase() override;
+  gpu::TextureBase* GetTextureBase(int plane_index) override;
 
  private:
   friend class WrappedGLTexturePassthroughCompoundImageRepresentation;
diff --git a/gpu/command_buffer/service/shared_image/test_image_backing.cc b/gpu/command_buffer/service/shared_image/test_image_backing.cc
index a4694b9..04d0266 100644
--- a/gpu/command_buffer/service/shared_image/test_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/test_image_backing.cc
@@ -24,7 +24,10 @@
       : GLTextureImageRepresentation(manager, backing, tracker),
         texture_(texture) {}
 
-  gles2::Texture* GetTexture() override { return texture_; }
+  gles2::Texture* GetTexture(int plane_index) override {
+    DCHECK_EQ(plane_index, 0);
+    return texture_;
+  }
   bool BeginAccess(GLenum mode) override {
     return static_cast<TestImageBacking*>(backing())->can_access();
   }
@@ -44,8 +47,9 @@
       : GLTexturePassthroughImageRepresentation(manager, backing, tracker),
         texture_(std::move(texture)) {}
 
-  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough()
-      override {
+  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough(
+      int plane_index) override {
+    DCHECK_EQ(plane_index, 0);
     return texture_;
   }
   bool BeginAccess(GLenum mode) override {
diff --git a/gpu/command_buffer/service/shared_image/video_image_reader_image_backing.cc b/gpu/command_buffer/service/shared_image/video_image_reader_image_backing.cc
index e3e002e..9423cceb 100644
--- a/gpu/command_buffer/service/shared_image/video_image_reader_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/video_image_reader_image_backing.cc
@@ -187,7 +187,9 @@
   GLTextureVideoImageRepresentation& operator=(
       const GLTextureVideoImageRepresentation&) = delete;
 
-  gles2::Texture* GetTexture() override {
+  gles2::Texture* GetTexture(int plane_index) override {
+    DCHECK_EQ(plane_index, 0);
+
     auto* texture = gles2::Texture::CheckedCast(texture_->GetTextureBase());
     DCHECK(texture);
 
@@ -254,8 +256,9 @@
   GLTexturePassthroughVideoImageRepresentation& operator=(
       const GLTexturePassthroughVideoImageRepresentation&) = delete;
 
-  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough()
-      override {
+  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough(
+      int plane_index) override {
+    DCHECK_EQ(plane_index, 0);
     return passthrough_texture_;
   }
 
diff --git a/gpu/command_buffer/service/shared_image/video_surface_texture_image_backing.cc b/gpu/command_buffer/service/shared_image/video_surface_texture_image_backing.cc
index 4388607..9725195 100644
--- a/gpu/command_buffer/service/shared_image/video_surface_texture_image_backing.cc
+++ b/gpu/command_buffer/service/shared_image/video_surface_texture_image_backing.cc
@@ -117,7 +117,9 @@
   GLTextureVideoImageRepresentation& operator=(
       const GLTextureVideoImageRepresentation&) = delete;
 
-  gles2::Texture* GetTexture() override {
+  gles2::Texture* GetTexture(int plane_index) override {
+    DCHECK_EQ(plane_index, 0);
+
     auto* texture = gles2::Texture::CheckedCast(texture_->GetTextureBase());
     DCHECK(texture);
 
@@ -134,8 +136,8 @@
 
     // If we passed a GLImage to BindStreamTextureImage(), mark it as bound.
     if (!base::FeatureList::IsEnabled(kPassNullForGLImageWhenBindingTexture)) {
-      GetTexture()->SetLevelImageState(GetTexture()->target(), 0,
-                                       gles2::Texture::BOUND);
+      gles2::Texture* texture = GLTextureImageRepresentation::GetTexture();
+      texture->SetLevelImageState(texture->target(), 0, gles2::Texture::BOUND);
     }
 
     return true;
@@ -143,8 +145,9 @@
 
   void EndAccess() override {
     if (!base::FeatureList::IsEnabled(kPassNullForGLImageWhenBindingTexture)) {
-      GetTexture()->SetLevelImageState(GetTexture()->target(), 0,
-                                       gles2::Texture::UNBOUND);
+      gles2::Texture* texture = GLTextureImageRepresentation::GetTexture();
+      texture->SetLevelImageState(texture->target(), 0,
+                                  gles2::Texture::UNBOUND);
     }
   }
 
@@ -176,8 +179,9 @@
   GLTexturePassthroughVideoImageRepresentation& operator=(
       const GLTexturePassthroughVideoImageRepresentation&) = delete;
 
-  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough()
-      override {
+  const scoped_refptr<gles2::TexturePassthrough>& GetTexturePassthrough(
+      int plane_index) override {
+    DCHECK_EQ(plane_index, 0);
     return passthrough_texture_;
   }
 
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.cc b/gpu/command_buffer/service/webgpu_decoder_impl.cc
index 7de01a3..e7794567 100644
--- a/gpu/command_buffer/service/webgpu_decoder_impl.cc
+++ b/gpu/command_buffer/service/webgpu_decoder_impl.cc
@@ -87,34 +87,6 @@
   }
 }
 
-// Helper class to make a scoped variable that creates an error scope to ignore
-// validation errors on a device.
-class IgnoreValidationErrorsScope {
- public:
-  explicit IgnoreValidationErrorsScope(const DawnProcTable& procs,
-                                       WGPUDevice device)
-      : procs_(procs), device_(device) {
-    procs_.devicePushErrorScope(device_, WGPUErrorFilter_Validation);
-    procs_.deviceReference(device_);
-  }
-  ~IgnoreValidationErrorsScope() {
-    procs_.devicePopErrorScope(
-        device_, [](WGPUErrorType, const char*, void*) {}, nullptr);
-    procs_.deviceRelease(device_);
-  }
-
-  IgnoreValidationErrorsScope(const IgnoreValidationErrorsScope&) = delete;
-  IgnoreValidationErrorsScope(IgnoreValidationErrorsScope&&) = delete;
-  IgnoreValidationErrorsScope& operator=(const IgnoreValidationErrorsScope&) =
-      delete;
-  IgnoreValidationErrorsScope& operator=(IgnoreValidationErrorsScope&&) =
-      delete;
-
- private:
-  const DawnProcTable& procs_;
-  WGPUDevice device_;
-};
-
 }  // namespace
 
 class WebGPUDecoderImpl final : public WebGPUDecoder {
@@ -542,8 +514,6 @@
     }
 
     ~SharedImageRepresentationAndAccessSkiaFallback() override {
-      auto ignore_validation_errors =
-          IgnoreValidationErrorsScope(procs_, device_);
       // If we have write access, flush any writes by uploading
       // into the SkSurface.
       if ((usage_ & kAllowedWritableMailboxTextureUsages) != 0) {
@@ -1953,11 +1923,10 @@
     // The compositor renders uninitialized textures as red. If the texture is
     // not initialized, we need to explicitly clear its contents to black.
     // This may not successfully initialize the texture if the texture or device
-    // was explicitly destroyed. TODO(crbug.com/1359106): Some other workaround
-    // will be needed to make the texture black in the destroyed case.
+    // was explicitly destroyed, however the client ensures Dissociate is sent
+    // before destroy.
     // TODO(crbug.com/1242712): Use the C++ WebGPU API.
     const auto& procs = dawn::native::GetProcs();
-    auto ignore_validation_errors = IgnoreValidationErrorsScope(procs, device);
     WGPUTextureView view = procs.textureCreateView(texture, nullptr);
 
     WGPURenderPassColorAttachment color_attachment = {};
diff --git a/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc b/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc
index 2296d45c8..b667058 100644
--- a/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc
+++ b/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc
@@ -447,229 +447,6 @@
       ->RunsTasksInCurrentSequence();
 }
 
-// Test that Associate and Dissociate mailbox may be used after the device is
-// destroyed. The test should not crash or produce unexpected validation errors.
-TEST_P(WebGPUMailboxTest, AssociateDissociateMailboxAfterDeviceDestroy) {
-  if (!GPUTestBotConfig::CurrentConfigMatches("Mac") &&
-      !GPUTestBotConfig::CurrentConfigMatches("Win10")) {
-    GTEST_SKIP() << "Test skipped due to crbug.com/1359106.";
-  }
-
-  SharedImageInterface* sii = GetSharedImageInterface();
-  Mailbox mailbox = sii->CreateSharedImage(
-      GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(),
-      kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU,
-      kNullSurfaceHandle);
-  SyncToken mailbox_produced_token = sii->GenVerifiedSyncToken();
-  webgpu()->WaitSyncTokenCHROMIUM(mailbox_produced_token.GetConstData());
-
-  webgpu::ReservedTexture reservation = webgpu()->ReserveTexture(device_.Get());
-
-  device_.Destroy();
-
-  EXPECT_WEBGPU_ERROR(
-      device_, WGPUErrorType_Validation,
-      webgpu()->AssociateMailbox(
-          reservation.deviceId, reservation.deviceGeneration, reservation.id,
-          reservation.generation, WGPUTextureUsage_RenderAttachment,
-          webgpu::WEBGPU_MAILBOX_NONE,
-          reinterpret_cast<const GLbyte*>(&mailbox)));
-
-  wgpu::Texture texture = wgpu::Texture::Acquire(reservation.texture);
-  EXPECT_WEBGPU_ERROR(device_, WGPUErrorType_Validation, texture.CreateView());
-  webgpu()->DissociateMailbox(reservation.id, reservation.generation);
-  webgpu()->FlushCommands();
-}
-
-// Test that Associate mailbox and DissociateForPresent may be used after the
-// device is destroyed. The test should not crash or produce unexpected
-// validation errors.
-TEST_P(WebGPUMailboxTest,
-       AssociateDissociateMailboxForPresentAfterDeviceDestroy) {
-  if (!GPUTestBotConfig::CurrentConfigMatches("Mac") &&
-      !GPUTestBotConfig::CurrentConfigMatches("Win10")) {
-    GTEST_SKIP() << "Test skipped due to crbug.com/1359106.";
-  }
-
-  SharedImageInterface* sii = GetSharedImageInterface();
-  Mailbox mailbox = sii->CreateSharedImage(
-      GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(),
-      kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU,
-      kNullSurfaceHandle);
-  SyncToken mailbox_produced_token = sii->GenVerifiedSyncToken();
-  webgpu()->WaitSyncTokenCHROMIUM(mailbox_produced_token.GetConstData());
-
-  webgpu::ReservedTexture reservation = webgpu()->ReserveTexture(device_.Get());
-
-  device_.Destroy();
-
-  EXPECT_WEBGPU_ERROR(
-      device_, WGPUErrorType_Validation,
-      webgpu()->AssociateMailbox(
-          reservation.deviceId, reservation.deviceGeneration, reservation.id,
-          reservation.generation, WGPUTextureUsage_RenderAttachment,
-          webgpu::WEBGPU_MAILBOX_NONE,
-          reinterpret_cast<const GLbyte*>(&mailbox)));
-  wgpu::Texture texture = wgpu::Texture::Acquire(reservation.texture);
-  EXPECT_WEBGPU_ERROR(device_, WGPUErrorType_Validation, texture.CreateView());
-  webgpu()->DissociateMailboxForPresent(reservation.deviceId,
-                                        reservation.deviceGeneration,
-                                        reservation.id, reservation.generation);
-  webgpu()->FlushCommands();
-}
-
-// Test that ReserveTexture may be used after the device is destroyed.
-// The test should not crash or produce unexpected validation errors.
-TEST_P(WebGPUMailboxTest, ReserveTextureAfterDeviceDestroy) {
-  if (!GPUTestBotConfig::CurrentConfigMatches("Mac") &&
-      !GPUTestBotConfig::CurrentConfigMatches("Win10")) {
-    GTEST_SKIP() << "Test skipped due to crbug.com/1359106.";
-  }
-
-  SharedImageInterface* sii = GetSharedImageInterface();
-  Mailbox mailbox = sii->CreateSharedImage(
-      GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(),
-      kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU,
-      kNullSurfaceHandle);
-  SyncToken mailbox_produced_token = sii->GenVerifiedSyncToken();
-  webgpu()->WaitSyncTokenCHROMIUM(mailbox_produced_token.GetConstData());
-
-  device_.Destroy();
-
-  webgpu::ReservedTexture reservation = webgpu()->ReserveTexture(device_.Get());
-
-  EXPECT_WEBGPU_ERROR(
-      device_, WGPUErrorType_Validation,
-      webgpu()->AssociateMailbox(
-          reservation.deviceId, reservation.deviceGeneration, reservation.id,
-          reservation.generation, WGPUTextureUsage_RenderAttachment,
-          webgpu::WEBGPU_MAILBOX_NONE,
-          reinterpret_cast<const GLbyte*>(&mailbox)));
-  wgpu::Texture texture = wgpu::Texture::Acquire(reservation.texture);
-  EXPECT_WEBGPU_ERROR(device_, WGPUErrorType_Validation, texture.CreateView());
-  webgpu()->DissociateMailbox(reservation.id, reservation.generation);
-  webgpu()->FlushCommands();
-}
-
-// Test that DissociateMailbox may be used after the device is destroyed.
-// The test should not crash or produce unexpected validation errors.
-TEST_P(WebGPUMailboxTest, DissociateMailboxAfterDeviceDestroy) {
-  if (!GPUTestBotConfig::CurrentConfigMatches("Mac") &&
-      !GPUTestBotConfig::CurrentConfigMatches("Win10")) {
-    GTEST_SKIP() << "Test skipped due to crbug.com/1359106.";
-  }
-
-  SharedImageInterface* sii = GetSharedImageInterface();
-  Mailbox mailbox = sii->CreateSharedImage(
-      GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(),
-      kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU,
-      kNullSurfaceHandle);
-  SyncToken mailbox_produced_token = sii->GenVerifiedSyncToken();
-  webgpu()->WaitSyncTokenCHROMIUM(mailbox_produced_token.GetConstData());
-
-  webgpu::ReservedTexture reservation = webgpu()->ReserveTexture(device_.Get());
-
-  webgpu()->AssociateMailbox(
-      reservation.deviceId, reservation.deviceGeneration, reservation.id,
-      reservation.generation, WGPUTextureUsage_RenderAttachment,
-      webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<const GLbyte*>(&mailbox));
-
-  wgpu::Texture texture = wgpu::Texture::Acquire(reservation.texture);
-  device_.Destroy();
-  webgpu()->DissociateMailbox(reservation.id, reservation.generation);
-  webgpu()->FlushCommands();
-}
-
-// Test that DissociateMailboxForPresentAfterDeviceDestroy may be used after the
-// device is destroyed. The test should not crash or produce unexpected
-// validation errors.
-TEST_P(WebGPUMailboxTest, DissociateMailboxForPresentAfterDeviceDestroy) {
-  if (!GPUTestBotConfig::CurrentConfigMatches("Mac") &&
-      !GPUTestBotConfig::CurrentConfigMatches("Win10")) {
-    GTEST_SKIP() << "Test skipped due to crbug.com/1359106.";
-  }
-
-  SharedImageInterface* sii = GetSharedImageInterface();
-  Mailbox mailbox = sii->CreateSharedImage(
-      GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(),
-      kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU,
-      kNullSurfaceHandle);
-  SyncToken mailbox_produced_token = sii->GenVerifiedSyncToken();
-  webgpu()->WaitSyncTokenCHROMIUM(mailbox_produced_token.GetConstData());
-
-  webgpu::ReservedTexture reservation = webgpu()->ReserveTexture(device_.Get());
-
-  webgpu()->AssociateMailbox(
-      reservation.deviceId, reservation.deviceGeneration, reservation.id,
-      reservation.generation, WGPUTextureUsage_RenderAttachment,
-      webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<const GLbyte*>(&mailbox));
-
-  wgpu::Texture texture = wgpu::Texture::Acquire(reservation.texture);
-  UninitializeTexture(device_, texture);
-  device_.Destroy();
-  webgpu()->DissociateMailboxForPresent(reservation.deviceId,
-                                        reservation.deviceGeneration,
-                                        reservation.id, reservation.generation);
-}
-
-// Test that DissociateMailbox may be used after the texture is destroyed.
-// The test should not crash or produce unexpected validation errors.
-TEST_P(WebGPUMailboxTest, DissociateMailboxAfterTextureDestroy) {
-  if (!GPUTestBotConfig::CurrentConfigMatches("Mac") &&
-      !GPUTestBotConfig::CurrentConfigMatches("Win10")) {
-    GTEST_SKIP() << "Test skipped due to crbug.com/1359106.";
-  }
-
-  SharedImageInterface* sii = GetSharedImageInterface();
-  Mailbox mailbox = sii->CreateSharedImage(
-      GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(),
-      kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU,
-      kNullSurfaceHandle);
-  SyncToken mailbox_produced_token = sii->GenVerifiedSyncToken();
-  webgpu()->WaitSyncTokenCHROMIUM(mailbox_produced_token.GetConstData());
-
-  webgpu::ReservedTexture reservation = webgpu()->ReserveTexture(device_.Get());
-
-  webgpu()->AssociateMailbox(
-      reservation.deviceId, reservation.deviceGeneration, reservation.id,
-      reservation.generation, WGPUTextureUsage_RenderAttachment,
-      webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<const GLbyte*>(&mailbox));
-
-  wgpu::Texture texture = wgpu::Texture::Acquire(reservation.texture);
-  texture.Destroy();
-  webgpu()->DissociateMailbox(reservation.id, reservation.generation);
-  webgpu()->FlushCommands();
-}
-
-// Test that DissociateMailboxForPresent may be used after the texture is
-// destroyed. The test should not crash or produce unexpected validation errors.
-TEST_P(WebGPUMailboxTest, DissociateMailboxForPresentAfterTextureDestroy) {
-  if (!GPUTestBotConfig::CurrentConfigMatches("Mac") &&
-      !GPUTestBotConfig::CurrentConfigMatches("Win10")) {
-    GTEST_SKIP() << "Test skipped due to crbug.com/1359106.";
-  }
-
-  SharedImageInterface* sii = GetSharedImageInterface();
-  Mailbox mailbox = sii->CreateSharedImage(
-      GetParam().format, {1, 1}, gfx::ColorSpace::CreateSRGB(),
-      kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, SHARED_IMAGE_USAGE_WEBGPU,
-      kNullSurfaceHandle);
-
-  webgpu::ReservedTexture reservation = webgpu()->ReserveTexture(device_.Get());
-
-  webgpu()->AssociateMailbox(
-      reservation.deviceId, reservation.deviceGeneration, reservation.id,
-      reservation.generation, WGPUTextureUsage_RenderAttachment,
-      webgpu::WEBGPU_MAILBOX_NONE, reinterpret_cast<const GLbyte*>(&mailbox));
-
-  wgpu::Texture texture = wgpu::Texture::Acquire(reservation.texture);
-  UninitializeTexture(device_, texture);
-  texture.Destroy();
-  webgpu()->DissociateMailboxForPresent(reservation.deviceId,
-                                        reservation.deviceGeneration,
-                                        reservation.id, reservation.generation);
-}
-
 // Tests using Associate/DissociateMailbox to share an image with Dawn.
 // For simplicity of the test the image is shared between a Dawn device and
 // itself: we render to it using the Dawn device, then re-associate it to a
diff --git a/gpu/config/gpu_test_config.cc b/gpu/config/gpu_test_config.cc
index 95aaf795..0b936b4 100644
--- a/gpu/config/gpu_test_config.cc
+++ b/gpu/config/gpu_test_config.cc
@@ -85,6 +85,8 @@
       return GPUTestConfig::kOsMacBigSur;
     case 12:
       return GPUTestConfig::kOsMacMonterey;
+    case 13:
+      return GPUTestConfig::kOsMacVentura;
   }
   return GPUTestConfig::kOsUnknown;
 #elif BUILDFLAG(IS_ANDROID)
@@ -230,6 +232,7 @@
     case kOsMacCatalina:
     case kOsMacBigSur:
     case kOsMacMonterey:
+    case kOsMacVentura:
     case kOsLinux:
     case kOsChromeOS:
     case kOsAndroid:
diff --git a/gpu/config/gpu_test_config.h b/gpu/config/gpu_test_config.h
index 4032ade3..d48eeb0 100644
--- a/gpu/config/gpu_test_config.h
+++ b/gpu/config/gpu_test_config.h
@@ -41,10 +41,11 @@
     kOsMacCatalina = 1 << 20,
     kOsMacBigSur = 1 << 21,
     kOsMacMonterey = 1 << 22,
+    kOsMacVentura = 1 << 23,
     kOsMac = kOsMacLeopard | kOsMacSnowLeopard | kOsMacLion |
              kOsMacMountainLion | kOsMacMavericks | kOsMacYosemite |
              kOsMacElCapitan | kOsMacSierra | kOsMacHighSierra | kOsMacMojave |
-             kOsMacCatalina | kOsMacBigSur | kOsMacMonterey,
+             kOsMacCatalina | kOsMacBigSur | kOsMacMonterey | kOsMacVentura,
     // Jump over a few bits for future OSX versions.
     kOsLinux = 1 << 25,
     kOsChromeOS = 1 << 26,
diff --git a/gpu/config/gpu_test_expectations_parser.cc b/gpu/config/gpu_test_expectations_parser.cc
index 93d901b5f..cac6b50 100644
--- a/gpu/config/gpu_test_expectations_parser.cc
+++ b/gpu/config/gpu_test_expectations_parser.cc
@@ -49,6 +49,7 @@
   kConfigMacCatalina,
   kConfigMacBigSur,
   kConfigMacMonterey,
+  kConfigMacVentura,
   kConfigMac,
   kConfigLinux,
   kConfigChromeOS,
@@ -112,6 +113,7 @@
     {"catalina", GPUTestConfig::kOsMacCatalina},
     {"bigsur", GPUTestConfig::kOsMacBigSur},
     {"monterey", GPUTestConfig::kOsMacMonterey},
+    {"ventura", GPUTestConfig::kOsMacVentura},
     {"mac", GPUTestConfig::kOsMac},
     {"linux", GPUTestConfig::kOsLinux},
     {"chromeos", GPUTestConfig::kOsChromeOS},
@@ -283,6 +285,7 @@
       case kConfigMacCatalina:
       case kConfigMacBigSur:
       case kConfigMacMonterey:
+      case kConfigMacVentura:
       case kConfigMac:
       case kConfigLinux:
       case kConfigChromeOS:
@@ -350,6 +353,7 @@
       case kConfigMacCatalina:
       case kConfigMacBigSur:
       case kConfigMacMonterey:
+      case kConfigMacVentura:
       case kConfigMac:
       case kConfigLinux:
       case kConfigChromeOS:
@@ -480,6 +484,7 @@
     case kConfigMacCatalina:
     case kConfigMacBigSur:
     case kConfigMacMonterey:
+    case kConfigMacVentura:
     case kConfigMac:
     case kConfigLinux:
     case kConfigChromeOS:
diff --git a/gpu/config/gpu_test_expectations_parser_unittest.cc b/gpu/config/gpu_test_expectations_parser_unittest.cc
index 1f669867..8645b64 100644
--- a/gpu/config/gpu_test_expectations_parser_unittest.cc
+++ b/gpu/config/gpu_test_expectations_parser_unittest.cc
@@ -41,6 +41,7 @@
     {{"CATALINA", GPUTestConfig::kOsMacCatalina}, kOsFamilyMac},
     {{"BIGSUR", GPUTestConfig::kOsMacBigSur}, kOsFamilyMac},
     {{"MONTEREY", GPUTestConfig::kOsMacMonterey}, kOsFamilyMac},
+    {{"VENTURA", GPUTestConfig::kOsMacVentura}, kOsFamilyMac},
     {{"LINUX", GPUTestConfig::kOsLinux}, {"LINUX", GPUTestConfig::kOsLinux}},
     {{"CHROMEOS", GPUTestConfig::kOsChromeOS},
      {"CHROMEOS", GPUTestConfig::kOsChromeOS}},
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index 5aaf0dc..398f697 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -44313,6 +44313,10 @@
         value: 10
       }
       experiments {
+        key: "luci.buildbucket.omit_python2"
+        value: 100
+      }
+      experiments {
         key: "luci.recipes.use_python3"
         value: 100
       }
@@ -78755,6 +78759,10 @@
         value: 100
       }
       experiments {
+        key: "chromium_rts.inverted_rts_bail_early"
+        value: 100
+      }
+      experiments {
         key: "chromium_swarming.expose_merge_script_failures"
         value: 20
       }
diff --git a/infra/config/subprojects/chromium/ci/metadata.exporter.star b/infra/config/subprojects/chromium/ci/metadata.exporter.star
index 943caad..d22e1b5 100644
--- a/infra/config/subprojects/chromium/ci/metadata.exporter.star
+++ b/infra/config/subprojects/chromium/ci/metadata.exporter.star
@@ -12,9 +12,6 @@
     execution_timeout = ci.DEFAULT_EXECUTION_TIMEOUT,
     os = os.LINUX_DEFAULT,
     pool = ci.DEFAULT_POOL,
-
-    # TODO(crbug.com/1362440): remove this.
-    omit_python2 = False,
 )
 
 consoles.console_view(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
index 30d8cd7c..7455608 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
@@ -710,6 +710,7 @@
     experiments = {
         "remove_src_checkout_experiment": 100,
         "chromium_rts.inverted_rts": 100,
+        "chromium_rts.inverted_rts_bail_early": 100,
     },
     use_orchestrator_pool = True,
 )
diff --git a/ios/chrome/app/BUILD.gn b/ios/chrome/app/BUILD.gn
index 0d7423e3..1419816 100644
--- a/ios/chrome/app/BUILD.gn
+++ b/ios/chrome/app/BUILD.gn
@@ -91,7 +91,9 @@
     "//ios/chrome/browser/browser_state:test_support",
     "//ios/chrome/browser/metrics:metrics",
     "//ios/chrome/browser/prefs:browser_prefs",
+    "//ios/chrome/browser/promos_manager:constants",
     "//ios/chrome/browser/promos_manager:promos_manager",
+    "//ios/chrome/browser/promos_manager:test_support",
     "//ios/chrome/browser/signin",
     "//ios/chrome/browser/signin:signin_util",
     "//ios/chrome/browser/signin:test_support",
@@ -109,6 +111,7 @@
     "//ios/testing:block_swizzler",
     "//ios/third_party/material_components_ios",
     "//ios/web/public/test:test",
+    "//testing/gmock",
     "//testing/gtest",
     "//third_party/ocmock",
     "//url",
@@ -316,6 +319,8 @@
     "//base",
     "//ios/chrome/app/application_delegate:app_state_header",
     "//ios/chrome/app/application_delegate:application_delegate_internal",
+    "//ios/chrome/browser/application_context:application_context",
+    "//ios/chrome/browser/promos_manager:constants",
     "//ios/chrome/browser/promos_manager:promos_manager",
     "//ios/chrome/browser/signin",
     "//ios/chrome/browser/signin:signin_util",
@@ -542,6 +547,7 @@
     "//ios/chrome/app/startup:startup_basic",
     "//ios/chrome/browser/crash_report",
     "//ios/chrome/common",
+    "//ios/public/provider/chrome/browser/primes:primes_api",
   ]
   if (ios_enable_sandbox_dump) {
     deps += [ "//ios/chrome/app/startup:sandbox_dump" ]
diff --git a/ios/chrome/app/chrome_exe_main.mm b/ios/chrome/app/chrome_exe_main.mm
index ac5994e..53197f17 100644
--- a/ios/chrome/app/chrome_exe_main.mm
+++ b/ios/chrome/app/chrome_exe_main.mm
@@ -10,6 +10,7 @@
 #import "ios/chrome/app/startup/ios_chrome_main.h"
 #import "ios/chrome/app/startup/ios_enable_sandbox_dump_buildflags.h"
 #import "ios/chrome/browser/crash_report/crash_helper.h"
+#import "ios/public/provider/chrome/browser/primes/primes_api.h"
 
 #if BUILDFLAG(IOS_ENABLE_SANDBOX_DUMP)
 #import "ios/chrome/app/startup/sandbox_dump.h"  // nogncheck
@@ -87,6 +88,11 @@
   // Create this here since it's needed to start the crash handler.
   base::AtExitManager at_exit;
 
+  // Start Primes logging if it's supported.
+  if (ios::provider::IsPrimesSupported()) {
+    ios::provider::PrimesStartLogging();
+  }
+
   // The Crash Controller is started here even if the user opted out since we
   // don't have yet preferences. Later on it is stopped if the user opted out.
   // In any case reports are not sent if the user opted out.
diff --git a/ios/chrome/app/post_restore_app_agent.mm b/ios/chrome/app/post_restore_app_agent.mm
index 27ce9e2a..6ce4a511 100644
--- a/ios/chrome/app/post_restore_app_agent.mm
+++ b/ios/chrome/app/post_restore_app_agent.mm
@@ -5,6 +5,8 @@
 #import "ios/chrome/app/post_restore_app_agent.h"
 
 #import "ios/chrome/app/application_delegate/app_state.h"
+#import "ios/chrome/browser/application_context/application_context.h"
+#import "ios/chrome/browser/promos_manager/constants.h"
 #import "ios/chrome/browser/promos_manager/promos_manager.h"
 #import "ios/chrome/browser/signin/authentication_service.h"
 #import "ios/chrome/browser/signin/signin_util.h"
diff --git a/ios/chrome/app/post_restore_app_agent_unittest.mm b/ios/chrome/app/post_restore_app_agent_unittest.mm
index 51db9b9..2fe3c955 100644
--- a/ios/chrome/app/post_restore_app_agent_unittest.mm
+++ b/ios/chrome/app/post_restore_app_agent_unittest.mm
@@ -5,6 +5,7 @@
 #import "ios/chrome/app/post_restore_app_agent.h"
 
 #import "base/test/scoped_feature_list.h"
+#import "base/values.h"
 #import "components/prefs/pref_registry_simple.h"
 #import "components/prefs/testing_pref_service.h"
 #import "ios/chrome/app/application_delegate/app_state.h"
@@ -12,6 +13,8 @@
 #import "ios/chrome/browser/application_context/application_context.h"
 #import "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
 #import "ios/chrome/browser/prefs/pref_names.h"
+#import "ios/chrome/browser/promos_manager/constants.h"
+#import "ios/chrome/browser/promos_manager/mock_promos_manager.h"
 #import "ios/chrome/browser/promos_manager/promos_manager.h"
 #import "ios/chrome/browser/signin/authentication_service.h"
 #import "ios/chrome/browser/signin/authentication_service_factory.h"
@@ -20,6 +23,7 @@
 #import "ios/chrome/browser/ui/post_restore_signin/features.h"
 #import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h"
 #import "ios/web/public/test/web_task_environment.h"
+#import "testing/gmock/include/gmock/gmock.h"
 #import "testing/platform_test.h"
 #import "third_party/abseil-cpp/absl/types/optional.h"
 #import "third_party/ocmock/OCMock/OCMock.h"
@@ -29,6 +33,9 @@
 #error "This file requires ARC support."
 #endif
 
+using ::testing::_;
+using ::testing::AnyNumber;
+
 namespace {
 const char kFakePreRestoreAccountEmail[] = "person@example.org";
 }  // namespace
@@ -42,7 +49,7 @@
   web::WebTaskEnvironment task_environment_;
   std::unique_ptr<TestChromeBrowserState> browser_state_;
   PostRestoreAppAgent* appAgent_;
-  std::unique_ptr<PromosManager> promos_manager_;
+  std::unique_ptr<MockPromosManager> promos_manager_;
   AuthenticationService* auth_service_;
   base::test::ScopedFeatureList scoped_feature_list_;
   id mockAppState_;
@@ -56,9 +63,9 @@
     [appAgent_ setAppState:mockAppState_];
   }
 
-  PromosManager* CreatePromosManager() {
-    promos_manager_ = std::make_unique<PromosManager>(local_state_.Get());
-    promos_manager_->Init();
+  MockPromosManager* CreatePromosManager() {
+    promos_manager_ = std::make_unique<MockPromosManager>();
+
     return promos_manager_.get();
   }
 
@@ -74,19 +81,6 @@
     return auth_service_;
   }
 
-  int CountSingleDisplayActivePromos() {
-    return local_state_.Get()
-        ->GetList(prefs::kIosPromosManagerSingleDisplayActivePromos)
-        .size();
-  }
-
-  void ExpectRegisteredPromo(promos_manager::Promo promo) {
-    const base::Value::List& promos = local_state_.Get()->GetList(
-        prefs::kIosPromosManagerSingleDisplayActivePromos);
-    EXPECT_EQ(promos.size(), unsigned(1));
-    EXPECT_EQ(promos[0], promos_manager::NameForPromo(promo));
-  }
-
   void MockAppStateChange(InitStage initStage) {
     OCMStub([mockAppState_ initStage]).andReturn(initStage);
     [appAgent_ appState:mockAppState_
@@ -115,36 +109,43 @@
 };
 
 TEST_F(PostRestoreAppAgentTest, maybeRegisterPromo) {
-  // Ensure that no promos are registered initially.
-  EXPECT_EQ(CountSingleDisplayActivePromos(), 0);
+  EXPECT_CALL(*promos_manager_.get(), RegisterPromoForSingleDisplay(_))
+      .Times(0);
+  EXPECT_CALL(*promos_manager_.get(), RegisterPromoForContinuousDisplay(_))
+      .Times(0);
 
   // Scenarios which should not register a promo.
   ClearPreRestoreIdentity(local_state_.Get());
   MockAppStateChange(InitStageFinal);
-  EXPECT_EQ(CountSingleDisplayActivePromos(), 0);
 
   SetFakePreRestoreAccountInfo();
   MockAppStateChange(InitStageFinal);
-  EXPECT_EQ(CountSingleDisplayActivePromos(), 0);
 
   ClearPreRestoreIdentity(local_state_.Get());
   EnableFeatureVariationFullscreen();
   MockAppStateChange(InitStageFinal);
-  EXPECT_EQ(CountSingleDisplayActivePromos(), 0);
 }
 
 TEST_F(PostRestoreAppAgentTest, registerPromoFullscreen) {
+  EXPECT_CALL(*promos_manager_.get(),
+              RegisterPromoForSingleDisplay(
+                  promos_manager::Promo::PostRestoreSignInFullscreen))
+      .Times(1);
+
   EnableFeatureVariationFullscreen();
   SetFakePreRestoreAccountInfo();
   MockAppStateChange(InitStageFinal);
-  ExpectRegisteredPromo(promos_manager::Promo::PostRestoreSignInFullscreen);
 }
 
 TEST_F(PostRestoreAppAgentTest, registerPromoAlert) {
+  EXPECT_CALL(*promos_manager_.get(),
+              RegisterPromoForSingleDisplay(
+                  promos_manager::Promo::PostRestoreSignInAlert))
+      .Times(1);
+
   EnableFeatureVariationAlert();
   SetFakePreRestoreAccountInfo();
   MockAppStateChange(InitStageFinal);
-  ExpectRegisteredPromo(promos_manager::Promo::PostRestoreSignInAlert);
 }
 
 TEST_F(PostRestoreAppAgentTest, registerPromoDisablesReauthPrompt) {
@@ -157,49 +158,50 @@
 }
 
 TEST_F(PostRestoreAppAgentTest, deregisterPromoFullscreen) {
-  promos_manager_->RegisterPromoForSingleDisplay(
-      promos_manager::Promo::PostRestoreSignInFullscreen);
-  EXPECT_EQ(CountSingleDisplayActivePromos(), 1);
+  EXPECT_CALL(*promos_manager_.get(), DeregisterPromo(_)).Times(1);
+  EXPECT_CALL(
+      *promos_manager_.get(),
+      DeregisterPromo(promos_manager::Promo::PostRestoreSignInFullscreen))
+      .Times(1);
 
   EnableFeatureVariationAlert();
+  SetFakePreRestoreAccountInfo();
   ClearPreRestoreIdentity(local_state_.Get());
   MockAppStateChange(InitStageFinal);
-  EXPECT_EQ(CountSingleDisplayActivePromos(), 0);
 }
 
 TEST_F(PostRestoreAppAgentTest, deregisterPromoAlert) {
-  promos_manager_->RegisterPromoForSingleDisplay(
-      promos_manager::Promo::PostRestoreSignInAlert);
-  EXPECT_EQ(CountSingleDisplayActivePromos(), 1);
+  EXPECT_CALL(*promos_manager_.get(), DeregisterPromo(_)).Times(1);
+  EXPECT_CALL(*promos_manager_.get(),
+              DeregisterPromo(promos_manager::Promo::PostRestoreSignInAlert))
+      .Times(1);
 
-  EnableFeatureVariationAlert();
+  EnableFeatureVariationFullscreen();
+  SetFakePreRestoreAccountInfo();
   ClearPreRestoreIdentity(local_state_.Get());
   MockAppStateChange(InitStageFinal);
-  EXPECT_EQ(CountSingleDisplayActivePromos(), 0);
 }
 
 TEST_F(PostRestoreAppAgentTest, featureVariationSwitchToFullscreen) {
-  // Simulate that the Alert promo was previously registered.
-  promos_manager_->RegisterPromoForSingleDisplay(
-      promos_manager::Promo::PostRestoreSignInAlert);
-  EXPECT_EQ(CountSingleDisplayActivePromos(), 1);
+  EXPECT_CALL(*promos_manager_.get(),
+              RegisterPromoForSingleDisplay(
+                  promos_manager::Promo::PostRestoreSignInFullscreen))
+      .Times(1);
 
   EnableFeatureVariationFullscreen();
   SetFakePreRestoreAccountInfo();
 
   MockAppStateChange(InitStageFinal);
-  ExpectRegisteredPromo(promos_manager::Promo::PostRestoreSignInFullscreen);
 }
 
 TEST_F(PostRestoreAppAgentTest, featureVariationSwitchToAlert) {
-  // Simulate that the Fullscreen promo was previously registered.
-  promos_manager_->RegisterPromoForSingleDisplay(
-      promos_manager::Promo::PostRestoreSignInFullscreen);
-  EXPECT_EQ(CountSingleDisplayActivePromos(), 1);
+  EXPECT_CALL(*promos_manager_.get(),
+              RegisterPromoForSingleDisplay(
+                  promos_manager::Promo::PostRestoreSignInAlert))
+      .Times(1);
 
   EnableFeatureVariationAlert();
   SetFakePreRestoreAccountInfo();
 
   MockAppStateChange(InitStageFinal);
-  ExpectRegisteredPromo(promos_manager::Promo::PostRestoreSignInAlert);
 }
diff --git a/ios/chrome/browser/application_context/BUILD.gn b/ios/chrome/browser/application_context/BUILD.gn
index 133a8d9..668929cb 100644
--- a/ios/chrome/browser/application_context/BUILD.gn
+++ b/ios/chrome/browser/application_context/BUILD.gn
@@ -52,8 +52,8 @@
     "//ios/chrome/browser/prefs",
     "//ios/chrome/browser/prefs:browser_prefs",
     "//ios/chrome/browser/prefs:pref_names",
-    "//ios/chrome/browser/promos_manager",
     "//ios/chrome/browser/promos_manager:features",
+    "//ios/chrome/browser/promos_manager:internal",
     "//ios/chrome/browser/push_notification:push_notification_service",
     "//ios/chrome/browser/segmentation_platform",
     "//ios/chrome/browser/update_client",
diff --git a/ios/chrome/browser/application_context/application_context_impl.mm b/ios/chrome/browser/application_context/application_context_impl.mm
index b5cbfc84..336182a 100644
--- a/ios/chrome/browser/application_context/application_context_impl.mm
+++ b/ios/chrome/browser/application_context/application_context_impl.mm
@@ -60,7 +60,7 @@
 #import "ios/chrome/browser/prefs/ios_chrome_pref_service_factory.h"
 #import "ios/chrome/browser/prefs/pref_names.h"
 #import "ios/chrome/browser/promos_manager/features.h"
-#import "ios/chrome/browser/promos_manager/promos_manager.h"
+#import "ios/chrome/browser/promos_manager/promos_manager_impl.h"
 #import "ios/chrome/browser/push_notification/push_notification_service.h"
 #import "ios/chrome/browser/segmentation_platform/otr_web_state_observer.h"
 #import "ios/chrome/browser/update_client/ios_chrome_update_query_params_delegate.h"
@@ -474,7 +474,7 @@
 PromosManager* ApplicationContextImpl::GetPromosManager() {
   DCHECK(thread_checker_.CalledOnValidThread());
   if (IsFullscreenPromosManagerEnabled() && !promos_manager_) {
-    promos_manager_ = std::make_unique<PromosManager>(GetLocalState());
+    promos_manager_ = std::make_unique<PromosManagerImpl>(GetLocalState());
   }
   return promos_manager_.get();
 }
diff --git a/ios/chrome/browser/autocomplete/BUILD.gn b/ios/chrome/browser/autocomplete/BUILD.gn
index ff4ada7..f8a2e618 100644
--- a/ios/chrome/browser/autocomplete/BUILD.gn
+++ b/ios/chrome/browser/autocomplete/BUILD.gn
@@ -20,6 +20,8 @@
     "shortcuts_backend_factory.mm",
     "tab_matcher_impl.h",
     "tab_matcher_impl.mm",
+    "zero_suggest_cache_service_factory.cc",
+    "zero_suggest_cache_service_factory.h",
   ]
 
   configs += [ "//build/config/compiler:enable_arc" ]
diff --git a/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.mm b/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.mm
index 497bfdd3..e6de6c32 100644
--- a/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.mm
+++ b/ios/chrome/browser/autocomplete/autocomplete_provider_client_impl.mm
@@ -25,6 +25,7 @@
 #import "ios/chrome/browser/autocomplete/remote_suggestions_service_factory.h"
 #import "ios/chrome/browser/autocomplete/shortcuts_backend_factory.h"
 #import "ios/chrome/browser/autocomplete/tab_matcher_impl.h"
+#import "ios/chrome/browser/autocomplete/zero_suggest_cache_service_factory.h"
 #import "ios/chrome/browser/bookmarks/bookmark_model_factory.h"
 #import "ios/chrome/browser/browser_state/chrome_browser_state.h"
 #import "ios/chrome/browser/history/history_service_factory.h"
@@ -136,12 +137,14 @@
 
 ZeroSuggestCacheService*
 AutocompleteProviderClientImpl::GetZeroSuggestCacheService() {
-  return nullptr;
+  return ios::ZeroSuggestCacheServiceFactory::GetForBrowserState(
+      browser_state_);
 }
 
 const ZeroSuggestCacheService*
 AutocompleteProviderClientImpl::GetZeroSuggestCacheService() const {
-  return nullptr;
+  return ios::ZeroSuggestCacheServiceFactory::GetForBrowserState(
+      browser_state_);
 }
 
 OmniboxPedalProvider* AutocompleteProviderClientImpl::GetPedalProvider() const {
diff --git a/ios/chrome/browser/autocomplete/zero_suggest_cache_service_factory.cc b/ios/chrome/browser/autocomplete/zero_suggest_cache_service_factory.cc
new file mode 100644
index 0000000..35e9f80
--- /dev/null
+++ b/ios/chrome/browser/autocomplete/zero_suggest_cache_service_factory.cc
@@ -0,0 +1,42 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ios/chrome/browser/autocomplete/zero_suggest_cache_service_factory.h"
+
+#include "base/no_destructor.h"
+#include "components/keyed_service/ios/browser_state_dependency_manager.h"
+#include "components/omnibox/browser/omnibox_field_trial.h"
+#include "components/omnibox/browser/zero_suggest_cache_service.h"
+#include "ios/chrome/browser/browser_state/chrome_browser_state.h"
+
+namespace ios {
+
+// static
+ZeroSuggestCacheService* ZeroSuggestCacheServiceFactory::GetForBrowserState(
+    ChromeBrowserState* browser_state) {
+  return static_cast<ZeroSuggestCacheService*>(
+      GetInstance()->GetServiceForBrowserState(browser_state, true));
+}
+
+// static
+ZeroSuggestCacheServiceFactory* ZeroSuggestCacheServiceFactory::GetInstance() {
+  static base::NoDestructor<ZeroSuggestCacheServiceFactory> instance;
+  return instance.get();
+}
+
+ZeroSuggestCacheServiceFactory::ZeroSuggestCacheServiceFactory()
+    : BrowserStateKeyedServiceFactory(
+          "ZeroSuggestCacheService",
+          BrowserStateDependencyManager::GetInstance()) {}
+
+ZeroSuggestCacheServiceFactory::~ZeroSuggestCacheServiceFactory() = default;
+
+std::unique_ptr<KeyedService>
+ZeroSuggestCacheServiceFactory::BuildServiceInstanceFor(
+    web::BrowserState* context) const {
+  return std::make_unique<ZeroSuggestCacheService>(
+      OmniboxFieldTrial::kZeroSuggestCacheMaxSize.Get());
+}
+
+}  // namespace ios
diff --git a/ios/chrome/browser/autocomplete/zero_suggest_cache_service_factory.h b/ios/chrome/browser/autocomplete/zero_suggest_cache_service_factory.h
new file mode 100644
index 0000000..ff0692d
--- /dev/null
+++ b/ios/chrome/browser/autocomplete/zero_suggest_cache_service_factory.h
@@ -0,0 +1,45 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_AUTOCOMPLETE_ZERO_SUGGEST_CACHE_SERVICE_FACTORY_H_
+#define IOS_CHROME_BROWSER_AUTOCOMPLETE_ZERO_SUGGEST_CACHE_SERVICE_FACTORY_H_
+
+#include "memory.h"
+
+#include "base/no_destructor.h"
+#include "components/keyed_service/ios/browser_state_keyed_service_factory.h"
+
+class ChromeBrowserState;
+class ZeroSuggestCacheService;
+
+namespace ios {
+// Singleton that owns all ZeroSuggestCacheServices and associates them with
+// ChromeBrowserState
+class ZeroSuggestCacheServiceFactory : public BrowserStateKeyedServiceFactory {
+ public:
+  static ZeroSuggestCacheService* GetForBrowserState(
+      ChromeBrowserState* browser_state);
+  static ZeroSuggestCacheServiceFactory* GetInstance();
+  // Returns the default factory used to build ZeroSuggestCacheService. Can be
+  // registered with SetTestingFactory to use real instances during testing.
+  static TestingFactory GetDefaultFactory();
+
+  ZeroSuggestCacheServiceFactory(const ZeroSuggestCacheServiceFactory&) =
+      delete;
+  ZeroSuggestCacheServiceFactory& operator=(
+      const ZeroSuggestCacheServiceFactory&) = delete;
+
+ private:
+  friend class base::NoDestructor<ZeroSuggestCacheServiceFactory>;
+
+  ZeroSuggestCacheServiceFactory();
+  ~ZeroSuggestCacheServiceFactory() override;
+
+  // BrowerStateKeyedServiceFactory implementation.
+  std::unique_ptr<KeyedService> BuildServiceInstanceFor(
+      web::BrowserState* context) const override;
+};
+}  // namespace ios
+
+#endif  // IOS_CHROME_BROWSER_AUTOCOMPLETE_ZERO_SUGGEST_CACHE_SERVICE_FACTORY_H_
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm
index cc664b0..af1199e 100644
--- a/ios/chrome/browser/flags/about_flags.mm
+++ b/ios/chrome/browser/flags/about_flags.mm
@@ -1176,6 +1176,11 @@
      flag_descriptions::kOmniboxZeroSuggestPrefetchingName,
      flag_descriptions::kOmniboxZeroSuggestPrefetchingDescription,
      flags_ui::kOsIos, FEATURE_VALUE_TYPE(omnibox::kZeroSuggestPrefetching)},
+    {"omnibox-zero-suggest-in-memory-caching",
+     flag_descriptions::kOmniboxZeroSuggestInMemoryCachingName,
+     flag_descriptions::kOmniboxZeroSuggestInMemoryCachingDescription,
+     flags_ui::kOsIos,
+     FEATURE_VALUE_TYPE(omnibox::kZeroSuggestInMemoryCaching)},
     {"enable-user-policy", flag_descriptions::kEnableUserPolicyName,
      flag_descriptions::kEnableUserPolicyDescription, flags_ui::kOsIos,
      FEATURE_VALUE_TYPE(policy::kUserPolicy)},
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
index e990a37..fbb3a7b 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -591,6 +591,11 @@
     "Enables prefetching of the zero prefix suggestions for eligible users "
     "on the New Tab page.";
 
+const char kOmniboxZeroSuggestInMemoryCachingName[] =
+    "Omnibox Zero Prefix Suggestion in-memory caching";
+const char kOmniboxZeroSuggestInMemoryCachingDescription[] =
+    "Enables in-memory caching of zero prefix suggestions.";
+
 const char kIOSOmniboxUpdatedPopupUIName[] = "Popup refresh";
 const char kIOSOmniboxUpdatedPopupUIDescription[] =
     "Enable the new Popup implementation with Actions";
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
index 1ed6072..529f536 100644
--- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
+++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -535,6 +535,10 @@
 extern const char kOmniboxZeroSuggestPrefetchingName[];
 extern const char kOmniboxZeroSuggestPrefetchingDescription[];
 
+// Title and description for the use of in-memory zero-suggest caching.
+extern const char kOmniboxZeroSuggestInMemoryCachingName[];
+extern const char kOmniboxZeroSuggestInMemoryCachingDescription[];
+
 // Title and description for the flag to enable ChromeActions (and optionally
 // SwiftUI omnibox popup implementation).
 extern const char kIOSOmniboxUpdatedPopupUIName[];
diff --git a/ios/chrome/browser/flags/system_flags.h b/ios/chrome/browser/flags/system_flags.h
index fefd3ff..4e2abc4 100644
--- a/ios/chrome/browser/flags/system_flags.h
+++ b/ios/chrome/browser/flags/system_flags.h
@@ -72,6 +72,11 @@
 // Whether the DCheckIsFatal feature should be disabled.
 bool AreDCHECKCrashesDisabled();
 
+// Returns the name of the promo to be forced to display when the app is
+// launched or resumed. Returns empty string if no promo is to be forced
+// to display. Always returns nil for users in stable/beta.
+NSString* GetForcedPromoToDisplay();
+
 }  // namespace experimental_flags
 
 #endif  // IOS_CHROME_BROWSER_FLAGS_SYSTEM_FLAGS_H_
diff --git a/ios/chrome/browser/flags/system_flags.mm b/ios/chrome/browser/flags/system_flags.mm
index 12172cd..95b0ed5 100644
--- a/ios/chrome/browser/flags/system_flags.mm
+++ b/ios/chrome/browser/flags/system_flags.mm
@@ -34,6 +34,7 @@
 NSString* const kOriginServerHost = @"AlternateOriginServerHost";
 NSString* const kWhatsNewPromoStatus = @"WhatsNewPromoStatus";
 NSString* const kClearApplicationGroup = @"ClearApplicationGroup";
+NSString* const kNextPromoForDisplayOverride = @"NextPromoForDisplayOverride";
 BASE_FEATURE(kEnableThirdPartyKeyboardWorkaround,
              "EnableThirdPartyKeyboardWorkaround",
              base::FEATURE_ENABLED_BY_DEFAULT);
@@ -125,4 +126,9 @@
   return base::FeatureList::IsEnabled(kEnableThirdPartyKeyboardWorkaround);
 }
 
+NSString* GetForcedPromoToDisplay() {
+  return [[NSUserDefaults standardUserDefaults]
+      stringForKey:kNextPromoForDisplayOverride];
+}
+
 }  // namespace experimental_flags
diff --git a/ios/chrome/browser/promos_manager/BUILD.gn b/ios/chrome/browser/promos_manager/BUILD.gn
index a7f3bf63..a00428b6 100644
--- a/ios/chrome/browser/promos_manager/BUILD.gn
+++ b/ios/chrome/browser/promos_manager/BUILD.gn
@@ -22,6 +22,27 @@
   ]
 }
 
+source_set("internal") {
+  sources = [
+    "promos_manager_impl.h",
+    "promos_manager_impl.mm",
+  ]
+  frameworks = [ "Foundation.framework" ]
+  configs += [ "//build/config/compiler:enable_arc" ]
+  public_deps = [
+    ":constants",
+    ":promos_manager",
+    ":types",
+    "//base",
+    "//components/prefs",
+    "//third_party/abseil-cpp:absl",
+  ]
+  deps = [
+    ":features",
+    "//ios/chrome/browser/prefs:pref_names",
+  ]
+}
+
 source_set("types") {
   sources = [
     "impression_limit.h",
@@ -53,17 +74,35 @@
   deps = [ "//base" ]
 }
 
-source_set("unit_tests") {
+source_set("test_support") {
   testonly = true
   sources = [
-    "promos_manager_unittest.h",
-    "promos_manager_unittest.mm",
+    "mock_promos_manager.h",
+    "mock_promos_manager.mm",
   ]
   frameworks = [ "Foundation.framework" ]
   configs += [ "//build/config/compiler:enable_arc" ]
+  public_deps = [
+    ":constants",
+    ":promos_manager",
+    ":types",
+    "//base",
+    "//base/test:test_support",
+    "//testing/gmock",
+    "//testing/gtest",
+    "//third_party/abseil-cpp:absl",
+  ]
+}
+
+source_set("unit_tests") {
+  testonly = true
+  sources = [ "promos_manager_impl_unittest.mm" ]
+  frameworks = [ "Foundation.framework" ]
+  configs += [ "//build/config/compiler:enable_arc" ]
   deps = [
     ":constants",
     ":features",
+    ":internal",
     ":promos_manager",
     ":types",
     "//base",
diff --git a/ios/chrome/browser/promos_manager/constants.cc b/ios/chrome/browser/promos_manager/constants.cc
index 7d3392ae..a3671a60 100644
--- a/ios/chrome/browser/promos_manager/constants.cc
+++ b/ios/chrome/browser/promos_manager/constants.cc
@@ -12,8 +12,6 @@
 const std::string kImpressionPromoKey = "promo";
 const std::string kImpressionDayKey = "day";
 const int kNumDaysImpressionHistoryStored = 365;
-
-// Prefix used when stringifying promos.
 const std::string kPromoStringifyPrefix = "promos_manager::Promo::";
 
 // WARNING - PLEASE READ: Sadly, we cannot switch over strings in C++, so be
diff --git a/ios/chrome/browser/promos_manager/constants.h b/ios/chrome/browser/promos_manager/constants.h
index b31456e..1e1f4d8 100644
--- a/ios/chrome/browser/promos_manager/constants.h
+++ b/ios/chrome/browser/promos_manager/constants.h
@@ -17,6 +17,9 @@
 // Dictionary key for `day` in stored impression (base::Value).
 extern const std::string kImpressionDayKey;
 
+// Prefix used when stringifying promos.
+extern const std::string kPromoStringifyPrefix;
+
 // The max number of days for impression history to be stored & maintained.
 extern const int kNumDaysImpressionHistoryStored;
 
diff --git a/ios/chrome/browser/promos_manager/mock_promos_manager.h b/ios/chrome/browser/promos_manager/mock_promos_manager.h
new file mode 100644
index 0000000..1452df2
--- /dev/null
+++ b/ios/chrome/browser/promos_manager/mock_promos_manager.h
@@ -0,0 +1,54 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_PROMOS_MANAGER_MOCK_PROMOS_MANAGER_H_
+#define IOS_CHROME_BROWSER_PROMOS_MANAGER_MOCK_PROMOS_MANAGER_H_
+
+#import "ios/chrome/browser/promos_manager/promos_manager.h"
+
+#import <Foundation/Foundation.h>
+
+#import <map>
+#import <set>
+
+#import "base/containers/small_map.h"
+#import "ios/chrome/browser/promos_manager/constants.h"
+#import "ios/chrome/browser/promos_manager/impression_limit.h"
+#import "testing/gmock/include/gmock/gmock.h"
+#import "third_party/abseil-cpp/absl/types/optional.h"
+
+// Mock version of PromosManager.
+class MockPromosManager : public PromosManager {
+ public:
+  MockPromosManager();
+  ~MockPromosManager() override;
+
+  // PromosManager implementation.
+  MOCK_METHOD(void, Init, (), (override));
+  MOCK_METHOD(void,
+              InitializePromoImpressionLimits,
+              ((base::small_map<
+                  std::map<promos_manager::Promo, NSArray<ImpressionLimit*>*>>
+                    promo_impression_limits)),
+              (override));
+  MOCK_METHOD(void,
+              RecordImpression,
+              (promos_manager::Promo promo),
+              (override));
+  MOCK_METHOD(absl::optional<promos_manager::Promo>,
+              NextPromoForDisplay,
+              (),
+              (const, override));
+  MOCK_METHOD(void,
+              RegisterPromoForContinuousDisplay,
+              (promos_manager::Promo promo),
+              (override));
+  MOCK_METHOD(void,
+              RegisterPromoForSingleDisplay,
+              (promos_manager::Promo promo),
+              (override));
+  MOCK_METHOD(void, DeregisterPromo, (promos_manager::Promo promo), (override));
+};
+
+#endif  // IOS_CHROME_BROWSER_PROMOS_MANAGER_MOCK_PROMOS_MANAGER_H_
diff --git a/ios/chrome/browser/promos_manager/mock_promos_manager.mm b/ios/chrome/browser/promos_manager/mock_promos_manager.mm
new file mode 100644
index 0000000..5a996aa
--- /dev/null
+++ b/ios/chrome/browser/promos_manager/mock_promos_manager.mm
@@ -0,0 +1,14 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/promos_manager/mock_promos_manager.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+#pragma mark - Constructor/Destructor
+
+MockPromosManager::MockPromosManager() {}
+MockPromosManager::~MockPromosManager() {}
diff --git a/ios/chrome/browser/promos_manager/promos_manager.h b/ios/chrome/browser/promos_manager/promos_manager.h
index 773ace8..d1c39fa 100644
--- a/ios/chrome/browser/promos_manager/promos_manager.h
+++ b/ios/chrome/browser/promos_manager/promos_manager.h
@@ -6,251 +6,66 @@
 #define IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_H_
 
 #import <Foundation/Foundation.h>
+
 #import <map>
-#import <set>
-#import <vector>
 
 #import "base/containers/small_map.h"
-#import "base/values.h"
-#import "components/prefs/pref_service.h"
-#import "ios/chrome/browser/promos_manager/constants.h"
-#import "ios/chrome/browser/promos_manager/impression_limit.h"
 #import "third_party/abseil-cpp/absl/types/optional.h"
 
-class PromosManagerTest;
+@class ImpressionLimit;
+
+namespace promos_manager {
+enum class Promo;
+}  // namespace promos_manager
 
 // Centralized promos manager for coordinating and scheduling the display of
 // app-wide promos. Feature teams interested in displaying promos should
-// leverage this manager.
+// leverage this manager, and only use the following methods:
+// 1. RegisterPromoForSingleDisplay
+// 2. RegisterPromoForContinuousDisplay
+// 3. DeregisterPromo
 class PromosManager {
  public:
-  explicit PromosManager(PrefService* local_state);
-  ~PromosManager();
+  PromosManager();
+  virtual ~PromosManager();
+
+#pragma mark - Public-facing APIs
+
+  // Registers `promo` for continuous display, and persists registration status
+  // across app launches.
+  virtual void RegisterPromoForContinuousDisplay(
+      promos_manager::Promo promo) = 0;
+
+  // Registers `promo` for single (one-time) display, and persists registration
+  // status across app launches.
+  virtual void RegisterPromoForSingleDisplay(promos_manager::Promo promo) = 0;
+
+  // Deregisters `promo` (stopping `promo` from being displayed) by removing the
+  // promo entry from the single-display and continuous-display active promos
+  // lists.
+  virtual void DeregisterPromo(promos_manager::Promo promo) = 0;
+
+#pragma mark - Internal APIs
+
+  // Initialize the Promos Manager by restoring state from Prefs. Must be called
+  // after creation and before any other operation.
+  virtual void Init();
+
+  // Ingests promo-specific impression limits and stores them in-memory for
+  // later reference.
+  virtual void InitializePromoImpressionLimits(
+      base::small_map<
+          std::map<promos_manager::Promo, NSArray<ImpressionLimit*>*>>
+          promo_impression_limits) = 0;
 
   // Records the impression of `promo` in the impression history.
   //
   // NOTE: If `promo` is a single-display promo, it will be automatically
   // deregistered.
-  void RecordImpression(promos_manager::Promo promo);
-
-  // Ingests promo-specific impression limits and stores them in-memory for
-  // later reference.
-  void InitializePromoImpressionLimits(
-      base::small_map<
-          std::map<promos_manager::Promo, NSArray<ImpressionLimit*>*>>
-          promo_impression_limits);
+  virtual void RecordImpression(promos_manager::Promo promo) = 0;
 
   // Returns the next promo for display, if any.
-  absl::optional<promos_manager::Promo> NextPromoForDisplay() const;
-
-  // Registers `promo` for continuous display, and persists registration status
-  // across app launches.
-  void RegisterPromoForContinuousDisplay(promos_manager::Promo promo);
-
-  // Registers `promo` for single (one-time) display, and persists registration
-  // status across app launches.
-  void RegisterPromoForSingleDisplay(promos_manager::Promo promo);
-
-  // Deregisters `promo` (stopping `promo` from being displayed) by removing the
-  // promo entry from the single-display and continuous-display active promos
-  // lists.
-  void DeregisterPromo(promos_manager::Promo promo);
-
-  // Initialize the Promos Manager by restoring state from Prefs. Must be called
-  // after creation and before any other operation.
-  void Init();
-
- private:
-  // Weak pointer to the local state prefs store.
-  const raw_ptr<PrefService> local_state_;
-
-  // The set of currently active, continuous-display promos.
-  std::set<promos_manager::Promo> active_promos_;
-
-  // The set of currently active, single-display promos.
-  std::set<promos_manager::Promo> single_display_active_promos_;
-
-  // The impression history sorted by `day` (most recent -> least recent).
-  std::vector<promos_manager::Impression> impression_history_;
-
-  // Promo-specific impression limits (promos_manager::Promo : [Impression
-  // Limits]).
-  base::small_map<std::map<promos_manager::Promo, NSArray<ImpressionLimit*>*>>
-      promo_impression_limits_;
-
-  // `promo`-specific impression limits, if defined. May return an empty
-  // NSArray, indicating no promo-specific impression limits were defined for
-  // `promo`.
-  NSArray<ImpressionLimit*>* PromoImpressionLimits(
-      promos_manager::Promo promo) const;
-
-  // Returns a std::vector<promos_manager::Promo> that only includes promos in
-  // `active_promos`, sorted by day (least recent -> most recent).
-  //
-  // Assumes that `sorted_impressions` is sorted by day (most recent -> least
-  // recent).
-  //
-  // When `active_promos` or `sorted_impressions` is empty, returns an empty
-  // array.
-  //
-  // Promos that have never been shown before are considered less recently shown
-  // than promos that have been shown.
-  //
-  // Promos shown on the same day will be sorted by relative position. More
-  // concretely, even if two promos are shown on the same day, the promos with
-  // the lower index in the impressions history list will be considered more
-  // recently seen, as `sorted_impressions` is sorted by day (most recent ->
-  // least recent).
-  std::vector<promos_manager::Promo> LeastRecentlyShown(
-      const std::set<promos_manager::Promo>& active_promos,
-      const std::vector<promos_manager::Impression>& sorted_impressions) const;
-
-  // Impression limits that count against all promos.
-  NSArray<ImpressionLimit*>* GlobalImpressionLimits() const;
-
-  // Impression limits that count against any given promo.
-  NSArray<ImpressionLimit*>* GlobalPerPromoImpressionLimits() const;
-
-  // Loops over the stored impression history (base::Value::List) and returns
-  // corresponding a std::vector<promos_manager::Impression>.
-  std::vector<promos_manager::Impression> ImpressionHistory(
-      const base::Value::List& stored_impression_history);
-
-  // Loops over the stored active promos list (base::Value::List) and returns
-  // a corresponding std::set<promos_manager::Promo>.
-  std::set<promos_manager::Promo> ActivePromos(
-      const base::Value::List& stored_active_promos);
-
-  // Returns true if any impression limit from `impression_limits` is triggered,
-  // and false otherwise.
-  //
-  // At each limit, evaluates the following:
-  //
-  // (1) Is the current limit valid for evaluation? This is determined by
-  // whether or not `window_days` is < the current limit's window.
-  //
-  // (2) If the limit is valid for evaluation, compare `impression_count` with
-  // the current limit's impression count. If `impression_count` >= the current
-  // limit's impression count, the limit has been triggered.
-
-  // (3) If the limit is triggered, exits early and returns true. Otherwise,
-  // keep going.
-  bool AnyImpressionLimitTriggered(
-      int impression_count,
-      int window_days,
-      NSArray<ImpressionLimit*>* impression_limits) const;
-
-  // Algorithm loops over pre-sorted impressions history list. The algorithm
-  // assumes `valid_impressions` is sorted by impression day (most recent ->
-  // least recent).
-  //
-  // At each impression, the algorithm asks if either a time-based or
-  // time-agnostic impression limit has been met. If so, the algorithm exits
-  // early and returns false.
-  //
-  // If the algorithm reaches its end, no impression limits were hit for
-  // `promo`. If so, the algorithm returns true, as it's safe to display
-  // `promo`.
-  bool CanShowPromo(
-      promos_manager::Promo promo,
-      const std::vector<promos_manager::Impression>& sorted_impressions) const;
-
-  // Returns a list of impression counts (std::vector<int>) from a promo
-  // impression counts map.
-  std::vector<int> ImpressionCounts(
-      std::map<promos_manager::Promo, int>& promo_impression_counts) const;
-
-  // Returns the greatest impression count (int) from a promo impression counts
-  // map.
-  int MaxImpressionCount(
-      std::map<promos_manager::Promo, int>& promo_impression_counts) const;
-
-  // Returns the total number of impressions (int) from a promo impression
-  // counts map.
-  int TotalImpressionCount(
-      std::map<promos_manager::Promo, int>& promo_impression_counts) const;
-
-  // Allow unit tests to access private methods.
-  friend class PromosManagerTest;
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsImpressionCounts);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsEmptyImpressionCounts);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsTotalImpressionCount);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest,
-                           ReturnsZeroForTotalImpressionCount);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsMaxImpressionCount);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsZeroForMaxImpressionCount);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest,
-                           DetectsSingleImpressionLimitTriggered);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest,
-                           DetectsOneOfMultipleImpressionLimitsTriggered);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest,
-                           DetectsNoImpressionLimitTriggered);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, DecidesCanShowPromo);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, DecidesCannotShowPromo);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsLeastRecentlyShown);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest,
-                           ReturnsLeastRecentlyShownWithSomeInactivePromos);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest,
-                           ReturnsLeastRecentlyShownBreakingTies);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest,
-                           ReturnsLeastRecentlyShownWithOnlyOnePromoActive);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest,
-                           ReturnsLeastRecentlyShownWithoutImpressionHistory);
-  FRIEND_TEST_ALL_PREFIXES(
-      PromosManagerTest,
-      ReturnsEmptyListWhenLeastRecentlyShownHasNoActivePromoCampaigns);
-  FRIEND_TEST_ALL_PREFIXES(
-      PromosManagerTest,
-      ReturnsEmptyListWhenLeastRecentlyShownHasNoImpressionHistory);
-  FRIEND_TEST_ALL_PREFIXES(
-      PromosManagerTest,
-      SortsUnshownPromosBeforeShownPromosForLeastRecentlyShown);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsImpressionHistory);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest,
-                           ReturnsBlankImpressionHistoryForBlankPrefs);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest,
-                           ReturnsImpressionHistoryBySkippingMalformedEntries);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, ReturnsActivePromos);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest,
-                           ReturnsBlankActivePromosForBlankPrefs);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest,
-                           ReturnsActivePromosAndSkipsMalformedData);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest,
-                           RegistersPromoForContinuousDisplay);
-  FRIEND_TEST_ALL_PREFIXES(
-      PromosManagerTest,
-      RegistersPromoForContinuousDisplayAndImmediatelyUpdateVariables);
-  FRIEND_TEST_ALL_PREFIXES(
-      PromosManagerTest,
-      RegistersPromoForContinuousDisplayForEmptyActivePromos);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest,
-                           RegistersAlreadyRegisteredPromoForContinuousDisplay);
-  FRIEND_TEST_ALL_PREFIXES(
-      PromosManagerTest,
-      RegistersAlreadyRegisteredPromoForContinuousDisplayForEmptyActivePromos);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, RegistersPromoForSingleDisplay);
-  FRIEND_TEST_ALL_PREFIXES(
-      PromosManagerTest,
-      RegistersPromoForSingleDisplayAndImmediatelyUpdateVariables);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest,
-                           RegistersPromoForSingleDisplayForEmptyActivePromos);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest,
-                           RegistersAlreadyRegisteredPromoForSingleDisplay);
-  FRIEND_TEST_ALL_PREFIXES(
-      PromosManagerTest,
-      RegistersAlreadyRegisteredPromoForSingleDisplayForEmptyActivePromos);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest,
-                           RegistersPromoSpecificImpressionLimits);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, RecordsImpression);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest,
-                           RecordsImpressionAndImmediatelyUpdateVariables);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, DeregistersActivePromo);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest,
-                           DeregistersActivePromoAndImmediatelyUpdateVariables);
-  FRIEND_TEST_ALL_PREFIXES(PromosManagerTest, DeregistersNonExistentPromo);
-  FRIEND_TEST_ALL_PREFIXES(
-      PromosManagerTest,
-      DeregistersSingleDisplayPromoAfterRecordedImpression);
+  virtual absl::optional<promos_manager::Promo> NextPromoForDisplay() const = 0;
 };
 
 #endif  // IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_H_
diff --git a/ios/chrome/browser/promos_manager/promos_manager.mm b/ios/chrome/browser/promos_manager/promos_manager.mm
index 63a30d52..47ba07d 100644
--- a/ios/chrome/browser/promos_manager/promos_manager.mm
+++ b/ios/chrome/browser/promos_manager/promos_manager.mm
@@ -4,436 +4,15 @@
 
 #import "ios/chrome/browser/promos_manager/promos_manager.h"
 
-#import <Foundation/Foundation.h>
-
-#import <iterator>
-#import <map>
-#import <numeric>
-#import <set>
-#import <vector>
-
-#import "base/containers/contains.h"
-#import "base/time/time.h"
-#import "base/values.h"
-#import "components/prefs/pref_service.h"
-#import "components/prefs/scoped_user_pref_update.h"
-#import "ios/chrome/browser/prefs/pref_names.h"
-#import "ios/chrome/browser/promos_manager/constants.h"
-#import "ios/chrome/browser/promos_manager/features.h"
-#import "ios/chrome/browser/promos_manager/impression_limit.h"
-#import "third_party/abseil-cpp/absl/types/optional.h"
-
 #if !defined(__has_feature) || !__has_feature(objc_arc)
 #error "This file requires ARC support."
 #endif
 
-namespace {
-
-// The number of days since the Unix epoch; one day, in this context, runs
-// from UTC midnight to UTC midnight.
-int TodaysDay() {
-  return (base::Time::Now() - base::Time::UnixEpoch()).InDays();
-}
-
-// Conditionally appends `promo` to the list pref `pref_path`. If `promo`
-// already exists in the list pref `pref_path`, does nothing. If `promo` doesn't
-// exist in the list pref `pref_path`, appends `promo` to the list.
-void ConditionallyAppendPromoToPrefList(promos_manager::Promo promo,
-                                        const std::string& pref_path,
-                                        PrefService* local_state) {
-  DCHECK(local_state);
-
-  ScopedListPrefUpdate update(local_state, pref_path);
-  base::Value::List& active_promos = update.Get();
-  std::string promo_name = promos_manager::NameForPromo(promo);
-
-  // Erase `promo_name` if it already exists in `active_promos`; avoid polluting
-  // `active_promos` with duplicate `promo_name` entries.
-  active_promos.EraseValue(base::Value(promo_name));
-
-  active_promos.Append(promo_name);
-}
-
-}  // namespace
-
-#pragma mark - PromosManager
-
 #pragma mark - Constructor/Destructor
 
-PromosManager::PromosManager(PrefService* local_state)
-    : local_state_(local_state) {
-  DCHECK(local_state_);
-}
+PromosManager::PromosManager() {}
+PromosManager::~PromosManager() {}
 
-PromosManager::~PromosManager() = default;
+#pragma mark - Internal APIs
 
-#pragma mark - Public
-
-void PromosManager::Init() {
-  if (!IsFullscreenPromosManagerEnabled())
-    return;
-
-  DCHECK(local_state_);
-
-  active_promos_ =
-      ActivePromos(local_state_->GetList(prefs::kIosPromosManagerActivePromos));
-  single_display_active_promos_ = ActivePromos(
-      local_state_->GetList(prefs::kIosPromosManagerSingleDisplayActivePromos));
-  impression_history_ = ImpressionHistory(
-      local_state_->GetList(prefs::kIosPromosManagerImpressions));
-}
-
-// Impression history should grow in sorted order. Given this happens on the
-// main thread, appending to the end of the impression history list is
-// sufficient.
-void PromosManager::RecordImpression(promos_manager::Promo promo) {
-  DCHECK(local_state_);
-
-  base::Value::Dict impression;
-  impression.Set(promos_manager::kImpressionPromoKey,
-                 promos_manager::NameForPromo(promo));
-  impression.Set(promos_manager::kImpressionDayKey, TodaysDay());
-
-  ScopedListPrefUpdate update(local_state_,
-                              prefs::kIosPromosManagerImpressions);
-  update->Append(std::move(impression));
-
-  impression_history_ = ImpressionHistory(
-      local_state_->GetList(prefs::kIosPromosManagerImpressions));
-
-  // Auto-deregister `promo` if it's a single-display promo.
-  if (single_display_active_promos_.find(promo) !=
-      single_display_active_promos_.end()) {
-    DeregisterPromo(promo);
-  }
-}
-
-void PromosManager::RegisterPromoForContinuousDisplay(
-    promos_manager::Promo promo) {
-  ConditionallyAppendPromoToPrefList(
-      promo, prefs::kIosPromosManagerActivePromos, local_state_);
-
-  active_promos_ =
-      ActivePromos(local_state_->GetList(prefs::kIosPromosManagerActivePromos));
-}
-
-void PromosManager::RegisterPromoForSingleDisplay(promos_manager::Promo promo) {
-  ConditionallyAppendPromoToPrefList(
-      promo, prefs::kIosPromosManagerSingleDisplayActivePromos, local_state_);
-
-  single_display_active_promos_ = ActivePromos(
-      local_state_->GetList(prefs::kIosPromosManagerSingleDisplayActivePromos));
-}
-
-void PromosManager::DeregisterPromo(promos_manager::Promo promo) {
-  DCHECK(local_state_);
-
-  ScopedListPrefUpdate active_promos_update(
-      local_state_, prefs::kIosPromosManagerActivePromos);
-  ScopedListPrefUpdate single_display_promos_update(
-      local_state_, prefs::kIosPromosManagerSingleDisplayActivePromos);
-
-  base::Value::List& active_promos = active_promos_update.Get();
-  base::Value::List& single_display_promos = single_display_promos_update.Get();
-
-  std::string promo_name = promos_manager::NameForPromo(promo);
-
-  // Erase `promo_name` from the single-display and continuous-display active
-  // promos lists.
-  active_promos.EraseValue(base::Value(promo_name));
-  single_display_promos.EraseValue(base::Value(promo_name));
-
-  active_promos_ =
-      ActivePromos(local_state_->GetList(prefs::kIosPromosManagerActivePromos));
-  single_display_active_promos_ = ActivePromos(
-      local_state_->GetList(prefs::kIosPromosManagerSingleDisplayActivePromos));
-}
-
-void PromosManager::InitializePromoImpressionLimits(
-    base::small_map<std::map<promos_manager::Promo, NSArray<ImpressionLimit*>*>>
-        promo_impression_limits) {
-  promo_impression_limits_ = std::move(promo_impression_limits);
-}
-
-absl::optional<promos_manager::Promo> PromosManager::NextPromoForDisplay()
-    const {
-  // Construct a superset including active (1) single-display and
-  // (2) continuous-display promo campaigns.
-  std::set<promos_manager::Promo> all_active_promos(active_promos_);
-
-  // Non-destructively insert the single-display promos into
-  // `all_active_promos`.
-  all_active_promos.insert(single_display_active_promos_.begin(),
-                           single_display_active_promos_.end());
-
-  std::vector<promos_manager::Promo> least_recently_shown_promos =
-      LeastRecentlyShown(all_active_promos, impression_history_);
-
-  if (least_recently_shown_promos.empty())
-    return absl::nullopt;
-
-  for (promos_manager::Promo promo : least_recently_shown_promos)
-    if (CanShowPromo(promo, impression_history_))
-      return promo;
-
-  return absl::nullopt;
-}
-
-#pragma mark - Private
-
-std::vector<promos_manager::Impression> PromosManager::ImpressionHistory(
-    const base::Value::List& stored_impression_history) {
-  std::vector<promos_manager::Impression> impression_history;
-
-  for (size_t i = 0; i < stored_impression_history.size(); ++i) {
-    const base::Value::Dict& stored_impression =
-        stored_impression_history[i].GetDict();
-    const std::string* stored_promo =
-        stored_impression.FindString(promos_manager::kImpressionPromoKey);
-    absl::optional<int> stored_day =
-        stored_impression.FindInt(promos_manager::kImpressionDayKey);
-
-    // Skip malformed impression history. (This should almost never happen.)
-    if (!stored_promo || !stored_day.has_value())
-      continue;
-
-    absl::optional<promos_manager::Promo> promo =
-        promos_manager::PromoForName(*stored_promo);
-
-    // Skip malformed impression history. (This should almost never happen.)
-    if (!promo.has_value())
-      continue;
-
-    impression_history.push_back(
-        promos_manager::Impression(promo.value(), stored_day.value()));
-  }
-
-  return impression_history;
-}
-
-std::set<promos_manager::Promo> PromosManager::ActivePromos(
-    const base::Value::List& stored_active_promos) {
-  std::set<promos_manager::Promo> active_promos;
-
-  for (size_t i = 0; i < stored_active_promos.size(); ++i) {
-    absl::optional<promos_manager::Promo> promo =
-        promos_manager::PromoForName(stored_active_promos[i].GetString());
-
-    // Skip malformed active promos data. (This should almost never happen.)
-    if (!promo.has_value())
-      continue;
-
-    active_promos.insert(promo.value());
-  }
-
-  return active_promos;
-}
-
-NSArray<ImpressionLimit*>* PromosManager::PromoImpressionLimits(
-    promos_manager::Promo promo) const {
-  auto it = promo_impression_limits_.find(promo);
-
-  if (it == promo_impression_limits_.end())
-    return @[];
-
-  return it->second;
-}
-
-NSArray<ImpressionLimit*>* PromosManager::GlobalImpressionLimits() const {
-  static NSArray<ImpressionLimit*>* limits;
-  static dispatch_once_t onceToken;
-
-  if (IsSkippingInternalImpressionLimitsEnabled()) {
-    return limits;
-  }
-
-  dispatch_once(&onceToken, ^{
-    ImpressionLimit* onceEveryTwoDays =
-        [[ImpressionLimit alloc] initWithLimit:1 forNumDays:2];
-    ImpressionLimit* thricePerWeek = [[ImpressionLimit alloc] initWithLimit:3
-                                                                 forNumDays:7];
-    limits = @[ onceEveryTwoDays, thricePerWeek ];
-  });
-
-  return limits;
-}
-
-NSArray<ImpressionLimit*>* PromosManager::GlobalPerPromoImpressionLimits()
-    const {
-  static NSArray<ImpressionLimit*>* limits;
-  static dispatch_once_t onceToken;
-
-  if (IsSkippingInternalImpressionLimitsEnabled()) {
-    return limits;
-  }
-
-  dispatch_once(&onceToken, ^{
-    ImpressionLimit* oncePerMonth = [[ImpressionLimit alloc] initWithLimit:1
-                                                                forNumDays:30];
-    limits = @[ oncePerMonth ];
-  });
-
-  return limits;
-}
-
-bool PromosManager::AnyImpressionLimitTriggered(
-    int impression_count,
-    int window_days,
-    NSArray<ImpressionLimit*>* impression_limits) const {
-  for (ImpressionLimit* impression_limit in impression_limits) {
-    if (window_days < impression_limit.numDays &&
-        impression_count >= impression_limit.numImpressions)
-      return true;
-  }
-
-  return false;
-}
-
-bool PromosManager::CanShowPromo(
-    promos_manager::Promo promo,
-    const std::vector<promos_manager::Impression>& sorted_impressions) const {
-  // Maintains a map ([promos_manager::Promo] : [current impression count]) for
-  // evaluating against GlobalImpressionLimits(),
-  // GlobalPerPromoImpressionLimits(), and, if defined, `promo`-specific
-  // impression limits
-  std::map<promos_manager::Promo, int> promo_impression_counts;
-
-  NSArray<ImpressionLimit*>* promo_impression_limits =
-      PromoImpressionLimits(promo);
-  NSArray<ImpressionLimit*>* global_per_promo_impression_limits =
-      GlobalPerPromoImpressionLimits();
-  NSArray<ImpressionLimit*>* global_impression_limits =
-      GlobalImpressionLimits();
-
-  int window_start = TodaysDay();
-  int window_end =
-      (window_start - promos_manager::kNumDaysImpressionHistoryStored) + 1;
-  size_t curr_impression_index = 0;
-
-  // Impression limits are defined by a certain number of impressions
-  // (int) within a certain window of days (int).
-  //
-  // This loop starts at TodaysDay() (today) and grows a window, day-by-day, to
-  // check against different impression limits.
-  //
-  // Depending on the size of the window, impression limits may become valid or
-  // invalid. For example, if the window covers 7 days, an impression limit of
-  // 2-day scope is no longer valid. However, if window covered 1-2 days, an
-  // impression limit of 2-day scope is valid.
-  for (int curr_day = window_start; curr_day >= window_end; --curr_day) {
-    if (curr_impression_index < sorted_impressions.size()) {
-      promos_manager::Impression curr_impression =
-          sorted_impressions[curr_impression_index];
-      // If the current impression matches the current day, add it to
-      // `promo_impression_counts`.
-      if (curr_impression.day == curr_day) {
-        promo_impression_counts[curr_impression.promo]++;
-        curr_impression_index++;
-      } else {
-        // Only check impression limits when counts are incremented: if an
-        // impression limit were to be triggered below - but counts weren't
-        // incremented above - it wouldve've already been triggered in a
-        // previous loop run.
-        continue;
-      }
-    }
-
-    int window_days = window_start - curr_day;
-    int promo_impression_count = promo_impression_counts[promo];
-    int most_seen_promo_impression_count =
-        MaxImpressionCount(promo_impression_counts);
-    int total_impression_count = TotalImpressionCount(promo_impression_counts);
-
-    if (AnyImpressionLimitTriggered(promo_impression_count, window_days,
-                                    promo_impression_limits) ||
-        AnyImpressionLimitTriggered(most_seen_promo_impression_count,
-                                    window_days,
-                                    global_per_promo_impression_limits) ||
-        AnyImpressionLimitTriggered(total_impression_count, window_days,
-                                    global_impression_limits))
-      return false;
-  }
-
-  return true;
-}
-
-std::vector<int> PromosManager::ImpressionCounts(
-    std::map<promos_manager::Promo, int>& promo_impression_counts) const {
-  std::vector<int> counts;
-
-  for (const auto& [promo, count] : promo_impression_counts)
-    counts.push_back(count);
-
-  return counts;
-}
-
-int PromosManager::MaxImpressionCount(
-    std::map<promos_manager::Promo, int>& promo_impression_counts) const {
-  std::vector<int> counts = ImpressionCounts(promo_impression_counts);
-  std::vector<int>::iterator max_count_iter =
-      std::max_element(counts.begin(), counts.end());
-  size_t index = std::distance(counts.begin(), max_count_iter);
-  if (index < counts.size())
-    return counts[index];
-  return 0;
-}
-
-int PromosManager::TotalImpressionCount(
-    std::map<promos_manager::Promo, int>& promo_impression_counts) const {
-  std::vector<int> counts = ImpressionCounts(promo_impression_counts);
-
-  return std::accumulate(counts.begin(), counts.end(), 0);
-}
-
-std::vector<promos_manager::Promo> PromosManager::LeastRecentlyShown(
-    const std::set<promos_manager::Promo>& active_promos,
-    const std::vector<promos_manager::Impression>& sorted_impressions) const {
-  std::vector<promos_manager::Promo>
-      active_promos_sorted_by_least_recently_shown;
-
-  // If there are no active promos, and no impression history, return an empty
-  // array. (This is seldom expected to happen, if ever, as Promos Manager will
-  // launch with promos_manager::Promo::DefaultBrowser continuously running.)
-  if (active_promos.empty() && sorted_impressions.empty())
-    return active_promos_sorted_by_least_recently_shown;
-
-  for (promos_manager::Impression impression : sorted_impressions) {
-    // The resulting, sorted array only needs to contain the active promos. Once
-    // all active promos are accounted for in
-    // `active_promos_sorted_by_least_recently_shown`, we can short-circuit and
-    // return `active_promos_sorted_by_least_recently_shown`.
-    if (active_promos_sorted_by_least_recently_shown.size() ==
-        active_promos.size())
-      break;
-
-    // If the current impression's promo already exists in
-    // `active_promos_sorted_by_least_recently_shown`, move onto the next
-    // impression.
-    if (base::Contains(active_promos_sorted_by_least_recently_shown,
-                       impression.promo)) {
-      continue;
-    }
-
-    if (active_promos.count(impression.promo))
-      active_promos_sorted_by_least_recently_shown.push_back(impression.promo);
-  }
-
-  // It's possible some active promos have never been seen (so no impressions
-  // exist for the promo). In that case, add them to the end of the resulting
-  // array, before the array is reversed. Those never-before-seen promos will
-  // end up at the front of the resulting array after reversal.
-  //
-  // Never-before-seen promos are considered less recently seen than previously
-  // seen promos.
-  for (promos_manager::Promo unseen_promo : active_promos) {
-    if (!base::Contains(active_promos_sorted_by_least_recently_shown,
-                        unseen_promo)) {
-      active_promos_sorted_by_least_recently_shown.push_back(unseen_promo);
-    }
-  }
-
-  std::reverse(active_promos_sorted_by_least_recently_shown.begin(),
-               active_promos_sorted_by_least_recently_shown.end());
-
-  return active_promos_sorted_by_least_recently_shown;
-}
+void PromosManager::Init() {}
diff --git a/ios/chrome/browser/promos_manager/promos_manager_impl.h b/ios/chrome/browser/promos_manager/promos_manager_impl.h
new file mode 100644
index 0000000..2aabe457
--- /dev/null
+++ b/ios/chrome/browser/promos_manager/promos_manager_impl.h
@@ -0,0 +1,152 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_IMPL_H_
+#define IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_IMPL_H_
+
+#import "ios/chrome/browser/promos_manager/promos_manager.h"
+
+#import <Foundation/Foundation.h>
+#import <map>
+#import <set>
+#import <vector>
+
+#import "base/containers/small_map.h"
+#import "base/values.h"
+#import "components/prefs/pref_service.h"
+#import "ios/chrome/browser/promos_manager/constants.h"
+#import "ios/chrome/browser/promos_manager/impression_limit.h"
+#import "third_party/abseil-cpp/absl/types/optional.h"
+
+// Centralized promos manager for coordinating and scheduling the display of
+// app-wide promos. Feature teams should not use this directly, use
+// promo_manager.h instead.
+class PromosManagerImpl : public PromosManager {
+ public:
+  explicit PromosManagerImpl(PrefService* local_state);
+  ~PromosManagerImpl() override;
+
+  // `promo`-specific impression limits, if defined. May return an empty
+  // NSArray, indicating no promo-specific impression limits were defined for
+  // `promo`.
+  NSArray<ImpressionLimit*>* PromoImpressionLimits(
+      promos_manager::Promo promo) const;
+
+  // Returns a std::vector<promos_manager::Promo> that only includes promos in
+  // `active_promos`, sorted by day (least recent -> most recent).
+  //
+  // Assumes that `sorted_impressions` is sorted by day (most recent -> least
+  // recent).
+  //
+  // When `active_promos` or `sorted_impressions` is empty, returns an empty
+  // array.
+  //
+  // Promos that have never been shown before are considered less recently shown
+  // than promos that have been shown.
+  //
+  // Promos shown on the same day will be sorted by relative position. More
+  // concretely, even if two promos are shown on the same day, the promos with
+  // the lower index in the impressions history list will be considered more
+  // recently seen, as `sorted_impressions` is sorted by day (most recent ->
+  // least recent).
+  std::vector<promos_manager::Promo> LeastRecentlyShown(
+      const std::set<promos_manager::Promo>& active_promos,
+      const std::vector<promos_manager::Impression>& sorted_impressions) const;
+
+  // Impression limits that count against all promos.
+  NSArray<ImpressionLimit*>* GlobalImpressionLimits() const;
+
+  // Impression limits that count against any given promo.
+  NSArray<ImpressionLimit*>* GlobalPerPromoImpressionLimits() const;
+
+  // Loops over the stored impression history (base::Value::List) and returns
+  // corresponding a std::vector<promos_manager::Impression>.
+  std::vector<promos_manager::Impression> ImpressionHistory(
+      const base::Value::List& stored_impression_history);
+
+  // Loops over the stored active promos list (base::Value::List) and returns
+  // a corresponding std::set<promos_manager::Promo>.
+  std::set<promos_manager::Promo> ActivePromos(
+      const base::Value::List& stored_active_promos);
+
+  // Returns true if any impression limit from `impression_limits` is triggered,
+  // and false otherwise.
+  //
+  // At each limit, evaluates the following:
+  //
+  // (1) Is the current limit valid for evaluation? This is determined by
+  // whether or not `window_days` is < the current limit's window.
+  //
+  // (2) If the limit is valid for evaluation, compare `impression_count` with
+  // the current limit's impression count. If `impression_count` >= the current
+  // limit's impression count, the limit has been triggered.
+
+  // (3) If the limit is triggered, exits early and returns true. Otherwise,
+  // keep going.
+  bool AnyImpressionLimitTriggered(
+      int impression_count,
+      int window_days,
+      NSArray<ImpressionLimit*>* impression_limits) const;
+
+  // Algorithm loops over pre-sorted impressions history list. The algorithm
+  // assumes `valid_impressions` is sorted by impression day (most recent ->
+  // least recent).
+  //
+  // At each impression, the algorithm asks if either a time-based or
+  // time-agnostic impression limit has been met. If so, the algorithm exits
+  // early and returns false.
+  //
+  // If the algorithm reaches its end, no impression limits were hit for
+  // `promo`. If so, the algorithm returns true, as it's safe to display
+  // `promo`.
+  bool CanShowPromo(
+      promos_manager::Promo promo,
+      const std::vector<promos_manager::Impression>& sorted_impressions) const;
+
+  // Returns a list of impression counts (std::vector<int>) from a promo
+  // impression counts map.
+  std::vector<int> ImpressionCounts(
+      std::map<promos_manager::Promo, int>& promo_impression_counts) const;
+
+  // Returns the greatest impression count (int) from a promo impression counts
+  // map.
+  int MaxImpressionCount(
+      std::map<promos_manager::Promo, int>& promo_impression_counts) const;
+
+  // Returns the total number of impressions (int) from a promo impression
+  // counts map.
+  int TotalImpressionCount(
+      std::map<promos_manager::Promo, int>& promo_impression_counts) const;
+
+  // PromosManager implementation.
+  void Init() override;
+  void InitializePromoImpressionLimits(
+      base::small_map<
+          std::map<promos_manager::Promo, NSArray<ImpressionLimit*>*>>
+          promo_impression_limits) override;
+  void RecordImpression(promos_manager::Promo promo) override;
+  absl::optional<promos_manager::Promo> NextPromoForDisplay() const override;
+  void RegisterPromoForContinuousDisplay(promos_manager::Promo promo) override;
+  void RegisterPromoForSingleDisplay(promos_manager::Promo promo) override;
+  void DeregisterPromo(promos_manager::Promo promo) override;
+
+  // Weak pointer to the local state prefs store.
+  const raw_ptr<PrefService> local_state_;
+
+  // The set of currently active, continuous-display promos.
+  std::set<promos_manager::Promo> active_promos_;
+
+  // The set of currently active, single-display promos.
+  std::set<promos_manager::Promo> single_display_active_promos_;
+
+  // The impression history sorted by `day` (most recent -> least recent).
+  std::vector<promos_manager::Impression> impression_history_;
+
+  // Promo-specific impression limits (promos_manager::Promo : [Impression
+  // Limits]).
+  base::small_map<std::map<promos_manager::Promo, NSArray<ImpressionLimit*>*>>
+      promo_impression_limits_;
+};
+
+#endif  // IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_IMPL_H_
diff --git a/ios/chrome/browser/promos_manager/promos_manager_impl.mm b/ios/chrome/browser/promos_manager/promos_manager_impl.mm
new file mode 100644
index 0000000..4ff7144
--- /dev/null
+++ b/ios/chrome/browser/promos_manager/promos_manager_impl.mm
@@ -0,0 +1,440 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#import "ios/chrome/browser/promos_manager/promos_manager_impl.h"
+
+#import <Foundation/Foundation.h>
+
+#import <iterator>
+#import <map>
+#import <numeric>
+#import <set>
+#import <vector>
+
+#import "base/containers/contains.h"
+#import "base/time/time.h"
+#import "base/values.h"
+#import "components/prefs/pref_service.h"
+#import "components/prefs/scoped_user_pref_update.h"
+#import "ios/chrome/browser/prefs/pref_names.h"
+#import "ios/chrome/browser/promos_manager/constants.h"
+#import "ios/chrome/browser/promos_manager/features.h"
+#import "ios/chrome/browser/promos_manager/impression_limit.h"
+#import "third_party/abseil-cpp/absl/types/optional.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+namespace {
+
+// The number of days since the Unix epoch; one day, in this context, runs
+// from UTC midnight to UTC midnight.
+int TodaysDay() {
+  return (base::Time::Now() - base::Time::UnixEpoch()).InDays();
+}
+
+// Conditionally appends `promo` to the list pref `pref_path`. If `promo`
+// already exists in the list pref `pref_path`, does nothing. If `promo` doesn't
+// exist in the list pref `pref_path`, appends `promo` to the list.
+void ConditionallyAppendPromoToPrefList(promos_manager::Promo promo,
+                                        const std::string& pref_path,
+                                        PrefService* local_state) {
+  DCHECK(local_state);
+
+  ScopedListPrefUpdate update(local_state, pref_path);
+  base::Value::List& active_promos = update.Get();
+  std::string promo_name = promos_manager::NameForPromo(promo);
+
+  // Erase `promo_name` if it already exists in `active_promos`; avoid polluting
+  // `active_promos` with duplicate `promo_name` entries.
+  active_promos.EraseValue(base::Value(promo_name));
+
+  active_promos.Append(promo_name);
+}
+
+}  // namespace
+
+#pragma mark - PromosManagerImpl
+
+#pragma mark - Constructor/Destructor
+
+PromosManagerImpl::PromosManagerImpl(PrefService* local_state)
+    : local_state_(local_state) {
+  DCHECK(local_state_);
+}
+
+PromosManagerImpl::~PromosManagerImpl() = default;
+
+#pragma mark - Public
+
+void PromosManagerImpl::Init() {
+  if (!IsFullscreenPromosManagerEnabled())
+    return;
+
+  DCHECK(local_state_);
+
+  active_promos_ =
+      ActivePromos(local_state_->GetList(prefs::kIosPromosManagerActivePromos));
+  single_display_active_promos_ = ActivePromos(
+      local_state_->GetList(prefs::kIosPromosManagerSingleDisplayActivePromos));
+  impression_history_ = ImpressionHistory(
+      local_state_->GetList(prefs::kIosPromosManagerImpressions));
+}
+
+// Impression history should grow in sorted order. Given this happens on the
+// main thread, appending to the end of the impression history list is
+// sufficient.
+void PromosManagerImpl::RecordImpression(promos_manager::Promo promo) {
+  DCHECK(local_state_);
+
+  base::Value::Dict impression;
+  impression.Set(promos_manager::kImpressionPromoKey,
+                 promos_manager::NameForPromo(promo));
+  impression.Set(promos_manager::kImpressionDayKey, TodaysDay());
+
+  ScopedListPrefUpdate update(local_state_,
+                              prefs::kIosPromosManagerImpressions);
+  update->Append(std::move(impression));
+
+  impression_history_ = ImpressionHistory(
+      local_state_->GetList(prefs::kIosPromosManagerImpressions));
+
+  // Auto-deregister `promo` if it's a single-display promo.
+  if (single_display_active_promos_.find(promo) !=
+      single_display_active_promos_.end()) {
+    DeregisterPromo(promo);
+  }
+}
+
+void PromosManagerImpl::RegisterPromoForContinuousDisplay(
+    promos_manager::Promo promo) {
+  ConditionallyAppendPromoToPrefList(
+      promo, prefs::kIosPromosManagerActivePromos, local_state_);
+
+  active_promos_ =
+      ActivePromos(local_state_->GetList(prefs::kIosPromosManagerActivePromos));
+}
+
+void PromosManagerImpl::RegisterPromoForSingleDisplay(
+    promos_manager::Promo promo) {
+  ConditionallyAppendPromoToPrefList(
+      promo, prefs::kIosPromosManagerSingleDisplayActivePromos, local_state_);
+
+  single_display_active_promos_ = ActivePromos(
+      local_state_->GetList(prefs::kIosPromosManagerSingleDisplayActivePromos));
+}
+
+void PromosManagerImpl::DeregisterPromo(promos_manager::Promo promo) {
+  DCHECK(local_state_);
+
+  ScopedListPrefUpdate active_promos_update(
+      local_state_, prefs::kIosPromosManagerActivePromos);
+  ScopedListPrefUpdate single_display_promos_update(
+      local_state_, prefs::kIosPromosManagerSingleDisplayActivePromos);
+
+  base::Value::List& active_promos = active_promos_update.Get();
+  base::Value::List& single_display_promos = single_display_promos_update.Get();
+
+  std::string promo_name = promos_manager::NameForPromo(promo);
+
+  // Erase `promo_name` from the single-display and continuous-display active
+  // promos lists.
+  active_promos.EraseValue(base::Value(promo_name));
+  single_display_promos.EraseValue(base::Value(promo_name));
+
+  active_promos_ =
+      ActivePromos(local_state_->GetList(prefs::kIosPromosManagerActivePromos));
+  single_display_active_promos_ = ActivePromos(
+      local_state_->GetList(prefs::kIosPromosManagerSingleDisplayActivePromos));
+}
+
+void PromosManagerImpl::InitializePromoImpressionLimits(
+    base::small_map<std::map<promos_manager::Promo, NSArray<ImpressionLimit*>*>>
+        promo_impression_limits) {
+  promo_impression_limits_ = std::move(promo_impression_limits);
+}
+
+absl::optional<promos_manager::Promo> PromosManagerImpl::NextPromoForDisplay()
+    const {
+  // Construct a superset including active (1) single-display and
+  // (2) continuous-display promo campaigns.
+  std::set<promos_manager::Promo> all_active_promos(active_promos_);
+
+  // Non-destructively insert the single-display promos into
+  // `all_active_promos`.
+  all_active_promos.insert(single_display_active_promos_.begin(),
+                           single_display_active_promos_.end());
+
+  std::vector<promos_manager::Promo> least_recently_shown_promos =
+      LeastRecentlyShown(all_active_promos, impression_history_);
+
+  if (least_recently_shown_promos.empty())
+    return absl::nullopt;
+
+  for (promos_manager::Promo promo : least_recently_shown_promos)
+    if (CanShowPromo(promo, impression_history_))
+      return promo;
+
+  return absl::nullopt;
+}
+
+#pragma mark - Private
+
+std::vector<promos_manager::Impression> PromosManagerImpl::ImpressionHistory(
+    const base::Value::List& stored_impression_history) {
+  std::vector<promos_manager::Impression> impression_history;
+
+  for (size_t i = 0; i < stored_impression_history.size(); ++i) {
+    const base::Value::Dict& stored_impression =
+        stored_impression_history[i].GetDict();
+    const std::string* stored_promo =
+        stored_impression.FindString(promos_manager::kImpressionPromoKey);
+    absl::optional<int> stored_day =
+        stored_impression.FindInt(promos_manager::kImpressionDayKey);
+
+    // Skip malformed impression history. (This should almost never happen.)
+    if (!stored_promo || !stored_day.has_value())
+      continue;
+
+    absl::optional<promos_manager::Promo> promo =
+        promos_manager::PromoForName(*stored_promo);
+
+    // Skip malformed impression history. (This should almost never happen.)
+    if (!promo.has_value())
+      continue;
+
+    impression_history.push_back(
+        promos_manager::Impression(promo.value(), stored_day.value()));
+  }
+
+  return impression_history;
+}
+
+std::set<promos_manager::Promo> PromosManagerImpl::ActivePromos(
+    const base::Value::List& stored_active_promos) {
+  std::set<promos_manager::Promo> active_promos;
+
+  for (size_t i = 0; i < stored_active_promos.size(); ++i) {
+    absl::optional<promos_manager::Promo> promo =
+        promos_manager::PromoForName(stored_active_promos[i].GetString());
+
+    // Skip malformed active promos data. (This should almost never happen.)
+    if (!promo.has_value())
+      continue;
+
+    active_promos.insert(promo.value());
+  }
+
+  return active_promos;
+}
+
+NSArray<ImpressionLimit*>* PromosManagerImpl::PromoImpressionLimits(
+    promos_manager::Promo promo) const {
+  auto it = promo_impression_limits_.find(promo);
+
+  if (it == promo_impression_limits_.end())
+    return @[];
+
+  return it->second;
+}
+
+NSArray<ImpressionLimit*>* PromosManagerImpl::GlobalImpressionLimits() const {
+  static NSArray<ImpressionLimit*>* limits;
+  static dispatch_once_t onceToken;
+
+  if (IsSkippingInternalImpressionLimitsEnabled()) {
+    return limits;
+  }
+
+  dispatch_once(&onceToken, ^{
+    ImpressionLimit* onceEveryTwoDays =
+        [[ImpressionLimit alloc] initWithLimit:1 forNumDays:2];
+    ImpressionLimit* thricePerWeek = [[ImpressionLimit alloc] initWithLimit:3
+                                                                 forNumDays:7];
+    limits = @[ onceEveryTwoDays, thricePerWeek ];
+  });
+
+  return limits;
+}
+
+NSArray<ImpressionLimit*>* PromosManagerImpl::GlobalPerPromoImpressionLimits()
+    const {
+  static NSArray<ImpressionLimit*>* limits;
+  static dispatch_once_t onceToken;
+
+  if (IsSkippingInternalImpressionLimitsEnabled()) {
+    return limits;
+  }
+
+  dispatch_once(&onceToken, ^{
+    ImpressionLimit* oncePerMonth = [[ImpressionLimit alloc] initWithLimit:1
+                                                                forNumDays:30];
+    limits = @[ oncePerMonth ];
+  });
+
+  return limits;
+}
+
+bool PromosManagerImpl::AnyImpressionLimitTriggered(
+    int impression_count,
+    int window_days,
+    NSArray<ImpressionLimit*>* impression_limits) const {
+  for (ImpressionLimit* impression_limit in impression_limits) {
+    if (window_days < impression_limit.numDays &&
+        impression_count >= impression_limit.numImpressions)
+      return true;
+  }
+
+  return false;
+}
+
+bool PromosManagerImpl::CanShowPromo(
+    promos_manager::Promo promo,
+    const std::vector<promos_manager::Impression>& sorted_impressions) const {
+  // Maintains a map ([promos_manager::Promo] : [current impression count]) for
+  // evaluating against GlobalImpressionLimits(),
+  // GlobalPerPromoImpressionLimits(), and, if defined, `promo`-specific
+  // impression limits
+  std::map<promos_manager::Promo, int> promo_impression_counts;
+
+  NSArray<ImpressionLimit*>* promo_impression_limits =
+      PromoImpressionLimits(promo);
+  NSArray<ImpressionLimit*>* global_per_promo_impression_limits =
+      GlobalPerPromoImpressionLimits();
+  NSArray<ImpressionLimit*>* global_impression_limits =
+      GlobalImpressionLimits();
+
+  int window_start = TodaysDay();
+  int window_end =
+      (window_start - promos_manager::kNumDaysImpressionHistoryStored) + 1;
+  size_t curr_impression_index = 0;
+
+  // Impression limits are defined by a certain number of impressions
+  // (int) within a certain window of days (int).
+  //
+  // This loop starts at TodaysDay() (today) and grows a window, day-by-day, to
+  // check against different impression limits.
+  //
+  // Depending on the size of the window, impression limits may become valid or
+  // invalid. For example, if the window covers 7 days, an impression limit of
+  // 2-day scope is no longer valid. However, if window covered 1-2 days, an
+  // impression limit of 2-day scope is valid.
+  for (int curr_day = window_start; curr_day >= window_end; --curr_day) {
+    if (curr_impression_index < sorted_impressions.size()) {
+      promos_manager::Impression curr_impression =
+          sorted_impressions[curr_impression_index];
+      // If the current impression matches the current day, add it to
+      // `promo_impression_counts`.
+      if (curr_impression.day == curr_day) {
+        promo_impression_counts[curr_impression.promo]++;
+        curr_impression_index++;
+      } else {
+        // Only check impression limits when counts are incremented: if an
+        // impression limit were to be triggered below - but counts weren't
+        // incremented above - it wouldve've already been triggered in a
+        // previous loop run.
+        continue;
+      }
+    }
+
+    int window_days = window_start - curr_day;
+    int promo_impression_count = promo_impression_counts[promo];
+    int most_seen_promo_impression_count =
+        MaxImpressionCount(promo_impression_counts);
+    int total_impression_count = TotalImpressionCount(promo_impression_counts);
+
+    if (AnyImpressionLimitTriggered(promo_impression_count, window_days,
+                                    promo_impression_limits) ||
+        AnyImpressionLimitTriggered(most_seen_promo_impression_count,
+                                    window_days,
+                                    global_per_promo_impression_limits) ||
+        AnyImpressionLimitTriggered(total_impression_count, window_days,
+                                    global_impression_limits))
+      return false;
+  }
+
+  return true;
+}
+
+std::vector<int> PromosManagerImpl::ImpressionCounts(
+    std::map<promos_manager::Promo, int>& promo_impression_counts) const {
+  std::vector<int> counts;
+
+  for (const auto& [promo, count] : promo_impression_counts)
+    counts.push_back(count);
+
+  return counts;
+}
+
+int PromosManagerImpl::MaxImpressionCount(
+    std::map<promos_manager::Promo, int>& promo_impression_counts) const {
+  std::vector<int> counts = ImpressionCounts(promo_impression_counts);
+  std::vector<int>::iterator max_count_iter =
+      std::max_element(counts.begin(), counts.end());
+  size_t index = std::distance(counts.begin(), max_count_iter);
+  if (index < counts.size())
+    return counts[index];
+  return 0;
+}
+
+int PromosManagerImpl::TotalImpressionCount(
+    std::map<promos_manager::Promo, int>& promo_impression_counts) const {
+  std::vector<int> counts = ImpressionCounts(promo_impression_counts);
+
+  return std::accumulate(counts.begin(), counts.end(), 0);
+}
+
+std::vector<promos_manager::Promo> PromosManagerImpl::LeastRecentlyShown(
+    const std::set<promos_manager::Promo>& active_promos,
+    const std::vector<promos_manager::Impression>& sorted_impressions) const {
+  std::vector<promos_manager::Promo>
+      active_promos_sorted_by_least_recently_shown;
+
+  // If there are no active promos, and no impression history, return an empty
+  // array. (This is seldom expected to happen, if ever, as Promos Manager will
+  // launch with promos_manager::Promo::DefaultBrowser continuously running.)
+  if (active_promos.empty() && sorted_impressions.empty())
+    return active_promos_sorted_by_least_recently_shown;
+
+  for (promos_manager::Impression impression : sorted_impressions) {
+    // The resulting, sorted array only needs to contain the active promos. Once
+    // all active promos are accounted for in
+    // `active_promos_sorted_by_least_recently_shown`, we can short-circuit and
+    // return `active_promos_sorted_by_least_recently_shown`.
+    if (active_promos_sorted_by_least_recently_shown.size() ==
+        active_promos.size())
+      break;
+
+    // If the current impression's promo already exists in
+    // `active_promos_sorted_by_least_recently_shown`, move onto the next
+    // impression.
+    if (base::Contains(active_promos_sorted_by_least_recently_shown,
+                       impression.promo)) {
+      continue;
+    }
+
+    if (active_promos.count(impression.promo))
+      active_promos_sorted_by_least_recently_shown.push_back(impression.promo);
+  }
+
+  // It's possible some active promos have never been seen (so no impressions
+  // exist for the promo). In that case, add them to the end of the resulting
+  // array, before the array is reversed. Those never-before-seen promos will
+  // end up at the front of the resulting array after reversal.
+  //
+  // Never-before-seen promos are considered less recently seen than previously
+  // seen promos.
+  for (promos_manager::Promo unseen_promo : active_promos) {
+    if (!base::Contains(active_promos_sorted_by_least_recently_shown,
+                        unseen_promo)) {
+      active_promos_sorted_by_least_recently_shown.push_back(unseen_promo);
+    }
+  }
+
+  std::reverse(active_promos_sorted_by_least_recently_shown.begin(),
+               active_promos_sorted_by_least_recently_shown.end());
+
+  return active_promos_sorted_by_least_recently_shown;
+}
diff --git a/ios/chrome/browser/promos_manager/promos_manager_unittest.mm b/ios/chrome/browser/promos_manager/promos_manager_impl_unittest.mm
similarity index 90%
rename from ios/chrome/browser/promos_manager/promos_manager_unittest.mm
rename to ios/chrome/browser/promos_manager/promos_manager_impl_unittest.mm
index 8efc1130..1f3ec78b 100644
--- a/ios/chrome/browser/promos_manager/promos_manager_unittest.mm
+++ b/ios/chrome/browser/promos_manager/promos_manager_impl_unittest.mm
@@ -2,8 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#import "ios/chrome/browser/promos_manager/promos_manager_unittest.h"
-
 #import <Foundation/Foundation.h>
 #import <set>
 #import <vector>
@@ -18,6 +16,7 @@
 #import "ios/chrome/browser/promos_manager/impression_limit.h"
 #import "ios/chrome/browser/promos_manager/promo.h"
 #import "ios/chrome/browser/promos_manager/promos_manager.h"
+#import "ios/chrome/browser/promos_manager/promos_manager_impl.h"
 #import "testing/platform_test.h"
 #import "third_party/abseil-cpp/absl/types/optional.h"
 
@@ -35,12 +34,38 @@
 
 }  // namespace
 
-PromosManagerTest::PromosManagerTest() {
+class PromosManagerImplTest : public PlatformTest {
+ public:
+  PromosManagerImplTest();
+  ~PromosManagerImplTest() override;
+
+  // Creates a mock promo without impression limits.
+  Promo* TestPromo();
+
+  // Creates a mock promo with impression limits.
+  Promo* TestPromoWithImpressionLimits();
+
+  // Creates mock impression limits.
+  NSArray<ImpressionLimit*>* TestImpressionLimits();
+
+ protected:
+  // Creates PromosManager with empty pref data.
+  void CreatePromosManager();
+
+  // Create pref registry for tests.
+  void CreatePrefs();
+
+  std::unique_ptr<TestingPrefServiceSimple> local_state_;
+  std::unique_ptr<PromosManagerImpl> promos_manager_;
+  base::test::ScopedFeatureList scoped_feature_list_;
+};
+
+PromosManagerImplTest::PromosManagerImplTest() {
   scoped_feature_list_.InitWithFeatures({kFullscreenPromosManager}, {});
 }
-PromosManagerTest::~PromosManagerTest() {}
+PromosManagerImplTest::~PromosManagerImplTest() {}
 
-NSArray<ImpressionLimit*>* PromosManagerTest::TestImpressionLimits() {
+NSArray<ImpressionLimit*>* PromosManagerImplTest::TestImpressionLimits() {
   static NSArray<ImpressionLimit*>* limits;
   static dispatch_once_t onceToken;
 
@@ -55,23 +80,23 @@
   return limits;
 }
 
-Promo* PromosManagerTest::TestPromo() {
+Promo* PromosManagerImplTest::TestPromo() {
   return [[Promo alloc] initWithIdentifier:promos_manager::Promo::Test];
 }
 
-Promo* PromosManagerTest::TestPromoWithImpressionLimits() {
+Promo* PromosManagerImplTest::TestPromoWithImpressionLimits() {
   return [[Promo alloc] initWithIdentifier:promos_manager::Promo::Test
                        andImpressionLimits:TestImpressionLimits()];
 }
 
-void PromosManagerTest::CreatePromosManager() {
+void PromosManagerImplTest::CreatePromosManager() {
   CreatePrefs();
-  promos_manager_ = std::make_unique<PromosManager>(local_state_.get());
+  promos_manager_ = std::make_unique<PromosManagerImpl>(local_state_.get());
   promos_manager_->Init();
 }
 
 // Create pref registry for tests.
-void PromosManagerTest::CreatePrefs() {
+void PromosManagerImplTest::CreatePrefs() {
   local_state_ = std::make_unique<TestingPrefServiceSimple>();
 
   local_state_->registry()->RegisterListPref(
@@ -82,9 +107,9 @@
       prefs::kIosPromosManagerSingleDisplayActivePromos);
 }
 
-// Tests the initializer correctly creates a PromosManager* with the
+// Tests the initializer correctly creates a PromosManagerImpl* with the
 // specified Pref service.
-TEST_F(PromosManagerTest, InitWithPrefService) {
+TEST_F(PromosManagerImplTest, InitWithPrefService) {
   CreatePromosManager();
 
   EXPECT_NE(local_state_->FindPreference(prefs::kIosPromosManagerImpressions),
@@ -102,45 +127,45 @@
 
 // Tests promos_manager::NameForPromo correctly returns the string
 // representation of a given promo.
-TEST_F(PromosManagerTest, ReturnsNameForTestPromo) {
+TEST_F(PromosManagerImplTest, ReturnsNameForTestPromo) {
   EXPECT_EQ(promos_manager::NameForPromo(promos_manager::Promo::Test),
             "promos_manager::Promo::Test");
 }
 
 // Tests promos_manager::PromoForName correctly returns the
 // promos_manager::Promo given its string name.
-TEST_F(PromosManagerTest, ReturnsTestPromoForName) {
+TEST_F(PromosManagerImplTest, ReturnsTestPromoForName) {
   EXPECT_EQ(promos_manager::PromoForName("promos_manager::Promo::Test"),
             promos_manager::Promo::Test);
 }
 
 // Tests promos_manager::PromoForName correctly returns absl::nullopt for bad
 // input.
-TEST_F(PromosManagerTest, ReturnsNulloptForBadName) {
+TEST_F(PromosManagerImplTest, ReturnsNulloptForBadName) {
   EXPECT_FALSE(promos_manager::PromoForName("promos_manager::Promo::FOOBAR")
                    .has_value());
 }
 
-// Tests PromosManagerTest::TestPromo() correctly creates one mock promo.
-TEST_F(PromosManagerTest, CreatesPromo) {
+// Tests PromosManagerImplTest::TestPromo() correctly creates one mock promo.
+TEST_F(PromosManagerImplTest, CreatesPromo) {
   Promo* promo = TestPromo();
 
   EXPECT_NE(promo, nil);
   EXPECT_EQ((int)promo.impressionLimits.count, 0);
 }
 
-// Tests PromosManagerTest::TestPromoWithImpressionLimits() correctly creates
-// one mock promo with mock impression limits.
-TEST_F(PromosManagerTest, CreatesPromoWithImpressionLimits) {
+// Tests PromosManagerImplTest::TestPromoWithImpressionLimits() correctly
+// creates one mock promo with mock impression limits.
+TEST_F(PromosManagerImplTest, CreatesPromoWithImpressionLimits) {
   Promo* promoWithImpressionLimits = TestPromoWithImpressionLimits();
 
   EXPECT_NE(promoWithImpressionLimits, nil);
   EXPECT_EQ((int)promoWithImpressionLimits.impressionLimits.count, 2);
 }
 
-// Tests PromosManagerTest::TestImpressionLimits() correctly creates two mock
-// impression limits.
-TEST_F(PromosManagerTest, CreatesImpressionLimits) {
+// Tests PromosManagerImplTest::TestImpressionLimits() correctly creates two
+// mock impression limits.
+TEST_F(PromosManagerImplTest, CreatesImpressionLimits) {
   NSArray<ImpressionLimit*>* impressionLimits = TestImpressionLimits();
 
   EXPECT_NE(impressionLimits, nil);
@@ -152,7 +177,7 @@
 
 // Tests PromosManager::ImpressionCounts() correctly returns a counts list from
 // an impression counts map.
-TEST_F(PromosManagerTest, ReturnsImpressionCounts) {
+TEST_F(PromosManagerImplTest, ReturnsImpressionCounts) {
   std::map<promos_manager::Promo, int> promo_impression_counts = {
       {promos_manager::Promo::Test, 3},
       {promos_manager::Promo::AppStoreRating, 1},
@@ -167,7 +192,7 @@
 
 // Tests PromosManager::ImpressionCounts() correctly returns an empty counts
 // list for an empty impression counts map.
-TEST_F(PromosManagerTest, ReturnsEmptyImpressionCounts) {
+TEST_F(PromosManagerImplTest, ReturnsEmptyImpressionCounts) {
   std::map<promos_manager::Promo, int> promo_impression_counts;
   std::vector<int> counts;
 
@@ -176,7 +201,7 @@
 
 // Tests PromosManager::TotalImpressionCount() correctly adds the counts of
 // different promos from an impression counts map.
-TEST_F(PromosManagerTest, ReturnsTotalImpressionCount) {
+TEST_F(PromosManagerImplTest, ReturnsTotalImpressionCount) {
   std::map<promos_manager::Promo, int> promo_impression_counts = {
       {promos_manager::Promo::Test, 3},
       {promos_manager::Promo::AppStoreRating, 1},
@@ -190,7 +215,7 @@
 
 // Tests PromosManager::TotalImpressionCount() returns zero for an empty
 // impression counts map.
-TEST_F(PromosManagerTest, ReturnsZeroForTotalImpressionCount) {
+TEST_F(PromosManagerImplTest, ReturnsZeroForTotalImpressionCount) {
   std::map<promos_manager::Promo, int> promo_impression_counts;
 
   EXPECT_EQ(promos_manager_->TotalImpressionCount(promo_impression_counts), 0);
@@ -198,7 +223,7 @@
 
 // Tests PromosManager::MaxImpressionCount() correctly returns the max
 // impression count from an impression counts map.
-TEST_F(PromosManagerTest, ReturnsMaxImpressionCount) {
+TEST_F(PromosManagerImplTest, ReturnsMaxImpressionCount) {
   std::map<promos_manager::Promo, int> promo_impression_counts = {
       {promos_manager::Promo::Test, 3},
       {promos_manager::Promo::AppStoreRating, 1},
@@ -211,7 +236,7 @@
 
 // Tests PromosManager::MaxImpressionCount() correctly returns zero for an empty
 // impression counts map.
-TEST_F(PromosManagerTest, ReturnsZeroForMaxImpressionCount) {
+TEST_F(PromosManagerImplTest, ReturnsZeroForMaxImpressionCount) {
   std::map<promos_manager::Promo, int> promo_impression_counts;
 
   EXPECT_EQ(promos_manager_->MaxImpressionCount(promo_impression_counts), 0);
@@ -219,7 +244,7 @@
 
 // Tests PromosManager::AnyImpressionLimitTriggered() correctly detects an
 // impression limit is triggered.
-TEST_F(PromosManagerTest, DetectsSingleImpressionLimitTriggered) {
+TEST_F(PromosManagerImplTest, DetectsSingleImpressionLimitTriggered) {
   ImpressionLimit* thricePerWeek = [[ImpressionLimit alloc] initWithLimit:3
                                                                forNumDays:7];
   NSArray<ImpressionLimit*>* limits = @[
@@ -236,7 +261,7 @@
 
 // Tests PromosManager::AnyImpressionLimitTriggered() correctly detects an
 // impression limit is triggered over multiple impression limits.
-TEST_F(PromosManagerTest, DetectsOneOfMultipleImpressionLimitsTriggered) {
+TEST_F(PromosManagerImplTest, DetectsOneOfMultipleImpressionLimitsTriggered) {
   ImpressionLimit* onceEveryTwoDays = [[ImpressionLimit alloc] initWithLimit:1
                                                                   forNumDays:2];
   ImpressionLimit* thricePerWeek = [[ImpressionLimit alloc] initWithLimit:3
@@ -254,7 +279,7 @@
 
 // Tests PromosManager::AnyImpressionLimitTriggered() correctly detects no
 // impression limits are triggered.
-TEST_F(PromosManagerTest, DetectsNoImpressionLimitTriggered) {
+TEST_F(PromosManagerImplTest, DetectsNoImpressionLimitTriggered) {
   ImpressionLimit* onceEveryTwoDays = [[ImpressionLimit alloc] initWithLimit:1
                                                                   forNumDays:2];
   ImpressionLimit* thricePerWeek = [[ImpressionLimit alloc] initWithLimit:3
@@ -269,7 +294,7 @@
 
 // Tests PromosManager::CanShowPromo() correctly allows a promo to be shown
 // because it hasn't met any impression limits.
-TEST_F(PromosManagerTest, DecidesCanShowPromo) {
+TEST_F(PromosManagerImplTest, DecidesCanShowPromo) {
   CreatePromosManager();
 
   const std::vector<promos_manager::Impression> zeroImpressions = {};
@@ -280,7 +305,7 @@
 
 // Tests PromosManager::CanShowPromo() correctly denies promos from being shown
 // as they've triggered impression limits.
-TEST_F(PromosManagerTest, DecidesCannotShowPromo) {
+TEST_F(PromosManagerImplTest, DecidesCannotShowPromo) {
   CreatePromosManager();
 
   int today = TodaysDay();
@@ -316,7 +341,7 @@
 
 // Tests PromosManager::LeastRecentlyShown() correctly returns a list of active
 // promos sorted by least recently shown.
-TEST_F(PromosManagerTest, ReturnsLeastRecentlyShown) {
+TEST_F(PromosManagerImplTest, ReturnsLeastRecentlyShown) {
   const std::set<promos_manager::Promo> active_promos = {
       promos_manager::Promo::Test,
       promos_manager::Promo::CredentialProviderExtension,
@@ -350,7 +375,7 @@
 // Tests PromosManager::LeastRecentlyShown() correctly returns a list of
 // active / promos sorted by least recently shown (with some impressions /
 // belonging to inactive promo campaigns).
-TEST_F(PromosManagerTest, ReturnsLeastRecentlyShownWithSomeInactivePromos) {
+TEST_F(PromosManagerImplTest, ReturnsLeastRecentlyShownWithSomeInactivePromos) {
   const std::set<promos_manager::Promo> active_promos = {
       promos_manager::Promo::Test,
       promos_manager::Promo::AppStoreRating,
@@ -379,7 +404,7 @@
 
 // Tests PromosManager::LeastRecentlyShown() gracefully returns a list of
 // active / promos when multiple promos are tied for least recently shown.
-TEST_F(PromosManagerTest, ReturnsLeastRecentlyShownBreakingTies) {
+TEST_F(PromosManagerImplTest, ReturnsLeastRecentlyShownBreakingTies) {
   const std::set<promos_manager::Promo> active_promos = {
       promos_manager::Promo::Test,
       promos_manager::Promo::CredentialProviderExtension,
@@ -411,7 +436,7 @@
 // Tests PromosManager::LeastRecentlyShown() gracefully returns a single promo
 // in a list when the impression history contains only one active promo
 // campaign.
-TEST_F(PromosManagerTest, ReturnsLeastRecentlyShownWithOnlyOnePromoActive) {
+TEST_F(PromosManagerImplTest, ReturnsLeastRecentlyShownWithOnlyOnePromoActive) {
   const std::set<promos_manager::Promo> active_promos = {
       promos_manager::Promo::Test,
   };
@@ -438,7 +463,7 @@
 
 // Tests PromosManager::LeastRecentlyShown() gracefully returns an empty array
 // when there are no active promo campaigns.
-TEST_F(PromosManagerTest,
+TEST_F(PromosManagerImplTest,
        ReturnsEmptyListWhenLeastRecentlyShownHasNoActivePromoCampaigns) {
   const std::set<promos_manager::Promo> active_promos;
 
@@ -462,7 +487,7 @@
 
 // Tests PromosManager::LeastRecentlyShown() gracefully returns an empty array
 // when no impression history and no active promos exist.
-TEST_F(PromosManagerTest,
+TEST_F(PromosManagerImplTest,
        ReturnsEmptyListWhenLeastRecentlyShownHasNoImpressionHistory) {
   const std::set<promos_manager::Promo> active_promos;
   const std::vector<promos_manager::Impression> impressions;
@@ -474,7 +499,7 @@
 
 // Tests PromosManager::LeastRecentlyShown() sorts unshown promos before shown
 // promos.
-TEST_F(PromosManagerTest,
+TEST_F(PromosManagerImplTest,
        SortsUnshownPromosBeforeShownPromosForLeastRecentlyShown) {
   const std::set<promos_manager::Promo> active_promos = {
       promos_manager::Promo::Test,
@@ -505,7 +530,7 @@
 // Tests PromosManager::ImpressionHistory() correctly ingests impression history
 // (base::Value::List) and returns corresponding
 // std::vector<promos_manager::Impression>.
-TEST_F(PromosManagerTest, ReturnsImpressionHistory) {
+TEST_F(PromosManagerImplTest, ReturnsImpressionHistory) {
   int today = TodaysDay();
 
   base::Value::Dict first_impression;
@@ -543,7 +568,7 @@
 // Tests PromosManager::ImpressionHistory() correctly ingests empty impression
 // history (base::Value::List) and returns empty
 // std::vector<promos_manager::Impression>.
-TEST_F(PromosManagerTest, ReturnsBlankImpressionHistoryForBlankPrefs) {
+TEST_F(PromosManagerImplTest, ReturnsBlankImpressionHistoryForBlankPrefs) {
   base::Value::List impressions;
 
   std::vector<promos_manager::Impression> result =
@@ -555,7 +580,8 @@
 // Tests PromosManager::ImpressionHistory() correctly ingests impression history
 // with malformed data (base::Value::List) and returns corresponding
 // std::vector<promos_manager::Impression> without malformed entries.
-TEST_F(PromosManagerTest, ReturnsImpressionHistoryBySkippingMalformedEntries) {
+TEST_F(PromosManagerImplTest,
+       ReturnsImpressionHistoryBySkippingMalformedEntries) {
   int today = TodaysDay();
 
   base::Value::Dict first_impression;
@@ -588,7 +614,7 @@
 // Tests PromosManager::ActivePromos() correctly ingests active promos
 // (base::Value::List) and returns corresponding
 // std::vector<promos_manager::Promo>.
-TEST_F(PromosManagerTest, ReturnsActivePromos) {
+TEST_F(PromosManagerImplTest, ReturnsActivePromos) {
   base::Value::List promos;
   promos.Append("promos_manager::Promo::DefaultBrowser");
   promos.Append("promos_manager::Promo::AppStoreRating");
@@ -608,7 +634,7 @@
 
 // Tests PromosManager::ActivePromos() correctly ingests empty active promos
 // (base::Value::List) and returns empty std::set<promos_manager::Promo>.
-TEST_F(PromosManagerTest, ReturnsBlankActivePromosForBlankPrefs) {
+TEST_F(PromosManagerImplTest, ReturnsBlankActivePromosForBlankPrefs) {
   base::Value::List promos;
 
   std::set<promos_manager::Promo> result =
@@ -620,7 +646,7 @@
 // Tests PromosManager::ActivePromos() correctly ingests active promos with
 // malformed data (base::Value::List) and returns corresponding
 // std::vector<promos_manager::Promo> with malformed entries pruned.
-TEST_F(PromosManagerTest, ReturnsActivePromosAndSkipsMalformedData) {
+TEST_F(PromosManagerImplTest, ReturnsActivePromosAndSkipsMalformedData) {
   base::Value::List promos;
   promos.Append("promos_manager::Promo::DefaultBrowser");
   promos.Append("promos_manager::Promo::AppStoreRating");
@@ -640,7 +666,7 @@
 // Tests PromosManager::RegisterPromoForContinuousDisplay() correctly registers
 // a promo for continuous display by writing the promo's name to the pref
 // `kIosPromosManagerActivePromos`.
-TEST_F(PromosManagerTest, RegistersPromoForContinuousDisplay) {
+TEST_F(PromosManagerImplTest, RegistersPromoForContinuousDisplay) {
   CreatePromosManager();
   EXPECT_TRUE(
       local_state_->GetList(prefs::kIosPromosManagerActivePromos).empty());
@@ -674,7 +700,7 @@
 // a promo for continuous display by writing the promo's name to the pref
 // `kIosPromosManagerActivePromos` and immediately updates active_promos_ to
 // reflect the new state.
-TEST_F(PromosManagerTest,
+TEST_F(PromosManagerImplTest,
        RegistersPromoForContinuousDisplayAndImmediatelyUpdateVariables) {
   CreatePromosManager();
   EXPECT_TRUE(
@@ -697,7 +723,7 @@
 // Tests PromosManager::RegisterPromoForContinuousDisplay() correctly registers
 // a promo—for the very first time—for continuous display by writing the
 // promo's name to the pref `kIosPromosManagerActivePromos`.
-TEST_F(PromosManagerTest,
+TEST_F(PromosManagerImplTest,
        RegistersPromoForContinuousDisplayForEmptyActivePromos) {
   CreatePromosManager();
   EXPECT_TRUE(
@@ -717,7 +743,8 @@
 // an already-registered promo for continuous display by first erasing, and then
 // re-writing, the promo's name to the pref `kIosPromosManagerActivePromos`;
 // tests no duplicate entries are created.
-TEST_F(PromosManagerTest, RegistersAlreadyRegisteredPromoForContinuousDisplay) {
+TEST_F(PromosManagerImplTest,
+       RegistersAlreadyRegisteredPromoForContinuousDisplay) {
   CreatePromosManager();
   EXPECT_TRUE(
       local_state_->GetList(prefs::kIosPromosManagerActivePromos).empty());
@@ -749,7 +776,7 @@
 // first erasing, and then re-writing, the promo's name to the pref
 // `kIosPromosManagerActivePromos`; tests no duplicate entries are created.
 TEST_F(
-    PromosManagerTest,
+    PromosManagerImplTest,
     RegistersAlreadyRegisteredPromoForContinuousDisplayForEmptyActivePromos) {
   CreatePromosManager();
   EXPECT_TRUE(
@@ -773,7 +800,7 @@
 // Tests PromosManager::RegisterPromoForSingleDisplay() correctly registers
 // a promo for single display by writing the promo's name to the pref
 // `kIosPromosManagerSingleDisplayActivePromos`.
-TEST_F(PromosManagerTest, RegistersPromoForSingleDisplay) {
+TEST_F(PromosManagerImplTest, RegistersPromoForSingleDisplay) {
   CreatePromosManager();
   EXPECT_TRUE(
       local_state_->GetList(prefs::kIosPromosManagerSingleDisplayActivePromos)
@@ -815,7 +842,7 @@
 // a promo for single display by writing the promo's name to the pref
 // `kIosPromosManagerSingleDisplayActivePromos` and immediately updates
 // single_display_active_promos_ to reflect the new state.
-TEST_F(PromosManagerTest,
+TEST_F(PromosManagerImplTest,
        RegistersPromoForSingleDisplayAndImmediatelyUpdateVariables) {
   CreatePromosManager();
   EXPECT_TRUE(
@@ -839,7 +866,8 @@
 // Tests PromosManager::RegisterPromoForSingleDisplay() correctly registers
 // a promo for single display—for the very first time—by writing the promo's
 // name to the pref `kIosPromosManagerSingleDisplayActivePromos`.
-TEST_F(PromosManagerTest, RegistersPromoForSingleDisplayForEmptyActivePromos) {
+TEST_F(PromosManagerImplTest,
+       RegistersPromoForSingleDisplayForEmptyActivePromos) {
   CreatePromosManager();
   EXPECT_TRUE(
       local_state_->GetList(prefs::kIosPromosManagerSingleDisplayActivePromos)
@@ -863,7 +891,7 @@
 // re-writing, the promo's name to the pref
 // `kIosPromosManagerSingleDisplayActivePromos`; tests no duplicate entries are
 // created.
-TEST_F(PromosManagerTest, RegistersAlreadyRegisteredPromoForSingleDisplay) {
+TEST_F(PromosManagerImplTest, RegistersAlreadyRegisteredPromoForSingleDisplay) {
   CreatePromosManager();
   EXPECT_TRUE(
       local_state_->GetList(prefs::kIosPromosManagerSingleDisplayActivePromos)
@@ -902,7 +930,7 @@
 // first erasing, and then re-writing, the promo's name to the pref
 // `kIosPromosManagerSingleDisplayActivePromos`; tests no duplicate entries are
 // created.
-TEST_F(PromosManagerTest,
+TEST_F(PromosManagerImplTest,
        RegistersAlreadyRegisteredPromoForSingleDisplayForEmptyActivePromos) {
   CreatePromosManager();
   EXPECT_TRUE(
@@ -929,7 +957,7 @@
 
 // Tests PromosManager::InitializePromoImpressionLimits() correctly registers
 // promo-specific impression limits.
-TEST_F(PromosManagerTest, RegistersPromoSpecificImpressionLimits) {
+TEST_F(PromosManagerImplTest, RegistersPromoSpecificImpressionLimits) {
   CreatePromosManager();
 
   ImpressionLimit* onceEveryTwoDays = [[ImpressionLimit alloc] initWithLimit:1
@@ -962,7 +990,7 @@
 }
 
 // Tests PromosManager::RecordImpression() correctly records a new impression.
-TEST_F(PromosManagerTest, RecordsImpression) {
+TEST_F(PromosManagerImplTest, RecordsImpression) {
   CreatePromosManager();
   promos_manager_->RecordImpression(promos_manager::Promo::DefaultBrowser);
 
@@ -995,7 +1023,7 @@
 
 // Tests PromosManager::RecordImpression() correctly records a new impression
 // and immediately updates impression_history_ to reflect the new state
-TEST_F(PromosManagerTest, RecordsImpressionAndImmediatelyUpdateVariables) {
+TEST_F(PromosManagerImplTest, RecordsImpressionAndImmediatelyUpdateVariables) {
   CreatePromosManager();
 
   promos_manager_->RecordImpression(promos_manager::Promo::DefaultBrowser);
@@ -1008,7 +1036,7 @@
 
 // Tests PromosManager::DeregisterPromo() correctly deregisters a currently
 // active promo campaign.
-TEST_F(PromosManagerTest, DeregistersActivePromo) {
+TEST_F(PromosManagerImplTest, DeregistersActivePromo) {
   CreatePromosManager();
 
   EXPECT_EQ(local_state_->GetList(prefs::kIosPromosManagerActivePromos).size(),
@@ -1052,7 +1080,8 @@
 // Tests PromosManager::DeregisterPromo() correctly deregisters a currently
 // active promo campaign and immediately updates active_promos_ &
 // single_display_active_promos_ to reflect the new state.
-TEST_F(PromosManagerTest, DeregistersActivePromoAndImmediatelyUpdateVariables) {
+TEST_F(PromosManagerImplTest,
+       DeregistersActivePromoAndImmediatelyUpdateVariables) {
   CreatePromosManager();
 
   EXPECT_EQ(local_state_->GetList(prefs::kIosPromosManagerActivePromos).size(),
@@ -1083,7 +1112,7 @@
 
 // Tests PromosManager::DeregisterPromo() gracefully handles deregistration if
 // the promo doesn't exist in a given active promos list.
-TEST_F(PromosManagerTest, DeregistersNonExistentPromo) {
+TEST_F(PromosManagerImplTest, DeregistersNonExistentPromo) {
   CreatePromosManager();
 
   EXPECT_EQ(local_state_->GetList(prefs::kIosPromosManagerActivePromos).size(),
@@ -1116,7 +1145,7 @@
 
 // Tests a given single-display promo is automatically deregistered after its
 // impression is recorded.
-TEST_F(PromosManagerTest,
+TEST_F(PromosManagerImplTest,
        DeregistersSingleDisplayPromoAfterRecordedImpression) {
   CreatePromosManager();
 
diff --git a/ios/chrome/browser/promos_manager/promos_manager_unittest.h b/ios/chrome/browser/promos_manager/promos_manager_unittest.h
deleted file mode 100644
index 50fd1204..0000000
--- a/ios/chrome/browser/promos_manager/promos_manager_unittest.h
+++ /dev/null
@@ -1,43 +0,0 @@
-// Copyright 2022 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_UNITTEST_H_
-#define IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_UNITTEST_H_
-
-#import <Foundation/Foundation.h>
-
-#import "base/test/scoped_feature_list.h"
-#import "components/prefs/testing_pref_service.h"
-#import "ios/chrome/browser/promos_manager/impression_limit.h"
-#import "ios/chrome/browser/promos_manager/promo.h"
-#import "ios/chrome/browser/promos_manager/promos_manager.h"
-#import "testing/platform_test.h"
-
-class PromosManagerTest : public PlatformTest {
- public:
-  PromosManagerTest();
-  ~PromosManagerTest() override;
-
-  // Creates a mock promo without impression limits.
-  Promo* TestPromo();
-
-  // Creates a mock promo with impression limits.
-  Promo* TestPromoWithImpressionLimits();
-
-  // Creates mock impression limits.
-  NSArray<ImpressionLimit*>* TestImpressionLimits();
-
- protected:
-  // Creates PromosManager with empty pref data.
-  void CreatePromosManager();
-
-  // Create pref registry for tests.
-  void CreatePrefs();
-
-  std::unique_ptr<TestingPrefServiceSimple> local_state_;
-  std::unique_ptr<PromosManager> promos_manager_;
-  base::test::ScopedFeatureList scoped_feature_list_;
-};
-
-#endif  // IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_UNITTEST_H_
diff --git a/ios/chrome/browser/resources/Settings.bundle/Experimental.plist b/ios/chrome/browser/resources/Settings.bundle/Experimental.plist
index ac54acf..490aded 100644
--- a/ios/chrome/browser/resources/Settings.bundle/Experimental.plist
+++ b/ios/chrome/browser/resources/Settings.bundle/Experimental.plist
@@ -136,6 +136,26 @@
 		</dict>
 		<dict>
 			<key>Type</key>
+			<string>PSMultiValueSpecifier</string>
+			<key>Title</key>
+			<string>Force Promo</string>
+			<key>Key</key>
+			<string>NextPromoForDisplayOverride</string>
+			<key>DefaultValue</key>
+			<string></string>
+			<key>Values</key>
+			<array>
+				<string></string>
+				<string>promos_manager::Promo::AppStoreRating</string>
+			</array>
+			<key>Titles</key>
+			<array>
+				<string>Disabled (No Promos Forced)</string>
+				<string>App Store Rating</string>
+			</array>
+		</dict>
+		<dict>
+			<key>Type</key>
 			<string>PSGroupSpecifier</string>
 			<key>Title</key>
 			<string>Debug Settings</string>
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history.mm b/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history.mm
index 60150a3..4b8cbfa 100644
--- a/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history.mm
+++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/destination_usage_history/destination_usage_history.mm
@@ -36,20 +36,24 @@
 constexpr int kInitialBufferNumClicks = 3;  // clicks
 
 // The dictionary key used for storing rankings.
-const std::string kRankingKey = "ranking";
+const char kRankingKey[] = "ranking";
 
 // The default destinations ranking, based on statistical usage of the old
 // overflow menu.
-std::vector<overflow_menu::Destination> kDefaultRanking = {
-    overflow_menu::Destination::Bookmarks,
-    overflow_menu::Destination::History,
-    overflow_menu::Destination::ReadingList,
-    overflow_menu::Destination::Passwords,
-    overflow_menu::Destination::Downloads,
-    overflow_menu::Destination::RecentTabs,
-    overflow_menu::Destination::SiteInfo,
-    overflow_menu::Destination::Settings,
-};
+std::vector<overflow_menu::Destination> DefaultDestinationsRanking() {
+  std::vector<overflow_menu::Destination> default_ranking = {
+      overflow_menu::Destination::Bookmarks,
+      overflow_menu::Destination::History,
+      overflow_menu::Destination::ReadingList,
+      overflow_menu::Destination::Passwords,
+      overflow_menu::Destination::Downloads,
+      overflow_menu::Destination::RecentTabs,
+      overflow_menu::Destination::SiteInfo,
+      overflow_menu::Destination::Settings,
+  };
+
+  return default_ranking;
+}
 
 // The number of days since the Unix epoch; one day, in this context, runs from
 // UTC midnight to UTC midnight.
@@ -279,7 +283,10 @@
   const base::Value::Dict& history =
       self.prefService->GetDict(prefs::kOverflowMenuDestinationUsageHistory);
 
-  for (overflow_menu::Destination destination : kDefaultRanking) {
+  std::vector<overflow_menu::Destination> defaultRanking =
+      DefaultDestinationsRanking();
+
+  for (overflow_menu::Destination destination : defaultRanking) {
     const std::string path =
         today + "." + overflow_menu::StringNameForDestination(destination);
     update->SetByDottedPath(
@@ -331,14 +338,17 @@
 - (const base::Value::List)calculateNewRanking:
                                (const base::Value::List*)previousRanking
                       numAboveFoldDestinations:(int)numAboveFoldDestinations {
-  if (!previousRanking)
-    return List(kDefaultRanking);
+  if (!previousRanking) {
+    std::vector<overflow_menu::Destination> defaultRanking =
+        DefaultDestinationsRanking();
+
+    return List(defaultRanking);
+  }
 
   if (numAboveFoldDestinations >= static_cast<int>(previousRanking->size()))
     return previousRanking->Clone();
 
-  std::vector<overflow_menu::Destination> prevRanking =
-      previousRanking ? Vector(previousRanking) : kDefaultRanking;
+  std::vector<overflow_menu::Destination> prevRanking = Vector(previousRanking);
   std::vector<overflow_menu::Destination> newRanking =
       [self updatedRankWithCurrentRanking:prevRanking
                  numAboveFoldDestinations:numAboveFoldDestinations];
diff --git a/ios/chrome/browser/ui/promos_manager/BUILD.gn b/ios/chrome/browser/ui/promos_manager/BUILD.gn
index 61c1efa0..96b8960 100644
--- a/ios/chrome/browser/ui/promos_manager/BUILD.gn
+++ b/ios/chrome/browser/ui/promos_manager/BUILD.gn
@@ -61,6 +61,7 @@
     "//ios/chrome/app/strings",
     "//ios/chrome/browser",
     "//ios/chrome/browser/application_context",
+    "//ios/chrome/browser/flags:system_flags",
     "//ios/chrome/browser/main:public",
     "//ios/chrome/browser/promos_manager:constants",
     "//ios/chrome/browser/ui/app_store_rating",
diff --git a/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator_unittest.h b/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator_unittest.h
index fc61ee0..6ca687b 100644
--- a/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator_unittest.h
+++ b/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator_unittest.h
@@ -13,7 +13,6 @@
 #import "ios/chrome/browser/browser_state/test_chrome_browser_state.h"
 #import "ios/chrome/browser/main/test_browser.h"
 #import "ios/chrome/browser/prefs/pref_names.h"
-#import "ios/chrome/browser/promos_manager/promos_manager.h"
 #import "ios/chrome/browser/ui/promos_manager/promos_manager_coordinator.h"
 #import "ios/chrome/test/scoped_key_window.h"
 #import "testing/platform_test.h"
@@ -27,14 +26,10 @@
   // Creates PromosManagerCoordinator.
   void CreatePromosManagerCoordinator();
 
-  // Creates PromosManager with empty pref data.
-  void CreatePromosManager();
-
   // Create pref registry for tests.
   void CreatePrefs();
 
   std::unique_ptr<TestingPrefServiceSimple> local_state_;
-  std::unique_ptr<PromosManager> promos_manager_;
   base::test::ScopedFeatureList scoped_feature_list_;
   PromosManagerCoordinator* coordinator_;
   base::test::TaskEnvironment task_environment_;
diff --git a/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator_unittest.mm b/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator_unittest.mm
index 73ec13b..ef20970 100644
--- a/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator_unittest.mm
+++ b/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator_unittest.mm
@@ -15,7 +15,6 @@
 #import "ios/chrome/browser/main/test_browser.h"
 #import "ios/chrome/browser/prefs/pref_names.h"
 #import "ios/chrome/browser/promos_manager/features.h"
-#import "ios/chrome/browser/promos_manager/promos_manager.h"
 #import "ios/chrome/browser/ui/promos_manager/bannered_promo_view_provider.h"
 #import "ios/chrome/browser/ui/promos_manager/promos_manager_coordinator+internal.h"
 #import "ios/chrome/browser/ui/promos_manager/standard_promo_action_handler.h"
@@ -40,19 +39,13 @@
 PromosManagerCoordinatorTest::~PromosManagerCoordinatorTest() {}
 
 void PromosManagerCoordinatorTest::CreatePromosManagerCoordinator() {
-  CreatePromosManager();
+  CreatePrefs();
 
   coordinator_ = [[PromosManagerCoordinator alloc]
       initWithBaseViewController:view_controller_
                          browser:browser_.get()];
 }
 
-void PromosManagerCoordinatorTest::CreatePromosManager() {
-  CreatePrefs();
-  promos_manager_ = std::make_unique<PromosManager>(local_state_.get());
-  promos_manager_->Init();
-}
-
 // Create pref registry for tests.
 void PromosManagerCoordinatorTest::CreatePrefs() {
   local_state_ = std::make_unique<TestingPrefServiceSimple>();
diff --git a/ios/chrome/browser/ui/promos_manager/promos_manager_mediator.mm b/ios/chrome/browser/ui/promos_manager/promos_manager_mediator.mm
index 3be27a11..2961de6 100644
--- a/ios/chrome/browser/ui/promos_manager/promos_manager_mediator.mm
+++ b/ios/chrome/browser/ui/promos_manager/promos_manager_mediator.mm
@@ -8,6 +8,8 @@
 #import <map>
 
 #import "base/containers/small_map.h"
+#import "base/strings/sys_string_conversions.h"
+#import "ios/chrome/browser/flags/system_flags.h"
 #import "ios/chrome/browser/promos_manager/constants.h"
 #import "third_party/abseil-cpp/absl/types/optional.h"
 
@@ -39,8 +41,21 @@
 
 - (absl::optional<promos_manager::Promo>)nextPromoForDisplay {
   DCHECK_NE(_promosManager, nullptr);
-
+  NSString* forcedPromoName = [self forcedPromoToDisplay];
+  if ([forcedPromoName length] > 0) {
+    absl::optional<promos_manager::Promo> forcedPromo =
+        promos_manager::PromoForName(base::SysNSStringToUTF8(forcedPromoName));
+    DCHECK(forcedPromo);
+    return forcedPromo;
+  }
   return self.promosManager->NextPromoForDisplay();
 }
 
+// Returns the promo selected in the Force Promo experimental setting.
+// If none are selected, returns empty string. If user is in beta/stable,
+// this method always returns nil.
+- (NSString*)forcedPromoToDisplay {
+  return experimental_flags::GetForcedPromoToDisplay();
+}
+
 @end
diff --git a/ios/chrome/browser/ui/util/BUILD.gn b/ios/chrome/browser/ui/util/BUILD.gn
index c9cbf78..07b4073 100644
--- a/ios/chrome/browser/ui/util/BUILD.gn
+++ b/ios/chrome/browser/ui/util/BUILD.gn
@@ -41,7 +41,6 @@
     "top_view_controller.mm",
     "transparent_link_button.h",
     "transparent_link_button.mm",
-    "ui_util.h",
     "uikit_ui_util.h",
     "uikit_ui_util.mm",
   ]
diff --git a/ios/chrome/browser/ui/util/ui_util.h b/ios/chrome/browser/ui/util/ui_util.h
deleted file mode 100644
index d5115d4e0a..0000000
--- a/ios/chrome/browser/ui/util/ui_util.h
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright 2012 The Chromium Authors
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#ifndef IOS_CHROME_BROWSER_UI_UTIL_UI_UTIL_H_
-#define IOS_CHROME_BROWSER_UI_UTIL_UI_UTIL_H_
-
-// All the methods from this file are in progress to be migrated
-// `ios/chrome/common/ui/util/ui_util.h`. This header is kept until all the
-// migration is done. Please include directly
-// `ios/chrome/common/ui/util/ui_util.h`.
-#import "ios/chrome/common/ui/util/ui_util.h"
-
-#endif  // IOS_CHROME_BROWSER_UI_UTIL_UI_UTIL_H_
diff --git a/ios/chrome/browser/ui/util/uikit_ui_util.h b/ios/chrome/browser/ui/util/uikit_ui_util.h
index 0299164..482891c9 100644
--- a/ios/chrome/browser/ui/util/uikit_ui_util.h
+++ b/ios/chrome/browser/ui/util/uikit_ui_util.h
@@ -9,7 +9,6 @@
 #import <Foundation/Foundation.h>
 #import <UIKit/UIKit.h>
 
-#import "ios/chrome/browser/ui/util/ui_util.h"
 #import "ios/web/common/uikit_ui_util.h"
 
 // UI Util containing functions that require UIKit.
diff --git a/ios/chrome/browser/web/chrome_main_parts.mm b/ios/chrome/browser/web/chrome_main_parts.mm
index 380ee94a..4521bf7 100644
--- a/ios/chrome/browser/web/chrome_main_parts.mm
+++ b/ios/chrome/browser/web/chrome_main_parts.mm
@@ -402,7 +402,9 @@
 
   // Ensure the Fullscren Promos Manager is initialized.
   PromosManager* promos_manager = application_context_->GetPromosManager();
-  promos_manager->Init();
+  if (promos_manager) {
+    promos_manager->Init();
+  }
 }
 
 void IOSChromeMainParts::PostMainMessageLoopRun() {
diff --git a/ios/web/public/js_messaging/README.md b/ios/web/public/js_messaging/README.md
index f259227..305f87a 100644
--- a/ios/web/public/js_messaging/README.md
+++ b/ios/web/public/js_messaging/README.md
@@ -1,18 +1,26 @@
-# Using JavaScript in Chrome for iOS Features
+# Using TypeScript in Chrome for iOS
 
-tl;dr A high level overview of using `JavaScriptFeature` in ``//ios/chrome`` to
-build features which interact with the web page contents.
+tl;dr A high level overview of using TypeScript and `JavaScriptFeature` to
+build features which interact with the web page contents on Chrome for iOS.
 
 Chrome for iOS doesn't have access to the renderer code so many browser features
-require JavaScript in order to interact with the webpage.
+require JavaScript in order to interact with the webpage. Please use TypeScript
+for all new feature development.
 
-Slides covering this topic are available [here](https://docs.google.com/presentation/d/1HKdi7CGtNTGhMcCscpX_LVFZ8iLTtXjpSQ-980N7J38/edit?usp=sharing).
+Slides covering JavaScriptFeature are available [here](https://docs.google.com/presentation/d/1HKdi7CGtNTGhMcCscpX_LVFZ8iLTtXjpSQ-980N7J38/edit?usp=sharing).
 
 ## Background
 
 It is important to first understand the following concepts in order to properly
 design a feature using JavaScript.
 
+### JavaScript vs TypeScript
+
+Sometimes the terms JavaScript and TypeScript are used interchangeably. Even
+though feature developers write TypeScript, the TypeScript is compiled into
+plain JavaScript at compile time. New scripts should be written as TypeScript
+since it provides additional assurances of code correctness and type safety.
+
 ### JavaScript Injection
 
 JavaScript is considered to be "injected" when it is added to every webpage by
@@ -23,10 +31,9 @@
 `BrowserState`.
 
 This may mean that the JavaScript doesn’t do anything when it is injected, but
-instead it may add functions which are exposed (through `__gCrWeb`) for later
-use.
+instead add functions which are exposed (through `__gCrWeb`) for later use.
 
-Note that WebKit uses the terminology UserScript for this injected JavaScript.
+Note: WebKit uses the terminology "WKUserScript" for this injected JavaScript.
 
 ### JavaScript Execution
 
@@ -45,10 +52,12 @@
 
 ### Content Worlds
 
-A content world can be thought of as a JavaScript namespace.
+A "content world"" can be thought of as a JavaScript namespace.
 
-The application can choose to inject its JavaScript into any world. All worlds
-have access to read and modify the same underlying webpage DOM.
+A JavaScriptFeature instance can choose to inject its JavaScript into a
+particular world. All worlds have access to read and modify the same underlying
+webpage DOM, but can not interact with the JavaScript state in different
+worlds.
 
 #### Page Content World
 
@@ -65,7 +74,7 @@
 execute arbitrary code is also able to interact with scripts in isolated worlds,
 including the ability to manipulate and send messages from isolated worlds. 
 
-NOTE: Isolated worlds are only supported on iOS 14 and later.
+NOTE: Isolated worlds are supported on iOS 14 and later.
 
 ## web::JavaScriptFeature
 
@@ -100,12 +109,12 @@
 The InjectionTime is when the script should be ran during the loading of the
 webpage's DOM.
 
-Scripts configured with `kDocumentStart` can create functions. Overrides of
-functions in the page content world which the webpage may call should be done at
-this time.
+Scripts configured with `kDocumentStart` can create functions, but the DOM will
+not yet be available. Overrides of functions in the page content world which
+the webpage may call should be done at this time.
 
 Scripts configured with `kDocumentEnd` will run after the DOM is available. This
-can be useful for scripts which may make pass over the DOM to manipulate it
+can be useful for scripts which may make a pass over the DOM to manipulate it
 only once after page load. Or to scan the webpage for some metadata and send it
 back to the native application.
 
@@ -129,14 +138,14 @@
 `JavaScriptFeature` subclass to call into the injected JavaScript and set the
 proper replacement value.
 
-### JavaScriptFeature::ExecuteJavaScript
+### JavaScriptFeature::CallJavaScriptFunction
 
-`JavaScriptFeature` exposes `protected CallJavaScriptFunction` APIs. These are
+`JavaScriptFeature` exposes protected `CallJavaScriptFunction` APIs. These are
 to be used within specialized `JavaScriptFeature` subclasses in order to call
-into the injected JavaScript.
+into injected JavaScript.
 
 This is necessary in order to ensure that the JavaScript execution occurs in the
-same content world which the features scripts were injected into.
+same content world which the feature scripts were injected into.
 
 JavaScript injected by a `JavaScriptFeature` should not be called outside of the
 specialized `JavaScriptFeature` subclass.
@@ -149,25 +158,94 @@
 Any responses will be routed to `ScriptMessageReceived`.
 
 From the JavaScript side, these messages are sent using
-`__gCrWeb.common.sendWebKitMessage`
+`__gCrWeb.common.sendWebKitMessage` in older scripts and `sendWebKitMessage`
+from `//ios/web/public/js_messaging/resources/utils.js` in modern scripts.
 
-Note that the handler name must be application wide unique. WebKit will thrown
-an exception if a name is already registered.
+Note that the handler name must be unique application-wide. WebKit will throw
+an exception while setting up the handler if a name is already registered.
 
 ### JavaScriptFeature Lifecycle
 
 `JavaScriptFeature`s conceptually live at the `BrowserState` layer.
 
 Simple features which hold no state can live statically within the application
-and be shared across the normal and incognito `BrowserState`s. 
+and may be shared across the normal and incognito `BrowserState`s. 
 `base::NoDestructor` and a static `GetInstance()` method can be used for these
 features.
 
 More complex features can be owned by the `BrowserState`s themselves as
-UserData.
+UserData. For example, see `ContextMenuJavaScriptFeature`.
 
-In order to inject JavaScript, //ios/chrome features must be registered at
-application launch time in `ChromeWebClient::GetJavaScriptFeatures`.
+In order to inject JavaScript, features which are implemented in `//ios/chrome`
+must be registered at application launch time in
+`ChromeWebClient::GetJavaScriptFeatures`.
+
+## Writing TypeScript
+
+All new scripts used on iOS should be written in TypeScript. TypeScript is
+written in a very similar manner to JavaScript, but additionally allows for
+error detection at compile time.
+
+Note that ES6 import/export statements are supported so your feature TypeScript
+can be split across multiple files. Reference other files using the full path,
+similar to other imports in native code. For example:
+
+    import {gCrWeb} from '//ios/web/public/js_messaging/resources/gcrweb.js';
+
+Note that the import uses the ".js" extension, even if the file is written as
+TypeScript with a ".ts" file extension because the type information only exists
+before compile time.
+
+Additionally, it is important to realize that import/export statements are also
+stripped away during compile time using [Rollup]. This may have unexpected side
+effects like variables defined in a common file not being shared as expected.
+State should be stored globally if it needs to be maintained across multiple
+files.
+
+[Rollup]: rollupjs.org
+
+### compile_ts
+
+Use [compile_ts] to compile TypeScript into JavaScript which is imported by
+many other scripts. Use `compile_ts` directly when your feature has multiple
+files or you are creating a script library to be used as a dep for many other
+script targets. See also `optimize_ts` below which might be a better fit.
+
+[compile_ts]: https://source.chromium.org/chromium/chromium/src/+/main:ios/web/public/js_messaging/compile_ts.gni
+
+### optimize_js
+
+[optimize_js] bundles one or more JavaScript files into a single output file in
+the application resources directory. These targets can depend on any number of
+dependent compiled script targets by listed `compile_ts` targets in `deps`.
+
+By default, it also minimizes the scripts.
+However, minimization can be disabled for debugging by setting `minify_scripts`
+at the top of `optimize_js.gni` to `false`.
+
+Use optimize_js directly if your
+feature has multiple script files, otherwise, see `optimize_ts` below handles
+the most common case.
+
+[optimize_js]: https://source.chromium.org/chromium/chromium/src/+/main:ios/web/public/js_messaging/optimize_js.gni
+
+### optimize_ts
+
+[optimize_ts] compiles a single TypeScript or JavaScript file and copies it to
+the application resources directory. This handles the common case where a
+feature has a single TypeScript file which needs to be compiled into JavaScript
+and copied into the application bundle for use by a JavaScriptFeature instance.
+
+[optimize_ts]: https://source.chromium.org/chromium/chromium/src/+/main:ios/web/public/js_messaging/optimize_ts.gni
+
+### Guidelines
+
+*   Adhere to the [TypeScript styleguide].
+*   Use [existing TypeScript] as reference.
+*   When possible, split your code into multiple files using ES6 export/import.
+
+[TypeScript styleguide]: https://google.github.io/styleguide/tsguide.html
+[existing TypeScript]: https://source.chromium.org/search?q=file:%5Eios%20file:%22.ts%22&sq=
 
 ## Best Practices for JavaScript Messaging
 
@@ -209,8 +287,9 @@
 sent by an attacker. These messages are untrustworthy input.
 
 Determine the origin of a message using trusted data rather than the content of
-the message. For example, use `web::ScriptMessage`’s `request_url`_ field, or
-`WKScriptMessage.frameInfo.request.URL`.
+the message. For example, use `web::ScriptMessage::request_url()` or
+`WKScriptMessage.frameInfo.request.URL`. Do not rely on url information in the
+message itself as it can be easily spoofed.
 
 ### Sanitize and validate messages
 
@@ -227,17 +306,19 @@
     return;
   }
 
-  std::string* event_type = message.body()->FindStringKey("eventType");
+  base::Value::Dict message_body = std::move(script_message.body()->GetDict());
+
+  std::string* event_type = message_body.FindString("eventType");
   if (!event_type || event_type->empty()) {
     return;
   }
 
-  std::string* text = message.body()->FindStringKey("text");
+  std::string* text = message_body.FindString("text");
   if (!text || text->empty()) {
     return;
   }
 
-  // Now use |eventType| and |text|.
+  // Now, you can *carefully* use `eventType` and `text` as non-empty strings.
 }
 ```
 
@@ -273,7 +354,13 @@
 `web::ScriptMessage` in overrides of `JavaScriptFeature::ScriptMessageReceived`,
 and when using `WebStateImpl::ExecuteJavaScript`. Always use
 `WebFrame::CallJavaScriptFunction` rather than directly calling
-`[WKWebView evaluateJavaScript]`, to avoid having to manually handle conversion.
+`[WKWebView evaluateJavaScript]`, to avoid having to manually handle conversion
+and to ensure that the message will only be sent to the expected webpage.
+Sending JavaScript to the WKWebView or web::WebState is not bound to any
+particular webpage or domain and may execute on a different page than expected
+if a navigation occurs between the sending and execution of the message.
+However, messages sent to a WebFrame will be bound to that webpage and be
+dropped if the webpage goes away before the JavaScript is executed.
 
 [legacy IPC docs]: https://www.chromium.org/Home/chromium-security/education/security-tips-for-ipc
 [Mojo IPC docs]: https://chromium.googlesource.com/chromium/src/+/refs/heads/main/docs/security/mojo.md
diff --git a/ios/web/public/js_messaging/compile_ts.gni b/ios/web/public/js_messaging/compile_ts.gni
index e6148441..e272569 100644
--- a/ios/web/public/js_messaging/compile_ts.gni
+++ b/ios/web/public/js_messaging/compile_ts.gni
@@ -6,11 +6,6 @@
 
 # Defines a target that compiles one or more TypeScript and JavaScript input
 # files.
-# NOTE: Since ts_library produces files with hardcoded names at
-# `target_gen_dir`, only a single `compile_ts` target may exist in a BUILD
-# file. However, even with this restriction, unrelated TypeScript files may be
-# compiled together in a single `compile_ts` target, then be used in multiple,
-# separate `optimize_js` instances.
 #
 # Variables
 #   sources:
diff --git a/ios/web/public/js_messaging/optimize_ts.gni b/ios/web/public/js_messaging/optimize_ts.gni
index 89a4255..38b19d3 100644
--- a/ios/web/public/js_messaging/optimize_ts.gni
+++ b/ios/web/public/js_messaging/optimize_ts.gni
@@ -26,7 +26,7 @@
     _sources_count += 1
   }
   assert(_sources_count == 1,
-         "only a single source may be provided to compile_and_optimize_ts")
+         "only a single source may be provided to optimize_ts")
 
   _compile_ts_target_name = target_name + "_compile_ts"
   compile_ts(_compile_ts_target_name) {
diff --git a/mojo/core/ipcz_driver/transport.cc b/mojo/core/ipcz_driver/transport.cc
index a4a944e..5ff1f72 100644
--- a/mojo/core/ipcz_driver/transport.cc
+++ b/mojo/core/ipcz_driver/transport.cc
@@ -373,9 +373,10 @@
   header.reserved[1] = 0;
   header.reserved[2] = 0;
 
-  const HandleOwner handle_owner = remote_process_.IsValid()
-                                       ? HandleOwner::kRecipient
-                                       : HandleOwner::kSender;
+  const HandleOwner handle_owner =
+      remote_process_.IsValid() && source_type() == kBroker
+          ? HandleOwner::kRecipient
+          : HandleOwner::kSender;
   header.handle_owner = handle_owner;
 
   auto handle_data = base::make_span(reinterpret_cast<HANDLE*>(&header + 1),
diff --git a/mojo/public/tools/bindings/generators/mojom_js_generator.py b/mojo/public/tools/bindings/generators/mojom_js_generator.py
index c6c7bb1c..3fa88e3 100644
--- a/mojo/public/tools/bindings/generators/mojom_js_generator.py
+++ b/mojo/public/tools/bindings/generators/mojom_js_generator.py
@@ -994,13 +994,6 @@
   def _GetConstantValueInJsModule(self, constant):
     return self._GetConstantValue(constant, for_module=True)
 
-  def _GenerateHtmlImports(self):
-    result = []
-    for full_import in self.module.imports:
-      result.append(
-          os.path.relpath(full_import.path, os.path.dirname(self.module.path)))
-    return result
-
   def _GetJsModuleImports(self, for_webui_module=False):
     this_module_path = _GetWebUiModulePath(self.module)
     this_module_is_shared = bool(
diff --git a/net/cert/pki/parse_name.cc b/net/cert/pki/parse_name.cc
index 8905786..f83246f 100644
--- a/net/cert/pki/parse_name.cc
+++ b/net/cert/pki/parse_name.cc
@@ -5,7 +5,6 @@
 #include "net/cert/pki/parse_name.h"
 
 #include "base/check_op.h"
-#include "base/notreached.h"
 #include "base/strings/string_number_conversions.h"
 #include "net/der/parse_values.h"
 #include "third_party/boringssl/src/include/openssl/bytestring.h"
@@ -72,7 +71,7 @@
     case der::kBmpString:
       return der::ParseBmpString(value, out);
     default:
-      NOTREACHED();
+      assert(0);  // NOTREACHED
       return false;
   }
 }
diff --git a/net/cert/pki/path_builder.cc b/net/cert/pki/path_builder.cc
index 8867fc4..c73d033 100644
--- a/net/cert/pki/path_builder.cc
+++ b/net/cert/pki/path_builder.cc
@@ -11,7 +11,6 @@
 #include "base/logging.h"
 #include "base/memory/raw_ptr.h"
 #include "base/metrics/histogram_functions.h"
-#include "base/notreached.h"
 #include "base/strings/string_number_conversions.h"
 #include "net/base/net_errors.h"
 #include "net/cert/pki/cert_issuer_source.h"
@@ -459,7 +458,7 @@
       return nullptr;
   }
 
-  NOTREACHED();
+  assert(0);  // NOTREACHED
   return nullptr;
 }
 
diff --git a/net/cert/pki/trust_store.cc b/net/cert/pki/trust_store.cc
index 93a2c35..0f0858cd 100644
--- a/net/cert/pki/trust_store.cc
+++ b/net/cert/pki/trust_store.cc
@@ -4,8 +4,6 @@
 
 #include "net/cert/pki/trust_store.h"
 
-#include "base/notreached.h"
-
 namespace net {
 
 CertificateTrust CertificateTrust::ForTrustAnchor() {
@@ -49,7 +47,7 @@
       return true;
   }
 
-  NOTREACHED();
+  assert(0);  // NOTREACHED
   return false;
 }
 
@@ -64,7 +62,7 @@
       return false;
   }
 
-  NOTREACHED();
+  assert(0);  // NOTREACHED
   return false;
 }
 
@@ -79,7 +77,7 @@
       return false;
   }
 
-  NOTREACHED();
+  assert(0);  // NOTREACHED
   return true;
 }
 
diff --git a/net/cert/pki/verify_name_match.cc b/net/cert/pki/verify_name_match.cc
index 3f26412..002e424 100644
--- a/net/cert/pki/verify_name_match.cc
+++ b/net/cert/pki/verify_name_match.cc
@@ -5,7 +5,6 @@
 #include "net/cert/pki/verify_name_match.h"
 
 #include "base/check.h"
-#include "base/notreached.h"
 #include "base/strings/string_util.h"
 #include "net/cert/pki/cert_error_params.h"
 #include "net/cert/pki/cert_errors.h"
@@ -139,7 +138,7 @@
       success = NormalizeDirectoryString(ENFORCE_ASCII, output);
       break;
     default:
-      NOTREACHED();
+      // NOTREACHED
       success = false;
       break;
   }
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json
index 75341c99..1a91a597 100644
--- a/net/http/transport_security_state_static.json
+++ b/net/http/transport_security_state_static.json
@@ -1382,7 +1382,6 @@
     { "name": "shopontarget.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "siraweb.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "spdysync.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "sylaps.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sysctl.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tauchkater.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "theshadestore.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -1415,7 +1414,6 @@
     { "name": "jonnybarnes.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "miasarafina.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "prefontaine.name", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "redlatam.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "schachburg.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "schreiber-netzwerk.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "syss.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -2111,7 +2109,6 @@
     { "name": "richiemail.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ricochet.im", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "roman-pavlik.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "roots.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "royalacademy.org.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rubecodeberg.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sabahattin-gucukoglu.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -2265,7 +2262,6 @@
     { "name": "buiko.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cdt.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cheesetart.my", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "climateinteractive.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "costablancavoorjou.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cracker.in.th", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dohosting.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -3604,7 +3600,6 @@
     { "name": "hawkeyeinsight.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hencagon.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hilahdih.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "hrbatypes.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hroschyk.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ichronos.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "idaspis.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -3725,7 +3720,6 @@
     { "name": "atisoft.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "atisoft.net.tr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "atisoft.web.tr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "balboa.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bcsytv.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "beholdthehurricane.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "beranovi.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -4003,7 +3997,6 @@
     { "name": "unpr.dk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "utdsgda.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "valordolarblue.com.ar", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "vieclam24h.vn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vm0.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vnvisa.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "watersb.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -4631,7 +4624,6 @@
     { "name": "iocheck.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "isaacman.tech", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "isondo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "jacobphono.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jcraft.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jennythebaker.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jonaskjodt.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -5360,7 +5352,6 @@
     { "name": "davidandersson.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "davidreinhardt.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dc585.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "ddhosted.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dedicatutiempo.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "degeberg.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "deinballon.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -6049,7 +6040,6 @@
     { "name": "xss.ht", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "xwalck.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yakmade.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "yakmoo.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yanaduday.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yanwh.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yaxim.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -6856,7 +6846,6 @@
     { "name": "adderall.space", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "agwa.name", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "alanlee.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "antocom.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "atletika.hu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "auto-anleitung.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bakaweb.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -7659,7 +7648,6 @@
     { "name": "allstarswithus.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "allthingssquared.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "alphabuild.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "alt-three.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "alterbaum.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "altopia.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "amcvega.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -7778,7 +7766,6 @@
     { "name": "bf.am", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bgcparkstad.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bgdaddy.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "bhtelecom.ba", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bible-maroc.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "biblerhymes.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "biblionaut.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -8490,7 +8477,6 @@
     { "name": "ip6.im", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ipal.im", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ipal.name", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "iplabs.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ipmotion.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "isbengrumpy.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ischool.co.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -8541,7 +8527,6 @@
     { "name": "jsg-technologies.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "json-viewer.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jthackery.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "jualssh.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "julibear.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "julido.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "juliemaurel.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -8867,7 +8852,6 @@
     { "name": "newlooknow.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "newstone-tech.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "newsyslog.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "newtnote.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "next176.sk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "next24.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nextgencel.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -9130,7 +9114,6 @@
     { "name": "recapp.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "redar.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "redballoonsecurity.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "redburn.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "reddingsbrigade-zwolle.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rede-reim.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rede.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -9347,7 +9330,6 @@
     { "name": "stabletoken.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "stadionmanager.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "stadjerspasonline.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "stageirites.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "stagingjobshq.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "stahl.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "starmusic.ga", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -9363,7 +9345,6 @@
     { "name": "stqry.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "str0.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "strchr.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "streamzilla.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "strictlysudo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "stroeercrm.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "studenckiemetody.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -9498,7 +9479,6 @@
     { "name": "trademan.ky", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tradinghope.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "trakfusion.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "transacid.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "transmithe.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "transportal.sk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "travelinsurance.co.nz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -9685,7 +9665,6 @@
     { "name": "wvg.myds.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "x3led.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "x509.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "xa1.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "xbb.hk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "xbb.li", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "xboxdownloadthat.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -10741,7 +10720,6 @@
     { "name": "wsv-grafenau.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yaucy.win", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yard-fu.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "zachpeters.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "zaoshanghao-dajia.rhcloud.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yourself.today", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ynsn.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -10839,7 +10817,6 @@
     { "name": "bydisk.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cablesandkits.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "caim.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "callision.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "campus-cybersecurity.team", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "canoonic.se", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "casa-due-pur.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -10878,7 +10855,6 @@
     { "name": "crazymeeshu.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "create-test-publish.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "creative-wave.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "creativecaptiv.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cross-x.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "crstat.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cryptopartynewcastle.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -11411,7 +11387,6 @@
     { "name": "xperidia.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "xpi.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "xroot.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "yarcom.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yooooex.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yoyoost.duckdns.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "z3liff.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -11470,7 +11445,6 @@
     { "name": "advocatenalkmaar.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "adxperience.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "aerialmediapro.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "agileui.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "aidanmontare.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "aify.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "aiois.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -11537,7 +11511,6 @@
     { "name": "bacon-monitoring.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "balist.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ballejaune.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "bancacrs.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bankcircle.co.in", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bankinter.pt", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bannisbierblog.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -12327,7 +12300,6 @@
     { "name": "nicolas-simond.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nidro.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nien.chat", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "nien.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nien.com.tw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nien.taipei", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nigelwakefield.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -12889,7 +12861,6 @@
     { "name": "xscapers.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yachts-magazine.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yarogneva.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "yesdevnull.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ylk.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yntongji.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "yoga-school.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -13144,7 +13115,6 @@
     { "name": "casbuijs.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "captured-symphonies.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ciphrex.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "chicolawfirm.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cbamo.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "carlosjeurissen.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cardurl.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -14326,7 +14296,6 @@
     { "name": "thorstenschaefer.name", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "tindewen.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "thynx.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "timroes.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "timnash.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "thues.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ti-pla.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -14860,7 +14829,6 @@
     { "name": "estonoentraenelexamen.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ever.sale", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "evolutionexpeditions.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "etidni.help", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "financier.io", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "epichouse.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "esample.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -15414,7 +15382,6 @@
     { "name": "pokeduel.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "printexpress.cloud", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rafting-japan.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "qubyte.codes", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "qwant.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "recreoviral.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "president.bg", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -16190,7 +16157,6 @@
     { "name": "cuni-rec.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dakl-shop.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cubecart-hosting.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "debigare.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "datenlast.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cybertorsk.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "das-sommercamp.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -16739,7 +16705,6 @@
     { "name": "jd1.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jurko.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jmcleaning.services", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "karit.nz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kavinvin.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kerem.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "kingtecservices.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -17103,7 +17068,6 @@
     { "name": "osburn.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "olswangtrainees.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "new.travel.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "pagiamtzis.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "octopus-agents.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "orchidspaper.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "offenedialoge.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -17874,7 +17838,6 @@
     { "name": "adurra.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ahmadly.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "afri.cc", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "0x7fffffff.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "1644091933.rsc.cdn77.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "163pwd.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "acemobileforce.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -18185,10 +18148,8 @@
     { "name": "certcenter.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cakestart.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cavern.tv", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "chrisb.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cdasiaonline.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "chima.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "chrisb.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "chronogram.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "chisago-isantidfl.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "benwattie.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -18197,7 +18158,6 @@
     { "name": "centos.tips", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "beersandco.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "chatxtutti.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "chriswbarry.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "chocolatesandhealth.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "canlidoviz.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "chatt-gratis.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -21488,7 +21448,6 @@
     { "name": "bitmainwarranty.ru", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bitrush.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bixservice.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "bizniskatalog.mk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bizzi.tv", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "blackdiam.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "blackdotbrewery.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -21597,7 +21556,6 @@
     { "name": "capsogusto.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "captalize.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "capture-app.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "car24.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "carauctionsillinois.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "carbon-designz.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "carck.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -21694,7 +21652,6 @@
     { "name": "cloudpengu.in", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cloudwarez.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "clounix.online", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "clouz.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "clsimage.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "clubdeslecteurs.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "clusterfuck.nz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -21816,7 +21773,6 @@
     { "name": "d4x.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dabbot.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "daciaforum.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "dag-hebergement.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dai-rin.co.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dailyblogged.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "dailyhealthguard.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -21933,7 +21889,6 @@
     { "name": "drillion.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "drinknaturespower.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "driven2shine.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "drkhsh.at", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "drms.us", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "drunkscifi.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "drybasement.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -22154,7 +22109,6 @@
     { "name": "foregroundweb.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "foreverssl.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "formation-assureur.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "formersessalaries.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "forrestheller.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "forsyththeatre.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "fortress.no", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -22482,7 +22436,6 @@
     { "name": "im66.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "imadalin.ro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "imaginair.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "imanhearts.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "immanuel60.hu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "immo-vk.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "immobilien-wallat.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -23072,7 +23025,6 @@
     { "name": "mtd.ovh", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mtdn.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "muga.space", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "mulaccosmetics.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mulaisehat.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mulheres18.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "munrabi.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -23190,7 +23142,6 @@
     { "name": "nuclearcat.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nuclearcrimes.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nuclearcrimes1.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "nulltime.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "numerossanos.com.ar", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "numis.tech", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nuriacamaras.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -23516,7 +23467,6 @@
     { "name": "readtldr.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "realhorsegirls.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "really-simple-ssl.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "realwildart.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "reancos.report", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "reboxetine.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rechtschreibpruefung24.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -24926,7 +24876,6 @@
     { "name": "chrstn.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cipri.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cloud.fail", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "clearsky.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cianmawhinney.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "carinsurance.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "clashersrepublic.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -25165,7 +25114,6 @@
     { "name": "dogoo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "diadorafitness.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "diagonale-deco.fr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "dmdre.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "domyzitrka.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "danandrum.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "drybasementkansas.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -25664,7 +25612,6 @@
     { "name": "imperdin.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "imperdintechnologies.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "huitaodang.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "iaeste.no", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "imawhale.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "imperiumnova.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "inderagamono.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -25798,7 +25745,6 @@
     { "name": "julianickel.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "juliawebber.co.za", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jornalalerta.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "jorovik.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "johnfulgenzi.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "just-pools.co.za", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "jskoelliken.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -26247,7 +26193,6 @@
     { "name": "nextshutter.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nevolution.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "newcreamforface.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "nehoupat.cz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "netde.jp", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "nesolabs.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "musikverein-elten.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -27108,7 +27053,6 @@
     { "name": "tommyweber.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "truekey.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "titelseite.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "trumeet.top", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "trialmock.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "transferio.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "travel-dealz.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -27232,7 +27176,6 @@
     { "name": "uniformecomgas.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "versfin.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vagabondgal.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "virtualvaults.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vconcept.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "visionthroughknowledge.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "vconcept.me", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -27304,7 +27247,6 @@
     { "name": "willems-kristiansen.dk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "whitby-brewery.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "wp-securehosting.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "windowstech.it", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "whitepharmacy.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "worst.horse", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "win7stylebuilder.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -28204,7 +28146,6 @@
     { "name": "hughtodd.ink", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "icyapril.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hondenoppasfraneker.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "hm773.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "html5media.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "hinterposemuckel.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "idealtruss.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -28440,7 +28381,6 @@
     { "name": "la-petite-entreprise.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lisowski-photography.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "localdecor.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "lojafilipaper.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "lojashowdecozinha.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "livrariacoad.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mac-world.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -28736,7 +28676,6 @@
     { "name": "playerscout.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pissflaps.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "oinky.ddns.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "planlos.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pi-dash.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "oganek.ie", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "pizzeriacolore.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -28927,7 +28866,6 @@
     { "name": "seocomposer.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "scripthost.org", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "shadowsocks.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "sethvargo.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "shadowsocks.la", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "secretar.is", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "sharperedge.pw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -29401,7 +29339,6 @@
     { "name": "harrypottereditor.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ilikfreshweedstores.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "eminhuseynov.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "hj.rs", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "casadowifi.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "barprive.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "injust.cf", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -29606,7 +29543,6 @@
     { "name": "borisschapira.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "brucemartin.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bt123.xyz", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "budgetlovers.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bypass.sh", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "cestasedelicias.com.br", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "chentianyi.cn", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -30596,7 +30532,6 @@
     { "name": "arizonaautomobileclub.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "arjunasdaughter.pub", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "armeni-jewellery.gr", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "arnoudraeven.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "arnoudvandalen.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "asianshops.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "asoul.tw", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -31149,7 +31084,6 @@
     { "name": "itds-consulting.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "iterader.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "itsasaja.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "itsevident.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "itzap.com.au", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "ivanbenito.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "janssen.fm", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -31321,7 +31255,6 @@
     { "name": "markusgran.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "marocemploi.co", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "marxist.party", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "maryeclark.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "mat99.dk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "matheo-schefczyk.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "matriterie-sdv.ro", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -31444,7 +31377,6 @@
     { "name": "nvq.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "oben.pl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "oberam.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "octal.es", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "odoo.co.th", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "offersgame.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "officeprint.co.th", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -31568,7 +31500,6 @@
     { "name": "quasseldroid.info", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "question.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "qwertee.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "raeven.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rainbowstore.com.ua", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rainpaper.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rb-china.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -31579,7 +31510,6 @@
     { "name": "realum.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "realum.eu", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "realum.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "reaven.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "rebelessex.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "reboxonline.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "recetasdecocinaideal.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -32075,7 +32005,6 @@
     { "name": "beybiz.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bez-energie.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "biobuttons.ch", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "biyori.moe", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "blackseals.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "bleaching-tipps.de", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "block65.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -32483,7 +32412,6 @@
     { "name": "tearoy.faith", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "techcracky.com", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "teyssedre.ca", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
-    { "name": "tgamobility.co.uk", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "thebigbitch.nl", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "thecolumnist.net", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
     { "name": "thecskr.in", "policy": "bulk-18-weeks", "mode": "force-https", "include_subdomains": true },
@@ -32611,7 +32539,6 @@
     { "name": "adsbouncycastles.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "adtgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "adventureforest.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aeon.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aergia.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "affichagepub3.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "affordablebouncycastle.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -33828,7 +33755,6 @@
     { "name": "thehaxbys.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theinflatables-ni.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theinflatablesne.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "thelonelyones.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thepartydoctors.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thepieslicer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theplaydaysbus.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -33849,7 +33775,6 @@
     { "name": "tmc.com.mt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tmcpromotions.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tohokinemakan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tokobungaasryflorist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tokobungadilampung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tokobungadipadangflorist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tokyo-onkyo.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -34030,7 +33955,6 @@
     { "name": "os24.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "photo-livesearch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "phrive.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pneusgppremium.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pokalsocial.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "products4more.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rhodes.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -34588,7 +34512,6 @@
     { "name": "tribac.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tripsinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trynta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "uitgeverij-deviant.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unschoolrules.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ursa-minor-beta.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "usedu.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -34700,7 +34623,6 @@
     { "name": "av163.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "avcd.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "avocode.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "b1.work", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bankmilhas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "barsil.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bella.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -35702,7 +35624,6 @@
     { "name": "agoravm.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agouraelectrician.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ai1989.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aimerworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aimrom.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "akcounselingservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alainodea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -36256,7 +36177,6 @@
     { "name": "gayukai.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "generalinsuranceservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "generationsweldom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "geojs.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "getenergized2018.kpn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "getpagespeed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "getteamninja.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -36446,7 +36366,6 @@
     { "name": "kirwandigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kissesb.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kivitelezesbiztositas.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "klseet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kocherev.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kochereva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kogcoder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -37051,7 +36970,6 @@
     { "name": "tourtrektrip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "toyota-kinenkan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trackingstream.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "trade-arcade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "travel1x1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "travellovers.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "treetopsecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -37086,7 +37004,6 @@
     { "name": "utcast-mate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "utgifter.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vantagepointpreneed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vasilikieleftheriou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vats.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vatsim-uk.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vatsim.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -37241,7 +37158,6 @@
     { "name": "allkindzabeats.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alphavote-avex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alphavote.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "amalfi5stars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amalfilapiazzetta.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amalfipositanoboatrental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amaresq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -38140,7 +38056,6 @@
     { "name": "casino-cash-flow.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "casinocashflow.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cgal.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "championsofpowerfulliving.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chanddriving.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "charlotteomnes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "checkmyessay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -38906,7 +38821,6 @@
     { "name": "dedge.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deechtebakkers.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dekeurslagers.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dekulk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "delf.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "der-lan.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "despachomartinyasociados.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -39276,7 +39190,6 @@
     { "name": "spittank.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sportvereine.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "spotteredu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "spreadsheetgear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ssh.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "star-clean.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "startergen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -40235,7 +40148,6 @@
     { "name": "c12discountonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "c3.pm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "camshowhub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "captainsinn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cartouche-deal.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "carun.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cdncompanies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -41096,7 +41008,6 @@
     { "name": "kazanasolutions.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "keeprubyweird.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kelheor.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kemmerer-net.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kernelmode.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kevinhq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "khosla.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -41509,7 +41420,6 @@
     { "name": "commissionagenda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "consulenza.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cooksbookscorks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cornerstonecmc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "corpusslayer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coursables.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "creared.edu.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -41817,7 +41727,6 @@
     { "name": "inchenaim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "indexyz.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "industriasrenova.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ioliver.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ipadkaitori.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "itesign.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "joetsutj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -42986,7 +42895,6 @@
     { "name": "kc1hbk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kersvers.agency", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "keys.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kipa.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kirkforillinois.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kitchenalley.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "knetterbak.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -43380,7 +43288,6 @@
     { "name": "albertinum-goettingen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alexio.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alexschroeder.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "alliance-psychiatry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alligatorge.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alphaantileak.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alt-tab-design.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -43503,7 +43410,6 @@
     { "name": "dariaburger.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "datenschutz-consult.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "david-mallett.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "davidsopas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dawnofeden.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dbmiller.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dc1.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -43751,7 +43657,6 @@
     { "name": "kost-magazin.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "krausoft.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ku-7.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kualiti.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kuhne-electronic.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kvnsport.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lagout.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -43958,7 +43863,6 @@
     { "name": "quimatic.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qunzi.la", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rachelmoorelaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "rahulpnath.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rajkapoordas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "raltha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rangercollege.edu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -44855,7 +44759,6 @@
     { "name": "topservercccam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "topservercccam.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "topshoptools.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "toucan-informatique.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "treatment.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tripolistars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "truhlarstvi-fise.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -44865,7 +44768,6 @@
     { "name": "tryndraze.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tvlplus.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tyler.coach", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tylercoach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "typeof.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unblocked.vet", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unkrn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -45480,7 +45382,6 @@
     { "name": "e51888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "easew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "easterncapebirding.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "easytechguides.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ecardoo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ecxforum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "electionsbycounty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -46347,7 +46248,6 @@
     { "name": "xn--kckd0bd4a8tp27yee2e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--mgbpkc7fz3awhe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "youngpeopleunited.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "youtuberis.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zengdong.ren", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zny.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zone403.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -46380,7 +46280,6 @@
     { "name": "80036.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "86286286.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8xx.bet", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "8xx.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8xx888.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "8xxbet.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "9riddles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -46582,7 +46481,6 @@
     { "name": "cobcode.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "codejots.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "codexpo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "codinginfinity.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coentropic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "comandofilmes.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "comeals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -48124,7 +48022,6 @@
     { "name": "ankitpati.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aqdun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arbeitsch.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "architectryan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arizonabondedtitle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arti-group.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "asbestosthedarkarts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -48347,7 +48244,6 @@
     { "name": "service-wueste-vodafone.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sethoedjo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shakingthehabitual.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "shawnalucey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shiqisifu.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "signsdance.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "silent-yachts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -48470,7 +48366,6 @@
     { "name": "888bwf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "88bwf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "9822.am", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "9822.bz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "abdel.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "accoladescreens.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "actonwoodworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -48565,7 +48460,6 @@
     { "name": "aos-llc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aptitudetests.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "araraexpress.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "armanozak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arviksa.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "asproni.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "astral-imperium.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -48895,7 +48789,6 @@
     { "name": "mangahigh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "manmeetgill.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mariacorzo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "marijnfidder.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "marjeta-gurtner.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "markandrosalind.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "marketingforfood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -49043,7 +48936,6 @@
     { "name": "pasadenasandwich.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paulcooper.me.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "peacedivorce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "per-olsson.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "peterjin.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "petr.as", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pewnews.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -49653,7 +49545,6 @@
     { "name": "fdresearch.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "felixaufreisen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "feng-hhcm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fierscleaning.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "film-colleges.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "finance-colleges.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fire-schools.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -49754,7 +49645,6 @@
     { "name": "isavings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iskanderbroere.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "islavolcan.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "itsundef.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iurisnow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ivy-league-colleges.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iwebolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -50324,7 +50214,6 @@
     { "name": "darklaunch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "davypropper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dedicatedtowomenobgyn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "deepinsight.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "deliveryiquique.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "desuchan.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "desuchan.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -50668,7 +50557,6 @@
     { "name": "aidanmitchell.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "airlibre-parachutisme.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "airswap.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "airweb.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alibiloungelv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alis-test.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "allpointsheating.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -51497,10 +51385,8 @@
     { "name": "holyspiritweb.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "homes-in-norcal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "homes-in-stockton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "homestay.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "horairetrain.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "horizonresourcesinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hotel-kontorhaus-stralsund.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hotel-kontorhaus.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hotelromacuernavaca.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hugo.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -51539,7 +51425,6 @@
     { "name": "jclynne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jeffrhinelander.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jennierobinson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jering.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jgoldgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jgregory.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jimizhou.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -51824,7 +51709,6 @@
     { "name": "sassandbelle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sassandbelletrade.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sassandbelletrade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "saveoney.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sbscyber.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sceenfox.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scentofwine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -52686,7 +52570,6 @@
     { "name": "huangjia99.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hypeitems.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "i2gether.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ibiu.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ibutikk.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "icnsoft.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "idoparadoxon.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -52706,7 +52589,6 @@
     { "name": "impera.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inessoftsec.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inethost.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "informations-echafaudages.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "infosectalks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "infranoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "infrapeer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -53046,7 +52928,6 @@
     { "name": "perfectstreaming.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "periodic-drinking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "persocloud.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "peterbarrett.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "peterhons.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pflug.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "phillipsdistribution.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -53193,7 +53074,6 @@
     { "name": "redzonedaily.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "reening.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "reflets.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "rendall.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "renovablesverdes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rensa-datorn.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rentayventadecarpas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -53243,7 +53123,6 @@
     { "name": "seamoo.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "searchfox.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "section77.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "securist.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "seedcoworking.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "segnidisegni.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sekikawa.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -53404,7 +53283,6 @@
     { "name": "tittelbach.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tobi-server.goip.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tobi-videos.goip.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "toddmath.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tofliving.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tombroker.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tonifarres.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -53513,7 +53391,6 @@
     { "name": "woodenson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wpexplainer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wpno.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "wptorium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wrightselfstorageandremovals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wunder.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wx37.ac.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -54086,7 +53963,6 @@
     { "name": "danielparker.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "darkestproductions.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "datahive360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "david-hinschberger.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dbmxpca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "decfun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "decrypto.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -54098,7 +53974,6 @@
     { "name": "derbyware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "desertmedaesthetics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "devswag.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dexonrest.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dhbr.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dia.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "diccionarqui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -54328,7 +54203,6 @@
     { "name": "maplegate.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "margays.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "matrieux.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "maxlaumeister.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "meangirl.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mellitus.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "merchcity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -54707,7 +54581,6 @@
     { "name": "133492.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "136774.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "137724.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "141145.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1889p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2083236893.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2206p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -55206,7 +55079,6 @@
     { "name": "horsegateway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hostingalternative.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hotel1926.com.mt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hrafnkellbaldurs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "huangqifu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ideatarmac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "idyl.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -55373,7 +55245,6 @@
     { "name": "mamabepo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "manantialdevida1450.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maniacoland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "marietrap.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maroismasso.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "martian.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "massagetherapyschoolsinformation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -56006,7 +55877,6 @@
     { "name": "cookingperfected.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "courseconfidence.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cricklewood.condos", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ctknight.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cupoane-reducere.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cursosypostgrados.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cvutdecin.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -56032,7 +55902,6 @@
     { "name": "earn.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "econsorzio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "emergencyshutoff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "emil.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "encens.boutique", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "epasar.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "escalesensorielle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -56083,7 +55952,6 @@
     { "name": "inflated.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "isaropiping.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jabba.homelinux.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jonas.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jxkangyifu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jz585.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kalugadeti.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -56703,7 +56571,6 @@
     { "name": "gurunpa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gyume.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "h33t.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "harelmallacglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hawawa.kr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "healthyrecharge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "heikohessenkemper.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -56752,7 +56619,6 @@
     { "name": "ltlec.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ltmw.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "m2tm.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mailhardener.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mainhattan-handwerker.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "malibumodas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mantuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -57094,7 +56960,6 @@
     { "name": "mandiblackburnphoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mathes.berlin", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medsblalabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "meidev.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "minapin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "minhyukpark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mirrordream.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -57632,7 +57497,6 @@
     { "name": "a-bm.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aaronfurtado.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "acefreightco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "adamgibbins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "adc64.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "administratiekantoorblom.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "adrianobarbosa.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -57931,7 +57795,6 @@
     { "name": "unblocked.cx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unblocked.llc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "univate.berlin", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "urbanxhome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "usamdt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uvx.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uyku-apnesi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -57946,7 +57809,6 @@
     { "name": "wanmen.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wardslager.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "websa.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "weidehelp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "widely.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wigelsworth.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "woodwormtreatment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -58439,7 +58301,6 @@
     { "name": "cansworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "carbon.coop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cardano.eco", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "caroleblouin.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "carolineeball.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "casian.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "catenariadiscos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -58694,7 +58555,6 @@
     { "name": "xn--95q32l0t6b9cb17l.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--anyd-7na.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--int-ru8ea.xn--6qq986b3xl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "xn--kkcon-fwab.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xtri.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ys6888.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zahnarzt-drvogel-rosenheim.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -58808,7 +58668,6 @@
     { "name": "guysauto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gwo24.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "h2rul.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "halbowman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "haplogroup.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hashtagpatriot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hawaiioceanproject.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -59001,7 +58860,6 @@
     { "name": "592227.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "599980.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "716227.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "716331.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "7pb.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "933325.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aattrans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -59127,7 +58985,6 @@
     { "name": "gummientchen.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hangerphant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "haskett.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "healingourskin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "heaven.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hellomedian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hengroenet.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -59473,7 +59330,6 @@
     { "name": "elettricisti.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elipsyum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "emilybellydance.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "empatico.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "enersolelectrical.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "entropy.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eringmaguire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -59661,7 +59517,6 @@
     { "name": "skyscnr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "slopeedge.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "slownik123.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "slpm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "smartmachine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "snabblim.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "snopyta.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -59922,7 +59777,6 @@
     { "name": "cakeoffencesact.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "callerstrom.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cameronthomson.racing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "canadaradon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "carespot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "carlislepassionplay.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cases.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -59984,7 +59838,6 @@
     { "name": "dakindesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dakinnyc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "darani.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "darkskymap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "datelligent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dcdestetica.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "death.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -60219,7 +60072,6 @@
     { "name": "kartbird.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "katieriker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kaypasocks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kee.pm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kevchia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kexino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "keynes.id.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -60239,7 +60091,6 @@
     { "name": "koof.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koreaninhd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "korem011-tniad.mil.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ksoc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kumpulannamabayi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kunvn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kupferschmids.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -60638,7 +60489,6 @@
     { "name": "techcu.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "techjobplaybook.nyc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tecknobox.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "teeqq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tehniss.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "teleskell.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tenthousandbottoms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -60888,7 +60738,6 @@
     { "name": "changemywifipassword.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chliine.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "classiccutstupelo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cmserviscz.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "consultasdigitales.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "controlambientalbogota.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "counterenlol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -60979,7 +60828,6 @@
     { "name": "klu.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koeldezomerdoor.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koenrh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "koenrh.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koenrh.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koenrouwhorst.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kolas.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -62172,7 +62020,6 @@
     { "name": "ii9728.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "imoe.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "imoney.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "imovel5.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "impresapulizie.firenze.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "infstudios.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inputmodes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -62765,7 +62612,6 @@
     { "name": "luckystorevn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "manicuradegel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "manicuradegel.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mariafernanda.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "marvell.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "matt.gd", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mauricioquadradoconsultor.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -63177,7 +63023,6 @@
     { "name": "se.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sector.zone", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "securemantra.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "seerainer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "serenavilage.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sglorch.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shachang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -63885,7 +63730,6 @@
     { "name": "videownload.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "viennadancecrew.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vipf88.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vivo.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vtuber.land", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vv6957.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "w6729.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -64430,7 +64274,6 @@
     { "name": "cnymenshealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cododigital.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "comeyegroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "comicsans.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "contabilidadebrooklin.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "contactaffix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "correctemails.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -64720,7 +64563,6 @@
     { "name": "tintoria.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tohofc.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tomasmoberg.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "torresshop.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tqm1.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "twlitek.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "umail2.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65009,7 +64851,6 @@
     { "name": "nahouw.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nasladko.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "naslovi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ncascade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nednex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "networkmas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newdirectionsolar.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65167,7 +65008,6 @@
     { "name": "blenderman.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blogdefarmacia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "botnam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bouwplaatscheckin.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "briangosnell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brianpagan.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buddy-development-rabodirectconnect-api.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -65241,7 +65081,6 @@
     { "name": "getcheapinsurancenow.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "glamur-video.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "godan.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "goldlevelmarketing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goparity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goswak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "graviola.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -66034,7 +65873,6 @@
     { "name": "588e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "62222.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "88btt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "91milk.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "a2os.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "acapadena.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "accadia.academy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -66179,7 +66017,6 @@
     { "name": "israelil-leumidev.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "issoexiste.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "itdutchie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jaculus.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jehelpdesk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jeps.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jeroendev.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -66209,7 +66046,6 @@
     { "name": "ks996.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kuscheln.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "larpkalender.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "larryandprisca.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lebanonbitcoin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lichtletters-huren.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "linosky.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -66650,7 +66486,6 @@
     { "name": "indianjewellery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "infixegypt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "infotelecharge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ingestion.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "injurylawyer.world", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "innovacoachgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inoio.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -66668,7 +66503,6 @@
     { "name": "joorshin.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jppcadvertising.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "juweliervanwillegen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kaanhaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "karodos.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kathy.lgbt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kawaii.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -66834,7 +66668,6 @@
     { "name": "thekiddz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thutucxuatnhapkhau.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tipsdebellezaysalud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tobimi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tomstew.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tracknerd.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trainingswiese.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -68798,7 +68631,6 @@
     { "name": "sritspanish.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sritvermont.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "standartgost.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "starsandmanifolds.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stealthpressurewashers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stebenkov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stefchapman.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -69456,7 +69288,6 @@
     { "name": "bridgedigest.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brigittefontaine.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bromo.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "brownwolfstudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "browsbybecca.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bssolvfagen-pre-storeswa-wap.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "btc-alpha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71136,7 +70967,6 @@
     { "name": "demadryn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "der-rohrstock.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dermo-concept.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "df63.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "digitalch.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "digitalchurch.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "digitaldaily.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71352,7 +71182,6 @@
     { "name": "stylusgroup.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "subven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "supersandro.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "swgenetx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "swlabs.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sycca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "symplexia.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -71393,7 +71222,6 @@
     { "name": "valordotrabalho.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vandrielschoenen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vidady.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "villavaltava.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vintagecarparts.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vns89386.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vorsco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72139,7 +71967,6 @@
     { "name": "xlunastore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--80ageukloel.xn--p1ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--skmotoroptimering-zzb.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "xoommit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xy369.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yap26.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yavin4.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72164,7 +71991,6 @@
     { "name": "88home9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "88wewin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "9kb.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aaapo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "afashion.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aigner-club.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aigner-club.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72428,7 +72254,6 @@
     { "name": "snj.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sofiawestergren.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "softly.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sonderfloral.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "songyang.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "srfloki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "srkb.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72584,7 +72409,6 @@
     { "name": "diabhal-staff.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "digiepoxypaint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "digitalframe.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "disruptiveadvertising.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dnssecandipv6.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "doctorcalefon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dotnetdocs.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72613,7 +72437,6 @@
     { "name": "fgafsaneh.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fish4dogs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "florida-immigration.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fluidpicturesinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flying-dudes.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "forexarby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fortdodgeradio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -72920,7 +72743,6 @@
     { "name": "glamcosmetic.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "goldeneggs.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "graddient.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "grahamarthur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "growingsmiles.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "growwithdaylight.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gymlife.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73204,7 +73026,6 @@
     { "name": "christopherd.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clarkwifi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cleveille.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cliksource.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clinicos.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "codingblog.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "colonize.africa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73292,7 +73113,6 @@
     { "name": "magniflood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mansora.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "marijuanajobscannabiscareers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "martindoe.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "masterplumber.coach", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mcs-kutc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mcukhost.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73561,7 +73381,6 @@
     { "name": "fuckssl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "funktionevents.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gaetantremois.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gaozj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "garduri-electrice-animale.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "globalairsea.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "globalvoice.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -73930,7 +73749,6 @@
     { "name": "drewlearns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ducksoft.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eaglenation.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ecuteam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "edisa.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "electrum.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elena-baykova.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74521,7 +74339,6 @@
     { "name": "ceskaexpedice.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chapek9.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chicagobreastaugdrs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "chriswilding.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chronograph.pe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chronosgroup.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "classicfg.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -74597,7 +74414,6 @@
     { "name": "freedomhk.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freedomhkg.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freedomhkg.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "freevision.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fujieb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fxsshiwo.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "g00228.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -75427,7 +75243,6 @@
     { "name": "artofhappyliving.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aspireuniversal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aspirevc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aussiemilfs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "background-checks-systems.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "background-checks.asia", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "background-checks.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -75538,7 +75353,6 @@
     { "name": "greekplots.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "greiner-it.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "greinerj.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "groupescr.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grupoalpi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gryinx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "h36533.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -75624,7 +75438,6 @@
     { "name": "mercadosex.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "meridanas.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mgae.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mia.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mijngeldcoach.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mimolo.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mist79.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -75722,7 +75535,6 @@
     { "name": "soupbuahtaza.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sphericalvision.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "spmax.design", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sprossenwand.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stagemaster.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stamboomforum.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "statuswatch.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -75830,7 +75642,6 @@
     { "name": "abdullahavci.net.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "adamoshaver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aes-freundeskreis.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "affaire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agenciabonobo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ainzu.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ajbenet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -76006,7 +75817,6 @@
     { "name": "hardweb.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hastaneurunleri.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "haystackrenovation.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hearty.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hiyoko-shokutaku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hmeonot.org.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "homeworkacers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -76389,7 +76199,6 @@
     { "name": "action-verite.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "adv-f1.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agriquads.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "alliedpavers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "allspinecare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ampgroep.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amt-taxfrance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -76485,7 +76294,6 @@
     { "name": "dev-pmcc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dev.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "devconf.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "devpp.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dgangsta.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dhtr.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "digitalagencynetwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -76585,7 +76393,6 @@
     { "name": "jdproofing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jenniwiltz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jensdesmeyter.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "joaobautista.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "johnrosen.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jonaskarlssonfoto.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jonathanha.as", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -76821,7 +76628,6 @@
     { "name": "102ch.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "19990bb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "19990cc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "19990d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "19990dd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "19990ee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "19990ff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -77015,13 +76821,11 @@
     { "name": "fullcirclestudio.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "g22-livechat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gabe.house", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gamingroomaccessories.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gardensandgifts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gatomanias.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gaypirateassassins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gesamenvat.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "getboubou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gezondetips.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "glamira.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "global-monitoring.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "glutenfreehomemaker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -77689,7 +77493,6 @@
     { "name": "marketplacestrategy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "masdemexico.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "masterwayhealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "matthiasmueller.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mattrude.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maywoodpark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mbc.asn.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -77719,7 +77522,6 @@
     { "name": "myjarofhope.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myloanmanager.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nbook.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nectardigit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "netliste.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "netzwerk-lq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newyorkhiltonmidtown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -77748,7 +77550,6 @@
     { "name": "patlis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "patrickcurl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pcrab.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pedigreetechnologies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pendrivelinux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "performancepiers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "permista.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -79475,7 +79276,6 @@
     { "name": "widecontrol.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wolfhowl.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wonderland.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "wondium.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wordpressp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "worldvisionsummerfest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wrap.in.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -79967,7 +79767,6 @@
     { "name": "speeder.best", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "speederss.best", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "spteam.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "stevenapate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "studiekort.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "studiekortet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "studiekortet.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80754,7 +80553,6 @@
     { "name": "belgie-postcodes.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "belkamfish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bellabrowbydesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bennet.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bestguessonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bet86ah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bet86am.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -80814,7 +80612,6 @@
     { "name": "camptuk.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cani-compostelle.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cardideas.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "carnivorousplants.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "catherinejflee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cavaleirocity.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ccgx.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81761,7 +81558,6 @@
     { "name": "huai123.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "i0day.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ibex-lb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "internewscast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ionutnica.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ippo-juku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "isis.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -81877,7 +81673,6 @@
     { "name": "speciale.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sportingpontenova.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stacyscbdoil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "stadlwirt.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "starinc.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "startw.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "steffi-knorn.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82108,7 +81903,6 @@
     { "name": "logibow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lucade.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lumoria.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "luxury-inside.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maisapanama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maisie.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "malcolmellis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82514,7 +82308,6 @@
     { "name": "hoffmann-fliesen-design.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "homedentist.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hostpoint.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hotdates18.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ichinghero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ignation.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iiet.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -82776,7 +82569,6 @@
     { "name": "zusterjansen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zwilla.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "11ag8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "123viajando.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "12ag8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "13ag8.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "16ag6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83516,7 +83308,6 @@
     { "name": "capssouthafrica.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "carcountking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "caritascenter.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "carlosbronze.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "carre-jardin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "carsinsuranceis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "casamiento.com.uy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83627,7 +83418,6 @@
     { "name": "digchip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "digchip.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "digchip.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "digitalcanvas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "digitallive24.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "digitalproj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "digitium.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83683,7 +83473,6 @@
     { "name": "englishliterature.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "enigmadark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "epsilon.photography", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "eskiegaming.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "esmibot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "est8.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "estudosnacionais.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -83821,7 +83610,6 @@
     { "name": "hoogelandzorg.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "horaciolopez.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hostedghost.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hotdates18.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hothub.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "howunadeydoam.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hucklebucks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84296,7 +84084,6 @@
     { "name": "soundmoney.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sourcecode.hosting", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "southernviewmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "spacebabies.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "speaker-animateur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "speedliner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sponsor.software", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84592,7 +84379,6 @@
     { "name": "bdtc.com.bd", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "be-in.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "be.ax", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "beatsearch.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "belidzs.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beratung.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bergunabanget.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84646,7 +84432,6 @@
     { "name": "cardiosportsilvinadelgado.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cardloan-center.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "careercapital.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "carlesjavierre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "carlospiga.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "carpetinstallationpros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "casadeladiabetescali.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84683,7 +84468,6 @@
     { "name": "comunidadciclismo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "conntrack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "constructoraferamaingenieros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "controlshiftlabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cophumouraustralia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "copygeneral.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "corneerasmus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84785,7 +84569,6 @@
     { "name": "encode.training", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "entomobolivia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "entrenossocialinfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "erapotensia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "es.ax", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "essentieleolie.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "etdp.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -84810,7 +84593,6 @@
     { "name": "findolino.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "findolino.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fiosgenomics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "firmground.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fishygames.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fitandfightrijswijk.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flatart.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -85382,7 +85164,6 @@
     { "name": "thecorianderkitchen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thefabulouslifestyles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thegingersnapbaker.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "thestable.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thewebaround.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tiandixing.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tilid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -86052,7 +85833,6 @@
     { "name": "33kpkp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "33vu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "33zaza.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "33zv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "33zxzx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "34ac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "34ae.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -87107,7 +86887,6 @@
     { "name": "hardmagic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hautzentrumwien.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hersmartchoice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hidglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "highgatejoinery.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "highlandpublicschool.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "himalayanoutback.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -87171,7 +86950,6 @@
     { "name": "kylehaka.la", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kylehakala.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lechucero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "leonvermunt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "livingtohearsix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "localbiketrader.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "localemergencyplumber24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -87423,7 +87201,6 @@
     { "name": "amp-logistics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "andrewmichaelsmith.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "angievancise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "antocom.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "apvc.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "areminder.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arjanhofmann.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -88033,10 +87810,7 @@
     { "name": "zakbk.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0km.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0x2a.ninja", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "1211bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "1266bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1277bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "1299bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "171365a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "171365b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "171365c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -88063,13 +87837,9 @@
     { "name": "171365z.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1clic1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "2122bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "2322bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "233.land", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "233.services", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "233image.land", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "2366bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "2377bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "2399bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "24webservice.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "30for30podcasts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3133bet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -88156,7 +87926,6 @@
     { "name": "babyvillagegt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bachelorampel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "backporchartists.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "banimarket.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "basamadco.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "basementdoctorwestvirginia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "basementdoctorwv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -88717,7 +88486,6 @@
     { "name": "lekkerleben.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lesborgestv.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "leticia.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "letiziamx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "letsdevelop.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lfcnsv.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "libcip.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -88794,7 +88562,6 @@
     { "name": "mychicken.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myfsb.bank", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myfutureself.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mynook.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mypet24.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mytefl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "narec.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -95868,7 +95635,6 @@
     { "name": "ryazancity.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rybinsk.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rybnitsa.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ryland.consulting", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rymanow.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rymergames.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rzero.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -99121,7 +98887,6 @@
     { "name": "midi-coquillages.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "miisy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mikeyroxtravels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "miratechgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mirumhongkong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "misson.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mlfitnesscenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -99140,7 +98905,6 @@
     { "name": "mycloudhome.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myriadlex.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myswimmingclub.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nataschaskraamzorg.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nbsgames.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nejrecept.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newikis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -99253,7 +99017,6 @@
     { "name": "techiecomputers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "technews360.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "teknisetdemarit.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tepui.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "texnogu.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thegatewaytoanewworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "themedicalmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -99356,7 +99119,6 @@
     { "name": "backflow.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "baecker-know-how.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "baghtelecom.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bayanbennett.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bbcustomremodeling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bbunits.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bcyw56.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -99391,7 +99153,6 @@
     { "name": "chinafree.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "christo.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cibleclick.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clariti-health.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clementpinon.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cloudfree.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -99559,7 +99320,6 @@
     { "name": "locksmithunit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "locksmithunit.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "logodzyn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lojahbk.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lojavirtualdopsicopedagogo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "losangelesescorts.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "luisabreu.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -99758,7 +99518,6 @@
     { "name": "sumareaguas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "summer.today", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sumutoday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "suntzuparadirectivos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "supercours.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "support96.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sweetologist.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -100095,7 +99854,6 @@
     { "name": "keshankang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "key.lol", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kibazen.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kinklist.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kinkyheretics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kokily.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kristineskitchenblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -101038,7 +100796,6 @@
     { "name": "eternia.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ewelinagrochowina.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "exashop.tn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "explodingearths.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "expobeds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eyestrainexplained.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "familytravelmagazine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -101713,7 +101470,6 @@
     { "name": "mypiloteis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myrasp.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "n30019.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "naganoziotech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "naturopatiasiddharta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "neimadtelliam.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "neither-side-news.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -101786,7 +101542,6 @@
     { "name": "pohoron.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "point.pink", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ponteachambear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pontupagina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pooteng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pornline.sex", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pornogam.porn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -102160,7 +101915,6 @@
     { "name": "fenyks.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "finalgambit.band", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "firstbaptistchurchofchrist.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fitmybike.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fl0w.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flowbuk.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flowcrypt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -102336,7 +102090,6 @@
     { "name": "novaway.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nycstyleboutique.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oecdpisaforschools.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "offtherayles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ohiowebtech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "orbitgoods.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "osdnc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -102465,7 +102218,6 @@
     { "name": "verdi.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "verzi.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "villu.stream", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "virtool.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vivo.cam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "voltajedigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wallabywallaroo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -102768,7 +102520,6 @@
     { "name": "linulex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lizteacher.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "locoxlasmascotas.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lojaonlineshop.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "loopcore.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lost-in-place.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maiotik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -102987,7 +102738,6 @@
     { "name": "xpsauto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xpsautomation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xvaldezendocrino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "yamanami.tokyo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yourcrypto.tax", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zamtech.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zenspace.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -103811,7 +103561,6 @@
     { "name": "santandertrade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sarahjaneredmond.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "saxobroko.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "schoffelcountry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scifplus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scifsafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scorb.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -103859,7 +103608,6 @@
     { "name": "thewaytoyourself.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thoplam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tiendamaquillajes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tilcra.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tinmarin.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tradeshift.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trains.sexy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -104128,9 +103876,7 @@
     { "name": "hope21.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hopkinsmediation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hotelfloridachaco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "howarh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "howtohomeschool.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hypertesto.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hypr.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iamattila.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ifederalland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -104396,7 +104142,6 @@
     { "name": "venbraca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "verstaanwiskunde.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "verygoodwebsite.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vidaxp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vincentwolsink.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vincie.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vipturismo-europa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -104808,7 +104553,6 @@
     { "name": "polifisio.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "poppylala.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pornbot.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "precisionstocks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "privatefiles.host", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "proxybay.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qlulife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -105009,7 +104753,6 @@
     { "name": "braun-soddisfattiorimborsati.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bricks4kidzelearn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brickvortex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bridges2understanding.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brizzo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "broca.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bsknri.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -105097,7 +104840,6 @@
     { "name": "fenotipo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fetishwheels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "financialnews.today", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fiorebjj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fireplacesutah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flagstoneim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "flibanserina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -105245,7 +104987,6 @@
     { "name": "meperidina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "messengerwebdesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "metrosyvaras.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mgfashion.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "michaelamead.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mijncloud.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "minhng99.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -105321,7 +105062,6 @@
     { "name": "principedepaz.gt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "println.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "privanza.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "prixpictet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "productivemachine.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prosperos-services.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prostaglandina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -105381,7 +105121,6 @@
     { "name": "stellarlumensnews.today", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stockmarkettoday.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stormdamages.claims", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "strategicmind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stumblefallcrawl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stx.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "styllussports.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -105635,7 +105374,6 @@
     { "name": "droneways.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "duansunshinesdiamond.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dvwa.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "e-estonia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ecamisetas.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eclipse4academia-startups.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "egypttimetravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -105751,7 +105489,6 @@
     { "name": "jy11.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "k2analytics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kakazai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kappawingman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "karlov.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "khalidalnajjar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kienviethung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -105820,7 +105557,6 @@
     { "name": "nk-vision.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nkontur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "notimesupport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nunogand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oandareview.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "obscur.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "odiris.lk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -105950,7 +105686,6 @@
     { "name": "totalinfo.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trade99review.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tragaver.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "travelix.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "treatmentindiana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tronnews.best", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tronnews.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -106354,9 +106089,7 @@
     { "name": "mrcool.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mrtg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mssa.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mtsn3padang.sch.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "muchbetterthancash.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mutahar.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mydaymark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mylittlegrocer.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mylittlegrocer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -106457,12 +106190,10 @@
     { "name": "sandramorrone.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sarah-secret.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sardegnarifiuti.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "satyamshivamsundaram.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "saul-eslake.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "secrets-marketing.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "security-courses.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "segurdatacr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sekko2.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sendai-cdc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sendai-ctr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sendai-rc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -106872,7 +106603,6 @@
     { "name": "logalot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "long-journey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lprr.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lucaplus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lucasrajaonutricao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maarivpn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "madmenmedia.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -107044,7 +106774,6 @@
     { "name": "sterlingtechnotrade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "straightlinetutoring.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "success.market", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sukriyedonmez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "suncitycinemas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sunday.pm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "synccore1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -107507,7 +107236,6 @@
     { "name": "shireyishunjian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "siemens.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "silverbox.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "simply2020.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sitechange.dedyn.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sjaaktrekhaak.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "skygates.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -107650,7 +107378,6 @@
     { "name": "alonsoluzgas.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "altadancesport.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alvarojacome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "amalbansode.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ampdes.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "andislaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "apruebaexamenes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -107896,7 +107623,6 @@
     { "name": "kuisus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kwx.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "l4s.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "landoftherisingson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "langyamk.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lastrourbanismo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "legba.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -108058,7 +107784,6 @@
     { "name": "tishsglitches.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tmstats.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tontonroger.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "top1.com.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "toplevel.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trouvons.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ttcmed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -108126,7 +107851,6 @@
     { "name": "almasteb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alphalight.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alphalightgear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "amineamellouk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anjaamelia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ankarakurumsalwebtasarim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ao3-cn.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -108371,7 +108095,6 @@
     { "name": "pelatihanwirausaha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pension-chevaux.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "persuasionmatters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "phg-eg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "plexmark.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pmi-install.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pmrockstars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -109334,7 +109057,6 @@
     { "name": "ethicalads.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "etsu.edu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "evante-bus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "examesrush.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "examroll.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "excite.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "expressrepair.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -109454,7 +109176,6 @@
     { "name": "harakahdaily.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hardinal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hargaindo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "healthequity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "heartofamum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hellven.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "heraldmakassar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -109579,7 +109300,6 @@
     { "name": "lasmorfianapoletana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lastlightlodge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "latdor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "latouchemusicale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "laura.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "laurahausmann.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "laventura.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -109678,7 +109398,6 @@
     { "name": "ncegs.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nepdtp.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "netlify.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nettruepro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newmuslims.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newsbytesapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ngutek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -109772,7 +109491,6 @@
     { "name": "pressnetwork.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "price-tracker.duckdns.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pricetum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "privatehd.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pro.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "productmarketingalliance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "productum.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -110111,7 +109829,6 @@
     { "name": "beauty-salon-lino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beautyinfos.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "biki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "billy.wales", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "binabangsaschool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bioselect.com.cy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blastoise186.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -110502,7 +110219,6 @@
     { "name": "arcskoru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "armyholidays.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "armyrtf.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aroncull.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "arsenalzae.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ashwainfo.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "asthma-uk.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -110753,7 +110469,6 @@
     { "name": "polisanaraka.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "polisanarciarska.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "polisynazycie.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pollyundpaule.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "porkyx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pornodvdkopen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "povzetki-knjig.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111362,7 +111077,6 @@
     { "name": "amaismarket.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amithvijayan.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anlitas.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "answering365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "antenadorada.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aperture.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "apkfame.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111538,7 +111252,6 @@
     { "name": "libget.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lifebun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "liquidplus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "loavies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "loli.edu.kg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "londynelliot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "love4taylor.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111640,7 +111353,6 @@
     { "name": "stopthemoss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "strijdmeevoorvrede.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "strikers.futbol", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "strongdm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stroopwafel.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "studentingent.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sumatogroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111707,7 +111419,6 @@
     { "name": "42browning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aanmeldensecundairescholen.gent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ackadia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aeonc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ageasagentessummit.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "agrotek.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aicamilwaukee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111748,7 +111459,6 @@
     { "name": "belfa.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bijlesportal.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "billiebikes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "birdgifs.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bit-and.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bitpress.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blaarmeersen.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -111847,7 +111557,6 @@
     { "name": "fossbytes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freakinstream.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freetrial.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "freshplus62.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "futureindia.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "futureshock7130.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fyziotomi.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -112047,7 +111756,6 @@
     { "name": "s20121946.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "safetymeasuresas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "salaamgateway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "samroelants.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "samuel-philipp.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scholarsclub.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scottandtammy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -112107,7 +111815,6 @@
     { "name": "trarch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "travelbags.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "travelbags.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "treatyoself.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tulippublishing.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tutorialforest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uhost.cyou", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -112246,7 +111953,6 @@
     { "name": "cxda.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cybernest.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cybertik.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cycling74.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dachshundtalk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dashboard.gov.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dashboardph.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -112789,7 +112495,6 @@
     { "name": "cdrom.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cecamericas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "centurion-it.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "certprep.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "certpro.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cfent.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cfo4you.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -112920,7 +112625,6 @@
     { "name": "esm.run", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "espenandersen.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "everythinglidia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "examesrush.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "excellence.corsica", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "executivecatering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "expandtheroom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -112987,7 +112691,6 @@
     { "name": "gyefund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gyefund.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "h2orto.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "habrastorage.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hatierchinois.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hcr2bot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "healthyhomeventilation.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -113508,7 +113211,6 @@
     { "name": "zahnarzt-backfisch.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zelvar.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zerofogmask.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zerty.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zhstar.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zimedia.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zorgenvoorherena.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -113717,7 +113419,6 @@
     { "name": "init3.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "inkhub.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ipass.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "iprep.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "isaacgolding.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ite.st", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ivnext.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -113850,7 +113551,6 @@
     { "name": "saisyuusyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "samanthabiggers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "samuel-brown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "samuelbramley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "san.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sangitafoodmess.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sanity.host", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -114180,7 +113880,6 @@
     { "name": "digitalis-france.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "disinfectiondoctor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "divinecnainstitute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dodomy.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dolle-shop.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dpc.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dues-eckert.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -114290,7 +113989,6 @@
     { "name": "inwonderofit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ip-addr.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iqreview.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "isleyfarmsupply.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "israel-escorts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "israelimtovim.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "itsgreener.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -114472,7 +114170,6 @@
     { "name": "platinmods.my.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "polymathian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pozyka.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "prepz.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "press-wall24.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pricesdoors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "profarm.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -114631,7 +114328,6 @@
     { "name": "valerieorsoni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vault.spdns.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vdheyden.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "verkiezingsuitslagen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vermaeckbouw.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vfwauxiliary.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vipku.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -115287,7 +114983,6 @@
     { "name": "swissmarket24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "symbolics.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "symstar.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "symvolik.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "syuumi.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "t-shirt-template.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tabletsandlaptops.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -115295,7 +114990,6 @@
     { "name": "taiyou-planning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tamamo.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tarper24.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "taskussa.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "taxadvantagellc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tayanasolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "teacherfrancis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -115363,7 +115057,6 @@
     { "name": "usahealthwebapps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ussst.org.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "valencraft.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "valencraft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "valeryaksesuar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vanderbeekonline.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "venev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -115456,7 +115149,6 @@
     { "name": "almanea.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amateur-ham-rad.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amazingpetshere.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "amigosdivecenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amindset.hk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "analisi-grammaticale.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "analisi-periodo.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -115507,7 +115199,6 @@
     { "name": "attlane.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "attorneystrialgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "authenticate.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "autoblok.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "autobot.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "autogarant.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "autohausmf-nord.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -115852,7 +115543,6 @@
     { "name": "hclu.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hds-rx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "headofhair.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hearty.gift", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "helprf.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hen.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "henri.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -116080,7 +115770,6 @@
     { "name": "modaadesso.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "modelflight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "modenuit.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "moer.tel", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mondpo.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moneybirdstorage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "montillafarm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -116090,7 +115779,6 @@
     { "name": "morningchew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "morooi.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mortgagewebinars.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "motopoland.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mototeam.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mrupp.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mrzauto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -116392,7 +116080,6 @@
     { "name": "taijutsubudo.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tammelin.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tannercorporation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tarfandgram.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tasteofadventure.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "taxborn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tbi.equipment", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -116451,7 +116138,6 @@
     { "name": "tuulialaine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tychoverstraete.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tygochrum.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tylertysdal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ubberup.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uberalles.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ue30.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -116619,7 +116305,6 @@
     { "name": "yuharahisako.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yumechi.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yzervast-heestert.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "yzydo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zamokservis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zayzoh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zdenekpasek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -117046,7 +116731,6 @@
     { "name": "bestdslrcameras.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bestgriefbooks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "besthairsale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "besthomescents.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "besties4life.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bestreleases.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "besttipsntricks.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -117914,7 +117598,6 @@
     { "name": "elfranco.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eliminations.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elinformatico.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "elisabethborgermans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eliskamyskova.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elite-forums.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elite-units.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -117934,7 +117617,6 @@
     { "name": "eltormo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elverdaderoamor.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elvikom.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "elvikom.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elvis-presley.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "email24.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "emavending.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -118030,7 +117712,6 @@
     { "name": "evopack.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eworldmedia.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "examlab.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "examroo.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "exarcheia.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "excelglobalpartners.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "exclusivemarket.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -118854,7 +118535,6 @@
     { "name": "kontabilitet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "konyahaber.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koolkool.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "koomaldreaming.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kooratalk.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kopb.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koreanure.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -120391,7 +120071,6 @@
     { "name": "tipnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tirebichon.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "titanicauto.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tlicycling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tnved2013-narod.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "toki-doki.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "toledo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -120457,7 +120136,6 @@
     { "name": "trophcomplewin.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tropiweb.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trubmet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "trugears.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trulock.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trustvox.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "truthlost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -120534,7 +120212,6 @@
     { "name": "upfurniture.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uportal.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "upr.llc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "uptech.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uqschool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "urbanarcana.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "urfreecon.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -120929,7 +120606,6 @@
     { "name": "aihschgo.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ajramos.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alamitosbaytraders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "albatrosboat.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alenbadel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alexandre-barret.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alexeyweb.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -121168,7 +120844,6 @@
     { "name": "comunidadeseo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "concealoutfitters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "conditionyellowacademy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "connectedrisksolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "conssec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "consultation.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "contrapeso.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -121621,7 +121296,6 @@
     { "name": "kitesurfen.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "klawitter-kreis.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kleki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "knowuproxy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koiro.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kolkatanight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kormmi.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -121637,7 +121311,6 @@
     { "name": "kwikkarkave.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kwikkarofmesquite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kwikkarrichardson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ladybirdeducation.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lakspuiterijmosman.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lanabello.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lansoft.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -122202,7 +121875,6 @@
     { "name": "tcsemotion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tcshairandbeauty.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "teachermommylife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tealegrar.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "teamkgsr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "teamwork-bad-wurzach.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "teatrolatea.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -122459,7 +122131,6 @@
     { "name": "4budget.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "84036.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "a356.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aaliyahclothing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aamt.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "abayakaram.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aboutconstruction.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -123880,7 +123551,6 @@
     { "name": "powersurgedatasystems.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "praxisfilms.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pretty-liars.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "prettymama.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prikolkz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "projectimagine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prostitytki-nijnevartovsk.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -124347,7 +124017,6 @@
     { "name": "camcapital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "campingbuffs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "capitalmarkets.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "car-diagnose.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "caraliadeluxe.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cat2heory.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "caulkingexperts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -124426,7 +124095,6 @@
     { "name": "eaofcarrollton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "easukasbestos.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eco69.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "econstitution.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "egotripproductions.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elcozinante.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "electricit.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -124652,7 +124320,6 @@
     { "name": "ncrypt.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "netletic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newsinfo71.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nieuwsberichten.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nilmaracursos.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nilmaraquintela.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "noradanismanlik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -124734,7 +124401,6 @@
     { "name": "qualitypolyjacking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qualitywaterproofingco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quanquan.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "qxpress.com.py", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rangersofbelgium.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "raomed.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rdv-coquin-rapide.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -124810,7 +124476,6 @@
     { "name": "springmountaindistrict.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "standardizarea.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "staywild.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "stefankuehnel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stinkmemes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stockhuntertrading.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stocksfam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -124881,7 +124546,6 @@
     { "name": "viscondedemaua.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "visitislandpond.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vitaalfitcoaching.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vivi.zone", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vongdeophongthuy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "voxsiren.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vutruso.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -124936,7 +124600,6 @@
     { "name": "zenti-im-zug.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zerodechet.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zjawa.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zorgvanoranje.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zotan.photography", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "0cean.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "100v.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -125874,7 +125537,6 @@
     { "name": "akonlineworks.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alasdupur.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alcatraztourtickets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "alctel.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aldastv.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aldo-shop.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aleks.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -126283,7 +125945,6 @@
     { "name": "clickzagency.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clindamycinantibiotic.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clinicamagdalena.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "clinicmono.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cloneuniverse.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clonoe.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "clothilde-wattelier.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -126378,7 +126039,6 @@
     { "name": "deutschlandreport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dev-ylinternal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "devendrameena.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dexerto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dfaapostille.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dianoxofficiel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "diasporan.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -127590,7 +127250,6 @@
     { "name": "purtahan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pvplounge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pyjy.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "qiu.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qparents.qld.edu.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qrlab.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qrlab.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -127913,7 +127572,6 @@
     { "name": "sonsonate.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sophomoric.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sosnova.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "soste.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sosteric.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sota-tv.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "soundshepard.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -128539,7 +128197,6 @@
     { "name": "bigmonsters.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "biletturk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bimbingan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bintanglautplatinum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bioadva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "biographymint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "birone.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -129923,7 +129580,6 @@
     { "name": "californiabudgetfinance.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "camped.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cangku.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "capris.cr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cartegrise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "casinocity.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "castillo.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -130324,7 +129980,6 @@
     { "name": "jnx.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "joeshare.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "joeshimkus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jogoshoje.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "joiceorthopaedics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "joycosmetics.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "juegosalcubo.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -130341,7 +129996,6 @@
     { "name": "kingston-fear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kleinhapl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "klexhub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "klinikatlantis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kolabtree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kommerciya.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kompliant.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -131053,7 +130707,6 @@
     { "name": "behindthedesk.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beiramar.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "belarus.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bellflowerlactation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bellyaccessoriesest.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beptutotnhat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bergwandercamp.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -132630,7 +132283,6 @@
     { "name": "serwusik.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sexworkrights.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sfhp.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "shadhoc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shaned.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sharpletters.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shed49.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -132840,7 +132492,6 @@
     { "name": "thingformatter.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "threethirty.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tilecenters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tmamontreal.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "toku.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tomdougiamas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "top-aanbiedingen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -133595,7 +133246,6 @@
     { "name": "macabeo.bio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "malmomusikskola.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "marbermedical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "marcotolk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "marqueandbrew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "marrakech-desert-trips.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "martinbiely.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -134236,7 +133886,6 @@
     { "name": "growledlamp.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "growledlamp.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "guisador.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gunbot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hantera.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hardcoreincest.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "haval.iq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -134274,7 +133923,6 @@
     { "name": "kevinvermassen.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kiprooks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kn6olc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kostavro.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "krednal.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kura.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kuruwi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -134423,7 +134071,6 @@
     { "name": "snakesolid.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "snorer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "solanowonen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "somni.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "southgeorgiacargotrailers.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "soyka.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "staffhours.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -135418,7 +135065,6 @@
     { "name": "antoniorodriguesadv.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anyebooks.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anyebooks.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aoi-ryo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "apollomobile.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aquedim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ararat-rp.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -135522,7 +135168,6 @@
     { "name": "businesslondon.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "businessnewsera.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "businesstexas.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "butsoccers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buyornot.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bv-driver.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "caindelhi.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -135750,7 +135395,6 @@
     { "name": "guysroulette.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gymnastic.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gymnastic.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gyx.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "haberkotherapy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hairgrowth.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hairloss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -135850,7 +135494,6 @@
     { "name": "joingy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "joingy.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "josisummer.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jrtech.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "judge.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ka-kousin.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kaboommagazine.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -136029,7 +135672,6 @@
     { "name": "politicsnews.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "poolspa.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "poppersy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ppusl.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pravagolosa.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pre-commit.ci", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "preservecrownhill.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -136714,7 +136356,6 @@
     { "name": "budapestgraphics.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bugraseyhan.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bulentcirakli.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bulhost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bullish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bumirc.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "buscagenealogia.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -138465,7 +138106,6 @@
     { "name": "recursosrev.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "redfish.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "redhackerteam.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "redper.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "reedy.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "regele.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rehab.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -138875,7 +138515,6 @@
     { "name": "thetoto.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thewebmasters.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thewish.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "thingswithleaves.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thinkwits.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thr-kurd.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "throneofmolok.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -139422,7 +139061,6 @@
     { "name": "cm-penalvadocastelo.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cmperalta.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coco-01.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cointree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "commagere.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "computer-service.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "concilioderivendel.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -139697,7 +139335,6 @@
     { "name": "lesnet.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "letterrill.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "libramedia.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lilithqueisser.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "limitededitioncomputers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "limitededitionsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lipnihezron.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -139848,7 +139485,6 @@
     { "name": "posterlounge.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "posterlounge.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pr92.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "practitest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prijzen-vergelijken.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "primesensecosmeticos.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prismaot.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -139859,7 +139495,6 @@
     { "name": "queenondvd.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quest3.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ranchu.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "randyandpixel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rangemarketing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rapbull.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rayonnage-stockage.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -140096,7 +139731,6 @@
     { "name": "airquestion.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "akustyka.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alavieestbelle.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "albaneselorenzo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alerque.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alexlambertz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alexridevski.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -140139,7 +139773,6 @@
     { "name": "askusutah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "assoft.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "asteracancercare.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "atlasgaming.ma", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "audiobit.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aureshotels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "autoinkoop.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -140513,7 +140146,6 @@
     { "name": "eurocontrol.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "evacuinera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "evakuator-kharkov.kh.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "evoluzione.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "evoting-test.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "expodom.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "expodom.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -140800,7 +140432,6 @@
     { "name": "perusteet.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pet-guide.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "petersotare.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pinebeecreative.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pixifi.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pixyship.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "planetamestizo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -141701,7 +141332,6 @@
     { "name": "hobo.video", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hoc-bv.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "holydumplings.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "homewell-hk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "honeyuniversity.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hoofexplorer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hoofexplorer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -141865,7 +141495,6 @@
     { "name": "madeinua.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "magnetremodeling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mahdi.style", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "maisproduzida.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "malacat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maldivestraveller.mv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mamilove.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -144728,7 +144357,6 @@
     { "name": "casinocity.vu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "catlicking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "caxaa.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ccaag.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ccwallet.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ceiphr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cfdt-fleurymichon.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -144880,7 +144508,6 @@
     { "name": "huboo.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hypercritical.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hyunjoonkim.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "idctechnologies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "igamingnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ikbenrichie.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "immanuelos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -145169,7 +144796,6 @@
     { "name": "stuartwilsonhair.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "subology.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "summitpediatriaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sundoctors.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sunglassstyle.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sunrisesolutionsutah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "superops.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -145343,7 +144969,6 @@
     { "name": "azjosh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "azonic.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "babel.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "balicari.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bdsmbibliothek.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "beanboygames.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "best-pool-cleaner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -145360,7 +144985,6 @@
     { "name": "bradyosborne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bridgethailand28chidlom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brightshinystuff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "brilliantvintage.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "broca.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brock.guide", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brockenhurstguide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -145417,7 +145041,6 @@
     { "name": "cyberzone.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dadroidrd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dankrokos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "davehewison.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "davidsmedberg.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dd3ah.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "debashishsahu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -145895,7 +145518,6 @@
     { "name": "autoroutes.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "available.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "awakinn.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "aydahwa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "b5i.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "babycezi.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "babytoschool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -146562,7 +146184,6 @@
     { "name": "wildvicky.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "williamlong.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "winchuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "wogame.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wowpilates.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wrozbyzkartklasycznych.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xavierxu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -146618,7 +146239,6 @@
     { "name": "asapmail.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "asdf.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ashgroveclinic.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "asur.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aulialaundry.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "azkunazentroa.eus", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "barramansa.rj.gov.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -146663,7 +146283,6 @@
     { "name": "ch-poitiers.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "childrenoftheshadow.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chineseplease.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "chrawrizard.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chriscelkins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "christianotero.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "civilconcretellc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -146831,7 +146450,6 @@
     { "name": "literaturkreis-online.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "literaturkreis.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "literaturpreis.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "log.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lorisvelos.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lossecretosdedorian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "losyandex.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -147228,7 +146846,6 @@
     { "name": "edevletkapisi.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "edupesa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "efcpharma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ehdlofsweden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ejkathome.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ejkatwork.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ejkenergie.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -147327,7 +146944,6 @@
     { "name": "igpromo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ilikevaping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "imksk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "imlzc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "imoe.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "imranc.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "individualrestaurants.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -147431,7 +147047,6 @@
     { "name": "mordelles-altitude.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "morrisbart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mrg-team.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mtexpert.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "murrietadogtrainers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "muslimclothing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mutagen.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -147847,7 +147462,6 @@
     { "name": "haveibeenpwned.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hayward.uk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hcqmeta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "heartymail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "help24.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "herez.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "highcalorierecipes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -147905,7 +147519,6 @@
     { "name": "maid.gay", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "manderstam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "marocfoot.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "maxrickettsuy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maytretrungphuong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medialine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mediangr.com.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -147950,7 +147563,6 @@
     { "name": "paralleum.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "parastasi-clothes.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pardanaud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "patguzmanconstruction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pcsolottodraw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "peopleappstech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "perrosenlapradera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -147996,7 +147608,6 @@
     { "name": "servercore.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "serviciotecnicoencomputacion.com.ve", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shoppingonlinecoffee2u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "shoveltoss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sidralmundet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sightsecurity.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "simranmehta.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148031,7 +147642,6 @@
     { "name": "thegoodveggie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "themealpantry.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tiremoni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tirodirecto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "toddvbanks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tomi.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "topdogtrainingcourse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148182,7 +147792,6 @@
     { "name": "bonvorur.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bookmaker.expert", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "borntobetogether.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bortox.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brainshit.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brandor.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bravegk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148240,7 +147849,6 @@
     { "name": "cognitivehealthintl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "coharushika.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "compassivaimoveis.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "conclusion.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "corneranimal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cradleaccounting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "crmplace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148281,8 +147889,6 @@
     { "name": "drgabrielschmitt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "drink.casa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "drivingsupport.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dublinhonda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "dublinmazda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "e-e.icu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "e-gc.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ecopark.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148309,7 +147915,6 @@
     { "name": "esperancario.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ethzero.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "evalcorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "examinrush.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "expoxl.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "faroitalia.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fcblueboys.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148326,7 +147931,6 @@
     { "name": "forest-soft.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "forexsignalroom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fovndry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "freeman-toyota.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freemilf.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freenomyoulilb.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "freightcenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148378,7 +147982,6 @@
     { "name": "hadoora.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "happyflow.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "happystores.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "haywardhonda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hdvburs.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "heijmans.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "heptagonsystems.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148563,7 +148166,6 @@
     { "name": "nordbusinessaccount.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "northboot.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "novumsafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "novumsoft.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nqeshreview.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nugnet.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nulldev.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148726,8 +148328,6 @@
     { "name": "torino.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "totalwebpartners.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tqnx.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tracyhonda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tracymazda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "traeger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "traegergrills.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "trafficmgr.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148797,7 +148397,6 @@
     { "name": "yachts.rentals", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ycalculators.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ycl.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "youcruit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yourberksbucksoxon.wedding", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yourgloswilts.wedding", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yourkent.wedding", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -148959,7 +148558,6 @@
     { "name": "bosquedepalabras.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "boumstudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bracesbyberry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "braeden.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bratt.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brauhaus.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brew.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -149200,7 +148798,6 @@
     { "name": "gotchaphotos.net.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gotowebstore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gotravelmexico.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gottagohack.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grahameger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grancargo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grechutaszkolenia.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -149385,7 +148982,6 @@
     { "name": "mos-upak.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mujer.gob.do", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mukli.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mxtm.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myfloridarealty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mygolod.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "myhechar.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -149546,7 +149142,6 @@
     { "name": "sandlerpartners.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sanhotel.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sanjanaherath.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sanleandromazda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "saqara.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "schneider-dresden.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "schroderusa.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -150719,7 +150314,6 @@
     { "name": "bluelime.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bmrpainting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "boisehomeoffers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "boldare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bongit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bonitech.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bono3.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151257,7 +150851,6 @@
     { "name": "rahasyavedicastrology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rbi-admin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rbi-umbrella.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "rcforex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rctrk.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "reachpersonalgrowth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "readcity.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151355,7 +150948,6 @@
     { "name": "steamlevelmarket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stephenbakalian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stethostalk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "stetsed.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stmaryskutztown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stonesgarden.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "storageshedsnc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151491,7 +151083,6 @@
     { "name": "what.ink", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "whichphish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "whizkidpcservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "wholebody.je", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "wildglass.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "woodlandgarden.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "woodvibes.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151638,7 +151229,6 @@
     { "name": "dressshopboutique.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "drfuhrman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "druckagentur.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "drybms.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "drziyayavuz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dukkanacmak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dutch-fieldhockey-drills.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151817,10 +151407,8 @@
     { "name": "neometals.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "neurococi.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "new-mexico-sexcams.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "newcapitaldev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newcinema.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "newemage.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "niledevelopmentseg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nimbo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nipponkaigi.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nirex.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151841,7 +151429,6 @@
     { "name": "panamasportsfactory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "paycaptain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pentopolimer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pergam.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pergam.kz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pergam.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pgp.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151900,7 +151487,6 @@
     { "name": "soliujing.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sonbilgi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sontaycamera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "soopy.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "starrosesandplants.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "statscrew.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "stjh.org.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151924,7 +151510,6 @@
     { "name": "temoinfidele.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "temp-lars.army", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tequenikality.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tesladeaths.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thatguy.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thatsnotathing.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thoth.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -151943,7 +151528,6 @@
     { "name": "try2services.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tt-bentley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ttug.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tuneserver.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tutarot.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tyroola.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tyu.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -152014,7 +151598,6 @@
     { "name": "alluance.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "amal.co.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ambersafety.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "amotarget.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ancade.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "annoyinggui.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "antlerprojects.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -152081,7 +151664,6 @@
     { "name": "chiara.net.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "childrensdentalranch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chocorp.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "chrestos.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chronnick.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chungachyan.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cimat.ma", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -152209,7 +151791,6 @@
     { "name": "grambaba.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "graphicz.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "growfedbiz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "haber.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "habtum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hajajaam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "halgap.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -152437,7 +152018,6 @@
     { "name": "sbtv.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sby-tampere.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "schuhfits.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sebastianelectric.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "semalt.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "seoefectivo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "seoeye.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -152471,7 +152051,6 @@
     { "name": "superfilmgeldi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "superfullhdfilmizle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "superpowerexperts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "surmoms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "swingers.com.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "talichi.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "taxjusticeafrica.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -152831,7 +152410,6 @@
     { "name": "andreaskloebl.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "andreasxp.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "andrespr.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "andrewsfasteners.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "andythomsonbooks.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anfadern.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "anfr.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153369,7 +152947,6 @@
     { "name": "camerata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cameronwince.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cammamam.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "campuskota.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "canadapropertyexpert.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "canceraid.coach", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "canceraid.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153432,7 +153009,6 @@
     { "name": "cervellomorto.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cesarteixeiraimoveis.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cesurteknikservis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cgaro-amerstd.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cgbf.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cgise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "chakanaherb.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -153695,7 +153271,6 @@
     { "name": "cyber-article.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cyber-swiat.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cyber-tarot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cyber72.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cyberdynesystems.servebeer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cyberlocos.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cybern.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -154632,7 +154207,6 @@
     { "name": "gtalenders.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "guamhome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "guarever.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gubea.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gudostudio.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gugli3d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "guidefox.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -154644,7 +154218,6 @@
     { "name": "gulizaroztemel.av.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gunisifiyatlari.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gunturnovizal.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gursesgazetesi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gutenbier.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gutierrezvidal.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "guykokken.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -155126,7 +154699,6 @@
     { "name": "jesolo.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jessejanepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jetaninchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jetsome.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jfhr.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jfmdevelopment.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jgonzalezhomes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -155740,7 +155312,6 @@
     { "name": "mercadopago.com.ec", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "merchstudio.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mercurysquad.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "merenbach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mesdagh.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mesologie-soesterberg.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mesotheliomalawfirm-worldwide.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -155841,7 +155412,6 @@
     { "name": "mohister.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mohot.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "moisesbarrio.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mojodentallaboratory.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mojtabagol.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mokaszinhaz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "molkerei-ammerland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -156165,8 +155735,6 @@
     { "name": "office-basilique.notaires.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "officerjones.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "officialdubaidev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "officialniledevelopments.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "officialpyramids.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "offspringmexico.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "offspringzero.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ofis.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -156294,7 +155862,6 @@
     { "name": "punaise-de-lit-paris.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "punk-jazz.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "puntaires.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "puppy.actor", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pur-institut.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "puravidaquiropractica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "purchaserprotect.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -156679,7 +156246,6 @@
     { "name": "sferalakiera.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sfumusic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sgoossens.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "shaftofdarkness.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shaheedirfani.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shaheednawazirfani.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shahriar.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -157246,7 +156812,6 @@
     { "name": "tinky.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tintiger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tipi.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tipsfitness.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tisph.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tk-its.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tm-sports.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -157411,7 +156976,6 @@
     { "name": "twopipes.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tylerobrien.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tyrael.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tzortzis.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "u2co.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uabc.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uaemegadeals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -157432,7 +156996,6 @@
     { "name": "underground.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uneaimages.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unicornsoft.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "unique-local-ipv6.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uniquemode.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uniquequilts.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "unitysavannah.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -158095,7 +157658,6 @@
     { "name": "ajoneuvokeskitys.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "akademialazarev.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "akaritakai.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "alan-turnbull.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alanokling.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alarmnewengland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "albergointernational.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -158175,7 +157737,6 @@
     { "name": "arquitetosvendem.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "artemiy-plus.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "artevos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "artevos.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "articlesarea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "artisreit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "artsandculturessm.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -158360,7 +157921,6 @@
     { "name": "boehs.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "boew.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "boikhor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "boldsmartlock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "boltreplassen.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bolzano-bozen.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bolzanoavvocati.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -158483,7 +158043,6 @@
     { "name": "catmatchers.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "catsuae.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "catsystemsaustralia.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "catu-bikes.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cbes.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cblocallocksmiths.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cbrbuildingrepairs.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -158637,7 +158196,6 @@
     { "name": "csafederalsummit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cscred.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "csgofinder.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "csmediaoc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "csty.ltd", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "csulb-cmp-eir.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ctfacialplasticsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -158755,7 +158313,6 @@
     { "name": "domkiwgrodku.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "doodlecorn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "doodung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "doradosystems.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "doreyaromatherapy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "dortmunderblog.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "doszkocs-zsuzsa.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -158847,7 +158404,6 @@
     { "name": "edgerton.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "educaenvivo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "educateaprende.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "edufever.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eduradiadores.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eenmailsturen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eenvoudhup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -158878,7 +158434,6 @@
     { "name": "emiliaromagnaeconomy.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "emilioadani.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "emiratesoffers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "emmerdale.me.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "emonovo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "employmentguide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "emprendecausa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -159144,7 +158699,6 @@
     { "name": "givemeoffer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gizmogrind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gkdworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gkdworld.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "glasswall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "glbaumaulwurf.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "glenwoodpark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -159250,7 +158804,6 @@
     { "name": "hinolab-m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hireinsight.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hiruthicsha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "historicist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hoagiandpita.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hofgut.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "homegrounds.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -159295,7 +158848,6 @@
     { "name": "hoyenapple.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hpfxd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hrbl.lc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "hroc.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "hrzblt.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "htmlformatter.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "https.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -159422,7 +158974,6 @@
     { "name": "israel-web.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "israelandhome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "israelpalestineconfederation.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "istrosec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "istrosec.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "it-foro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "it-lobster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -159457,7 +159008,6 @@
     { "name": "jefaisducafe.mywire.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jeff.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jeff.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "jelmyto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jemezdravo.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jemyzdrowo.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jenever.amsterdam", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -159522,7 +159072,6 @@
     { "name": "k7add.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kachat.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kada.lk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "kadidak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kadix.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kagel.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kaiche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -159970,7 +159519,6 @@
     { "name": "mysticmine.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mytea.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mytourstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "myturf.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "n-tennis.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nabboon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nadlan.immo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160549,7 +160097,6 @@
     { "name": "preciouspebble.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "preguntasmasfrecuentes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "premiachef.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "premiersimgl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "premiumpeaches.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prepa-code.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "presail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160578,7 +160125,6 @@
     { "name": "projectlarix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "projet-pastel.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "properties.org.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "propertyprofilereport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "proressource.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "proressources.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "prosvita.dp.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160715,7 +160261,6 @@
     { "name": "rinsbacherhof.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "riri-tendedasole.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "riscone.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "riveal.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "riverhoa.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rivertv.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rizaderindag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160723,7 +160268,6 @@
     { "name": "rkowalewski.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rkstudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rl3.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "roamadvisors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "robbie.bio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "robbie.contact", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "robbie.studio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160796,7 +160340,6 @@
     { "name": "sber.games", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sbestimes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sbz.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "scale.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "scented-delights.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "schaumstoff-meister.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "schella.network", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160821,7 +160364,6 @@
     { "name": "seanbright.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "searchgurus.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sebetesty.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "secret-bases.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sectigo.com.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "seebetterlab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "segel-setzen-buch.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -160877,7 +160419,6 @@
     { "name": "silvaserv.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "silver-salt.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "simplydonelegal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sinavcevaplan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "singita.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "singles-day.org.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sinta-d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161152,7 +160693,6 @@
     { "name": "tiejet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tiendamacoco.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tiktok-download.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "timesloth.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "timoviveen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "timtj.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tinder.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161245,7 +160785,6 @@
     { "name": "uptimesonar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uquid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "urbane-narrationen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "urogen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uskostadariksi.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uspanglish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "utilitybot.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161667,7 +161206,6 @@
     { "name": "ashotofadrenaline.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "asportnoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "asprivacy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "atlan.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "atlasreclame.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aurabeautyhub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "aurelvoica.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -161743,7 +161281,6 @@
     { "name": "budgetscan.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bundlejs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "burgesspetcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bursasite.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "burzmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "burzmedia.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bus-hit.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162012,7 +161549,6 @@
     { "name": "githubconstellation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "githubnext.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "glassellparkmagnet.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gleisner.legal", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "globaleducationservices.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "globalideas.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "globalmarketrade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162190,7 +161726,6 @@
     { "name": "konoex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koosaline.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kopyandsonslandscaping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "koso.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "koujiao.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kredi-hesaplama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "kriener.photography", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162227,7 +161762,6 @@
     { "name": "limetw.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "lindipendente.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "listiclepal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "litnis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "liveandalucia.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "liversurgerycentre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "livli.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162260,7 +161794,6 @@
     { "name": "macrosec.tech", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "madagui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "madagui.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "madelynn.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maggie.gy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "maguroalmare.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mahi.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162289,7 +161822,6 @@
     { "name": "max96.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mazda-mps.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mckhan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "mcmk.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mdf-nakladki.kiev.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medhatzaki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mediasklep24.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162478,7 +162010,6 @@
     { "name": "progresszivnyomda.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "projekt-manufaktur.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "projetsvl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "prolocovalsambro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "propertylisthub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "proton.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pruchovi.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162582,7 +162113,6 @@
     { "name": "seedsystemcoaching.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "selfmag.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "semanaacademica.org.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "senffabrik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "senkyo.watch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "seowebcreative.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "server21.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162593,7 +162123,6 @@
     { "name": "shazamkitpro.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shmilyhua.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "shoplus.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "shrapnel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sidepocket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sidingsmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sightconnection.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162760,7 +162289,6 @@
     { "name": "tures-aurina.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "twa.travel", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "twinstudiosparis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "uhingaro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uirysa.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ujyalonetwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "uklidgaraze.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -162980,7 +162508,6 @@
     { "name": "blankspade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blocked.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "boulebar.duckdns.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "braeden.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bramfri.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brightideaspromotional.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "brightwakeintranet.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -163075,7 +162602,6 @@
     { "name": "espirituracer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eupropertysolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ev-greentech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "eveaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "everything-mdaemon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "exonip.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "exosama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -163174,7 +162700,6 @@
     { "name": "iwant.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "iww.org.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "izapi4.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "izstore.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ja-jirei-ienohikari.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jefaisdelordi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "jenn-pro-graphics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -163272,7 +162797,6 @@
     { "name": "nowar72.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nrj-plomberie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nrvn.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "nw-risk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nycgastroenterologists.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nycpac.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "nyiooc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -163485,7 +163009,6 @@
     { "name": "zolw.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zorgonderwijsnu.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zulybot.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "100fss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "100fss.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "123-ticketsystem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "215advisors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -164626,7 +164149,6 @@
     { "name": "cijf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ciji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cilat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cin.net.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cindy.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ciochina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "circuitchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -164801,7 +164323,6 @@
     { "name": "cousot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cpm-steuerberater.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cpm-steuerberater.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cpm-steuerberater.support", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cpumate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cqbrand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cqep.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -165215,7 +164736,6 @@
     { "name": "elecfair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "electrical.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "electricgatemotorboksburg.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "electroredes.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elegantperfume.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elektrikal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "elevanhairdressing.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -168128,7 +167648,6 @@
     { "name": "private.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "privatecolor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "privateexpert.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pro-moed.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "proacksecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "proantab.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "profese.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -170373,7 +169892,6 @@
     { "name": "31fss.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "32y.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "379efss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "3dfiguur.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3niu928.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "3u15.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "4-ae.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -170480,7 +169998,6 @@
     { "name": "al3ilm.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alaska.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "alberttonrubbleremovals.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "algbra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "all4games.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "allappliancerepairsandiego.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "allmco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -170630,7 +170147,6 @@
     { "name": "bukowski.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bulatlat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "burner.gay", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "cabcard.services", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cablogrammes.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cafpatronato.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "caldaia.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -170727,7 +170243,6 @@
     { "name": "connollycove.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "conqi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "conservadoracbe.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "controladores.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "corarain.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "corbax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "cornday.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -170835,7 +170350,6 @@
     { "name": "easydmarc.am", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eautocash.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ebis.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "echoeshq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eckindustries.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "edenvalerubbleremovals.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "edsonreis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -170900,7 +170414,6 @@
     { "name": "fastphox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fastproxycat.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fatlabwebsupport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "fatturaelettronica-app.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fawtrucksecuador.com.ec", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fcd.im", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fcijobportalodisha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -170919,7 +170432,6 @@
     { "name": "financepreneur.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "findedeinencoach.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fireflygatlinburg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "firesprite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "firmanali.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fit81.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fit81.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -171196,7 +170708,6 @@
     { "name": "liveencounters.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "liveit.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "livsta.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "lizcheney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "localserver.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "locomotiveworks.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "log4shell.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -171499,7 +171010,6 @@
     { "name": "relationalplayground.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "relationsatwork.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "remodelhealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "reseau.je", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "resoon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "returnlogic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rex.red", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -171512,20 +171022,17 @@
     { "name": "rollerwarehouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ronasit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "roodarvasi.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "rookie.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "roskillcv.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "roskillcv.org.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rotasurbanas.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rpm-oldtimer-events.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rray.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "rubenarakelyan.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rueckbeil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "runar-data.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "runmyqubit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "runmyqubit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rutik.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rutik.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "rx-diet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ryanwordpress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "sadespor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "saifoundation.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -171849,7 +171356,6 @@
     { "name": "yumtaro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "z.mom", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "z.ps", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zachyang.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zalamura.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zandmhomes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zanreal.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -172094,7 +171600,6 @@
     { "name": "e8space.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eagleled.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eainjurycenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "easttower-uc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eatwith.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ebookpdf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ec.gov.sl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -172202,7 +171707,6 @@
     { "name": "gapalmoil.com.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gartengutachter.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "geekwanderer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "geoscout.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "getemail.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "getupwakeclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gglinka.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -172449,16 +171953,10 @@
     { "name": "ochoymedio.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ocsbl.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "octane.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "officialdbay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "officialdistrict5.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "officialdose.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "officialgaiasabbour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "officialilmonte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "officialmountainview.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "officialrivan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oficinadanet.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "olffi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "olibarcenas.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ombrazur.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "omid16b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oncecocuklar.org.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -172491,7 +171989,6 @@
     { "name": "page-audit.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "palpitediario.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pantaleon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "parkpoint-capitalhills.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "passionsorigen.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "patchstack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pavlajansvatba.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -172516,7 +172013,6 @@
     { "name": "podivilov.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "podqueue.fm", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "poneiras.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "porcelanosamallorca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pornaizle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "poseidon-giesing.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pravac.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -172530,7 +172026,6 @@
     { "name": "ps5.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "psicoanalisi-pratica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pubmed2xl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "putokaz.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "putzigdesign.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pvportal.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pxtwitter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -172630,7 +172125,6 @@
     { "name": "telesales.guru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "test-do.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tf2b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "theablemind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theapj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "theblog.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "thebobcoin.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -172690,7 +172184,6 @@
     { "name": "verwarming-installateur.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "videoxpnet.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "viethotnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "vinsonconsulting.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vocably.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "voltrix.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "vomsee.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -172711,7 +172204,6 @@
     { "name": "xlrsecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--80adydmce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--tftel-tom-q9a.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "xn--uir160dxn2a.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yacg.asia", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yateam.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "youthmarketing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -172871,7 +172363,6 @@
     { "name": "foodtruckconnections.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "furkanmudanyali.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fxtwitter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gavintang.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "generali-investments-portal.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "getlessgivemore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grupomultiservicio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -172950,7 +172441,6 @@
     { "name": "maintenanceservice.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "malyjakub.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mango3.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "maquiguarda.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mashrmail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "massiveink.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mastertent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -173045,7 +172535,6 @@
     { "name": "ptmco.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ptserver.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "pygos.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "pyramids-megacity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "qbookstaxpros.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quartsandlugnuts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "radicallycanadian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -173135,7 +172624,6 @@
     { "name": "t1cloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "taipei2025.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "taipei2038.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "tajtower-tajmisr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "takehomepay.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tangentnet.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tassio.eti.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -173163,7 +172651,6 @@
     { "name": "tvgsc.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tvk.tirol", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tzinsurance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ua-fediland.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ukrnames.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ultra.law", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ultrarare.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -173271,7 +172758,6 @@
     { "name": "ayudacontenedores.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "azhadev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bagso.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bancobica.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bankiros.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "banlitang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "basic.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -173282,13 +172768,11 @@
     { "name": "bellevilleboot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "benefeds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "benprisby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bfoliver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "billview.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "black-flirt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bloemendaalsamen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bluestarbus.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "blw-eschwege.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "bonsaicrm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "boydcorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "breederworld.dog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "bubsngrubs.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -173369,7 +172853,6 @@
     { "name": "emo.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ericdobson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "essaandmore.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "eviamv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ezec.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "faasviddy.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "fabickcat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -173555,7 +173038,6 @@
     { "name": "proxy-bay.onl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "puettba.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "quemvende.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "radverkehr-kelsterbach.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rama.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "randompasswordgenerator.fun", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "rapidlegal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -173613,7 +173095,6 @@
     { "name": "stroymart.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "summitseodesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "swindonbus.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "sxcvid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "symatrix.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "szalaiterko.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "tactile.love", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -173682,14 +173163,12 @@
     { "name": "xn--72c1ar3gd6fvd.xn--o3cw4h", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--q3cb3bxa0b7h.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "xn--y3cac7d1d.xn--o3cw4h", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "xpremium.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yeti.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yeti.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yoannlatzer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "younglabour.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "younglabour.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "yovada.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zeeshan.website", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "1001fonts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "21appart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "21kampus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -173952,7 +173431,6 @@
     { "name": "edit.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eduium.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eduspiresolutions.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "ee.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "effectualness.web.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ekamfoundationmumbai.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "electroschematics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -173970,7 +173448,6 @@
     { "name": "epsilonhomebasedqualitycare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eshappy.tours", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eskandarient.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "espaciohebe.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "estetica.host", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eternl.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "eurekapools.com.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -174059,7 +173536,6 @@
     { "name": "gps-coordinates.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grafana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "grundschulratgeber.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "gtc.com.gt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "guilded.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "guzgu.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "gw-uks-app-test-coreapi-02.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -174215,13 +173691,11 @@
     { "name": "manualowl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "martinsvillebulletin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "masinaspalat.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "masqueless.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mat6tube.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mazcue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mccannhealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mcdean.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mcnav.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "meatybubbles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "media-fleet.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "medmark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "meetmarlo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -174240,7 +173714,6 @@
     { "name": "millenniumhotels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "milmesetas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "milvus.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "minebbs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "minewiki.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "missoulian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "mobile-discothek.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -174320,7 +173793,6 @@
     { "name": "ofisas.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ofpad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "ogilvy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "oier-meet.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "oldvps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "olsenban.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "on-tandemdrive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -174412,7 +173884,6 @@
     { "name": "reichelt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "reimsmediaslibres.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "reisdemuthwiltgen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "reisuke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "remontstrong.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "reserveandreceive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "resumidus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -174657,7 +174128,6 @@
     { "name": "yuucdn.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "z-e.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zandu360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
-    { "name": "zapier-staging.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zarabotok24obzor.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zawodowe-szkolenia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zaxbys-web-backend.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
@@ -175236,6 +174706,1535 @@
     { "name": "zarof-fkf.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zlatamira.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     { "name": "zrali.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0milemarathon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "0n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "101023.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "10canada.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1174healing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1a-hyp.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "1ahyp.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2137.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "2333boy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "233boy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "233boy.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "360saxess.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "3dcubx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "42degrees.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "4o.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "52xuanmi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "66gal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "740424.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "888dhw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "918kisse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a-lexx.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "a0s.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abasteo.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abdelrahmanzaki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abigailfriedland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abortionprotest.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "abseher-technology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "accaindia.co.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "accountsfilingmadesimple.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "accurx.nhs.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "acscargo.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "actoragecheck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adaoconde.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "adhadse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "advancedbuildings.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "advertizz.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "advinix.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "afianzamientos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "afzetbak.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agiftinside.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agilecoldstorage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "agrarkredit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ahbvlp.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ahccmadison.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ahoj.email", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aidenashleypornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aircgroup.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airfarestoamerica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airfarestogermany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airfaretousa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airflightsdeals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlineafrica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlineairplane.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlineandtickets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinebestprices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinebookingonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinebookingtickets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinecheaptravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlineflights.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlineflightsinternational.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlineflightsprices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlineflightsreservations.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlineforsale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinefr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinegermany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlineitaly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinekorea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinenationwide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinenewzealand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinep.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesamsterdam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesandhotel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesandtickets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesandtravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesargentina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesboston.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesbrussels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlineschicago.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinescincinnati.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesdallas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesdc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesdetroit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesdomestic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlineseast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesfirstclass.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlineshouston.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesinlasvegas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesjordan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlineslosangeles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesmiddleeast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesname.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesnewyork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesnorthamerica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesofdubai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesofmexico.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinespackages.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesparis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesphonenumber.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinessa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinessanfrancisco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinestexas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinestoalaska.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinestoatlanta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinestocanada.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinestochicago.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinestocostarica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinestoeurope.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinestoflorida.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinestofrance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinestogermany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinestoitaly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinestojapan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinestolosangeles.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinestomiami.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinestoturkey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinestousa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinestovegas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesturkey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesvegas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinesvietnam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlineticketspurchase.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlineticketswith.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinetocanada.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinetomiami.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinetour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinetravelinternational.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinetx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinevegas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airlinewholesale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airplanetic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airportcdgparis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airportdc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airportfrankfurtgermany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airportgrandhotel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airportholiday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airporthotelsgatwick.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airportknoxville.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airportlas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airportnigeria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airportnz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airportofdubai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airportperth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airportsbarcelona.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airportsflights.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airportstickets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airportstockholm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "airscope.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ajaxmfs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ajvandeven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "akamu.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "akvakm.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alamen.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alancolephotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "albertovr.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "albinonderdelen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alega.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alex-werbung.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alexmathews.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alfa-pack.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alfapack-shop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alignforce.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allactionsecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allianceairlinesflights.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "allier-vichy-moulins-expert-comptable.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alloheim.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "almette.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aloalosalomao.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alpha-kamera.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alphabetaflora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alrioart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "altiup.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "altiup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "alwistra.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amartours.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "americatracker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amishealthcareservicesinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "amisun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anbaicreative.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anclarma.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "andyattorney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "animecasepremium.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "animemangaupdates.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "animotica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anteros.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "antirouillevelevis.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anunciosclasificados.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "any-id.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anytimeicon.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "anztb.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apcassistant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apotheke.nrw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "apotheke.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aptern.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aptient.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aquantia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "archivi.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arduino.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arge-bilisim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "argyrouminas.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aris.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "armo.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "artikel5ev.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "arturojimenez.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aru.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "as202413.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asbisafrica.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asburyparkreporter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asesoresvaro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ashlynpeakspornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "asiansnus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aspenpsychologywy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aspews.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "associazioneterra.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "astralus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "astralus.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "astroluna.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "astutetm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atla2022-event.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atlasbus.by", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "atlasbus.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "audiokomis.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aufeerjob.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "augeo.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "augusta-apotheke.nrw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ausbildungsmesse-digital.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "australiainvest.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "auxilius.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "avangardmobile.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "aveamcorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "awmb.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b-wartburg.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b1drivers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "b2bhint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "babyzoet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baer-concepts.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bafito.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "balancingbirthbaby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bar2mannheim.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baufi-express.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baufi-express.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baufi-express.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baufiexpress.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "baufiexpress.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bcakuwait.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beautyspacestore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beehive.systems", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beeremovalpretoria.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "beetwix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bellaskino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "benchmark-dental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "benilebusinesscity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bernayslab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bert.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bertgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bertusengelbrecht.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "betweenland.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bggcapital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bhtechconnection.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bicistore.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bilderrahmen-baer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bilderrahmen-schluechtern-sinntal.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "billchen.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "billwerk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "billwerk.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "biologynest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bironthemes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bitedu.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bitfashion.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bitiobmen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blackcatcard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blanksreload.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blazor.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blitztesting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "blue2purple.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bokaldo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "boldorion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bonnepart.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bookcheapairline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bookginawest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bookingdjparis.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "borderlens.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bordonisport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "borealis.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "borealis.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "borhunter.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "botpago.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "boutique.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "branchtobox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "breadheads.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "britishairlinesflights.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "briween.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "broomorchard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "brzc.st", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bss-solutions.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "btwdatabase.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bubalova.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bugprove.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "busarm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "businesschances.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buydirectonline.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buymycomics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "buzhi.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bvlos.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bwsolar.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "bywencke.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "c-dome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cadencescience.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cakessl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "campaignzee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "candicedarepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "canstar.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cantinhodabia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "capetownelite.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "capitolcounseling.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "capsulafinanciera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cardiffviolins.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caroillab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carottage-beton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carstub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "carty.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "casasensunbridge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "caseycalvertpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cashservices.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "casinoscout.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "casinoscout.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "casuallyblue.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ccad.edu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ccdenver.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cdlandb1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cdnrecords.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cebolinha-imaginaria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ceew.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "celinepsychotherapie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "centuria.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "centuria.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cfdata.lol", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chadwhitepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chakrastone.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chanelprestonpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "charcoalmachines.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chase.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cheapairfarefrom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cheapairfaresdeals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cheapairlinesuk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cheapestwaytofly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cheapfareto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cheapflightatlanta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cheapflightla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cheapflightmexico.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cheapflightsengland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cheapflightsticketstoindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cheapflightsunitedstates.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cheapinternationalair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cherritravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chill.bet", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "chriskthomas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "christysstampingspot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cia-gaming.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cinziamacchi.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cirasul.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "circleci.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cisprague.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "citracctv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clairebabai.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clawington.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "click2affiliate.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "climb4achild.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cloeri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cloudevolutionforum.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cloudsecurityalliance.events", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "clun.gay", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coasa.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cockroachesremoval.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "codepwn.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "codeysteelepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coincabin.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coinliq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coldsteelsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "collinlove.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "collinlove.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "collinlove.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "collinlove.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "colorcomm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "columbuscoffeefest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "comefareper.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "comfortsleepclinic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "comp4u.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "complycheck.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "compoundc.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "computer-service-remscheid.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "connecticallc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "connectto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "consiglidisalute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "consuladospanama.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "convoyin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cordalife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "courage.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "coveragespecialist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cozmerce.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cozumelairlines.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cozumelflight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cratexind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "createstudios.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cris.org.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "crnajobsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cumlaudegent.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "curbsoftware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cure.finance", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cursofuturosresidentes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cvpartner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cyberassurance.run", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cybersecurityforum.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cycc.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "cypressxm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "czqu.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dadoilustrado.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dali-boli.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dambachpeacebuilderfellowships.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "danasweed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dandelion-seeds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "danielcardoso.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "danielh.codes", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "darkinfo.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "daseinsfreu.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dasler.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "datasunrise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dawnlydialnyc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dcnews.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ddf.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deepl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "demascotas.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "demorgen.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dengjunhui.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "denisdftnewyorklife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dentsugrantgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "depiratas.com.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "deratisation.maison", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "derpteam.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "desaretreat.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "desic-sl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "detourxp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dev-soft.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dev-woenenn-node-server.herokuapp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "devonportairport.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "devtambayan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dhurbabaral.com.np", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diabdis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diamir.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "diaweb.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dictum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dig.cat", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "digitalmanager.guru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dinkoreskolesilkeborg.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dinkoreskoleviborg.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "directairlineflights.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "directright.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "discoverradiance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "discpersonalitytesting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "disposalqa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "district5marakez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "divanogiusto.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dm-918kiss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dmcasorry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dmslog.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dmz.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doboszynski.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "doctrine.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dotzauer-stb.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "douglasgreenberg.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "drehpartner-werden.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "driveandpark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dtmedia.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dumfriespropertyservices.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dustandsand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dutchcan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dwightd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "dynamicentertainmentdjs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eadea.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eaglehaslended.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "earthlink.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easiest-way.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eastpershingdental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "easttamakiauto.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eccouncil.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ecfnj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "edefrutos2020.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "edu3w.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "educard.co.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eduflow.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "edupay.co.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "edusuite.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "efootball4u.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "egnitehealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "egos-online.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ekospajzka.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elanza.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elektri-sch.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elhuesero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eliteimsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elizaevespornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ellanovapornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elrefugiodelpirata.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "elusivetranslations.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enefitrenewables.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "engelzicht.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "entabe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "enuchi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "envelopegroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "erafocus.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "erebuildings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ergoserv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eric.gg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eris-bj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "erreguete.gal", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "esgforum.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "esquirelaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "estiloelevadores.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "etherpoap.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eurofoods.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "evalongpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "eventlocation2.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exclusivacademy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exclusivetransferspuntacana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "exeltis.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "expediteplus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "expert-comptable-vichy-moulins-allier.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "expertoseninversiones.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "expresshsp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ezcesspoollongisland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88ok01.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88ok05.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88ok11.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88ok114.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88ok118.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88ok134.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88ok145.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88ok22.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "f88ok52.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "familiekusch.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "faresfrom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "farmacovigilancia-exeltis.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fasterfront.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fasterfront.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "faszination-fankurve.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fayffersons.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "feelbycubanas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "felly.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fersedo.mk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fic.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "figshare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "filmsleague.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "findscan.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "findschool.ge", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fitlinewellnesscoach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fitness.edu.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flagthis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flightairport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flightfaretoindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flightfrankfurt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flighthonolulu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flightstimes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flipflop.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flissinger.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "floatypants.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "floresparafuneral.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flowerwholesale.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flughafenairport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "flynumber.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "folkmusicworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "foreignaffairsmotorsports.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forresskatepark.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "forumhub.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fotobrinke.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fotocoach.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fraeuleinmeerbackt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fredericosaraiva.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "freecom.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "friv31games.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fromthetopsalonnh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ftcscout.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "funding-zone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "furnitureiloilo.com.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "furuse-shika.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "futurains.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "futurainsurance.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fwaux.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "fyziotonka.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gablermade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "galiuzvejoti.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "galleriadental.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gamingforecast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gaminglaptop.deals", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ganardinerofacil.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gastroboss.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gatewaytire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gaycock4u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gbmcoffee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gendrin.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "generiscorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "genneperafscheidshuis.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "georgex.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "geotab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "getlawsinfo.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gg.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ghcma.vic.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "giacomodebidda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "giornalisportivi.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gites-melaual.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gkdworld.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gl-operacion.com.mx", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "globallyunited.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "globalvision.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "globeprotocolecosystem.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "glocken-apotheke.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gmc.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gnzsnz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goarnlms.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "goatrisksolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gofabcnc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gogreece.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "golosperemen.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "googlecom.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gorebayairport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gowpcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gradinitasamariteanulcluj.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "graeskmad.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grahamfamilydentalwy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "grandiscontionline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "graphql-on-aws-appsync-book.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gratefulwanderertravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "graymuzzlesociety.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greatrichmond.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greenit.eco", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greenlifecannabis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greenwood-it.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "greta-fischer-schule.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gridfuse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "groupeleven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gsd.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gslate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gtk-tim.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guiatelefone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "gustaveeiffel-arruda.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "guttergurugeelong.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "h-advisors.global", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "h8c.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haleyreedpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "haleywinterspornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "handballinside.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "handmadeselling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hardisondowney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "harleyhazepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hatbo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hawkbiosystems.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hcaptcha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hdc.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hdm-bogensport.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "healingwithvibrationsummit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "healthcarestaffingacademy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heartlandbraidedrugs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heaslip-aluminium-smelter-engineering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heimdallsensors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hellosixpackabs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "heritagehandicraft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hermandevries.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "herzpfa.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hexstream.expert", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "highburycorp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "himemariepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hiob.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hirechrisfinazzo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hjaltespizza.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hochland.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hochlandkanapkowy.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "holiday-home-baer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hollywoodsmilesfl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "homecareserviceindiana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "homegrouporlando.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "homehealthbookshelf.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hondadigitalevent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hookedoncraftswaterford.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hopasports.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "horsa.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hospitalsanjuandedios.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hospitalsineachstate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotelsingaporeairport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hotspot.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hstoyanov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "htl-anmeldung.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "humo.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hyderabaddccb.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hydnandlloyd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "hyperionms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iconexperience.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iitranslation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ikarus-itkurs.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ilgazhaliyikama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "illinitechservice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imaginebelfast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "imzye.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "indamail.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "indicure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "indieweb.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "industrydecarbonization.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "infinitycleaningsolutionsfl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "infopercept.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "initiative20x20.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inmobiliariamarino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "innisfildental.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "insa.or.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "insureneb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "integralschool.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inter-design.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "internationalairlinestickets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "internationalgse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "intervista-rh.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inventify.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "inzetbo.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "iotbusinessforum.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "islamiyet.gen.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "issea.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "it-started.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "it2match.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itcomlanger.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itcybersecurity.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itgadgetsonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itinero.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "itportal.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ivywolfepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jakobhildebrand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jakobhildebrand.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jambox.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "japanese-dominatrix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jaris.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jarlstrom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jarry.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jbarzoutfitters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jbloomphotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jeanstastytreats.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jeney.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jersec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jgoldbergmd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jhfunerals.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jialiangkang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jibe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jibeapply.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiminny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jiobp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jirehlov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jl-k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jobcorps.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jobsineachstate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jordancards.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jordanlys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jpixta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jucator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "julia-spriggs.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jzz.cool", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "jzzfyw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "k-moto.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kacang-bali.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaedehara.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kagithanemantolama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kameryzababku.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kasinopartio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kaskadee.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "katycollection.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kawawete.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kcucs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kdoslavi.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "keioni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "keishicho-mirai-method.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kenziemadisonpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kenziereevespornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kenzietaylorpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "keshavnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kevinji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "key-right.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kfsc.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kinden-giankyou.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kinden-kizuna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kindermarket.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kinison.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kinoapollo.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kitmercerpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kkdesignsco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "klxm.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "komsomolka.works", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kozuna.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "krissylynnpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kupone.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kurtneuweiler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kxbot.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kynjatshai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kyoox.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "kyounoryouri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lablaser.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lacontrevoie.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lacylennonpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ladislav.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lameusame.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "landkind.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laneygreypornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lanyundev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lapierrecabinetry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "latourist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "latrobedirect.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "latrobefinancial.com.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laurenphillipspornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "laurentskyepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lawod.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "leapspace.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "led.my.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "legalconnect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "levelupdisability.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lexgo.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lexilowepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lexilunapornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "libanswers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "libapps.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "libchat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "libconnect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "libconnect.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "libcrm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "libcrm.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "libelle.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "libguides.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "libinsight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "libinsight.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "libstaffer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "libstaffer.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "libwizard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "libwizard.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "life20.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lifepress.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lifestory.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ligneetlumiere.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lilylarimarpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linmarrdavao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linuxinfo.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "linz.host", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lirui.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lisapinder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "little-luk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "littlepartyshoppe.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liukang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "liups.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "livepornguide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lixi.today", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lm-architecture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lnsolucoesfinanceiras.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "loadit.lol", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "locadoraequiloc.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "loganpiercepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lognetjobs.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "logydice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lommers.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "longsexyshop.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "loststudios.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "losvideosdemisol.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "loveinabox.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lpnjobsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luisvmf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luisvmf.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "luluchupornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lumsa.university", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lydianibley.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lyncag.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lyonsmotelonaway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "lyrique.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "m-918kiss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "m-fashion.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "madridistas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magic-cakes.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magnuspro.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magnuspro.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "magornitho.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maitlandwardpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "makemoney.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "malevus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mamagreenindustrial.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "manhattanfruitier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "manitoulingolf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "manitoulingroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "manitoulintransport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "manitoulinusedequipment.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "manjaro.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "manwithavanservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "margriet.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mariemccaig.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marienoellegendron.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "marketlooker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "markmorris.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "masfloss.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "matco.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "matematikformulleri.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "material-ui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "matthewoliver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "matureporn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "maverickmobilemechanics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mbudy.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mcdonalds.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mdjobsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meda.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meddata.pp.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mediassist.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "medihost.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "medihostsolutions.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mediosavs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "meditacionesparasanar.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mega888new.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "megabooker.hr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "megacellenerji.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mejor-vpn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "melivon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "menuvox.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mepcoeng.ac.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mercuretv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mfinanse.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mgfgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "miaairportvillas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mijnafspraak.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mikunov.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mikunova.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "milesconstruction.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "milosguide.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mimoesthetic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "minibabi.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "minxmine.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "misjoyas.com.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mit.edu.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mitrausahagoto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mividalaboral.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mixilab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mladypodnikatel.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mmzztt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mobil-badwimpfen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mod.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "modernwebz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "momondersteuning.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "monasshahzad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "monawalespornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "montevue.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "morphitattachments.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "movaldesigns.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mrhori.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "multifamily.loans", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "munroads.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "musikvaerftet.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mv-icity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mycolo.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myconsultingresources.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "mycts.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myelitetravelclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myhotel.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myschoolitaly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "myworkplaceperks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "na1.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nanolash.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nationwide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "naulakhafellowship.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ndisreview.gov.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nearnorthcustoms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nechakoconsulting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nedraho.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nekonet.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neroteknik.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nettoyage-apres-deces-crime.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nettunoguide.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neucadlazdrowia.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "neutralvehicle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newoldboughtsold.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newoldstock.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newsinfrance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newsingermany.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newsinitaly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "newwise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nextlevel-forum.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nextlevelforum.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nfobar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ngroupllc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "niagaraconstruction.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nilebusinesscity-nc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nmbhgc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nodecore.mine.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nomerodekors.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "noraahost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "northeastcontractorsltd.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "notrated.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "novageracao2021.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "npjobsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nplc.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "nserrao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "obsica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ocenka-msfo.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ochotnicky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "odishassc.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ofracar.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "olafbrzeski.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "olddominionspeedway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oldjungle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "omahagutterandsiding.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "omanair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "omatoimi.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlinecannabiseducation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlinecasinokoning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlinemediamasters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onlinesynlighed.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onurerhan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "onx.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "op.ninja", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "opacity.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "open-prod.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "openalt.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "operatoresanitario.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "opnay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "opportunity.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "optikoscolombia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "optionskredit.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "optionskredit.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "optionskredit.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "optionskredit.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "organizalpha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oriocdn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "orlandopmf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "osaamiskartoitus.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "osiedlemalownicze.wroc.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "otsfurniture.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "oviedoacrepair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "p4c-admin.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pace.cool", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pack.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "packagestours.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pahadee.coffee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pajobsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "palmatin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paperandpage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parabooking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paremedical.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "parool.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "partsgeek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "partydecoration-bg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "paulomonteiro.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pauloneto.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pawn.inc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pcwiz2u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pearle.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pediatricorthopedic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pelata.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pepperandmurphys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "perera.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "perssonsgarn.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pesc.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "petitsouffle.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pfandbriefsparen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pfnpc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pgmjr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "philcare.com.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phillyhometech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phoneaccessories.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "photo-booth-hire-uk.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "photoscotland.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phrlegal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "phyrai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pic-sl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "picksshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "picofme.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "picrew.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pikafan.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pilotinterviews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pioneerdr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pipetobacco.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pisaparaasescolas.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "planetickettravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "platinumpoolsaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "playparkhotels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pleiospilos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "policeauctionsusa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "polzaune.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pornpics.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "portiva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "powerseo.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pradyumnashome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prefect.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prepa-in.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pressurewashersandiego.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "primetouchimprovements.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "primrosehillvets.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "printplanlive.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "privacyfenceanddeckllc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "priyan.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "probably.group", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "procomservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "profian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "program-ace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "promentesalzburg.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "propaganda.love", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prototech.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prouveonline.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prpbenevolent.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prpr.icu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "prpr.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "psd-vfx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ptjobsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ptservidor.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ptway.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "punjabsind.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pussyspace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "pusztul.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qcwz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qikio.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qu.ax", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "queerdelta.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "query.gov.ps", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "quiq-in.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qwerty-store.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "qxazusa.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "racquetdepot.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rafix.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ragt.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rahil-p.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "railroadhistory.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rajkotupdates.news", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ramonnomarpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "randomideas.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rare-x.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "raumausstatter-fangmann.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rawmathub.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rdmc.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "really-simple-plugins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "realtyofnaples.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rebellyon.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redalertpt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "redlightmanagement.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "refinery.services", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "regal.radio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rehberlikservisim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reislustigeuropa.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rekorhaliyikama.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rentandgofalcade.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "report.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reporters.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reservationsair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "respondeck.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "retailnext.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "revenuegrid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reviewskia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "reviewskia.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ridingthetigerpro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ris2048.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "riskspecific.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rittersprinting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ritual.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rjia.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rnjobsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rnz3.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roayahnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "robindirksen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roboticsummit.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roodepoortplumber24-7.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roofingsolutionsla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "room8group.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roomforliving.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roroos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "roxanaramirez.love", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "royaleafrica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rtjobsite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rucheentreprise.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruffcuts.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "rugbynow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "russiasnews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ruthhaloho.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "s.team", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saap.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sadurscy.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sagasailing.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sahb.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sailormoonfansubs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sairadio.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "salce.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "samson.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanaphone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sanjuandediosburgos.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "santacruzimoveis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sarah-jones.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saraimnhd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sardinhagarcia.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "saresegur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schafspieker.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schafspieker.ddnsking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schlossberg-hotel-wernigerode.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schoolsineachstate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "schramm.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scoolio.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scorebet24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "scott-smith.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "screenrant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sealvault.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "searchdogs.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seattlecannabis.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "securesense.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "securiteproximite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seetow.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seisthewaytobe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "selltogaprime.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "semicon.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sence.gob.cl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seniorenbeirat-murnau.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seogood.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seotesty.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "seotoolsearth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "serifosguide.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "servtepstore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "setupstreamers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sevenrooms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sevgitesisat.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sfmason.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sgtrains.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shadrinsk-city.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "she.kiwi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sheaorganics7.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sheds.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sheetsindonesia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shgf.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shgf.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shitleft.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shoalcreekoutfitters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shopmlr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shuxiaoyi.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "shy4evr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sidas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "siega.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sifnosguide.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "signaldp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "silbox.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simonparrillaorlando.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "simpelkredit.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sizzlermagazine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skoilly.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skyebluepornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skylimitmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skyrocketfinancial.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "skysprouts.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slaninka.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slatteryassetadvisory.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "slayersonline.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smartsteelus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smedix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smoe.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "smokefreeclinic.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "snoemusic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "socialmovementtechnologies.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sociohosting.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "solocorse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "soluruse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "solware.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sommer-reitmajer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sonosguide.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sota.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "southwesttest.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sozole.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spdrdng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "speedable.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spielefant.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spiraldynamics.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spookies-w202.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sportservice.bz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "springbreak.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "spstechnical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stadionwelt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "standard-wohnungsbaukredit.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "standard-wohnungsbaukredit.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "standardwohnungsbaukredit.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "start.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "startupislandtaiwan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "statinfer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "staygoldenphotobooth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stbk.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stdssr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "steampoweredlawngnome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stitchersvillage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stonebriarpropertyinspections.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stopautoshop.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "storvault.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "strangers-team.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stratahealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "studiogronda.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "stuffsearth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sudoless.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sudoless.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sudoless.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suessenbecker.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sunytool.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "super-silicon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "surgicalassociates.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "susanacruzdesign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "sushiprints.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suter.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "suter.id.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swarozyca.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swiezastrona.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swtp-p-appsrv-coordination-frontend-businessservices1.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swtp-p-appsrv-donorevaluation-api-businessservices1.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swtp-p-appsrv-protocol-api-businessservices1.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "swxtd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "synergiamedicalcare.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "systemswizard.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "t630.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tafdi.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tajcitymnhd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tamalcloud.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tamerx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tango.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "targettrend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tasarimrehberi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tasports.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tc-tsc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tcgcardcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tci-thailand.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tdshop.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teachjam.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "team7-home.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tecdoor.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "techproland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tedxencgf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teier.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teier.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "telemind.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teleta.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tem-multibanco.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "temporarytattoosguru.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "teofix.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tetontherapypc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tfrei.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thailandblogger.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "the-top.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thebenstore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "theeducationalequalityinstitute.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thefrenchbeautyacademy.edu.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thelandsite.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "themakers.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "theologique.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "theorlandocriminaldefense.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thepollitochicken.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "theretirementincomecalculator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "theriverspecialist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thewebsiteshark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thierrymazue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "thissimplifiedhome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ticketscheapairfare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ticketscheapairline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ticketscheapflights.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tidit.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tidydiary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tierramarca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tiptopplastics.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tki.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tlccourses.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tllgh.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tm2ts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toprating.casino", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toroguapo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "touchfoundation.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "toughguyswyo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tourporelcaribe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tqdn.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "transfermate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "travelairtravel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "travelbyprice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "travelcheapdeals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "travelflighthotel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "travellingplanetearth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "travelnotoria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "treeremovalfourways.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "triathlon.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trinhhoangtien.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "trouw.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tsukikoh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tuxcloud.duckdns.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tweedehandskledij.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "tweedehandsmerkkledij.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "twospirits.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ua577.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ubiqubit.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ubytovnastrazske.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uc-developmentseg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unblockit.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "unchex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uplinkrev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "uprawnienia-pomiary.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urbanhost.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "urlrating.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "usaisilanlari.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vacationsforcouples.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "valbon.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "valentinabelluccipornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "valentinanappipornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vanessasenior.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vanessaskypornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vannabardotpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "velo-doktor.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vertextape.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "veski.hr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vetres.net.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "via-tygo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "victortellsall.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vikc.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vindeurgent.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "violetmyerspornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vipframesandtrusses.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "viprsolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "visceralsound.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "visithistoricbethlehem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "visitsyv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "visitvictorharbor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "visualtec.host", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vivianvita.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vlos.com.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "volkskrant.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vrbl.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "vys.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waka-vapes.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waldorf-augsburg.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "waldorfdiary.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wallmounttvinstallation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wanghong.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wattpad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wcss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wdstrings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "weareallconnected.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webcamara.sytes.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webuyloansfast.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "webx5.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "welldoc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "welldocinc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wellesleycosmeticsurgery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "westcoastdrones.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "westmodernclinic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "westsidewinemsp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wg2023.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whatairdefencedoing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whimsical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whirr.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whitespace.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whitespider.cf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whitespider.ga", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whitespider.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whitespider.ml", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whitespider.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "whoplusyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wikikeeps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "willis-brown.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "willowcreektrucking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "windriverpediatrics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wingertmd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wisewaynutrition.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wkwsafetysolution.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wmelon.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "womblesemporium.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "woodmaster23.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "woodsbagot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "worn.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wphost.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "wrightslawfirm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "x-kamera.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xandercorvuspornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xarardheere.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xbortov.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xgreatben.blog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xlnaudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--061az77a.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--061az77a.xn--fiqz9s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--45i.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--95qy23o.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--95qy23o.xn--fiqz9s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--bwx.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--bwx.xn--fiqz9s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--h7t906ca.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--h7t906ca.xn--fiqz9s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--itt6x.xn--fiqz9s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--itts1a.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--itts1a.xn--fiqz9s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--nts.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--nts.xn--fiqz9s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--p2v.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--p2v.xn--fiqz9s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--qm1a.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--qm1a.xn--fiqz9s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--rl-wka.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--vwsv89g.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--vwsv89g.xn--fiqz9s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--vwsw0b.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "xn--vwsw0b192f.xn--fiqs8s", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yaourtiere.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yesasia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yorkshirehousing.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yourlust.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yourshoppingnetwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yousuccesskenya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "youtubebulkviews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "ystral.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yueeeyueee.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yunookami.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "yuriylysyuk.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zacwildpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zahnarztpraxis-schaerding.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zapatilla.com.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zasekafe.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zatepli.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zdeneklavicky.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zecanard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zenlinez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zer0systems.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zgw.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhangjing.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhujike.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zhujike.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zippyanimation.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "znowuwrocisz.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zoeysinnpornstar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zorkin.uz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zwit.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
+    { "name": "zwitterion.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true },
     // END OF 1-YEAR BULK HSTS ENTRIES
 
     // Only eTLD+1 domains can be submitted automatically to hstspreload.org,
diff --git a/services/audio/public/cpp/BUILD.gn b/services/audio/public/cpp/BUILD.gn
index b2d1c88..76e79e1 100644
--- a/services/audio/public/cpp/BUILD.gn
+++ b/services/audio/public/cpp/BUILD.gn
@@ -2,7 +2,7 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
-source_set("cpp") {
+component("cpp") {
   sources = [
     "audio_system_to_service_adapter.cc",
     "audio_system_to_service_adapter.h",
@@ -22,6 +22,8 @@
     "sounds/sounds_manager.h",
   ]
 
+  defines = [ "IS_AUDIO_PUBLIC_CPP_IMPL" ]
+
   configs += [ "//build/config/compiler:wexit_time_destructors" ]
 
   public_deps = [
@@ -30,6 +32,8 @@
     "//media/mojo/common",
     "//services/audio/public/mojom",
   ]
+
+  output_name = "audio_public_cpp"
 }
 
 source_set("test_support") {
diff --git a/services/audio/public/cpp/audio_system_to_service_adapter.h b/services/audio/public/cpp/audio_system_to_service_adapter.h
index 3628801..9bb893c 100644
--- a/services/audio/public/cpp/audio_system_to_service_adapter.h
+++ b/services/audio/public/cpp/audio_system_to_service_adapter.h
@@ -9,6 +9,7 @@
 #include <string>
 
 #include "base/callback.h"
+#include "base/component_export.h"
 #include "base/threading/thread_checker.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
@@ -22,7 +23,8 @@
 // Provides media::AudioSystem implementation on top of Audio service.
 // In case connection to Audio service is lost, reply callbacks will run with
 // empty optionals / false booleans.
-class AudioSystemToServiceAdapter : public media::AudioSystem {
+class COMPONENT_EXPORT(AUDIO_PUBLIC_CPP) AudioSystemToServiceAdapter
+    : public media::AudioSystem {
  public:
   // A callback which can be used to acquire a new SystemInfo interface pipe
   // lazily as needed.
diff --git a/services/audio/public/cpp/debug_recording_session.h b/services/audio/public/cpp/debug_recording_session.h
index 1a676d4..2641e2f8 100644
--- a/services/audio/public/cpp/debug_recording_session.h
+++ b/services/audio/public/cpp/debug_recording_session.h
@@ -7,6 +7,7 @@
 
 #include <memory>
 
+#include "base/component_export.h"
 #include "media/audio/audio_debug_recording_helper.h"
 #include "media/audio/audio_debug_recording_session.h"
 #include "mojo/public/cpp/bindings/pending_receiver.h"
@@ -28,9 +29,11 @@
 // class' instances need permission to create files in |file_name_base| path
 // passed in constructor in order to start debug recording. If file creation
 // fails, debug recording will silently not start.
-class DebugRecordingSession : public media::AudioDebugRecordingSession {
+class COMPONENT_EXPORT(AUDIO_PUBLIC_CPP) DebugRecordingSession
+    : public media::AudioDebugRecordingSession {
  public:
-  class DebugRecordingFileProvider : public mojom::DebugRecordingFileProvider {
+  class COMPONENT_EXPORT(AUDIO_PUBLIC_CPP) DebugRecordingFileProvider
+      : public mojom::DebugRecordingFileProvider {
    public:
     DebugRecordingFileProvider(
         mojo::PendingReceiver<mojom::DebugRecordingFileProvider> receiver,
diff --git a/services/audio/public/cpp/debug_recording_session_factory.h b/services/audio/public/cpp/debug_recording_session_factory.h
index 01d74ca..e10ce47 100644
--- a/services/audio/public/cpp/debug_recording_session_factory.h
+++ b/services/audio/public/cpp/debug_recording_session_factory.h
@@ -7,6 +7,7 @@
 
 #include <memory>
 
+#include "base/component_export.h"
 #include "services/audio/public/mojom/debug_recording.mojom.h"
 
 namespace base {
@@ -19,6 +20,7 @@
 
 namespace audio {
 
+COMPONENT_EXPORT(AUDIO_PUBLIC_CPP)
 std::unique_ptr<media::AudioDebugRecordingSession>
 CreateAudioDebugRecordingSession(
     const base::FilePath& debug_recording_file_path,
diff --git a/services/audio/public/cpp/device_factory.h b/services/audio/public/cpp/device_factory.h
index 84b1824..564b92a 100644
--- a/services/audio/public/cpp/device_factory.h
+++ b/services/audio/public/cpp/device_factory.h
@@ -8,6 +8,7 @@
 #include <memory>
 #include <string>
 
+#include "base/component_export.h"
 #include "media/audio/audio_input_device.h"
 #include "media/mojo/mojom/audio_stream_factory.mojom.h"
 #include "mojo/public/cpp/bindings/pending_remote.h"
@@ -16,11 +17,13 @@
 
 using DeadStreamDetection = media::AudioInputDevice::DeadStreamDetection;
 
+COMPONENT_EXPORT(AUDIO_PUBLIC_CPP)
 scoped_refptr<media::AudioCapturerSource> CreateInputDevice(
     mojo::PendingRemote<media::mojom::AudioStreamFactory> stream_factory,
     const std::string& device_id,
     DeadStreamDetection detect_dead_stream);
 
+COMPONENT_EXPORT(AUDIO_PUBLIC_CPP)
 scoped_refptr<media::AudioCapturerSource> CreateInputDevice(
     mojo::PendingRemote<media::mojom::AudioStreamFactory> stream_factory,
     const std::string& device_id,
diff --git a/services/audio/public/cpp/input_ipc.h b/services/audio/public/cpp/input_ipc.h
index 92088e8..f96a524 100644
--- a/services/audio/public/cpp/input_ipc.h
+++ b/services/audio/public/cpp/input_ipc.h
@@ -9,6 +9,7 @@
 #include <string>
 
 #include "base/callback_helpers.h"
+#include "base/component_export.h"
 #include "base/memory/raw_ptr.h"
 #include "base/memory/weak_ptr.h"
 #include "base/sequence_checker.h"
@@ -25,8 +26,9 @@
 // InputIPC is a client-side class for handling creation,
 // initialization and control of an input stream. May only be used on a single
 // thread.
-class InputIPC : public media::AudioInputIPC,
-                 public media::mojom::AudioInputStreamClient {
+class COMPONENT_EXPORT(AUDIO_PUBLIC_CPP) InputIPC
+    : public media::AudioInputIPC,
+      public media::mojom::AudioInputStreamClient {
  public:
   InputIPC(mojo::PendingRemote<media::mojom::AudioStreamFactory> stream_factory,
            const std::string& device_id,
diff --git a/services/audio/public/cpp/output_device.h b/services/audio/public/cpp/output_device.h
index 295cd01..cc956c5 100644
--- a/services/audio/public/cpp/output_device.h
+++ b/services/audio/public/cpp/output_device.h
@@ -8,6 +8,7 @@
 #include <memory>
 #include <string>
 
+#include "base/component_export.h"
 #include "base/memory/raw_ptr.h"
 #include "media/base/audio_renderer_sink.h"
 #include "media/mojo/mojom/audio_output_stream.mojom.h"
@@ -22,7 +23,7 @@
 
 namespace audio {
 
-class OutputDevice {
+class COMPONENT_EXPORT(AUDIO_PUBLIC_CPP) OutputDevice {
  public:
   // media::AudioRendererSink::RenderCallback must outlive |this|.
   OutputDevice(
diff --git a/services/audio/public/cpp/sounds/audio_stream_handler.h b/services/audio/public/cpp/sounds/audio_stream_handler.h
index 1b991b9..e3b2534 100644
--- a/services/audio/public/cpp/sounds/audio_stream_handler.h
+++ b/services/audio/public/cpp/sounds/audio_stream_handler.h
@@ -9,6 +9,7 @@
 #include <memory>
 
 #include "base/compiler_specific.h"
+#include "base/component_export.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/sequence_checker.h"
 #include "base/strings/string_piece.h"
@@ -22,7 +23,7 @@
 namespace audio {
 
 // This class sends a sound to the audio output device.
-class AudioStreamHandler {
+class COMPONENT_EXPORT(AUDIO_PUBLIC_CPP) AudioStreamHandler {
  public:
   class TestObserver {
    public:
diff --git a/services/audio/public/cpp/sounds/sounds_manager.h b/services/audio/public/cpp/sounds/sounds_manager.h
index a3320dacd..ae5d079 100644
--- a/services/audio/public/cpp/sounds/sounds_manager.h
+++ b/services/audio/public/cpp/sounds/sounds_manager.h
@@ -6,6 +6,7 @@
 #define SERVICES_AUDIO_PUBLIC_CPP_SOUNDS_SOUNDS_MANAGER_H_
 
 #include "base/callback.h"
+#include "base/component_export.h"
 #include "base/sequence_checker.h"
 #include "base/strings/string_piece.h"
 #include "base/time/time.h"
@@ -17,7 +18,7 @@
 
 // This class is used for reproduction of system sounds. All methods
 // should be accessed from the Audio thread.
-class SoundsManager {
+class COMPONENT_EXPORT(AUDIO_PUBLIC_CPP) SoundsManager {
  public:
   typedef int SoundKey;
 
diff --git a/services/device/geolocation/geolocation_impl.cc b/services/device/geolocation/geolocation_impl.cc
index e6d4c2f..13ee127 100644
--- a/services/device/geolocation/geolocation_impl.cc
+++ b/services/device/geolocation/geolocation_impl.cc
@@ -7,58 +7,11 @@
 #include <utility>
 
 #include "base/bind.h"
-#include "base/metrics/histogram_macros.h"
 #include "services/device/geolocation/geolocation_context.h"
 #include "services/device/public/cpp/geolocation/geoposition.h"
 
 namespace device {
 
-namespace {
-
-// Geoposition error codes for reporting in UMA.
-enum GeopositionErrorCode {
-  // NOTE: Do not renumber these as that would confuse interpretation of
-  // previously logged data. When making changes, also update the enum list
-  // in tools/metrics/histograms/histograms.xml to keep it in sync.
-
-  // There was no error.
-  GEOPOSITION_ERROR_CODE_NONE = 0,
-
-  // User denied use of geolocation.
-  GEOPOSITION_ERROR_CODE_PERMISSION_DENIED = 1,
-
-  // Geoposition could not be determined.
-  GEOPOSITION_ERROR_CODE_POSITION_UNAVAILABLE = 2,
-
-  // Timeout.
-  GEOPOSITION_ERROR_CODE_TIMEOUT = 3,
-
-  // NOTE: Add entries only immediately above this line.
-  GEOPOSITION_ERROR_CODE_COUNT = 4
-};
-
-void RecordGeopositionErrorCode(mojom::Geoposition::ErrorCode error_code) {
-  GeopositionErrorCode code = GEOPOSITION_ERROR_CODE_NONE;
-  switch (error_code) {
-    case mojom::Geoposition::ErrorCode::NONE:
-      code = GEOPOSITION_ERROR_CODE_NONE;
-      break;
-    case mojom::Geoposition::ErrorCode::PERMISSION_DENIED:
-      code = GEOPOSITION_ERROR_CODE_PERMISSION_DENIED;
-      break;
-    case mojom::Geoposition::ErrorCode::POSITION_UNAVAILABLE:
-      code = GEOPOSITION_ERROR_CODE_POSITION_UNAVAILABLE;
-      break;
-    case mojom::Geoposition::ErrorCode::TIMEOUT:
-      code = GEOPOSITION_ERROR_CODE_TIMEOUT;
-      break;
-  }
-  UMA_HISTOGRAM_ENUMERATION("Geolocation.LocationUpdate.ErrorCode", code,
-                            GEOPOSITION_ERROR_CODE_COUNT);
-}
-
-}  // namespace
-
 GeolocationImpl::GeolocationImpl(mojo::PendingReceiver<Geolocation> receiver,
                                  GeolocationContext* context)
     : receiver_(this, std::move(receiver)),
@@ -74,8 +27,8 @@
   // Make sure to respond to any pending callback even without a valid position.
   if (!position_callback_.is_null()) {
     if (ValidateGeoposition(current_position_)) {
-      current_position_.error_code = mojom::Geoposition::ErrorCode(
-          GEOPOSITION_ERROR_CODE_POSITION_UNAVAILABLE);
+      current_position_.error_code =
+          mojom::Geoposition::ErrorCode::POSITION_UNAVAILABLE;
       current_position_.error_message.clear();
     }
     ReportCurrentPosition();
@@ -152,7 +105,6 @@
 }
 
 void GeolocationImpl::OnLocationUpdate(const mojom::Geoposition& position) {
-  RecordGeopositionErrorCode(position.error_code);
   DCHECK(context_);
 
   current_position_ = position;
diff --git a/storage/browser/file_system/filesystem_proxy_file_stream_reader.cc b/storage/browser/file_system/filesystem_proxy_file_stream_reader.cc
index 3d87045..876c531b 100644
--- a/storage/browser/file_system/filesystem_proxy_file_stream_reader.cc
+++ b/storage/browser/file_system/filesystem_proxy_file_stream_reader.cc
@@ -34,13 +34,13 @@
     scoped_refptr<FilesystemProxyFileStreamReader::SharedFilesystemProxy>
         shared_filesystem_proxy) {
   if (!shared_filesystem_proxy->data->PathExists(path)) {
-    return base::File::FILE_ERROR_NOT_FOUND;
+    return base::unexpected(base::File::FILE_ERROR_NOT_FOUND);
   }
 
   absl::optional<base::File::Info> info =
       shared_filesystem_proxy->data->GetFileInfo(path);
   if (!info.has_value()) {
-    return base::File::FILE_ERROR_FAILED;
+    return base::unexpected(base::File::FILE_ERROR_FAILED);
   }
 
   return std::move(*info);
@@ -161,7 +161,7 @@
 
 void FilesystemProxyFileStreamReader::DidOpenFile(
     base::FileErrorOr<base::File> open_result) {
-  if (open_result.is_error()) {
+  if (!open_result.has_value()) {
     std::move(callback_).Run(open_result.error());
     return;
   }
@@ -217,13 +217,13 @@
     base::FileErrorOr<base::File::Info> result) {
   // TODO(enne): track rate of missing blobs for http://crbug.com/1131151
   if (emit_metrics_) {
-    bool file_was_found = !result.is_error() ||
+    bool file_was_found = result.has_value() ||
                           result.error() != base::File::FILE_ERROR_NOT_FOUND;
     UMA_HISTOGRAM_BOOLEAN("WebCore.IndexedDB.FoundBlobFileForValue",
                           file_was_found);
   }
 
-  if (result.is_error()) {
+  if (!result.has_value()) {
     std::move(callback).Run(net::FileErrorToNetError(result.error()));
     return;
   }
diff --git a/storage/browser/file_system/local_file_stream_reader.cc b/storage/browser/file_system/local_file_stream_reader.cc
index 53d752f..c5654bbb 100644
--- a/storage/browser/file_system/local_file_stream_reader.cc
+++ b/storage/browser/file_system/local_file_stream_reader.cc
@@ -32,12 +32,12 @@
 
 base::FileErrorOr<base::File::Info> DoGetFileInfo(const base::FilePath& path) {
   if (!base::PathExists(path))
-    return base::File::FILE_ERROR_NOT_FOUND;
+    return base::unexpected(base::File::FILE_ERROR_NOT_FOUND);
 
   base::File::Info info;
   bool success = base::GetFileInfo(path, &info);
   if (!success)
-    return base::File::FILE_ERROR_FAILED;
+    return base::unexpected(base::File::FILE_ERROR_FAILED);
   return info;
 }
 
@@ -199,7 +199,7 @@
 void LocalFileStreamReader::DidGetFileInfoForGetLength(
     net::Int64CompletionOnceCallback callback,
     base::FileErrorOr<base::File::Info> result) {
-  if (result.is_error()) {
+  if (!result.has_value()) {
     std::move(callback).Run(net::FileErrorToNetError(result.error()));
     return;
   }
diff --git a/storage/browser/file_system/obfuscated_file_util.cc b/storage/browser/file_system/obfuscated_file_util.cc
index e9b04cd..b57e5dc4 100644
--- a/storage/browser/file_system/obfuscated_file_util.cc
+++ b/storage/browser/file_system/obfuscated_file_util.cc
@@ -927,7 +927,7 @@
   }
   base::File::Error error = GetDirectoryHelper(path, create);
   if (error != base::File::FILE_OK)
-    return error;
+    return base::unexpected(error);
   return path;
 }
 
@@ -939,7 +939,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   base::FileErrorOr<base::FilePath> dir =
       GetDirectoryForStorageKey(storage_key, create);
-  if (dir.is_error()) {
+  if (!dir.has_value()) {
     return dir;
   }
   DCHECK(!dir->empty());
@@ -954,7 +954,7 @@
   }
   base::File::Error error = GetDirectoryHelper(path, create);
   if (error != base::File::FILE_OK)
-    return error;
+    return base::unexpected(error);
   return path;
 }
 
@@ -966,18 +966,18 @@
 
   base::FileErrorOr<base::FilePath> origin_path =
       GetDirectoryForStorageKey(storage_key, false);
-  if (origin_path.is_error() || origin_path->empty())
+  if (!origin_path.has_value() || origin_path->empty())
     return true;
 
   if (type) {
     // Delete the filesystem type directory.
     const base::FileErrorOr<base::FilePath> origin_type_path =
         GetDirectoryForStorageKeyAndType(storage_key, type.value(), false);
-    if (origin_type_path.is_error() &&
+    if (!origin_type_path.has_value() &&
         origin_type_path.error() == base::File::FILE_ERROR_FAILED) {
       return false;
     }
-    if (!origin_type_path.is_error() && !origin_type_path->empty() &&
+    if (origin_type_path.has_value() && !origin_type_path->empty() &&
         !delegate_->DeleteFileOrDirectory(origin_type_path.value(),
                                           true /* recursive */)) {
       return false;
@@ -1034,7 +1034,7 @@
     // Delete the filesystem type directory.
     const base::FileErrorOr<base::FilePath> path_with_type =
         GetDirectoryForBucketAndType(bucket_locator, type.value(), false);
-    if (path_with_type.is_error())
+    if (!path_with_type.has_value())
       return false;
     if (!path_with_type->empty() &&
         !delegate_->DeleteFileOrDirectory(path_with_type.value(),
@@ -1351,7 +1351,7 @@
     const base::FilePath& data_path) {
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
   base::FileErrorOr<base::FilePath> root = GetDirectoryForURL(url, false);
-  if (root.is_error())
+  if (!root.has_value())
     return base::FilePath();
   return root.value().Append(data_path);
 }
@@ -1393,7 +1393,7 @@
   }
 
   base::FileErrorOr<base::FilePath> path = GetDirectoryForURL(url, create);
-  if (path.is_error()) {
+  if (!path.has_value()) {
     LOG(WARNING) << "Failed to get origin+type directory: " << url.DebugString()
                  << " error:" << path.error();
     return nullptr;
@@ -1413,39 +1413,40 @@
     // Retrieve the default bucket value for `storage_key`.
     QuotaErrorOr<BucketLocator> bucket = GetOrCreateDefaultBucket(storage_key);
     if (!bucket.ok())
-      return base::File::FILE_ERROR_FAILED;
+      return base::unexpected(base::File::FILE_ERROR_FAILED);
     // Get the path and verify it is valid.
     base::FileErrorOr<base::FilePath> path =
         sandbox_delegate_->quota_manager_proxy()->GetClientBucketPath(
             bucket.value(), QuotaClientType::kFileSystem);
-    if (path.is_error())
-      return path.error();
+    if (!path.has_value())
+      return base::unexpected(path.error());
     base::File::Error error = GetDirectoryHelper(path.value(), create);
     if (error != base::File::FILE_OK)
-      return error;
+      return base::unexpected(error);
     return path;
   }
 
   if (!InitOriginDatabase(storage_key.origin(), create)) {
-    return create ? base::File::FILE_ERROR_FAILED
-                  : base::File::FILE_ERROR_NOT_FOUND;
+    return base::FileErrorOr<base::FilePath>(
+        base::unexpected(create ? base::File::FILE_ERROR_FAILED
+                                : base::File::FILE_ERROR_NOT_FOUND));
   }
   base::FilePath directory_name;
   std::string id = GetIdentifierFromOrigin(storage_key.origin());
 
   bool exists_in_db = origin_database_->HasOriginPath(id);
   if (!exists_in_db && !create) {
-    return base::File::FILE_ERROR_NOT_FOUND;
+    return base::unexpected(base::File::FILE_ERROR_NOT_FOUND);
   }
   if (!origin_database_->GetPathForOrigin(id, &directory_name)) {
-    return base::File::FILE_ERROR_FAILED;
+    return base::unexpected(base::File::FILE_ERROR_FAILED);
   }
 
   base::FilePath path = file_system_directory_.Append(directory_name);
   bool exists_in_fs = delegate_->DirectoryExists(path);
   if (!exists_in_db && exists_in_fs) {
     if (!delegate_->DeleteFileOrDirectory(path, true)) {
-      return base::File::FILE_ERROR_FAILED;
+      return base::unexpected(base::File::FILE_ERROR_FAILED);
     }
     exists_in_fs = false;
   }
@@ -1454,8 +1455,8 @@
     if (!create || delegate_->CreateDirectory(path, false /* exclusive */,
                                               true /* recursive */) !=
                        base::File::FILE_OK) {
-      return create ? base::File::FILE_ERROR_FAILED
-                    : base::File::FILE_ERROR_NOT_FOUND;
+      return base::unexpected(create ? base::File::FILE_ERROR_FAILED
+                                     : base::File::FILE_ERROR_NOT_FOUND);
     }
   }
   return path;
@@ -1580,7 +1581,7 @@
 
   base::FileErrorOr<base::FilePath> directory_for_url =
       GetDirectoryForURL(url, false);
-  if (directory_for_url.is_error())
+  if (!directory_for_url.has_value())
     return directory_for_url.error();
   *root = directory_for_url.value();
 
diff --git a/storage/browser/file_system/obfuscated_file_util_unittest.cc b/storage/browser/file_system/obfuscated_file_util_unittest.cc
index df29875..feb9a80 100644
--- a/storage/browser/file_system/obfuscated_file_util_unittest.cc
+++ b/storage/browser/file_system/obfuscated_file_util_unittest.cc
@@ -417,7 +417,7 @@
                        quota_manager_, &sandbox_file_system_));
     base::FileErrorOr<base::FilePath> path =
         sandbox_file_system_.GetUsageCachePath();
-    if (!path.is_error())
+    if (path.has_value())
       usage_cache()->Delete(path.value());
   }
 
@@ -428,7 +428,7 @@
     int64_t usage = 0;
     base::FileErrorOr<base::FilePath> path =
         sandbox_file_system_.GetUsageCachePath();
-    if (path.is_error())
+    if (!path.has_value())
       return -1;
     return usage_cache()->GetUsage(path.value(), &usage) ? usage : -1;
   }
@@ -2565,28 +2565,28 @@
       NewFileSystem(custom_bucket_, kFileSystemTypePersistent);
 
   // Make sure directories for default_bucket_ exist.
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForBucketAndType(default_bucket_,
-                                                  kFileSystemTypeTemporary,
-                                                  /*create=*/false)
-                   .is_error());
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForBucketAndType(default_bucket_,
-                                                  kFileSystemTypePersistent,
-                                                  /*create=*/false)
-                   .is_error());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForBucketAndType(default_bucket_,
+                                                 kFileSystemTypeTemporary,
+                                                 /*create=*/false)
+                  .has_value());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForBucketAndType(default_bucket_,
+                                                 kFileSystemTypePersistent,
+                                                 /*create=*/false)
+                  .has_value());
 
   // Make sure directories for custom_bucket_ exist.
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForBucketAndType(custom_bucket_,
-                                                  kFileSystemTypeTemporary,
-                                                  /*create=*/false)
-                   .is_error());
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForBucketAndType(custom_bucket_,
-                                                  kFileSystemTypePersistent,
-                                                  /*create=*/false)
-                   .is_error());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForBucketAndType(custom_bucket_,
+                                                 kFileSystemTypeTemporary,
+                                                 /*create=*/false)
+                  .has_value());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForBucketAndType(custom_bucket_,
+                                                 kFileSystemTypePersistent,
+                                                 /*create=*/false)
+                  .has_value());
 
   // Delete a directory for default_bucket_'s persistent filesystem.
   ASSERT_TRUE(ofu()->DeleteDirectoryForBucketAndType(
@@ -2594,11 +2594,11 @@
 
   // The directory for default_bucket_'s temporary filesystem should not be
   // removed.
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForBucketAndType(default_bucket_,
-                                                  kFileSystemTypeTemporary,
-                                                  /*create=*/false)
-                   .is_error());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForBucketAndType(default_bucket_,
+                                                 kFileSystemTypeTemporary,
+                                                 /*create=*/false)
+                  .has_value());
 
   // The directory for default_bucket_'s persistent filesystem should be
   // removed.
@@ -2610,16 +2610,16 @@
             base::File::FILE_ERROR_NOT_FOUND);
 
   // The directories for custom_bucket_ should not be removed.
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForBucketAndType(custom_bucket_,
-                                                  kFileSystemTypeTemporary,
-                                                  /*create=*/false)
-                   .is_error());
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForBucketAndType(custom_bucket_,
-                                                  kFileSystemTypePersistent,
-                                                  /*create=*/false)
-                   .is_error());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForBucketAndType(custom_bucket_,
+                                                 kFileSystemTypeTemporary,
+                                                 /*create=*/false)
+                  .has_value());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForBucketAndType(custom_bucket_,
+                                                 kFileSystemTypePersistent,
+                                                 /*create=*/false)
+                  .has_value());
 
   // Deleting directories which don't exist is not an error.
   ASSERT_TRUE(ofu()->DeleteDirectoryForBucketAndType(
@@ -2647,28 +2647,28 @@
       NewFileSystem(storage_key2, kFileSystemTypePersistent);
 
   // Make sure directories for storage_key1 exist.
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForStorageKeyAndType(storage_key1,
-                                                      kFileSystemTypeTemporary,
-                                                      /*create=*/false)
-                   .is_error());
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForStorageKeyAndType(storage_key1,
-                                                      kFileSystemTypePersistent,
-                                                      /*create=*/false)
-                   .is_error());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForStorageKeyAndType(storage_key1,
+                                                     kFileSystemTypeTemporary,
+                                                     /*create=*/false)
+                  .has_value());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForStorageKeyAndType(storage_key1,
+                                                     kFileSystemTypePersistent,
+                                                     /*create=*/false)
+                  .has_value());
 
   // Make sure directories for storage_key2 exist.
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForStorageKeyAndType(storage_key2,
-                                                      kFileSystemTypeTemporary,
-                                                      /*create=*/false)
-                   .is_error());
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForStorageKeyAndType(storage_key2,
-                                                      kFileSystemTypePersistent,
-                                                      /*create=*/false)
-                   .is_error());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForStorageKeyAndType(storage_key2,
+                                                     kFileSystemTypeTemporary,
+                                                     /*create=*/false)
+                  .has_value());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForStorageKeyAndType(storage_key2,
+                                                     kFileSystemTypePersistent,
+                                                     /*create=*/false)
+                  .has_value());
 
   // Delete a directory for storage_key1's persistent filesystem.
   ASSERT_TRUE(ofu()->DeleteDirectoryForStorageKeyAndType(
@@ -2676,11 +2676,11 @@
 
   // The directory for storage_key1's temporary filesystem should not be
   // removed.
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForStorageKeyAndType(storage_key1,
-                                                      kFileSystemTypeTemporary,
-                                                      /*create=*/false)
-                   .is_error());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForStorageKeyAndType(storage_key1,
+                                                     kFileSystemTypeTemporary,
+                                                     /*create=*/false)
+                  .has_value());
 
   // The directory for storage_key1's persistent filesystem should be removed.
   ASSERT_EQ(ofu()
@@ -2691,16 +2691,16 @@
             base::File::FILE_ERROR_NOT_FOUND);
 
   // The directories for storage_key2 should not be removed.
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForStorageKeyAndType(storage_key2,
-                                                      kFileSystemTypeTemporary,
-                                                      /*create=*/false)
-                   .is_error());
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForStorageKeyAndType(storage_key2,
-                                                      kFileSystemTypePersistent,
-                                                      /*create=*/false)
-                   .is_error());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForStorageKeyAndType(storage_key2,
+                                                     kFileSystemTypeTemporary,
+                                                     /*create=*/false)
+                  .has_value());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForStorageKeyAndType(storage_key2,
+                                                     kFileSystemTypePersistent,
+                                                     /*create=*/false)
+                  .has_value());
 
   // Make sure storage_key3's directories don't exist.
   ASSERT_EQ(ofu()
@@ -2735,28 +2735,28 @@
       NewFileSystem(custom_bucket_, kFileSystemTypePersistent);
 
   // Make sure directories for default_bucket_ exist.
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForBucketAndType(default_bucket_,
-                                                  kFileSystemTypeTemporary,
-                                                  /*create=*/false)
-                   .is_error());
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForBucketAndType(default_bucket_,
-                                                  kFileSystemTypePersistent,
-                                                  /*create=*/false)
-                   .is_error());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForBucketAndType(default_bucket_,
+                                                 kFileSystemTypeTemporary,
+                                                 /*create=*/false)
+                  .has_value());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForBucketAndType(default_bucket_,
+                                                 kFileSystemTypePersistent,
+                                                 /*create=*/false)
+                  .has_value());
 
   // Make sure directories for custom_bucket_ exist.
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForBucketAndType(custom_bucket_,
-                                                  kFileSystemTypeTemporary,
-                                                  /*create=*/false)
-                   .is_error());
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForBucketAndType(custom_bucket_,
-                                                  kFileSystemTypePersistent,
-                                                  /*create=*/false)
-                   .is_error());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForBucketAndType(custom_bucket_,
+                                                 kFileSystemTypeTemporary,
+                                                 /*create=*/false)
+                  .has_value());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForBucketAndType(custom_bucket_,
+                                                 kFileSystemTypePersistent,
+                                                 /*create=*/false)
+                  .has_value());
 
   // Delete all directories for default_bucket_.
   ofu()->DeleteDirectoryForBucketAndType(default_bucket_, absl::nullopt);
@@ -2776,16 +2776,16 @@
             base::File::FILE_ERROR_NOT_FOUND);
 
   // The directories for custom_bucket_ should not be removed.
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForBucketAndType(custom_bucket_,
-                                                  kFileSystemTypeTemporary,
-                                                  /*create=*/false)
-                   .is_error());
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForBucketAndType(custom_bucket_,
-                                                  kFileSystemTypePersistent,
-                                                  /*create=*/false)
-                   .is_error());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForBucketAndType(custom_bucket_,
+                                                 kFileSystemTypeTemporary,
+                                                 /*create=*/false)
+                  .has_value());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForBucketAndType(custom_bucket_,
+                                                 kFileSystemTypePersistent,
+                                                 /*create=*/false)
+                  .has_value());
 }
 
 TEST_P(ObfuscatedFileUtilTest, DeleteDirectoryForStorageKeyAndType_DeleteAll) {
@@ -2807,28 +2807,28 @@
       NewFileSystem(storage_key2, kFileSystemTypePersistent);
 
   // Make sure directories for storage_key1 exist.
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForStorageKeyAndType(storage_key1,
-                                                      kFileSystemTypeTemporary,
-                                                      /*create=*/false)
-                   .is_error());
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForStorageKeyAndType(storage_key1,
-                                                      kFileSystemTypePersistent,
-                                                      /*create=*/false)
-                   .is_error());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForStorageKeyAndType(storage_key1,
+                                                     kFileSystemTypeTemporary,
+                                                     /*create=*/false)
+                  .has_value());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForStorageKeyAndType(storage_key1,
+                                                     kFileSystemTypePersistent,
+                                                     /*create=*/false)
+                  .has_value());
 
   // Make sure directories for storage_key2 exist.
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForStorageKeyAndType(storage_key2,
-                                                      kFileSystemTypeTemporary,
-                                                      /*create=*/false)
-                   .is_error());
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForStorageKeyAndType(storage_key2,
-                                                      kFileSystemTypePersistent,
-                                                      /*create=*/false)
-                   .is_error());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForStorageKeyAndType(storage_key2,
+                                                     kFileSystemTypeTemporary,
+                                                     /*create=*/false)
+                  .has_value());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForStorageKeyAndType(storage_key2,
+                                                     kFileSystemTypePersistent,
+                                                     /*create=*/false)
+                  .has_value());
 
   // Delete all directories for storage_key1.
   ofu()->DeleteDirectoryForStorageKeyAndType(storage_key1, absl::nullopt);
@@ -2848,16 +2848,16 @@
             base::File::FILE_ERROR_NOT_FOUND);
 
   // The directories for storage_key2 should not be removed.
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForStorageKeyAndType(storage_key2,
-                                                      kFileSystemTypeTemporary,
-                                                      /*create=*/false)
-                   .is_error());
-  ASSERT_FALSE(ofu()
-                   ->GetDirectoryForStorageKeyAndType(storage_key2,
-                                                      kFileSystemTypePersistent,
-                                                      /*create=*/false)
-                   .is_error());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForStorageKeyAndType(storage_key2,
+                                                     kFileSystemTypeTemporary,
+                                                     /*create=*/false)
+                  .has_value());
+  ASSERT_TRUE(ofu()
+                  ->GetDirectoryForStorageKeyAndType(storage_key2,
+                                                     kFileSystemTypePersistent,
+                                                     /*create=*/false)
+                  .has_value());
 }
 
 }  // namespace storage
diff --git a/storage/browser/file_system/quota/quota_backend_impl.cc b/storage/browser/file_system/quota/quota_backend_impl.cc
index e7266b2..979823e 100644
--- a/storage/browser/file_system/quota/quota_backend_impl.cc
+++ b/storage/browser/file_system/quota/quota_backend_impl.cc
@@ -78,7 +78,7 @@
     return;
   ReserveQuotaInternal(QuotaReservationInfo(origin, type, delta));
   base::FileErrorOr<base::FilePath> path = GetUsageCachePath(origin, type);
-  if (path.is_error())
+  if (!path.has_value())
     return;
   bool result =
       file_system_usage_cache_->AtomicUpdateUsageByDelta(path.value(), delta);
@@ -90,7 +90,7 @@
   DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(!origin.opaque());
   base::FileErrorOr<base::FilePath> path = GetUsageCachePath(origin, type);
-  if (path.is_error())
+  if (!path.has_value())
     return;
   DCHECK(file_system_usage_cache_);
   file_system_usage_cache_->IncrementDirty(path.value());
@@ -101,7 +101,7 @@
   DCHECK(file_task_runner_->RunsTasksInCurrentSequence());
   DCHECK(!origin.opaque());
   base::FileErrorOr<base::FilePath> path = GetUsageCachePath(origin, type);
-  if (path.is_error())
+  if (!path.has_value())
     return;
   DCHECK(file_system_usage_cache_);
   file_system_usage_cache_->DecrementDirty(path.value());
diff --git a/storage/browser/file_system/quota/quota_backend_impl_unittest.cc b/storage/browser/file_system/quota/quota_backend_impl_unittest.cc
index d0028570..0788811 100644
--- a/storage/browser/file_system/quota/quota_backend_impl_unittest.cc
+++ b/storage/browser/file_system/quota/quota_backend_impl_unittest.cc
@@ -141,7 +141,7 @@
     base::FileErrorOr<base::FilePath> path =
         file_util_->GetDirectoryForStorageKeyAndType(blink::StorageKey(origin),
                                                      type, true /* create */);
-    ASSERT_FALSE(path.is_error());
+    ASSERT_TRUE(path.has_value());
 
     ASSERT_TRUE(file_system_usage_cache_.UpdateUsage(
         GetUsageCachePath(origin, type), 0));
@@ -155,7 +155,7 @@
                                    FileSystemType type) {
     base::FileErrorOr<base::FilePath> path =
         backend_->GetUsageCachePath(origin, type);
-    EXPECT_FALSE(path.is_error());
+    EXPECT_TRUE(path.has_value());
     EXPECT_FALSE(path->empty());
     return path.value();
   }
diff --git a/storage/browser/file_system/sandbox_file_system_backend_delegate.cc b/storage/browser/file_system/sandbox_file_system_backend_delegate.cc
index a556ba2..71caf128 100644
--- a/storage/browser/file_system/sandbox_file_system_backend_delegate.cc
+++ b/storage/browser/file_system/sandbox_file_system_backend_delegate.cc
@@ -121,12 +121,12 @@
     base::FileErrorOr<base::FilePath> path =
         file_util->GetDirectoryForBucketAndType(bucket_locator.value(), type,
                                                 create);
-    error = (path.is_error()) ? path.error() : base::File::FILE_OK;
+    error = path.has_value() ? base::File::FILE_OK : path.error();
   } else {
     base::FileErrorOr<base::FilePath> path =
         file_util->GetDirectoryForStorageKeyAndType(
             blink::StorageKey(url::Origin::Create(origin_url)), type, create);
-    error = (path.is_error()) ? path.error() : base::File::FILE_OK;
+    error = path.has_value() ? base::File::FILE_OK : path.error();
   }
   if (error != base::File::FILE_OK) {
     UMA_HISTOGRAM_ENUMERATION(kOpenFileSystemLabel, kCreateDirectoryError,
@@ -240,9 +240,7 @@
   base::FileErrorOr<base::FilePath> path =
       obfuscated_file_util()->GetDirectoryForStorageKeyAndType(storage_key,
                                                                type, create);
-  if (path.is_error())
-    return base::FilePath();
-  return path.value();
+  return path.value_or(base::FilePath());
 }
 
 base::FilePath
@@ -253,9 +251,7 @@
   base::FileErrorOr<base::FilePath> path =
       obfuscated_file_util()->GetDirectoryForBucketAndType(bucket_locator, type,
                                                            create);
-  if (path.is_error())
-    return base::FilePath();
-  return path.value();
+  return path.value_or(base::FilePath());
 }
 
 void SandboxFileSystemBackendDelegate::OpenFileSystem(
@@ -491,7 +487,7 @@
   if (bucket_locator.has_value()) {
     base::FileErrorOr<base::FilePath> result =
         GetBaseDirectoryForBucketAndType(bucket_locator.value(), type, false);
-    if (result.is_error() ||
+    if (!result.has_value() ||
         !obfuscated_file_util()->delegate()->DirectoryExists(result.value()))
       return 0;
     path = result.value();
@@ -605,7 +601,7 @@
   base::FileErrorOr<base::FilePath> usage_file_path =
       GetUsageCachePathForStorageKeyAndType(obfuscated_file_util(), storage_key,
                                             type);
-  if (usage_file_path.is_error())
+  if (!usage_file_path.has_value())
     return;
   usage_cache()->IncrementDirty(usage_file_path.value());
 }
@@ -688,7 +684,7 @@
   base::FileErrorOr<base::FilePath> base_path =
       sandbox_file_util->GetDirectoryForStorageKeyAndType(storage_key, type,
                                                           false /* create */);
-  if (base_path.is_error()) {
+  if (!base_path.has_value()) {
     return base_path;
   }
   return base_path->Append(FileSystemUsageCache::kUsageFileName);
@@ -711,7 +707,7 @@
   base::FileErrorOr<base::FilePath> base_path =
       sandbox_file_util->GetDirectoryForBucketAndType(bucket_locator, type,
                                                       /*create=*/false);
-  if (base_path.is_error()) {
+  if (!base_path.has_value()) {
     return base_path;
   }
   return base_path->Append(FileSystemUsageCache::kUsageFileName);
diff --git a/storage/browser/file_system/sandbox_quota_observer.cc b/storage/browser/file_system/sandbox_quota_observer.cc
index f874b01..ba12dc8 100644
--- a/storage/browser/file_system/sandbox_quota_observer.cc
+++ b/storage/browser/file_system/sandbox_quota_observer.cc
@@ -35,7 +35,7 @@
 void SandboxQuotaObserver::OnStartUpdate(const FileSystemURL& url) {
   DCHECK(update_notify_runner_->RunsTasksInCurrentSequence());
   base::FileErrorOr<base::FilePath> usage_file_path = GetUsageCachePath(url);
-  if (usage_file_path.is_error() || usage_file_path->empty())
+  if (!usage_file_path.has_value() || usage_file_path->empty())
     return;
   file_system_usage_cache_->IncrementDirty(usage_file_path.value());
 }
@@ -51,7 +51,7 @@
   }
 
   base::FileErrorOr<base::FilePath> usage_file_path = GetUsageCachePath(url);
-  if (usage_file_path.is_error() || usage_file_path->empty())
+  if (!usage_file_path.has_value() || usage_file_path->empty())
     return;
 
   pending_update_notification_[usage_file_path.value()] += delta;
@@ -68,7 +68,7 @@
   DCHECK(update_notify_runner_->RunsTasksInCurrentSequence());
 
   base::FileErrorOr<base::FilePath> usage_file_path = GetUsageCachePath(url);
-  if (usage_file_path.is_error() || usage_file_path->empty())
+  if (!usage_file_path.has_value() || usage_file_path->empty())
     return;
 
   auto found = pending_update_notification_.find(usage_file_path.value());
@@ -110,7 +110,7 @@
         SandboxFileSystemBackendDelegate::GetUsageCachePathForStorageKeyAndType(
             sandbox_file_util_, url.storage_key(), url.type());
   }
-  if (path.is_error()) {
+  if (!path.has_value()) {
     LOG(WARNING) << "Could not get usage cache path for: " << url.DebugString();
   }
   return path;
diff --git a/storage/browser/test/sandbox_file_system_test_helper.cc b/storage/browser/test/sandbox_file_system_test_helper.cc
index 8822bf4..8d592ea2 100644
--- a/storage/browser/test/sandbox_file_system_test_helper.cc
+++ b/storage/browser/test/sandbox_file_system_test_helper.cc
@@ -139,7 +139,7 @@
 
   int64_t size = file_util_delegate()->ComputeDirectorySize(GetRootPath());
   base::FileErrorOr<base::FilePath> path = GetUsageCachePath();
-  if (!path.is_error() && file_util_delegate()->PathExists(path.value()))
+  if (path.has_value() && file_util_delegate()->PathExists(path.value()))
     size -= FileSystemUsageCache::kUsageFileSize;
 
   return size;
@@ -203,7 +203,7 @@
                                                /*create=*/true);
   }
   base::FileErrorOr<base::FilePath> usage_cache_path = GetUsageCachePath();
-  if (!usage_cache_path.is_error() && !usage_cache_path->empty())
+  if (usage_cache_path.has_value() && !usage_cache_path->empty())
     usage_cache()->UpdateUsage(usage_cache_path.value(), 0);
 }
 
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json
index 16b2f9ac..4bbb59b 100644
--- a/testing/buildbot/chromium.fyi.json
+++ b/testing/buildbot/chromium.fyi.json
@@ -110078,44 +110078,6 @@
           "--git-revision=${got_revision}"
         ],
         "check_flakiness_for_new_tests": false,
-        "isolate_name": "blink_web_tests",
-        "merge": {
-          "args": [
-            "--verbose"
-          ],
-          "script": "//third_party/blink/tools/merge_web_test_results.py"
-        },
-        "name": "blink_web_tests",
-        "precommit_args": [
-          "--gerrit-issue=${patch_issue}",
-          "--gerrit-patchset=${patch_set}",
-          "--buildbucket-id=${buildbucket_build_id}"
-        ],
-        "resultdb": {
-          "enable": true
-        },
-        "results_handler": "layout tests",
-        "swarming": {
-          "can_use_on_swarming_builders": true,
-          "dimension_sets": [
-            {
-              "cpu": "x86-64",
-              "os": "Mac-13"
-            }
-          ],
-          "expiration": 21600,
-          "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com",
-          "shards": 5
-        },
-        "test_id_prefix": "ninja://:blink_web_tests/"
-      },
-      {
-        "args": [
-          "--num-retries=3",
-          "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json",
-          "--git-revision=${got_revision}"
-        ],
-        "check_flakiness_for_new_tests": false,
         "isolate_name": "blink_wpt_tests",
         "merge": {
           "args": [
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl
index 1e2d4e7..088fdc75 100644
--- a/testing/buildbot/test_suite_exceptions.pyl
+++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -205,6 +205,7 @@
       'Win 7 Tests x64 (1)',  # 64-bit win is unsupported by the layout tests.
       'Win7 Tests (1)',
       'Win10 Tests x64 (dbg)',
+      'mac-osxbeta-rel',
     ],
     'modifications': {
       'Linux Tests': {
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index aa90fea..f6475c64 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -4560,6 +4560,25 @@
             ]
         }
     ],
+    "EnableShoppingListDesktop": [
+        {
+            "platforms": [
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled_20221005",
+                    "enable_features": [
+                        "ShoppingList"
+                    ]
+                }
+            ]
+        }
+    ],
     "ExploreSitesDense": [
         {
             "platforms": [
@@ -4851,9 +4870,6 @@
                     "name": "ForceGpuMainThreadToNormalPriorityDrDc",
                     "enable_features": [
                         "ForceGpuMainThreadToNormalPriorityDrDc"
-                    ],
-                    "disable_features": [
-                        "RawDraw"
                     ]
                 }
             ]
@@ -8944,6 +8960,9 @@
                     },
                     "enable_features": [
                         "EnableDrDcVulkan"
+                    ],
+                    "disable_features": [
+                        "RawDraw"
                     ]
                 }
             ]
@@ -9762,25 +9781,6 @@
             ]
         }
     ],
-    "ShoppingList": [
-        {
-            "platforms": [
-                "chromeos",
-                "chromeos_lacros",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled_20221005",
-                    "enable_features": [
-                        "ShoppingList"
-                    ]
-                }
-            ]
-        }
-    ],
     "ShowScrollableMVTOnNTPAndroid": [
         {
             "platforms": [
@@ -12123,6 +12123,21 @@
             ]
         }
     ],
+    "WebRTCPipeWireCapturer": [
+        {
+            "platforms": [
+                "linux"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "enable_features": [
+                        "WebRTCPipeWireCapturer"
+                    ]
+                }
+            ]
+        }
+    ],
     "WebRtcAllowWgcDesktopCapturer": [
         {
             "platforms": [
diff --git a/third_party/abseil-cpp/CMake/AbseilHelpers.cmake b/third_party/abseil-cpp/CMake/AbseilHelpers.cmake
index e1196fd7..6d402872 100644
--- a/third_party/abseil-cpp/CMake/AbseilHelpers.cmake
+++ b/third_party/abseil-cpp/CMake/AbseilHelpers.cmake
@@ -32,7 +32,7 @@
   set(ABSL_INTERNAL_INCLUDE_WARNING_GUARD "")
 endif()
 
-function(_target_compile_features_if_available TARGET TYPE FEATURE)
+function(_absl_target_compile_features_if_available TARGET TYPE FEATURE)
   if(FEATURE IN_LIST CMAKE_CXX_COMPILE_FEATURES)
     target_compile_features(${TARGET} ${TYPE} ${FEATURE})
   else()
@@ -300,7 +300,7 @@
       # Abseil libraries require C++14 as the current minimum standard.
       # Top-level application CMake projects should ensure a consistent C++
       # standard for all compiled sources by setting CMAKE_CXX_STANDARD.
-      _target_compile_features_if_available(${_NAME} PUBLIC ${ABSL_INTERNAL_CXX_STD_FEATURE})
+      _absl_target_compile_features_if_available(${_NAME} PUBLIC ${ABSL_INTERNAL_CXX_STD_FEATURE})
     else()
       # Note: This is legacy (before CMake 3.8) behavior. Setting the
       # target-level CXX_STANDARD property to ABSL_CXX_STANDARD (which is
@@ -348,7 +348,7 @@
       # Abseil libraries require C++14 as the current minimum standard.
       # Top-level application CMake projects should ensure a consistent C++
       # standard for all compiled sources by setting CMAKE_CXX_STANDARD.
-      _target_compile_features_if_available(${_NAME} INTERFACE ${ABSL_INTERNAL_CXX_STD_FEATURE})
+      _absl_target_compile_features_if_available(${_NAME} INTERFACE ${ABSL_INTERNAL_CXX_STD_FEATURE})
 
       # (INTERFACE libraries can't have the CXX_STANDARD property set, so there
       # is no legacy behavior else case).
@@ -460,7 +460,7 @@
     # Abseil libraries require C++14 as the current minimum standard.
     # Top-level application CMake projects should ensure a consistent C++
     # standard for all compiled sources by setting CMAKE_CXX_STANDARD.
-    _target_compile_features_if_available(${_NAME} PUBLIC ${ABSL_INTERNAL_CXX_STD_FEATURE})
+    _absl_target_compile_features_if_available(${_NAME} PUBLIC ${ABSL_INTERNAL_CXX_STD_FEATURE})
   else()
     # Note: This is legacy (before CMake 3.8) behavior. Setting the
     # target-level CXX_STANDARD property to ABSL_CXX_STANDARD (which is
@@ -476,11 +476,3 @@
 
   add_test(NAME ${_NAME} COMMAND ${_NAME})
 endfunction()
-
-
-function(check_target my_target)
-  if(NOT TARGET ${my_target})
-    message(FATAL_ERROR " ABSL: compiling absl requires a ${my_target} CMake target in your project,
-                   see CMake/README.md for more details")
-  endif(NOT TARGET ${my_target})
-endfunction()
diff --git a/third_party/abseil-cpp/CMakeLists.txt b/third_party/abseil-cpp/CMakeLists.txt
index 3b67d8f..9e10257 100644
--- a/third_party/abseil-cpp/CMakeLists.txt
+++ b/third_party/abseil-cpp/CMakeLists.txt
@@ -140,7 +140,6 @@
   )
 
 if((BUILD_TESTING AND ABSL_BUILD_TESTING) OR ABSL_BUILD_TEST_HELPERS)
-  ## check targets
   if (ABSL_USE_EXTERNAL_GOOGLETEST)
     if (ABSL_FIND_GOOGLETEST)
       find_package(GTest REQUIRED)
@@ -172,11 +171,6 @@
     endif()
     include(CMake/Googletest/DownloadGTest.cmake)
   endif()
-
-  check_target(GTest::gtest)
-  check_target(GTest::gtest_main)
-  check_target(GTest::gmock)
-  check_target(GTest::gmock_main)
 endif()
 
 add_subdirectory(absl)
diff --git a/third_party/abseil-cpp/README.chromium b/third_party/abseil-cpp/README.chromium
index 4a78fb33..24d5dd6 100644
--- a/third_party/abseil-cpp/README.chromium
+++ b/third_party/abseil-cpp/README.chromium
@@ -4,7 +4,7 @@
 License: Apache 2.0
 License File: LICENSE
 Version: 0
-Revision: d24156f63ca6d44a0dc05e260ad7810b2fcf3405
+Revision: e58d05efe0b3b1dfff3faf5b8b58c43bd8e6e29f
 Security Critical: yes
 
 Description:
diff --git a/third_party/abseil-cpp/absl/base/config.h b/third_party/abseil-cpp/absl/base/config.h
index 95131068..1058ce7 100644
--- a/third_party/abseil-cpp/absl/base/config.h
+++ b/third_party/abseil-cpp/absl/base/config.h
@@ -243,6 +243,7 @@
 #ifdef ABSL_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE
 #error ABSL_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE cannot be directly set
 #elif defined(_LIBCPP_VERSION) || defined(_MSC_VER) || \
+    (defined(__clang__) && __clang_major__ >= 15) ||   \
     (!defined(__clang__) && defined(__GLIBCXX__) &&    \
      ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(4, 8))
 #define ABSL_HAVE_STD_IS_TRIVIALLY_DESTRUCTIBLE 1
@@ -264,6 +265,7 @@
 #elif defined(ABSL_HAVE_STD_IS_TRIVIALLY_ASSIGNABLE)
 #error ABSL_HAVE_STD_IS_TRIVIALLY_ASSIGNABLE cannot directly set
 #elif (defined(__clang__) && defined(_LIBCPP_VERSION)) ||                    \
+    (defined(__clang__) && __clang_major__ >= 15) ||                         \
     (!defined(__clang__) &&                                                  \
      ((ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(7, 4) && defined(__GLIBCXX__)) || \
       (ABSL_INTERNAL_HAVE_MIN_GNUC_VERSION(8, 2) &&                          \
diff --git a/third_party/abseil-cpp/absl/base/optimization.h b/third_party/abseil-cpp/absl/base/optimization.h
index db5cc09..d706100c 100644
--- a/third_party/abseil-cpp/absl/base/optimization.h
+++ b/third_party/abseil-cpp/absl/base/optimization.h
@@ -91,6 +91,7 @@
 #define ABSL_CACHELINE_SIZE 64
 #endif
 #endif
+#endif
 
 #ifndef ABSL_CACHELINE_SIZE
 // A reasonable default guess.  Note that overestimates tend to waste more
@@ -141,12 +142,11 @@
 //    the generated machine code.
 // 3) Prefer applying this attribute to individual variables. Avoid
 //    applying it to types. This tends to localize the effect.
+#if defined(__clang__) || defined(__GNUC__)
 #define ABSL_CACHELINE_ALIGNED __attribute__((aligned(ABSL_CACHELINE_SIZE)))
 #elif defined(_MSC_VER)
-#define ABSL_CACHELINE_SIZE 64
 #define ABSL_CACHELINE_ALIGNED __declspec(align(ABSL_CACHELINE_SIZE))
 #else
-#define ABSL_CACHELINE_SIZE 64
 #define ABSL_CACHELINE_ALIGNED
 #endif
 
diff --git a/third_party/abseil-cpp/absl/container/BUILD.bazel b/third_party/abseil-cpp/absl/container/BUILD.bazel
index 15162f28..d8dad8e8 100644
--- a/third_party/abseil-cpp/absl/container/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/container/BUILD.bazel
@@ -134,6 +134,7 @@
         "//absl/base:core_headers",
         "//absl/base:throw_delegate",
         "//absl/memory",
+        "//absl/meta:type_traits",
     ],
 )
 
@@ -1011,8 +1012,8 @@
         ":flat_hash_set",
         ":hashtable_debug",
         "//absl/base:raw_logging_internal",
-        "//absl/flags:flag",
         "//absl/hash",
+        "//absl/log",
         "//absl/memory",
         "//absl/strings:cord",
         "//absl/strings:str_format",
diff --git a/third_party/abseil-cpp/absl/container/BUILD.gn b/third_party/abseil-cpp/absl/container/BUILD.gn
index 061b650..d4255a5 100644
--- a/third_party/abseil-cpp/absl/container/BUILD.gn
+++ b/third_party/abseil-cpp/absl/container/BUILD.gn
@@ -41,6 +41,7 @@
     "//third_party/abseil-cpp/absl/base:core_headers",
     "//third_party/abseil-cpp/absl/base:throw_delegate",
     "//third_party/abseil-cpp/absl/memory",
+    "//third_party/abseil-cpp/absl/meta:type_traits",
   ]
 }
 
diff --git a/third_party/abseil-cpp/absl/container/CMakeLists.txt b/third_party/abseil-cpp/absl/container/CMakeLists.txt
index 6c2931b..2521646 100644
--- a/third_party/abseil-cpp/absl/container/CMakeLists.txt
+++ b/third_party/abseil-cpp/absl/container/CMakeLists.txt
@@ -194,6 +194,7 @@
     absl::inlined_vector_internal
     absl::throw_delegate
     absl::memory
+    absl::type_traits
   PUBLIC
 )
 
diff --git a/third_party/abseil-cpp/absl/container/btree_benchmark.cc b/third_party/abseil-cpp/absl/container/btree_benchmark.cc
index 0ca497c..cc9a106 100644
--- a/third_party/abseil-cpp/absl/container/btree_benchmark.cc
+++ b/third_party/abseil-cpp/absl/container/btree_benchmark.cc
@@ -34,8 +34,8 @@
 #include "absl/container/flat_hash_map.h"
 #include "absl/container/flat_hash_set.h"
 #include "absl/container/internal/hashtable_debug.h"
-#include "absl/flags/flag.h"
 #include "absl/hash/hash.h"
+#include "absl/log/log.h"
 #include "absl/memory/memory.h"
 #include "absl/strings/cord.h"
 #include "absl/strings/str_format.h"
diff --git a/third_party/abseil-cpp/absl/container/inlined_vector.h b/third_party/abseil-cpp/absl/container/inlined_vector.h
index 60f1246..10b1896 100644
--- a/third_party/abseil-cpp/absl/container/inlined_vector.h
+++ b/third_party/abseil-cpp/absl/container/inlined_vector.h
@@ -52,6 +52,7 @@
 #include "absl/base/port.h"
 #include "absl/container/internal/inlined_vector.h"
 #include "absl/memory/memory.h"
+#include "absl/meta/type_traits.h"
 
 namespace absl {
 ABSL_NAMESPACE_BEGIN
@@ -77,6 +78,8 @@
   using MoveIterator = inlined_vector_internal::MoveIterator<TheA>;
   template <typename TheA>
   using IsMemcpyOk = inlined_vector_internal::IsMemcpyOk<TheA>;
+  template <typename TheA>
+  using IsMoveAssignOk = inlined_vector_internal::IsMoveAssignOk<TheA>;
 
   template <typename TheA, typename Iterator>
   using IteratorValueAdapter =
@@ -94,6 +97,15 @@
   using DisableIfAtLeastForwardIterator = absl::enable_if_t<
       !inlined_vector_internal::IsAtLeastForwardIterator<Iterator>::value, int>;
 
+  struct MemcpyPolicy {};
+  struct ElementwiseAssignPolicy {};
+  struct ElementwiseConstructPolicy {};
+
+  using MoveAssignmentPolicy = absl::conditional_t<
+      IsMemcpyOk<A>::value, MemcpyPolicy,
+      absl::conditional_t<IsMoveAssignOk<A>::value, ElementwiseAssignPolicy,
+                          ElementwiseConstructPolicy>>;
+
  public:
   using allocator_type = A;
   using value_type = inlined_vector_internal::ValueType<A>;
@@ -486,18 +498,7 @@
   // unspecified state.
   InlinedVector& operator=(InlinedVector&& other) {
     if (ABSL_PREDICT_TRUE(this != std::addressof(other))) {
-      if (IsMemcpyOk<A>::value || other.storage_.GetIsAllocated()) {
-        inlined_vector_internal::DestroyAdapter<A>::DestroyElements(
-            storage_.GetAllocator(), data(), size());
-        storage_.DeallocateIfAllocated();
-        storage_.MemcpyFrom(other.storage_);
-
-        other.storage_.SetInlinedSize(0);
-      } else {
-        storage_.Assign(IteratorValueAdapter<A, MoveIterator<A>>(
-                            MoveIterator<A>(other.storage_.GetInlinedData())),
-                        other.size());
-      }
+      MoveAssignment(MoveAssignmentPolicy{}, std::move(other));
     }
 
     return *this;
@@ -773,6 +774,42 @@
   template <typename H, typename TheT, size_t TheN, typename TheA>
   friend H AbslHashValue(H h, const absl::InlinedVector<TheT, TheN, TheA>& a);
 
+  void MoveAssignment(MemcpyPolicy, InlinedVector&& other) {
+    inlined_vector_internal::DestroyAdapter<A>::DestroyElements(
+        storage_.GetAllocator(), data(), size());
+    storage_.DeallocateIfAllocated();
+    storage_.MemcpyFrom(other.storage_);
+
+    other.storage_.SetInlinedSize(0);
+  }
+
+  void MoveAssignment(ElementwiseAssignPolicy, InlinedVector&& other) {
+    if (other.storage_.GetIsAllocated()) {
+      MoveAssignment(MemcpyPolicy{}, std::move(other));
+    } else {
+      storage_.Assign(IteratorValueAdapter<A, MoveIterator<A>>(
+                          MoveIterator<A>(other.storage_.GetInlinedData())),
+                      other.size());
+    }
+  }
+
+  void MoveAssignment(ElementwiseConstructPolicy, InlinedVector&& other) {
+    if (other.storage_.GetIsAllocated()) {
+      MoveAssignment(MemcpyPolicy{}, std::move(other));
+    } else {
+      inlined_vector_internal::DestroyAdapter<A>::DestroyElements(
+          storage_.GetAllocator(), data(), size());
+      storage_.DeallocateIfAllocated();
+
+      IteratorValueAdapter<A, MoveIterator<A>> other_values(
+          MoveIterator<A>(other.storage_.GetInlinedData()));
+      inlined_vector_internal::ConstructElements<A>(
+          storage_.GetAllocator(), storage_.GetInlinedData(), other_values,
+          other.storage_.GetSize());
+      storage_.SetInlinedSize(other.storage_.GetSize());
+    }
+  }
+
   Storage storage_;
 };
 
diff --git a/third_party/abseil-cpp/absl/container/inlined_vector_test.cc b/third_party/abseil-cpp/absl/container/inlined_vector_test.cc
index b872eb4..65ddbab6 100644
--- a/third_party/abseil-cpp/absl/container/inlined_vector_test.cc
+++ b/third_party/abseil-cpp/absl/container/inlined_vector_test.cc
@@ -16,12 +16,14 @@
 
 #include <algorithm>
 #include <forward_list>
+#include <iterator>
 #include <list>
 #include <memory>
 #include <scoped_allocator>
 #include <sstream>
 #include <stdexcept>
 #include <string>
+#include <utility>
 #include <vector>
 
 #include "gmock/gmock.h"
@@ -49,6 +51,7 @@
 using testing::ElementsAreArray;
 using testing::Eq;
 using testing::Gt;
+using testing::Pointwise;
 using testing::PrintToString;
 
 using IntVec = absl::InlinedVector<int, 8>;
@@ -1824,4 +1827,112 @@
   EXPECT_TRUE(absl::VerifyTypeImplementsAbslHashCorrectly(cases));
 }
 
+class MoveConstructibleOnlyInstance
+    : public absl::test_internal::BaseCountedInstance {
+ public:
+  explicit MoveConstructibleOnlyInstance(int x) : BaseCountedInstance(x) {}
+  MoveConstructibleOnlyInstance(MoveConstructibleOnlyInstance&& other) =
+      default;
+  MoveConstructibleOnlyInstance& operator=(
+      MoveConstructibleOnlyInstance&& other) = delete;
+};
+
+MATCHER(HasValue, "") {
+  return ::testing::get<0>(arg).value() == ::testing::get<1>(arg);
+}
+
+TEST(MoveAssignment, NonAssignable) {
+  using X = MoveConstructibleOnlyInstance;
+  {
+    InstanceTracker tracker;
+    absl::InlinedVector<X, 2> inlined;
+    inlined.emplace_back(1);
+    absl::InlinedVector<X, 2> allocated;
+    allocated.emplace_back(1);
+    allocated.emplace_back(2);
+    allocated.emplace_back(3);
+    tracker.ResetCopiesMovesSwaps();
+
+    inlined = std::move(allocated);
+    // passed ownership of the allocated storage
+    EXPECT_EQ(tracker.moves(), 0);
+    EXPECT_EQ(tracker.live_instances(), 3);
+
+    EXPECT_THAT(inlined, Pointwise(HasValue(), {1, 2, 3}));
+  }
+
+  {
+    InstanceTracker tracker;
+    absl::InlinedVector<X, 2> inlined;
+    inlined.emplace_back(1);
+    absl::InlinedVector<X, 2> allocated;
+    allocated.emplace_back(1);
+    allocated.emplace_back(2);
+    allocated.emplace_back(3);
+    tracker.ResetCopiesMovesSwaps();
+
+    allocated = std::move(inlined);
+    // Moved elements
+    EXPECT_EQ(tracker.moves(), 1);
+    EXPECT_EQ(tracker.live_instances(), 1);
+
+    EXPECT_THAT(allocated, Pointwise(HasValue(), {1}));
+  }
+
+  {
+    InstanceTracker tracker;
+    absl::InlinedVector<X, 2> inlined_a;
+    inlined_a.emplace_back(1);
+    absl::InlinedVector<X, 2> inlined_b;
+    inlined_b.emplace_back(1);
+    tracker.ResetCopiesMovesSwaps();
+
+    inlined_a = std::move(inlined_b);
+    // Moved elements
+    EXPECT_EQ(tracker.moves(), 1);
+    EXPECT_EQ(tracker.live_instances(), 1);
+
+    EXPECT_THAT(inlined_a, Pointwise(HasValue(), {1}));
+  }
+
+  {
+    InstanceTracker tracker;
+    absl::InlinedVector<X, 2> allocated_a;
+    allocated_a.emplace_back(1);
+    allocated_a.emplace_back(2);
+    allocated_a.emplace_back(3);
+    absl::InlinedVector<X, 2> allocated_b;
+    allocated_b.emplace_back(4);
+    allocated_b.emplace_back(5);
+    allocated_b.emplace_back(6);
+    allocated_b.emplace_back(7);
+    tracker.ResetCopiesMovesSwaps();
+
+    allocated_a = std::move(allocated_b);
+    // passed ownership of the allocated storage
+    EXPECT_EQ(tracker.moves(), 0);
+    EXPECT_EQ(tracker.live_instances(), 4);
+
+    EXPECT_THAT(allocated_a, Pointwise(HasValue(), {4, 5, 6, 7}));
+  }
+
+  {
+    InstanceTracker tracker;
+    absl::InlinedVector<X, 2> v;
+    v.emplace_back(1);
+    v.emplace_back(2);
+    v.emplace_back(3);
+
+    tracker.ResetCopiesMovesSwaps();
+
+    // Obfuscated in order to pass -Wself-move.
+    v = std::move(*std::addressof(v));
+    // nothing happens
+    EXPECT_EQ(tracker.moves(), 0);
+    EXPECT_EQ(tracker.live_instances(), 3);
+
+    EXPECT_THAT(v, Pointwise(HasValue(), {1, 2, 3}));
+  }
+}
+
 }  // anonymous namespace
diff --git a/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h b/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h
index c99e68f4..0fd4866e 100644
--- a/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h
+++ b/third_party/abseil-cpp/absl/container/internal/common_policy_traits.h
@@ -93,11 +93,12 @@
                             slot_type* old_slot, char) {
 #if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606
     if (absl::is_trivially_relocatable<value_type>()) {
-      // TODO(b/247130232): remove cast after fixing class-memaccess warning.
+      // TODO(b/247130232,b/251814870): remove casts after fixing warnings.
       std::memcpy(static_cast<void*>(
                       std::launder(const_cast<std::remove_const_t<value_type>*>(
                           &element(new_slot)))),
-                  &element(old_slot), sizeof(value_type));
+                  static_cast<const void*>(&element(old_slot)),
+                  sizeof(value_type));
       return;
     }
 #endif
diff --git a/third_party/abseil-cpp/absl/container/internal/container_memory.h b/third_party/abseil-cpp/absl/container/internal/container_memory.h
index c29c533b..bfa4ff93 100644
--- a/third_party/abseil-cpp/absl/container/internal/container_memory.h
+++ b/third_party/abseil-cpp/absl/container/internal/container_memory.h
@@ -428,9 +428,10 @@
     emplace(new_slot);
 #if defined(__cpp_lib_launder) && __cpp_lib_launder >= 201606
     if (absl::is_trivially_relocatable<value_type>()) {
-      // TODO(b/247130232): remove cast after fixing class-memaccess warning.
+      // TODO(b/247130232,b/251814870): remove casts after fixing warnings.
       std::memcpy(static_cast<void*>(std::launder(&new_slot->value)),
-                  &old_slot->value, sizeof(value_type));
+                  static_cast<const void*>(&old_slot->value),
+                  sizeof(value_type));
       return;
     }
 #endif
diff --git a/third_party/abseil-cpp/absl/container/internal/inlined_vector.h b/third_party/abseil-cpp/absl/container/internal/inlined_vector.h
index a56b7573..f623494 100644
--- a/third_party/abseil-cpp/absl/container/internal/inlined_vector.h
+++ b/third_party/abseil-cpp/absl/container/internal/inlined_vector.h
@@ -83,6 +83,9 @@
                       absl::is_trivially_copy_assignable<ValueType<A>>,
                       absl::is_trivially_destructible<ValueType<A>>>;
 
+template <typename A>
+using IsMoveAssignOk = std::is_move_assignable<ValueType<A>>;
+
 template <typename T>
 struct TypeIdentity {
   using type = T;
diff --git a/third_party/abseil-cpp/absl/functional/any_invocable.h b/third_party/abseil-cpp/absl/functional/any_invocable.h
index 040418d..3e783c8 100644
--- a/third_party/abseil-cpp/absl/functional/any_invocable.h
+++ b/third_party/abseil-cpp/absl/functional/any_invocable.h
@@ -148,6 +148,9 @@
 //     // rvalue-reference qualified.
 //     std::move(continuation)(result_of_foo);
 //   }
+//
+// Attempting to call `absl::AnyInvocable` multiple times in such a case
+// results in undefined behavior.
 template <class Sig>
 class AnyInvocable : private internal_any_invocable::Impl<Sig> {
  private:
diff --git a/third_party/abseil-cpp/absl/functional/any_invocable_test.cc b/third_party/abseil-cpp/absl/functional/any_invocable_test.cc
index dabaae9..1ed8540 100644
--- a/third_party/abseil-cpp/absl/functional/any_invocable_test.cc
+++ b/third_party/abseil-cpp/absl/functional/any_invocable_test.cc
@@ -16,6 +16,7 @@
 
 #include <cstddef>
 #include <initializer_list>
+#include <memory>
 #include <numeric>
 #include <type_traits>
 
@@ -1156,9 +1157,6 @@
 
   EXPECT_TRUE(static_cast<bool>(fun));
   EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
-
-  EXPECT_TRUE(static_cast<bool>(fun));
-  EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value);
 }
 
 TYPED_TEST_P(AnyInvTestMovable, ConversionConstructionVoidCovariance) {
@@ -1179,9 +1177,6 @@
 
   EXPECT_TRUE(static_cast<bool>(fun));
   EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
-
-  EXPECT_TRUE(static_cast<bool>(fun));
-  EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value);
 }
 
 TYPED_TEST_P(AnyInvTestMovable, ConversionAssignUserDefinedTypeNonemptyLhs) {
@@ -1193,9 +1188,6 @@
 
   EXPECT_TRUE(static_cast<bool>(fun));
   EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
-
-  EXPECT_TRUE(static_cast<bool>(fun));
-  EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value);
 }
 
 TYPED_TEST_P(AnyInvTestMovable, ConversionAssignVoidCovariance) {
@@ -1414,6 +1406,41 @@
       std::is_assignable<AnyInvType&, std::reference_wrapper<AddType>>::value));
 }
 
+TYPED_TEST_P(AnyInvTestRvalue, NonConstCrashesOnSecondCall) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+  using AddType = typename TypeParam::AddType;
+
+  AnyInvType fun(absl::in_place_type<AddType>, 5);
+
+  EXPECT_TRUE(static_cast<bool>(fun));
+  std::move(fun)(7, 8, 9);
+
+  // Ensure we're still valid
+  EXPECT_TRUE(static_cast<bool>(fun));  // NOLINT(bugprone-use-after-move)
+
+#if !defined(NDEBUG) || ABSL_OPTION_HARDENED == 1
+  EXPECT_DEATH_IF_SUPPORTED(std::move(fun)(7, 8, 9), "");
+#endif
+}
+
+// Ensure that any qualifiers (in particular &&-qualifiers) do not affect
+// when the destructor is actually run.
+TYPED_TEST_P(AnyInvTestRvalue, QualifierIndependentObjectLifetime) {
+  using AnyInvType = typename TypeParam::AnyInvType;
+
+  auto refs = std::make_shared<std::nullptr_t>();
+  {
+    AnyInvType fun([refs](auto&&...) noexcept { return 0; });
+    EXPECT_FALSE(refs.unique());
+
+    std::move(fun)(7, 8, 9);
+
+    // Ensure destructor hasn't run even if rref-qualified
+    EXPECT_FALSE(refs.unique());
+  }
+  EXPECT_TRUE(refs.unique());
+}
+
 // NOTE: This test suite originally attempted to enumerate all possible
 // combinations of type properties but the build-time started getting too large.
 // Instead, it is now assumed that certain parameters are orthogonal and so
@@ -1670,7 +1697,9 @@
 REGISTER_TYPED_TEST_SUITE_P(AnyInvTestRvalue,
                             ConversionConstructionReferenceWrapper,
                             NonMoveableResultType,
-                            ConversionAssignReferenceWrapper);
+                            ConversionAssignReferenceWrapper,
+                            NonConstCrashesOnSecondCall,
+                            QualifierIndependentObjectLifetime);
 
 INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallMayThrow, AnyInvTestRvalue,
                                TestParameterListRvalueQualifiersCallMayThrow);
diff --git a/third_party/abseil-cpp/absl/functional/internal/any_invocable.h b/third_party/abseil-cpp/absl/functional/internal/any_invocable.h
index 35b389d..8fce4bf6 100644
--- a/third_party/abseil-cpp/absl/functional/internal/any_invocable.h
+++ b/third_party/abseil-cpp/absl/functional/internal/any_invocable.h
@@ -809,11 +809,31 @@
         : Core(absl::in_place_type<absl::decay_t<T> inv_quals>,                \
                std::forward<Args>(args)...) {}                                 \
                                                                                \
+    InvokerType<noex, ReturnType, P...>* ExtractInvoker() cv {                 \
+      using QualifiedTestType = int cv ref;                                    \
+      auto* invoker = this->invoker_;                                          \
+      if (!std::is_const<QualifiedTestType>::value &&                          \
+          std::is_rvalue_reference<QualifiedTestType>::value) {                \
+        ABSL_HARDENING_ASSERT([this]() {                                       \
+          /* We checked that this isn't const above, so const_cast is safe */  \
+          const_cast<Impl*>(this)->invoker_ =                                  \
+              [](TypeErasedState*,                                             \
+                 ForwardedParameterType<P>...) noexcept(noex) -> ReturnType {  \
+            ABSL_HARDENING_ASSERT(false && "AnyInvocable use-after-move");     \
+            std::terminate();                                                  \
+          };                                                                   \
+          return this->HasValue();                                             \
+        }());                                                                  \
+      }                                                                        \
+      return invoker;                                                          \
+    }                                                                          \
+                                                                               \
     /*The actual invocation operation with the proper signature*/              \
     ReturnType operator()(P... args) cv ref noexcept(noex) {                   \
       assert(this->invoker_ != nullptr);                                       \
-      return this->invoker_(const_cast<TypeErasedState*>(&this->state_),       \
-                            static_cast<ForwardedParameterType<P>>(args)...);  \
+      return this->ExtractInvoker()(                                           \
+          const_cast<TypeErasedState*>(&this->state_),                         \
+          static_cast<ForwardedParameterType<P>>(args)...);                    \
     }                                                                          \
   }
 
diff --git a/third_party/abseil-cpp/absl/log/internal/conditions.cc b/third_party/abseil-cpp/absl/log/internal/conditions.cc
index 70f2ace..a9f4966 100644
--- a/third_party/abseil-cpp/absl/log/internal/conditions.cc
+++ b/third_party/abseil-cpp/absl/log/internal/conditions.cc
@@ -37,7 +37,7 @@
 }  // namespace
 
 bool LogEveryNState::ShouldLog(int n) {
-  return n != 0 && (LossyIncrement(&counter_) % n) == 0;
+  return n > 0 && (LossyIncrement(&counter_) % static_cast<uint32_t>(n)) == 0;
 }
 
 bool LogFirstNState::ShouldLog(int n) {
diff --git a/third_party/abseil-cpp/absl/log/internal/log_format.cc b/third_party/abseil-cpp/absl/log/internal/log_format.cc
index b10a656b..5d40d25 100644
--- a/third_party/abseil-cpp/absl/log/internal/log_format.cc
+++ b/third_party/abseil-cpp/absl/log/internal/log_format.cc
@@ -78,7 +78,7 @@
         absl::LogSeverityName(severity)[0], static_cast<int>(tv.tv_sec),
         static_cast<int>(tv.tv_usec), static_cast<int>(tid));
     if (snprintf_result >= 0) {
-      buf.remove_prefix(snprintf_result);
+      buf.remove_prefix(static_cast<size_t>(snprintf_result));
       return static_cast<size_t>(snprintf_result);
     }
     return 0;
@@ -87,26 +87,27 @@
   char* p = buf.data();
   *p++ = absl::LogSeverityName(severity)[0];
   const absl::TimeZone::CivilInfo ci = tz->At(timestamp);
-  absl::numbers_internal::PutTwoDigits(ci.cs.month(), p);
+  absl::numbers_internal::PutTwoDigits(static_cast<size_t>(ci.cs.month()), p);
   p += 2;
-  absl::numbers_internal::PutTwoDigits(ci.cs.day(), p);
+  absl::numbers_internal::PutTwoDigits(static_cast<size_t>(ci.cs.day()), p);
   p += 2;
   *p++ = ' ';
-  absl::numbers_internal::PutTwoDigits(ci.cs.hour(), p);
+  absl::numbers_internal::PutTwoDigits(static_cast<size_t>(ci.cs.hour()), p);
   p += 2;
   *p++ = ':';
-  absl::numbers_internal::PutTwoDigits(ci.cs.minute(), p);
+  absl::numbers_internal::PutTwoDigits(static_cast<size_t>(ci.cs.minute()), p);
   p += 2;
   *p++ = ':';
-  absl::numbers_internal::PutTwoDigits(ci.cs.second(), p);
+  absl::numbers_internal::PutTwoDigits(static_cast<size_t>(ci.cs.second()), p);
   p += 2;
   *p++ = '.';
   const int64_t usecs = absl::ToInt64Microseconds(ci.subsecond);
-  absl::numbers_internal::PutTwoDigits(usecs / 10000, p);
+  absl::numbers_internal::PutTwoDigits(static_cast<size_t>(usecs / 10000), p);
   p += 2;
-  absl::numbers_internal::PutTwoDigits(usecs / 100 % 100, p);
+  absl::numbers_internal::PutTwoDigits(static_cast<size_t>(usecs / 100 % 100),
+                                       p);
   p += 2;
-  absl::numbers_internal::PutTwoDigits(usecs % 100, p);
+  absl::numbers_internal::PutTwoDigits(static_cast<size_t>(usecs % 100), p);
   p += 2;
   *p++ = ' ';
   constexpr bool unsigned_tid_t = !std::is_signed<log_internal::Tid>::value;
@@ -118,7 +119,7 @@
   if ((unsigned_tid_t || tid > -100000) && tid < 1000000) *p++ = ' ';
   p = absl::numbers_internal::FastIntToBuffer(tid, p);
   *p++ = ' ';
-  const size_t bytes_formatted = p - buf.data();
+  const size_t bytes_formatted = static_cast<size_t>(p - buf.data());
   buf.remove_prefix(bytes_formatted);
   return bytes_formatted;
 }
@@ -146,7 +147,7 @@
   p = absl::numbers_internal::FastIntToBuffer(line, p);
   *p++ = ']';
   *p++ = ' ';
-  const size_t bytes_formatted = p - buf.data();
+  const size_t bytes_formatted = static_cast<size_t>(p - buf.data());
   buf.remove_prefix(bytes_formatted);
   return bytes_formatted;
 }
diff --git a/third_party/abseil-cpp/absl/log/internal/log_message.cc b/third_party/abseil-cpp/absl/log/internal/log_message.cc
index 9ef0c29e..82833af0 100644
--- a/third_party/abseil-cpp/absl/log/internal/log_message.cc
+++ b/third_party/abseil-cpp/absl/log/internal/log_message.cc
@@ -118,20 +118,23 @@
     // If no data were ever streamed in, this is where we must write the prefix.
     if (pbase() == nullptr) Initialize();
     // Here we reclaim the two bytes we reserved.
-    size_t idx = pptr() - pbase();
+    ptrdiff_t idx = pptr() - pbase();
     setp(buf_.data(), buf_.data() + buf_.size());
-    pbump(idx);
+    pbump(static_cast<int>(idx));
     sputc('\n');
     sputc('\0');
     finalized_ = true;
-    return absl::Span<const char>(pbase(), pptr() - pbase());
+    return absl::Span<const char>(pbase(),
+                                  static_cast<size_t>(pptr() - pbase()));
   }
   size_t prefix_len() const { return prefix_len_; }
 
  protected:
   std::streamsize xsputn(const char* s, std::streamsize n) override {
+    if (n < 0) return 0;
     if (pbase() == nullptr) Initialize();
-    return Append(absl::string_view(s, n));
+    return static_cast<std::streamsize>(
+        Append(absl::string_view(s, static_cast<size_t>(n))));
   }
 
   int overflow(int ch = EOF) override {
@@ -154,14 +157,14 @@
       prefix_len_ = log_internal::FormatLogPrefix(
           entry_.log_severity(), entry_.timestamp(), entry_.tid(),
           entry_.source_basename(), entry_.source_line(), remaining);
-      pbump(prefix_len_);
+      pbump(static_cast<int>(prefix_len_));
     }
   }
 
   size_t Append(absl::string_view data) {
-    absl::Span<char> remaining(pptr(), epptr() - pptr());
+    absl::Span<char> remaining(pptr(), static_cast<size_t>(epptr() - pptr()));
     const size_t written = AppendTruncated(data, &remaining);
-    pbump(written);
+    pbump(static_cast<int>(written));
     return written;
   }
 
diff --git a/third_party/abseil-cpp/absl/log/log_entry.h b/third_party/abseil-cpp/absl/log/log_entry.h
index d90961f..30114c3 100644
--- a/third_party/abseil-cpp/absl/log/log_entry.h
+++ b/third_party/abseil-cpp/absl/log/log_entry.h
@@ -58,8 +58,10 @@
   static constexpr int kNoVerbosityLevel = -1;
   static constexpr int kNoVerboseLevel = -1;  // TO BE removed
 
-  LogEntry(const LogEntry&) = default;
-  LogEntry& operator=(const LogEntry&) = default;
+  // Pass `LogEntry` by reference, and do not store it as its state does not
+  // outlive the call to `LogSink::Send()`.
+  LogEntry(const LogEntry&) = delete;
+  LogEntry& operator=(const LogEntry&) = delete;
 
   // Source file and line where the log message occurred.  Taken from `__FILE__`
   // and `__LINE__` unless overridden by `LOG(...).AtLocation(...)`.
diff --git a/third_party/abseil-cpp/absl/log/log_entry_test.cc b/third_party/abseil-cpp/absl/log/log_entry_test.cc
index b19794e..8d0afb3c 100644
--- a/third_party/abseil-cpp/absl/log/log_entry_test.cc
+++ b/third_party/abseil-cpp/absl/log/log_entry_test.cc
@@ -101,13 +101,14 @@
                   entry_.source_basename(), entry_.source_line(), view)
             : 0;
 
-    EXPECT_THAT(entry_.prefix_len_, Eq(view.data() - buf_.data()));
+    EXPECT_THAT(entry_.prefix_len_,
+                Eq(static_cast<size_t>(view.data() - buf_.data())));
     AppendTruncated(text_message, view);
     view = absl::Span<char>(view.data(), view.size() + 2);
     view[0] = '\n';
     view[1] = '\0';
     view.remove_prefix(2);
-    buf_.resize(view.data() - buf_.data());
+    buf_.resize(static_cast<size_t>(view.data() - buf_.data()));
     entry_.text_message_with_prefix_and_newline_and_nul_ = absl::MakeSpan(buf_);
   }
   LogEntryTestPeer(const LogEntryTestPeer&) = delete;
@@ -124,7 +125,7 @@
     const size_t prefix_size = log_internal::FormatLogPrefix(
         entry_.log_severity(), entry_.timestamp(), entry_.tid(),
         entry_.source_basename(), entry_.source_line(), buf);
-    EXPECT_THAT(prefix_size, Eq(buf.data() - str.data()));
+    EXPECT_THAT(prefix_size, Eq(static_cast<size_t>(buf.data() - str.data())));
     str.resize(prefix_size);
     return str;
   }
diff --git a/third_party/abseil-cpp/absl/log/log_format_test.cc b/third_party/abseil-cpp/absl/log/log_format_test.cc
index 3fdb358..c629fce 100644
--- a/third_party/abseil-cpp/absl/log/log_format_test.cc
+++ b/third_party/abseil-cpp/absl/log/log_format_test.cc
@@ -108,7 +108,7 @@
 TYPED_TEST(CharLogFormatTest, Unprintable) {
   absl::ScopedMockLog test_sink(absl::MockLogDefault::kDisallowUnexpected);
 
-  const TypeParam value = 0xeeu;
+  constexpr auto value = static_cast<TypeParam>(0xeeu);
   auto comparison_stream = ComparisonStream();
   comparison_stream << value;
 
diff --git a/third_party/abseil-cpp/absl/strings/BUILD.bazel b/third_party/abseil-cpp/absl/strings/BUILD.bazel
index 5a40887..5b12c01 100644
--- a/third_party/abseil-cpp/absl/strings/BUILD.bazel
+++ b/third_party/abseil-cpp/absl/strings/BUILD.bazel
@@ -963,8 +963,8 @@
     copts = ABSL_TEST_COPTS,
     visibility = ["//visibility:private"],
     deps = [
+        ":str_format",
         ":strings",
-        "//absl/base:core_headers",
         "@com_google_googletest//:gtest_main",
     ],
 )
@@ -1164,7 +1164,6 @@
         ":cord",
         ":str_format",
         ":strings",
-        "//absl/base:core_headers",
         "@com_google_googletest//:gtest_main",
     ],
 )
diff --git a/third_party/abseil-cpp/absl/strings/CMakeLists.txt b/third_party/abseil-cpp/absl/strings/CMakeLists.txt
index e1c2093..01f86184 100644
--- a/third_party/abseil-cpp/absl/strings/CMakeLists.txt
+++ b/third_party/abseil-cpp/absl/strings/CMakeLists.txt
@@ -281,6 +281,7 @@
     ${ABSL_TEST_COPTS}
   DEPS
     absl::strings
+    absl::str_format
     absl::core_headers
     GTest::gmock_main
 )
diff --git a/third_party/abseil-cpp/absl/strings/charconv.cc b/third_party/abseil-cpp/absl/strings/charconv.cc
index 9b4bc5e..c08623c 100644
--- a/third_party/abseil-cpp/absl/strings/charconv.cc
+++ b/third_party/abseil-cpp/absl/strings/charconv.cc
@@ -339,14 +339,19 @@
 bool HandleEdgeCase(const strings_internal::ParsedFloat& input, bool negative,
                     FloatType* value) {
   if (input.type == strings_internal::FloatType::kNan) {
-    // A bug in both clang and gcc would cause the compiler to optimize away the
-    // buffer we are building below.  Declaring the buffer volatile avoids the
-    // issue, and has no measurable performance impact in microbenchmarks.
+    // A bug in both clang < 7 and gcc would cause the compiler to optimize
+    // away the buffer we are building below.  Declaring the buffer volatile
+    // avoids the issue, and has no measurable performance impact in
+    // microbenchmarks.
     //
     // https://bugs.llvm.org/show_bug.cgi?id=37778
     // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86113
     constexpr ptrdiff_t kNanBufferSize = 128;
+#if defined(__GNUC__) || (defined(__clang__) && __clang_major__ < 7)
     volatile char n_char_sequence[kNanBufferSize];
+#else
+    char n_char_sequence[kNanBufferSize];
+#endif
     if (input.subrange_begin == nullptr) {
       n_char_sequence[0] = '\0';
     } else {
diff --git a/third_party/abseil-cpp/absl/strings/internal/cord_internal.h b/third_party/abseil-cpp/absl/strings/internal/cord_internal.h
index f32fd41..eca747c8 100644
--- a/third_party/abseil-cpp/absl/strings/internal/cord_internal.h
+++ b/third_party/abseil-cpp/absl/strings/internal/cord_internal.h
@@ -423,8 +423,8 @@
   return pos < data.size() ? data[pos] : '\0';
 }
 
-// We store cordz_info as 64 bit pointer value in big endian format. This
-// guarantees that the least significant byte of cordz_info matches the last
+// We store cordz_info as 64 bit pointer value in little endian format. This
+// guarantees that the least significant byte of cordz_info matches the first
 // byte of the inline data representation in as_chars_, which holds the inlined
 // size or the 'is_tree' bit.
 using cordz_info_t = int64_t;
@@ -434,14 +434,14 @@
 static_assert(sizeof(cordz_info_t) * 2 == kMaxInline + 1, "");
 static_assert(sizeof(cordz_info_t) >= sizeof(intptr_t), "");
 
-// BigEndianByte() creates a big endian representation of 'value', i.e.: a big
-// endian value where the last byte in the host's representation holds 'value`,
-// with all other bytes being 0.
-static constexpr cordz_info_t BigEndianByte(unsigned char value) {
+// LittleEndianByte() creates a little endian representation of 'value', i.e.:
+// a little endian value where the first byte in the host's representation
+// holds 'value`, with all other bytes being 0.
+static constexpr cordz_info_t LittleEndianByte(unsigned char value) {
 #if defined(ABSL_IS_BIG_ENDIAN)
-  return value;
-#else
   return static_cast<cordz_info_t>(value) << ((sizeof(cordz_info_t) - 1) * 8);
+#else
+  return value;
 #endif
 }
 
@@ -450,25 +450,37 @@
   // DefaultInitType forces the use of the default initialization constructor.
   enum DefaultInitType { kDefaultInit };
 
-  // kNullCordzInfo holds the big endian representation of intptr_t(1)
+  // kNullCordzInfo holds the little endian representation of intptr_t(1)
   // This is the 'null' / initial value of 'cordz_info'. The null value
   // is specifically big endian 1 as with 64-bit pointers, the last
   // byte of cordz_info overlaps with the last byte holding the tag.
-  static constexpr cordz_info_t kNullCordzInfo = BigEndianByte(1);
+  static constexpr cordz_info_t kNullCordzInfo = LittleEndianByte(1);
+
+  // kTagOffset contains the offset of the control byte / tag. This constant is
+  // intended mostly for debugging purposes: do not remove this constant as it
+  // is actively inspected and used by gdb pretty printing code.
+  static constexpr size_t kTagOffset = 0;
 
   constexpr InlineData() : as_chars_{0} {}
   explicit InlineData(DefaultInitType) {}
   explicit constexpr InlineData(CordRep* rep) : as_tree_(rep) {}
   explicit constexpr InlineData(absl::string_view chars)
-      : as_chars_{
-            GetOrNull(chars, 0),  GetOrNull(chars, 1),
-            GetOrNull(chars, 2),  GetOrNull(chars, 3),
-            GetOrNull(chars, 4),  GetOrNull(chars, 5),
-            GetOrNull(chars, 6),  GetOrNull(chars, 7),
-            GetOrNull(chars, 8),  GetOrNull(chars, 9),
-            GetOrNull(chars, 10), GetOrNull(chars, 11),
-            GetOrNull(chars, 12), GetOrNull(chars, 13),
-            GetOrNull(chars, 14), static_cast<char>((chars.size() << 1))} {}
+      : as_chars_{static_cast<char>((chars.size() << 1)),
+                  GetOrNull(chars, 0),
+                  GetOrNull(chars, 1),
+                  GetOrNull(chars, 2),
+                  GetOrNull(chars, 3),
+                  GetOrNull(chars, 4),
+                  GetOrNull(chars, 5),
+                  GetOrNull(chars, 6),
+                  GetOrNull(chars, 7),
+                  GetOrNull(chars, 8),
+                  GetOrNull(chars, 9),
+                  GetOrNull(chars, 10),
+                  GetOrNull(chars, 11),
+                  GetOrNull(chars, 12),
+                  GetOrNull(chars, 13),
+                  GetOrNull(chars, 14)} {}
 
   // Returns true if the current instance is empty.
   // The 'empty value' is an inlined data value of zero length.
@@ -499,8 +511,8 @@
   // Requires the current instance to hold a tree value.
   CordzInfo* cordz_info() const {
     assert(is_tree());
-    intptr_t info = static_cast<intptr_t>(
-        absl::big_endian::ToHost64(static_cast<uint64_t>(as_tree_.cordz_info)));
+    intptr_t info = static_cast<intptr_t>(absl::little_endian::ToHost64(
+        static_cast<uint64_t>(as_tree_.cordz_info)));
     assert(info & 1);
     return reinterpret_cast<CordzInfo*>(info - 1);
   }
@@ -512,7 +524,7 @@
     assert(is_tree());
     uintptr_t info = reinterpret_cast<uintptr_t>(cordz_info) | 1;
     as_tree_.cordz_info =
-        static_cast<cordz_info_t>(absl::big_endian::FromHost64(info));
+        static_cast<cordz_info_t>(absl::little_endian::FromHost64(info));
   }
 
   // Resets the current cordz_info to null / empty.
@@ -525,7 +537,7 @@
   // Requires the current instance to hold inline data.
   const char* as_chars() const {
     assert(!is_tree());
-    return as_chars_;
+    return &as_chars_[1];
   }
 
   // Returns a mutable pointer to the character data inside this instance.
@@ -543,7 +555,7 @@
   //
   // It's an error to read from the returned pointer without a preceding write
   // if the current instance does not hold inline data, i.e.: is_tree() == true.
-  char* as_chars() { return as_chars_; }
+  char* as_chars() { return &as_chars_[1]; }
 
   // Returns the tree value of this value.
   // Requires the current instance to hold a tree value.
@@ -608,20 +620,13 @@
  private:
   // See cordz_info_t for forced alignment and size of `cordz_info` details.
   struct AsTree {
-    explicit constexpr AsTree(absl::cord_internal::CordRep* tree)
-        : rep(tree), cordz_info(kNullCordzInfo) {}
-    // This union uses up extra space so that whether rep is 32 or 64 bits,
-    // cordz_info will still start at the eighth byte, and the last
-    // byte of cordz_info will still be the last byte of InlineData.
-    union {
-      absl::cord_internal::CordRep* rep;
-      cordz_info_t unused_aligner;
-    };
-    cordz_info_t cordz_info;
+    explicit constexpr AsTree(absl::cord_internal::CordRep* tree) : rep(tree) {}
+    cordz_info_t cordz_info = kNullCordzInfo;
+    absl::cord_internal::CordRep* rep;
   };
 
-  char& tag() { return reinterpret_cast<char*>(this)[kMaxInline]; }
-  char tag() const { return reinterpret_cast<const char*>(this)[kMaxInline]; }
+  int8_t& tag() { return reinterpret_cast<int8_t*>(this)[0]; }
+  int8_t tag() const { return reinterpret_cast<const int8_t*>(this)[0]; }
 
   // If the data has length <= kMaxInline, we store it in `as_chars_`, and
   // store the size in the last char of `as_chars_` shifted left + 1.
diff --git a/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc b/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc
index f9bb661..13731ee 100644
--- a/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc
+++ b/third_party/abseil-cpp/absl/strings/internal/str_format/parser.cc
@@ -202,9 +202,7 @@
 
   auto tag = GetTagForChar(c);
 
-  if (*(pos - 1) == 'v' && *(pos - 2) != '%') {
-    return nullptr;
-  }
+  if (ABSL_PREDICT_FALSE(c == 'v' && (pos - original_pos) != 1)) return nullptr;
 
   if (ABSL_PREDICT_FALSE(!tag.is_conv())) {
     if (ABSL_PREDICT_FALSE(!tag.is_length())) return nullptr;
@@ -223,6 +221,8 @@
       conv->length_mod = length_mod;
     }
     tag = GetTagForChar(c);
+
+    if (ABSL_PREDICT_FALSE(c == 'v')) return nullptr;
     if (ABSL_PREDICT_FALSE(!tag.is_conv())) return nullptr;
   }
 
diff --git a/third_party/abseil-cpp/absl/strings/internal/str_format/parser_test.cc b/third_party/abseil-cpp/absl/strings/internal/str_format/parser_test.cc
index fe0d296..c3e825fe 100644
--- a/third_party/abseil-cpp/absl/strings/internal/str_format/parser_test.cc
+++ b/third_party/abseil-cpp/absl/strings/internal/str_format/parser_test.cc
@@ -110,10 +110,13 @@
     {__LINE__, "ba",   "",     "ba"},  // 'b' is invalid
     {__LINE__, "l",    "",     "l" },  // just length mod isn't okay
     {__LINE__, "d",    "d",    ""  },  // basic
+    {__LINE__, "v",    "v",    ""  },  // basic
     {__LINE__, "d ",   "d",    " " },  // leave suffix
     {__LINE__, "dd",   "d",    "d" },  // don't be greedy
     {__LINE__, "d9",   "d",    "9" },  // leave non-space suffix
     {__LINE__, "dzz",  "d",    "zz"},  // length mod as suffix
+    {__LINE__, "3v",   "",     "3v"},  // 'v' cannot have modifiers
+    {__LINE__, "hv",   "",     "hv"},  // 'v' cannot have modifiers
     {__LINE__, "1$*2$d", "1$*2$d", ""  },  // arg indexing and * allowed.
     {__LINE__, "0-14.3hhd", "0-14.3hhd", ""},  // precision, width
     {__LINE__, " 0-+#14.3hhd", " 0-+#14.3hhd", ""},  // flags
diff --git a/third_party/abseil-cpp/absl/strings/str_cat.h b/third_party/abseil-cpp/absl/strings/str_cat.h
index 05728ab..8a63be0d 100644
--- a/third_party/abseil-cpp/absl/strings/str_cat.h
+++ b/third_party/abseil-cpp/absl/strings/str_cat.h
@@ -77,6 +77,43 @@
   size_t size;
 };
 
+//------------------------------------------------------------------------------
+// StrCat Extension
+//------------------------------------------------------------------------------
+//
+// AbslStringify()
+//
+// A simple customization API for formatting user-defined types using
+// absl::StrCat(). The API relies on detecting an overload in the
+// user-defined type's namespace of a free (non-member) `AbslStringify()`
+// function as a friend definition with the following signature:
+//
+// template <typename Sink>
+// void AbslStringify(Sink& sink, const X& value);
+//
+// An `AbslStringify()` overload for a type should only be declared in the same
+// file and namespace as said type.
+//
+// Note that AbslStringify() also supports use with absl::StrFormat().
+//
+// Example:
+//
+// struct Point {
+//   // To add formatting support to `Point`, we simply need to add a free
+//   // (non-member) function `AbslStringify()`. This method specifies how
+//   // Point should be printed when absl::StrCat() is called on it. You can add
+//   // such a free function using a friend declaration within the body of the
+//   // class. The sink parameter is a templated type to avoid requiring
+//   // dependencies.
+//   template <typename Sink> friend void AbslStringify(Sink&
+//   sink, const Point& p) {
+//     absl::Format(&sink, "(%v, %v)", p.x, p.y);
+//   }
+//
+//   int x;
+//   int y;
+// };
+
 class StringifySink {
  public:
   void Append(size_t count, char ch);
@@ -85,6 +122,11 @@
 
   bool PutPaddedString(string_view v, int width, int precision, bool left);
 
+  // Support `absl::Format(&sink, format, args...)`.
+  friend void AbslFormatFlush(StringifySink* sink, absl::string_view v) {
+    sink->Append(v);
+  }
+
   template <typename T>
   friend string_view ExtractStringification(StringifySink& sink, const T& v);
 
diff --git a/third_party/abseil-cpp/absl/strings/str_cat_test.cc b/third_party/abseil-cpp/absl/strings/str_cat_test.cc
index 868b9bc..1b3b7ec 100644
--- a/third_party/abseil-cpp/absl/strings/str_cat_test.cc
+++ b/third_party/abseil-cpp/absl/strings/str_cat_test.cc
@@ -21,6 +21,7 @@
 #include <vector>
 
 #include "gtest/gtest.h"
+#include "absl/strings/str_format.h"
 #include "absl/strings/substitute.h"
 
 #ifdef __ANDROID__
@@ -632,4 +633,21 @@
   EXPECT_EQ(absl::StrCat("a ", p, " z"), "a (10, 20) z");
 }
 
+struct PointStringifyUsingFormat {
+  template <typename FormatSink>
+  friend void AbslStringify(FormatSink& sink,
+                            const PointStringifyUsingFormat& p) {
+    absl::Format(&sink, "(%g, %g)", p.x, p.y);
+  }
+
+  double x = 10.0;
+  double y = 20.0;
+};
+
+TEST(StrCat, AbslStringifyExampleUsingFormat) {
+  PointStringifyUsingFormat p;
+  EXPECT_EQ(absl::StrCat(p), "(10, 20)");
+  EXPECT_EQ(absl::StrCat("a ", p, " z"), "a (10, 20) z");
+}
+
 }  // namespace
diff --git a/third_party/abseil-cpp/absl/strings/str_format.h b/third_party/abseil-cpp/absl/strings/str_format.h
index e6537ea..43d8618 100644
--- a/third_party/abseil-cpp/absl/strings/str_format.h
+++ b/third_party/abseil-cpp/absl/strings/str_format.h
@@ -570,6 +570,41 @@
 // StrFormat Extensions
 //------------------------------------------------------------------------------
 //
+// AbslStringify()
+//
+// A simpler customization API for formatting user-defined types using
+// absl::StrFormat(). The API relies on detecting an overload in the
+// user-defined type's namespace of a free (non-member) `AbslStringify()`
+// function as a friend definition with the following signature:
+//
+// template <typename Sink>
+// void AbslStringify(Sink& sink, const X& value);
+//
+// An `AbslStringify()` overload for a type should only be declared in the same
+// file and namespace as said type.
+//
+// Note that unlike with AbslFormatConvert(), AbslStringify() does not allow
+// customization of allowed conversion characters. AbslStringify() uses `%v` as
+// the underlying conversion specififer. Additionally, AbslStringify() supports
+// use with absl::StrCat while AbslFormatConvert() does not.
+//
+// Example:
+//
+// struct Point {
+//   // To add formatting support to `Point`, we simply need to add a free
+//   // (non-member) function `AbslStringify()`. This method prints in the
+//   // request format using the underlying `%v` specifier. You can add such a
+//   // free function using a friend declaration within the body of the class.
+//   // The sink parameter is a templated type to avoid requiring dependencies.
+//   template <typename Sink>
+//   friend void AbslStringify(Sink& sink, const Point& p) {
+//     absl::Format(&sink, "(%v, %v)", p.x, p.y);
+//   }
+//
+//   int x;
+//   int y;
+// };
+//
 // AbslFormatConvert()
 //
 // The StrFormat library provides a customization API for formatting
@@ -616,9 +651,9 @@
 //   AbslFormatConvert(const Point& p, const absl::FormatConversionSpec& spec,
 //                     absl::FormatSink* s) {
 //     if (spec.conversion_char() == absl::FormatConversionChar::s) {
-//       s->Append(absl::StrCat("x=", p.x, " y=", p.y));
+//       absl::Format(s, "x=%vy=%v", p.x, p.y);
 //     } else {
-//       s->Append(absl::StrCat(p.x, ",", p.y));
+//       absl::Format(s, "%v,%v", p.x, p.y);
 //     }
 //     return {true};
 //   }
@@ -789,6 +824,11 @@
     return sink_->PutPaddedString(v, width, precision, left);
   }
 
+  // Support `absl::Format(&sink, format, args...)`.
+  friend void AbslFormatFlush(FormatSink* sink, absl::string_view v) {
+    sink->Append(v);
+  }
+
  private:
   friend str_format_internal::FormatSinkImpl;
   explicit FormatSink(str_format_internal::FormatSinkImpl* s) : sink_(s) {}
diff --git a/third_party/abseil-cpp/absl/strings/str_format_test.cc b/third_party/abseil-cpp/absl/strings/str_format_test.cc
index 0c4f10c8..62ed262 100644
--- a/third_party/abseil-cpp/absl/strings/str_format_test.cc
+++ b/third_party/abseil-cpp/absl/strings/str_format_test.cc
@@ -1118,6 +1118,23 @@
   PointStringify p;
   EXPECT_EQ(absl::StrFormat("a %v z", p), "a (10, 20) z");
 }
+
+struct PointStringifyUsingFormat {
+  template <typename FormatSink>
+  friend void AbslStringify(FormatSink& sink,
+                            const PointStringifyUsingFormat& p) {
+    absl::Format(&sink, "(%g, %g)", p.x, p.y);
+  }
+
+  double x = 10.0;
+  double y = 20.0;
+};
+
+TEST_F(FormatExtensionTest, AbslStringifyExampleUsingFormat) {
+  PointStringifyUsingFormat p;
+  EXPECT_EQ(absl::StrFormat("a %v z", p), "a (10, 20) z");
+}
+
 }  // namespace
 
 // Some codegen thunks that we can use to easily dump the generated assembly for
diff --git a/third_party/abseil-cpp/absl/synchronization/mutex.cc b/third_party/abseil-cpp/absl/synchronization/mutex.cc
index c0268b62..69103ed8 100644
--- a/third_party/abseil-cpp/absl/synchronization/mutex.cc
+++ b/third_party/abseil-cpp/absl/synchronization/mutex.cc
@@ -2342,22 +2342,26 @@
   }                            // end of for(;;)-loop
 
   if (wake_list != kPerThreadSynchNull) {
-    int64_t wait_cycles = 0;
+    int64_t total_wait_cycles = 0;
+    int64_t max_wait_cycles = 0;
     int64_t now = base_internal::CycleClock::Now();
     do {
-      // Sample lock contention events only if the waiter was trying to acquire
+      // Profile lock contention events only if the waiter was trying to acquire
       // the lock, not waiting on a condition variable or Condition.
       if (!wake_list->cond_waiter) {
-        wait_cycles += (now - wake_list->waitp->contention_start_cycles);
+        int64_t cycles_waited =
+            (now - wake_list->waitp->contention_start_cycles);
+        total_wait_cycles += cycles_waited;
+        if (max_wait_cycles == 0) max_wait_cycles = cycles_waited;
         wake_list->waitp->contention_start_cycles = now;
         wake_list->waitp->should_submit_contention_data = true;
       }
       wake_list = Wakeup(wake_list);              // wake waiters
     } while (wake_list != kPerThreadSynchNull);
-    if (wait_cycles > 0) {
-      mutex_tracer("slow release", this, wait_cycles);
+    if (total_wait_cycles > 0) {
+      mutex_tracer("slow release", this, total_wait_cycles);
       ABSL_TSAN_MUTEX_PRE_DIVERT(this, 0);
-      submit_profile_data(wait_cycles);
+      submit_profile_data(total_wait_cycles);
       ABSL_TSAN_MUTEX_POST_DIVERT(this, 0);
     }
   }
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/version b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/version
index 9caed31..13ad873 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/version
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/version
@@ -1 +1 @@
-2022d
+2022e
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Bahia_Banderas b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Bahia_Banderas
index cbe22a7..179937f 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Bahia_Banderas
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Bahia_Banderas
Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Chihuahua b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Chihuahua
index e1780a5..b331737 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Chihuahua
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Chihuahua
Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada
index 19ccd357..e8be26b1 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ensenada
Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Hermosillo b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Hermosillo
index 8283239e..5c92e296 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Hermosillo
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Hermosillo
Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Matamoros b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Matamoros
index 722751b..88cabcd1 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Matamoros
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Matamoros
Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mazatlan b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mazatlan
index 4c819fa..6b41102 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mazatlan
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mazatlan
Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mexico_City b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mexico_City
index ffcf8be..6542c9c5 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mexico_City
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Mexico_City
Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ojinaga b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ojinaga
index da0909c..2ee585c 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ojinaga
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Ojinaga
Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel
index 19ccd357..e8be26b1 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Santa_Isabel
Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana
index 19ccd357..e8be26b1 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/America/Tijuana
Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Amman b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Amman
index d97d308d..a3f9dff 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Amman
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Amman
Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Damascus b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Damascus
index 168ef9ba..bd1624d 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Damascus
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Asia/Damascus
Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte
index 19ccd357..e8be26b1 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaNorte
Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaSur b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaSur
index 4c819fa..6b41102 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaSur
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/BajaSur
Binary files differ
diff --git a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/General b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/General
index ffcf8be..6542c9c5 100644
--- a/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/General
+++ b/third_party/abseil-cpp/absl/time/internal/cctz/testdata/zoneinfo/Mexico/General
Binary files differ
diff --git a/third_party/abseil-cpp/symbols_arm64_dbg.def b/third_party/abseil-cpp/symbols_arm64_dbg.def
index f83e494..0ee8b8f 100644
--- a/third_party/abseil-cpp/symbols_arm64_dbg.def
+++ b/third_party/abseil-cpp/symbols_arm64_dbg.def
@@ -1845,7 +1845,6 @@
     ?FromChrono@absl@@YA?AVDuration@1@AEBV?$duration@_JV?$ratio@$00$0PECEA@@Cr@std@@@chrono@Cr@std@@@Z
     ?FromChrono@absl@@YA?AVTime@1@AEBV?$time_point@Vsystem_clock@chrono@Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@Cr@std@@@234@@chrono@Cr@std@@@Z
     ?FromCivil@absl@@YA?AVTime@1@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@VTimeZone@1@@Z
-    ?FromHost64@big_endian@absl@@YA_K_K@Z
     ?FromHost64@little_endian@absl@@YA_K_K@Z
     ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0DM@$00@Cr@std@@@Z
     ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0OBA@$00@Cr@std@@@Z
@@ -2418,7 +2417,7 @@
     ?ToDoubleSeconds@absl@@YANVDuration@1@@Z
     ?ToHost16@big_endian@absl@@YAGG@Z
     ?ToHost32@big_endian@absl@@YAII@Z
-    ?ToHost64@big_endian@absl@@YA_K_K@Z
+    ?ToHost64@little_endian@absl@@YA_K_K@Z
     ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$00@Cr@std@@@Z
     ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DLJKMKAA@@Cr@std@@@Z
     ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DOI@@Cr@std@@@Z
@@ -3446,8 +3445,8 @@
     ?substr@string_view@absl@@QEBA?AV12@_K0@Z
     ?substring@CordRep@cord_internal@absl@@QEAAPEAUCordRepSubstring@23@XZ
     ?substring@CordRep@cord_internal@absl@@QEBAPEBUCordRepSubstring@23@XZ
-    ?tag@InlineData@cord_internal@absl@@AEAAAEADXZ
-    ?tag@InlineData@cord_internal@absl@@AEBADXZ
+    ?tag@InlineData@cord_internal@absl@@AEAAAEACXZ
+    ?tag@InlineData@cord_internal@absl@@AEBACXZ
     ?tail@CordRepRing@cord_internal@absl@@QEBAIXZ
     ?thread_identity@PerThreadSynch@base_internal@absl@@QEAAPEAUThreadIdentity@23@XZ
     ?throw_bad_optional_access@optional_internal@absl@@YAXXZ
diff --git a/third_party/abseil-cpp/symbols_x64_dbg.def b/third_party/abseil-cpp/symbols_x64_dbg.def
index 5bc82f1..4781d91c 100644
--- a/third_party/abseil-cpp/symbols_x64_dbg.def
+++ b/third_party/abseil-cpp/symbols_x64_dbg.def
@@ -1848,7 +1848,7 @@
     ?FromChrono@absl@@YA?AVDuration@1@AEBV?$duration@_JV?$ratio@$00$0PECEA@@Cr@std@@@chrono@Cr@std@@@Z
     ?FromChrono@absl@@YA?AVTime@1@AEBV?$time_point@Vsystem_clock@chrono@Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@Cr@std@@@234@@chrono@Cr@std@@@Z
     ?FromCivil@absl@@YA?AVTime@1@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@VTimeZone@1@@Z
-    ?FromHost64@big_endian@absl@@YA_K_K@Z
+    ?FromHost64@little_endian@absl@@YA_K_K@Z
     ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0DM@$00@Cr@std@@@Z
     ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0OBA@$00@Cr@std@@@Z
     ?FromTM@absl@@YA?AVTime@1@AEBUtm@@VTimeZone@1@@Z
@@ -2419,7 +2419,7 @@
     ?ToDoubleSeconds@absl@@YANVDuration@1@@Z
     ?ToHost16@big_endian@absl@@YAGG@Z
     ?ToHost32@big_endian@absl@@YAII@Z
-    ?ToHost64@big_endian@absl@@YA_K_K@Z
+    ?ToHost64@little_endian@absl@@YA_K_K@Z
     ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$00@Cr@std@@@Z
     ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DLJKMKAA@@Cr@std@@@Z
     ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DOI@@Cr@std@@@Z
@@ -3447,8 +3447,8 @@
     ?substr@string_view@absl@@QEBA?AV12@_K0@Z
     ?substring@CordRep@cord_internal@absl@@QEAAPEAUCordRepSubstring@23@XZ
     ?substring@CordRep@cord_internal@absl@@QEBAPEBUCordRepSubstring@23@XZ
-    ?tag@InlineData@cord_internal@absl@@AEAAAEADXZ
-    ?tag@InlineData@cord_internal@absl@@AEBADXZ
+    ?tag@InlineData@cord_internal@absl@@AEAAAEACXZ
+    ?tag@InlineData@cord_internal@absl@@AEBACXZ
     ?tail@CordRepRing@cord_internal@absl@@QEBAIXZ
     ?thread_identity@PerThreadSynch@base_internal@absl@@QEAAPEAUThreadIdentity@23@XZ
     ?throw_bad_optional_access@optional_internal@absl@@YAXXZ
diff --git a/third_party/abseil-cpp/symbols_x86_dbg.def b/third_party/abseil-cpp/symbols_x86_dbg.def
index 5a1b2a1f3..a696507 100644
--- a/third_party/abseil-cpp/symbols_x86_dbg.def
+++ b/third_party/abseil-cpp/symbols_x86_dbg.def
@@ -1836,7 +1836,7 @@
     ?FromChrono@absl@@YA?AVDuration@1@ABV?$duration@_JV?$ratio@$00$0PECEA@@Cr@std@@@chrono@Cr@std@@@Z
     ?FromChrono@absl@@YA?AVTime@1@ABV?$time_point@Vsystem_clock@chrono@Cr@std@@V?$duration@_JV?$ratio@$00$0PECEA@@Cr@std@@@234@@chrono@Cr@std@@@Z
     ?FromCivil@absl@@YA?AVTime@1@V?$civil_time@Usecond_tag@time_internal@absl@@@detail@cctz@time_internal@1@VTimeZone@1@@Z
-    ?FromHost64@big_endian@absl@@YA_K_K@Z
+    ?FromHost64@little_endian@absl@@YA_K_K@Z
     ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0DM@$00@Cr@std@@@Z
     ?FromInt64@time_internal@absl@@YA?AVDuration@2@_JV?$ratio@$0OBA@$00@Cr@std@@@Z
     ?FromTM@absl@@YA?AVTime@1@ABUtm@@VTimeZone@1@@Z
@@ -2407,7 +2407,7 @@
     ?ToDoubleSeconds@absl@@YANVDuration@1@@Z
     ?ToHost16@big_endian@absl@@YAGG@Z
     ?ToHost32@big_endian@absl@@YAII@Z
-    ?ToHost64@big_endian@absl@@YA_K_K@Z
+    ?ToHost64@little_endian@absl@@YA_K_K@Z
     ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$00@Cr@std@@@Z
     ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DLJKMKAA@@Cr@std@@@Z
     ?ToInt64@time_internal@absl@@YA_JVDuration@2@V?$ratio@$00$0DOI@@Cr@std@@@Z
@@ -3435,8 +3435,8 @@
     ?substr@string_view@absl@@QBE?AV12@II@Z
     ?substring@CordRep@cord_internal@absl@@QAEPAUCordRepSubstring@23@XZ
     ?substring@CordRep@cord_internal@absl@@QBEPBUCordRepSubstring@23@XZ
-    ?tag@InlineData@cord_internal@absl@@AAEAADXZ
-    ?tag@InlineData@cord_internal@absl@@ABEDXZ
+    ?tag@InlineData@cord_internal@absl@@AAEAACXZ
+    ?tag@InlineData@cord_internal@absl@@ABECXZ
     ?tail@CordRepRing@cord_internal@absl@@QBEIXZ
     ?thread_identity@PerThreadSynch@base_internal@absl@@QAEPAUThreadIdentity@23@XZ
     ?throw_bad_optional_access@optional_internal@absl@@YAXXZ
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc
index ef2dad1..4bccf05 100644
--- a/third_party/blink/common/features.cc
+++ b/third_party/blink/common/features.cc
@@ -309,6 +309,10 @@
     kSharedStorageOriginStalenessThreshold = {
         &kSharedStorageAPI, "SharedStorageOriginStalenessThreshold",
         base::Days(30)};
+const base::FeatureParam<int>
+    kSharedStorageMaxAllowedFencedFrameDepthForSelectURL = {
+        &kSharedStorageAPI,
+        "SharedStorageMaxAllowedFencedFrameDepthForSelectURL", 1};
 
 BASE_FEATURE(kSameSiteCrossOriginForSpeculationRulesPrerender,
              "SameSiteCrossOriginForSpeculationRulesPrerender",
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h
index ea308ef..478cf8b 100644
--- a/third_party/blink/public/common/features.h
+++ b/third_party/blink/public/common/features.h
@@ -142,6 +142,13 @@
 // origin's data is older than this threshold, it will be auto-purged.
 BLINK_COMMON_EXPORT extern const base::FeatureParam<base::TimeDelta>
     kSharedStorageOriginStalenessThreshold;
+// Maximum depth of fenced frame where sharedStorage.selectURL() is allowed to
+// be invoked. The depth of a fenced frame is the number of the fenced frame
+// boundaries above that frame (i.e. the outermost main frame's frame tree has
+// fenced frame depth 0, a topmost fenced frame tree embedded in the outermost
+// main frame has fenced frame depth 1, etc).
+BLINK_COMMON_EXPORT extern const base::FeatureParam<int>
+    kSharedStorageMaxAllowedFencedFrameDepthForSelectURL;
 
 // Enables the multiple prerendering in a sequential way:
 // https://crbug.com/1355151
diff --git a/third_party/blink/public/mojom/shared_storage/shared_storage.mojom b/third_party/blink/public/mojom/shared_storage/shared_storage.mojom
index c8688194..2654209 100644
--- a/third_party/blink/public/mojom/shared_storage/shared_storage.mojom
+++ b/third_party/blink/public/mojom/shared_storage/shared_storage.mojom
@@ -59,11 +59,10 @@
 
   // Handle sharedStorage.runURLSelectionOperation(): run the operation
   // previously registered by registerURLSelectionOperation() with matching
-  // `name`. Restrictions be checked at the renderer and be enforced at the
-  // browser: 1) This is not allowed in fenced frame. 2) The length of the
-  // `urls` array is below the configured limit number
-  // `kSharedStorageURLSelectionOperationInputURLSizeLimit`. `serialized_data`
-  // is the serialization result of JavaScript value
+  // `name`. Restrictions will be checked at the renderer and enforced at the
+  // browser: the length of the `urls` array is below the configured limit
+  // number `kSharedStorageURLSelectionOperationInputURLSizeLimit`.
+  // `serialized_data` is the serialization result of JavaScript value
   // SharedStorageRunOperationMethodOptions.data using v8::ValueSerializer.
   // There's no need to sanitize `serialized_data` at the browser process as the
   // data will be only consumed in an environment (i.e. the worklet) in control
diff --git a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
index c1282af8..90f898e 100644
--- a/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
+++ b/third_party/blink/renderer/core/css/properties/css_parsing_utils.cc
@@ -4612,9 +4612,10 @@
     if (token.Id() >= CSSValueID::kNormal && token.Id() <= CSSValueID::kLighter)
       return ConsumeIdent(range);
   } else {
-    if (RuntimeEnabledFeatures::CSSFontFaceAutoVariableRangeEnabled() &&
-        (token.Id() == CSSValueID::kAuto || token.Id() == CSSValueID::kNormal ||
-         token.Id() == CSSValueID::kBold))
+    if ((token.Id() == CSSValueID::kNormal ||
+         token.Id() == CSSValueID::kBold) ||
+        (RuntimeEnabledFeatures::CSSFontFaceAutoVariableRangeEnabled() &&
+         token.Id() == CSSValueID::kAuto))
       return ConsumeIdent(range);
   }
 
diff --git a/third_party/blink/renderer/core/html/media/html_media_element.cc b/third_party/blink/renderer/core/html/media/html_media_element.cc
index 1fd2304..67bc27b3 100644
--- a/third_party/blink/renderer/core/html/media/html_media_element.cc
+++ b/third_party/blink/renderer/core/html/media/html_media_element.cc
@@ -3949,10 +3949,14 @@
   if (state == mojom::FrameLifecycleState::kFrozenAutoResumeMedia && playing_) {
     paused_by_context_paused_ = true;
     pause();
-    GetWebMediaPlayer()->OnFrozen();
+    if (auto* web_player = GetWebMediaPlayer()) {
+      web_player->OnFrozen();
+    }
   } else if (state == mojom::FrameLifecycleState::kFrozen && playing_) {
     pause();
-    GetWebMediaPlayer()->OnFrozen();
+    if (auto* web_player = GetWebMediaPlayer()) {
+      web_player->OnFrozen();
+    }
   } else if (state == mojom::FrameLifecycleState::kRunning &&
              paused_by_context_paused_) {
     paused_by_context_paused_ = false;
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc
index 13e3e2e7..420886e 100644
--- a/third_party/blink/renderer/core/layout/layout_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -271,10 +271,10 @@
 struct SameSizeAsLayoutObject : public GarbageCollected<SameSizeAsLayoutObject>,
                                 ImageResourceObserver,
                                 DisplayItemClient {
-  // Normally this field uses the gap between DisplayItemClient and
-  // LayoutObject's other fields.
-  uint8_t paint_invalidation_reason_;
-  uint8_t extra_bitfields_;
+  // Normally these additional bitfields can use the gap between
+  // DisplayItemClient and bitfields_.
+  uint8_t additional_bitfields_;
+  uint16_t additional_bitfields2_;
 #if DCHECK_IS_ON()
   unsigned debug_bitfields_;
 #endif
@@ -382,9 +382,15 @@
 }
 
 LayoutObject::LayoutObject(Node* node)
-    : full_paint_invalidation_reason_(PaintInvalidationReason::kNone),
-      can_contain_absolute_position_objects_(false),
-      may_have_anchor_query_(false),
+    : full_paint_invalidation_reason_(
+          static_cast<unsigned>(PaintInvalidationReason::kNone)),
+      positioned_state_(kIsStaticallyPositioned),
+      selection_state_(static_cast<unsigned>(SelectionState::kNone)),
+      selection_state_for_paint_(static_cast<unsigned>(SelectionState::kNone)),
+      subtree_paint_property_update_reasons_(
+          static_cast<unsigned>(SubtreePaintPropertyUpdateReason::kNone)),
+      background_paint_location_(kBackgroundPaintInBorderBoxSpace),
+      overflow_clip_axes_(kNoOverflowClip),
 #if DCHECK_IS_ON()
       has_ax_object_(false),
       set_needs_layout_forbidden_(false),
@@ -4535,7 +4541,8 @@
     reason = DocumentLifecycleBasedPaintInvalidationReason(
         GetDocument().Lifecycle());
   }
-  full_paint_invalidation_reason_ = reason;
+  full_paint_invalidation_reason_ = static_cast<unsigned>(reason);
+  DCHECK_EQ(reason, FullPaintInvalidationReason());
   bitfields_.SetShouldDelayFullPaintInvalidation(false);
 }
 
@@ -4594,7 +4601,7 @@
 void LayoutObject::SetShouldDelayFullPaintInvalidation() {
   NOT_DESTROYED();
   // Should have already set a full paint invalidation reason.
-  DCHECK(IsFullPaintInvalidationReason(full_paint_invalidation_reason_));
+  DCHECK(IsFullPaintInvalidationReason(FullPaintInvalidationReason()));
 
   bitfields_.SetShouldDelayFullPaintInvalidation(true);
   if (!ShouldCheckForPaintInvalidation()) {
@@ -4623,7 +4630,8 @@
   DCHECK(!ShouldCheckForPaintInvalidation() || PaintInvalidationStateIsDirty());
 #endif
   if (!ShouldDelayFullPaintInvalidation()) {
-    full_paint_invalidation_reason_ = PaintInvalidationReason::kNone;
+    full_paint_invalidation_reason_ =
+        static_cast<unsigned>(PaintInvalidationReason::kNone);
     bitfields_.SetBackgroundNeedsFullPaintInvalidation(false);
   }
   bitfields_.SetShouldCheckForPaintInvalidation(false);
@@ -4676,7 +4684,8 @@
     bitfields_.SetDescendantNeedsPaintPropertyUpdate(false);
     bitfields_.SetDescendantEffectiveAllowedTouchActionChanged(false);
     bitfields_.SetDescendantBlockingWheelEventHandlerChanged(false);
-    bitfields_.ResetSubtreePaintPropertyUpdateReasons();
+    subtree_paint_property_update_reasons_ =
+        static_cast<unsigned>(SubtreePaintPropertyUpdateReason::kNone);
   }
 }
 
@@ -4987,6 +4996,30 @@
   return false;
 }
 
+void LayoutObject::SetSVGDescendantMayHaveTransformRelatedAnimation() {
+  NOT_DESTROYED();
+  auto* object = this;
+  while (!object->IsSVGRoot()) {
+    DCHECK(object->IsSVGChild());
+    if (object->SVGDescendantMayHaveTransformRelatedAnimation())
+      break;
+    if (object->IsSVGHiddenContainer())
+      return;
+    object->bitfields_.SetSVGDescendantMayHaveTransformRelatedAnimation(true);
+    object = object->Parent();
+    if (!object)
+      return;
+  }
+  // If we have set SetSVGDescendantMayHaveTransformRelatedAnimation() for
+  // any object, set the enclosing layer needs repaint because some
+  // LayoutSVGContainer may paint differently by ignoring the cull rect.
+  // See SVGContainerPainter.
+  if (object != this) {
+    if (auto* layer = object->EnclosingLayer())
+      layer->SetNeedsRepaint();
+  }
+}
+
 bool IsMenuList(const LayoutObject* object) {
   if (!object)
     return false;
diff --git a/third_party/blink/renderer/core/layout/layout_object.h b/third_party/blink/renderer/core/layout/layout_object.h
index 3a77b9dd..5936685e 100644
--- a/third_party/blink/renderer/core/layout/layout_object.h
+++ b/third_party/blink/renderer/core/layout/layout_object.h
@@ -1201,11 +1201,11 @@
   // not have an |NGPhysicalAnchorQuery|.
   bool MayHaveAnchorQuery() const {
     NOT_DESTROYED();
-    return may_have_anchor_query_;
+    return bitfields_.MayHaveAnchorQuery();
   }
   void SetSelfMayHaveAnchorQuery() {
     NOT_DESTROYED();
-    may_have_anchor_query_ = true;
+    bitfields_.SetMayHaveAnchorQuery(true);
   }
   void MarkMayHaveAnchorQuery();
 
@@ -1512,20 +1512,21 @@
   // absolute or fixed positioning
   bool IsOutOfFlowPositioned() const {
     NOT_DESTROYED();
-    return bitfields_.IsOutOfFlowPositioned();
+    return positioned_state_ == kIsOutOfFlowPositioned;
   }
   // relative or sticky positioning
   bool IsInFlowPositioned() const {
     NOT_DESTROYED();
-    return bitfields_.IsInFlowPositioned();
+    return positioned_state_ == kIsRelativelyPositioned ||
+           positioned_state_ == kIsStickyPositioned;
   }
   bool IsRelPositioned() const {
     NOT_DESTROYED();
-    return bitfields_.IsRelPositioned();
+    return positioned_state_ == kIsRelativelyPositioned;
   }
   bool IsStickyPositioned() const {
     NOT_DESTROYED();
-    return bitfields_.IsStickyPositioned();
+    return positioned_state_ == kIsStickyPositioned;
   }
   bool IsFixedPositioned() const {
     NOT_DESTROYED();
@@ -1539,7 +1540,7 @@
   }
   bool IsPositioned() const {
     NOT_DESTROYED();
-    return bitfields_.IsPositioned();
+    return positioned_state_ != kIsStaticallyPositioned;
   }
 
   bool IsText() const {
@@ -2072,7 +2073,8 @@
            (position == EPosition::kFixed && CanContainFixedPositionObjects());
   }
 
-  // Returns true if style would make this object an absolute container.
+  // Returns true if style would make this object an absolute container. This
+  // value gets cached by bitfields_.can_contain_absolute_position_objects_.
   bool ComputeIsAbsoluteContainer(const ComputedStyle* style) const;
 
   // Returns true if style would make this object a fixed container.
@@ -2140,16 +2142,44 @@
 
   void InvalidateIntersectionObserverCachedRects();
 
+ private:
+  enum PositionedState {
+    kIsStaticallyPositioned = 0,
+    kIsRelativelyPositioned = 1,
+    kIsOutOfFlowPositioned = 2,
+    kIsStickyPositioned = 3,
+  };
+
+ public:
   void SetPositionState(EPosition position) {
     NOT_DESTROYED();
     DCHECK(
         (position != EPosition::kAbsolute && position != EPosition::kFixed) ||
         IsBox());
-    bitfields_.SetPositionedState(position);
+    // This maps FixedPosition and AbsolutePosition to
+    // IsOutOfFlowPositioned, saving one bit.
+    switch (position) {
+      case EPosition::kStatic:
+        positioned_state_ = kIsStaticallyPositioned;
+        break;
+      case EPosition::kRelative:
+        positioned_state_ = kIsRelativelyPositioned;
+        break;
+      case EPosition::kAbsolute:
+      case EPosition::kFixed:
+        positioned_state_ = kIsOutOfFlowPositioned;
+        break;
+      case EPosition::kSticky:
+        positioned_state_ = kIsStickyPositioned;
+        break;
+      default:
+        NOTREACHED();
+        break;
+    }
   }
   void ClearPositionedState() {
     NOT_DESTROYED();
-    bitfields_.ClearPositionedState();
+    positioned_state_ = kIsStaticallyPositioned;
   }
 
   void SetFloating(bool is_floating) {
@@ -2227,19 +2257,19 @@
   }
   void SetOverflowClipAxes(OverflowClipAxes axes) {
     NOT_DESTROYED();
-    bitfields_.SetOverflowClipAxes(axes);
+    overflow_clip_axes_ = axes;
   }
   OverflowClipAxes GetOverflowClipAxes() const {
     NOT_DESTROYED();
-    return bitfields_.GetOverflowClipAxes();
+    return static_cast<OverflowClipAxes>(overflow_clip_axes_);
   }
   bool ShouldClipOverflowAlongEitherAxis() const {
     NOT_DESTROYED();
-    return bitfields_.GetOverflowClipAxes() != kNoOverflowClip;
+    return GetOverflowClipAxes() != kNoOverflowClip;
   }
   bool ShouldClipOverflowAlongBothAxis() const {
     NOT_DESTROYED();
-    return bitfields_.GetOverflowClipAxes() == kOverflowClipBothAxis;
+    return GetOverflowClipAxes() == kOverflowClipBothAxis;
   }
   void SetHasLayer(bool has_layer) {
     NOT_DESTROYED();
@@ -2255,7 +2285,7 @@
   }
   void SetCanContainAbsolutePositionObjects(bool can_contain) {
     NOT_DESTROYED();
-    can_contain_absolute_position_objects_ = can_contain;
+    bitfields_.SetCanContainAbsolutePositionObjects(can_contain);
   }
   void SetCanContainFixedPositionObjects(bool can_contain_fixed_position) {
     NOT_DESTROYED();
@@ -2469,7 +2499,7 @@
 
   bool CanContainAbsolutePositionObjects() const {
     NOT_DESTROYED();
-    return can_contain_absolute_position_objects_;
+    return bitfields_.CanContainAbsolutePositionObjects();
   }
   bool CanContainFixedPositionObjects() const {
     NOT_DESTROYED();
@@ -2821,21 +2851,21 @@
   // enum declaration).
   SelectionState GetSelectionState() const {
     NOT_DESTROYED();
-    return bitfields_.GetSelectionState();
+    return static_cast<SelectionState>(selection_state_);
   }
   void SetSelectionState(SelectionState state) {
     NOT_DESTROYED();
-    bitfields_.SetSelectionState(state);
+    selection_state_ = static_cast<unsigned>(state);
   }
   bool CanUpdateSelectionOnRootLineBoxes() const;
 
   SelectionState GetSelectionStateForPaint() const {
     NOT_DESTROYED();
-    return bitfields_.GetSelectionStateForPaint();
+    return static_cast<SelectionState>(selection_state_for_paint_);
   }
   void SetSelectionStateForPaint(SelectionState state) {
     NOT_DESTROYED();
-    bitfields_.SetSelectionStateForPaint(state);
+    selection_state_for_paint_ = static_cast<unsigned>(state);
   }
 
   // A single rectangle that encompasses all of the selected objects within this
@@ -3079,13 +3109,14 @@
 
   PaintInvalidationReason FullPaintInvalidationReason() const {
     NOT_DESTROYED();
-    return full_paint_invalidation_reason_;
+    return static_cast<PaintInvalidationReason>(
+        full_paint_invalidation_reason_);
   }
   bool ShouldDoFullPaintInvalidation() const {
     NOT_DESTROYED();
     if (!ShouldDelayFullPaintInvalidation() &&
-        full_paint_invalidation_reason_ != PaintInvalidationReason::kNone) {
-      DCHECK(IsFullPaintInvalidationReason(full_paint_invalidation_reason_));
+        FullPaintInvalidationReason() != PaintInvalidationReason::kNone) {
+      DCHECK(IsFullPaintInvalidationReason(FullPaintInvalidationReason()));
       DCHECK(ShouldCheckForPaintInvalidation());
       return true;
     }
@@ -3424,12 +3455,14 @@
   void AddSubtreePaintPropertyUpdateReason(
       SubtreePaintPropertyUpdateReason reason) {
     NOT_DESTROYED();
-    bitfields_.AddSubtreePaintPropertyUpdateReason(reason);
+    DCHECK_LE(static_cast<unsigned>(reason),
+              1u << (kSubtreePaintPropertyUpdateReasonsBitfieldWidth - 1));
+    subtree_paint_property_update_reasons_ |= static_cast<unsigned>(reason);
     SetNeedsPaintPropertyUpdate();
   }
   unsigned SubtreePaintPropertyUpdateReasons() const {
     NOT_DESTROYED();
-    return bitfields_.SubtreePaintPropertyUpdateReasons();
+    return subtree_paint_property_update_reasons_;
   }
   bool DescendantNeedsPaintPropertyUpdate() const {
     NOT_DESTROYED();
@@ -3458,13 +3491,14 @@
 
   BackgroundPaintLocation GetBackgroundPaintLocation() const {
     NOT_DESTROYED();
-    return bitfields_.GetBackgroundPaintLocation();
+    return static_cast<BackgroundPaintLocation>(background_paint_location_);
   }
   void SetBackgroundPaintLocation(BackgroundPaintLocation location) {
     NOT_DESTROYED();
     if (GetBackgroundPaintLocation() != location) {
       SetBackgroundNeedsFullPaintInvalidation();
-      bitfields_.SetBackgroundPaintLocation(location);
+      background_paint_location_ = static_cast<unsigned>(location);
+      DCHECK_EQ(location, GetBackgroundPaintLocation());
     }
   }
 
@@ -3603,6 +3637,12 @@
     return bitfields_.TransformAffectsVectorEffect();
   }
 
+  bool SVGDescendantMayHaveTransformRelatedAnimation() const {
+    NOT_DESTROYED();
+    return bitfields_.SVGDescendantMayHaveTransformRelatedAnimation();
+  }
+  void SetSVGDescendantMayHaveTransformRelatedAnimation();
+
   bool ShouldSkipNextLayoutShiftTracking() const {
     NOT_DESTROYED();
     return bitfields_.ShouldSkipNextLayoutShiftTracking();
@@ -3853,6 +3893,12 @@
     bitfields_.SetTransformAffectsVectorEffect(b);
   }
 
+  void ClearSVGDescendantMayHaveTransformRelatedAnimation() {
+    NOT_DESTROYED();
+    DCHECK(IsSVGChild());
+    bitfields_.SetSVGDescendantMayHaveTransformRelatedAnimation(false);
+  }
+
   void SetMightTraversePhysicalFragments(bool b) {
     NOT_DESTROYED();
     bitfields_.SetMightTraversePhysicalFragments(b);
@@ -3925,23 +3971,37 @@
   void SetShouldDoFullPaintInvalidationWithoutGeometryChangeInternal(
       PaintInvalidationReason);
 
+  // Additional bitfields.
+  // These are not in LayoutObjectBitfields, to fill the gap between
+  // the inherited DisplayItemClient data fields and bitfields_.
+
   // This is set by Set[Subtree]ShouldDoFullPaintInvalidation, and cleared
   // during PrePaint in this object's InvalidatePaint(). It's different from
   // DisplayItemClient::GetPaintInvalidationReason() which is set during
   // PrePaint and cleared in PaintController::FinishCycle().
-  // It's defined as the first field so that it can use the memory gap between
-  // DisplayItemClient and LayoutObject's other fields.
-  PaintInvalidationReason full_paint_invalidation_reason_;
+  unsigned full_paint_invalidation_reason_ : 6;
 
-  // Additional bitfields.
-  // These are not in LayoutObjectBitfields to avoid to bump its size. These are
-  // unit8_t in order to pack it together with PaintInvalidationReason.
+  // This is the cached 'position' value of this object
+  // (see ComputedStyle::position).
+  unsigned positioned_state_ : 2;  // PositionedState
 
-  // This boolean is used to know if this LayoutObject is a container for
-  // absolute position descendants.
-  uint8_t can_contain_absolute_position_objects_ : 1;
-  // See comments for |MayHaveAnchorQuery()|.
-  uint8_t may_have_anchor_query_ : 1;
+  // `selection_state_` is direct mapping of the DOM selection into the
+  // respective LayoutObjects that `CanBeSelectionLeaf()`.
+  // `selection_state_for_paint_` is adjusted so that the state takes into
+  // account whether such a LayoutObject will be painted. If selection
+  // starts/ends in an object that is not painted, we won't be able to record
+  // the bounds for composited selection state that is pushed to cc.
+  unsigned selection_state_ : 3;            // SelectionState
+  unsigned selection_state_for_paint_ : 3;  // SelectionState
+
+  // Reasons for the full subtree invalidation.
+  unsigned subtree_paint_property_update_reasons_
+      : kSubtreePaintPropertyUpdateReasonsBitfieldWidth;
+
+  // For LayoutBox. It's updated during PrePaint.
+  unsigned background_paint_location_ : 2;  // BackgroundPaintLocation.
+
+  unsigned overflow_clip_axes_ : 2;
 
 #if DCHECK_IS_ON()
   unsigned has_ax_object_ : 1;
@@ -3960,13 +4020,6 @@
   class LayoutObjectBitfields {
     DISALLOW_NEW();
 
-    enum PositionedState {
-      kIsStaticallyPositioned = 0,
-      kIsRelativelyPositioned = 1,
-      kIsOutOfFlowPositioned = 2,
-      kIsStickyPositioned = 3,
-    };
-
    public:
     // LayoutObjectBitfields holds all the boolean values for LayoutObject.
     //
@@ -4023,6 +4076,7 @@
           has_non_visible_overflow_(false),
           has_transform_related_property_(false),
           has_reflection_(false),
+          can_contain_absolute_position_objects_(false),
           can_contain_fixed_position_objects_(false),
           has_counter_node_map_(false),
           ever_had_layout_(false),
@@ -4060,6 +4114,7 @@
           is_table_column_constraints_dirty_(false),
           is_grid_placement_dirty_(true),
           transform_affects_vector_effect_(false),
+          svg_descendant_may_have_transform_related_animation_(false),
           is_layout_ng_object_for_formatted_text(false),
           should_skip_next_layout_shift_tracking_(true),
           should_assume_paint_offset_translation_for_layout_shift_tracking_(
@@ -4067,14 +4122,7 @@
           might_traverse_physical_fragments_(false),
           whitespace_children_may_change_(false),
           needs_devtools_info_(false),
-          positioned_state_(kIsStaticallyPositioned),
-          selection_state_(static_cast<unsigned>(SelectionState::kNone)),
-          selection_state_for_paint_(
-              static_cast<unsigned>(SelectionState::kNone)),
-          subtree_paint_property_update_reasons_(
-              static_cast<unsigned>(SubtreePaintPropertyUpdateReason::kNone)),
-          background_paint_location_(kBackgroundPaintInBorderBoxSpace),
-          overflow_clip_axes_(kNoOverflowClip) {}
+          may_have_anchor_query_(false) {}
 
     // Self needs layout for style means that this layout object is marked for a
     // full layout. This is the default layout but it is expensive as it
@@ -4240,6 +4288,10 @@
     ADD_BOOLEAN_BITFIELD(has_reflection_, HasReflection);
 
     // This boolean is used to know if this LayoutObject is a container for
+    // absolute position descendants.
+    ADD_BOOLEAN_BITFIELD(can_contain_absolute_position_objects_,
+                         CanContainAbsolutePositionObjects);
+    // This boolean is used to know if this LayoutObject is a container for
     // fixed position descendants.
     ADD_BOOLEAN_BITFIELD(can_contain_fixed_position_objects_,
                          CanContainFixedPositionObjects);
@@ -4385,6 +4437,15 @@
     // included).
     ADD_BOOLEAN_BITFIELD(transform_affects_vector_effect_,
                          TransformAffectsVectorEffect);
+
+    // For SVG child objects, indicates if this object or any descendant may
+    // have transform-related animation. This flag is set on all ancestors up
+    // to the SVG root (not included) when an SVG child starts a
+    // transform-related animation. It's cleared lazily during layout of an
+    // SVG container if the container doesn't have any animating descendants.
+    ADD_BOOLEAN_BITFIELD(svg_descendant_may_have_transform_related_animation_,
+                         SVGDescendantMayHaveTransformRelatedAnimation);
+
     ADD_BOOLEAN_BITFIELD(is_layout_ng_object_for_formatted_text,
                          IsLayoutNGObjectForFormattedText);
 
@@ -4415,115 +4476,8 @@
 
     ADD_BOOLEAN_BITFIELD(needs_devtools_info_, NeedsDevtoolsInfo);
 
-   private:
-    // This is the cached 'position' value of this object
-    // (see ComputedStyle::position).
-    unsigned positioned_state_ : 2;  // PositionedState
-
-    // `selection_state_` is direct mapping of the DOM selection into the
-    // respective LayoutObjects that `CanBeSelectionLeaf()`.
-    // `selection_state_for_paint_` is adjusted so that the state takes into
-    // account whether such a LayoutObject will be painted. If selection
-    // starts/ends in an object that is not painted, we won't be able to record
-    // the bounds for composited selection state that is pushed to cc.
-    unsigned selection_state_ : 3;   // SelectionState
-    unsigned selection_state_for_paint_ : 3;  // SelectionState
-
-    // Reasons for the full subtree invalidation.
-    unsigned subtree_paint_property_update_reasons_
-        : kSubtreePaintPropertyUpdateReasonsBitfieldWidth;
-
-    // For LayoutBox. It's updated during PrePaint.
-    unsigned background_paint_location_ : 2;  // BackgroundPaintLocation.
-
-    unsigned overflow_clip_axes_ : 2;
-
-   public:
-    bool IsOutOfFlowPositioned() const {
-      return positioned_state_ == kIsOutOfFlowPositioned;
-    }
-    bool IsRelPositioned() const {
-      return positioned_state_ == kIsRelativelyPositioned;
-    }
-    bool IsStickyPositioned() const {
-      return positioned_state_ == kIsStickyPositioned;
-    }
-    bool IsInFlowPositioned() const {
-      return positioned_state_ == kIsRelativelyPositioned ||
-             positioned_state_ == kIsStickyPositioned;
-    }
-    bool IsPositioned() const {
-      return positioned_state_ != kIsStaticallyPositioned;
-    }
-
-    void SetPositionedState(EPosition position_state) {
-      // This maps FixedPosition and AbsolutePosition to
-      // IsOutOfFlowPositioned, saving one bit.
-      switch (position_state) {
-        case EPosition::kStatic:
-          positioned_state_ = kIsStaticallyPositioned;
-          break;
-        case EPosition::kRelative:
-          positioned_state_ = kIsRelativelyPositioned;
-          break;
-        case EPosition::kAbsolute:
-        case EPosition::kFixed:
-          positioned_state_ = kIsOutOfFlowPositioned;
-          break;
-        case EPosition::kSticky:
-          positioned_state_ = kIsStickyPositioned;
-          break;
-        default:
-          NOTREACHED();
-          break;
-      }
-    }
-    void ClearPositionedState() { positioned_state_ = kIsStaticallyPositioned; }
-
-    ALWAYS_INLINE SelectionState GetSelectionState() const {
-      return static_cast<SelectionState>(selection_state_);
-    }
-    ALWAYS_INLINE void SetSelectionState(SelectionState selection_state) {
-      selection_state_ = static_cast<unsigned>(selection_state);
-    }
-
-    ALWAYS_INLINE SelectionState GetSelectionStateForPaint() const {
-      return static_cast<SelectionState>(selection_state_for_paint_);
-    }
-    ALWAYS_INLINE void SetSelectionStateForPaint(
-        SelectionState selection_state) {
-      selection_state_for_paint_ = static_cast<unsigned>(selection_state);
-    }
-
-    ALWAYS_INLINE unsigned SubtreePaintPropertyUpdateReasons() const {
-      return subtree_paint_property_update_reasons_;
-    }
-    ALWAYS_INLINE void AddSubtreePaintPropertyUpdateReason(
-        SubtreePaintPropertyUpdateReason reason) {
-      DCHECK_LE(static_cast<unsigned>(reason),
-                1u << (kSubtreePaintPropertyUpdateReasonsBitfieldWidth - 1));
-      subtree_paint_property_update_reasons_ |= static_cast<unsigned>(reason);
-    }
-    ALWAYS_INLINE void ResetSubtreePaintPropertyUpdateReasons() {
-      subtree_paint_property_update_reasons_ =
-          static_cast<unsigned>(SubtreePaintPropertyUpdateReason::kNone);
-    }
-
-    ALWAYS_INLINE BackgroundPaintLocation GetBackgroundPaintLocation() const {
-      return static_cast<BackgroundPaintLocation>(background_paint_location_);
-    }
-    ALWAYS_INLINE void SetBackgroundPaintLocation(
-        BackgroundPaintLocation location) {
-      background_paint_location_ = static_cast<unsigned>(location);
-      DCHECK_EQ(location, GetBackgroundPaintLocation());
-    }
-
-    ALWAYS_INLINE OverflowClipAxes GetOverflowClipAxes() const {
-      return static_cast<OverflowClipAxes>(overflow_clip_axes_);
-    }
-    ALWAYS_INLINE void SetOverflowClipAxes(OverflowClipAxes axes) {
-      overflow_clip_axes_ = axes;
-    }
+    // See comments for |MayHaveAnchorQuery()|.
+    ADD_BOOLEAN_BITFIELD(may_have_anchor_query_, MayHaveAnchorQuery);
   };
 
 #undef ADD_BOOLEAN_BITFIELD
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_block.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_block.cc
index 0762145..db9d65f 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_block.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_block.cc
@@ -130,12 +130,19 @@
 
   if (!Parent())
     return;
+
   if (diff.BlendModeChanged()) {
     DCHECK(IsBlendingAllowed());
     Parent()->DescendantIsolationRequirementsChanged(
         StyleRef().HasBlendMode() ? kDescendantIsolationRequired
                                   : kDescendantIsolationNeedsUpdate);
   }
+
+  if (StyleRef().HasCurrentTransformRelatedAnimation() &&
+      !old_style->HasCurrentTransformRelatedAnimation()) {
+    Parent()->SetSVGDescendantMayHaveTransformRelatedAnimation();
+  }
+
   if (diff.HasDifference())
     LayoutSVGResourceContainer::StyleChanged(*this, diff);
 }
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_container.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_container.cc
index b0eaa60..7e17f69f6 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_container.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_container.cc
@@ -90,10 +90,13 @@
 
   if (!IsSVGHiddenContainer()) {
     SetTransformAffectsVectorEffect(false);
+    ClearSVGDescendantMayHaveTransformRelatedAnimation();
     for (auto* child = FirstChild(); child; child = child->NextSibling()) {
-      if (child->TransformAffectsVectorEffect()) {
+      if (child->TransformAffectsVectorEffect())
         SetTransformAffectsVectorEffect(true);
-        break;
+      if (child->StyleRef().HasCurrentTransformRelatedAnimation() ||
+          child->SVGDescendantMayHaveTransformRelatedAnimation()) {
+        SetSVGDescendantMayHaveTransformRelatedAnimation();
       }
     }
   }
diff --git a/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.cc b/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.cc
index b8ee789..ff099e53 100644
--- a/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.cc
+++ b/third_party/blink/renderer/core/layout/svg/layout_svg_model_object.cc
@@ -148,12 +148,20 @@
 
   if (!Parent())
     return;
-  if (diff.BlendModeChanged() && !IsSVGHiddenContainer()) {
-    DCHECK(IsBlendingAllowed());
-    Parent()->DescendantIsolationRequirementsChanged(
-        StyleRef().HasBlendMode() ? kDescendantIsolationRequired
-                                  : kDescendantIsolationNeedsUpdate);
+
+  if (!IsSVGHiddenContainer()) {
+    if (diff.BlendModeChanged()) {
+      DCHECK(IsBlendingAllowed());
+      Parent()->DescendantIsolationRequirementsChanged(
+          StyleRef().HasBlendMode() ? kDescendantIsolationRequired
+                                    : kDescendantIsolationNeedsUpdate);
+    }
+    if (StyleRef().HasCurrentTransformRelatedAnimation() &&
+        !old_style->HasCurrentTransformRelatedAnimation()) {
+      Parent()->SetSVGDescendantMayHaveTransformRelatedAnimation();
+    }
   }
+
   if (diff.HasDifference())
     LayoutSVGResourceContainer::StyleChanged(*this, diff);
 }
diff --git a/third_party/blink/renderer/core/paint/inline_text_box_painter.cc b/third_party/blink/renderer/core/paint/inline_text_box_painter.cc
index 9046b19..b05a58a9 100644
--- a/third_party/blink/renderer/core/paint/inline_text_box_painter.cc
+++ b/third_party/blink/renderer/core/paint/inline_text_box_painter.cc
@@ -605,7 +605,7 @@
   context.DrawHighlightForText(
       font, inline_text_box_.ConstructTextRun(style), local_origin, sel_height,
       background_color,
-      PaintAutoDarkMode(style, DarkModeFilter::ElementRole::kBackground),
+      PaintAutoDarkMode(style, DarkModeFilter::ElementRole::kSelection),
       start_pos, end_pos);
 }
 
@@ -1006,7 +1006,7 @@
   context.Clip(gfx::RectF(box_rect));
   context.DrawHighlightForText(
       font, run, gfx::PointF(box_origin), box_rect.Height().ToInt(), color,
-      PaintAutoDarkMode(style, DarkModeFilter::ElementRole::kBackground),
+      PaintAutoDarkMode(style, DarkModeFilter::ElementRole::kSelection),
       paint_offsets.first, paint_offsets.second);
 }
 
diff --git a/third_party/blink/renderer/core/paint/ng/ng_highlight_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_highlight_painter.cc
index c90fe49c..cd68234 100644
--- a/third_party/blink/renderer/core/paint/ng/ng_highlight_painter.cc
+++ b/third_party/blink/renderer/core/paint/ng/ng_highlight_painter.cc
@@ -374,7 +374,7 @@
                                                selection_style_.current_color);
 
   AutoDarkMode auto_dark_mode(
-      PaintAutoDarkMode(style, DarkModeFilter::ElementRole::kBackground));
+      PaintAutoDarkMode(style, DarkModeFilter::ElementRole::kSelection));
 
   if (!rotation) {
     PaintRect(context, RectInPhysicalSpace(), color, auto_dark_mode);
@@ -928,9 +928,11 @@
 
       // TODO(dazabani@igalia.com) paint rects pixel-snapped in physical space,
       // not writing-mode space (SelectionPaintState::PaintSelectionBackground)
-      PaintRect(paint_info_.context, PhysicalOffset(box_origin_),
-                fragment_item_.LocalRect(text, clamped_start, clamped_end),
-                background_color, background_auto_dark_mode_);
+      PaintRect(
+          paint_info_.context, PhysicalOffset(box_origin_),
+          fragment_item_.LocalRect(text, clamped_start, clamped_end),
+          background_color,
+          PaintAutoDarkMode(style_, DarkModeFilter::ElementRole::kSelection));
 
       if (layer.text_style.shadow) {
         text_painter_.Paint(
diff --git a/third_party/blink/renderer/core/paint/svg_container_painter.cc b/third_party/blink/renderer/core/paint/svg_container_painter.cc
index 32f67076..eada7f5 100644
--- a/third_party/blink/renderer/core/paint/svg_container_painter.cc
+++ b/third_party/blink/renderer/core/paint/svg_container_painter.cc
@@ -33,6 +33,10 @@
   // paint its descendants so we cannot skip painting.
   if (layout_svg_container_.IsSVGHiddenContainer())
     return false;
+
+  if (layout_svg_container_.SVGDescendantMayHaveTransformRelatedAnimation())
+    return false;
+
   return SVGModelObjectPainter::CanUseCullRect(
       layout_svg_container_.StyleRef());
 }
diff --git a/third_party/blink/renderer/core/paint/svg_container_painter_test.cc b/third_party/blink/renderer/core/paint/svg_container_painter_test.cc
index dc0230a..9071c83 100644
--- a/third_party/blink/renderer/core/paint/svg_container_painter_test.cc
+++ b/third_party/blink/renderer/core/paint/svg_container_painter_test.cc
@@ -61,4 +61,76 @@
                           IsPaintChunk(3, 4, after_id, after_properties)));
 }
 
+TEST_P(SVGContainerPainterTest, ScaleAnimationFrom0) {
+  SetBodyInnerHTML(R"HTML(
+    <svg>
+      <style>
+        @keyframes scale { to { scale: 1; } }
+        .scale { animation: 1s scale 1s forwards; }
+        @keyframes transform-scale { to { transform: scale(1); } }
+        .transform-scale { animation: 1s transform-scale 1s forwards; }
+        #rect1 { scale: 0; }
+        #rect2 { transform: scale(0); }
+      </style>
+      <g>
+        <g>
+          <rect id="rect1" width="100" height="100"/>
+        </g>
+      </g>
+      <g>
+        <g>
+          <rect id="rect2" width="100" height="100"/>
+        </g>
+      </g>
+    </svg>
+  )HTML");
+
+  // Initially all <g>s and <rect>s are empty and don't paint.
+
+  EXPECT_THAT(ContentPaintChunks(),
+              ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON));
+
+  auto* rect1_element = GetDocument().getElementById("rect1");
+  auto* rect2_element = GetDocument().getElementById("rect2");
+  rect1_element->setAttribute(html_names::kClassAttr, "scale");
+  rect2_element->setAttribute(html_names::kClassAttr, "transform-scale");
+  UpdateAllLifecyclePhasesForTest();
+
+  // Start animations on the rects.
+  const DisplayItem::Type kSVGTransformPaintPhaseForeground =
+      static_cast<DisplayItem::Type>(DisplayItem::kSVGTransformPaintPhaseFirst +
+                                     5);
+  auto* rect1 = GetLayoutObjectByElementId("rect1");
+  auto* rect2 = GetLayoutObjectByElementId("rect2");
+  PaintChunk::Id rect1_id(rect1->Id(), kSVGTransformPaintPhaseForeground);
+  auto rect1_properties = rect1->FirstFragment().ContentsProperties();
+  PaintChunk::Id rect2_id(rect2->Id(), kSVGTransformPaintPhaseForeground);
+  auto rect2_properties = rect2->FirstFragment().ContentsProperties();
+  // Both rects should be painted to be ready for composited animation.
+  EXPECT_THAT(ContentPaintChunks(),
+              ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON,
+                          IsPaintChunk(1, 2, rect1_id, rect1_properties),
+                          IsPaintChunk(2, 3, rect2_id, rect2_properties)));
+
+  // Remove the animations.
+  rect1_element->removeAttribute(html_names::kClassAttr);
+  rect2_element->removeAttribute(html_names::kClassAttr);
+  UpdateAllLifecyclePhasesForTest();
+  // We don't remove the paintings of the rects immediately because they are
+  // harmless and we want to avoid repaints.
+  EXPECT_THAT(ContentPaintChunks(),
+              ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON,
+                          IsPaintChunk(1, 2, rect1_id, rect1_properties),
+                          IsPaintChunk(2, 3, rect2_id, rect2_properties)));
+
+  // We remove the paintings only after anything else trigger a layout and a
+  // repaint.
+  rect1->Parent()->SetNeedsLayout("test");
+  rect2->Parent()->SetNeedsLayout("test");
+  rect1->EnclosingLayer()->SetNeedsRepaint();
+  UpdateAllLifecyclePhasesForTest();
+  EXPECT_THAT(ContentPaintChunks(),
+              ElementsAre(VIEW_SCROLLING_BACKGROUND_CHUNK_COMMON));
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/style/computed_style.h b/third_party/blink/renderer/core/style/computed_style.h
index 6ccf9ef..adbdb66 100644
--- a/third_party/blink/renderer/core/style/computed_style.h
+++ b/third_party/blink/renderer/core/style/computed_style.h
@@ -2328,19 +2328,21 @@
   }
 
   // Animation utility functions.
+  bool HasCurrentTransformRelatedAnimation() const {
+    return HasCurrentTransformAnimation() || HasCurrentScaleAnimation() ||
+           HasCurrentRotateAnimation() || HasCurrentTranslateAnimation();
+  }
   bool HasCurrentCompositableAnimation() const {
-    return HasCurrentOpacityAnimation() || HasCurrentTransformAnimation() ||
-           HasCurrentScaleAnimation() || HasCurrentRotateAnimation() ||
-           HasCurrentTranslateAnimation() || HasCurrentFilterAnimation() ||
-           HasCurrentBackdropFilterAnimation() ||
+    return HasCurrentOpacityAnimation() ||
+           HasCurrentTransformRelatedAnimation() ||
+           HasCurrentFilterAnimation() || HasCurrentBackdropFilterAnimation() ||
            (RuntimeEnabledFeatures::CompositeBGColorAnimationEnabled() &&
             HasCurrentBackgroundColorAnimation());
   }
   bool ShouldCompositeForCurrentAnimations() const {
-    return HasCurrentOpacityAnimation() || HasCurrentTransformAnimation() ||
-           HasCurrentScaleAnimation() || HasCurrentRotateAnimation() ||
-           HasCurrentTranslateAnimation() || HasCurrentFilterAnimation() ||
-           HasCurrentBackdropFilterAnimation();
+    return HasCurrentOpacityAnimation() ||
+           HasCurrentTransformRelatedAnimation() ||
+           HasCurrentFilterAnimation() || HasCurrentBackdropFilterAnimation();
   }
   bool RequiresPropertyNodeForAnimation() const {
     return IsRunningOpacityAnimationOnCompositor() ||
@@ -2382,9 +2384,8 @@
   }
   bool HasTransform() const {
     return HasTransformOperations() || HasOffset() ||
-           HasCurrentTransformAnimation() || HasCurrentScaleAnimation() ||
-           HasCurrentRotateAnimation() || HasCurrentTranslateAnimation() ||
-           Translate() || Rotate() || Scale();
+           HasCurrentTransformRelatedAnimation() || Translate() || Rotate() ||
+           Scale();
   }
   bool HasTransformOperations() const {
     return !Transform().Operations().empty();
diff --git a/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc b/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc
index 187ab316..e1ff9ef 100644
--- a/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc
+++ b/third_party/blink/renderer/core/timing/soft_navigation_heuristics.cc
@@ -157,9 +157,7 @@
     return;
   }
   LocalDOMWindow* window = frame->DomWindow();
-  if (!window) {
-    return;
-  }
+  DCHECK(window);
   // In case of a Soft Navigation using `history.back()`, `history.forward()` or
   // `history.go()`, `SawURLChange` was called with an empty URL. If that's the
   // case, don't report the Soft Navigation just yet, and wait for
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.cc b/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.cc
index c632abf..343481e7 100644
--- a/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.cc
+++ b/third_party/blink/renderer/modules/file_system_access/file_system_access_incognito_file_delegate.cc
@@ -133,7 +133,7 @@
   mojo::ScopedDataPipeProducerHandle producer_handle;
   mojo::ScopedDataPipeConsumerHandle consumer_handle;
   if (!CreateDataPipeForSize(data.size(), producer_handle, consumer_handle)) {
-    return base::File::Error::FILE_ERROR_FAILED;
+    return base::unexpected(base::File::Error::FILE_ERROR_FAILED);
   }
 
   auto ref_counted_data =
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.cc b/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.cc
index d4242ff..cb37e1e 100644
--- a/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.cc
+++ b/third_party/blink/renderer/modules/file_system_access/file_system_access_regular_file_delegate.cc
@@ -77,7 +77,7 @@
   if (result >= 0) {
     return result;
   }
-  return base::File::GetLastFileError();
+  return base::unexpected(base::File::GetLastFileError());
 }
 
 base::FileErrorOr<int> FileSystemAccessRegularFileDelegate::Write(
@@ -90,7 +90,7 @@
 
   int64_t write_end_offset;
   if (!base::CheckAdd(offset, write_size).AssignIfValid(&write_end_offset)) {
-    return base::File::FILE_ERROR_NO_SPACE;
+    return base::unexpected(base::File::FILE_ERROR_NO_SPACE);
   }
 
   int64_t file_size_before = backing_file_.GetLength();
@@ -98,7 +98,7 @@
     // Attempt to pre-allocate quota. Do not attempt to write unless we have
     // enough quota for the whole operation.
     if (!capacity_tracker_->RequestFileCapacityChangeSync(write_end_offset))
-      return base::File::FILE_ERROR_NO_SPACE;
+      return base::unexpected(base::File::FILE_ERROR_NO_SPACE);
   }
 
   int result = backing_file_.Write(offset, reinterpret_cast<char*>(data.data()),
@@ -176,7 +176,7 @@
   CHECK_GE(new_length, 0);
 
   if (!capacity_tracker_->RequestFileCapacityChangeSync(new_length))
-    return base::File::FILE_ERROR_NO_SPACE;
+    return base::unexpected(base::File::FILE_ERROR_NO_SPACE);
 
 #if BUILDFLAG(IS_MAC)
   // On macOS < 10.15, a sandboxing limitation causes failures in ftruncate()
@@ -198,7 +198,7 @@
     // Unfortunately we don't have access to the error code when using
     // the FileUtilitiesHost, so we can say the operation failed but
     // not why (ex: out of quota).
-    return base::File::Error::FILE_ERROR_FAILED;
+    return base::unexpected(base::File::Error::FILE_ERROR_FAILED);
   }
 #endif  // BUILDFLAG(IS_MAC)
 
@@ -206,7 +206,7 @@
     capacity_tracker_->CommitFileSizeChange(new_length);
     return true;
   }
-  return base::File::GetLastFileError();
+  return base::unexpected(base::File::GetLastFileError());
 }
 
 void FileSystemAccessRegularFileDelegate::SetLengthAsync(
diff --git a/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.cc b/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.cc
index 4fcb555..3357c2b 100644
--- a/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.cc
+++ b/third_party/blink/renderer/modules/file_system_access/file_system_sync_access_handle.cc
@@ -217,7 +217,7 @@
       << "file delgate invalidated before getSize";
 
   base::FileErrorOr<int64_t> error_or_length = file_delegate()->GetLength();
-  if (error_or_length.is_error()) {
+  if (!error_or_length.has_value()) {
     exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
                                       "getSize failed");
     return 0;
@@ -257,7 +257,7 @@
         ScriptState::Scope scope(script_state);
 
         access_handle->ExitOperation();
-        if (error_or_length.is_error()) {
+        if (!error_or_length.has_value()) {
           resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
               script_state->GetIsolate(), DOMExceptionCode::kInvalidStateError,
               "getSize failed"));
@@ -302,7 +302,7 @@
   }
 
   base::FileErrorOr<bool> result = file_delegate()->SetLength(size);
-  if (!result.is_error())
+  if (result.has_value())
     return;
 
   base::File::Error file_error = result.error();
@@ -423,7 +423,7 @@
   base::FileErrorOr<int> result =
       file_delegate()->Read(file_offset, {read_data, read_size});
 
-  if (result.is_error()) {
+  if (!result.has_value()) {
     exception_state.ThrowDOMException(DOMExceptionCode::kInvalidStateError,
                                       "Failed to read the content");
     return 0;
@@ -488,7 +488,7 @@
 
   base::FileErrorOr<int> result =
       file_delegate()->Write(file_offset, {write_data, write_size});
-  if (result.is_error()) {
+  if (!result.has_value()) {
     base::File::Error file_error = result.error();
     DCHECK_NE(file_error, base::File::FILE_OK);
     if (file_error == base::File::FILE_ERROR_NO_SPACE) {
diff --git a/third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.cc b/third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.cc
index e1de7f75..e77e0ef 100644
--- a/third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.cc
+++ b/third_party/blink/renderer/modules/file_system_access/storage_manager_file_system_access.cc
@@ -35,7 +35,7 @@
 
 void GetDirectoryImpl(ScriptPromiseResolver* resolver, bool allow_access) {
   ExecutionContext* context = resolver->GetExecutionContext();
-  if (!resolver->GetScriptState()->ContextIsValid())
+  if (!context || !resolver->GetScriptState()->ContextIsValid())
     return;
 
   if (!allow_access) {
diff --git a/third_party/blink/renderer/modules/shared_storage/shared_storage.cc b/third_party/blink/renderer/modules/shared_storage/shared_storage.cc
index a7e1c52..9feefa8 100644
--- a/third_party/blink/renderer/modules/shared_storage/shared_storage.cc
+++ b/third_party/blink/renderer/modules/shared_storage/shared_storage.cc
@@ -370,16 +370,6 @@
       MakeGarbageCollected<ScriptPromiseResolver>(script_state);
   ScriptPromise promise = resolver->Promise();
 
-  if (frame->IsInFencedFrameTree()) {
-    // https://github.com/pythagoraskitty/shared-storage/blob/main/README.md#url-selection
-    resolver->Reject(V8ThrowDOMException::CreateOrEmpty(
-        script_state->GetIsolate(), DOMExceptionCode::kInvalidAccessError,
-        "sharedStorage.selectURL() is not allowed in fenced frame."));
-    LogSharedStorageWorkletError(
-        SharedStorageWorkletErrorType::kSelectURLWebVisible);
-    return promise;
-  }
-
   // For `selectURL()` to succeed, it is currently enforced in the browser side
   // that `addModule()` must be called beforehand that passed the early
   // permission checks. Thus the permissions-policy check here isn't strictly
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc
index 81f183e..27a42563 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc
@@ -22,127 +22,11 @@
 #include "third_party/blink/renderer/platform/graphics/canvas_resource_provider.h"
 #include "third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context.h"
 #include "third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.h"
+#include "third_party/blink/renderer/platform/graphics/gpu/webgpu_texture_alpha_clearer.h"
 #include "third_party/blink/renderer/platform/graphics/unaccelerated_static_bitmap_image.h"
 
 namespace blink {
 
-class TextureAlphaClearer final {
- public:
-  TextureAlphaClearer(GPUDevice* device, WGPUTextureFormat format)
-      : dawn_control_client_(device->GetDawnControlClient()),
-        device_(device->GetHandle()),
-        format_(format) {
-    const auto& procs = dawn_control_client_->GetProcs();
-
-    procs.deviceReference(device_);
-
-    WGPUShaderModuleWGSLDescriptor wgsl_desc = {
-        .chain = {.sType = WGPUSType_ShaderModuleWGSLDescriptor},
-        .source = R"(
-        @vertex fn vert_main(@builtin(vertex_index) VertexIndex : u32) -> @builtin(position) vec4<f32> {
-          var pos = array<vec2<f32>, 3>(
-              vec2<f32>(-1.0, -1.0),
-              vec2<f32>( 3.0, -1.0),
-              vec2<f32>(-1.0,  3.0));
-          return vec4<f32>(pos[VertexIndex], 0.0, 1.0);
-        }
-
-        @fragment fn frag_main() -> @location(0) vec4<f32> {
-          return vec4<f32>(1.0);
-        }
-      )",
-    };
-    WGPUShaderModuleDescriptor shader_module_desc = {.nextInChain =
-                                                         &wgsl_desc.chain};
-    WGPUShaderModule shader_module =
-        procs.deviceCreateShaderModule(device_, &shader_module_desc);
-
-    WGPUColorTargetState color_target = {
-        .format = format,
-        .writeMask = WGPUColorWriteMask_Alpha,
-    };
-    WGPUFragmentState fragment = {
-        .module = shader_module,
-        .entryPoint = "frag_main",
-        .targetCount = 1,
-        .targets = &color_target,
-    };
-    WGPURenderPipelineDescriptor pipeline_desc = {
-        .vertex =
-            {
-                .module = shader_module,
-                .entryPoint = "vert_main",
-            },
-        .primitive = {.topology = WGPUPrimitiveTopology_TriangleList},
-        .multisample = {.count = 1, .mask = 0xFFFFFFFF},
-        .fragment = &fragment,
-    };
-    alpha_to_one_pipeline_ =
-        procs.deviceCreateRenderPipeline(device_, &pipeline_desc);
-    procs.shaderModuleRelease(shader_module);
-  }
-
-  virtual ~TextureAlphaClearer() {
-    const auto& procs = dawn_control_client_->GetProcs();
-    procs.renderPipelineRelease(alpha_to_one_pipeline_);
-    procs.deviceRelease(device_);
-  }
-
-  bool IsCompatible(GPUDevice* device, WGPUTextureFormat format) {
-    return device_ == device->GetHandle() && format_ == format;
-  }
-
-  void ClearAlpha(GPUTexture* texture) {
-    const auto& procs = dawn_control_client_->GetProcs();
-
-    WGPUTextureView attachment_view =
-        procs.textureCreateView(texture->GetHandle(), nullptr);
-
-    WGPUDawnEncoderInternalUsageDescriptor internal_usage_desc = {
-        .chain = {.sType = WGPUSType_DawnEncoderInternalUsageDescriptor},
-        .useInternalUsages = true,
-    };
-    WGPUCommandEncoderDescriptor command_encoder_desc = {
-        .nextInChain = &internal_usage_desc.chain,
-    };
-    WGPUCommandEncoder command_encoder =
-        procs.deviceCreateCommandEncoder(device_, &command_encoder_desc);
-
-    WGPURenderPassColorAttachment color_attachment = {
-        .view = attachment_view,
-        .loadOp = WGPULoadOp_Load,
-        .storeOp = WGPUStoreOp_Store,
-    };
-    WGPURenderPassDescriptor render_pass_desc = {
-        .colorAttachmentCount = 1,
-        .colorAttachments = &color_attachment,
-    };
-    WGPURenderPassEncoder pass =
-        procs.commandEncoderBeginRenderPass(command_encoder, &render_pass_desc);
-    DCHECK(alpha_to_one_pipeline_);
-    procs.renderPassEncoderSetPipeline(pass, alpha_to_one_pipeline_);
-    procs.renderPassEncoderDraw(pass, 3, 1, 0, 0);
-    procs.renderPassEncoderEnd(pass);
-
-    WGPUCommandBuffer command_buffer =
-        procs.commandEncoderFinish(command_encoder, nullptr);
-
-    WGPUQueue queue = procs.deviceGetQueue(device_);
-    procs.queueSubmit(queue, 1, &command_buffer);
-
-    procs.renderPassEncoderRelease(pass);
-    procs.commandEncoderRelease(command_encoder);
-    procs.commandBufferRelease(command_buffer);
-    procs.textureViewRelease(attachment_view);
-  }
-
- private:
-  const scoped_refptr<DawnControlClientHolder> dawn_control_client_;
-  const WGPUDevice device_;
-  const WGPUTextureFormat format_;
-  WGPURenderPipeline alpha_to_one_pipeline_ = nullptr;
-};
-
 GPUCanvasContext::Factory::~Factory() = default;
 
 CanvasRenderingContext* GPUCanvasContext::Factory::Create(
@@ -171,10 +55,6 @@
   texture_descriptor_.sampleCount = 1;
 }
 
-GPUCanvasContext::~GPUCanvasContext() {
-  alpha_clearer_ = nullptr;
-}
-
 void GPUCanvasContext::Trace(Visitor* visitor) const {
   visitor->Trace(device_);
   visitor->Trace(texture_);
@@ -506,13 +386,16 @@
     case V8GPUCanvasAlphaMode::Enum::kOpaque: {
       CcLayer()->SetContentsOpaque(true);
       if (!alpha_clearer_ ||
-          !alpha_clearer_->IsCompatible(device_, texture_descriptor_.format)) {
-        alpha_clearer_ = std::make_unique<TextureAlphaClearer>(
-            device_, texture_descriptor_.format);
+          !alpha_clearer_->IsCompatible(device_->GetHandle(),
+                                        texture_descriptor_.format)) {
+        alpha_clearer_ = base::MakeRefCounted<WebGPUTextureAlphaClearer>(
+            device_->GetDawnControlClient(), device_->GetHandle(),
+            texture_descriptor_.format);
       }
       break;
     }
     case V8GPUCanvasAlphaMode::Enum::kPremultiplied:
+      alpha_clearer_ = nullptr;
       CcLayer()->SetContentsOpaque(false);
       break;
   }
@@ -658,6 +541,7 @@
   }
 
   mailbox_texture->SetNeedsPresent(true);
+  mailbox_texture->SetAlphaClearer(alpha_clearer_);
 
   texture_ = MakeGarbageCollected<GPUTexture>(
       device_, texture_descriptor_.format,
@@ -680,23 +564,6 @@
 // WebGPUSwapBufferProvider::Client implementation
 void GPUCanvasContext::OnTextureTransferred() {
   DCHECK(texture_);
-
-  // The texture is about to be transferred to the compositor.
-  // For alpha mode Opaque, clear the alpha channel to 1.0.
-  switch (alpha_mode_) {
-    case V8GPUCanvasAlphaMode::Enum::kOpaque: {
-      // `alpha_clearer_` will be deleted if OnTextureTransferred is called
-      // during ~GPUCanvasContext -> ~WebGPUSwapBufferProvider ->
-      // ~WebGPUMailboxTexture
-      if (alpha_clearer_) {
-        alpha_clearer_->ClearAlpha(texture_);
-      }
-      break;
-    }
-    case V8GPUCanvasAlphaMode::Enum::kPremultiplied:
-      break;
-  }
-
   texture_ = nullptr;
 }
 
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.h b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.h
index 4270f58..225a39d4 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.h
+++ b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.h
@@ -20,7 +20,7 @@
 class GPUCanvasConfiguration;
 class GPUSwapChain;
 class GPUTexture;
-class TextureAlphaClearer;
+class WebGPUTextureAlphaClearer;
 class V8UnionHTMLCanvasElementOrOffscreenCanvas;
 
 // A GPUCanvasContext does little by itself and basically just binds a canvas
@@ -51,8 +51,6 @@
   GPUCanvasContext(const GPUCanvasContext&) = delete;
   GPUCanvasContext& operator=(const GPUCanvasContext&) = delete;
 
-  ~GPUCanvasContext() override;
-
   void Trace(Visitor*) const override;
 
   // CanvasRenderingContext implementation
@@ -140,7 +138,7 @@
   Member<GPUDevice> device_;
   Member<GPUTexture> texture_;
   V8GPUCanvasAlphaMode::Enum alpha_mode_;
-  std::unique_ptr<TextureAlphaClearer> alpha_clearer_;
+  scoped_refptr<WebGPUTextureAlphaClearer> alpha_clearer_;
   scoped_refptr<WebGPUSwapBufferProvider> swap_buffers_;
 
   bool new_texture_required_ = true;
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_device.cc b/third_party/blink/renderer/modules/webgpu/gpu_device.cc
index 1953ec4..9e060c8f 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_device.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu_device.cc
@@ -393,6 +393,9 @@
 void GPUDevice::destroy(ScriptState* script_state) {
   destroyed_ = true;
   DestroyAllExternalTextures();
+  // Dissociate mailboxes before destroying the device. This ensures that
+  // mailbox operations which run during dissociation can succeed.
+  DissociateMailboxes();
   UnmapAllMappableBuffers(script_state);
   GetProcs().deviceDestroy(GetHandle());
   FlushNow();
@@ -608,6 +611,7 @@
   visitor->Trace(queue_);
   visitor->Trace(lost_property_);
   visitor->Trace(active_external_textures_);
+  visitor->Trace(textures_with_mailbox_);
   visitor->Trace(mappable_buffers_);
   ExecutionContextClient::Trace(visitor);
   EventTargetWithInlineData::Trace(visitor);
@@ -626,6 +630,13 @@
   active_external_textures_.clear();
 }
 
+void GPUDevice::DissociateMailboxes() {
+  for (auto& texture : textures_with_mailbox_) {
+    texture->DissociateMailbox();
+  }
+  textures_with_mailbox_.clear();
+}
+
 void GPUDevice::UnmapAllMappableBuffers(ScriptState* script_state) {
   for (GPUBuffer* buffer : mappable_buffers_) {
     buffer->unmap(script_state);
@@ -651,4 +662,14 @@
   active_external_textures_.erase(external_texture);
 }
 
+void GPUDevice::TrackTextureWithMailbox(GPUTexture* texture) {
+  DCHECK(texture);
+  textures_with_mailbox_.insert(texture);
+}
+
+void GPUDevice::UntrackTextureWithMailbox(GPUTexture* texture) {
+  DCHECK(texture);
+  textures_with_mailbox_.erase(texture);
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_device.h b/third_party/blink/renderer/modules/webgpu/gpu_device.h
index 03df5e0..318be9b3 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_device.h
+++ b/third_party/blink/renderer/modules/webgpu/gpu_device.h
@@ -144,6 +144,9 @@
   void AddActiveExternalTexture(GPUExternalTexture* external_texture);
   void RemoveActiveExternalTexture(GPUExternalTexture* external_texture);
 
+  void TrackTextureWithMailbox(GPUTexture* texture);
+  void UntrackTextureWithMailbox(GPUTexture* texture);
+
   bool ValidateTextureFormatUsage(V8GPUTextureFormat format,
                                   ExceptionState& exception_state);
   std::string formattedLabel() const;
@@ -163,7 +166,7 @@
   void Dispose();
 
   void DestroyAllExternalTextures();
-
+  void DissociateMailboxes();
   void UnmapAllMappableBuffers(ScriptState* script_state);
 
   void OnUncapturedError(WGPUErrorType errorType, const char* message);
@@ -213,6 +216,9 @@
   // when the device is destroyed (via .destroy) to free the memory.
   HeapHashSet<WeakMember<GPUExternalTexture>> active_external_textures_;
 
+  // Textures with mailboxes that should be dissociated before device.destroy().
+  HeapHashSet<WeakMember<GPUTexture>> textures_with_mailbox_;
+
   HeapHashSet<WeakMember<GPUBuffer>> mappable_buffers_;
 
   // This attribute records that whether GPUDevice is destroyed (via destroy()).
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_texture.cc b/third_party/blink/renderer/modules/webgpu/gpu_texture.cc
index 851b74c8..9146a011 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_texture.cc
+++ b/third_party/blink/renderer/modules/webgpu/gpu_texture.cc
@@ -240,6 +240,10 @@
       format_(format),
       usage_(usage),
       mailbox_texture_(std::move(mailbox_texture)) {
+  if (mailbox_texture_) {
+    device_->TrackTextureWithMailbox(this);
+  }
+
   // Mailbox textures are all 2d texture.
   dimension_ = WGPUTextureDimension_2D;
 
@@ -267,9 +271,16 @@
   return view;
 }
 
+GPUTexture::~GPUTexture() {
+  DissociateMailbox();
+}
+
 void GPUTexture::destroy() {
+  if (mailbox_texture_) {
+    DissociateMailbox();
+    device_->UntrackTextureWithMailbox(this);
+  }
   GetProcs().textureDestroy(GetHandle());
-  mailbox_texture_.reset();
 }
 
 uint32_t GPUTexture::width() const {
@@ -304,4 +315,11 @@
   return GetProcs().textureGetUsage(GetHandle());
 }
 
+void GPUTexture::DissociateMailbox() {
+  if (mailbox_texture_) {
+    mailbox_texture_->Dissociate();
+    mailbox_texture_ = nullptr;
+  }
+}
+
 }  // namespace blink
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_texture.h b/third_party/blink/renderer/modules/webgpu/gpu_texture.h
index 165a8cd..13f98d69 100644
--- a/third_party/blink/renderer/modules/webgpu/gpu_texture.h
+++ b/third_party/blink/renderer/modules/webgpu/gpu_texture.h
@@ -38,6 +38,8 @@
              WGPUTextureUsage usage,
              scoped_refptr<WebGPUMailboxTexture> mailbox_texture);
 
+  ~GPUTexture() override;
+
   GPUTexture(const GPUTexture&) = delete;
   GPUTexture& operator=(const GPUTexture&) = delete;
 
@@ -58,6 +60,8 @@
   WGPUTextureFormat Format() { return format_; }
   WGPUTextureUsage Usage() { return usage_; }
 
+  void DissociateMailbox();
+
  private:
   void setLabelImpl(const String& value) override {
     std::string utf8_label = value.Utf8();
diff --git a/third_party/blink/renderer/platform/BUILD.gn b/third_party/blink/renderer/platform/BUILD.gn
index ae88e5a..77dc595 100644
--- a/third_party/blink/renderer/platform/BUILD.gn
+++ b/third_party/blink/renderer/platform/BUILD.gn
@@ -923,6 +923,8 @@
     "graphics/gpu/webgpu_resource_provider_cache.h",
     "graphics/gpu/webgpu_swap_buffer_provider.cc",
     "graphics/gpu/webgpu_swap_buffer_provider.h",
+    "graphics/gpu/webgpu_texture_alpha_clearer.cc",
+    "graphics/gpu/webgpu_texture_alpha_clearer.h",
     "graphics/gpu/xr_frame_transport.cc",
     "graphics/gpu/xr_frame_transport.h",
     "graphics/gpu/xr_webgl_drawing_buffer.cc",
diff --git a/third_party/blink/renderer/platform/graphics/dark_mode_color_filter.cc b/third_party/blink/renderer/platform/graphics/dark_mode_color_filter.cc
index d3a7752..06066090 100644
--- a/third_party/blink/renderer/platform/graphics/dark_mode_color_filter.cc
+++ b/third_party/blink/renderer/platform/graphics/dark_mode_color_filter.cc
@@ -10,6 +10,7 @@
 #include "third_party/skia/include/core/SkColorFilter.h"
 #include "third_party/skia/include/effects/SkHighContrastFilter.h"
 #include "third_party/skia/include/effects/SkTableColorFilter.h"
+#include "ui/gfx/color_utils.h"
 
 namespace blink {
 namespace {
@@ -73,6 +74,31 @@
     return AdjustGray(inverted_color);
   }
 
+  SkColor AdjustColorForHigherConstrast(
+      SkColor adjusted_color,
+      SkColor background,
+      float reference_contrast_ratio) override {
+    if (color_utils::GetContrastRatio(adjusted_color, background) >=
+        reference_contrast_ratio)
+      return adjusted_color;
+
+    SkColor best_color = adjusted_color;
+    constexpr int MaxLightness = 100;
+    int min_lightness = GetLabSkV3Data(adjusted_color).x;
+    for (int low = min_lightness, high = MaxLightness + 1; low < high;) {
+      const int lightness = (low + high) / 2;
+      const SkColor color = AdjustColorByLightness(adjusted_color, lightness);
+      const float contrast = color_utils::GetContrastRatio(color, background);
+      if (contrast > reference_contrast_ratio) {
+        high = lightness;
+        best_color = color;
+      } else {
+        low = high + 1;
+      }
+    }
+    return best_color;
+  }
+
   sk_sp<SkColorFilter> ToSkColorFilter() const override { return filter_; }
 
  private:
@@ -99,6 +125,36 @@
     return color;
   }
 
+  SkColor AdjustColorByLightness(SkColor reference_color, int lightness) {
+    SkColor new_color = AdjustLightness(reference_color, lightness);
+    SkScalar hsv[3];
+    SkColorToHSV(reference_color, hsv);
+    const float hue = hsv[0];
+    SkColorToHSV(new_color, hsv);
+    if (hsv[0] != hue)
+      hsv[0] = hue;
+
+    return SkHSVToColor(SkColorGetA(reference_color), hsv);
+  }
+
+  SkColor AdjustLightness(SkColor color, int lightness) {
+    SkV3 lab = GetLabSkV3Data(color);
+    if (lab.x != lightness)
+      lab.x = lightness;
+    SkV3 rgb = transformer_.LABToSRGB(lab);
+
+    return SkColorSetARGB(SkColorGetA(color),
+                          static_cast<unsigned int>(rgb.x * 255 + 0.5),
+                          static_cast<unsigned int>(rgb.y * 255 + 0.5),
+                          static_cast<unsigned int>(rgb.z * 255 + 0.5));
+  }
+
+  SkV3 GetLabSkV3Data(SkColor color) {
+    SkV3 rgb = {SkColorGetR(color) / 255.0f, SkColorGetG(color) / 255.0f,
+                SkColorGetB(color) / 255.0f};
+    return transformer_.SRGBToLAB(rgb);
+  }
+
   const lab::DarkModeSRGBLABTransformer transformer_;
   sk_sp<SkColorFilter> filter_;
 };
diff --git a/third_party/blink/renderer/platform/graphics/dark_mode_color_filter.h b/third_party/blink/renderer/platform/graphics/dark_mode_color_filter.h
index 1e1eca8f..70d54dbc 100644
--- a/third_party/blink/renderer/platform/graphics/dark_mode_color_filter.h
+++ b/third_party/blink/renderer/platform/graphics/dark_mode_color_filter.h
@@ -25,6 +25,12 @@
   virtual ~DarkModeColorFilter();
   virtual SkColor InvertColor(SkColor color) const = 0;
   virtual sk_sp<SkColorFilter> ToSkColorFilter() const = 0;
+  virtual SkColor AdjustColorForHigherConstrast(
+      SkColor adjusted_color,
+      const SkColor background,
+      float reference_contrast_ratio) {
+    return adjusted_color;
+  }
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc b/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc
index 21cde0c6..33a89973 100644
--- a/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc
+++ b/third_party/blink/renderer/platform/graphics/dark_mode_filter.cc
@@ -137,25 +137,38 @@
   return immutable_.settings.image_policy;
 }
 
-// Heuristic to maintain contrast for borders (see: crbug.com/1263545)
+// Heuristic to maintain contrast for borders and selections (see:
+// crbug.com/1263545,crbug.com/1298969)
 SkColor DarkModeFilter::AdjustDarkenColor(SkColor color,
                                           DarkModeFilter::ElementRole role,
                                           SkColor contrast_background) {
-  if (role != DarkModeFilter::ElementRole::kBorder)
-    return color;
-
   if (contrast_background == 0)
     contrast_background = SK_ColorDark;
 
-  if (color == SkColorSetARGB(SkColorGetA(color), 0, 0, 0))
-    return color;
+  switch (role) {
+    case ElementRole::kBorder: {
+      if (color == SkColorSetARGB(SkColorGetA(color), 0, 0, 0))
+        return color;
 
-  if (color_utils::GetContrastRatio(color, contrast_background) <
-      color_utils::kMinimumReadableContrastRatio)
-    return color;
+      if (color_utils::GetContrastRatio(color, contrast_background) <
+          color_utils::kMinimumReadableContrastRatio)
+        return color;
 
-  return AdjustDarkenColor(Color::FromSkColor(color).Dark().Rgb(), role,
-                           contrast_background);
+      return AdjustDarkenColor(Color::FromSkColor(color).Dark().Rgb(), role,
+                               contrast_background);
+    }
+    case ElementRole::kSelection: {
+      if (!immutable_.color_filter)
+        return color;
+
+      return immutable_.color_filter->AdjustColorForHigherConstrast(
+          color, contrast_background,
+          color_utils::kMinimumVisibleContrastRatio);
+    }
+    default:
+      return color;
+  }
+  NOTREACHED();
 }
 
 SkColor DarkModeFilter::InvertColorIfNeeded(SkColor color,
@@ -270,6 +283,7 @@
       return immutable_.foreground_classifier->ShouldInvertColor(color) ==
              DarkModeResult::kApplyFilter;
     case ElementRole::kBackground:
+    case ElementRole::kSelection:
       DCHECK(immutable_.background_classifier);
       return immutable_.background_classifier->ShouldInvertColor(color) ==
              DarkModeResult::kApplyFilter;
diff --git a/third_party/blink/renderer/platform/graphics/dark_mode_filter.h b/third_party/blink/renderer/platform/graphics/dark_mode_filter.h
index 8ecd7a61..2fef40f 100644
--- a/third_party/blink/renderer/platform/graphics/dark_mode_filter.h
+++ b/third_party/blink/renderer/platform/graphics/dark_mode_filter.h
@@ -36,7 +36,8 @@
     kListSymbol,
     kBackground,
     kSVG,
-    kBorder
+    kBorder,
+    kSelection
   };
   enum class ImageType { kNone, kIcon, kSeparator, kPhoto };
 
diff --git a/third_party/blink/renderer/platform/graphics/dark_mode_filter_test.cc b/third_party/blink/renderer/platform/graphics/dark_mode_filter_test.cc
index 9c005d9..b6bdb222 100644
--- a/third_party/blink/renderer/platform/graphics/dark_mode_filter_test.cc
+++ b/third_party/blink/renderer/platform/graphics/dark_mode_filter_test.cc
@@ -4,8 +4,6 @@
 
 #include "third_party/blink/renderer/platform/graphics/dark_mode_filter.h"
 
-#include "base/logging.h"
-#include "base/time/time.h"
 #include "cc/paint/paint_flags.h"
 #include "testing/gtest/include/gtest/gtest.h"
 #include "third_party/abseil-cpp/absl/types/optional.h"
diff --git a/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.cc b/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.cc
index 8f2e7c9f..ad0e15b 100644
--- a/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.cc
+++ b/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.cc
@@ -10,6 +10,7 @@
 #include "third_party/blink/renderer/platform/graphics/canvas_resource.h"
 #include "third_party/blink/renderer/platform/graphics/canvas_resource_provider.h"
 #include "third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context.h"
+#include "third_party/blink/renderer/platform/graphics/gpu/webgpu_texture_alpha_clearer.h"
 #include "third_party/blink/renderer/platform/graphics/static_bitmap_image.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 
@@ -182,6 +183,10 @@
                            reinterpret_cast<const GLbyte*>(&mailbox));
 }
 
+void WebGPUMailboxTexture::SetAlphaClearer(
+    scoped_refptr<WebGPUTextureAlphaClearer> alpha_clearer) {
+  alpha_clearer_ = std::move(alpha_clearer);
+}
 
 void WebGPUMailboxTexture::Dissociate() {
   if (wire_texture_id_ == 0) {
@@ -191,6 +196,10 @@
           dawn_control_client_->GetContextProviderWeakPtr()) {
     gpu::webgpu::WebGPUInterface* webgpu =
         context_provider->ContextProvider()->WebGPUInterface();
+    if (alpha_clearer_) {
+      alpha_clearer_->ClearAlpha(texture_);
+      alpha_clearer_ = nullptr;
+    }
     if (needs_present_) {
       webgpu->DissociateMailboxForPresent(
           wire_device_id_, wire_device_generation_, wire_texture_id_,
diff --git a/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.h b/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.h
index 34a6a4e..69fdac3 100644
--- a/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.h
+++ b/third_party/blink/renderer/platform/graphics/gpu/webgpu_mailbox_texture.h
@@ -25,6 +25,7 @@
 
 class DawnControlClientHolder;
 class StaticBitmapImage;
+class WebGPUTextureAlphaClearer;
 
 class PLATFORM_EXPORT WebGPUMailboxTexture
     : public RefCounted<WebGPUMailboxTexture> {
@@ -60,6 +61,7 @@
       scoped_refptr<media::VideoFrame> video_frame);
 
   void SetNeedsPresent(bool needs_present) { needs_present_ = needs_present; }
+  void SetAlphaClearer(scoped_refptr<WebGPUTextureAlphaClearer> alpha_clearer);
   void Dissociate();
 
   ~WebGPUMailboxTexture();
@@ -90,6 +92,7 @@
   uint32_t wire_texture_generation_ = 0;
   std::unique_ptr<RecyclableCanvasResource> recyclable_canvas_resource_;
   bool needs_present_ = false;
+  scoped_refptr<WebGPUTextureAlphaClearer> alpha_clearer_;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/gpu/webgpu_texture_alpha_clearer.cc b/third_party/blink/renderer/platform/graphics/gpu/webgpu_texture_alpha_clearer.cc
new file mode 100644
index 0000000..1aa6962
--- /dev/null
+++ b/third_party/blink/renderer/platform/graphics/gpu/webgpu_texture_alpha_clearer.cc
@@ -0,0 +1,120 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "third_party/blink/renderer/platform/graphics/gpu/webgpu_texture_alpha_clearer.h"
+
+namespace blink {
+
+WebGPUTextureAlphaClearer::WebGPUTextureAlphaClearer(
+    scoped_refptr<DawnControlClientHolder> dawn_control_client,
+    WGPUDevice device,
+    WGPUTextureFormat format)
+    : dawn_control_client_(std::move(dawn_control_client)),
+      device_(device),
+      format_(format) {
+  const auto& procs = dawn_control_client_->GetProcs();
+
+  procs.deviceReference(device_);
+
+  WGPUShaderModuleWGSLDescriptor wgsl_desc = {
+      .chain = {.sType = WGPUSType_ShaderModuleWGSLDescriptor},
+      .source = R"(
+    @vertex fn vert_main(@builtin(vertex_index) VertexIndex : u32) -> @builtin(position) vec4<f32> {
+        var pos = array<vec2<f32>, 3>(
+            vec2<f32>(-1.0, -1.0),
+            vec2<f32>( 3.0, -1.0),
+            vec2<f32>(-1.0,  3.0));
+        return vec4<f32>(pos[VertexIndex], 0.0, 1.0);
+    }
+
+    @fragment fn frag_main() -> @location(0) vec4<f32> {
+        return vec4<f32>(1.0);
+    }
+    )",
+  };
+  WGPUShaderModuleDescriptor shader_module_desc = {.nextInChain =
+                                                       &wgsl_desc.chain};
+  WGPUShaderModule shader_module =
+      procs.deviceCreateShaderModule(device_, &shader_module_desc);
+
+  WGPUColorTargetState color_target = {
+      .format = format,
+      .writeMask = WGPUColorWriteMask_Alpha,
+  };
+  WGPUFragmentState fragment = {
+      .module = shader_module,
+      .entryPoint = "frag_main",
+      .targetCount = 1,
+      .targets = &color_target,
+  };
+  WGPURenderPipelineDescriptor pipeline_desc = {
+      .vertex =
+          {
+              .module = shader_module,
+              .entryPoint = "vert_main",
+          },
+      .primitive = {.topology = WGPUPrimitiveTopology_TriangleList},
+      .multisample = {.count = 1, .mask = 0xFFFFFFFF},
+      .fragment = &fragment,
+  };
+  alpha_to_one_pipeline_ =
+      procs.deviceCreateRenderPipeline(device_, &pipeline_desc);
+  procs.shaderModuleRelease(shader_module);
+}
+
+WebGPUTextureAlphaClearer::~WebGPUTextureAlphaClearer() {
+  const auto& procs = dawn_control_client_->GetProcs();
+  procs.renderPipelineRelease(alpha_to_one_pipeline_);
+  procs.deviceRelease(device_);
+}
+
+bool WebGPUTextureAlphaClearer::IsCompatible(WGPUDevice device,
+                                             WGPUTextureFormat format) const {
+  return device_ == device && format_ == format;
+}
+
+void WebGPUTextureAlphaClearer::ClearAlpha(WGPUTexture texture) {
+  const auto& procs = dawn_control_client_->GetProcs();
+
+  WGPUTextureView attachment_view = procs.textureCreateView(texture, nullptr);
+
+  WGPUDawnEncoderInternalUsageDescriptor internal_usage_desc = {
+      .chain = {.sType = WGPUSType_DawnEncoderInternalUsageDescriptor},
+      .useInternalUsages = true,
+  };
+  WGPUCommandEncoderDescriptor command_encoder_desc = {
+      .nextInChain = &internal_usage_desc.chain,
+  };
+  WGPUCommandEncoder command_encoder =
+      procs.deviceCreateCommandEncoder(device_, &command_encoder_desc);
+
+  WGPURenderPassColorAttachment color_attachment = {
+      .view = attachment_view,
+      .loadOp = WGPULoadOp_Load,
+      .storeOp = WGPUStoreOp_Store,
+  };
+  WGPURenderPassDescriptor render_pass_desc = {
+      .colorAttachmentCount = 1,
+      .colorAttachments = &color_attachment,
+  };
+  WGPURenderPassEncoder pass =
+      procs.commandEncoderBeginRenderPass(command_encoder, &render_pass_desc);
+  DCHECK(alpha_to_one_pipeline_);
+  procs.renderPassEncoderSetPipeline(pass, alpha_to_one_pipeline_);
+  procs.renderPassEncoderDraw(pass, 3, 1, 0, 0);
+  procs.renderPassEncoderEnd(pass);
+
+  WGPUCommandBuffer command_buffer =
+      procs.commandEncoderFinish(command_encoder, nullptr);
+
+  WGPUQueue queue = procs.deviceGetQueue(device_);
+  procs.queueSubmit(queue, 1, &command_buffer);
+
+  procs.renderPassEncoderRelease(pass);
+  procs.commandEncoderRelease(command_encoder);
+  procs.commandBufferRelease(command_buffer);
+  procs.textureViewRelease(attachment_view);
+}
+
+}  // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/gpu/webgpu_texture_alpha_clearer.h b/third_party/blink/renderer/platform/graphics/gpu/webgpu_texture_alpha_clearer.h
new file mode 100644
index 0000000..6d2dcd8b
--- /dev/null
+++ b/third_party/blink/renderer/platform/graphics/gpu/webgpu_texture_alpha_clearer.h
@@ -0,0 +1,39 @@
+// Copyright 2022 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_GPU_WEBGPU_TEXTURE_ALPHA_CLEARER_H_
+#define THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_GPU_WEBGPU_TEXTURE_ALPHA_CLEARER_H_
+
+#include <dawn/webgpu.h>
+
+#include "third_party/blink/renderer/platform/graphics/gpu/dawn_control_client_holder.h"
+#include "third_party/blink/renderer/platform/platform_export.h"
+#include "third_party/blink/renderer/platform/wtf/ref_counted.h"
+
+namespace blink {
+
+class PLATFORM_EXPORT WebGPUTextureAlphaClearer final
+    : public WTF::RefCounted<WebGPUTextureAlphaClearer> {
+ public:
+  WebGPUTextureAlphaClearer(
+      scoped_refptr<DawnControlClientHolder> dawn_control_client,
+      WGPUDevice device,
+      WGPUTextureFormat format);
+
+  bool IsCompatible(WGPUDevice device, WGPUTextureFormat format) const;
+  void ClearAlpha(WGPUTexture texture);
+
+ private:
+  friend class WTF::RefCounted<WebGPUTextureAlphaClearer>;
+  ~WebGPUTextureAlphaClearer();
+
+  const scoped_refptr<DawnControlClientHolder> dawn_control_client_;
+  const WGPUDevice device_;
+  const WGPUTextureFormat format_;
+  WGPURenderPipeline alpha_to_one_pipeline_ = nullptr;
+};
+
+}  // namespace blink
+
+#endif  // THIRD_PARTY_BLINK_RENDERER_PLATFORM_GRAPHICS_GPU_WEBGPU_TEXTURE_ALPHA_CLEARER_H_
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5
index 49e2693..7b966eb 100644
--- a/third_party/blink/renderer/platform/runtime_enabled_features.json5
+++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -707,7 +707,7 @@
     },
     {
       name: "CSSLastBaseline",
-      status: "experimental",
+      status: "stable",
     },
     {
       name: "CSSLayoutAPI",
@@ -1146,23 +1146,24 @@
     },
     {
       name: "FedCm",
-      origin_trial_feature_name: "FedCM",
-      origin_trial_allows_third_party: true,
       public: true,
-      status: "test",
+      status: "stable",
     },
     {
       name: "FedCmIdpSigninStatus",
+      depends_on: ["FedCm"],
       public: true,
       status: "test",
     },
     {
       name: "FedCmIdpSignout",
+      depends_on: ["FedCm"],
       public: true,
       status: "test",
     },
     {
       name: "FedCmIframeSupport",
+      depends_on: ["FedCm"],
       public: true,
       status: "test",
     },
@@ -2485,6 +2486,7 @@
     {
       name: "StorageBuckets",
       status: "experimental",
+      base_feature: "StorageBuckets",
     },
     {
       name: "StorageFoundationAPI",
diff --git a/third_party/blink/renderer/platform/wtf/cross_thread_copier_base.h b/third_party/blink/renderer/platform/wtf/cross_thread_copier_base.h
index 944cceb..5aa005b 100644
--- a/third_party/blink/renderer/platform/wtf/cross_thread_copier_base.h
+++ b/third_party/blink/renderer/platform/wtf/cross_thread_copier_base.h
@@ -32,6 +32,7 @@
 #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_CROSS_THREAD_COPIER_BASE_H_
 
 #include "base/files/file.h"
+#include "base/files/file_error_or.h"
 #include "base/memory/scoped_refptr.h"
 #include "base/memory/weak_ptr.h"
 #include "third_party/blink/renderer/platform/wtf/cross_thread_copier.h"
@@ -39,8 +40,6 @@
 namespace base {
 template <typename, typename>
 class RefCountedThreadSafe;
-template <typename>
-class FileErrorOr;
 class TimeDelta;
 class TimeTicks;
 class Time;
diff --git a/third_party/blink/tools/blinkpy/common/net/web.py b/third_party/blink/tools/blinkpy/common/net/web.py
index 049f8af..d717d5fa 100644
--- a/third_party/blink/tools/blinkpy/common/net/web.py
+++ b/third_party/blink/tools/blinkpy/common/net/web.py
@@ -49,11 +49,13 @@
             return_none_on_404=return_none_on_404).run(make_request)
 
     def request(self, method, url, data=None, headers=None):
-        return self.session.request(method.lower(),
-                                    url,
-                                    data=data,
-                                    headers=headers,
-                                    stream=True)
+        response = self.session.request(method.lower(),
+                                        url,
+                                        data=data,
+                                        headers=headers,
+                                        stream=True)
+        response.raise_for_status()
+        return response
 
     def request_and_read(self, *args, **kwargs):
         response = self.request(*args, **kwargs)
diff --git a/third_party/blink/tools/blinkpy/common/net/web_mock.py b/third_party/blink/tools/blinkpy/common/net/web_mock.py
index 3159eab8..9e2ef8b 100644
--- a/third_party/blink/tools/blinkpy/common/net/web_mock.py
+++ b/third_party/blink/tools/blinkpy/common/net/web_mock.py
@@ -29,6 +29,7 @@
 import json
 from requests.exceptions import HTTPError
 from requests import Response
+from requests.structures import CaseInsensitiveDict
 
 from blinkpy.common.net.rpc import RESPONSE_PREFIX
 
@@ -75,11 +76,7 @@
         self.body = values.get('body', '')
         # The name of the headers (keys) are case-insensitive, and values are stripped.
         headers_raw = values.get('headers', {})
-        self.headers = {
-            key.lower(): value.strip()
-            for key, value in headers_raw.items()
-        }
-        self._info = MockInfo(self.headers)
+        self.headers = CaseInsensitiveDict(headers_raw)
 
         if int(self.status_code) >= 400:
             response = Response()
@@ -92,19 +89,5 @@
     def getcode(self):
         return self.status_code
 
-    def getheader(self, header):
-        return self.headers.get(header.lower(), None)
-
     def json(self):
         return json.loads(self.body)
-
-    def info(self):
-        return self._info
-
-
-class MockInfo(object):
-    def __init__(self, headers):
-        self._headers = headers
-
-    def getheader(self, header):
-        return self._headers.get(header.lower(), None)
diff --git a/third_party/blink/tools/blinkpy/w3c/wpt_github.py b/third_party/blink/tools/blinkpy/w3c/wpt_github.py
index e4324dd..b4a0f69 100644
--- a/third_party/blink/tools/blinkpy/w3c/wpt_github.py
+++ b/third_party/blink/tools/blinkpy/w3c/wpt_github.py
@@ -488,11 +488,8 @@
     def getheader(self, header):
         """Gets the value of the header with the given name.
 
-        Delegates to HTTPMessage.getheader(), which is case-insensitive."""
-        if six.PY3:
-            return self._raw_response.getheader(header)
-        else:
-            return self._raw_response.info().getheader(header)
+        Delegates to request.Response.headers, which is case-insensitive."""
+        return self._raw_response.headers.get(header)
 
 
 class GitHubError(Exception):
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index 0788300..4cd0890 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -307,6 +307,7 @@
 crbug.com/1351556 virtual/document-transition/document-transition/capture-callback-exception.html [ Failure ]
 crbug.com/1351556 virtual/document-transition-wide-gamut/document-transition/capture-callback-exception.html [ Failure ]
 crbug.com/1366886 [ Mac12-arm64 ] virtual/document-transition-wide-gamut/wpt_internal/document-transition/iframe-transition.sub.html [ Failure Timeout ]
+crbug.com/1366886 [ Mac11-arm64 ] virtual/document-transition-wide-gamut/wpt_internal/document-transition/iframe-transition.sub.html [ Failure Timeout ]
 
 ########## Ref tests can't be rebaselined ##########
 crbug.com/619103 paint/invalidation/background/background-resize-width.html [ Failure Pass ]
@@ -7267,4 +7268,4 @@
 crbug.com/1349331 http/tests/devtools/oopif/oopif-storage.js [ Skip ]
 
 # Sheriff 2022-10-12
-crbug.com/1367495 [ Debug Linux ] virtual/threaded-no-composited-antialiasing/animations/direction-and-fill/animation-direction-reverse-timing-functions.html [ Failure Pass ]
\ No newline at end of file
+crbug.com/1367495 [ Debug Linux ] virtual/threaded-no-composited-antialiasing/animations/direction-and-fill/animation-direction-reverse-timing-functions.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/css3/filters/effect-reference-hidpi-hw.html b/third_party/blink/web_tests/css3/filters/effect-reference-hidpi-hw.html
index 5e324de..2d1a981 100644
--- a/third_party/blink/web_tests/css3/filters/effect-reference-hidpi-hw.html
+++ b/third_party/blink/web_tests/css3/filters/effect-reference-hidpi-hw.html
@@ -1,12 +1,10 @@
 <script>
-    function startTest() {
-        if (window.testRunner) {
-            testRunner.waitUntilDone();
-            testRunner.setBackingScaleFactor(2, function() { testRunner.notifyDone(); });
-        }
+    if (window.testRunner) {
+        testRunner.waitUntilDone();
+        testRunner.setBackingScaleFactor(2, function() { testRunner.notifyDone(); });
     }
 </script>
-<body onload="startTest();"></body>
+<body></body>
 <svg xmlns="http://www.w3.org/2000/svg" width="0" height="0" version="1.1">
   <defs>
     <filter id="displacement" color-interpolation-filters="sRGB">
diff --git a/third_party/blink/web_tests/dark-mode/colors/selection.html b/third_party/blink/web_tests/dark-mode/colors/selection.html
index a961f3739..9eede25 100644
--- a/third_party/blink/web_tests/dark-mode/colors/selection.html
+++ b/third_party/blink/web_tests/dark-mode/colors/selection.html
@@ -1,15 +1,17 @@
 <!DOCTYPE html>
 <style>
-body {
-  background-color: #808080;
-}
 .block {
   font-size: 20px;
-  height: 50px;
+  height: 40px;
   margin: 10px;
   padding: 10px;
   border: 1px solid #000;
 }
+
+.background {
+  background-color: #808080;
+}
+
 .selectionbw::selection {
   color: black;
   background-color: white;
@@ -30,13 +32,26 @@
 <div id="selectionstart" class="block selectionbw">
     selection style of black on white
 </div>
-<div id="selectionend" class="block selectionwb">
+<div class="block selectionbw background">
+    selection style of black on white
+</div>
+<div class="block selectionwb">
     selection style of white on black
 </div>
+<div id="selectionend" class="block selectionwb background">
+    selection style of white on black
+</div>
+
 <div id="highlightstart" class="block highlightbw">
     highlight style of white on black
 </div>
-<div id="highlightend" class="block highlightwb">
+<div class="block highlightbw background">
+    highlight style of white on black
+</div>
+<div class="block highlightwb">
+    highlight style of black on white
+</div>
+<div id="highlightend" class="block highlightwb background">
     highlight style of black on white
 </div>
 <script>
@@ -44,9 +59,8 @@
     selectionRange.setStartBefore(document.getElementById('selectionstart'));
     selectionRange.setEndAfter(document.getElementById('selectionend'));
     window.getSelection().addRange(selectionRange);
-
     let highlightRange = new Range();
     highlightRange.setStartBefore(document.getElementById('highlightstart'));
     highlightRange.setEndAfter(document.getElementById('highlightend'));
     CSS.highlights.set('highlight', new Highlight(highlightRange));
-</script>
+</script>
\ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/css/css-conditional/at-supports-046.html.ini b/third_party/blink/web_tests/external/wpt/css/css-conditional/at-supports-046.html.ini
new file mode 100644
index 0000000..4f07d8f
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-conditional/at-supports-046.html.ini
@@ -0,0 +1,2 @@
+[at-supports-046.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-conditional/at-supports-namespace-001.html.ini b/third_party/blink/web_tests/external/wpt/css/css-conditional/at-supports-namespace-001.html.ini
new file mode 100644
index 0000000..72d1a73
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-conditional/at-supports-namespace-001.html.ini
@@ -0,0 +1,2 @@
+[at-supports-namespace-001.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-conditional/at-supports-namespace-002.html.ini b/third_party/blink/web_tests/external/wpt/css/css-conditional/at-supports-namespace-002.html.ini
new file mode 100644
index 0000000..dd9aed65
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-conditional/at-supports-namespace-002.html.ini
@@ -0,0 +1,2 @@
+[at-supports-namespace-002.html]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-conditional/css-supports-040.xht.ini b/third_party/blink/web_tests/external/wpt/css/css-conditional/css-supports-040.xht.ini
new file mode 100644
index 0000000..0d8be8d
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-conditional/css-supports-040.xht.ini
@@ -0,0 +1,2 @@
+[css-supports-040.xht]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-conditional/css-supports-041.xht.ini b/third_party/blink/web_tests/external/wpt/css/css-conditional/css-supports-041.xht.ini
new file mode 100644
index 0000000..0abe17cb
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-conditional/css-supports-041.xht.ini
@@ -0,0 +1,2 @@
+[css-supports-041.xht]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-conditional/css-supports-042.xht.ini b/third_party/blink/web_tests/external/wpt/css/css-conditional/css-supports-042.xht.ini
new file mode 100644
index 0000000..eb12d74
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-conditional/css-supports-042.xht.ini
@@ -0,0 +1,2 @@
+[css-supports-042.xht]
+  expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-conditional/js/CSS-supports-CSSStyleDeclaration.html.ini b/third_party/blink/web_tests/external/wpt/css/css-conditional/js/CSS-supports-CSSStyleDeclaration.html.ini
new file mode 100644
index 0000000..c90e8e2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-conditional/js/CSS-supports-CSSStyleDeclaration.html.ini
@@ -0,0 +1,60 @@
+[CSS-supports-CSSStyleDeclaration.html]
+  [-epub-caption-side: _camel_cased_attribute v. CSS.supports]
+    expected: FAIL
+
+  [-epub-text-combine: _camel_cased_attribute v. CSS.supports]
+    expected: FAIL
+
+  [-epub-text-emphasis: _camel_cased_attribute v. CSS.supports]
+    expected: FAIL
+
+  [-epub-text-emphasis-color: _camel_cased_attribute v. CSS.supports]
+    expected: FAIL
+
+  [-epub-text-emphasis-style: _camel_cased_attribute v. CSS.supports]
+    expected: FAIL
+
+  [-epub-text-orientation: _camel_cased_attribute v. CSS.supports]
+    expected: FAIL
+
+  [-epub-text-transform: _camel_cased_attribute v. CSS.supports]
+    expected: FAIL
+
+  [-epub-word-break: _camel_cased_attribute v. CSS.supports]
+    expected: FAIL
+
+  [-epub-writing-mode: _camel_cased_attribute v. CSS.supports]
+    expected: FAIL
+
+  [font-display: _camel_cased_attribute v. CSS.supports]
+    expected: FAIL
+
+  [font-display: _dashed_attribute v. CSS.supports]
+    expected: FAIL
+
+  [inherits: _camel_cased_attribute v. CSS.supports]
+    expected: FAIL
+
+  [initial-value: _camel_cased_attribute v. CSS.supports]
+    expected: FAIL
+
+  [initial-value: _dashed_attribute v. CSS.supports]
+    expected: FAIL
+
+  [speak-as: _camel_cased_attribute v. CSS.supports]
+    expected: FAIL
+
+  [speak-as: _dashed_attribute v. CSS.supports]
+    expected: FAIL
+
+  [src: _camel_cased_attribute v. CSS.supports]
+    expected: FAIL
+
+  [syntax: _camel_cased_attribute v. CSS.supports]
+    expected: FAIL
+
+  [unicode-range: _camel_cased_attribute v. CSS.supports]
+    expected: FAIL
+
+  [unicode-range: _dashed_attribute v. CSS.supports]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/css/css-conditional/js/supports-conditionText.html.ini b/third_party/blink/web_tests/external/wpt/css/css-conditional/js/supports-conditionText.html.ini
new file mode 100644
index 0000000..f7cf2cf8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-conditional/js/supports-conditionText.html.ini
@@ -0,0 +1,12 @@
+[supports-conditionText.html]
+  [conditionText getter for @supports ()]
+    expected: FAIL
+
+  [conditionText getter for @supports func()]
+    expected: FAIL
+
+  [conditionText getter for @supports (())]
+    expected: FAIL
+
+  [conditionText getter for @supports (func())]
+    expected: FAIL
diff --git a/third_party/blink/web_tests/fast/scrolling/overflow-scrollability.html b/third_party/blink/web_tests/fast/scrolling/overflow-scrollability.html
index c15a887f..7ba20bcf 100644
--- a/third_party/blink/web_tests/fast/scrolling/overflow-scrollability.html
+++ b/third_party/blink/web_tests/fast/scrolling/overflow-scrollability.html
@@ -65,7 +65,13 @@
 
 <script>
   const mouse = GestureSourceType.MOUSE_INPUT;
-  const pixelsToScroll = 10;
+  const pixelsToScroll = pixelsPerTick();
+
+  async function waitForScroll(scrollPosFunc, target, errorMesage) {
+    await waitFor(() => {
+      return Math.abs(scrollPosFunc() - target) < 0.01;
+    }, errorMesage);
+  }
 
   async function testScrollable(div_id, can_scroll) {
     let div = document.getElementById(div_id);
@@ -80,9 +86,13 @@
     await smoothScroll(pixelsToScroll, x, y, mouse, 'down',
                        SPEED_INSTANT, false /* precise_scrolling_deltas */);
     let assertDescription = `${div_id} vertical scroll failed`;
-    if (can_scroll)
-      assert_approx_equals(div.scrollTop, expectedScroll.y, 0.01, assertDescription);
-    else {
+    if (can_scroll) {
+      waitForScroll(() => div.scrollTop, expectedScroll.y,
+                    assertDescription);
+    } else {
+      // Wait a few frames before checking to ensure the div doesn't scroll.
+      await raf();
+      await raf();
       assert_equals(div.scrollTop, 0, assertDescription);
     }
 
@@ -90,8 +100,12 @@
                        SPEED_INSTANT, false /* precise_scrolling_deltas */);
     assertDescription = `${div_id} horizontal scroll failed`;
     if (can_scroll) {
+      waitForScroll(() => div.scrollLeft, expectedScroll.x,
+                    assertDescription);
       assert_approx_equals(div.scrollLeft, expectedScroll.x, 0.01, assertDescription);
     } else {
+      await raf();
+      await raf();
       assert_equals(div.scrollLeft, 0, assertDescription);
     }
   }
@@ -113,4 +127,4 @@
     }, 'This tests that scrollable areas with the appropriate overflow mode set'
       + ' are in fact scrollable by the user.');
   };
-</script>
\ No newline at end of file
+</script>
diff --git a/third_party/blink/web_tests/platform/linux/dark-mode/colors/selection-expected.png b/third_party/blink/web_tests/platform/linux/dark-mode/colors/selection-expected.png
index 231145c4..4b68490 100644
--- a/third_party/blink/web_tests/platform/linux/dark-mode/colors/selection-expected.png
+++ b/third_party/blink/web_tests/platform/linux/dark-mode/colors/selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/selection-expected.png b/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/selection-expected.png
index 04af6ba..c575934 100644
--- a/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/selection-expected.png
+++ b/third_party/blink/web_tests/platform/linux/virtual/dark-mode-default/dark-mode/colors/selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/dark-mode/colors/selection-expected.png b/third_party/blink/web_tests/platform/mac/dark-mode/colors/selection-expected.png
index b10f58a..a193e576 100644
--- a/third_party/blink/web_tests/platform/mac/dark-mode/colors/selection-expected.png
+++ b/third_party/blink/web_tests/platform/mac/dark-mode/colors/selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/selection-expected.png b/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/selection-expected.png
index 8a02f2c..d839e025 100644
--- a/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/selection-expected.png
+++ b/third_party/blink/web_tests/platform/mac/virtual/dark-mode-default/dark-mode/colors/selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/dark-mode/colors/selection-expected.png b/third_party/blink/web_tests/platform/win/dark-mode/colors/selection-expected.png
index 18648fc..fdc9db2 100644
--- a/third_party/blink/web_tests/platform/win/dark-mode/colors/selection-expected.png
+++ b/third_party/blink/web_tests/platform/win/dark-mode/colors/selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/selection-expected.png b/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/selection-expected.png
index ea1d3a8..85e932d 100644
--- a/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/selection-expected.png
+++ b/third_party/blink/web_tests/platform/win/virtual/dark-mode-default/dark-mode/colors/selection-expected.png
Binary files differ
diff --git a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
index a09c54f..09c9dc6d 100644
--- a/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
+++ b/third_party/blink/web_tests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -4250,6 +4250,10 @@
     attribute @@toStringTag
     method constructor
     method getFrequencyResponse
+interface IdentityCredential : Credential
+    attribute @@toStringTag
+    getter token
+    method constructor
 interface IdleDeadline
     attribute @@toStringTag
     getter didTimeout
diff --git a/third_party/leveldatabase/env_chromium.cc b/third_party/leveldatabase/env_chromium.cc
index 05408ee9..a885e871 100644
--- a/third_party/leveldatabase/env_chromium.cc
+++ b/third_party/leveldatabase/env_chromium.cc
@@ -223,7 +223,7 @@
     if (!handle) {
       int flags = base::File::FLAG_READ | base::File::FLAG_OPEN;
       FileErrorOr<base::File> result = filesystem_->OpenFile(filepath_, flags);
-      if (result.is_error()) {
+      if (!result.has_value()) {
         return MakeIOError(filepath_.AsUTF8Unsafe(), "Could not perform read",
                            kRandomAccessFileRead);
       }
@@ -323,7 +323,7 @@
   FilePath path = FilePath::FromUTF8Unsafe(parent_dir_);
   FileErrorOr<base::File> result = filesystem_->OpenFile(
       path, base::File::FLAG_OPEN | base::File::FLAG_READ);
-  if (result.is_error()) {
+  if (!result.has_value()) {
     return MakeIOError(parent_dir_, "Unable to open directory", kSyncParent,
                        result.error());
   }
@@ -784,7 +784,7 @@
   FileErrorOr<std::vector<base::FilePath>> result =
       filesystem_->GetDirectoryEntries(
           dir, storage::FilesystemProxy::DirectoryEntryType::kFilesOnly);
-  if (result.is_error())
+  if (!result.has_value())
     return;
 
   for (const auto& path : result.value()) {
@@ -808,7 +808,7 @@
       filesystem_->GetDirectoryEntries(
           dir_path,
           storage::FilesystemProxy::DirectoryEntryType::kFilesAndDirectories);
-  if (entries_result.is_error()) {
+  if (!entries_result.has_value()) {
     return MakeIOError(dir, "Could not open/read directory", kGetChildren,
                        entries_result.error());
   }
@@ -892,11 +892,11 @@
   const base::FilePath path = base::FilePath::FromUTF8Unsafe(fname);
   Retrier retrier;
   FileErrorOr<std::unique_ptr<storage::FilesystemProxy::FileLock>> lock_result =
-      base::File::Error::FILE_ERROR_FAILED;
+      base::unexpected(base::File::Error::FILE_ERROR_FAILED);
   do {
     lock_result = filesystem_->LockFile(path);
-  } while (lock_result.is_error() && retrier.ShouldKeepTrying());
-  if (lock_result.is_error()) {
+  } while (!lock_result.has_value() && retrier.ShouldKeepTrying());
+  if (!lock_result.has_value()) {
     return MakeIOError(fname, FileErrorString(lock_result.error()), kLockFile,
                        lock_result.error());
   }
@@ -938,7 +938,7 @@
   FilePath path = FilePath::FromUTF8Unsafe(fname);
   FileErrorOr<base::File> open_result = filesystem_->OpenFile(
       path, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
-  if (open_result.is_error()) {
+  if (!open_result.has_value()) {
     *result = nullptr;
     return MakeIOError(fname, "Unable to create log file", kNewLogger,
                        open_result.error());
@@ -953,7 +953,7 @@
   FilePath path = FilePath::FromUTF8Unsafe(fname);
   FileErrorOr<base::File> open_result = filesystem_->OpenFile(
       path, base::File::FLAG_OPEN | base::File::FLAG_READ);
-  if (open_result.is_error()) {
+  if (!open_result.has_value()) {
     *result = nullptr;
     return MakeIOError(fname, "Unable to create sequential file",
                        kNewSequentialFile, open_result.error());
@@ -968,7 +968,7 @@
   base::FilePath file_path = FilePath::FromUTF8Unsafe(fname);
   FileErrorOr<base::File> open_result = filesystem_->OpenFile(
       file_path, base::File::FLAG_READ | base::File::FLAG_OPEN);
-  if (!open_result.is_error()) {
+  if (open_result.has_value()) {
     base::File file = std::move(open_result.value());
     if (file_cache_) {
       *result = new ChromiumEvictableRandomAccessFile(
@@ -990,7 +990,7 @@
   FilePath path = FilePath::FromUTF8Unsafe(fname);
   FileErrorOr<base::File> open_result = filesystem_->OpenFile(
       path, base::File::FLAG_CREATE_ALWAYS | base::File::FLAG_WRITE);
-  if (open_result.is_error()) {
+  if (!open_result.has_value()) {
     *result = nullptr;
     return MakeIOError(fname, "Unable to create writable file",
                        kNewWritableFile, open_result.error());
@@ -1005,7 +1005,7 @@
   FilePath path = FilePath::FromUTF8Unsafe(fname);
   FileErrorOr<base::File> open_result = filesystem_->OpenFile(
       path, base::File::FLAG_OPEN_ALWAYS | base::File::FLAG_APPEND);
-  if (open_result.is_error()) {
+  if (!open_result.has_value()) {
     *result = nullptr;
     return MakeIOError(fname, "Unable to create appendable file",
                        kNewAppendableFile, open_result.error());
diff --git a/third_party/libavif/BUILD.gn b/third_party/libavif/BUILD.gn
index 0b52ea48..6d0ffdc 100644
--- a/third_party/libavif/BUILD.gn
+++ b/third_party/libavif/BUILD.gn
@@ -12,7 +12,6 @@
     "src/src/avif.c",
     "src/src/colr.c",
     "src/src/diag.c",
-    "src/src/exif.c",
     "src/src/io.c",
     "src/src/mem.c",
     "src/src/obu.c",
diff --git a/third_party/minizip/DIR_METADATA b/third_party/minizip/DIR_METADATA
index 5345fc2..e9400b87 100644
--- a/third_party/minizip/DIR_METADATA
+++ b/third_party/minizip/DIR_METADATA
@@ -1,3 +1 @@
-monorail: {
-  component: "Platform>Apps>FileManager"
-}
+mixins: "//ui/file_manager/COMMON_METADATA"
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index 66431d8c..4167be0 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -241,6 +241,10 @@
   <int value="52" label="FLAG_REQUEST_MULTI_FINGER_GESTURES"/>
   <int value="53" label="FLAG_REQUEST_SHORTCUT_WARNING_DIALOG_SPOKEN_FEEDBACK"/>
   <int value="54" label="FLAG_SERVICE_HANDLES_DOUBLE_TAP"/>
+  <int value="55" label="SERVICE_TYPE_ASSISTIVE_TECH_WITH_PASSWORD_MANAGER"/>
+  <int value="56" label="SERVICE_TYPE_ASSISTIVE_TECH_WITH_UNKNOWN"/>
+  <int value="57" label="SERVICE_TYPE_PASSWORD_MANAGER_WITH_UNKNOWN"/>
+  <int value="58" label="SERVICE_TYPE_ALL_VARIANTS"/>
 </enum>
 
 <enum name="AccessibilityATKAPIEnum">
@@ -9221,6 +9225,21 @@
   <int value="762"
       label="CREDIT_CARD_STANDALONE_VERIFICATION_CODE - Predictions different
              - Value agrees with both predictions"/>
+  <int value="769" label="NUMERIC_QUANTITY - Predictions equal - Value agrees"/>
+  <int value="770"
+      label="NUMERIC_QUANTITY - Predictions equal - Value disagrees"/>
+  <int value="771"
+      label="NUMERIC_QUANTITY - Predictions different - Value agrees with old
+             prediction"/>
+  <int value="772"
+      label="NUMERIC_QUANTITY - Predictions different - Value agrees with new
+             prediction"/>
+  <int value="773"
+      label="NUMERIC_QUANTITY - Predictions different - Value agrees with
+             neither prediction"/>
+  <int value="774"
+      label="NUMERIC_QUANTITY - Predictions different - Value agrees with
+             both predictions"/>
 </enum>
 
 <enum name="AutofillPredictionSource">
@@ -9501,6 +9520,7 @@
   <int value="125" label="IBAN_VALUE"/>
   <int value="126" label="CREDIT_CARD_STANDALONE_VERIFICATION_CODE"/>
   <int value="127" label="RESERVED"/>
+  <int value="128" label="NUMERIC_QUANTITY"/>
 </enum>
 
 <enum name="AutofillServerPredictionAvailability">
@@ -29078,6 +29098,7 @@
   <int value="7" label="Failed to Serialize the Response"/>
   <int value="8" label="Serialized Response is Empty"/>
   <int value="9" label="Success"/>
+  <int value="10" label="Failed to Serialize the Signals"/>
 </enum>
 
 <enum name="DTEnrollmentStatus">
@@ -46713,13 +46734,6 @@
   <int value="3" label="Three months"/>
 </enum>
 
-<enum name="GeopositionErrorCode">
-  <int value="0" label="There was no error"/>
-  <int value="1" label="User denied use of geolocation"/>
-  <int value="2" label="Geoposition could not be determined"/>
-  <int value="3" label="Timeout"/>
-</enum>
-
 <enum name="GestureEventFilterResults">
   <int value="0"
       label="GestureScrollBegin allowed by main thread touch action"/>
@@ -62883,6 +62897,7 @@
   <int value="1605611615" label="enable-webrtc-srtp-aes-gcm"/>
   <int value="1607541874" label="SettingsLandingPageRedesign:enabled"/>
   <int value="1609059016" label="CupsIppPrintingBackend:enabled"/>
+  <int value="1609219232" label="AutofillImprovedLabelForInference:disabled"/>
   <int value="1611265771" label="Win10TabSearchCaptionButton:enabled"/>
   <int value="1611522475" label="AutofillPrimaryInfoStyleExperiment:disabled"/>
   <int value="1612206633" label="CCTModuleCustomHeader:enabled"/>
@@ -63327,6 +63342,7 @@
   <int value="1875156497" label="CaptureMode:enabled"/>
   <int value="1877769074" label="PhoneHubFeatureSetupErrorHandling:enabled"/>
   <int value="1878331098" label="GuestViewCrossProcessFrames:enabled"/>
+  <int value="1879542762" label="AutofillImprovedLabelForInference:enabled"/>
   <int value="1880955305" label="enable-preconnect-to-search"/>
   <int value="1881036528" label="disable-multilingual-spellchecker"/>
   <int value="1881174782" label="disable-brotli"/>
diff --git a/tools/metrics/histograms/metadata/accessibility/histograms.xml b/tools/metrics/histograms/metadata/accessibility/histograms.xml
index f6b9719..a9cce571 100644
--- a/tools/metrics/histograms/metadata/accessibility/histograms.xml
+++ b/tools/metrics/histograms/metadata/accessibility/histograms.xml
@@ -301,11 +301,12 @@
 </histogram>
 
 <histogram name="Accessibility.AndroidServiceInfo"
-    enum="AccessibilityAndroidServiceInfoEnum" expires_after="2022-11-18">
+    enum="AccessibilityAndroidServiceInfoEnum" expires_after="M109">
   <owner>aleventhal@chromium.org</owner>
   <owner>mschillaci@chromium.org</owner>
   <owner>chrome-a11y-core@google.com</owner>
   <summary>
+    Deprecated as of 10/2022, M109. Now using the per-variant enum (below).
     Tracks flags and capabilities of enabled accessibility services. Recorded
     every time an Android web content view first creates a virtual view
     hierarchy, indicating that some accessibility service is running. The number
@@ -316,6 +317,32 @@
   </summary>
 </histogram>
 
+<histogram name="Accessibility.AndroidServiceInfo.{RunningApps}"
+    enum="AccessibilityAndroidServiceInfoEnum" expires_after="2023-07-01">
+  <owner>mschillaci@google.com</owner>
+  <owner>aldietz@google.com</owner>
+  <owner>dtseng@chromium.org</owner>
+  <owner>chrome-a11y-core@google.com</owner>
+  <summary>
+    Tracks events, flags, feedback and capabilities of enabled accessibility
+    services separated into variants based on the types of running accessibility
+    services. This information would be a subset of the (now deprecated)
+    Accessibility.AndroidServiceInfo histogram. It will allow us to look at the
+    same histograms but only for a subset of users (e.g. what are the requested
+    flags etc of enabled accessibility services for clients running only a
+    password manager).
+  </summary>
+  <token key="RunningApps">
+    <variant name="ALL_VARIANTS"/>
+    <variant name="ASSISTIVE_TECH"/>
+    <variant name="ASSISTIVE_TECH_WITH_PASSWORD_MANAGER"/>
+    <variant name="ASSISTIVE_TECH_WITH_UNKNOWN"/>
+    <variant name="PASSWORD_MANAGER"/>
+    <variant name="PASSWORD_MANAGER_WITH_UNKNOWN"/>
+    <variant name="UNKNOWN"/>
+  </token>
+</histogram>
+
 <histogram name="Accessibility.ATK-APIs" enum="AccessibilityATKAPIEnum"
     expires_after="2022-11-18">
   <owner>jdiggs@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index 492e1aef..87ed6b2d 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -1358,6 +1358,21 @@
   </summary>
 </histogram>
 
+<histogram name="Ash.DeskApi.{Method}.Result" units="BooleanSuccess"
+    expires_after="2023-10-07">
+  <owner>aprilzhou@chromium.org</owner>
+  <owner>janetmac@chromium.org</owner>
+  <summary>
+    Recorded when a desk API {Method} method succeeded or failed.
+  </summary>
+  <token key="Method">
+    <variant name="AllDesk" summary="set to all desks"/>
+    <variant name="LaunchDesk" summary="launch desk"/>
+    <variant name="RemoveDesk" summary="remove desk"/>
+    <variant name="SwitchDesk" summary="switch desk"/>
+  </token>
+</histogram>
+
 <histogram name="Ash.Desks.AnimationLatency.DeskActivation" units="ms"
     expires_after="2023-04-23">
   <owner>amusbach@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml
index 8a93992..3f314a1 100644
--- a/tools/metrics/histograms/metadata/autofill/histograms.xml
+++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -280,6 +280,18 @@
   <token key="Group" variants="Autofill.Ablation.Group"/>
 </histogram>
 
+<histogram
+    name="Autofill.AcceptedFilledFieldWithNumericQuantityHeuristicPrediction"
+    enum="Boolean" expires_after="M112">
+  <owner>koerber@google.com</owner>
+  <owner>chrome-autofill-alerts@google.com</owner>
+  <summary>
+    Logs if the filling of a field was accepted even though it had a
+    NUMERIC_QUANTITY prediction. This metric is only emitted if the feature to
+    grant the heuristic precedence is disabled. Emitted on submission time.
+  </summary>
+</histogram>
+
 <histogram name="Autofill.Address.IsEnabled.PageLoad" enum="BooleanEnabled"
     expires_after="2023-02-12">
   <owner>jsaul@google.com</owner>
@@ -2280,6 +2292,16 @@
   </summary>
 </histogram>
 
+<histogram name="Autofill.NumericQuantityCollidesWithServerPrediction"
+    enum="Boolean" expires_after="M112">
+  <owner>koerber@google.com</owner>
+  <owner>chrome-autofill-alerts@google.com</owner>
+  <summary>
+    Logs that a field with a heuristic prediction for an NUMERIC_QUANTITY
+    collides with a server prediction. The metric is emitted on form submission.
+  </summary>
+</histogram>
+
 <histogram name="Autofill.Offer.SelectedCardHasOffer"
     enum="AutofillCreditCardOfferSelection" expires_after="2023-08-01">
   <owner>siyua@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/geolocation/histograms.xml b/tools/metrics/histograms/metadata/geolocation/histograms.xml
index 8c9f1e2..62b53f0f 100644
--- a/tools/metrics/histograms/metadata/geolocation/histograms.xml
+++ b/tools/metrics/histograms/metadata/geolocation/histograms.xml
@@ -88,13 +88,6 @@
   </summary>
 </histogram>
 
-<histogram name="Geolocation.LocationUpdate.ErrorCode"
-    enum="GeopositionErrorCode" expires_after="2022-11-20">
-  <owner>mattreynolds@chromium.org</owner>
-  <owner>device-dev@chromium.org</owner>
-  <summary>Error code for the geoposition sent to the renderers.</summary>
-</histogram>
-
 <histogram name="Geolocation.NetworkLocationRequest.AccessPoints" units="units"
     expires_after="M85">
   <owner>mattreynolds@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/v8/histograms.xml b/tools/metrics/histograms/metadata/v8/histograms.xml
index 5783c05..2c90d1dc 100644
--- a/tools/metrics/histograms/metadata/v8/histograms.xml
+++ b/tools/metrics/histograms/metadata/v8/histograms.xml
@@ -1171,19 +1171,6 @@
   </summary>
 </histogram>
 
-<histogram name="V8.GCMainThreadMarkingThroughput" units="MB/s"
-    expires_after="2022-11-20">
-  <owner>mlippautz@chromium.org</owner>
-  <owner>v8-memory-sheriffs@google.com</owner>
-  <summary>
-    Marking throughput considering all durations of all marking phases on the
-    main thread and marked bytes within one V8 garbage collection cycle.
-    Reported once per garbage collection cycle. Only reported for platforms
-    supporting high resolution clocks and when more than 1MB of live objects
-    have been found.
-  </summary>
-</histogram>
-
 <histogram name="V8.GCMarkCompactReason" enum="GarbageCollectionReason"
     expires_after="2023-03-26">
   <owner>mlippautz@chromium.org</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index b82771b03..c8a6861 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,16 +5,16 @@
             "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell"
         },
         "win": {
-            "hash": "18dab85b6d7a0996c800e65ab496db03ec1297f1",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/c356fc671b3cbf3b3f4f1ba332ed6005c9d3f78b/trace_processor_shell.exe"
+            "hash": "27e80ba16d9c6e2283f3f1cab33fa391db47f298",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/4fcf7d61f3559fdb37fefda36e272f05e40f0fef/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "58893933be305d3bfe0a72ebebcacde2ac3ca893",
             "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell"
         },
         "mac": {
-            "hash": "ccf649ab59c48f142e3c32f983440973c32e861f",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/c356fc671b3cbf3b3f4f1ba332ed6005c9d3f78b/trace_processor_shell"
+            "hash": "5066d38c3b61c3e7b96bcec31e3c04a334e222bb",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/4fcf7d61f3559fdb37fefda36e272f05e40f0fef/trace_processor_shell"
         },
         "mac_arm64": {
             "hash": "e1ad4861384b06d911a65f035317914b8cc975c6",
diff --git a/tools/polymer/polymer.gni b/tools/polymer/polymer.gni
index 6cfe416..87df6f1 100644
--- a/tools/polymer/polymer.gni
+++ b/tools/polymer/polymer.gni
@@ -12,9 +12,9 @@
   "third_party/polymer/v1_0/components-chromium/paper-behaviors/paper-ripple-behavior.html|PaperRippleBehavior",
   "ui/webui/resources/cr_elements/cr_scrollable_behavior.html|CrScrollableBehavior",
   "ui/webui/resources/cr_elements/cr_radio_button/cr_radio_button_behavior.html|CrRadioButtonBehavior",
-  "ui/webui/resources/cr_elements/i18n_behavior.html|I18nBehavior",
-  "ui/webui/resources/cr_elements/policy/cr_policy_pref_behavior.html|CrPolicyPrefBehavior",
-  "ui/webui/resources/cr_elements/web_ui_listener_behavior.html|WebUIListenerBehavior",
+  "ash/webui/common/resources/i18n_behavior.html|I18nBehavior",
+  "ash/webui/common/resources/cr_policy_pref_behavior.html|CrPolicyPrefBehavior",
+  "ash/webui/common/resources/web_ui_listener_behavior.html|WebUIListenerBehavior",
   "ui/webui/resources/html/cr/ui/focus_outline_manager.html|FocusOutlineManager",
   "ui/webui/resources/html/cr/ui/focus_row_behavior.html|FocusRowBehavior",
   "ui/webui/resources/html/cr/ui/focus_without_ink_js.html|focusWithoutInk",
diff --git a/tools/typescript/definitions/chrome_test.d.ts b/tools/typescript/definitions/chrome_test.d.ts
index 5ff2c4a7..ca77066 100644
--- a/tools/typescript/definitions/chrome_test.d.ts
+++ b/tools/typescript/definitions/chrome_test.d.ts
@@ -12,6 +12,7 @@
     export function assertTrue(value: boolean, message?: string): asserts value;
     export function fail(message?: string): never;
     export function runTests(tests: Array<() => void>): void;
+    export function runWithUserGesture(callback: () => void): void;
     export function succeed(message?: string): void;
   }
 }
diff --git a/ui/android/java/src/org/chromium/ui/modaldialog/ModalDialogManager.java b/ui/android/java/src/org/chromium/ui/modaldialog/ModalDialogManager.java
index 560dcb1..816efa5e 100644
--- a/ui/android/java/src/org/chromium/ui/modaldialog/ModalDialogManager.java
+++ b/ui/android/java/src/org/chromium/ui/modaldialog/ModalDialogManager.java
@@ -146,10 +146,14 @@
     public @interface ModalDialogPriority {
         int LOW = 1;
         int HIGH = 2;
+
         // This is intended to be used only by those dialogs which are meant to block any access to
-        // a subset of Chrome features when they are being shown. For example, incognito re-auth
-        // feature uses this to gate the user's access to Incognito feature unless they
-        // re-authenticate successfully. For most of the clients, using just HIGH should suffice.
+        // a subset of Chrome features when they are being shown. This also decouples the dialog
+        // from any suspend calls! For example, incognito re-auth feature uses this to gate the
+        // user's access to Incognito feature unless they re-authenticate successfully and it
+        // ensures that the dialog doesn't get removed because of any other Chrome clients.
+        // STOP: Other Chrome clients should just rely on HIGH instead! Check with the existing
+        // clients if you still intend on using this.
         int VERY_HIGH = 3;
 
         int RANGE_MIN = LOW;
@@ -325,12 +329,25 @@
             return;
         }
 
-        // Put the new dialog in pending list if the dialog type is suspended or the current dialog
-        // is of higher priority.
-        if (mSuspendedTypes.contains(dialogType)
-                || (isShowing() && mCurrentPriority >= dialogPriority)) {
-            mPendingDialogContainer.put(dialogType, dialogPriority, model, showAsNext);
-            return;
+        // The requested dialog is of very high priority. This needs special treatment when
+        // considering to put in pending list or not.
+        if (dialogPriority == ModalDialogPriority.VERY_HIGH) {
+            // We only put the requested dialog in pending list if the currently shown dialog
+            // also has a VERY_HIGH priority.
+            if (isShowing() && mCurrentPriority >= dialogPriority) {
+                assert mCurrentPriority
+                        == ModalDialogPriority.VERY_HIGH : "Higher priority is not supported.";
+                mPendingDialogContainer.put(dialogType, dialogPriority, model, showAsNext);
+                return;
+            }
+        } else {
+            // Put the new dialog in pending list if the dialog type is suspended or the current
+            // dialog is of higher priority.
+            if ((mSuspendedTypes.contains(dialogType))
+                    || (isShowing() && mCurrentPriority >= dialogPriority)) {
+                mPendingDialogContainer.put(dialogType, dialogPriority, model, showAsNext);
+                return;
+            }
         }
 
         if (isShowing()) suspendCurrentDialog();
@@ -375,6 +392,7 @@
         mCurrentPresenter.setDialogModel(null, null);
         for (ModalDialogManagerObserver o : mObserverList) o.onDialogDismissed(model);
         mCurrentPresenter = null;
+        mCurrentPriority = ModalDialogPriority.LOW;
         mDismissingCurrentDialog = false;
         dispatchOnLastDialogDismissedIfEmpty();
         showNextDialog();
@@ -439,16 +457,21 @@
     }
 
     /**
-     * Suspend all dialogs of the specified type, including the one currently shown. These dialogs
-     * will be prevented from showing unless {@link #resumeType(int, int)} is called after the
-     * suspension. If the current dialog is suspended, it will be moved back to the first dialog
-     * in the pending list. Any dialogs of the specified type in the pending list will be skipped.
+     * Suspend all dialogs of the specified type, including the one currently shown. The currently
+     * shown dialog would be suspended if its priority is not VERY_HIGH.
+     *
+     * These dialogs will be prevented from showing unless {@link #resumeType(int, int)} is called
+     * after the suspension. If the current dialog is suspended, it will be moved back to the first
+     * dialog in the pending list. Any dialogs of the specified type in the pending list will be
+     * skipped.
+     *
      * @param dialogType The specified type of dialogs to be suspended.
      * @return A token to use when resuming the suspended type.
      */
     public int suspendType(@ModalDialogType int dialogType) {
         mSuspendedTypes.add(dialogType);
-        if (isShowing() && dialogType == mCurrentType) {
+        if (isShowing() && dialogType == mCurrentType
+                && mCurrentPriority != ModalDialogPriority.VERY_HIGH) {
             suspendCurrentDialog();
             showNextDialog();
         }
diff --git a/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java b/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java
index e728dbbc..07acb1d 100644
--- a/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java
+++ b/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java
@@ -411,6 +411,86 @@
         assertEquals(mDialogModels.get(0), mModalDialogManager.getCurrentDialogForTest());
         assertEquals(2, mModalDialogManager.getPendingDialogsForTest(ModalDialogType.TAB).size());
     }
+    @Test
+    @Feature({"ModalDialog"})
+    public void testVeryHighPriorityDialog_SuspendType_APP_DoesNotDismissCurrentDialog() {
+        // Show a very high priority dialog of type APP.
+        mModalDialogManager.showDialog(mDialogModels.get(0), ModalDialogType.APP,
+                ModalDialogManager.ModalDialogPriority.VERY_HIGH, false);
+        // Suspend the APP type and check we are still showing the very_high priority dialog.
+        int token = mModalDialogManager.suspendType(ModalDialogType.APP);
+        assertTrue(mModalDialogManager.isShowing());
+    }
+
+    @Test
+    @Feature({"ModalDialog"})
+    public void testVeryHighPriorityDialog_SuspendType_TAB_DoesNotDismissCurrentDialog() {
+        // Show a very high priority dialog of type TAB.
+        mModalDialogManager.showDialog(mDialogModels.get(0), ModalDialogType.TAB,
+                ModalDialogManager.ModalDialogPriority.VERY_HIGH, false);
+        // Suspend the APP type and check we are still showing the very_high priority dialog.
+        int token = mModalDialogManager.suspendType(ModalDialogType.TAB);
+        assertTrue(mModalDialogManager.isShowing());
+    }
+
+    @Test
+    @Feature({"ModalDialog"})
+    public void testSuspendType_StillAllowsShowing_NewVeryHighPriorityDialog_OfSameType() {
+        // Show a high priority dialog.
+        mModalDialogManager.showDialog(mDialogModels.get(0), ModalDialogType.APP,
+                ModalDialogManager.ModalDialogPriority.HIGH, false);
+
+        // Suspend the APP type.
+        int token = mModalDialogManager.suspendType(ModalDialogType.APP);
+        assertFalse(mModalDialogManager.isShowing());
+
+        // Create a new dialog of the same type(!) but with a very_high priority and check it's
+        // shown.
+        mModalDialogManager.showDialog(mDialogModels.get(1), ModalDialogType.APP,
+                ModalDialogManager.ModalDialogPriority.VERY_HIGH, false);
+        assertTrue(mModalDialogManager.isShowing());
+        assertEquals(mDialogModels.get(1),
+                mModalDialogManager.getCurrentPresenterForTest().getDialogModel());
+    }
+
+    @Test
+    @Feature({"ModalDialog"})
+    public void testVeryHighPriorityDialog_IsShown_IfCurrentDialog_IsLowerPriority() {
+        // Show a high priority dialog.
+        mModalDialogManager.showDialog(mDialogModels.get(0), ModalDialogType.APP,
+                ModalDialogManager.ModalDialogPriority.HIGH, false);
+        // Create a new dialog of the same type but with a very_high priority and check it's
+        // shown.
+        mModalDialogManager.showDialog(mDialogModels.get(1), ModalDialogType.APP,
+                ModalDialogManager.ModalDialogPriority.VERY_HIGH, false);
+        assertTrue(mModalDialogManager.isShowing());
+        assertEquals(mDialogModels.get(1),
+                mModalDialogManager.getCurrentPresenterForTest().getDialogModel());
+        // Check that the previously shown dialog was removed and we are now showing the new dialog
+        // which has a very high priority.
+        verify(mAppModalPresenter, times(1)).removeDialogView(mDialogModels.get(0));
+        verify(mAppModalPresenter, times(1)).addDialogView(mDialogModels.get(1));
+    }
+
+    @Test
+    @Feature({"ModalDialog"})
+    public void testVeryHighPriorityDialog_IsNotShown_IfCurrentDialog_IsAlsoVeryHighPriority() {
+        // Show a very high priority dialog.
+        mModalDialogManager.showDialog(mDialogModels.get(0), ModalDialogType.APP,
+                ModalDialogManager.ModalDialogPriority.VERY_HIGH, false);
+        assertTrue(mModalDialogManager.isShowing());
+        verify(mAppModalPresenter, times(1)).addDialogView(mDialogModels.get(0));
+
+        // Create a new dialog of the same type and with very_high priority as well.
+        mModalDialogManager.showDialog(mDialogModels.get(1), ModalDialogType.APP,
+                ModalDialogManager.ModalDialogPriority.VERY_HIGH, false);
+
+        // Check that the new dialog is not shown and the previously shown dialog is never removed.
+        verify(mAppModalPresenter, times(0)).removeDialogView(mDialogModels.get(0));
+        verify(mAppModalPresenter, times(0)).addDialogView(mDialogModels.get(1));
+        assertEquals(mDialogModels.get(0),
+                mModalDialogManager.getCurrentPresenterForTest().getDialogModel());
+    }
 
     private static void assertOnDismissCalled(PropertyModel model, int numberOfInvocations) {
         verify(model.get(ModalDialogProperties.CONTROLLER), times(numberOfInvocations))
diff --git a/ui/base/l10n/l10n_util.cc b/ui/base/l10n/l10n_util.cc
index 19f7fd9..1c041510 100644
--- a/ui/base/l10n/l10n_util.cc
+++ b/ui/base/l10n/l10n_util.cc
@@ -93,6 +93,7 @@
     "en-CA",           // English (Canada)
     "en-GB",           // English (UK)
     "en-GB-oxendict",  // English (UK, OED spelling)
+    "en-IE",           // English (Ireland)
     "en-IN",           // English (India)
     "en-NZ",           // English (New Zealand)
     "en-US",           // English (US)
diff --git a/ui/file_manager/COMMON_METADATA b/ui/file_manager/COMMON_METADATA
index 5345fc2..8040003 100644
--- a/ui/file_manager/COMMON_METADATA
+++ b/ui/file_manager/COMMON_METADATA
@@ -1,3 +1,6 @@
-monorail: {
-  component: "Platform>Apps>FileManager"
+buganizer {
+  component_id: 167289
+}
+buganizer_public {
+  component_id: 1258625
 }
diff --git a/ui/file_manager/file_manager/foreground/elements/BUILD.gn b/ui/file_manager/file_manager/foreground/elements/BUILD.gn
index 1d170a5a..a424f3a 100644
--- a/ui/file_manager/file_manager/foreground/elements/BUILD.gn
+++ b/ui/file_manager/file_manager/foreground/elements/BUILD.gn
@@ -75,6 +75,7 @@
 
 js_library("files_format_dialog") {
   deps = [
+    "//ash/webui/common/resources:i18n_behavior",
     "//third_party/polymer/v3_0/components-chromium/iron-icon:iron-icon",
     "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
     "//ui/file_manager/file_manager/common/js:files_app_entry_types",
@@ -82,7 +83,6 @@
     "//ui/file_manager/file_manager/common/js:volume_manager_types",
     "//ui/file_manager/file_manager/externs:volume_info",
     "//ui/file_manager/file_manager/foreground/js:file_rename",
-    "//ui/webui/resources/cr_elements:i18n_behavior",
   ]
   externs_list = [
     "//ui/webui/resources/cr_elements/cr_button/cr_button_externs.js",
diff --git a/ui/file_manager/file_manager/foreground/elements/files_format_dialog.js b/ui/file_manager/file_manager/foreground/elements/files_format_dialog.js
index 95d000e..860fe06 100644
--- a/ui/file_manager/file_manager/foreground/elements/files_format_dialog.js
+++ b/ui/file_manager/file_manager/foreground/elements/files_format_dialog.js
@@ -11,7 +11,7 @@
 import 'chrome://resources/cr_elements/cr_shared_vars.css.js';
 import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
 
-import {I18nBehavior} from 'chrome://resources/cr_elements/i18n_behavior.js';
+import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js';
 import {html, Polymer} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
 
 import {EntryList, VolumeEntry} from '../../common/js/files_app_entry_types.js';
diff --git a/ui/views/controls/menu/menu_scroll_view_container.cc b/ui/views/controls/menu/menu_scroll_view_container.cc
index 40097dd..fd2cf17 100644
--- a/ui/views/controls/menu/menu_scroll_view_container.cc
+++ b/ui/views/controls/menu/menu_scroll_view_container.cc
@@ -98,7 +98,7 @@
     host_->GetMenuItem()->GetMenuController()->OnDragExitedScrollButton(host_);
   }
 
-  void OnMouseExited(const ui::MouseEvent& event) override {
+  void OnMouseEntered(const ui::MouseEvent& event) override {
     host_->GetMenuItem()->GetMenuController()->SetEnabledScrollButtons(true);
   }
 
diff --git a/ui/webui/resources/BUILD.gn b/ui/webui/resources/BUILD.gn
index 203fe49a..727253b 100644
--- a/ui/webui/resources/BUILD.gn
+++ b/ui/webui/resources/BUILD.gn
@@ -52,13 +52,11 @@
       "cr_components/customize_themes:build_grdp",
       "cr_components/help_bubble:build_grdp",
       "cr_components/most_visited:build_grdp",
-      "cr_elements:build_grdp",
       "js/browser_command:build_grdp",
       "//third_party/polymer/v3_0:build_grdp",
     ]
     grdp_files += [
       "$root_gen_dir/third_party/polymer/v3_0/polymer_3_0_resources.grdp",
-      "$root_gen_dir/ui/webui/resources/cr_elements/cr_elements_resources.grdp",
       "$target_gen_dir/cr_components/app_management/resources.grdp",
       "$target_gen_dir/cr_components/customize_themes/resources.grdp",
       "$target_gen_dir/cr_components/help_bubble/resources.grdp",
@@ -137,10 +135,6 @@
     "js:closure_compile",
     "js:closure_compile_modules",
   ]
-
-  if (include_polymer && is_chromeos_ash) {
-    deps += [ "cr_elements:closure_compile" ]
-  }
 }
 
 # TypeScript targets
@@ -148,19 +142,11 @@
 preprocessed_folder = "$target_gen_dir/preprocessed"
 
 checked_in_dts_files = [
-  "cr_elements/cr_scrollable_behavior.d.ts",
-  "cr_elements/i18n_behavior.d.ts",
-  "cr_elements/policy/cr_policy_indicator_behavior.d.ts",
-  "cr_elements/web_ui_listener_behavior.d.ts",
   "js/parse_html_subset.d.ts",
   "js/promise_resolver.d.ts",
   "js/static_types.d.ts",
 ]
 
-if (is_chromeos_ash) {
-  checked_in_dts_files += [ "cr_elements/cr_container_shadow_behavior.d.ts" ]
-}
-
 # Copies checked-in .d.ts files to the preprocess folder so that they are
 # discovered by TSC the same way generated .d.ts files are.
 copy("copy_checked_in_dts_files") {
diff --git a/ui/webui/resources/cr_elements/BUILD.gn b/ui/webui/resources/cr_elements/BUILD.gn
index d5d481e..88c492c 100644
--- a/ui/webui/resources/cr_elements/BUILD.gn
+++ b/ui/webui/resources/cr_elements/BUILD.gn
@@ -3,29 +3,15 @@
 # found in the LICENSE file.
 
 import("//build/config/chromeos/ui_mode.gni")
-import("//third_party/closure_compiler/compile_js.gni")
 import("//tools/grit/preprocess_if_expr.gni")
 import("//tools/polymer/css_to_wrapper.gni")
 import("//tools/polymer/html_to_wrapper.gni")
 import("//ui/webui/resources/include_polymer.gni")
-import("//ui/webui/resources/tools/generate_grd.gni")
 import("//ui/webui/webui_features.gni")
 import("./cr_elements.gni")
 
 preprocess_folder = "$root_gen_dir/ui/webui/resources/preprocessed/cr_elements"
 
-if (include_polymer) {
-  preprocess_src_manifest = "preprocessed_src_manifest.json"
-
-  generate_grd("build_grdp") {
-    grd_prefix = "cr_elements"
-    out_grd = "$target_gen_dir/${grd_prefix}_resources.grdp"
-    public_deps = [ ":preprocess" ]
-    manifest_files = [ "$target_gen_dir/$preprocess_src_manifest" ]
-    resource_path_prefix = "cr_elements"
-  }
-}
-
 group("preprocess") {
   public_deps = [
     ":html_wrapper_files_native",
@@ -36,7 +22,6 @@
     public_deps += [
       ":css_wrapper_files",
       ":html_wrapper_files",
-      ":preprocess_src",
     ]
   }
 }
@@ -54,72 +39,6 @@
   }
 }
 
-if (include_polymer) {
-  preprocess_if_expr("preprocess_src") {
-    in_folder = "."
-    out_folder = preprocess_folder
-    out_manifest = "$target_gen_dir/$preprocess_src_manifest"
-
-    in_files = [
-      "i18n_behavior.js",
-      "web_ui_listener_behavior.js",
-    ]
-
-    if (is_chromeos_ash) {
-      in_files += [
-        "cr_container_shadow_behavior.js",
-        "cr_scrollable_behavior.js",
-        "policy/cr_policy_indicator_behavior.js",
-      ]
-    }
-  }
-}
-
-group("closure_compile") {
-  deps = [ ":cr_elements_module_resources" ]
-  if (is_chromeos_ash) {
-    deps += [ "policy:closure_compile_module" ]
-  }
-}
-
-js_type_check("cr_elements_module_resources") {
-  is_polymer3 = true
-  deps = [
-    ":i18n_behavior",
-    ":web_ui_listener_behavior",
-  ]
-  if (is_chromeos_ash) {
-    deps += [
-      ":cr_container_shadow_behavior",
-      ":cr_scrollable_behavior",
-    ]
-  }
-}
-
-js_library("i18n_behavior") {
-  deps = [
-    "//ui/webui/resources/js:load_time_data.m",
-    "//ui/webui/resources/js:parse_html_subset",
-  ]
-}
-
-js_library("web_ui_listener_behavior") {
-  deps = [ "//ui/webui/resources/js:cr.m" ]
-}
-
-if (is_chromeos_ash) {
-  js_library("cr_container_shadow_behavior") {
-    deps = [ "//ui/webui/resources/js:assert" ]
-  }
-
-  js_library("cr_scrollable_behavior") {
-    deps = [
-      "//third_party/polymer/v3_0/components-chromium/iron-list:iron-list",
-      "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled",
-    ]
-  }
-}
-
 html_to_wrapper("html_wrapper_files_native") {
   deps = [ ":preprocess_ts" ]
   in_folder = preprocess_folder
diff --git a/ui/webui/resources/cr_elements/policy/BUILD.gn b/ui/webui/resources/cr_elements/policy/BUILD.gn
deleted file mode 100644
index dc7de28..0000000
--- a/ui/webui/resources/cr_elements/policy/BUILD.gn
+++ /dev/null
@@ -1,16 +0,0 @@
-# Copyright 2018 The Chromium Authors
-# Use of this source code is governed by a BSD-style license that can be
-# found in the LICENSE file.
-
-import("//third_party/closure_compiler/compile_js.gni")
-
-assert(is_chromeos_ash)
-
-js_type_check("closure_compile_module") {
-  is_polymer3 = true
-  deps = [ ":cr_policy_indicator_behavior" ]
-}
-
-js_library("cr_policy_indicator_behavior") {
-  deps = [ "//ui/webui/resources/js:assert" ]
-}