diff --git a/DEPS b/DEPS
index b621f05..76f5ea4e 100644
--- a/DEPS
+++ b/DEPS
@@ -309,11 +309,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': 'fed805fe6ee67e7f5252b9faecc6741c057464d8',
+  'skia_revision': 'beb6739688027fa5d1e1da5a946defa18217f171',
   # 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': 'f5fc76fe8c184b0173d3e88a4a038fdf0cd05734',
+  'v8_revision': 'ec517fdfbd438e98cc95d6d9fd93816c710e9dc8',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
@@ -377,7 +377,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
-  'crossbench_revision': '0f26144e3635a33fc18bdb726a6439090dc9e990',
+  'crossbench_revision': '9355cb1425d7c25994b2e945fb39c54350651176',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling CrossBench
   # and whatever else without interference from each other.
@@ -397,7 +397,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling devtools-frontend
   # and whatever else without interference from each other.
-  'devtools_frontend_revision': '77804ac0072e8c287727e6d393eafb49374c46e3',
+  'devtools_frontend_revision': 'ad8438edb0fff5b4a87669fe237ec2ae7d30c86e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling libprotobuf-mutator
   # and whatever else without interference from each other.
@@ -529,7 +529,7 @@
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling llvm-libc
   # and whatever else without interference from each other.
-  'compiler_rt_revision': '02145296c3a848274a6146176a74d0e468452e68',
+  'compiler_rt_revision': '45b0d106857b21348a01c292cb30a261ef968b7e',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling clusterfuzz-data
   # and whatever else without interference from each other.
@@ -537,7 +537,7 @@
 
   # If you change this, also update the libc++ revision in
   # //buildtools/deps_revisions.gni.
-  'libcxx_revision':       'bcc74d7745a74dae059f1a4ca97e2979f5f77661',
+  'libcxx_revision':       '0cb7f02f783ef23ba0a9f73d632a5ae95af042c5',
 
   # GN CIPD package version.
   'gn_version': 'git_revision:81b24e01531ecf0eff12ec9359a555ec3944ec4e',
@@ -1190,7 +1190,7 @@
       'packages': [
           {
               'package': 'chromium/chrome/android/orderfiles/arm',
-              'version': 'UJpSXjZaBeaMomSPHbJCfzdKIkMMaTDZ_i-YXJjtcW0C',
+              'version': 'ItXtwLleOTEcnS88rvu7eTFULkYVDwhMW-e0nw9UMn4C',
           },
       ],
       'condition': 'checkout_android',
@@ -1201,7 +1201,7 @@
       'packages': [
           {
               'package': 'chromium/chrome/android/orderfiles/arm64',
-              'version': 'OfUY6zghU4PmQuSCkMVNmNee_OzonxHsgImK3bWPvgoC',
+              'version': 'dxu4WfKppIIXeHstnVnyxsWQEUHqnPzXATobWGKyhV4C',
           },
       ],
       'condition': 'checkout_android',
@@ -1212,7 +1212,7 @@
       'packages': [
           {
               'package': 'chromium/android_webview/tools/orderfiles/arm64',
-              'version': 'ttPALgnEpUnbrf9UaC1ySjIaFJ1Dq9i-4gyPn_C6d_QC',
+              'version': 'zjFO-RB5cckztVK3C5VgUlD1gR-LdNCBi4ZA7RlFuQYC',
           },
       ],
       'condition': 'checkout_android',
@@ -1597,7 +1597,7 @@
     'packages': [
       {
         'package': 'chromium/chrome/test/data/variations/cipd',
-        'version': 'eqArp52Rq-uihdvcpYkwdYJQEjPLfYusJEtlbLvU98IC',
+        'version': 'lLpN-aXP14rxPQA9BqI-BzMkBZ81r-OgZClXQHkGiG8C',
       },
     ],
     'dep_type': 'cipd',
@@ -1608,7 +1608,7 @@
 
   'src/clank': {
     'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' +
-    '1b59aa2b6c0cd8da2f566044846ef1590fe32e72',
+    '2503c7ae1f74a085503e3432fe26ff1f49397c26',
     'condition': 'checkout_android and checkout_src_internal',
   },
 
@@ -1708,7 +1708,7 @@
     'packages': [
       {
           'package': 'chromium/third_party/androidx',
-          'version': 'M5giEmh4O2ZmwKQvQ47NVgpAf3i59Cf3wx4ZMipqnp4C',
+          'version': 'VC9i_CgYSMT9ZWi48Sb5jeZNPwBEwuACZvkPwNX9LbAC',
       },
     ],
     'condition': 'checkout_android and non_git_source',
@@ -2908,7 +2908,7 @@
       'dep_type': 'cipd',
   },
 
-  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@14f79df6f67f644d2b26ddc5d690ffa8f2030e6b',
+  'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@8571c2cb2137af5bb8754d5e501aae90831fb7e1',
   'src/third_party/glslang/src': '{chromium_git}/external/github.com/KhronosGroup/glslang@a57276bf558f5cf94d3a9854ebdf5a2236849a5a',
   'src/third_party/spirv-cross/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Cross@b8fcf307f1f347089e3c46eb4451d27f32ebc8d3',
   'src/third_party/spirv-headers/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Headers@01e0577914a75a2569c846778c2f93aa8e6feddd',
@@ -2917,7 +2917,7 @@
   'src/third_party/vulkan-loader/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@f703f919c30c5b67958d35d40a4297cb3823ed78',
   'src/third_party/vulkan-tools/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Tools@d643b80d6ba8c191bc289fdda52867c3bb3c190b',
   'src/third_party/vulkan-utility-libraries/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@4322db5906e67b57ec9c327e6afe3d98ed893df7',
-  'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@5e817f0563ce8c6d9c023f85133ad0628d0dfc05',
+  'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@e7ba8af40a7e9b8e5d24eb8c5459d0bdd8101498',
 
   'src/third_party/vulkan_memory_allocator':
     Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'cb0597213b0fcb999caa9ed08c2f88dc45eb7d50',
@@ -2960,7 +2960,7 @@
     Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'),
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + 'c412d4776ca54546b9dd41be15eeaf9147a2f753',
+    Var('webrtc_git') + '/src.git' + '@' + '8d5c61bb7ab3464a8dc3354bc54c78100eb92335',
 
   # 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.
@@ -3093,7 +3093,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/boca_app/app',
-        'version': 'Mz5dXx73Yd3-srzT2ipOxc7qC9_ynsB0a5OcvaIQdQUC',
+        'version': 'd2v47wM7X5TkWEliRPPIIBZ4coz4LE0tK5HQVHGE0_EC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3104,7 +3104,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'pQZz_HJkOnr5Q_utdJivpJL_AwR55jEawPH3SQ7wB9IC',
+        'version': 'Ik_WgpS7JJMc22wM49FgbLX5b4lBt-bHQqeYhSS-e-oC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3115,7 +3115,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': 'XvKnnh7v9JO88zLLNIiOHcAC6XP6NpWRMxVeHaGd9N0C',
+        'version': 'SCtijtDMFjvW73-I6tDNDR0reZseVtpY2cs9hDgpElwC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3148,7 +3148,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/projector_app/app',
-        'version': '1_DjXQ2Rs1l_YNHCq7MI4n5qXa1YgJbjpp_hpQcQhcMC',
+        'version': 'UcC8QWHxy5HMx1hItCqETDWNyx6exCsr5Zruo6myxcoC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -3741,7 +3741,7 @@
 
   'src/ios_internal':  {
       'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' +
-        '70aacbfb7d3ed93f0d8681880e07b92531b29992',
+        '979d50337992bd9cb2ad58006f7e5f3722470c66',
       'condition': 'checkout_ios and checkout_src_internal',
   },
 
diff --git a/ash/webui/boca_ui/boca_app_page_handler.cc b/ash/webui/boca_ui/boca_app_page_handler.cc
index cb81ae4..e1dc4461 100644
--- a/ash/webui/boca_ui/boca_app_page_handler.cc
+++ b/ash/webui/boca_ui/boca_app_page_handler.cc
@@ -22,15 +22,18 @@
 #include "ash/webui/boca_ui/provider/tab_info_collector.h"
 #include "ash/wm/window_state.h"
 #include "ash/wm/wm_event.h"
+#include "base/check.h"
 #include "base/check_is_test.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
 #include "base/functional/callback_forward.h"
 #include "base/functional/callback_helpers.h"
+#include "base/location.h"
 #include "base/logging.h"
 #include "base/notreached.h"
 #include "base/sequence_checker.h"
 #include "base/strings/utf_string_conversions.h"
+#include "base/task/sequenced_task_runner.h"
 #include "base/time/time.h"
 #include "chromeos/ash/components/boca/boca_app_client.h"
 #include "chromeos/ash/components/boca/boca_metrics_util.h"
@@ -641,27 +644,13 @@
     const std::string& id,
     EndViewScreenSessionCallback callback) {
   CHECK(spotlight_service_);
-
-  if (ash::features::IsBocaSpotlightRobotRequesterEnabled()) {
-    GetSessionManager()->EndSpotlightSession();
+  if (student_screen_presenter() &&
+      student_screen_presenter()->IsPresenting()) {
+    // Already ended and a presentation is in progress.
+    std::move(callback).Run(std::nullopt);
+    return;
   }
-
-  spotlight_service_->UpdateViewScreenState(
-      id, ::boca::ViewScreenConfig::INACTIVE, base_url_,
-      base::BindOnce(
-          [](EndViewScreenSessionCallback cb,
-             base::expected<bool, google_apis::ApiErrorCode> result) {
-            if (!result.has_value()) {
-              boca::RecordEndViewStudentScreenErrorCode(result.error());
-              LOG(WARNING)
-                  << "[Boca] Error setting view screen state to inactive: "
-                  << result.error();
-              std::move(cb).Run(mojom::EndViewScreenSessionError::kHTTPError);
-              return;
-            }
-            std::move(cb).Run(std::nullopt);
-          },
-          std::move(callback)));
+  EndViewScreenSessionInternal(id, std::move(callback));
 }
 
 void BocaAppHandler::SetViewScreenSessionActive(
@@ -773,26 +762,19 @@
     mojom::IdentityPtr student,
     const std::string& receiver_id,
     PresentStudentScreenCallback callback) {
-  if (!student_screen_presenter()) {
+  auto* session = GetSessionManager()->GetCurrentSession();
+  if (!student_screen_presenter() || !session ||
+      !IsActiveSession(session->session_id())) {
     LOG(ERROR) << "[Boca] unexpected call to present student screen";
     std::move(callback).Run(false);
     return;
   }
-  ::boca::UserIdentity student_identity;
-  student_identity.set_gaia_id(student->id);
-  student_identity.set_email(student->email);
-  student_identity.set_full_name(student->name);
-  std::optional<std::string> student_device_id =
-      GetSessionManager()->GetStudentActiveDeviceId(student->id);
-  if (!student_device_id.has_value()) {
-    std::move(callback).Run(false);
-    return;
-  }
-  student_screen_presenter()->Start(
-      receiver_id, student_identity, student_device_id.value(),
-      std::move(callback),
-      base::BindOnce(&BocaAppHandler::OnPresentStudentScreenEnded,
-                     weak_ptr_factory_.GetWeakPtr()));
+  std::string student_id = student->id;
+  auto end_view_screen_cb = base::BindOnce(
+      &BocaAppHandler::OnEndViewScreenResponseForPresentStudentScreen,
+      weak_ptr_factory_.GetWeakPtr(), session->session_id(), std::move(student),
+      receiver_id, std::move(callback));
+  EndViewScreenSessionInternal(student_id, std::move(end_view_screen_cb));
 }
 
 void BocaAppHandler::StopPresentingStudentScreen(
@@ -1348,6 +1330,87 @@
   remote_->OnPresentOwnScreenEnded();
 }
 
+void BocaAppHandler::EndViewScreenSessionInternal(
+    const std::string& id,
+    EndViewScreenSessionCallback callback) {
+  CHECK(spotlight_service_);
+
+  if (ash::features::IsBocaSpotlightRobotRequesterEnabled()) {
+    GetSessionManager()->EndSpotlightSession();
+  }
+
+  spotlight_service_->UpdateViewScreenState(
+      id, ::boca::ViewScreenConfig::INACTIVE, base_url_,
+      base::BindOnce(
+          [](EndViewScreenSessionCallback cb,
+             base::expected<bool, google_apis::ApiErrorCode> result) {
+            if (!result.has_value()) {
+              boca::RecordEndViewStudentScreenErrorCode(result.error());
+              LOG(WARNING)
+                  << "[Boca] Error setting view screen state to inactive: "
+                  << result.error();
+              std::move(cb).Run(mojom::EndViewScreenSessionError::kHTTPError);
+              return;
+            }
+            std::move(cb).Run(std::nullopt);
+          },
+          std::move(callback)));
+}
+
+void BocaAppHandler::PresentStudentScreenInternal(
+    const std::string& session_id,
+    mojom::IdentityPtr student,
+    const std::string& receiver_id,
+    PresentStudentScreenCallback callback) {
+  if (!IsActiveSession(session_id)) {
+    std::move(callback).Run(false);
+    return;
+  }
+  if (!student_screen_presenter()) {
+    LOG(ERROR) << "[Boca] unexpected call to present student screen";
+    std::move(callback).Run(false);
+    return;
+  }
+  ::boca::UserIdentity student_identity;
+  student_identity.set_gaia_id(student->id);
+  student_identity.set_email(student->email);
+  student_identity.set_full_name(student->name);
+  std::optional<std::string> student_device_id =
+      GetSessionManager()->GetStudentActiveDeviceId(student->id);
+  if (!student_device_id.has_value()) {
+    std::move(callback).Run(false);
+    return;
+  }
+  student_screen_presenter()->Start(
+      receiver_id, student_identity, student_device_id.value(),
+      std::move(callback),
+      base::BindOnce(&BocaAppHandler::OnPresentStudentScreenEnded,
+                     weak_ptr_factory_.GetWeakPtr()));
+}
+
+void BocaAppHandler::OnEndViewScreenResponseForPresentStudentScreen(
+    const std::string& session_id,
+    mojom::IdentityPtr student,
+    const std::string& receiver_id,
+    PresentStudentScreenCallback callback,
+    std::optional<mojom::EndViewScreenSessionError> end_view_screen_error) {
+  if (end_view_screen_error.has_value()) {
+    std::move(callback).Run(false);
+    return;
+  }
+  // Delay presentation to increase the likelihood the host receives the
+  // inactive connection notification and can accept the new one.
+  // TODO(crbug.com/445259545): The race condition is still there even with the
+  // delay. Update the host side to allow new connection even if the previous
+  // one is ongoing and then remove this delay.
+  base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask(
+      FROM_HERE,
+      base::BindOnce(&BocaAppHandler::PresentStudentScreenInternal,
+                     weak_ptr_factory_.GetWeakPtr(), session_id,
+                     std::move(student), receiver_id, std::move(callback)),
+      base::Seconds(5));
+}
+
 TeacherScreenPresenter* BocaAppHandler::teacher_screen_presenter() {
   return GetSessionManager()->GetTeacherScreenPresenter();
 }
diff --git a/ash/webui/boca_ui/boca_app_page_handler.h b/ash/webui/boca_ui/boca_app_page_handler.h
index 2ae079d8..c4f9d34 100644
--- a/ash/webui/boca_ui/boca_app_page_handler.h
+++ b/ash/webui/boca_ui/boca_app_page_handler.h
@@ -6,6 +6,7 @@
 #define ASH_WEBUI_BOCA_UI_BOCA_APP_PAGE_HANDLER_H_
 
 #include <memory>
+#include <optional>
 #include <string>
 
 #include "ash/webui/boca_ui/mojom/boca.mojom-forward.h"
@@ -272,6 +273,21 @@
   void OnPresentStudentScreenEnded() override;
   void OnPresentOwnScreenEnded() override;
 
+  void EndViewScreenSessionInternal(const std::string& id,
+                                    EndViewScreenSessionCallback callback);
+
+  void PresentStudentScreenInternal(const std::string& session_id,
+                                    mojom::IdentityPtr student,
+                                    const std::string& receiver_id,
+                                    PresentStudentScreenCallback callback);
+
+  void OnEndViewScreenResponseForPresentStudentScreen(
+      const std::string& session_id,
+      mojom::IdentityPtr student,
+      const std::string& receiver_id,
+      PresentStudentScreenCallback callback,
+      std::optional<mojom::EndViewScreenSessionError> end_view_screen_error);
+
   TeacherScreenPresenter* teacher_screen_presenter();
   StudentScreenPresenter* student_screen_presenter();
 
diff --git a/ash/webui/boca_ui/boca_app_page_handler_unittest.cc b/ash/webui/boca_ui/boca_app_page_handler_unittest.cc
index 7f43e5c..a079332f 100644
--- a/ash/webui/boca_ui/boca_app_page_handler_unittest.cc
+++ b/ash/webui/boca_ui/boca_app_page_handler_unittest.cc
@@ -367,6 +367,8 @@
   MOCK_METHOD(void, CheckConnection, (), (override));
 
   MOCK_METHOD(void, Stop, (base::OnceCallback<void(bool)>), (override));
+
+  MOCK_METHOD(bool, IsPresenting, (), (override));
 };
 
 class MockTeacherScreenPresenter : public TeacherScreenPresenter {
@@ -667,10 +669,15 @@
         }));
   }
 
+  content::BrowserTaskEnvironment* task_environment() {
+    return &task_environment_;
+  }
+
  private:
   bool is_producer_;
   base::test::ScopedFeatureList scoped_feature_list_;
-  content::BrowserTaskEnvironment task_environment_;
+  content::BrowserTaskEnvironment task_environment_{
+      base::test::TaskEnvironment::TimeSource::MOCK_TIME};
   sync_preferences::TestingPrefServiceSyncable pref_service_;
   TestingPrefServiceSimple local_state_;
   ::boca::Session session = GetCommonActiveSessionProto();
@@ -2633,6 +2640,21 @@
   EXPECT_FALSE(future.Get().has_value());
 }
 
+TEST_F(BocaAppPageHandlerProducerTest,
+       EndViewScreenSessionWhilePresentingStudentScreen) {
+  base::test::TestFuture<std::optional<mojom::EndViewScreenSessionError>>
+      future;
+  auto student_screen_presenter =
+      std::make_unique<MockStudentScreenPresenter>();
+  ON_CALL(*session_manager(), GetStudentScreenPresenter)
+      .WillByDefault(Return(student_screen_presenter.get()));
+  ON_CALL(*student_screen_presenter, IsPresenting).WillByDefault(Return(true));
+  EXPECT_CALL(*spotlight_service(), UpdateViewScreenState).Times(0);
+
+  boca_app_handler()->EndViewScreenSession("student-id", future.GetCallback());
+  EXPECT_FALSE(future.Get().has_value());
+}
+
 TEST_F(BocaAppPageHandlerProducerTest, EndViewScreenSessionFailed) {
   base::HistogramTester histogram_tester;
   const std::string student_id = "123";
@@ -3077,7 +3099,15 @@
       kActiveStudentId, "student name", "student@email.com", std::nullopt);
   ::boca::UserIdentity student_identity;
 
+  ::boca::Session session = GetCommonActiveSessionProto();
+  EXPECT_CALL(*session_manager(), GetCurrentSession())
+      .WillRepeatedly(Return(&session));
   boca_app_handler()->OnSessionStarted("session_id", ::boca::UserIdentity());
+  EXPECT_CALL(*spotlight_service(), UpdateViewScreenState)
+      .WillOnce([](std::string, ::boca::ViewScreenConfig::ViewScreenState,
+                   std::string, ViewScreenRequestCallback callback) {
+        std::move(callback).Run(true);
+      });
   EXPECT_CALL(*session_manager(), GetStudentActiveDeviceId)
       .WillOnce(Return(kStudentDeviceId));
   EXPECT_CALL(*student_screen_presenter,
@@ -3093,6 +3123,7 @@
   boca_app_handler()->PresentStudentScreen(student_identity_mojom->Clone(),
                                            kReceiverId,
                                            success_future.GetCallback());
+  task_environment()->FastForwardBy(base::Seconds(5));
   EXPECT_TRUE(success_future.Get());
   EXPECT_EQ(student_identity.gaia_id(), student_identity_mojom->id);
   EXPECT_EQ(student_identity.full_name(), student_identity_mojom->name);
@@ -3110,7 +3141,15 @@
   ON_CALL(*session_manager(), GetStudentScreenPresenter)
       .WillByDefault(Return(student_screen_presenter.get()));
   base::test::TestFuture<bool> success_future;
+  ::boca::Session session = GetCommonActiveSessionProto();
+  EXPECT_CALL(*session_manager(), GetCurrentSession())
+      .WillRepeatedly(Return(&session));
   boca_app_handler()->OnSessionStarted("session_id", ::boca::UserIdentity());
+  EXPECT_CALL(*spotlight_service(), UpdateViewScreenState)
+      .WillOnce([](std::string, ::boca::ViewScreenConfig::ViewScreenState,
+                   std::string, ViewScreenRequestCallback callback) {
+        std::move(callback).Run(true);
+      });
   EXPECT_CALL(*session_manager(), GetStudentActiveDeviceId)
       .WillOnce(Return(kStudentDeviceId));
   EXPECT_CALL(*student_screen_presenter,
@@ -3124,6 +3163,58 @@
       mojom::Identity::New(kActiveStudentId, "student name",
                            "student@email.com", std::nullopt),
       kReceiverId, success_future.GetCallback());
+  task_environment()->FastForwardBy(base::Seconds(5));
+  EXPECT_FALSE(success_future.Get());
+}
+
+TEST_F(BocaAppPageHandlerProducerTest,
+       PresentStudentScreenEndViewScreenFailure) {
+  auto student_screen_presenter =
+      std::make_unique<MockStudentScreenPresenter>();
+  ON_CALL(*session_manager(), GetStudentScreenPresenter)
+      .WillByDefault(Return(student_screen_presenter.get()));
+  base::test::TestFuture<bool> success_future;
+  ::boca::Session session = GetCommonActiveSessionProto();
+  EXPECT_CALL(*session_manager(), GetCurrentSession())
+      .WillRepeatedly(Return(&session));
+  boca_app_handler()->OnSessionStarted("session_id", ::boca::UserIdentity());
+  EXPECT_CALL(*spotlight_service(), UpdateViewScreenState)
+      .WillOnce([](std::string, ::boca::ViewScreenConfig::ViewScreenState,
+                   std::string, ViewScreenRequestCallback callback) {
+        std::move(callback).Run(
+            base::unexpected(google_apis::ApiErrorCode::HTTP_BAD_REQUEST));
+      });
+  EXPECT_CALL(*student_screen_presenter, Start).Times(0);
+  boca_app_handler()->PresentStudentScreen(
+      mojom::Identity::New(kActiveStudentId, "student name",
+                           "student@email.com", std::nullopt),
+      kReceiverId, success_future.GetCallback());
+  EXPECT_FALSE(success_future.Get());
+}
+
+TEST_F(BocaAppPageHandlerProducerTest,
+       PresentStudentScreenSessionInactiveAfterCall) {
+  auto student_screen_presenter =
+      std::make_unique<MockStudentScreenPresenter>();
+  ON_CALL(*session_manager(), GetStudentScreenPresenter)
+      .WillByDefault(Return(student_screen_presenter.get()));
+  base::test::TestFuture<bool> success_future;
+  ::boca::Session session = GetCommonActiveSessionProto();
+  EXPECT_CALL(*session_manager(), GetCurrentSession())
+      .WillRepeatedly(Return(&session));
+  boca_app_handler()->OnSessionStarted("session_id", ::boca::UserIdentity());
+  EXPECT_CALL(*spotlight_service(), UpdateViewScreenState)
+      .WillOnce([](std::string, ::boca::ViewScreenConfig::ViewScreenState,
+                   std::string, ViewScreenRequestCallback callback) {
+        std::move(callback).Run(true);
+      });
+  EXPECT_CALL(*student_screen_presenter, Start).Times(0);
+  boca_app_handler()->PresentStudentScreen(
+      mojom::Identity::New(kActiveStudentId, "student name",
+                           "student@email.com", std::nullopt),
+      kReceiverId, success_future.GetCallback());
+  session.set_session_state(::boca::Session::PAST);
+  task_environment()->FastForwardBy(base::Seconds(5));
   EXPECT_FALSE(success_future.Get());
 }
 
@@ -3133,7 +3224,15 @@
   ON_CALL(*session_manager(), GetStudentScreenPresenter)
       .WillByDefault(Return(student_screen_presenter.get()));
   base::test::TestFuture<bool> success_future;
+  ::boca::Session session = GetCommonActiveSessionProto();
+  EXPECT_CALL(*session_manager(), GetCurrentSession())
+      .WillRepeatedly(Return(&session));
   boca_app_handler()->OnSessionStarted("session_id", ::boca::UserIdentity());
+  EXPECT_CALL(*spotlight_service(), UpdateViewScreenState)
+      .WillOnce([](std::string, ::boca::ViewScreenConfig::ViewScreenState,
+                   std::string, ViewScreenRequestCallback callback) {
+        std::move(callback).Run(true);
+      });
   EXPECT_CALL(*session_manager(), GetStudentActiveDeviceId)
       .WillOnce(Return(std::nullopt));
   EXPECT_CALL(*student_screen_presenter, Start).Times(0);
@@ -3141,6 +3240,7 @@
       mojom::Identity::New(kActiveStudentId, "student name",
                            "student@email.com", std::nullopt),
       kReceiverId, success_future.GetCallback());
+  task_environment()->FastForwardBy(base::Seconds(5));
   EXPECT_FALSE(success_future.Get());
 }
 
@@ -3148,6 +3248,9 @@
   ON_CALL(*session_manager(), GetStudentScreenPresenter)
       .WillByDefault(Return(nullptr));
   base::test::TestFuture<bool> success_future;
+  ::boca::Session session = GetCommonActiveSessionProto();
+  EXPECT_CALL(*session_manager(), GetCurrentSession())
+      .WillRepeatedly(Return(&session));
   boca_app_handler()->PresentStudentScreen(
       mojom::Identity::New(kActiveStudentId, "student name",
                            "student@email.com", std::nullopt),
diff --git a/base/message_loop/message_pump_glib.cc b/base/message_loop/message_pump_glib.cc
index 648cd9c4..4e89c10 100644
--- a/base/message_loop/message_pump_glib.cc
+++ b/base/message_loop/message_pump_glib.cc
@@ -18,6 +18,10 @@
 #include "base/task/current_thread.h"
 #include "base/threading/platform_thread.h"
 
+#if !BUILDFLAG(IS_OZONE) || BUILDFLAG(IS_FUCHSIA)
+#include "base/notimplemented.h"
+#endif  // !BUILDFLAG(IS_OZONE) || BUILDFLAG(IS_FUCHSIA)
+
 namespace base {
 
 namespace {
@@ -291,6 +295,14 @@
       FdWatchMode mode,
       IOWatcher::FdWatcher& watcher,
       const Location& location) override {
+    // CurrentThreadForUI::WatchFileDescriptor is an Ozone-only feature.
+    // On ChromeOS, the libchrome package is built with use_glib=true, which
+    // includes this file. However, its configuration does not have
+    // BUILDFLAG(IS_OZONE) enabled, so WatchFileDescriptor is not declared. This
+    // guard prevents a compile error. Please note that while libchrome is
+    // ChromeOS specific and is used extensively by various components within
+    // ChromeOS, libchrome is not part of Ash-chrome.
+#if BUILDFLAG(IS_OZONE) && !BUILDFLAG(IS_FUCHSIA)
     MessagePumpForIO::Mode io_mode;
     switch (mode) {
       case FdWatchMode::kRead:
@@ -310,6 +322,10 @@
       return nullptr;
     }
     return watch;
+#else
+    NOTIMPLEMENTED();
+    return nullptr;
+#endif  // BUILDFLAG(IS_OZONE) && !BUILDFLAG(IS_FUCHSIA)
   }
 
  private:
diff --git a/base/task/current_thread.h b/base/task/current_thread.h
index bca254474..7cf3962 100644
--- a/base/task/current_thread.h
+++ b/base/task/current_thread.h
@@ -250,7 +250,7 @@
 
   CurrentUIThread* operator->() { return this; }
 
-#if BUILDFLAG(IS_OZONE) && !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_WIN)
+#if BUILDFLAG(IS_OZONE) && !BUILDFLAG(IS_FUCHSIA)
   static_assert(
       std::is_base_of_v<WatchableIOMessagePumpPosix, MessagePumpForUI>,
       "CurrentThreadForUI::WatchFileDescriptor is supported only"
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1
index dbb07e9..058c182 100644
--- a/build/fuchsia/linux_internal.sdk.sha1
+++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@
-29.20250831.103.1
+29.20250926.103.1
diff --git a/buildtools/deps_revisions.gni b/buildtools/deps_revisions.gni
index fdaa644..39a9b96b 100644
--- a/buildtools/deps_revisions.gni
+++ b/buildtools/deps_revisions.gni
@@ -5,5 +5,5 @@
 declare_args() {
   # Used to cause full rebuilds on libc++ rolls. This should be kept in sync
   # with the libcxx_revision var in //DEPS.
-  libcxx_revision = "bcc74d7745a74dae059f1a4ca97e2979f5f77661"
+  libcxx_revision = "0cb7f02f783ef23ba0a9f73d632a5ae95af042c5"
 }
diff --git a/buildtools/third_party/libc++/libcxx_headers.gni b/buildtools/third_party/libc++/libcxx_headers.gni
index 89c1cab..34e3c13 100644
--- a/buildtools/third_party/libc++/libcxx_headers.gni
+++ b/buildtools/third_party/libc++/libcxx_headers.gni
@@ -11,7 +11,7 @@
 import("//buildtools/deps_revisions.gni")
 
 assert(
-    libcxx_revision == "bcc74d7745a74dae059f1a4ca97e2979f5f77661",
+    libcxx_revision == "0cb7f02f783ef23ba0a9f73d632a5ae95af042c5",
     "libcxx_headers.gni and third_party/libc++ are out of sync.$0x0A$0x0AIf you were messing around with the libc++ repository, run:$0x0A`buildtools/third_party/libc++/generate_libcxx_headers.py`$0x0A$0x0AIf the script doesn't resolve the error, file a bug to msta@ with reproduction details.$0x0A")
 
 libcxx_headers = [
diff --git a/chrome/VERSION b/chrome/VERSION
index 870bd79..849007be 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=142
 MINOR=0
-BUILD=7439
+BUILD=7440
 PATCH=0
diff --git a/chrome/browser/extensions/content_script_apitest.cc b/chrome/browser/extensions/content_script_apitest.cc
index 4eb51554..fa72358 100644
--- a/chrome/browser/extensions/content_script_apitest.cc
+++ b/chrome/browser/extensions/content_script_apitest.cc
@@ -4,6 +4,7 @@
 
 #include <stddef.h>
 
+#include "base/feature_list.h"
 #include "base/functional/bind.h"
 #include "base/functional/callback.h"
 #include "base/run_loop.h"
@@ -49,6 +50,7 @@
 #include "extensions/buildflags/buildflags.h"
 #include "extensions/common/api/content_scripts.h"
 #include "extensions/common/extension.h"
+#include "extensions/common/extension_features.h"
 #include "extensions/common/manifest_constants.h"
 #include "extensions/common/manifest_handlers/externally_connectable.h"
 #include "extensions/common/utils/content_script_utils.h"
@@ -656,6 +658,77 @@
   EXPECT_EQ(kInjectedDivColor, get_element_color("#div3"));
 }
 
+#if !BUILDFLAG(IS_ANDROID)
+
+class ContentScriptCssApiTest : public ContentScriptApiTest {
+ protected:
+  base::test::ScopedFeatureList feature_list_{
+      extensions_features::kExtensionLocalizationGuid};
+};
+
+// Tests a page's service worker intercepting an extension's stylesheet as
+// served by a dynamic URL.
+// Regression test for https://crbug.com/435609878.
+// TODO(crbug.com/447647864): Port to desktop Android when `getComputedStyle()`
+// returns updated values for a web service worker, instead of the default.
+IN_PROC_BROWSER_TEST_F(ContentScriptApiTest, LocalizedWithDynamicUrl) {
+  // Load an extension with a stylesheet that can be served by a dynamic URL.
+  ASSERT_TRUE(StartEmbeddedTestServer());
+  const Extension* extension = LoadExtension(
+      test_data_dir_.AppendASCII("content_scripts/css_l10n_dynamic"));
+  ASSERT_TRUE(extension);
+
+  // Navigate to a web page controlled by a service worker. The page will send a
+  // "ready" message when the service worker is activated and has claimed the
+  // page as a client.
+  const GURL url = embedded_test_server()->GetURL(
+      "/extensions/page_with_service_worker/index.html");
+  content::WebContents* web_contents = GetActiveWebContents();
+  content::DOMMessageQueue message_queue(web_contents);
+  ASSERT_TRUE(NavigateToURL(web_contents, url));
+  std::string ready;
+  EXPECT_TRUE(message_queue.WaitForMessage(&ready));
+  EXPECT_EQ(R"("ready")", ready);
+
+  // Inject a script that will add a stylesheet associated with the extension's
+  // dynamic URL and return (via a promise) when the stylesheet has loaded.
+  static constexpr char kInjectStylesheet[] =
+      R"((function() {
+           let sheet = document.createElement('link');
+           sheet.type = 'text/css';
+           sheet.rel = 'stylesheet';
+           let url = '%s';
+           sheet.href = url;
+           return new Promise(resolve => {
+             sheet.onload = () => { resolve('success'); };
+             sheet.onerror = error => { resolve(error); };
+             document.head.appendChild(sheet);
+           });
+         })();)";
+  GURL dynamic_url = extension->dynamic_url().Resolve("style.css");
+  std::string script =
+      base::StringPrintf(kInjectStylesheet, dynamic_url.spec());
+  EXPECT_EQ("success", content::EvalJs(web_contents, script));
+
+  // Retrieve the body's background color. Red (rgb(255, 0, 0) comes from the
+  // web service worker which retrieves it from the extension's messages.json
+  // file. This is made possible due to the extension's `default_locale` key.
+  // Notes:
+  // * The stylesheet in the extension uses the color "green". This difference
+  //   ensures the stylesheet is properly being served by the service worker,
+  //   and not the extension.
+  // * The service worker replies with an unlocalized variable in the stylesheet
+  //   for the color. This ensures that the stylesheet is properly localized by
+  //   the browser process before use.
+  static constexpr char kGetBodyColor[] =
+      R"((function() {
+           return getComputedStyle(document.body).color;
+         })();)";
+  EXPECT_EQ("rgb(255, 0, 0)", content::EvalJs(web_contents, kGetBodyColor));
+}
+
+#endif  // !BUILDFLAG(IS_ANDROID)
+
 #if BUILDFLAG(ENABLE_EXTENSIONS)
 // TODO(crbug.com/371432155): Port to desktop Android when the chrome.tabs API
 // is supported.
diff --git a/chrome/browser/feed/android/web_feed_bridge.cc b/chrome/browser/feed/android/web_feed_bridge.cc
index 1865d3c..7a86d6b 100644
--- a/chrome/browser/feed/android/web_feed_bridge.cc
+++ b/chrome/browser/feed/android/web_feed_bridge.cc
@@ -371,7 +371,8 @@
       base::Days(GetFeedConfig().webfeed_accelerator_recent_visit_history_days);
   history_service->GetDailyVisitsToOrigin(
       url::Origin::Create(url::GURLAndroid::ToNativeGURL(env, j_url)),
-      begin_time, end_time, std::move(callback), &TaskTracker());
+      begin_time, end_time, history::VisitQuery404sPolicy::kExclude404s,
+      std::move(callback), &TaskTracker());
 }
 
 static void JNI_WebFeedBridge_IncrementFollowedFromWebPageMenuCount(
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc
index 249f369..94593b9 100644
--- a/chrome/browser/ui/browser_commands.cc
+++ b/chrome/browser/ui/browser_commands.cc
@@ -1288,28 +1288,7 @@
         Browser::Create(Browser::CreateParams(browser->profile(), true));
   }
 
-  int indices_size = tab_indices.size();
-  int active_index = browser->tab_strip_model()->active_index();
-  for (int i = 0; i < indices_size; i++) {
-    // Adjust tab index to account for tabs already moved.
-    int adjusted_index = tab_indices[i] - i;
-    bool pinned = browser->tab_strip_model()->IsTabPinned(adjusted_index);
-    std::unique_ptr<tabs::TabModel> tab_model =
-        browser->tab_strip_model()->DetachTabAtForInsertion(adjusted_index);
-
-    int add_types = pinned ? AddTabTypes::ADD_PINNED : 0;
-    // The last tab made active takes precedence, so activate the last active
-    // tab, with a fallback for the first tab (i == 0) if the active tab isn’t
-    // in the set of tabs being moved.
-    if (i == 0 || tab_indices[i] == active_index) {
-      add_types = add_types | AddTabTypes::ADD_ACTIVE;
-    }
-
-    new_browser->tab_strip_model()->AddTab(
-        std::move(tab_model), -1, ui::PAGE_TRANSITION_TYPED, add_types);
-  }
-
-  new_browser->window()->Show();
+  MoveTabsToExistingWindow(browser, new_browser, tab_indices);
 }
 
 bool CanCloseTabsToRight(const Browser* browser) {
@@ -1377,16 +1356,24 @@
   }
 
   int indices_size = tab_indices.size();
+  int active_index = source->tab_strip_model()->active_index();
   for (int i = 0; i < indices_size; i++) {
     // Adjust tab index to account for tabs already moved.
     int adjusted_index = tab_indices[i] - i;
     bool pinned = source->tab_strip_model()->IsTabPinned(adjusted_index);
     std::unique_ptr<tabs::TabModel> tab_model =
         source->tab_strip_model()->DetachTabAtForInsertion(adjusted_index);
-    int add_types =
-        AddTabTypes::ADD_ACTIVE | (pinned ? AddTabTypes::ADD_PINNED : 0);
-    target->tab_strip_model()->AddTab(std::move(tab_model), -1,
-                                      ui::PAGE_TRANSITION_TYPED, add_types);
+
+    int add_types = pinned ? AddTabTypes::ADD_PINNED : 0;
+    // The last tab made active takes precedence, so activate the last active
+    // tab, with a fallback for the first tab (i == 0) if the active tab isn’t
+    // in the set of tabs being moved.
+    if (i == 0 || tab_indices[i] == active_index) {
+      add_types = add_types | AddTabTypes::ADD_ACTIVE;
+    }
+
+    target->tab_strip_model()->AddTab(
+        std::move(tab_model), -1, ui::PAGE_TRANSITION_TYPED, add_types);
   }
   target->window()->Show();
 }
diff --git a/chrome/browser/ui/browser_commands_browsertest.cc b/chrome/browser/ui/browser_commands_browsertest.cc
index 228a7d9..0fc04615 100644
--- a/chrome/browser/ui/browser_commands_browsertest.cc
+++ b/chrome/browser/ui/browser_commands_browsertest.cc
@@ -452,6 +452,76 @@
   ASSERT_TRUE(second_window->tab_strip_model()->count() == 1);
 }
 
+IN_PROC_BROWSER_TEST_F(BrowserCommandsTest,
+                       MoveTabsToExistingWindow_ActiveTabMoved) {
+  auto AddTabs = [](Browser* browser, int count) {
+    for (int i = 0; i < count; ++i) {
+      chrome::NewTab(browser);
+    }
+  };
+
+  // Source browser: 0(NTP),1,2(active),3
+  AddTabs(browser(), 3);
+  browser()->tab_strip_model()->ActivateTabAt(2);
+  content::WebContents* src_active_tab =
+      browser()->tab_strip_model()->GetWebContentsAt(2);
+  // Target browser: 0
+  Browser* target_browser =
+      Browser::Create(Browser::CreateParams(browser()->profile(), true));
+  AddTabs(target_browser, 1);
+  ASSERT_EQ(browser()->tab_strip_model()->count(), 4);
+  ASSERT_EQ(target_browser->tab_strip_model()->count(), 1);
+
+  // Move tabs: includes active tab.
+  std::vector<int> indices = {1, 2, 3};
+  chrome::MoveTabsToExistingWindow(browser(), target_browser, indices);
+
+  // Verify tab counts after move.
+  EXPECT_EQ(1, browser()->tab_strip_model()->count());
+  EXPECT_EQ(4, target_browser->tab_strip_model()->count());
+
+  // Verify active tab in target matches the original active tab.
+  // 0,1,2(active),3
+  EXPECT_EQ(2, target_browser->tab_strip_model()->active_index());
+  EXPECT_EQ(src_active_tab,
+            target_browser->tab_strip_model()->GetActiveWebContents());
+}
+
+IN_PROC_BROWSER_TEST_F(BrowserCommandsTest,
+                       MoveTabsToExistingWindow_ActiveTabNotMoved) {
+  auto AddTabs = [](Browser* browser, int count) {
+    for (int i = 0; i < count; ++i) {
+      chrome::NewTab(browser);
+    }
+  };
+
+  // Source browser: 0(NTP,active),1,2,3
+  AddTabs(browser(), 3);
+  browser()->tab_strip_model()->ActivateTabAt(0);
+  // Target browser: 0
+  Browser* target_browser =
+      Browser::Create(Browser::CreateParams(browser()->profile(), true));
+  AddTabs(target_browser, 1);
+  ASSERT_EQ(browser()->tab_strip_model()->count(), 4);
+  ASSERT_EQ(target_browser->tab_strip_model()->count(), 1);
+
+  // Move tabs: does NOT include active tab.
+  std::vector<int> indices = {1, 2, 3};
+  content::WebContents* first_moved_tab =
+      browser()->tab_strip_model()->GetWebContentsAt(1);
+  chrome::MoveTabsToExistingWindow(browser(), target_browser, indices);
+
+  // Verify tab counts after move.
+  EXPECT_EQ(1, browser()->tab_strip_model()->count());
+  EXPECT_EQ(4, target_browser->tab_strip_model()->count());
+
+  // Fallback to the first moved tab.
+  // 0,1(active),2,3
+  EXPECT_EQ(1, target_browser->tab_strip_model()->active_index());
+  EXPECT_EQ(first_moved_tab,
+            target_browser->tab_strip_model()->GetActiveWebContents());
+}
+
 // Tests IDC_MOVE_TAB_TO_NEW_WINDOW. This is a browser test and not a unit test
 // since it needs to create a new browser window, which doesn't work with a
 // TestingProfile.
diff --git a/chrome/browser/ui/omnibox/chrome_omnibox_client.cc b/chrome/browser/ui/omnibox/chrome_omnibox_client.cc
index e99e89cc..4fe7996d 100644
--- a/chrome/browser/ui/omnibox/chrome_omnibox_client.cc
+++ b/chrome/browser/ui/omnibox/chrome_omnibox_client.cc
@@ -560,10 +560,10 @@
     } else {
       const TemplateURL* turl = nullptr;
       if (match.associated_keyword) {
-        turl = match.associated_keyword->GetTemplateURL(GetTemplateURLService(),
-                                                        false);
+        turl =
+            match.associated_keyword->GetTemplateURL(GetTemplateURLService());
       } else if (!match.keyword.empty()) {
-        turl = match.GetTemplateURL(GetTemplateURLService(), false);
+        turl = match.GetTemplateURL(GetTemplateURLService());
       }
       // Fetch the favicon if the `TemplateURL` is from the enterprise search
       // aggregator policy. This covers both cases:
diff --git a/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.cc b/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.cc
index d561349..cc5612a 100644
--- a/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.cc
+++ b/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.cc
@@ -307,8 +307,7 @@
 void ChromeOmniboxNavigationObserver::On404() {
   TemplateURLService* template_url_service =
       TemplateURLServiceFactory::GetForProfile(profile_);
-  const TemplateURL* template_url = match_.GetTemplateURL(
-      template_url_service, false /* allow_fallback_to_destination_host */);
+  const TemplateURL* template_url = match_.GetTemplateURL(template_url_service);
   // If the omnibox navigation was to a URL (and hence did not involve a
   // TemplateURL / search at all) or the invoked search engine has been
   // deleted or otherwise modified, doing nothing is the right thing.
diff --git a/chrome/browser/ui/omnibox/omnibox_controller.cc b/chrome/browser/ui/omnibox/omnibox_controller.cc
index 3988c97c..b23658ec 100644
--- a/chrome/browser/ui/omnibox/omnibox_controller.cc
+++ b/chrome/browser/ui/omnibox/omnibox_controller.cc
@@ -168,7 +168,7 @@
   if (OmniboxFieldTrial::IsStarterPackExpansionEnabled() &&
       match.from_keyword) {
     const TemplateURL* turl =
-        match.GetTemplateURL(client_->GetTemplateURLService(), false);
+        match.GetTemplateURL(client_->GetTemplateURLService());
     if (turl &&
         turl->starter_pack_id() == template_url_starter_pack_data::kGemini) {
       return true;
diff --git a/chrome/browser/ui/omnibox/omnibox_edit_model.cc b/chrome/browser/ui/omnibox/omnibox_edit_model.cc
index f3d37ff3..06ec1ee 100644
--- a/chrome/browser/ui/omnibox/omnibox_edit_model.cc
+++ b/chrome/browser/ui/omnibox/omnibox_edit_model.cc
@@ -1708,7 +1708,7 @@
     const AutocompleteMatch& match) const {
   // Return an empty image if not an extension match.
   TemplateURLService* service = controller_->client()->GetTemplateURLService();
-  const TemplateURL* template_url = match.GetTemplateURL(service, false);
+  const TemplateURL* template_url = match.GetTemplateURL(service);
   if (!template_url ||
       template_url->type() != TemplateURL::OMNIBOX_API_EXTENSION) {
     return gfx::Image();
@@ -2019,7 +2019,7 @@
       // with information from the keyword match, rather than the current match.
       CHECK(match.associated_keyword) << match.keyword;
       const TemplateURL* turl = match.associated_keyword->GetTemplateURL(
-          controller_->client()->GetTemplateURLService(), false);
+          controller_->client()->GetTemplateURLService());
       std::u16string replacement_string =
           turl ? turl->short_name() : match.contents;
       bool ask_keyword = turl && turl->is_ask_starter_pack();
@@ -2601,7 +2601,7 @@
   omnibox::answer_data_parser::LogAnswerUsed(match.answer_type);
 
   TemplateURLService* service = controller_->client()->GetTemplateURLService();
-  TemplateURL* template_url = match.GetTemplateURL(service, false);
+  TemplateURL* template_url = match.GetTemplateURL(service);
   if (template_url) {
     // |match| is a Search navigation or a URL navigation in keyword mode; log
     // search engine usage metrics.
diff --git a/chrome/browser/ui/views/omnibox/remove_suggestion_bubble.cc b/chrome/browser/ui/views/omnibox/remove_suggestion_bubble.cc
index bf61a2c..070c61a 100644
--- a/chrome/browser/ui/views/omnibox/remove_suggestion_bubble.cc
+++ b/chrome/browser/ui/views/omnibox/remove_suggestion_bubble.cc
@@ -55,7 +55,7 @@
     // Get the Search Provider name associated with this match.
     std::u16string search_provider_short_name;
     const TemplateURL* template_url =
-        match.GetTemplateURL(template_url_service, false);
+        match.GetTemplateURL(template_url_service);
     // If the match has no associated Search Provider, get the default one,
     // although this may still fail if it's forbidden by policy.
     if (!template_url) {
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt
index 523031cf..29b1be8 100644
--- a/chrome/build/android-arm32.pgo.txt
+++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@
-chrome-android32-main-1758931015-64353291d25d48e91387ce20404a6c405f95eae0-83b5728ee5389df34e3ec5762f30273474d80f94.profdata
+chrome-android32-main-1758995345-be1673a89072b7b7afea5e5247ec413134f9b51a-d9310cad7d8031629015eb3e77022f2ff49efa6b.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt
index 59fa5d38..f10e787 100644
--- a/chrome/build/android-arm64.pgo.txt
+++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@
-chrome-android64-main-1758931611-7e337a8333b801ca33703f6f859a116dc7a3b56b-c486e2f3de4ae29ef01ba41d44b98d26f4a0afc4.profdata
+chrome-android64-main-1758997571-da6b2dbda31c2ceaef34434e12af96c1d7960e1c-98b77b2262c5e0763648f5fbf7f890896222bf62.profdata
diff --git a/chrome/build/android-desktop-x64.pgo.txt b/chrome/build/android-desktop-x64.pgo.txt
index b0610a4..0776b89 100644
--- a/chrome/build/android-desktop-x64.pgo.txt
+++ b/chrome/build/android-desktop-x64.pgo.txt
@@ -1 +1 @@
-chrome-android-desktop-x64-main-1758931015-65a1a5ef68386fcc73ee11ca5238e59a2af03f60-83b5728ee5389df34e3ec5762f30273474d80f94.profdata
+chrome-android-desktop-x64-main-1758995345-2d0b49b9c84128939fba30c140ab27329fa5cd27-d9310cad7d8031629015eb3e77022f2ff49efa6b.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 4ee2012..2f9751a 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1758887821-86d46083f409d45f51fb0e3a1f4e5ff85b211d2d-8f33ed4a83774b89e76819368c55ce9c1830b42f.profdata
+chrome-linux-main-1758995345-058dde9b52af99c82e0b33451af817348b420fd5-d9310cad7d8031629015eb3e77022f2ff49efa6b.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt
index 6d0e3c64..39f9b04 100644
--- a/chrome/build/mac-arm.pgo.txt
+++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@
-chrome-mac-arm-main-1758938169-d73c2fa6c7e72a7c184d8d968772500a942a3963-5a5883c1454cbce8605814ed5d9b848167ed4d18.profdata
+chrome-mac-arm-main-1759003073-e1391304d4590c587a4125f09d03e11f9aae1845-108c9f40a970d3d5b6d60d6b8022867451cf15c4.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt
index 8fe9fe5..62cee74 100644
--- a/chrome/build/mac.pgo.txt
+++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@
-chrome-mac-main-1758931015-329ca4991e567824de92f01927e1d1254cf13da5-83b5728ee5389df34e3ec5762f30273474d80f94.profdata
+chrome-mac-main-1758995345-0e57ff97a3b6481131651e41fee54e2b315ba40b-d9310cad7d8031629015eb3e77022f2ff49efa6b.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt
index 86484a5..64892a57 100644
--- a/chrome/build/win-arm64.pgo.txt
+++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@
-chrome-win-arm64-main-1758931015-1f233ba938f122ab51891fdde324ed387d2f7dbe-83b5728ee5389df34e3ec5762f30273474d80f94.profdata
+chrome-win-arm64-main-1758995345-5619d2858077a0a82c54f0d0091ae41f3cd42ac6-d9310cad7d8031629015eb3e77022f2ff49efa6b.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt
index 9cf019b..961641d 100644
--- a/chrome/build/win32.pgo.txt
+++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@
-chrome-win32-main-1758909570-247d70c9c68f7829ca87703254483654d6846b8a-c14da0391a173fcbf78cba83679d6c1e18575eeb.profdata
+chrome-win32-main-1758985005-180d04274a3f86ec58749ebc28042a549f937bb0-c7d97773dc85ddac372f2b3ec91da962353e1edd.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 14e3de2..9bfe41d 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1758909570-37053fca9d353f9c2fb411b31befce4c35597383-c14da0391a173fcbf78cba83679d6c1e18575eeb.profdata
+chrome-win64-main-1758985005-0173c0ebeab5201f886abc38abf6e7e3b64c6189-c7d97773dc85ddac372f2b3ec91da962353e1edd.profdata
diff --git a/chrome/test/data/extensions/api_test/content_scripts/css_l10n_dynamic/_locales/en/messages.json b/chrome/test/data/extensions/api_test/content_scripts/css_l10n_dynamic/_locales/en/messages.json
new file mode 100644
index 0000000..9195a4c
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/content_scripts/css_l10n_dynamic/_locales/en/messages.json
@@ -0,0 +1,5 @@
+{
+  "color": {
+    "message": "red"
+  }
+}
diff --git a/chrome/test/data/extensions/api_test/content_scripts/css_l10n_dynamic/manifest.json b/chrome/test/data/extensions/api_test/content_scripts/css_l10n_dynamic/manifest.json
new file mode 100644
index 0000000..9d0aa508
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/content_scripts/css_l10n_dynamic/manifest.json
@@ -0,0 +1,11 @@
+{
+  "name": "Test",
+  "version": "1.0",
+  "manifest_version": 3,
+  "web_accessible_resources": [{
+    "resources": ["style.css"],
+    "matches": ["<all_urls>"],
+    "use_dynamic_url": true
+  }],
+  "default_locale": "en"
+}
diff --git a/chrome/test/data/extensions/api_test/content_scripts/css_l10n_dynamic/style.css b/chrome/test/data/extensions/api_test/content_scripts/css_l10n_dynamic/style.css
new file mode 100644
index 0000000..bb3612d3
--- /dev/null
+++ b/chrome/test/data/extensions/api_test/content_scripts/css_l10n_dynamic/style.css
@@ -0,0 +1,7 @@
+/* Copyright 2025 The Chromium Authors
+ * Use of this source code is governed by a BSD-style license that can be
+ * found in the LICENSE file. */
+
+body {
+  color: green;
+}
diff --git a/chrome/test/data/extensions/page_with_service_worker/index.html b/chrome/test/data/extensions/page_with_service_worker/index.html
new file mode 100644
index 0000000..4a2516a
--- /dev/null
+++ b/chrome/test/data/extensions/page_with_service_worker/index.html
@@ -0,0 +1,36 @@
+<!--
+Copyright 2025 The Chromium Authors
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+<!DOCTYPE html>
+<html lang="en">
+  <body>
+    Some text
+  </body>
+  <script>
+    // Waits for the service worker to claim this page as a client.
+    async function waitForClaim() {
+      await (new Promise((resolve) => {
+        // It's possible the service worker already claimed the page as a
+        // client. If so, resolve immediately.
+        if (navigator.serviceWorker.controller) {
+          resolve();
+          return;
+        }
+
+        // Wait for the service worker to take over as the controller.
+        navigator.serviceWorker.addEventListener(
+            'controllerchange', resolve, {once: true});
+      }));
+    }
+    // Register the service worker and wait for it to take control
+    addEventListener('load', async () => {
+      await navigator.serviceWorker.register('./service_worker.js');
+      const registration = await navigator.serviceWorker.ready;
+      await waitForClaim();
+      domAutomationController.send('ready');
+    });
+  </script>
+</body>
+</html>
diff --git a/chrome/test/data/extensions/page_with_service_worker/service_worker.js b/chrome/test/data/extensions/page_with_service_worker/service_worker.js
new file mode 100644
index 0000000..d341e67
--- /dev/null
+++ b/chrome/test/data/extensions/page_with_service_worker/service_worker.js
@@ -0,0 +1,35 @@
+// Copyright 2025 The Chromium Authors
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+self.addEventListener('install', event => {
+  // Skip waiting to activate the new service worker immediately.
+  self.skipWaiting();
+});
+
+self.addEventListener('activate', event => {
+  // Take control of the open page immediately.
+  event.waitUntil(self.clients.claim());
+});
+
+self.addEventListener('fetch', event => {
+  const url = new URL(event.request.url);
+
+  // Serve the result only for the expected resource.
+  if (!url.pathname.endsWith('style.css')) {
+    event.respondWith(fetch(event.request));
+    return;
+  }
+
+  const cssContent = `
+body {
+  color: __MSG_color__;
+}
+`;
+
+  const response =
+      new Response(cssContent, {headers: {'Content-Type': 'text/css'}});
+
+  // Respond to the fetch event with our custom response.
+  event.respondWith(response);
+});
diff --git a/chromeos/ash/components/boca/boca_session_manager_unittest.cc b/chromeos/ash/components/boca/boca_session_manager_unittest.cc
index d4efc61..5093162 100644
--- a/chromeos/ash/components/boca/boca_session_manager_unittest.cc
+++ b/chromeos/ash/components/boca/boca_session_manager_unittest.cc
@@ -214,6 +214,8 @@
   MOCK_METHOD(void, CheckConnection, (), (override));
 
   MOCK_METHOD(void, Stop, (base::OnceCallback<void(bool)>), (override));
+
+  MOCK_METHOD(bool, IsPresenting, (), (override));
 };
 
 class MockTeacherScreenPresenter : public TeacherScreenPresenter {
diff --git a/chromeos/ash/components/boca/receiver/get_kiosk_receiver_request.cc b/chromeos/ash/components/boca/receiver/get_kiosk_receiver_request.cc
index 8d155c8..1840fa2 100644
--- a/chromeos/ash/components/boca/receiver/get_kiosk_receiver_request.cc
+++ b/chromeos/ash/components/boca/receiver/get_kiosk_receiver_request.cc
@@ -61,7 +61,8 @@
           kiosk_receiver_dict->FindString(boca::kRobotEmail)) {
     receiver.set_robot_email(*robot_email_ptr);
   }
-  if (auto* state_ptr = kiosk_receiver_dict->FindString(boca::kReceiverState)) {
+  if (auto* state_ptr =
+          kiosk_receiver_dict->FindString(boca::kReceiverConnectionState)) {
     receiver.set_state(ReceiverConnectionStateProtoFromJson(*state_ptr));
   }
 
diff --git a/chromeos/ash/components/boca/receiver/get_kiosk_receiver_request_unittest.cc b/chromeos/ash/components/boca/receiver/get_kiosk_receiver_request_unittest.cc
index 25f82938..020ed88 100644
--- a/chromeos/ash/components/boca/receiver/get_kiosk_receiver_request_unittest.cc
+++ b/chromeos/ash/components/boca/receiver/get_kiosk_receiver_request_unittest.cc
@@ -48,7 +48,7 @@
           }));
   base::Value::Dict response_dict;
   response_dict.Set(boca::kRobotEmail, kRobotEmail);
-  response_dict.Set(boca::kReceiverState, kReceiverState);
+  response_dict.Set(boca::kReceiverConnectionState, kReceiverState);
   request.OnSuccess(std::make_unique<base::Value>(std::move(response_dict)));
 
   ASSERT_TRUE(response_body.has_value());
diff --git a/chromeos/ash/components/boca/receiver/student_screen_presenter_impl.cc b/chromeos/ash/components/boca/receiver/student_screen_presenter_impl.cc
index 6c5a93cd..dd3b43d 100644
--- a/chromeos/ash/components/boca/receiver/student_screen_presenter_impl.cc
+++ b/chromeos/ash/components/boca/receiver/student_screen_presenter_impl.cc
@@ -149,6 +149,10 @@
       std::move(stop_request));
 }
 
+bool StudentScreenPresenterImpl::IsPresenting() {
+  return receiver_id_.has_value();
+}
+
 void StudentScreenPresenterImpl::OnStartResponse(
     base::OnceCallback<void(bool)> success_cb,
     std::optional<std::string> connection_id) {
diff --git a/chromeos/ash/components/boca/receiver/student_screen_presenter_impl.h b/chromeos/ash/components/boca/receiver/student_screen_presenter_impl.h
index 810875e..ffd01511 100644
--- a/chromeos/ash/components/boca/receiver/student_screen_presenter_impl.h
+++ b/chromeos/ash/components/boca/receiver/student_screen_presenter_impl.h
@@ -58,6 +58,7 @@
              base::OnceClosure disconnected_cb) override;
   void CheckConnection() override;
   void Stop(base::OnceCallback<void(bool)> success_cb) override;
+  bool IsPresenting() override;
 
  private:
   void OnStartResponse(base::OnceCallback<void(bool)> success_cb,
diff --git a/chromeos/ash/components/boca/receiver/student_screen_presenter_impl_unittest.cc b/chromeos/ash/components/boca/receiver/student_screen_presenter_impl_unittest.cc
index a38afbb..be5935f 100644
--- a/chromeos/ash/components/boca/receiver/student_screen_presenter_impl_unittest.cc
+++ b/chromeos/ash/components/boca/receiver/student_screen_presenter_impl_unittest.cc
@@ -5,6 +5,7 @@
 #include "chromeos/ash/components/boca/receiver/student_screen_presenter_impl.h"
 
 #include <optional>
+#include <string>
 #include <string_view>
 
 #include "base/functional/callback_helpers.h"
@@ -37,10 +38,8 @@
 constexpr std::string_view kConnectionId = "connection-id";
 constexpr std::string_view kConnectionIdPair =
     R"({"connectionId": "connection-id"})";
-constexpr std::string_view kStateDisconnectedPair =
-    R"({"state": "DISCONNECTED"})";
-constexpr std::string_view kStateStopRequestedPair =
-    R"({"state": "STOP_REQUESTED"})";
+constexpr std::string_view kDisconnectedState = "DISCONNECTED";
+constexpr std::string_view kStopRequestedState = "STOP_REQUESTED";
 
 class StudentScreenPresenterImplTest : public testing::Test {
  protected:
@@ -120,6 +119,18 @@
               user_identity.gaia_id());
   }
 
+  std::string CheckConnectionStateJson(std::string_view connection_state) {
+    return base::ReplaceStringPlaceholders(
+        R"({"receiverConnectionState": "$1"})", {std::string(connection_state)},
+        /*offsets=*/nullptr);
+  }
+
+  std::string UpdateConnectionStateJson(std::string_view connection_state) {
+    return base::ReplaceStringPlaceholders(R"({"state": "$1"})",
+                                           {std::string(connection_state)},
+                                           /*offsets=*/nullptr);
+  }
+
   base::test::TaskEnvironment task_environment_{
       base::test::TaskEnvironment::TimeSource::MOCK_TIME};
   AccountInfo account_info_;
@@ -209,7 +220,7 @@
 
   url_loader_factory_.AddResponse(
       GetKioskReceiverUrl(kReceiverId, kConnectionId).spec(),
-      kStateDisconnectedPair);
+      CheckConnectionStateJson(kDisconnectedState));
   presenter.CheckConnection();
   EXPECT_TRUE(disconnected_future.Wait());
 
@@ -236,8 +247,10 @@
   EXPECT_TRUE(start_future1.Get());
 
   url_loader_factory_.AddResponse(
-      GetKioskReceiverUrl(kReceiverId, kStateStopRequestedPair).spec(),
-      kStateStopRequestedPair);
+      GetKioskReceiverUrl(kReceiverId,
+                          CheckConnectionStateJson(kStopRequestedState))
+          .spec(),
+      CheckConnectionStateJson(kStopRequestedState));
   presenter.CheckConnection();
   task_environment_.RunUntilIdle();
   EXPECT_FALSE(disconnected_future.IsReady());
@@ -291,10 +304,11 @@
   EXPECT_TRUE(start_future1.Get());
 
   presenter.Stop(stop_future.GetCallback());
-  std::optional<base::Value::Dict> update_request = GetRequestBodyAndRespond(
-      GetUpdateReceiverUrl(kReceiverId, kConnectionId), kStateDisconnectedPair);
+  std::optional<base::Value::Dict> update_request =
+      GetRequestBodyAndRespond(GetUpdateReceiverUrl(kReceiverId, kConnectionId),
+                               UpdateConnectionStateJson(kDisconnectedState));
   ASSERT_TRUE(update_request.has_value());
-  EXPECT_EQ(*update_request->FindString("state"), "STOP_REQUESTED");
+  EXPECT_EQ(*update_request->FindString("state"), kStopRequestedState);
   EXPECT_TRUE(stop_future.Get());
   EXPECT_FALSE(disconnected_future.IsReady());
 
@@ -350,17 +364,17 @@
 
   url_loader_factory_.AddResponse(
       GetUpdateReceiverUrl(kReceiverId, kConnectionId).spec(),
-      kStateStopRequestedPair);
+      UpdateConnectionStateJson(kStopRequestedState));
   presenter.Stop(stop_future.GetCallback());
   task_environment_.RunUntilIdle();
 
   presenter.CheckConnection();
   WaitAndRespond(GetKioskReceiverUrl(kReceiverId, kConnectionId),
-                 kStateStopRequestedPair);
+                 CheckConnectionStateJson(kStopRequestedState));
 
   task_environment_.FastForwardBy(base::Seconds(5));
   WaitAndRespond(GetKioskReceiverUrl(kReceiverId, kConnectionId),
-                 kStateDisconnectedPair);
+                 CheckConnectionStateJson(kDisconnectedState));
   EXPECT_TRUE(stop_future.Get());
   EXPECT_FALSE(disconnected_future.IsReady());
 }
@@ -380,13 +394,13 @@
 
   url_loader_factory_.AddResponse(
       GetUpdateReceiverUrl(kReceiverId, kConnectionId).spec(),
-      kStateStopRequestedPair);
+      UpdateConnectionStateJson(kStopRequestedState));
   presenter.Stop(stop_future.GetCallback());
   task_environment_.RunUntilIdle();
 
   url_loader_factory_.AddResponse(
       GetKioskReceiverUrl(kReceiverId, kConnectionId).spec(),
-      kStateStopRequestedPair);
+      CheckConnectionStateJson(kStopRequestedState));
   task_environment_.FastForwardBy(base::Seconds(5));
   EXPECT_FALSE(stop_future.Get());
 }
@@ -412,14 +426,14 @@
   presenter.Stop(stop_future.GetCallback());
   url_loader_factory_.AddResponse(
       GetKioskReceiverUrl(kReceiverId, kConnectionId).spec(),
-      kStateDisconnectedPair);
+      CheckConnectionStateJson(kDisconnectedState));
   // Check connection should be cancelled since stop is requested.
   task_environment_.RunUntilIdle();
   EXPECT_FALSE(stop_future.IsReady());
 
   url_loader_factory_.AddResponse(
       GetUpdateReceiverUrl(kReceiverId, kConnectionId).spec(),
-      kStateDisconnectedPair);
+      UpdateConnectionStateJson(kDisconnectedState));
   EXPECT_TRUE(stop_future.Get());
   EXPECT_FALSE(disconnected_future.IsReady());
 }
@@ -441,7 +455,7 @@
 
   url_loader_factory_.AddResponse(
       GetKioskReceiverUrl(kReceiverId, kConnectionId).spec(),
-      kStateDisconnectedPair);
+      CheckConnectionStateJson(kDisconnectedState));
   presenter.Stop(stop_future.GetCallback());
   // Check connection should be ignored since stop request is in progress.
   presenter.CheckConnection();
@@ -450,7 +464,7 @@
 
   url_loader_factory_.AddResponse(
       GetUpdateReceiverUrl(kReceiverId, kConnectionId).spec(),
-      kStateDisconnectedPair);
+      UpdateConnectionStateJson(kDisconnectedState));
   EXPECT_TRUE(stop_future.Get());
   EXPECT_FALSE(disconnected_future.IsReady());
 }
@@ -473,13 +487,13 @@
 
   url_loader_factory_.AddResponse(
       GetUpdateReceiverUrl(kReceiverId, kConnectionId).spec(),
-      kStateStopRequestedPair);
+      UpdateConnectionStateJson(kStopRequestedState));
   presenter.Stop(stop_future.GetCallback());
   task_environment_.RunUntilIdle();
 
   url_loader_factory_.AddResponse(
       GetKioskReceiverUrl(kReceiverId, kConnectionId).spec(),
-      kStateDisconnectedPair);
+      CheckConnectionStateJson(kDisconnectedState));
   presenter.CheckConnection();
   EXPECT_TRUE(stop_future.Get());
 
@@ -504,7 +518,7 @@
 
   url_loader_factory_.AddResponse(
       GetUpdateReceiverUrl(kReceiverId, kConnectionId).spec(),
-      kStateStopRequestedPair);
+      UpdateConnectionStateJson(kStopRequestedState));
   presenter.Stop(stop_future.GetCallback());
   task_environment_.RunUntilIdle();
 
@@ -514,7 +528,7 @@
 
   task_environment_.FastForwardBy(base::Seconds(5));
   WaitAndRespond(GetKioskReceiverUrl(kReceiverId, kConnectionId),
-                 kStateDisconnectedPair);
+                 CheckConnectionStateJson(kDisconnectedState));
   EXPECT_TRUE(stop_future.Get());
   EXPECT_FALSE(disconnected_future.IsReady());
 }
diff --git a/chromeos/ash/components/boca/session_api/constants.h b/chromeos/ash/components/boca/session_api/constants.h
index 16c6fbf..6353368 100644
--- a/chromeos/ash/components/boca/session_api/constants.h
+++ b/chromeos/ash/components/boca/session_api/constants.h
@@ -95,7 +95,7 @@
 inline constexpr char kStudentStatus[] = "studentStatuses";
 inline constexpr char kStudentStatusState[] = "state";
 inline constexpr char kDeviceStatusState[] = "state";
-inline constexpr char kReceiverState[] = "state";
+inline constexpr char kReceiverConnectionState[] = "receiverConnectionState";
 inline constexpr char kUrl[] = "url";
 inline constexpr char kTitle[] = "title";
 inline constexpr char kFavIcon[] = "faviconUrl";
diff --git a/chromeos/ash/components/boca/student_screen_presenter.h b/chromeos/ash/components/boca/student_screen_presenter.h
index 240ad54a8..7a31725 100644
--- a/chromeos/ash/components/boca/student_screen_presenter.h
+++ b/chromeos/ash/components/boca/student_screen_presenter.h
@@ -32,6 +32,8 @@
 
   virtual void Stop(base::OnceCallback<void(bool)> success_cb) = 0;
 
+  virtual bool IsPresenting() = 0;
+
  protected:
   StudentScreenPresenter() = default;
 };
diff --git a/clank b/clank
index 1b59aa2..2503c7a 160000
--- a/clank
+++ b/clank
@@ -1 +1 @@
-Subproject commit 1b59aa2b6c0cd8da2f566044846ef1590fe32e72
+Subproject commit 2503c7ae1f74a085503e3432fe26ff1f49397c26
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json
index dc2aec5..723358d 100644
--- a/components/certificate_transparency/data/log_list.json
+++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@
 {
-  "version": "69.9",
-  "log_list_timestamp": "2025-09-26T12:53:25Z",
+  "version": "69.10",
+  "log_list_timestamp": "2025-09-27T12:53:30Z",
   "operators": [
     {
       "name": "Google",
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc
index 953b433..ab13997 100644
--- a/components/history/core/browser/history_backend.cc
+++ b/components/history/core/browser/history_backend.cc
@@ -2166,11 +2166,13 @@
 DailyVisitsResult HistoryBackend::GetDailyVisitsToOrigin(
     const url::Origin& origin,
     base::Time begin_time,
-    base::Time end_time) {
+    base::Time end_time,
+    VisitQuery404sPolicy policy_for_404_visits) {
   if (!db_) {
     return {};
   }
-  return db_->GetDailyVisitsToOrigin(origin, begin_time, end_time);
+  return db_->GetDailyVisitsToOrigin(origin, begin_time, end_time,
+                                     policy_for_404_visits);
 }
 
 // Keyword visits --------------------------------------------------------------
diff --git a/components/history/core/browser/history_backend.h b/components/history/core/browser/history_backend.h
index b290326..32adee2 100644
--- a/components/history/core/browser/history_backend.h
+++ b/components/history/core/browser/history_backend.h
@@ -425,10 +425,13 @@
       VisitQuery404sPolicy policy_for_404_visits);
 
   // Gets counts for total visits and days visited for pages matching `origin`.
-  // Counts only user-visible visits.
-  DailyVisitsResult GetDailyVisitsToOrigin(const url::Origin& origin,
-                                           base::Time begin_time,
-                                           base::Time end_time);
+  // Counts only user-visible visits. Counts or ignores visits with an HTTP
+  // response code of 404 based on `policy_for_404_visits`.
+  DailyVisitsResult GetDailyVisitsToOrigin(
+      const url::Origin& origin,
+      base::Time begin_time,
+      base::Time end_time,
+      VisitQuery404sPolicy policy_for_404_visits);
 
   // Favicon -------------------------------------------------------------------
 
diff --git a/components/history/core/browser/history_service.cc b/components/history/core/browser/history_service.cc
index ac9b3df..17329af 100644
--- a/components/history/core/browser/history_service.cc
+++ b/components/history/core/browser/history_service.cc
@@ -1244,6 +1244,7 @@
     const url::Origin& origin,
     base::Time begin_time,
     base::Time end_time,
+    VisitQuery404sPolicy policy_for_404_visits,
     GetDailyVisitsToOriginCallback callback,
     base::CancelableTaskTracker* tracker) {
   DCHECK(backend_task_runner_) << "History service being called after cleanup";
@@ -1252,7 +1253,7 @@
   return tracker->PostTaskAndReplyWithResult(
       backend_task_runner_.get(), FROM_HERE,
       base::BindOnce(&HistoryBackend::GetDailyVisitsToOrigin, history_backend_,
-                     origin, begin_time, end_time),
+                     origin, begin_time, end_time, policy_for_404_visits),
       std::move(callback));
 }
 
diff --git a/components/history/core/browser/history_service.h b/components/history/core/browser/history_service.h
index c72d405..79138cd3 100644
--- a/components/history/core/browser/history_service.h
+++ b/components/history/core/browser/history_service.h
@@ -482,6 +482,7 @@
       const url::Origin& origin,
       base::Time begin_time,
       base::Time end_time,
+      VisitQuery404sPolicy policy_for_404_visits,
       GetDailyVisitsToOriginCallback callback,
       base::CancelableTaskTracker* tracker);
 
diff --git a/components/history/core/browser/visit_database.cc b/components/history/core/browser/visit_database.cc
index 85fa936..aebe93e 100644
--- a/components/history/core/browser/visit_database.cc
+++ b/components/history/core/browser/visit_database.cc
@@ -1218,7 +1218,8 @@
 DailyVisitsResult VisitDatabase::GetDailyVisitsToOrigin(
     const url::Origin& origin,
     base::Time begin_time,
-    base::Time end_time) {
+    base::Time end_time,
+    VisitQuery404sPolicy policy_for_404_visits) {
   DailyVisitsResult result;
   if (origin.opaque() || !(origin.scheme() == url::kHttpScheme ||
                            origin.scheme() == url::kHttpsScheme)) {
@@ -1228,20 +1229,46 @@
   std::pair<std::string, std::string> host_bounds =
       GetOriginSearchBounds(origin.GetURL());
 
-  sql::Statement statement(GetDB().GetCachedStatement(
-      // clang-format off
-      SQL_FROM_HERE,
-        "SELECT "
-        "visit_time,"
-        "transition "
-        "FROM visits v INNER JOIN urls u ON v.url=u.id "
-        "WHERE "
-          "u.url>=? AND "
-          "u.url<? AND "
-          "v.visit_time>=? AND "
-          "v.visit_time<?"
-      // clang-format on
-      ));
+  sql::Statement statement;
+  switch (policy_for_404_visits) {
+    case VisitQuery404sPolicy::kInclude404s:
+      statement.Assign(GetDB().GetCachedStatement(
+          // clang-format off
+          SQL_FROM_HERE,
+            "SELECT "
+            "visit_time,"
+            "transition "
+            "FROM visits v INNER JOIN urls u ON v.url=u.id "
+            "WHERE "
+              "u.url>=? AND "
+              "u.url<? AND "
+              "v.visit_time>=? AND "
+              "v.visit_time<?"
+          // clang-format on
+          ));
+      break;
+    case VisitQuery404sPolicy::kExclude404s:
+      statement.Assign(GetDB().GetCachedStatement(
+          // clang-format off
+          SQL_FROM_HERE,
+            "SELECT "
+            "visit_time,"
+            "transition "
+            "FROM visits v INNER JOIN urls u ON v.url=u.id "
+            "LEFT OUTER JOIN context_annotations ca ON v.id=ca.visit_id "
+            "WHERE "
+              "u.url>=? AND "
+              "u.url<? AND "
+              "v.visit_time>=? AND "
+              "v.visit_time<? AND "
+              "("
+                "ca.response_code IS NULL OR "
+                "ca.response_code!=404"
+              ")"
+          // clang-format on
+          ));
+      break;
+  }
 
   statement.BindString(0, host_bounds.first);
   statement.BindString(1, host_bounds.second);
diff --git a/components/history/core/browser/visit_database.h b/components/history/core/browser/visit_database.h
index 79748d3..e1bbf71 100644
--- a/components/history/core/browser/visit_database.h
+++ b/components/history/core/browser/visit_database.h
@@ -256,10 +256,13 @@
                             base::Time* last_visit);
 
   // Gets counts for total visits and days visited for pages matching `origin`.
-  // Counts only user-visible visits.
-  DailyVisitsResult GetDailyVisitsToOrigin(const url::Origin& origin,
-                                           base::Time begin_time,
-                                           base::Time end_time);
+  // Counts only user-visible visits. Counts or ignores visits with an HTTP
+  // response code of 404 based on `policy_for_404_visits`.
+  DailyVisitsResult GetDailyVisitsToOrigin(
+      const url::Origin& origin,
+      base::Time begin_time,
+      base::Time end_time,
+      VisitQuery404sPolicy policy_for_404_visits);
 
   // Get the time of the first item in our database.
   bool GetStartDate(base::Time* first_visit);
diff --git a/components/history/core/browser/visit_database_unittest.cc b/components/history/core/browser/visit_database_unittest.cc
index 95bf1546..3a69dd1 100644
--- a/components/history/core/browser/visit_database_unittest.cc
+++ b/components/history/core/browser/visit_database_unittest.cc
@@ -1460,7 +1460,8 @@
   add_visit(GURL("https://foo.com/bar"), end_time + base::Seconds(1));
 
   DailyVisitsResult result = GetDailyVisitsToOrigin(
-      url::Origin::Create(GURL("https://foo.com")), begin_time, end_time);
+      url::Origin::Create(GURL("https://foo.com")), begin_time, end_time,
+      VisitQuery404sPolicy::kInclude404s);
   EXPECT_TRUE(result.success);
   EXPECT_EQ(2, result.days_with_visits);
   EXPECT_EQ(7, result.total_visits);
@@ -1482,12 +1483,74 @@
 
   DailyVisitsResult result = GetDailyVisitsToOrigin(
       url::Origin::Create(GURL("https://www.chromium.org")), begin_time,
-      end_time);
+      end_time, VisitQuery404sPolicy::kInclude404s);
   EXPECT_TRUE(result.success);
   EXPECT_EQ(0, result.days_with_visits);
   EXPECT_EQ(0, result.total_visits);
 }
 
+TEST_F(VisitDatabaseTest, GetDailyVisitsToOrigin_404s) {
+  base::Time begin_time = base::Time::Now();
+  base::Time end_time = begin_time + base::Days(10);
+
+  auto add_visit = [&](const GURL& url, base::Time visit_time,
+                       int response_code) {
+    VisitRow row{AddURL(URLRow(url)),
+                 visit_time,
+                 0,
+                 ui::PageTransitionFromInt(ui::PAGE_TRANSITION_LINK |
+                                           ui::PAGE_TRANSITION_CHAIN_START |
+                                           ui::PAGE_TRANSITION_CHAIN_END),
+                 0,
+                 false,
+                 0};
+    AddVisit(&row, SOURCE_BROWSED);
+    VisitContextAnnotations annotations;
+    annotations.on_visit.response_code = response_code;
+    AddContextAnnotationsForVisit(row.visit_id, annotations);
+  };
+
+  // `origin1` has only a single visit in the time range, and it's a 404.
+  url::Origin origin1 = url::Origin::Create(GURL("https://foo.com"));
+  add_visit(GURL("https://foo.com/404"), begin_time, 404);
+
+  // When including 404s for `origin1`, we should get 1 day with 1 visit.
+  DailyVisitsResult result = GetDailyVisitsToOrigin(
+      origin1, begin_time, end_time, VisitQuery404sPolicy::kInclude404s);
+  EXPECT_TRUE(result.success);
+  EXPECT_EQ(1, result.days_with_visits);
+  EXPECT_EQ(1, result.total_visits);
+
+  // When excluding 404s for `origin1`, we should get 0 days with visits, 0
+  // visits total.
+  result = GetDailyVisitsToOrigin(origin1, begin_time, end_time,
+                                  VisitQuery404sPolicy::kExclude404s);
+  EXPECT_TRUE(result.success);
+  EXPECT_EQ(0, result.days_with_visits);
+  EXPECT_EQ(0, result.total_visits);
+
+  // `origin2` has two visits on a single day in the time range: one is a 404
+  // and the other is not.
+  url::Origin origin2 = url::Origin::Create(GURL("https://bar.com"));
+  add_visit(GURL("https://bar.com/404"), begin_time, 404);
+  add_visit(GURL("https://bar.com/200"), begin_time + base::Hours(1), 200);
+
+  // When including 404s for `origin2`, we should get 1 day with 2 visits.
+  result = GetDailyVisitsToOrigin(origin2, begin_time, end_time,
+                                  VisitQuery404sPolicy::kInclude404s);
+  EXPECT_TRUE(result.success);
+  EXPECT_EQ(1, result.days_with_visits);
+  EXPECT_EQ(2, result.total_visits);
+
+  // When excluding 404s for `origin2`, we should still get 1 day, but with only
+  // 1 visit.
+  result = GetDailyVisitsToOrigin(origin2, begin_time, end_time,
+                                  VisitQuery404sPolicy::kExclude404s);
+  EXPECT_TRUE(result.success);
+  EXPECT_EQ(1, result.days_with_visits);
+  EXPECT_EQ(1, result.total_visits);
+}
+
 TEST_F(VisitDatabaseTest, GetGoogleDomainVisitsFromSearchesInRange_NoVisits) {
   const auto begin_time = base::Time::Now();
   EXPECT_THAT(GetGoogleDomainVisitsFromSearchesInRange(
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc
index f1344c48..9a59aa1 100644
--- a/components/omnibox/browser/autocomplete_controller.cc
+++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -1049,7 +1049,7 @@
       base::UTF16ToUTF8(match->search_terms_args->search_terms));
 
   // Append an extra header to navigations from the @gemini scope.
-  const TemplateURL* turl = match->GetTemplateURL(template_url_service_, false);
+  const TemplateURL* turl = match->GetTemplateURL(template_url_service_);
   if (turl &&
       turl->starter_pack_id() == template_url_starter_pack_data::kGemini &&
       !encoded_search_terms.empty() &&
@@ -1922,7 +1922,7 @@
       bool is_contextual = i->IsContextualSearchSuggestion();
       if (i->keyword != last_keyword || is_contextual != last_contextual) {
         const TemplateURL* template_url =
-            i->GetTemplateURL(template_url_service_, false);
+            i->GetTemplateURL(template_url_service_);
         if (template_url) {
           // The search keyword description is applied except in these cases:
           // - For extension keywords, the description is the extension name.
@@ -2074,7 +2074,7 @@
   for (size_t index = 0; index < result->size(); ++index) {
     AutocompleteMatch* match = result->match_at(index);
     const TemplateURL* template_url =
-        match->GetTemplateURL(template_url_service_, false);
+        match->GetTemplateURL(template_url_service_);
     if (!template_url || !match->search_terms_args) {
       continue;
     }
@@ -2124,7 +2124,7 @@
       if (action_in_suggest != nullptr) {
         action_in_suggest->template_action.set_action_uri(
             ComputeURLFromSearchTermsArgs(
-                match->GetTemplateURL(template_url_service_, false),
+                match->GetTemplateURL(template_url_service_),
                 *search_terms_args)
                 .spec());
       }
@@ -2139,7 +2139,7 @@
       if (contextual_takover_action) {
         contextual_takover_action->set_fulfillment_url(
             ComputeURLFromSearchTermsArgs(
-                match->GetTemplateURL(template_url_service_, false),
+                match->GetTemplateURL(template_url_service_),
                 *match->search_terms_args));
       }
     }
diff --git a/components/omnibox/browser/autocomplete_match.cc b/components/omnibox/browser/autocomplete_match.cc
index 75bedc1..ca30f96 100644
--- a/components/omnibox/browser/autocomplete_match.cc
+++ b/components/omnibox/browser/autocomplete_match.cc
@@ -1137,7 +1137,7 @@
     TemplateURLService* template_url_service) {
   DCHECK(template_url_service);
 
-  TemplateURL* template_url = match.GetTemplateURL(template_url_service, false);
+  TemplateURL* template_url = match.GetTemplateURL(template_url_service);
   if (!template_url) {
     return;
   }
@@ -1270,8 +1270,7 @@
   if (!associated_keyword) {
     return false;
   }
-  TemplateURL* turl =
-      associated_keyword->GetTemplateURL(template_url_service, false);
+  TemplateURL* turl = associated_keyword->GetTemplateURL(template_url_service);
   return turl && (turl->starter_pack_id() != 0 || turl->featured_by_policy());
 }
 
@@ -1286,9 +1285,8 @@
       *is_keyword_hint
           ? associated_keyword->keyword
           : GetSubstitutingExplicitlyInvokedKeyword(template_url_service));
-  *keyword_placeholder_out =
-      GetKeywordPlaceholder(GetTemplateURL(template_url_service, false),
-                            is_history_embeddings_enabled);
+  *keyword_placeholder_out = GetKeywordPlaceholder(
+      GetTemplateURL(template_url_service), is_history_embeddings_enabled);
 }
 
 std::u16string AutocompleteMatch::GetSubstitutingExplicitlyInvokedKeyword(
@@ -1298,7 +1296,7 @@
     return std::u16string();
   }
 
-  const TemplateURL* t_url = GetTemplateURL(template_url_service, false);
+  const TemplateURL* t_url = GetTemplateURL(template_url_service);
   return (t_url &&
           t_url->SupportsReplacement(template_url_service->search_terms_data()))
              ? keyword
@@ -1350,12 +1348,8 @@
 }
 
 TemplateURL* AutocompleteMatch::GetTemplateURL(
-    TemplateURLService* template_url_service,
-    bool allow_fallback_to_destination_host) const {
-  return GetTemplateURLWithKeyword(template_url_service, keyword,
-                                   allow_fallback_to_destination_host
-                                       ? destination_url.host()
-                                       : std::string());
+    TemplateURLService* template_url_service) const {
+  return GetTemplateURLWithKeyword(template_url_service, keyword, "");
 }
 
 GURL AutocompleteMatch::ImageUrl() const {
diff --git a/components/omnibox/browser/autocomplete_match.h b/components/omnibox/browser/autocomplete_match.h
index dd6e147..2330cc1 100644
--- a/components/omnibox/browser/autocomplete_match.h
+++ b/components/omnibox/browser/autocomplete_match.h
@@ -620,14 +620,10 @@
       const TemplateURL* template_url,
       bool is_history_embeddings_enabled);
 
-  // Returns the TemplateURL associated with this match.  This may be NULL if
-  // the match has no keyword OR if the keyword no longer corresponds to a valid
-  // TemplateURL.  See comments on |keyword| below.
-  // If |allow_fallback_to_destination_host| is true and the keyword does
-  // not map to a valid TemplateURL, we'll then check for a TemplateURL that
-  // corresponds to the destination_url's hostname.
-  TemplateURL* GetTemplateURL(TemplateURLService* template_url_service,
-                              bool allow_fallback_to_destination_host) const;
+  // Returns the `TemplateURL` associated with this match. This may be nullptr
+  // if the match has no keyword OR if the keyword no longer corresponds to a
+  // valid `TemplateURL`. See comments on `keyword` below.
+  TemplateURL* GetTemplateURL(TemplateURLService* template_url_service) const;
 
   // Gets the URL for the match image (whether it be an answer or entity). If
   // there isn't an image URL, returns an empty GURL (test with is_empty()).
diff --git a/components/omnibox/browser/autocomplete_provider_unittest.cc b/components/omnibox/browser/autocomplete_provider_unittest.cc
index b438182..d98cbee 100644
--- a/components/omnibox/browser/autocomplete_provider_unittest.cc
+++ b/components/omnibox/browser/autocomplete_provider_unittest.cc
@@ -296,7 +296,7 @@
     if (!match_keyword_.empty()) {
       match.keyword = match_keyword_;
       ASSERT_NE(nullptr,
-                match.GetTemplateURL(client_->GetTemplateURLService(), false));
+                match.GetTemplateURL(client_->GetTemplateURLService()));
     }
 
     matches_.push_back(match);
diff --git a/components/omnibox/browser/base_search_provider.cc b/components/omnibox/browser/base_search_provider.cc
index 7833496..7a0c032 100644
--- a/components/omnibox/browser/base_search_provider.cc
+++ b/components/omnibox/browser/base_search_provider.cc
@@ -490,7 +490,7 @@
   }
 
   const TemplateURL* template_url =
-      match.GetTemplateURL(client_->GetTemplateURLService(), false);
+      match.GetTemplateURL(client_->GetTemplateURLService());
   // This may be nullptr if the template corresponding to the keyword has been
   // deleted or there is no keyword set.
   if (template_url != nullptr) {
diff --git a/components/omnibox/browser/shortcuts_backend.cc b/components/omnibox/browser/shortcuts_backend.cc
index 20237b6..b9e3fef 100644
--- a/components/omnibox/browser/shortcuts_backend.cc
+++ b/components/omnibox/browser/shortcuts_backend.cc
@@ -432,7 +432,7 @@
   if (AutocompleteMatch::IsSearchType(match.type) && match.search_terms_args) {
     temp = BaseSearchProvider::CreateShortcutSearchSuggestion(
         match.search_terms_args->search_terms, match_type,
-        match.GetTemplateURL(template_url_service, false), *search_terms_data);
+        match.GetTemplateURL(template_url_service), *search_terms_data);
     normalized_match = &temp;
   } else if (!match.keyword.empty()) {
     // Remove the keyword from `fill_into_edit` and `transition` since
diff --git a/components/viz/service/layers/layer_context_impl.cc b/components/viz/service/layers/layer_context_impl.cc
index 003ae19..2fda735 100644
--- a/components/viz/service/layers/layer_context_impl.cc
+++ b/components/viz/service/layers/layer_context_impl.cc
@@ -1939,6 +1939,7 @@
   property_trees.set_changed(any_tree_changed);
   if (any_tree_changed) {
     property_trees.ResetCachedData();
+    layers.set_needs_update_draw_properties();
   }
 
   std::vector<std::unique_ptr<cc::RenderSurfaceImpl>> old_render_surfaces;
diff --git a/extensions/common/extension_features.cc b/extensions/common/extension_features.cc
index 10eabab..fa2189d 100644
--- a/extensions/common/extension_features.cc
+++ b/extensions/common/extension_features.cc
@@ -58,6 +58,8 @@
 BASE_FEATURE(kExtensionDisableUnsupportedDeveloper,
              base::FEATURE_ENABLED_BY_DEFAULT);
 
+BASE_FEATURE(kExtensionLocalizationGuid, base::FEATURE_ENABLED_BY_DEFAULT);
+
 BASE_FEATURE(kExtensionIconVariants, base::FEATURE_DISABLED_BY_DEFAULT);
 
 BASE_FEATURE(kExtensionManifestV2Unsupported, base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/extensions/common/extension_features.h b/extensions/common/extension_features.h
index 9781a6f..8f945f4b 100644
--- a/extensions/common/extension_features.h
+++ b/extensions/common/extension_features.h
@@ -103,6 +103,10 @@
 // If enabled, disables unpacked extensions if developer mode is off.
 BASE_DECLARE_FEATURE(kExtensionDisableUnsupportedDeveloper);
 
+// Allow e.g. .css files to use default_locale messages in WAR files via GUID.
+// TODO(crbug.com/435609878): Remove after m142. It's for safe m141 back merge.
+BASE_DECLARE_FEATURE(kExtensionLocalizationGuid);
+
 // A replacement key for declaring icons, in addition to supporting dark mode.
 BASE_DECLARE_FEATURE(kExtensionIconVariants);
 
diff --git a/extensions/renderer/extension_localization_throttle.cc b/extensions/renderer/extension_localization_throttle.cc
index b332c6f..abe98687 100644
--- a/extensions/renderer/extension_localization_throttle.cc
+++ b/extensions/renderer/extension_localization_throttle.cc
@@ -13,6 +13,7 @@
 #include "content/public/renderer/render_frame.h"
 #include "content/public/renderer/render_thread.h"
 #include "extensions/common/constants.h"
+#include "extensions/common/extension_features.h"
 #include "extensions/common/extension_id.h"
 #include "extensions/renderer/extension_frame_helper.h"
 #include "extensions/renderer/renderer_extension_registry.h"
@@ -291,7 +292,11 @@
 
   // `response_url.host()` is expected to be the extension id. However, it could
   // be a guid e.g. when a web service worker intercepts a guid fetch for css.
-  ExtensionId extension_id = GetExtensionIdForGurl(response_url);
+  ExtensionId extension_id =
+      base::FeatureList::IsEnabled(
+          extensions_features::kExtensionLocalizationGuid)
+          ? GetExtensionIdForGurl(response_url)
+          : response_url.host();
 
   auto loader = std::make_unique<ExtensionLocalizationURLLoader>(
       frame_token_, extension_id, std::move(url_loader_client));
diff --git a/ios/chrome/browser/follow/model/follow_tab_helper.mm b/ios/chrome/browser/follow/model/follow_tab_helper.mm
index 1e0f537..a423709 100644
--- a/ios/chrome/browser/follow/model/follow_tab_helper.mm
+++ b/ios/chrome/browser/follow/model/follow_tab_helper.mm
@@ -225,6 +225,7 @@
   // Get daily visit count for `url` from the history service.
   history_service->GetDailyVisitsToOrigin(
       url::Origin::Create(url), begin_time, end_time,
+      history::VisitQuery404sPolicy::kExclude404s,
       base::BindOnce(&FollowTabHelper::OnDailyVisitQueryResult,
                      weak_ptr_factory_.GetWeakPtr(), page_load_time,
                      recommended_url),
diff --git a/ios/chrome/browser/omnibox/model/omnibox_metrics_recorder.mm b/ios/chrome/browser/omnibox/model/omnibox_metrics_recorder.mm
index 1e9f521..2e16096b8 100644
--- a/ios/chrome/browser/omnibox/model/omnibox_metrics_recorder.mm
+++ b/ios/chrome/browser/omnibox/model/omnibox_metrics_recorder.mm
@@ -188,7 +188,7 @@
   omnibox::answer_data_parser::LogAnswerUsed(match.answer_type);
 
   TemplateURLService* service = _omniboxClient->GetTemplateURLService();
-  TemplateURL* templateURL = match.GetTemplateURL(service, false);
+  TemplateURL* templateURL = match.GetTemplateURL(service);
   if (templateURL) {
     // `match` is a Search navigation; log search engine usage metrics.
     AutocompleteMatch::LogSearchEngineUsed(match, service);
diff --git a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
index 1247103..470889c 100644
--- a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-abf2effe62f94bfdefabef021705b474aed8240a
\ No newline at end of file
+82307b07bc15cc3dbf8a2e5681b39a7b9fe865dc
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1
index 103ba6f09..aec142a9 100644
--- a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@
-947f16a51d2ff4045cd05ac3ff402846943a66de
\ No newline at end of file
+cdf14ec77d5b578e2950704e18efe690beeffe55
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
index 70e8731..9f948bda 100644
--- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-1940a3d3930536b0c89af422fb1cead2e4773f60
\ No newline at end of file
+7abe37d9b480e1d4e6749b22e7eaf42ac780bca6
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1
index 46424295..aedcf3c 100644
--- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@
-923bb0f4e621b733d3f435aca430385cc5fe0730
\ No newline at end of file
+72b1da92464eb0d2012728f1691c2d4fe0a0ea69
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
index 0d8ff63..b1ac5dd 100644
--- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@
-921d95286c24f5705fd30e709e83d910c9386557
\ No newline at end of file
+99c1fa2113df38cc7124af2a1415dec04977e69b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1
index 3f98889..6cd392f3 100644
--- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@
-85a519002aa1f2bb1c14cbb3b83b29e1f56efab2
\ No newline at end of file
+ee0fbc44e25807b926457c3afbdb398d12876453
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
index de4bc7e..225cd0f 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-fe14ad107d5190d0fe67de7ac83d58d0e26b4dfa
\ No newline at end of file
+0d3f77743846bcce24f718191d6f068d07eea00a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1
index c3ae341..1299c36 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-a1021187f7b8488f54f75ce92e3b6879800fb484
\ No newline at end of file
+437cc1f810851d740df590cd5465e06addf22ba9
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
index 4d3fcddd..b7996ce 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-0be80ccd012728fddb7655649dc7d3fa249ca8f7
\ No newline at end of file
+5cd0727ea061f06bf10ed4f677c5e967ee21001e
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1
index b4d22851..9711be5 100644
--- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-4ed90592a5338a131e044785cfa3b623c5e5ec81
\ No newline at end of file
+9c59bdda784fd1354e8f4858de63afa8a185e55a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
index 9521c3d8..8178e91 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-fdfe64750e289b0a49594495f9681b56afbe08fa
\ No newline at end of file
+5662dd57caac37c3d6602bffc9e154a718c36332
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1
index 008863f..2dad7cff 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-d5196a2a8c90a985dce04c971a834c21734df501
\ No newline at end of file
+1cd2881d25698e1363267a4151fdc2860acf0e9a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
index de59dc3..6d04797 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-5f7ed9548dc32d2f909e9ab92fa2554687dc6d7d
\ No newline at end of file
+fd203196e4ab26bba491a7b90f8af5bc13a6c504
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1
index a210015..5b95de60 100644
--- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-876e95800f080987a7b2873028b1e07c6480c4c8
\ No newline at end of file
+48a71d80299ffdaf12db0a05d415acd3d5f524d8
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
index 4efdaac8..3808f34 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-e3c6809d1e41e4adee387e30ab858c23cda5838c
\ No newline at end of file
+498bbc96e221628c35776be03018337a25af0d10
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1
index a49574c2..355ff63 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-2bdbc451f390fb4803823ce0b05f38e61bdfc1e5
\ No newline at end of file
+c41659939c9cb6bebfa030fda5428f4c88d539ce
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
index 0e484fc..b6d2de0 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-c851eaea9f186f63b890572f9cf2762da6ac4f0f
\ No newline at end of file
+d7576d8c15079b24c9cd48c4209477c175fc076b
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1
index f0bd0f8..e76e7fe 100644
--- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-fb3ed7acfa8bbb5f4c44ea279c66699046b9e29e
\ No newline at end of file
+0c76d690d0831718955db44d5eaf258fe8ac7ff5
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
index fe2950f7..42c22da 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-79073cd0732750f1d8fb6cb1766ee86f30f115d6
\ No newline at end of file
+e5e3108e6485f35a74694ff3067ff7588f137332
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
index d1a722e..ab724ea 100644
--- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-0f91ba69e6c06177343bd683c82d8b308212d32d
\ No newline at end of file
+f86880b4fdd8268c0f5b147d8a005a2675473828
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
index c8f4b32..3c7c2ab 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-4ce8685724d0883f6c63fadbae05f0bcafdd66b1
\ No newline at end of file
+fc0311807663e07c21f0df14047e00c6c3202863
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1
index 93d60856..7684f8b 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-fe43d550b0cac6554c3461194147b6d1edee7171
\ No newline at end of file
+2b0dfc44c552377f3f25285d6104044e8d467b8a
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
index 8e8b174..81c1912 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-84d1f34295e8b8ab93e9e64871f59f8a2d2ffe7b
\ No newline at end of file
+35ce353989183bf5a3e71370a2bb22aa190f0c92
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1
index 694d3b30a..bf6dbdd 100644
--- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-a2bf19a6660b3fe29e0f75968fa1a761bc74b864
\ No newline at end of file
+3f4a30efba9648dced8958b4eb341c191fa5518d
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
index 02bb8a2..491dc78 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@
-4634b8b8dcc23f0c87982a21e03329e06f2982dd
\ No newline at end of file
+723cf084bf374e20969b79afbfc84f0a89170139
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1
index 6088617..3755ff3 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@
-6656f824a6d08cbe7a04551b4758d8be8d581165
\ No newline at end of file
+36b7c6ca99e602529b876a09af64affd016aaee4
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
index bf8aaec7..f4bebae 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@
-2220c921b21615e176c9d72528ad52a7f21a37b2
\ No newline at end of file
+9759c2dc3a75e52fc37a5dccc6fb4c2bfe419c9e
\ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1
index 6ea1f5c..e2bcfbf 100644
--- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1
+++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@
-e2d802853f8ced029ddac674c4fb927859916cfb
\ No newline at end of file
+34eb91e7ab8bfd2a79510e53b098db9763f29db8
\ No newline at end of file
diff --git a/ios_internal b/ios_internal
index 70aacbf..979d503 160000
--- a/ios_internal
+++ b/ios_internal
@@ -1 +1 @@
-Subproject commit 70aacbfb7d3ed93f0d8681880e07b92531b29992
+Subproject commit 979d50337992bd9cb2ad58006f7e5f3722470c66
diff --git a/net/http/http_stream_pool.h b/net/http/http_stream_pool.h
index 000aa40..7ad9c96 100644
--- a/net/http/http_stream_pool.h
+++ b/net/http/http_stream_pool.h
@@ -154,7 +154,6 @@
   class NET_EXPORT_PRIVATE AttemptManager;
   class NET_EXPORT_PRIVATE IPEndPointStateTracker;
   class NET_EXPORT_PRIVATE TcpBasedAttempt;
-  class NET_EXPORT_PRIVATE TcpBasedAttemptSlot;
   class NET_EXPORT_PRIVATE QuicAttempt;
   struct NET_EXPORT_PRIVATE QuicAttemptOutcome {
     explicit QuicAttemptOutcome(int result) : result(result) {}
diff --git a/net/http/http_stream_pool_attempt_manager.cc b/net/http/http_stream_pool_attempt_manager.cc
index 3f390a16..71f8aa4 100644
--- a/net/http/http_stream_pool_attempt_manager.cc
+++ b/net/http/http_stream_pool_attempt_manager.cc
@@ -360,10 +360,9 @@
   // TODO(crbug.com/383824591): Consider modifying the value of
   // IPEndPointStateMap to track the number of in-flight attempts per
   // IPEndPoint, if this loop is a bottlenek.
-  size_t num_attempts = std::ranges::count_if(
-      tcp_based_attempt_slots_, [&ip_endpoint](const auto& slot) {
-        return slot->HasIPEndPoint(ip_endpoint);
-      });
+  size_t num_attempts = std::ranges::count(
+      tcp_based_attempts_, ip_endpoint,
+      [](const auto& entry) { return entry->attempt()->ip_endpoint(); });
 
   return num_attempts >=
          std::max(request_jobs_.size(), CalculateMaxPreconnectCount());
@@ -492,33 +491,29 @@
                        /*max_attempts=*/1);
 }
 
-size_t HttpStreamPool::AttemptManager::NonSlowTcpBasedAttemptCount() const {
-  return std::ranges::count_if(
-      tcp_based_attempt_slots_,
-      [](const std::unique_ptr<TcpBasedAttemptSlot>& slot) {
-        return !slot->IsSlow();
-      });
-}
-
 void HttpStreamPool::AttemptManager::CancelTcpBasedAttempts(
     StreamSocketCloseReason reason) {
-  if (tcp_based_attempt_slots_.empty()) {
+  if (tcp_based_attempts_.empty()) {
     return;
   }
 
-  const size_t num_cancels = tcp_based_attempt_slots_.size();
+  const size_t num_cancel_attempts = tcp_based_attempts_.size();
   const size_t num_total_connecting_before =
       pool()->TotalConnectingStreamCount();
-  while (!tcp_based_attempt_slots_.empty()) {
-    CancelTcpBasedAttemptSlot(tcp_based_attempt_slots_.begin()->get(), reason);
+  while (!tcp_based_attempts_.empty()) {
+    std::unique_ptr<TcpBasedAttempt> attempt =
+        ExtractTcpBasedAttempt(tcp_based_attempts_.begin()->get());
+    attempt->SetCancelReason(reason);
+    attempt.reset();
   }
   CHECK_EQ(pool()->TotalConnectingStreamCount(),
-           num_total_connecting_before - num_cancels);
+           num_total_connecting_before - num_cancel_attempts);
+  CHECK_EQ(slow_tcp_based_attempt_count_, 0u);
 
   base::UmaHistogramCounts100(
       base::StrCat({"Net.HttpStreamPool.TcpBasedAttemptCancelCount.",
                     StreamSocketCloseReasonToString(reason)}),
-      num_cancels);
+      num_cancel_attempts);
 
   ip_endpoint_state_tracker_.RemoveSlowAttemptingEndpoint();
 
@@ -624,8 +619,9 @@
   LoadState load_state = LOAD_STATE_IDLE;
 
   // When there are TCP based attempts, use most advanced one.
-  for (const auto& slot : tcp_based_attempt_slots_) {
-    load_state = std::max(load_state, slot->GetLoadState());
+  for (const auto& tcp_based_attempt : tcp_based_attempts_) {
+    load_state =
+        std::max(load_state, tcp_based_attempt->attempt()->GetLoadState());
     // There should not be a load state later than LOAD_STATE_SSL_HANDSHAKE.
     if (load_state == LOAD_STATE_SSL_HANDSHAKE) {
       break;
@@ -696,7 +692,7 @@
   }
 
   std::unique_ptr<TcpBasedAttempt> tcp_based_attempt =
-      ExtractTcpBasedAttempt(raw_attempt, rv);
+      ExtractTcpBasedAttempt(raw_attempt);
 
   if (rv != OK) {
     HandleTcpBasedAttemptFailure(std::move(tcp_based_attempt), rv);
@@ -775,6 +771,8 @@
 void HttpStreamPool::AttemptManager::OnTcpBasedAttemptSlow(
     TcpBasedAttempt* raw_attempt) {
   CHECK(raw_attempt->is_slow());
+  auto it = tcp_based_attempts_.find(raw_attempt);
+  CHECK(it != tcp_based_attempts_.end());
 
   TRACE_EVENT_INSTANT("net.stream", "AttemptManager::OnTcpBasedAttemptSlow",
                       track_, "ip_endpoint",
@@ -786,6 +784,7 @@
                                        raw_attempt->ip_endpoint().ToString());
       });
 
+  ++slow_tcp_based_attempt_count_;
   ip_endpoint_state_tracker_.OnEndpointSlow(raw_attempt->ip_endpoint());
 
   // Don't attempt the same IP endpoint.
@@ -884,8 +883,9 @@
            static_cast<int>(limit_ignoring_jobs_.size()));
   dict.Set("job_count_notified", static_cast<int>(notified_jobs_.size()));
   dict.Set("preconnect_count", static_cast<int>(preconnect_jobs_.size()));
-  dict.Set("tcp_based_attempt_slot_count",
-           static_cast<int>(TcpBasedAttemptSlotCount()));
+  dict.Set("tcp_based_attempt_count", static_cast<int>(TcpBasedAttemptCount()));
+  dict.Set("slow_tcp_based_attempt_count",
+           static_cast<int>(slow_tcp_based_attempt_count_));
   dict.Set("availability_state", static_cast<int>(availability_state_));
   if (final_error_to_notify_jobs_.has_value()) {
     dict.Set("final_error_to_notify_job", *final_error_to_notify_jobs_);
@@ -912,7 +912,19 @@
            static_cast<int>(tcp_based_attempt_delay_.InMilliseconds()));
   dict.Set("should_block_tcp_based_attempt", should_block_tcp_based_attempt_);
 
-  dict.Set("tcp_based_attempt_slots", GetTcpBasedAttemptSlotsAsValue());
+  int service_endpoint_num_waiting_callbacks = 0;
+  if (!tcp_based_attempts_.empty()) {
+    base::Value::List tcp_based_attempts;
+    for (const auto& entry : tcp_based_attempts_) {
+      if (entry->IsWaitingForServiceEndpointReady()) {
+        ++service_endpoint_num_waiting_callbacks;
+      }
+      tcp_based_attempts.Append(entry->GetInfoAsValue());
+    }
+    dict.Set("tcp_based_attempts", std::move(tcp_based_attempts));
+  }
+  dict.Set("service_endpoint_num_waiting_callbacks",
+           service_endpoint_num_waiting_callbacks);
 
   base::Value::List ip_endpoint_states =
       ip_endpoint_state_tracker_.GetInfoAsValue();
@@ -948,17 +960,16 @@
   dict.Set("num_jobs", static_cast<int>(request_jobs_.size()));
   dict.Set("num_notified_jobs", static_cast<int>(notified_jobs_.size()));
   dict.Set("num_preconnects", static_cast<int>(preconnect_jobs_.size()));
-  dict.Set("num_tcp_based_attempt_slots",
-           static_cast<int>(tcp_based_attempt_slots_.size()));
+  dict.Set("num_tcp_based_attempts",
+           static_cast<int>(tcp_based_attempts_.size()));
+  dict.Set("num_slow_attempts",
+           static_cast<int>(slow_tcp_based_attempt_count_));
   dict.Set("enable_ip_based_pooling_for_h2", IsIpBasedPoolingEnabledForH2());
   dict.Set("enable_alternative_services", IsAlternativeServiceEnabled());
   dict.Set("quic_attempt_alive", !!quic_attempt_);
   if (quic_attempt_result_.has_value()) {
     dict.Set("quic_attempt_result", *quic_attempt_result_);
   }
-
-  dict.Set("tcp_based_attempt_slots", GetTcpBasedAttemptSlotsAsValue());
-
   return dict;
 }
 
@@ -1116,7 +1127,7 @@
     HandleQuicSessionReady(quic_session,
                            StreamSocketCloseReason::kUsingExistingQuicSession);
 
-    CHECK(tcp_based_attempt_slots_.empty());
+    CHECK(tcp_based_attempts_.empty());
     return;
   }
 
@@ -1138,7 +1149,7 @@
     HandleSpdySessionReady(spdy_session,
                            StreamSocketCloseReason::kUsingExistingSpdySession);
 
-    CHECK(tcp_based_attempt_slots_.empty());
+    CHECK(tcp_based_attempts_.empty());
     return;
   }
 
@@ -1225,8 +1236,11 @@
   // Transferring callback ownership is important to avoid accessing TCP based
   // attempts that could be destroyed while invoking callbacks.
   std::vector<CompletionOnceCallback> callbacks;
-  for (const auto& slot : tcp_based_attempt_slots_) {
-    slot->MaybeTakeSSLConfigWaitingCallbacks(callbacks);
+  for (const auto& attempt : tcp_based_attempts_) {
+    auto callback = attempt->MaybeTakeSSLConfigWaitingCallback();
+    if (callback.has_value()) {
+      callbacks.emplace_back(std::move(*callback));
+    }
   }
 
   for (auto& callback : callbacks) {
@@ -1292,8 +1306,7 @@
         ip_endpoint_state_tracker_.GetIPEndPointToAttemptTcpBased(
             exclude_ip_endpoint);
     if (!ip_endpoint.has_value()) {
-      if (service_endpoint_request_finished_ &&
-          tcp_based_attempt_slots_.empty()) {
+      if (service_endpoint_request_finished_ && tcp_based_attempts_.empty()) {
         tcp_based_attempt_state_ = TcpBasedAttemptState::kAllEndpointsFailed;
       }
       if (tcp_based_attempt_state_ ==
@@ -1313,7 +1326,14 @@
 
     CHECK(!preconnect_jobs_.empty() || group_->IdleStreamSocketCount() == 0);
 
-    CreateAndStartTcpBasedAttempt(using_tls, *ip_endpoint);
+    auto tcp_based_attempt =
+        std::make_unique<TcpBasedAttempt>(this, using_tls, *ip_endpoint);
+    auto [attempt_iterator, inserted] =
+        tcp_based_attempts_.emplace(std::move(tcp_based_attempt));
+    CHECK(inserted);
+    pool()->IncrementTotalConnectingStreamCount();
+
+    (*attempt_iterator)->Start();
 
     ++num_attempts;
     if (max_attempts.has_value() && num_attempts >= *max_attempts) {
@@ -1322,51 +1342,6 @@
   }
 }
 
-void HttpStreamPool::AttemptManager::CreateAndStartTcpBasedAttempt(
-    bool using_tls,
-    IPEndPoint ip_endpoint) {
-  TcpBasedAttemptSlot* slot = FindTcpBasedAttemptSlot(ip_endpoint);
-  auto attempt = std::make_unique<TcpBasedAttempt>(this, slot, using_tls,
-                                                   std::move(ip_endpoint));
-  TcpBasedAttempt* raw_attempt = attempt.get();
-  slot->AllocateAttempt(std::move(attempt));
-  raw_attempt->Start();
-}
-
-HttpStreamPool::TcpBasedAttemptSlot*
-HttpStreamPool::AttemptManager::FindTcpBasedAttemptSlot(
-    const IPEndPoint& ip_endpoint) {
-  // Prefer a new slot if there is a room for it.
-  if (!ShouldRespectLimits() || tcp_based_attempt_slots_.size() <
-                                    pool()->max_stream_sockets_per_group()) {
-    auto slot = std::make_unique<TcpBasedAttemptSlot>();
-    auto [it, inserted] = tcp_based_attempt_slots_.emplace(std::move(slot));
-    CHECK(inserted);
-    pool()->IncrementTotalConnectingStreamCount();
-    return it->get();
-  }
-
-  for (auto& slot : tcp_based_attempt_slots_) {
-    if (ip_endpoint.address().IsIPv4() && !slot->ipv4_attempt()) {
-      return slot.get();
-    }
-    if (ip_endpoint.address().IsIPv6() && !slot->ipv6_attempt()) {
-      return slot.get();
-    }
-  }
-  NOTREACHED();
-}
-
-void HttpStreamPool::AttemptManager::CancelTcpBasedAttemptSlot(
-    TcpBasedAttemptSlot* raw_slot,
-    std::optional<StreamSocketCloseReason> reason) {
-  std::unique_ptr<TcpBasedAttemptSlot> slot =
-      ExtractTcpBasedAttemptSlot(raw_slot);
-  if (reason.has_value()) {
-    slot->SetCancelReason(*reason);
-  }
-}
-
 bool HttpStreamPool::AttemptManager::IsTcpBasedAttemptReady() {
   CanAttemptResult can_attempt = CanAttemptConnection();
   // TODO(crbug.com/383606724): Consider removing these trace and net log event
@@ -1513,6 +1488,11 @@
   return max_preconnect_count;
 }
 
+size_t HttpStreamPool::AttemptManager::NonSlowTcpBasedAttemptCount() const {
+  CHECK_GE(tcp_based_attempts_.size(), slow_tcp_based_attempt_count_);
+  return tcp_based_attempts_.size() - slow_tcp_based_attempt_count_;
+}
+
 std::optional<QuicEndpoint>
 HttpStreamPool::AttemptManager::GetQuicEndpointToAttempt() {
   const bool svcb_optional = IsSvcbOptional();
@@ -1568,7 +1548,7 @@
   NotifyPreconnectsComplete(final_error_to_notify_jobs());
   NotifyJobOfFailure();
 
-  CHECK(tcp_based_attempt_slots_.empty());
+  CHECK(tcp_based_attempts_.empty());
   CHECK(request_jobs_.empty());
   CHECK(preconnect_jobs_.empty());
   CHECK(!quic_attempt_);
@@ -1893,8 +1873,10 @@
   if (ShouldRespectLimits()) {
     while (group_->ActiveStreamSocketCount() >
                pool()->max_stream_sockets_per_group() &&
-           !tcp_based_attempt_slots_.empty()) {
-      CancelTcpBasedAttemptSlot(tcp_based_attempt_slots_.begin()->get());
+           !tcp_based_attempts_.empty()) {
+      std::unique_ptr<TcpBasedAttempt> attempt =
+          ExtractTcpBasedAttempt(tcp_based_attempts_.begin()->get());
+      attempt.reset();
     }
   }
   return job;
@@ -1918,28 +1900,18 @@
   MaybeChangeServiceEndpointRequestPriority();
 }
 
-std::unique_ptr<HttpStreamPool::TcpBasedAttemptSlot>
-HttpStreamPool::AttemptManager::ExtractTcpBasedAttemptSlot(
-    TcpBasedAttemptSlot* raw_slot) {
-  auto it = tcp_based_attempt_slots_.find(raw_slot);
-  std::unique_ptr<TcpBasedAttemptSlot> slot =
-      std::move(tcp_based_attempt_slots_.extract(it).value());
-  pool()->DecrementTotalConnectingStreamCount();
-  return slot;
-}
-
 std::unique_ptr<HttpStreamPool::TcpBasedAttempt>
 HttpStreamPool::AttemptManager::ExtractTcpBasedAttempt(
-    TcpBasedAttempt* raw_attempt,
-    int rv) {
-  TcpBasedAttemptSlot* slot = raw_attempt->slot();
-  auto it = tcp_based_attempt_slots_.find(slot);
-  CHECK(it != tcp_based_attempt_slots_.end());
+    TcpBasedAttempt* raw_attempt) {
+  auto it = tcp_based_attempts_.find(raw_attempt);
+  CHECK(it != tcp_based_attempts_.end());
+  std::unique_ptr<TcpBasedAttempt> attempt =
+      std::move(tcp_based_attempts_.extract(it).value());
 
-  std::unique_ptr<TcpBasedAttempt> attempt = slot->TakeAttempt(raw_attempt);
-
-  if (rv == OK || slot->empty()) {
-    ExtractTcpBasedAttemptSlot(slot);
+  pool()->DecrementTotalConnectingStreamCount();
+  if (attempt->is_slow()) {
+    CHECK_GT(slow_tcp_based_attempt_count_, 0u);
+    --slow_tcp_based_attempt_count_;
   }
 
   return attempt;
@@ -1959,7 +1931,7 @@
     return;
   }
 
-  // We already removed `tcp_based_attempt` from `tcp_based_attempt_slots_` so
+  // We already removed `tcp_based_attempt` from `tcp_based_attempts_` so
   // the active stream count is up-to-date.
   ProcessPreconnectsAfterAttemptComplete(rv, group_->ActiveStreamSocketCount());
 
@@ -2107,25 +2079,9 @@
           stream_key().network_anonymization_key());
 }
 
-base::Value::Dict
-HttpStreamPool::AttemptManager::GetTcpBasedAttemptSlotsAsValue() const {
-  base::Value::Dict dict;
-  dict.Set("num_slots", static_cast<int>(tcp_based_attempt_slots_.size()));
-
-  if (!tcp_based_attempt_slots_.empty()) {
-    base::Value::List slots;
-    for (const auto& slot : tcp_based_attempt_slots_) {
-      slots.Append(slot->GetInfoAsValue());
-    }
-    dict.Set("slots", std::move(slots));
-  }
-
-  return dict;
-}
-
 bool HttpStreamPool::AttemptManager::CanComplete() const {
   return request_jobs_.empty() && notified_jobs_.empty() &&
-         preconnect_jobs_.empty() && tcp_based_attempt_slots_.empty() &&
+         preconnect_jobs_.empty() && tcp_based_attempts_.empty() &&
          !quic_attempt_;
 }
 
diff --git a/net/http/http_stream_pool_attempt_manager.h b/net/http/http_stream_pool_attempt_manager.h
index 09967ab..121ce7b 100644
--- a/net/http/http_stream_pool_attempt_manager.h
+++ b/net/http/http_stream_pool_attempt_manager.h
@@ -183,14 +183,8 @@
   // or failure.
   size_t NotifiedRequestJobCount() const { return notified_jobs_.size(); }
 
-  // Returns the number of in-flight TCP based attempt slots.
-  size_t TcpBasedAttemptSlotCount() const {
-    return tcp_based_attempt_slots_.size();
-  }
-
-  // Returns the number of TCP based attempt slots that are not considered as
-  // slow.
-  size_t NonSlowTcpBasedAttemptCount() const;
+  // Returns the number of in-flight TCP based attempts.
+  size_t TcpBasedAttemptCount() const { return tcp_based_attempts_.size(); }
 
   // Cancels all in-flight TCP based attempts.
   void CancelTcpBasedAttempts(StreamSocketCloseReason reason);
@@ -359,19 +353,6 @@
       std::optional<IPEndPoint> exclude_ip_endpoint = std::nullopt,
       std::optional<size_t> max_attempts = std::nullopt);
 
-  // Creates and starts a TCP based attempt.
-  void CreateAndStartTcpBasedAttempt(bool using_tls, IPEndPoint ip_endpoint);
-
-  // Finds or allocates a TcpBasedAttemptSlot for `ip_endpoint`. If under the
-  // group limit, allocates a new slot. Otherwise, uses an existing slot that
-  // doesn't have an attempt for the same address family as `ip_endpoint`.
-  TcpBasedAttemptSlot* FindTcpBasedAttemptSlot(const IPEndPoint& ip_endpoint);
-
-  // Cancels `raw_slot` and removes it from `tcp_based_attempt_slots_`.
-  void CancelTcpBasedAttemptSlot(
-      TcpBasedAttemptSlot* raw_slot,
-      std::optional<StreamSocketCloseReason> reason = std::nullopt);
-
   // Returns true if there are pending jobs and the pool and the group
   // haven't reached stream limits. If the pool reached the stream limit, may
   // close idle sockets in other groups. Also may cancel preconnects or trigger
@@ -409,6 +390,9 @@
   // preconnects.
   size_t CalculateRequiredTcpBasedAttemptForPreconnect() const;
 
+  // Returns the number of TCP based attempts that are not considered as slow.
+  size_t NonSlowTcpBasedAttemptCount() const;
+
   // Returns a QUIC endpoint to make a connection attempt. See the comments in
   // QuicSessionPool::SelectQuicVersion() for the criteria to select a QUIC
   // endpoint.
@@ -478,15 +462,9 @@
   // limit.
   raw_ptr<Job> RemoveJobFromQueue(JobQueue::Pointer job_pointer);
 
-  // Transfers the ownership of `raw_slot` to the caller.
-  std::unique_ptr<TcpBasedAttemptSlot> ExtractTcpBasedAttemptSlot(
-      TcpBasedAttemptSlot* raw_slot);
-
-  // Transfers the ownership of `raw_attempt` to the caller. If `rv` is OK, also
-  // removes the corresponding slot from `tcp_based_attempt_slots_`.
+  // Transfers the ownership of `raw_attempt` to the caller.
   std::unique_ptr<TcpBasedAttempt> ExtractTcpBasedAttempt(
-      TcpBasedAttempt* raw_attempt,
-      int rv);
+      TcpBasedAttempt* raw_attempt);
 
   void HandleTcpBasedAttemptFailure(
       std::unique_ptr<TcpBasedAttempt> tcp_based_attempt,
@@ -517,8 +495,6 @@
   // or not attempted.
   void MaybeMarkQuicBroken();
 
-  base::Value::Dict GetTcpBasedAttemptSlotsAsValue() const;
-
   // Returns true when this can complete.
   bool CanComplete() const;
 
@@ -593,8 +569,10 @@
   // from the newest job.
   std::optional<SSLConfig> base_ssl_config_;
 
-  std::set<std::unique_ptr<TcpBasedAttemptSlot>, base::UniquePtrComparator>
-      tcp_based_attempt_slots_;
+  std::set<std::unique_ptr<TcpBasedAttempt>, base::UniquePtrComparator>
+      tcp_based_attempts_;
+  // The number of in-flight TCP based attempts that are treated as slow.
+  size_t slow_tcp_based_attempt_count_ = 0;
 
   base::OneShotTimer spdy_throttle_timer_;
   bool spdy_throttle_delay_passed_ = false;
diff --git a/net/http/http_stream_pool_attempt_manager_unittest.cc b/net/http/http_stream_pool_attempt_manager_unittest.cc
index 264db8c..8f7af048 100644
--- a/net/http/http_stream_pool_attempt_manager_unittest.cc
+++ b/net/http/http_stream_pool_attempt_manager_unittest.cc
@@ -1375,11 +1375,11 @@
   RunUntilIdle();
   AttemptManager* manager =
       pool().GetGroupForTesting(requester.GetStreamKey())->attempt_manager();
-  ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 1u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u);
   ASSERT_FALSE(request->completed());
 
   FastForwardBy(HttpStreamPool::GetConnectionAttemptDelay());
-  ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 2u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 2u);
   ASSERT_FALSE(request->completed());
 
   // FastForwardBy() executes non-delayed tasks so the request finishes
@@ -1402,65 +1402,6 @@
   ASSERT_FALSE(requester.associated_attempt_manager());
 }
 
-TEST_F(HttpStreamPoolAttemptManagerTest, IPEndPointSlowMultipleRequests) {
-  constexpr size_t kMaxPerGroup = 2;
-  pool().set_max_stream_sockets_per_group_for_testing(kMaxPerGroup);
-
-  base::WeakPtr<FakeServiceEndpointRequest> endpoint_request =
-      resolver()->AddFakeRequest();
-
-  // Data for blackholed endpoint (2001:db8::1).
-  std::vector<std::unique_ptr<SequencedSocketData>> datas;
-  for (size_t i = 0; i < kMaxPerGroup; ++i) {
-    auto data = std::make_unique<SequencedSocketData>();
-    // Make the first attempt stalled.
-    data->set_connect_data(MockConnect(SYNCHRONOUS, ERR_IO_PENDING));
-    socket_factory()->AddSocketDataProvider(data.get());
-    datas.emplace_back(std::move(data));
-  }
-
-  // Data for successful endpoint (192.0.2.1).
-  for (size_t i = 0; i < kMaxPerGroup; ++i) {
-    auto data = std::make_unique<SequencedSocketData>();
-    data->set_connect_data(MockConnect(ASYNC, OK));
-    socket_factory()->AddSocketDataProvider(data.get());
-    datas.emplace_back(std::move(data));
-  }
-
-  // Create requests up to the per-group limit.
-  std::vector<std::unique_ptr<StreamRequester>> requesters;
-  for (size_t i = 0; i < kMaxPerGroup; ++i) {
-    auto requester = std::make_unique<StreamRequester>();
-    HttpStreamRequest* request = requester->RequestStream(pool());
-    requesters.emplace_back(std::move(requester));
-    ASSERT_FALSE(request->completed());
-  }
-
-  // Complete endpoint resolution with IPv4/IPv6 endpoints. This triggers
-  // `kMaxPerGroup` attempts for the IPv6 endpoint.
-  endpoint_request
-      ->add_endpoint(ServiceEndpointBuilder()
-                         .add_v4("192.0.2.1")
-                         .add_v6("2001:db8::1")
-                         .endpoint())
-      .CallOnServiceEndpointRequestFinished(OK);
-
-  AttemptManager* manager =
-      pool()
-          .GetGroupForTesting(requesters[0]->GetStreamKey())
-          ->attempt_manager();
-  ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 2u);
-
-  // Simulate IPv6 endpoint slow. It should trigger attempts for the IPv4
-  // endpoint. FastForwardBy() executes non-delayed tasks so the requests finish
-  // immediately.
-  FastForwardBy(HttpStreamPool::GetConnectionAttemptDelay());
-  for (const auto& requester : requesters) {
-    ASSERT_TRUE(requester->result().has_value());
-    EXPECT_THAT(requester->result(), Optional(IsOk()));
-  }
-}
-
 TEST_F(HttpStreamPoolAttemptManagerTest,
        PauseSlowTimerAfterTcpHandshakeForTls) {
   base::WeakPtr<FakeServiceEndpointRequest> endpoint_request =
@@ -1496,7 +1437,7 @@
       pool()
           .GetOrCreateGroupForTesting(requester.GetStreamKey())
           .attempt_manager();
-  ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 1u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u);
   ASSERT_FALSE(requester.result().has_value());
 
   // Complete TCP handshake after a delay that is less than the connection
@@ -1506,24 +1447,24 @@
   FastForwardBy(kTcpDelay);
   tcp_connect_completer1.Complete(OK);
   RunUntilIdle();
-  ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 1u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u);
 
   // Fast-forward to the connection attempt delay. Since the in-flight attempt
   // has completed TCP handshake and is waiting for HTTPS RR, the manager
   // shouldn't start another attempt.
   FastForwardBy(HttpStreamPool::GetConnectionAttemptDelay());
-  ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 1u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u);
 
   // Complete DNS resolution fully.
   endpoint_request->set_crypto_ready(true).CallOnServiceEndpointRequestFinished(
       OK);
-  ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 1u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u);
 
   // Fast-forward to the connection attempt delay again. This time the in-flight
   // attempt is still doing TLS handshake, it's treated as slow and the manager
   // should start another attempt.
   FastForwardBy(HttpStreamPool::GetConnectionAttemptDelay());
-  ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 2u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 2u);
 
   // Complete the second attempt. The request should finish successfully.
   tcp_connect_completer2.Complete(OK);
@@ -1662,7 +1603,7 @@
   AttemptManager* manager = group.attempt_manager();
   ASSERT_EQ(pool().TotalActiveStreamCount(), kMaxPerGroup);
   ASSERT_EQ(group.ActiveStreamSocketCount(), kMaxPerGroup);
-  ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), kMaxPerGroup);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), kMaxPerGroup);
 
   // This request should not start an attempt as the group reached its limit.
   StreamRequester stalled_requester;
@@ -1674,7 +1615,7 @@
 
   ASSERT_EQ(pool().TotalActiveStreamCount(), kMaxPerGroup);
   ASSERT_EQ(group.ActiveStreamSocketCount(), kMaxPerGroup);
-  ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), kMaxPerGroup);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), kMaxPerGroup);
   ASSERT_EQ(stalled_request->GetLoadState(),
             LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET);
 
@@ -1682,7 +1623,7 @@
   RunUntilIdle();
   ASSERT_EQ(pool().TotalActiveStreamCount(), kMaxPerGroup);
   ASSERT_EQ(group.ActiveStreamSocketCount(), kMaxPerGroup);
-  ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 0u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 0u);
 
   // Release one HttpStream and close it to make non-reusable.
   std::unique_ptr<StreamRequester> released_requester =
@@ -1706,13 +1647,13 @@
 
   ASSERT_EQ(pool().TotalActiveStreamCount(), kMaxPerGroup);
   ASSERT_EQ(group.ActiveStreamSocketCount(), kMaxPerGroup);
-  ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 1u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u);
 
   RunUntilIdle();
 
   ASSERT_EQ(pool().TotalActiveStreamCount(), kMaxPerGroup);
   ASSERT_EQ(group.ActiveStreamSocketCount(), kMaxPerGroup);
-  ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 0u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 0u);
   ASSERT_TRUE(stalled_request->completed());
   std::unique_ptr<HttpStream> stream = stalled_requester.ReleaseStream();
   ASSERT_TRUE(stream);
@@ -1788,7 +1729,7 @@
   ASSERT_FALSE(request2->completed());
   ASSERT_TRUE(pool().ReachedMaxStreamLimit());
   ASSERT_TRUE(pool().IsPoolStalled());
-  ASSERT_EQ(requester2.associated_attempt_manager()->TcpBasedAttemptSlotCount(),
+  ASSERT_EQ(requester2.associated_attempt_manager()->TcpBasedAttemptCount(),
             0u);
 
   // Release one HttpStream from group A. It should unblock the in-flight
@@ -2081,7 +2022,7 @@
   }
 
   Group& group = pool().GetOrCreateGroupForTesting(stream_key);
-  ASSERT_GT(group.attempt_manager()->TcpBasedAttemptSlotCount(), kMaxPerGroup);
+  ASSERT_GT(group.attempt_manager()->TcpBasedAttemptCount(), kMaxPerGroup);
 
   // Complete requests that ignore limits.
   while (!limit_ignoring_requesters.empty()) {
@@ -2327,16 +2268,16 @@
           .GetOrCreateGroupForTesting(requester2.GetStreamKey())
           .attempt_manager();
   ASSERT_EQ(manager1->RequestJobCount(), 1u);
-  ASSERT_EQ(manager1->TcpBasedAttemptSlotCount(), 1u);
+  ASSERT_EQ(manager1->TcpBasedAttemptCount(), 1u);
   ASSERT_EQ(manager2->RequestJobCount(), 1u);
-  ASSERT_EQ(manager2->TcpBasedAttemptSlotCount(), 1u);
+  ASSERT_EQ(manager2->TcpBasedAttemptCount(), 1u);
 
   NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests();
   RunUntilIdle();
   ASSERT_EQ(manager1->RequestJobCount(), 0u);
-  ASSERT_EQ(manager1->TcpBasedAttemptSlotCount(), 0u);
+  ASSERT_EQ(manager1->TcpBasedAttemptCount(), 0u);
   ASSERT_EQ(manager2->RequestJobCount(), 0u);
-  ASSERT_EQ(manager2->TcpBasedAttemptSlotCount(), 0u);
+  ASSERT_EQ(manager2->TcpBasedAttemptCount(), 0u);
   EXPECT_THAT(requester1.result(), Optional(IsError(ERR_NETWORK_CHANGED)));
   EXPECT_THAT(requester2.result(), Optional(IsError(ERR_NETWORK_CHANGED)));
 }
@@ -2448,7 +2389,7 @@
                                               ->GetWeakPtrForTesting();
   ASSERT_EQ(manager->RequestJobCount(), 2u);
   ASSERT_EQ(manager->NotifiedRequestJobCount(), 0u);
-  ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 2u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 2u);
 
   // Trigger slow timers.
   FastForwardBy(HttpStreamPool::GetConnectionAttemptDelay());
@@ -2462,7 +2403,7 @@
   ASSERT_TRUE(manager->is_shutting_down());
   ASSERT_EQ(manager->RequestJobCount(), 0u);
   ASSERT_EQ(manager->NotifiedRequestJobCount(), 0u);
-  ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 0u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 0u);
 
   // Trigger an SSLConfig change. This should cancel in-flight attempts.
   ssl_config_service()->NotifySSLContextConfigChange();
@@ -3381,7 +3322,7 @@
       .CallOnServiceEndpointRequestFinished(OK);
   // There should be only one in-flight attempt because attempts are throttled.
   Group& group = pool().GetOrCreateGroupForTesting(requester1.GetStreamKey());
-  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), 1u);
+  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), 1u);
 
   // This should not enter an infinite loop.
   pool().ProcessPendingRequestsInGroups();
@@ -3488,14 +3429,14 @@
       .CallOnServiceEndpointRequestFinished(OK);
   // There should be only one in-flight attempt because attempts are throttled.
   Group& group = pool().GetOrCreateGroupForTesting(requester1.GetStreamKey());
-  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), 1u);
+  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), 1u);
 
   FastForwardBy(AttemptManager::kSpdyThrottleDelay);
-  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), 2u);
+  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), 2u);
 
   connect_completer1.Complete(OK);
   RunUntilIdle();
-  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), 1u);
+  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), 1u);
 
   connect_completer2.Complete(OK);
   RunUntilIdle();
@@ -3547,14 +3488,14 @@
 
   AttemptManager* manager =
       pool().GetGroupForTesting(requester.GetStreamKey())->attempt_manager();
-  ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 1u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u);
   ASSERT_FALSE(requester.result().has_value());
 
   // Fast-forward to the connection attempt delay. The in-flight attempt is
   // treated as slow. Since there is no non-slow attempt, the manager should
   // not be throttled and start another attempt.
   FastForwardBy(HttpStreamPool::GetConnectionAttemptDelay());
-  ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 2u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 2u);
 
   // Complete the second attempt. The request should finish successfully.
   completer2.Complete(OK);
@@ -3627,7 +3568,7 @@
       ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint())
       .CallOnServiceEndpointRequestFinished(OK);
   Group& group = pool().GetOrCreateGroupForTesting(preconnector.GetStreamKey());
-  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), 1u);
+  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), 1u);
   ASSERT_FALSE(preconnector.result().has_value());
 
   RunUntilIdle();
@@ -3657,7 +3598,7 @@
       ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint())
       .CallOnServiceEndpointRequestFinished(OK);
   Group& group = pool().GetOrCreateGroupForTesting(preconnector.GetStreamKey());
-  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), kNumStreams);
+  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), kNumStreams);
   ASSERT_FALSE(preconnector.result().has_value());
 
   RunUntilIdle();
@@ -3703,7 +3644,7 @@
   int rv =
       preconnector.set_num_streams(kNumPreconnectStreams).Preconnect(pool());
   EXPECT_THAT(rv, IsError(ERR_IO_PENDING));
-  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(),
+  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(),
             kNumPreconnectStreams - 1u);
   ASSERT_FALSE(preconnector.result().has_value());
 
@@ -3740,7 +3681,7 @@
       ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint())
       .CallOnServiceEndpointRequestFinished(OK);
   Group& group = pool().GetOrCreateGroupForTesting(preconnector.GetStreamKey());
-  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), 1u);
+  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), 1u);
   ASSERT_FALSE(preconnector.result().has_value());
 
   RunUntilIdle();
@@ -3784,7 +3725,7 @@
       ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint())
       .CallOnServiceEndpointRequestFinished(OK);
   Group& group = pool().GetOrCreateGroupForTesting(preconnector.GetStreamKey());
-  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), 2u);
+  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), 2u);
   ASSERT_FALSE(preconnector.result().has_value());
 
   RunUntilIdle();
@@ -3821,7 +3762,7 @@
       ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint())
       .CallOnServiceEndpointRequestFinished(OK);
   Group& group = pool().GetOrCreateGroupForTesting(preconnector.GetStreamKey());
-  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), kNumStreams);
+  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), kNumStreams);
   ASSERT_FALSE(preconnector.result().has_value());
 
   preconnector.WaitForResult();
@@ -3859,7 +3800,7 @@
       ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint())
       .CallOnServiceEndpointRequestFinished(OK);
   Group& group = pool().GetOrCreateGroupForTesting(preconnector.GetStreamKey());
-  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), kNumStreams);
+  ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), kNumStreams);
   ASSERT_FALSE(preconnector.result().has_value());
 
   RunUntilIdle();
@@ -4019,7 +3960,7 @@
   ASSERT_FALSE(requester2.result().has_value());
   ASSERT_NE(requester1.associated_attempt_manager().get(),
             group->attempt_manager());
-  ASSERT_EQ(group->attempt_manager()->TcpBasedAttemptSlotCount(), 1u);
+  ASSERT_EQ(group->attempt_manager()->TcpBasedAttemptCount(), 1u);
   EXPECT_EQ(request2->GetLoadState(), LOAD_STATE_CONNECTING);
 
   // Preconnect should succeed immediately as the active AttemptManager has
@@ -5655,7 +5596,7 @@
   endpoint_request->CallOnServiceEndpointRequestFinished(OK);
   ASSERT_FALSE(requester.result().has_value());
   ASSERT_TRUE(manager->quic_attempt_for_testing());
-  ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 1u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u);
 
   // The request should complete with the TCP-based attempt.
   requester.WaitForResult();
@@ -5718,7 +5659,7 @@
   endpoint_request->CallOnServiceEndpointRequestFinished(OK);
   ASSERT_FALSE(requester.result().has_value());
   ASSERT_TRUE(manager->quic_attempt_for_testing());
-  ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 0u);
+  ASSERT_EQ(manager->TcpBasedAttemptCount(), 0u);
 
   // Fire the stream attempt delay timer. The request should complete.
   FastForwardBy(kQuicDelay);
@@ -5786,7 +5727,7 @@
   EXPECT_FALSE(manager->quic_attempt_for_testing());
   EXPECT_THAT(manager->GetQuicAttemptResultForTesting(),
               Optional(IsError(ERR_DNS_NO_MATCHING_SUPPORTED_ALPN)));
-  EXPECT_EQ(manager->TcpBasedAttemptSlotCount(), 1u);
+  EXPECT_EQ(manager->TcpBasedAttemptCount(), 1u);
 
   connect_completer.Complete(OK);
   preconnector.WaitForResult();
@@ -7294,8 +7235,8 @@
   EXPECT_THAT(requester.result(), Optional(IsError(ERR_NETWORK_CHANGED)));
   // The group should not have active AttemptManager.
   EXPECT_FALSE(group->attempt_manager());
-  EXPECT_THAT(
-      requester.associated_attempt_manager()->TcpBasedAttemptSlotCount(), 0u);
+  EXPECT_THAT(requester.associated_attempt_manager()->TcpBasedAttemptCount(),
+              0u);
   EXPECT_THAT(
       requester.associated_attempt_manager()->GetQuicAttemptResultForTesting(),
       Optional(IsError(ERR_NETWORK_CHANGED)));
@@ -7347,8 +7288,8 @@
 
   requester.WaitForResult();
   EXPECT_THAT(requester.result(), Optional(IsError(ERR_NAME_NOT_RESOLVED)));
-  EXPECT_THAT(
-      requester.associated_attempt_manager()->TcpBasedAttemptSlotCount(), 0u);
+  EXPECT_THAT(requester.associated_attempt_manager()->TcpBasedAttemptCount(),
+              0u);
   EXPECT_THAT(
       requester.associated_attempt_manager()->GetQuicAttemptResultForTesting(),
       Optional(IsError(ERR_NAME_NOT_RESOLVED)));
@@ -7389,8 +7330,8 @@
   EXPECT_THAT(requester.result(),
               Optional(IsError(ERR_SSL_CLIENT_AUTH_CERT_NEEDED)));
   quic_completer.Complete(OK);
-  EXPECT_THAT(
-      requester.associated_attempt_manager()->TcpBasedAttemptSlotCount(), 0u);
+  EXPECT_THAT(requester.associated_attempt_manager()->TcpBasedAttemptCount(),
+              0u);
   EXPECT_THAT(
       requester.associated_attempt_manager()->GetQuicAttemptResultForTesting(),
       Optional(IsError(ERR_SSL_CLIENT_AUTH_CERT_NEEDED)));
@@ -7426,8 +7367,8 @@
   requester.WaitForResult();
   EXPECT_THAT(requester.result(), Optional(IsError(ERR_CERT_DATE_INVALID)));
   quic_completer.Complete(OK);
-  EXPECT_THAT(
-      requester.associated_attempt_manager()->TcpBasedAttemptSlotCount(), 0u);
+  EXPECT_THAT(requester.associated_attempt_manager()->TcpBasedAttemptCount(),
+              0u);
   EXPECT_THAT(
       requester.associated_attempt_manager()->GetQuicAttemptResultForTesting(),
       Optional(IsError(ERR_CERT_DATE_INVALID)));
diff --git a/net/http/http_stream_pool_group.cc b/net/http/http_stream_pool_group.cc
index 777b138..2ce7086 100644
--- a/net/http/http_stream_pool_group.cc
+++ b/net/http/http_stream_pool_group.cc
@@ -264,13 +264,12 @@
 }
 
 size_t HttpStreamPool::Group::ConnectingStreamSocketCount() const {
-  return attempt_manager_ ? attempt_manager_->TcpBasedAttemptSlotCount() : 0;
+  return attempt_manager_ ? attempt_manager_->TcpBasedAttemptCount() : 0;
 }
 
 size_t HttpStreamPool::Group::ActiveStreamSocketCount() const {
   return handed_out_stream_count_ + idle_stream_sockets_.size() +
-         (attempt_manager_ ? attempt_manager_->NonSlowTcpBasedAttemptCount()
-                           : 0);
+         ConnectingStreamSocketCount();
 }
 
 bool HttpStreamPool::Group::ReachedMaxStreamLimit() const {
diff --git a/net/http/http_stream_pool_tcp_based_attempt.cc b/net/http/http_stream_pool_tcp_based_attempt.cc
index 8535ffb..76933dc 100644
--- a/net/http/http_stream_pool_tcp_based_attempt.cc
+++ b/net/http/http_stream_pool_tcp_based_attempt.cc
@@ -9,7 +9,6 @@
 #include <string_view>
 
 #include "base/metrics/histogram_functions.h"
-#include "base/notreached.h"
 #include "base/task/sequenced_task_runner.h"
 #include "base/time/time.h"
 #include "base/timer/timer.h"
@@ -76,14 +75,12 @@
 }  // namespace
 
 HttpStreamPool::TcpBasedAttempt::TcpBasedAttempt(AttemptManager* manager,
-                                                 TcpBasedAttemptSlot* slot,
                                                  bool using_tls,
                                                  IPEndPoint ip_endpoint)
     : manager_(manager),
       track_(base::trace_event::GetNextGlobalTraceId()),
       flow_(perfetto::Flow::ProcessScoped(
-          base::trace_event::GetNextGlobalTraceId())),
-      slot_(slot) {
+          base::trace_event::GetNextGlobalTraceId())) {
   TRACE_EVENT_INSTANT("net.stream", "TcpBasedAttemptStart", manager_->track(),
                       flow_);
   TRACE_EVENT_BEGIN("net.stream", "TcpBasedAttempt::TcpBasedAttempt", track_,
@@ -275,126 +272,4 @@
   manager_->OnTcpBasedAttemptComplete(this, rv);
 }
 
-// TcpBasedAttemptSlot
-
-HttpStreamPool::TcpBasedAttemptSlot::TcpBasedAttemptSlot() = default;
-
-HttpStreamPool::TcpBasedAttemptSlot::~TcpBasedAttemptSlot() = default;
-
-HttpStreamPool::TcpBasedAttemptSlot::TcpBasedAttemptSlot(
-    TcpBasedAttemptSlot&&) = default;
-
-HttpStreamPool::TcpBasedAttemptSlot&
-HttpStreamPool::TcpBasedAttemptSlot::operator=(TcpBasedAttemptSlot&&) = default;
-
-void HttpStreamPool::TcpBasedAttemptSlot::AllocateAttempt(
-    std::unique_ptr<TcpBasedAttempt> attempt) {
-  if (attempt->ip_endpoint().address().IsIPv4()) {
-    CHECK(!ipv4_attempt_);
-    ipv4_attempt_ = std::move(attempt);
-  } else {
-    CHECK(attempt->ip_endpoint().address().IsIPv6());
-    CHECK(!ipv6_attempt_);
-    ipv6_attempt_ = std::move(attempt);
-  }
-}
-
-std::unique_ptr<HttpStreamPool::TcpBasedAttempt>
-HttpStreamPool::TcpBasedAttemptSlot::TakeAttempt(TcpBasedAttempt* raw_attempt) {
-  auto take_attempt = [&]() {
-    if (ipv4_attempt_.get() == raw_attempt) {
-      return std::move(ipv4_attempt_);
-    }
-    if (ipv6_attempt_.get() == raw_attempt) {
-      return std::move(ipv6_attempt_);
-    }
-    NOTREACHED();
-  };
-
-  std::unique_ptr<TcpBasedAttempt> attempt = take_attempt();
-  // Reset slot to avoid dangling pointer.
-  attempt->ResetSlot();
-  return attempt;
-}
-
-LoadState HttpStreamPool::TcpBasedAttemptSlot::GetLoadState() const {
-  if (ipv4_attempt_ && ipv6_attempt_) {
-    CHECK(ipv4_attempt_->attempt());
-    CHECK(ipv6_attempt_->attempt());
-    return std::max(ipv4_attempt_->attempt()->GetLoadState(),
-                    ipv6_attempt_->attempt()->GetLoadState());
-  }
-  if (ipv4_attempt_) {
-    CHECK(ipv4_attempt_->attempt());
-    return ipv4_attempt_->attempt()->GetLoadState();
-  }
-  if (ipv6_attempt_) {
-    CHECK(ipv6_attempt_->attempt());
-    return ipv6_attempt_->attempt()->GetLoadState();
-  }
-  NOTREACHED();
-}
-
-void HttpStreamPool::TcpBasedAttemptSlot::MaybeTakeSSLConfigWaitingCallbacks(
-    std::vector<CompletionOnceCallback>& callbacks) {
-  auto take_callback = [&](TcpBasedAttempt* attempt) {
-    auto callback = attempt->MaybeTakeSSLConfigWaitingCallback();
-    if (callback.has_value()) {
-      callbacks.emplace_back(std::move(*callback));
-    }
-  };
-
-  if (ipv4_attempt_) {
-    take_callback(ipv4_attempt_.get());
-  }
-  if (ipv6_attempt_) {
-    take_callback(ipv6_attempt_.get());
-  }
-}
-
-bool HttpStreamPool::TcpBasedAttemptSlot::IsSlow() const {
-  if (ipv4_attempt_ && ipv6_attempt_) {
-    return ipv4_attempt_->is_slow() && ipv6_attempt_->is_slow();
-  }
-  if (ipv4_attempt_) {
-    return ipv4_attempt_->is_slow();
-  }
-  if (ipv6_attempt_) {
-    return ipv6_attempt_->is_slow();
-  }
-  NOTREACHED();
-}
-
-bool HttpStreamPool::TcpBasedAttemptSlot::HasIPEndPoint(
-    const IPEndPoint& ip_endpoint) const {
-  if (ipv4_attempt_ && ipv4_attempt_->ip_endpoint() == ip_endpoint) {
-    return true;
-  }
-  if (ipv6_attempt_ && ipv6_attempt_->ip_endpoint() == ip_endpoint) {
-    return true;
-  }
-  return false;
-}
-
-void HttpStreamPool::TcpBasedAttemptSlot::SetCancelReason(
-    StreamSocketCloseReason reason) {
-  if (ipv4_attempt_) {
-    ipv4_attempt_->SetCancelReason(reason);
-  }
-  if (ipv6_attempt_) {
-    ipv6_attempt_->SetCancelReason(reason);
-  }
-}
-
-base::Value::Dict HttpStreamPool::TcpBasedAttemptSlot::GetInfoAsValue() const {
-  base::Value::Dict dict;
-  if (ipv4_attempt_) {
-    dict.Set("ipv4_attempt", ipv4_attempt_->GetInfoAsValue());
-  }
-  if (ipv6_attempt_) {
-    dict.Set("ipv6_attempt", ipv6_attempt_->GetInfoAsValue());
-  }
-  return dict;
-}
-
 }  // namespace net
diff --git a/net/http/http_stream_pool_tcp_based_attempt.h b/net/http/http_stream_pool_tcp_based_attempt.h
index 200aa3c..6db3fa0 100644
--- a/net/http/http_stream_pool_tcp_based_attempt.h
+++ b/net/http/http_stream_pool_tcp_based_attempt.h
@@ -26,7 +26,6 @@
 class HttpStreamPool::TcpBasedAttempt : public TlsStreamAttempt::Delegate {
  public:
   TcpBasedAttempt(AttemptManager* manager,
-                  TcpBasedAttemptSlot* slot,
                   bool using_tls,
                   IPEndPoint ip_endpoint);
 
@@ -39,10 +38,6 @@
 
   void SetCancelReason(StreamSocketCloseReason reason);
 
-  TcpBasedAttemptSlot* slot() const { return slot_; }
-
-  void ResetSlot() { slot_ = nullptr; }
-
   StreamAttempt* attempt() { return attempt_.get(); }
 
   base::TimeTicks start_time() const { return start_time_; }
@@ -81,7 +76,6 @@
   const raw_ptr<AttemptManager> manager_;
   const perfetto::Track track_;
   const perfetto::Flow flow_;
-  raw_ptr<TcpBasedAttemptSlot> slot_;
   std::unique_ptr<StreamAttempt> attempt_;
   base::TimeTicks start_time_;
   std::optional<int> result_;
@@ -100,63 +94,6 @@
   base::WeakPtrFactory<TcpBasedAttempt> weak_ptr_factory_{this};
 };
 
-// Groups at most two concurrent TCP-based attempts (one IPv4, one IPv6) into a
-// single “slot” counted against pool limits. Used to work around cases where
-// both address families are available but one is much slower than the other. In
-// such cases, the slow attempt may time out, causing the whole pool to stall,
-// even if the fast attempt would have succeeded. By grouping attempts by
-// address family, we can ensure that at most one attempt per address family is
-// in-flight at any time.
-// TODO(crbug.com/383606724): Figure out a better solution by improving endpoint
-// selection.
-class HttpStreamPool::TcpBasedAttemptSlot {
- public:
-  TcpBasedAttemptSlot();
-  ~TcpBasedAttemptSlot();
-
-  TcpBasedAttemptSlot(const TcpBasedAttemptSlot&) = delete;
-  TcpBasedAttemptSlot& operator=(const TcpBasedAttemptSlot&) = delete;
-  TcpBasedAttemptSlot(TcpBasedAttemptSlot&&);
-  TcpBasedAttemptSlot& operator=(TcpBasedAttemptSlot&&);
-
-  // Allocates `attempt` to either IPv4 or IPv6 attempt slot based on its IP
-  // address.
-  void AllocateAttempt(std::unique_ptr<TcpBasedAttempt> attempt);
-
-  // Transfers ownership of the attempt matching `raw_attempt` to the caller.
-  std::unique_ptr<TcpBasedAttempt> TakeAttempt(TcpBasedAttempt* raw_attempt);
-
-  TcpBasedAttempt* ipv4_attempt() const { return ipv4_attempt_.get(); }
-  TcpBasedAttempt* ipv6_attempt() const { return ipv6_attempt_.get(); }
-
-  // Returns true if this slot has no attempts.
-  bool empty() const { return !ipv4_attempt() && !ipv6_attempt(); }
-
-  // Returns the most advanced load state of the attempts in this slot.
-  LoadState GetLoadState() const;
-
-  // Transfers SSLConfig waiting callbacks from attempts in this slot to
-  // `callbacks`, if attempts are waiting for SSLConfig.
-  void MaybeTakeSSLConfigWaitingCallbacks(
-      std::vector<CompletionOnceCallback>& callbacks);
-
-  // Returns true when this slot is slow. A slot is considered slow when either
-  // IPv4 or IPv6 attempt is slow.
-  bool IsSlow() const;
-
-  // Returns true if either IPv4 or IPv6 attempt has the given `ip_endpoint`.
-  bool HasIPEndPoint(const IPEndPoint& ip_endpoint) const;
-
-  // Sets the cancel reason of both attempts in this slot.
-  void SetCancelReason(StreamSocketCloseReason reason);
-
-  base::Value::Dict GetInfoAsValue() const;
-
- private:
-  std::unique_ptr<TcpBasedAttempt> ipv4_attempt_;
-  std::unique_ptr<TcpBasedAttempt> ipv6_attempt_;
-};
-
 }  // namespace net
 
 #endif  // NET_HTTP_HTTP_STREAM_POOL_TCP_BASED_ATTEMPT_H_
diff --git a/remoting/host/BUILD.gn b/remoting/host/BUILD.gn
index 0f8c016..3fbf2c5 100644
--- a/remoting/host/BUILD.gn
+++ b/remoting/host/BUILD.gn
@@ -846,6 +846,11 @@
     sources -= [ "input_monitor/local_input_monitor_unittest.cc" ]
   }
 
+  # TODO(447203893): Re-enable this on Linux once the bug is fixed.
+  if (is_linux) {
+    sources -= [ "host_power_save_blocker_unittest.cc" ]
+  }
+
   configs += [ "//remoting/build/config:version" ]
 
   deps = [
diff --git a/remoting/host/host_power_save_blocker.cc b/remoting/host/host_power_save_blocker.cc
index acd1c8a..00dff119 100644
--- a/remoting/host/host_power_save_blocker.cc
+++ b/remoting/host/host_power_save_blocker.cc
@@ -9,6 +9,7 @@
 
 #include "base/check.h"
 #include "base/task/single_thread_task_runner.h"
+#include "build/build_config.h"
 #include "remoting/host/host_status_monitor.h"
 #include "services/device/public/mojom/wake_lock.mojom.h"
 
@@ -27,10 +28,13 @@
 }
 
 void HostPowerSaveBlocker::OnClientConnected(const std::string& jid) {
+  // TODO(447203893): Re-enable this on Linux once the bug is fixed.
+#if !BUILDFLAG(IS_LINUX)
   blocker_ = std::make_unique<device::PowerSaveBlocker>(
       device::mojom::WakeLockType::kPreventDisplaySleep,
       device::mojom::WakeLockReason::kOther, "Remoting session is active",
       ui_task_runner_);
+#endif
 }
 
 void HostPowerSaveBlocker::OnClientDisconnected(const std::string& jid) {
diff --git a/remoting/host/it2me/it2me_host.cc b/remoting/host/it2me/it2me_host.cc
index fced4808..d6b7b408 100644
--- a/remoting/host/it2me/it2me_host.cc
+++ b/remoting/host/it2me/it2me_host.cc
@@ -865,7 +865,10 @@
   }
 
   // Check the client domain policy.
-  if (!required_client_domain_list_.empty()) {
+  // Skip this check for class management sessions, as they use the device
+  // specific robot account as client, and we should not expect the customers to
+  // add this internal account to their client domain list.
+  if (!required_client_domain_list_.empty() && !is_class_management_session()) {
     bool matched = false;
     for (const auto& domain : required_client_domain_list_) {
       if (base::EndsWith(client_username, std::string("@") + domain,
@@ -883,6 +886,15 @@
     }
   }
 
+  if (is_class_management_session() && authorized_helper_.empty()) {
+    LOG(ERROR) << "Rejecting class management connection request from ("
+               << client_username << "as an authorized_helper was not provided";
+    std::move(result_callback)
+        .Run(ValidationResult::ERROR_UNAUTHORIZED_ACCOUNT);
+    DisconnectOnNetworkThread();
+    return;
+  }
+
   if (!authorized_helper_.empty() &&
       !gaia::AreEmailsSame(authorized_helper_, client_username)) {
     LOG(ERROR) << "Rejecting connection request from (" << client_username
diff --git a/remoting/host/it2me/it2me_host.h b/remoting/host/it2me/it2me_host.h
index 0f7245c..d7761cf 100644
--- a/remoting/host/it2me/it2me_host.h
+++ b/remoting/host/it2me/it2me_host.h
@@ -112,6 +112,13 @@
   bool is_enterprise_session() const {
     return chrome_os_enterprise_params_.has_value();
   }
+  // Indicates whether this support session was initiated by Class tools
+  // for a managed Chrome OS device.
+  bool is_class_management_session() const {
+    return chrome_os_enterprise_params_.has_value() &&
+           chrome_os_enterprise_params_->request_origin ==
+               remoting::ChromeOsEnterpriseRequestOrigin::kClassManagement;
+  }
 
   // If set, only |authorized_helper| will be allowed to connect to this host.
   void set_authorized_helper(const std::string& authorized_helper);
diff --git a/remoting/host/it2me/it2me_host_unittest.cc b/remoting/host/it2me/it2me_host_unittest.cc
index d0c6b48..6c99b43 100644
--- a/remoting/host/it2me/it2me_host_unittest.cc
+++ b/remoting/host/it2me/it2me_host_unittest.cc
@@ -112,11 +112,17 @@
   return std::make_unique<HostEventReporterStub>();
 }
 
-ChromeOsEnterpriseParams GetDefaultEnterpriseParamsWithRequestOrigin() {
+ChromeOsEnterpriseParams GetDefaultEnterpriseParamsForEnterpriseAdmin() {
   ChromeOsEnterpriseParams params;
   params.request_origin = ChromeOsEnterpriseRequestOrigin::kEnterpriseAdmin;
   return params;
 }
+
+ChromeOsEnterpriseParams GetDefaultEnterpriseParamsForClassManagement() {
+  ChromeOsEnterpriseParams params;
+  params.request_origin = ChromeOsEnterpriseRequestOrigin::kClassManagement;
+  return params;
+}
 #endif  // BUILDFLAG(IS_CHROMEOS)
 
 }  // namespace
@@ -995,7 +1001,7 @@
 #if BUILDFLAG(IS_CHROMEOS)
 TEST_F(It2MeHostTest, ConnectRespectsSuppressDialogsParameter) {
   ChromeOsEnterpriseParams params(
-      GetDefaultEnterpriseParamsWithRequestOrigin());
+      GetDefaultEnterpriseParamsForEnterpriseAdmin());
   params.suppress_user_dialogs = true;
   StartHost(std::move(params));
 
@@ -1006,7 +1012,7 @@
 
 TEST_F(It2MeHostTest, ConnectRespectsSuppressNotificationsParameter) {
   ChromeOsEnterpriseParams params(
-      GetDefaultEnterpriseParamsWithRequestOrigin());
+      GetDefaultEnterpriseParamsForEnterpriseAdmin());
   params.suppress_notifications = true;
   StartHost(std::move(params));
 
@@ -1016,7 +1022,7 @@
 
 TEST_F(It2MeHostTest, ConnectRespectsTerminateUponInputParameter) {
   ChromeOsEnterpriseParams params(
-      GetDefaultEnterpriseParamsWithRequestOrigin());
+      GetDefaultEnterpriseParamsForEnterpriseAdmin());
   params.terminate_upon_input = true;
   StartHost(std::move(params));
 
@@ -1031,7 +1037,7 @@
 
 TEST_F(It2MeHostTest, ConnectRespectsMaximumSessionDurationParameter) {
   ChromeOsEnterpriseParams params(
-      GetDefaultEnterpriseParamsWithRequestOrigin());
+      GetDefaultEnterpriseParamsForEnterpriseAdmin());
   params.maximum_session_duration = base::Hours(8);
   StartHost(std::move(params));
 
@@ -1041,7 +1047,7 @@
 
 TEST_F(It2MeHostTest, ConnectRespectsEnableCurtainingParameter) {
   ChromeOsEnterpriseParams params(
-      GetDefaultEnterpriseParamsWithRequestOrigin());
+      GetDefaultEnterpriseParamsForEnterpriseAdmin());
   params.curtain_local_user_session = true;
   StartHost(std::move(params));
 
@@ -1050,7 +1056,7 @@
 
 TEST_F(It2MeHostTest, ConnectRespectsAllowRemoteInputParameter) {
   ChromeOsEnterpriseParams params(
-      GetDefaultEnterpriseParamsWithRequestOrigin());
+      GetDefaultEnterpriseParamsForEnterpriseAdmin());
   params.allow_remote_input = false;
   StartHost(std::move(params));
 
@@ -1059,7 +1065,7 @@
 
 TEST_F(It2MeHostTest, ConnectRespectsAllowClipboardSyncParameter) {
   ChromeOsEnterpriseParams params(
-      GetDefaultEnterpriseParamsWithRequestOrigin());
+      GetDefaultEnterpriseParamsForEnterpriseAdmin());
   params.allow_clipboard_sync = false;
   StartHost(std::move(params));
 
@@ -1077,7 +1083,7 @@
                 base::Value(true)}});
 
   ChromeOsEnterpriseParams params(
-      GetDefaultEnterpriseParamsWithRequestOrigin());
+      GetDefaultEnterpriseParamsForEnterpriseAdmin());
   params.allow_file_transfer = true;
   StartHost(std::move(params));
 
@@ -1089,7 +1095,7 @@
                 base::Value(false)}});
 
   ChromeOsEnterpriseParams params(
-      GetDefaultEnterpriseParamsWithRequestOrigin());
+      GetDefaultEnterpriseParamsForEnterpriseAdmin());
   params.allow_file_transfer = true;
   StartHost(std::move(params));
 
@@ -1110,7 +1116,7 @@
   SetPolicies({});
 
   ChromeOsEnterpriseParams params(
-      GetDefaultEnterpriseParamsWithRequestOrigin());
+      GetDefaultEnterpriseParamsForEnterpriseAdmin());
   params.allow_file_transfer = true;
   StartHost(std::move(params));
 
@@ -1128,7 +1134,7 @@
   SetPolicies({{policy::key::kRemoteAccessHostAllowRemoteSupportConnections,
                 base::Value(false)}});
 
-  StartHost(GetDefaultEnterpriseParamsWithRequestOrigin());
+  StartHost(GetDefaultEnterpriseParamsForEnterpriseAdmin());
   ASSERT_EQ(It2MeHostState::kReceivedAccessCode, last_host_state_);
 
   ShutdownHost();
@@ -1140,7 +1146,7 @@
   SetPolicies({{policy::key::kRemoteAccessHostDomainList,
                 MakeList({"other-domain.com"})}});
 
-  StartHost(GetDefaultEnterpriseParamsWithRequestOrigin());
+  StartHost(GetDefaultEnterpriseParamsForEnterpriseAdmin());
   ASSERT_EQ(It2MeHostState::kReceivedAccessCode, last_host_state_);
 
   ShutdownHost();
@@ -1155,7 +1161,7 @@
       {{policy::key::kRemoteAccessHostAllowEnterpriseRemoteSupportConnections,
         base::Value(false)}});
 
-  StartHost(GetDefaultEnterpriseParamsWithRequestOrigin());
+  StartHost(GetDefaultEnterpriseParamsForEnterpriseAdmin());
   ASSERT_EQ(It2MeHostState::kError, last_host_state_);
   ASSERT_EQ(ErrorCode::DISALLOWED_BY_POLICY, last_error_code_);
 }
@@ -1172,7 +1178,7 @@
 }
 
 TEST_F(It2MeHostTest, EnterpriseSessionsShouldNotDisconnectOnPolicyChange) {
-  StartHost(GetDefaultEnterpriseParamsWithRequestOrigin());
+  StartHost(GetDefaultEnterpriseParamsForEnterpriseAdmin());
   const It2MeHostState initial_state = last_host_state_;
   ASSERT_EQ(initial_state, It2MeHostState::kReceivedAccessCode);
 
@@ -1190,9 +1196,7 @@
                 base::Value(false)},
                {policy::key::kClassManagementEnabled, base::Value("student")}});
 
-  ChromeOsEnterpriseParams params;
-  params.request_origin = ChromeOsEnterpriseRequestOrigin::kClassManagement;
-  StartHost(params);
+  StartHost(GetDefaultEnterpriseParamsForClassManagement());
   ASSERT_EQ(It2MeHostState::kReceivedAccessCode, last_host_state_);
 }
 
@@ -1201,9 +1205,7 @@
                 base::Value(false)},
                {policy::key::kClassManagementEnabled, base::Value("teacher")}});
 
-  ChromeOsEnterpriseParams params;
-  params.request_origin = ChromeOsEnterpriseRequestOrigin::kClassManagement;
-  StartHost(params);
+  StartHost(GetDefaultEnterpriseParamsForClassManagement());
   ASSERT_EQ(It2MeHostState::kReceivedAccessCode, last_host_state_);
 }
 
@@ -1213,21 +1215,60 @@
   SetPolicies(
       {{policy::key::kClassManagementEnabled, base::Value("disabled")}});
 
-  ChromeOsEnterpriseParams params;
-  params.request_origin = ChromeOsEnterpriseRequestOrigin::kClassManagement;
-  StartHost(params);
+  StartHost(GetDefaultEnterpriseParamsForClassManagement());
   ASSERT_EQ(It2MeHostState::kError, last_host_state_);
   ASSERT_EQ(ErrorCode::DISALLOWED_BY_POLICY, last_error_code_);
 }
 
 TEST_F(It2MeHostTest,
        EnterpriseClassManagementSessionsFailsWhenClassManagementPolicyUnset) {
-  ChromeOsEnterpriseParams params;
-  params.request_origin = ChromeOsEnterpriseRequestOrigin::kClassManagement;
-  StartHost(params);
+  StartHost(GetDefaultEnterpriseParamsForClassManagement());
   ASSERT_EQ(It2MeHostState::kError, last_host_state_);
   ASSERT_EQ(ErrorCode::DISALLOWED_BY_POLICY, last_error_code_);
 }
+
+TEST_F(It2MeHostTest,
+       EnterpriseClassManagementSessionsShouldNotCheckHostDomain) {
+  SetPolicies({{policy::key::kRemoteAccessHostDomainList,
+                MakeList({"other-domain.com"})},
+               {policy::key::kClassManagementEnabled, base::Value("student")}});
+
+  StartHost(GetDefaultEnterpriseParamsForClassManagement());
+  ASSERT_EQ(It2MeHostState::kReceivedAccessCode, last_host_state_);
+
+  ShutdownHost();
+  ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_);
+  ASSERT_EQ(ErrorCode::OK, last_error_code_);
+}
+
+TEST_F(It2MeHostTest,
+       EnterpriseClassManagementSessionsShouldNotCheckClientDomain) {
+  SetPolicies({{policy::key::kRemoteAccessHostClientDomainList,
+                MakeList({"other-domain.com"})},
+               {policy::key::kClassManagementEnabled, base::Value("student")}});
+
+  authorized_helper_ = kTestClientUsername;
+  StartHost(GetDefaultEnterpriseParamsForClassManagement());
+  ASSERT_EQ(It2MeHostState::kReceivedAccessCode, last_host_state_);
+  RunValidationCallback(kTestClientJid);
+  ASSERT_EQ(ValidationResult::SUCCESS, validation_result_);
+  ASSERT_EQ(It2MeHostState::kConnecting, last_host_state_);
+
+  ShutdownHost();
+  ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_);
+  ASSERT_EQ(ErrorCode::OK, last_error_code_);
+}
+
+TEST_F(It2MeHostTest,
+       EnterpriseClassManagementSessionsFailWithoutAuthorizedUser) {
+  SetPolicies({{policy::key::kClassManagementEnabled, base::Value("student")}});
+
+  StartHost(GetDefaultEnterpriseParamsForClassManagement());
+  RunValidationCallback(kTestClientJid);
+  ASSERT_EQ(ValidationResult::ERROR_UNAUTHORIZED_ACCOUNT, validation_result_);
+  RunUntilStateChanged(It2MeHostState::kDisconnected);
+  ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_);
+}
 #endif
 
 }  // namespace remoting
diff --git a/sandbox/win/src/filesystem_dispatcher.cc b/sandbox/win/src/filesystem_dispatcher.cc
index 0b3479f..2b6a31f 100644
--- a/sandbox/win/src/filesystem_dispatcher.cc
+++ b/sandbox/win/src/filesystem_dispatcher.cc
@@ -254,12 +254,11 @@
 }
 
 EvalResult FilesystemDispatcher::EvalPolicy(IpcTag ipc_tag,
-                                            const std::wstring& name,
+                                            std::wstring_view name,
                                             uint32_t desired_access,
                                             bool open_only) {
   CountedParameterSet<OpenFile> params;
-  const wchar_t* name_ptr = name.c_str();
-  params[OpenFile::NAME] = ParamPickerMake(name_ptr);
+  params[OpenFile::NAME] = ParamPickerMake(name);
   params[OpenFile::ACCESS] = ParamPickerMake(desired_access);
   uint32_t open_only_int = open_only;
   params[OpenFile::OPENONLY] = ParamPickerMake(open_only_int);
diff --git a/sandbox/win/src/filesystem_dispatcher.h b/sandbox/win/src/filesystem_dispatcher.h
index 4600ca7..21ab084 100644
--- a/sandbox/win/src/filesystem_dispatcher.h
+++ b/sandbox/win/src/filesystem_dispatcher.h
@@ -8,6 +8,7 @@
 #include <stdint.h>
 
 #include <string>
+#include <string_view>
 
 #include "base/memory/raw_ptr.h"
 #include "sandbox/win/src/crosscall_server.h"
@@ -73,7 +74,7 @@
 
   // Evaluate the sandbox policy for the file system call.
   EvalResult EvalPolicy(IpcTag ipc_tag,
-                        const std::wstring& name,
+                        std::wstring_view name,
                         uint32_t desired_access = 0,
                         bool open_only = true);
 
diff --git a/sandbox/win/src/filesystem_interception.cc b/sandbox/win/src/filesystem_interception.cc
index 88ccb41..70652136 100644
--- a/sandbox/win/src/filesystem_interception.cc
+++ b/sandbox/win/src/filesystem_interception.cc
@@ -30,23 +30,20 @@
 // - The path looks like a short-name path.
 // - Whether the details match the policy.
 bool ShouldAskBroker(IpcTag ipc_tag,
-                     const std::unique_ptr<wchar_t, NtAllocDeleter>& name,
-                     size_t name_len,
+                     std::wstring_view name,
                      uint32_t desired_access = 0,
                      bool open_only = true) {
-  const wchar_t* name_ptr = name.get();
-  if (name_len >= 4 && name_ptr[0] == L'\\' && name_ptr[1] == L'?' &&
-      name_ptr[2] == L'?' && name_ptr[3] == L'\\') {
+  if (name.size() >= 4 && name[0] == L'\\' && name[1] == L'?' &&
+      name[2] == L'?' && name[3] == L'\\') {
     return true;
   }
 
-  for (size_t index = 0; index < name_len; ++index) {
-    if (name_ptr[index] == L'~')
-      return true;
+  if (name.find(L'~') != std::wstring_view::npos) {
+    return true;
   }
 
   CountedParameterSet<OpenFile> params;
-  params[OpenFile::NAME] = ParamPickerMake(name_ptr);
+  params[OpenFile::NAME] = ParamPickerMake(name);
   params[OpenFile::ACCESS] = ParamPickerMake(desired_access);
   uint32_t open_only_int = open_only;
   params[OpenFile::OPENONLY] = ParamPickerMake(open_only_int);
@@ -106,7 +103,8 @@
     if (!NT_SUCCESS(ret) || !name || !name_len) {
       break;
     }
-    if (!ShouldAskBroker(IpcTag::NTCREATEFILE, name, name_len, desired_access,
+    std::wstring_view name_view(name.get(), name_len);
+    if (!ShouldAskBroker(IpcTag::NTCREATEFILE, name_view, desired_access,
                          disposition == FILE_OPEN)) {
       break;
     }
@@ -115,8 +113,7 @@
     CrossCallReturn answer = {0};
     // The following call must match in the parameters with
     // FilesystemDispatcher::ProcessNtCreateFile.
-    ResultCode code = CrossCall(ipc, IpcTag::NTCREATEFILE,
-                                std::wstring_view(name.get(), name_len),
+    ResultCode code = CrossCall(ipc, IpcTag::NTCREATEFILE, name_view,
                                 attributes, desired_access, file_attributes,
                                 sharing, disposition, options, &answer);
     if (SBOX_ALL_OK != code) {
@@ -175,16 +172,15 @@
         CopyNameAndAttributes(object_attributes, &name, &name_len, &attributes);
     if (!NT_SUCCESS(ret) || !name || !name_len)
       break;
-    if (!ShouldAskBroker(IpcTag::NTOPENFILE, name, name_len, desired_access,
-                         true)) {
+    std::wstring_view name_view(name.get(), name_len);
+    if (!ShouldAskBroker(IpcTag::NTOPENFILE, name_view, desired_access, true)) {
       break;
     }
 
     SharedMemIPCClient ipc(memory);
     CrossCallReturn answer = {0};
-    ResultCode code = CrossCall(
-        ipc, IpcTag::NTOPENFILE, std::wstring_view(name.get(), name_len),
-        attributes, desired_access, sharing, options, &answer);
+    ResultCode code = CrossCall(ipc, IpcTag::NTOPENFILE, name_view, attributes,
+                                desired_access, sharing, options, &answer);
     if (SBOX_ALL_OK != code)
       break;
 
@@ -233,15 +229,16 @@
         CopyNameAndAttributes(object_attributes, &name, &name_len, &attributes);
     if (!NT_SUCCESS(ret) || !name || !name_len)
       break;
-    if (!ShouldAskBroker(IpcTag::NTQUERYATTRIBUTESFILE, name, name_len))
+    std::wstring_view name_view(name.get(), name_len);
+    if (!ShouldAskBroker(IpcTag::NTQUERYATTRIBUTESFILE, name_view)) {
       break;
+    }
 
     InOutCountedBuffer file_info(file_attributes,
                                  sizeof(FILE_BASIC_INFORMATION));
     SharedMemIPCClient ipc(memory);
     CrossCallReturn answer = {0};
-    ResultCode code = CrossCall(ipc, IpcTag::NTQUERYATTRIBUTESFILE,
-                                std::wstring_view(name.get(), name_len),
+    ResultCode code = CrossCall(ipc, IpcTag::NTQUERYATTRIBUTESFILE, name_view,
                                 attributes, file_info, &answer);
 
     if (SBOX_ALL_OK != code)
@@ -284,16 +281,17 @@
         CopyNameAndAttributes(object_attributes, &name, &name_len, &attributes);
     if (!NT_SUCCESS(ret) || !name || !name_len)
       break;
-    if (!ShouldAskBroker(IpcTag::NTQUERYFULLATTRIBUTESFILE, name, name_len))
+    std::wstring_view name_view(name.get(), name_len);
+    if (!ShouldAskBroker(IpcTag::NTQUERYFULLATTRIBUTESFILE, name_view)) {
       break;
+    }
 
     InOutCountedBuffer file_info(file_attributes,
                                  sizeof(FILE_NETWORK_OPEN_INFORMATION));
     SharedMemIPCClient ipc(memory);
     CrossCallReturn answer = {0};
     ResultCode code = CrossCall(ipc, IpcTag::NTQUERYFULLATTRIBUTESFILE,
-                                std::wstring_view(name.get(), name_len),
-                                attributes, file_info, &answer);
+                                name_view, attributes, file_info, &answer);
 
     if (SBOX_ALL_OK != code)
       break;
@@ -356,8 +354,10 @@
     NTSTATUS ret = CopyNameAndAttributes(&object_attributes, &name, &name_len);
     if (!NT_SUCCESS(ret) || !name || !name_len)
       break;
-    if (!ShouldAskBroker(IpcTag::NTSETINFO_RENAME, name, name_len))
+    std::wstring_view name_view(name.get(), name_len);
+    if (!ShouldAskBroker(IpcTag::NTSETINFO_RENAME, name_view)) {
       break;
+    }
 
     InOutCountedBuffer io_status_buffer(io_status, sizeof(IO_STATUS_BLOCK));
     // This is actually not an InOut buffer, only In, but using InOut facility
diff --git a/sandbox/win/src/policy_engine_opcodes.cc b/sandbox/win/src/policy_engine_opcodes.cc
index 78f1e29a..a2a3efdf 100644
--- a/sandbox/win/src/policy_engine_opcodes.cc
+++ b/sandbox/win/src/policy_engine_opcodes.cc
@@ -17,25 +17,25 @@
 #include "sandbox/win/src/sandbox_nt_util.h"
 #include "sandbox/win/src/sandbox_types.h"
 
-namespace {
-const unsigned short kMaxUniStrSize = 0xfffc / sizeof(wchar_t);
+namespace sandbox {
 
-bool InitStringUnicode(const wchar_t* source,
-                       size_t length,
-                       UNICODE_STRING* ustring) {
-  if (length > kMaxUniStrSize) {
-    return false;
+namespace {
+
+// Match strings case insensitively.
+// Returns `EVAL_TRUE` if `match_str` is a prefix of `source_str` or the
+// two strings are equal.
+EvalResult MatchStrings(std::wstring_view match_str,
+                        std::wstring_view source_str) {
+  std::optional<bool> result =
+      EqualUnicodeString(match_str, source_str.substr(0, match_str.size()));
+  if (!result) {
+    return EVAL_ERROR;
   }
-  ustring->Buffer = const_cast<wchar_t*>(source);
-  ustring->Length = static_cast<USHORT>(length) * sizeof(wchar_t);
-  ustring->MaximumLength = source ? ustring->Length + sizeof(wchar_t) : 0;
-  return true;
+  return *result ? EVAL_TRUE : EVAL_FALSE;
 }
 
 }  // namespace
 
-namespace sandbox {
-
 // Note: The opcodes are implemented as functions (as opposed to classes derived
 // from PolicyOpcode) because you should not add more member variables to the
 // PolicyOpcode class since it would cause object slicing on the target. So to
@@ -195,25 +195,22 @@
 // Argument 3 is the string matching options (true if last token, 0 otherwise).
 
 PolicyOpcode* OpcodeFactory::MakeOpWStringMatch(uint8_t selected_param,
-                                                const wchar_t* match_str,
+                                                std::wstring_view match_str,
                                                 int start_position,
                                                 uint32_t options,
                                                 bool last_token) {
-  if (!match_str)
+  if (match_str.empty()) {
     return nullptr;
-  if ('\0' == match_str[0])
-    return nullptr;
-
-  size_t length = wcslen(match_str);
+  }
 
   PolicyOpcode* opcode = MakeBase(OP_WSTRING_MATCH, options, selected_param);
   if (!opcode)
     return nullptr;
-  ptrdiff_t delta_str = AllocRelative(opcode, match_str, length + 1);
+  ptrdiff_t delta_str = AllocRelative(opcode, match_str);
   if (0 == delta_str)
     return nullptr;
   opcode->SetArgument(0, delta_str);
-  opcode->SetArgument(1, length);
+  opcode->SetArgument(1, match_str.size());
   opcode->SetArgument(2, start_position);
   opcode->SetArgument(3, last_token ? 1 : 0);
   return opcode;
@@ -226,13 +223,16 @@
   if (!context) {
     return EVAL_ERROR;
   }
-  const wchar_t* source_str = nullptr;
-  if (!param->Get(&source_str))
+
+  std::wstring_view source_str;
+  if (!param->Get(&source_str)) {
     return EVAL_ERROR;
-  // Assume we won't want to match when a nullptr parameter is passed to the
-  // hooked function.
-  if (!source_str)
+  }
+
+  // Assume we won't want to match when an empty string is passed.
+  if (source_str.empty()) {
     return EVAL_FALSE;
+  }
 
   int start_position = 0;
   size_t match_len = 0;
@@ -241,18 +241,18 @@
   opcode->GetArgument(2, &start_position);
   opcode->GetArgument(3, &last_token);
 
-  const wchar_t* match_str = opcode->GetRelativeString(0);
+  std::wstring_view match_str(opcode->GetRelativeString(0), match_len);
+
   // Advance the source string to the last successfully evaluated position
   // according to the match context.
-  source_str = &source_str[context->position];
-  size_t source_len = GetNtExports()->wcslen(source_str);
-
-  if (0 == source_len) {
+  source_str.remove_prefix(context->position);
+  if (source_str.empty()) {
     // If we reached the end of the source string there is nothing we can
     // match against.
     return EVAL_FALSE;
   }
-  if (match_len > source_len) {
+
+  if (match_str.size() > source_str.size()) {
     // There can't be a positive match when the target string is bigger than
     // the source string
     return EVAL_FALSE;
@@ -262,60 +262,44 @@
   // Case 1. We skip N characters and compare once.
   // Case 2: We skip to the end and compare once.
   // Case 3: We match the first substring (if we find any).
+  EvalResult result = EVAL_FALSE;
+  size_t start_offset = 0;
   if (start_position >= 0) {
-    size_t start_offset = static_cast<size_t>(start_position);
+    start_offset = static_cast<size_t>(start_position);
     if (kSeekToEnd == start_position) {
-      start_offset = static_cast<size_t>(source_len - match_len);
+      start_offset = static_cast<size_t>(source_str.size() - match_str.size());
     } else if (last_token) {
       // A sub-case of case 3 is that the final token needs a full match.
-      if ((match_len + start_offset) != source_len) {
+      if ((match_str.size() + start_offset) != source_str.size()) {
         return EVAL_FALSE;
       }
     }
 
-    // Advance start_pos characters. Warning! this does not consider
+    // Advance start_offset characters. Warning! this does not consider
     // utf16 encodings (surrogate pairs) or other Unicode 'features'.
-    source_str += start_offset;
+    source_str.remove_prefix(start_offset);
 
     // Since we skipped, lets reevaluate just the lengths again.
-    if ((match_len + start_offset) > source_len) {
+    if (match_str.size() > source_str.size()) {
       return EVAL_FALSE;
     }
 
-    UNICODE_STRING match_ustr;
-    UNICODE_STRING source_ustr;
-    if (!InitStringUnicode(match_str, match_len, &match_ustr) ||
-        !InitStringUnicode(source_str, match_len, &source_ustr))
-      return EVAL_ERROR;
-
-    if (0 == GetNtExports()->RtlCompareUnicodeString(&match_ustr, &source_ustr,
-                                                     TRUE)) {
-      // Match! update the match context.
-      context->position += start_offset + match_len;
-      return EVAL_TRUE;
-    } else {
-      return EVAL_FALSE;
-    }
+    result = MatchStrings(match_str, source_str);
   } else if (start_position < 0) {
-    UNICODE_STRING match_ustr;
-    UNICODE_STRING source_ustr;
-    if (!InitStringUnicode(match_str, match_len, &match_ustr) ||
-        !InitStringUnicode(source_str, match_len, &source_ustr))
-      return EVAL_ERROR;
-
     do {
-      if (0 == GetNtExports()->RtlCompareUnicodeString(&match_ustr,
-                                                       &source_ustr, TRUE)) {
-        // Match! update the match context.
-        context->position +=
-            static_cast<size_t>(source_ustr.Buffer - source_str) + match_len;
-        return EVAL_TRUE;
+      result = MatchStrings(match_str, source_str);
+      if (result != EVAL_FALSE) {
+        break;
       }
-      ++source_ustr.Buffer;
-      --source_len;
-    } while (source_len >= match_len);
+      source_str.remove_prefix(1);
+      start_offset++;
+    } while (source_str.size() >= match_str.size());
   }
-  return EVAL_FALSE;
+  if (result == EVAL_TRUE) {
+    // Match! update the match context.
+    context->position += start_offset + match_str.size();
+  }
+  return result;
 }
 
 //////////////////////////////////////////////////////////////////////////////
@@ -348,10 +332,8 @@
   return opcode;
 }
 
-ptrdiff_t OpcodeFactory::AllocRelative(void* start,
-                                       const wchar_t* str,
-                                       size_t length) {
-  size_t bytes = length * sizeof(wchar_t);
+ptrdiff_t OpcodeFactory::AllocRelative(void* start, std::wstring_view str) {
+  size_t bytes = str.size() * sizeof(wchar_t);
   if (memory_size() < bytes)
     return 0;
   memory_bottom_ -= bytes;
@@ -359,7 +341,7 @@
     // TODO(cpu) replace this for something better.
     ::DebugBreak();
   }
-  memcpy(memory_bottom_, str, bytes);
+  memcpy(memory_bottom_, str.data(), bytes);
   ptrdiff_t delta = memory_bottom_ - reinterpret_cast<char*>(start);
   return delta;
 }
diff --git a/sandbox/win/src/policy_engine_opcodes.h b/sandbox/win/src/policy_engine_opcodes.h
index 81e435b..cd9a819 100644
--- a/sandbox/win/src/policy_engine_opcodes.h
+++ b/sandbox/win/src/policy_engine_opcodes.h
@@ -322,7 +322,7 @@
   // current implementation.
   // All comparisons are case-insensitive.
   PolicyOpcode* MakeOpWStringMatch(uint8_t selected_param,
-                                   const wchar_t* match_str,
+                                   std::wstring_view match_str,
                                    int start_position,
                                    uint32_t options,
                                    bool final_token);
@@ -343,9 +343,9 @@
                          uint32_t options,
                          uint8_t selected_param);
 
-  // Allocates (and copies) a string (of size length) inside the buffer and
-  // returns the displacement with respect to start.
-  ptrdiff_t AllocRelative(void* start, const wchar_t* str, size_t length);
+  // Allocates (and copies) a string inside the buffer and returns the
+  // displacement with respect to start.
+  ptrdiff_t AllocRelative(void* start, std::wstring_view str);
 
   // Points to the lowest currently available address of the memory
   // used to make the opcodes. This pointer increments as opcodes are made.
diff --git a/sandbox/win/src/policy_engine_params.h b/sandbox/win/src/policy_engine_params.h
index 6714189..bc23d9a 100644
--- a/sandbox/win/src/policy_engine_params.h
+++ b/sandbox/win/src/policy_engine_params.h
@@ -12,6 +12,8 @@
 
 #include <stdint.h>
 
+#include <string_view>
+
 #include "base/memory/raw_ptr.h"
 #include "sandbox/win/src/internal_types.h"
 #include "sandbox/win/src/nt_internals.h"
@@ -82,12 +84,12 @@
     return true;
   }
 
-  // Retrieve the stored parameter. If the type does not match wchar_t* fail.
-  bool Get(const wchar_t** destination) const {
+  // Retrieve the stored parameter. If the type does not match the call fails.
+  bool Get(std::wstring_view* destination) const {
     if (real_type_ != WCHAR_TYPE) {
       return false;
     }
-    *destination = Void2TypePointerCopy<const wchar_t*>();
+    *destination = Void2TypePointerCopy<std::wstring_view>();
     return true;
   }
 
@@ -142,14 +144,7 @@
 };
 
 template <>
-class ParameterSetEx<wchar_t*> : public ParameterSet {
- public:
-  explicit ParameterSetEx(const void* address)
-      : ParameterSet(WCHAR_TYPE, address) {}
-};
-
-template <>
-class ParameterSetEx<wchar_t const*> : public ParameterSet {
+class ParameterSetEx<std::wstring_view> : public ParameterSet {
  public:
   explicit ParameterSetEx(const void* address)
       : ParameterSet(WCHAR_TYPE, address) {}
diff --git a/sandbox/win/src/policy_engine_unittest.cc b/sandbox/win/src/policy_engine_unittest.cc
index 696fb403..6bb612d 100644
--- a/sandbox/win/src/policy_engine_unittest.cc
+++ b/sandbox/win/src/policy_engine_unittest.cc
@@ -57,7 +57,8 @@
   opcode_maker.MakeOpAction(FAKE_ACCESS_DENIED, kPolNone);
   policy->opcode_count = 7;
 
-  const wchar_t* filename = L"c:\\Documents and Settings\\Microsoft\\BLAH.txt";
+  std::wstring_view filename =
+      L"c:\\Documents and Settings\\Microsoft\\BLAH.txt";
   uint32_t creation_mode = OPEN_EXISTING;
   uint32_t flags = FILE_ATTRIBUTE_NORMAL;
   void* security_descriptor = nullptr;
@@ -94,7 +95,7 @@
   EXPECT_EQ(FAKE_ACCESS_DENIED, pol_ev.GetAction());
 
   // Cope ok with nullptr string fields.
-  filename = nullptr;
+  filename = std::wstring_view();
   pr = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params));
   EXPECT_EQ(NO_POLICY_MATCH, pr);
 
diff --git a/sandbox/win/src/policy_low_level_unittest.cc b/sandbox/win/src/policy_low_level_unittest.cc
index f8976e46..844e5fd 100644
--- a/sandbox/win/src/policy_low_level_unittest.cc
+++ b/sandbox/win/src/policy_low_level_unittest.cc
@@ -62,7 +62,7 @@
   EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr));
   EXPECT_TRUE(policyGen.Done());
 
-  const wchar_t* filename = L"Z:\\Directory\\domo.txt";
+  std::wstring_view filename = L"Z:\\Directory\\domo.txt";
 
   POLPARAMS_BEGIN(eval_params)
     POLPARAM(filename)  // Argument 0
@@ -93,7 +93,7 @@
   EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr));
   EXPECT_TRUE(policyGen.Done());
 
-  const wchar_t* filename = nullptr;
+  std::wstring_view filename;
   POLPARAMS_BEGIN(eval_params)
     POLPARAM(filename)  // Argument 0
   POLPARAMS_END;
@@ -129,7 +129,7 @@
   EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr));
   EXPECT_TRUE(policyGen.Done());
 
-  const wchar_t* filename = nullptr;
+  std::wstring_view filename;
   POLPARAMS_BEGIN(eval_params)
     POLPARAM(filename)  // Argument 0
   POLPARAMS_END;
@@ -160,7 +160,7 @@
   EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr));
   EXPECT_TRUE(policyGen.Done());
 
-  const wchar_t* filename = nullptr;
+  std::wstring_view filename;
   POLPARAMS_BEGIN(eval_params)
     POLPARAM(filename)  // Argument 0
   POLPARAMS_END;
@@ -197,7 +197,7 @@
   EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr));
   EXPECT_TRUE(policyGen.Done());
 
-  const wchar_t* filename = nullptr;
+  std::wstring_view filename;
   uint32_t access = 0;
   POLPARAMS_BEGIN(eval_params)
     POLPARAM(filename)  // Argument 0
@@ -247,7 +247,8 @@
   EXPECT_TRUE(policyGen.AddRule(kNtFakeCreateFile, &pr));
   EXPECT_TRUE(policyGen.Done());
 
-  const wchar_t* filename = L"c:\\Documents and Settings\\Microsoft\\BLAH.txt";
+  std::wstring_view filename =
+      L"c:\\Documents and Settings\\Microsoft\\BLAH.txt";
   uint32_t creation_mode = OPEN_EXISTING;
   uint32_t flags = FILE_ATTRIBUTE_NORMAL;
   void* security_descriptor = nullptr;
@@ -402,7 +403,7 @@
 
   // Test the policy evaluation.
 
-  const wchar_t* filename = L"";
+  std::wstring_view filename = L"";
   uint32_t creation_mode = OPEN_EXISTING;
   uint32_t flags = FILE_ATTRIBUTE_NORMAL;
   void* security_descriptor = nullptr;
@@ -494,7 +495,7 @@
   EXPECT_TRUE(policyGen.AddRule(IpcTag::PING2, &pr_copy));
   EXPECT_TRUE(policyGen.Done());
 
-  const wchar_t* name = nullptr;
+  std::wstring_view name;
   POLPARAMS_BEGIN(eval_params)
     POLPARAM(name)
   POLPARAMS_END;
@@ -552,7 +553,7 @@
             policy->entry[static_cast<size_t>(IpcTag::PING2)]->opcode_count);
 
   // Confirm the rules work as before.
-  const wchar_t* name = nullptr;
+  std::wstring_view name;
   POLPARAMS_BEGIN(eval_params)
     POLPARAM(name)
   POLPARAMS_END;
diff --git a/sandbox/win/src/policy_opcodes_unittest.cc b/sandbox/win/src/policy_opcodes_unittest.cc
index 564f2f6..507091a 100644
--- a/sandbox/win/src/policy_opcodes_unittest.cc
+++ b/sandbox/win/src/policy_opcodes_unittest.cc
@@ -41,11 +41,11 @@
   EXPECT_EQ(number, result2);
 
   // Test that we can store and retrieve a string:
-  const wchar_t* txt = L"S231L";
+  std::wstring_view txt = L"S231L";
   ParameterSet pset4 = ParamPickerMake(txt);
-  const wchar_t* result3 = nullptr;
+  std::wstring_view result3;
   EXPECT_TRUE(pset4.Get(&result3));
-  EXPECT_EQ(0, UNSAFE_TODO(wcscmp(txt, result3)));
+  EXPECT_EQ(txt, result3);
 }
 
 TEST(PolicyEngineTest, OpcodeConstraints) {
@@ -132,15 +132,16 @@
   // supplied buffer. It should only be able to make 'count' opcodes.
   // The difference with the previous test is that this opcodes allocate
   // the string 'txt2' inside the same buffer.
-  const wchar_t* txt1 = L"1234";
-  const wchar_t txt2[] = L"123";
+  std::wstring_view txt1 = L"1234";
+  std::wstring_view txt2 = L"123";
 
   ParameterSet ppb1 = ParamPickerMake(txt1);
   MatchContext mc1;
 
   char memory[kOpcodeMemory];
   OpcodeFactory opcode_maker(memory, sizeof(memory));
-  size_t count = sizeof(memory) / (sizeof(PolicyOpcode) + sizeof(txt2));
+  size_t count =
+      sizeof(memory) / (sizeof(PolicyOpcode) + txt2.size() * sizeof(wchar_t));
 
   // Test that it does not overrun the buffer.
   for (size_t ix = 0; ix != count; ++ix) {
@@ -157,7 +158,7 @@
 }
 
 TEST(PolicyEngineTest, IntegerOpcodes) {
-  const wchar_t* txt = L"abcdef";
+  std::wstring_view txt = L"abcdef";
   uint32_t num1 = 42;
   uint32_t num2 = 113377;
 
@@ -204,12 +205,12 @@
 }
 
 TEST(PolicyEngineTest, WCharOpcodes1) {
-  const wchar_t* txt1 = L"the quick fox jumps over the lazy dog";
-  const wchar_t txt2[] = L"the quick";
-  const wchar_t txt3[] = L" fox jumps";
-  const wchar_t txt4[] = L"the lazy dog";
-  const wchar_t txt5[] = L"jumps over";
-  const wchar_t txt6[] = L"g";
+  std::wstring_view txt1 = L"the quick fox jumps over the lazy dog";
+  std::wstring_view txt2 = L"the quick";
+  std::wstring_view txt3 = L" fox jumps";
+  std::wstring_view txt4 = L"the lazy dog";
+  std::wstring_view txt5 = L"jumps over";
+  std::wstring_view txt6 = L"g";
 
   ParameterSet pp_tc1 = ParamPickerMake(txt1);
   char memory[kOpcodeMemory];
@@ -223,11 +224,11 @@
   // and the match context should be updated.
   MatchContext mc1;
   EXPECT_EQ(EVAL_TRUE, op1->Evaluate(&pp_tc1, 1, &mc1));
-  EXPECT_TRUE(_countof(txt2) == mc1.position + 1);
+  EXPECT_EQ(txt2.size(), mc1.position);
 
   // Matching again should fail and the context should be unmodified.
   EXPECT_EQ(EVAL_FALSE, op1->Evaluate(&pp_tc1, 1, &mc1));
-  EXPECT_TRUE(_countof(txt2) == mc1.position + 1);
+  EXPECT_EQ(txt2.size(), mc1.position);
 
   // Using the same match context we should continue where we left
   // in the previous successful match,
@@ -235,7 +236,7 @@
       opcode_maker.MakeOpWStringMatch(0, txt3, 0, kPolNone, false);
   ASSERT_NE(nullptr, op3);
   EXPECT_EQ(EVAL_TRUE, op3->Evaluate(&pp_tc1, 1, &mc1));
-  EXPECT_TRUE(_countof(txt3) + _countof(txt2) == mc1.position + 2);
+  EXPECT_EQ(txt3.size() + txt2.size(), mc1.position);
 
   // We now keep on matching but now we skip 6 characters which means
   // we skip the string ' over '. And we zero the match context. This is
diff --git a/sandbox/win/src/sandbox_nt_util.cc b/sandbox/win/src/sandbox_nt_util.cc
index 26158cc..8b3c8335 100644
--- a/sandbox/win/src/sandbox_nt_util.cc
+++ b/sandbox/win/src/sandbox_nt_util.cc
@@ -13,12 +13,13 @@
 #include <stddef.h>
 #include <stdint.h>
 
+#include <optional>
 #include <string>
 
-#include <optional>
 #include "base/compiler_specific.h"
 #include "base/containers/span.h"
 #include "base/win/pe_image.h"
+#include "base/win/win_util.h"
 #include "sandbox/win/src/internal_types.h"
 #include "sandbox/win/src/nt_internals.h"
 #include "sandbox/win/src/sandbox_factory.h"
@@ -630,6 +631,19 @@
   return out_string;
 }
 
+std::optional<bool> EqualUnicodeString(std::wstring_view left,
+                                       std::wstring_view right) {
+  UNICODE_STRING left_ustr;
+  UNICODE_STRING right_ustr;
+  if (!base::win::ViewToUnicodeString(left, left_ustr) ||
+      !base::win::ViewToUnicodeString(right, right_ustr)) {
+    return std::nullopt;
+  }
+
+  return GetNtExports()->RtlCompareUnicodeString(&left_ustr, &right_ustr,
+                                                 TRUE) == 0;
+}
+
 NTSTATUS AutoProtectMemory::ChangeProtection(void* address,
                                              size_t bytes,
                                              ULONG protect) {
diff --git a/sandbox/win/src/sandbox_nt_util.h b/sandbox/win/src/sandbox_nt_util.h
index 11c3d99..65a5152 100644
--- a/sandbox/win/src/sandbox_nt_util.h
+++ b/sandbox/win/src/sandbox_nt_util.h
@@ -16,6 +16,7 @@
 
 #include <memory>
 #include <optional>
+#include <string_view>
 
 #include "base/containers/span.h"
 #include "base/memory/raw_ptr_exclusion.h"
@@ -190,6 +191,14 @@
 // Converts an ansi string to an UNICODE_STRING.
 UNICODE_STRING* AnsiToUnicode(const char* string);
 
+// Use the RtlCompareUnicodeString API to compares two strings for equality. The
+// comparison always ignores case.
+// Returns true if equal. Returns std::nullopt if either string is too large to
+// be represented as a UNICODE_STRING. This has the advantage of working inside
+// function hooks where calling the standard library could be impossible.
+std::optional<bool> EqualUnicodeString(std::wstring_view left,
+                                       std::wstring_view right);
+
 // Provides a simple way to temporarily change the protection of a memory page.
 class AutoProtectMemory {
  public:
diff --git a/sandbox/win/src/sandbox_nt_util_unittest.cc b/sandbox/win/src/sandbox_nt_util_unittest.cc
index 91b275a89..7f948c2 100644
--- a/sandbox/win/src/sandbox_nt_util_unittest.cc
+++ b/sandbox/win/src/sandbox_nt_util_unittest.cc
@@ -344,5 +344,20 @@
             reinterpret_cast<LPVOID>(::GetCurrentThreadId()));
 }
 
+TEST(SandboxNtUtil, EqualUnicodeString) {
+  EXPECT_TRUE(*EqualUnicodeString({}, {}));
+  EXPECT_TRUE(*EqualUnicodeString(L"", L""));
+  EXPECT_TRUE(*EqualUnicodeString(L"ABC", L"ABC"));
+  EXPECT_TRUE(*EqualUnicodeString(L"ABC", L"abc"));
+  EXPECT_FALSE(*EqualUnicodeString(L"ABC", L"XYZ"));
+  EXPECT_FALSE(*EqualUnicodeString(L"", L"ABC"));
+  EXPECT_FALSE(*EqualUnicodeString(L"ABC", L""));
+  std::wstring long_str(UINT16_MAX / sizeof(WCHAR), L'A');
+  EXPECT_TRUE(*EqualUnicodeString(long_str, long_str));
+  long_str += L"A";
+  EXPECT_FALSE(EqualUnicodeString(long_str, L"ABC"));
+  EXPECT_FALSE(EqualUnicodeString(L"ABC", long_str));
+}
+
 }  // namespace
 }  // namespace sandbox
diff --git a/sandbox/win/src/signed_dispatcher.cc b/sandbox/win/src/signed_dispatcher.cc
index b934513..7efc7bf4 100644
--- a/sandbox/win/src/signed_dispatcher.cc
+++ b/sandbox/win/src/signed_dispatcher.cc
@@ -59,7 +59,7 @@
   auto path = GetPathFromHandle(local_handle.get());
   if (!path)
     return false;
-  const wchar_t* module_name = path->c_str();
+  std::wstring_view module_name(*path);
   CountedParameterSet<NameBased> params;
   params[NameBased::NAME] = ParamPickerMake(module_name);
 
diff --git a/sandbox/win/src/signed_interception.cc b/sandbox/win/src/signed_interception.cc
index 05581224d..e11bb1af 100644
--- a/sandbox/win/src/signed_interception.cc
+++ b/sandbox/win/src/signed_interception.cc
@@ -7,6 +7,7 @@
 #include <ntstatus.h>
 #include <stdint.h>
 
+#include "base/win/win_util.h"
 #include "sandbox/win/src/crosscall_client.h"
 #include "sandbox/win/src/ipc_tags.h"
 #include "sandbox/win/src/policy_params.h"
@@ -69,7 +70,9 @@
     }
 
     CountedParameterSet<NameBased> params;
-    params[NameBased::NAME] = ParamPickerMake(path->ObjectName.Buffer);
+    std::wstring_view object_name =
+        base::win::UnicodeStringToView(path->ObjectName);
+    params[NameBased::NAME] = ParamPickerMake(object_name);
 
     // Check if this will be sent to the broker.
     if (!QueryBroker(IpcTag::NTCREATESECTION, params.GetBase()))
diff --git a/third_party/androidx/build.gradle b/third_party/androidx/build.gradle
index ba14677..6f8197b 100644
--- a/third_party/androidx/build.gradle
+++ b/third_party/androidx/build.gradle
@@ -314,7 +314,7 @@
     google()
     maven {
         // This URL is generated by the fetch_all_androidx.py script.
-        url 'https://androidx.dev/snapshots/builds/14176386/artifacts/repository'
+        url 'https://androidx.dev/snapshots/builds/14178711/artifacts/repository'
     }
     mavenCentral()
 }
diff --git a/third_party/androidx/committed/libs/androidx_activity_activity/README.chromium b/third_party/androidx/committed/libs/androidx_activity_activity/README.chromium
index 0cb740b3..39df17a 100644
--- a/third_party/androidx/committed/libs/androidx_activity_activity/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_activity_activity/README.chromium
@@ -1,6 +1,6 @@
 Name: Activity
 Short Name: activity
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/activity/activity/1.12.0-SNAPSHOT/activity-1.12.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/activity/activity/1.12.0-SNAPSHOT/activity-1.12.0-20250927.084818-1.aar
 Version: 1.12.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_activity_activity_compose/README.chromium b/third_party/androidx/committed/libs/androidx_activity_activity_compose/README.chromium
index acf26bd..d5972e5 100644
--- a/third_party/androidx/committed/libs/androidx_activity_activity_compose/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_activity_activity_compose/README.chromium
@@ -1,6 +1,6 @@
 Name: Activity Compose
 Short Name: activity-compose
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/activity/activity-compose/1.12.0-SNAPSHOT/activity-compose-1.12.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/activity/activity-compose/1.12.0-SNAPSHOT/activity-compose-1.12.0-20250927.084818-1.aar
 Version: 1.12.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_activity_activity_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_activity_activity_ktx/README.chromium
index 64f9770..f79f8cf 100644
--- a/third_party/androidx/committed/libs/androidx_activity_activity_ktx/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_activity_activity_ktx/README.chromium
@@ -1,6 +1,6 @@
 Name: Activity Kotlin Extensions
 Short Name: activity-ktx
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/activity/activity-ktx/1.12.0-SNAPSHOT/activity-ktx-1.12.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/activity/activity-ktx/1.12.0-SNAPSHOT/activity-ktx-1.12.0-20250927.084818-1.aar
 Version: 1.12.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_annotation_annotation_experimental/README.chromium b/third_party/androidx/committed/libs/androidx_annotation_annotation_experimental/README.chromium
index 35bdd64..120657c1 100644
--- a/third_party/androidx/committed/libs/androidx_annotation_annotation_experimental/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_annotation_annotation_experimental/README.chromium
@@ -1,6 +1,6 @@
 Name: Experimental annotation
 Short Name: annotation-experimental
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/annotation/annotation-experimental/1.6.0-SNAPSHOT/annotation-experimental-1.6.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/annotation/annotation-experimental/1.6.0-SNAPSHOT/annotation-experimental-1.6.0-20250927.084818-1.aar
 Version: 1.6.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_annotation_annotation_jvm/README.chromium b/third_party/androidx/committed/libs/androidx_annotation_annotation_jvm/README.chromium
index 243d186d..f15dd87d 100644
--- a/third_party/androidx/committed/libs/androidx_annotation_annotation_jvm/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_annotation_annotation_jvm/README.chromium
@@ -1,6 +1,6 @@
 Name: Annotation
 Short Name: annotation-jvm
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/annotation/annotation-jvm/1.10.0-SNAPSHOT/annotation-jvm-1.10.0-20250926.202706-1.jar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/annotation/annotation-jvm/1.10.0-SNAPSHOT/annotation-jvm-1.10.0-20250927.084818-1.jar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_appcompat_appcompat/README.chromium b/third_party/androidx/committed/libs/androidx_appcompat_appcompat/README.chromium
index 19bb201b..5d0b71ad 100644
--- a/third_party/androidx/committed/libs/androidx_appcompat_appcompat/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_appcompat_appcompat/README.chromium
@@ -1,6 +1,6 @@
 Name: AppCompat
 Short Name: appcompat
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/appcompat/appcompat/1.8.0-SNAPSHOT/appcompat-1.8.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/appcompat/appcompat/1.8.0-SNAPSHOT/appcompat-1.8.0-20250927.084818-1.aar
 Version: 1.8.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_appcompat_appcompat_resources/README.chromium b/third_party/androidx/committed/libs/androidx_appcompat_appcompat_resources/README.chromium
index ffc525e..f88fcf211 100644
--- a/third_party/androidx/committed/libs/androidx_appcompat_appcompat_resources/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_appcompat_appcompat_resources/README.chromium
@@ -1,6 +1,6 @@
 Name: AppCompat Resources
 Short Name: appcompat-resources
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/appcompat/appcompat-resources/1.8.0-SNAPSHOT/appcompat-resources-1.8.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/appcompat/appcompat-resources/1.8.0-SNAPSHOT/appcompat-resources-1.8.0-20250927.084818-1.aar
 Version: 1.8.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_appsearch_appsearch/README.chromium b/third_party/androidx/committed/libs/androidx_appsearch_appsearch/README.chromium
index 0474d97..38fc54fb 100644
--- a/third_party/androidx/committed/libs/androidx_appsearch_appsearch/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_appsearch_appsearch/README.chromium
@@ -1,6 +1,6 @@
 Name: AppSearch
 Short Name: appsearch
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/appsearch/appsearch/1.2.0-SNAPSHOT/appsearch-1.2.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/appsearch/appsearch/1.2.0-SNAPSHOT/appsearch-1.2.0-20250927.084818-1.aar
 Version: 1.2.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_appsearch_appsearch_builtin_types/README.chromium b/third_party/androidx/committed/libs/androidx_appsearch_appsearch_builtin_types/README.chromium
index 65d5bc57..fecb67ee 100644
--- a/third_party/androidx/committed/libs/androidx_appsearch_appsearch_builtin_types/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_appsearch_appsearch_builtin_types/README.chromium
@@ -1,6 +1,6 @@
 Name: AppSearch Builtin Types
 Short Name: appsearch-builtin-types
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/appsearch/appsearch-builtin-types/1.2.0-SNAPSHOT/appsearch-builtin-types-1.2.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/appsearch/appsearch-builtin-types/1.2.0-SNAPSHOT/appsearch-builtin-types-1.2.0-20250927.084818-1.aar
 Version: 1.2.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_appsearch_appsearch_platform_storage/README.chromium b/third_party/androidx/committed/libs/androidx_appsearch_appsearch_platform_storage/README.chromium
index 839d5ad..6c85ef7 100644
--- a/third_party/androidx/committed/libs/androidx_appsearch_appsearch_platform_storage/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_appsearch_appsearch_platform_storage/README.chromium
@@ -1,6 +1,6 @@
 Name: AppSearch Platform Storage
 Short Name: appsearch-platform-storage
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/appsearch/appsearch-platform-storage/1.2.0-SNAPSHOT/appsearch-platform-storage-1.2.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/appsearch/appsearch-platform-storage/1.2.0-SNAPSHOT/appsearch-platform-storage-1.2.0-20250927.084818-1.aar
 Version: 1.2.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_arch_core_core_common/README.chromium b/third_party/androidx/committed/libs/androidx_arch_core_core_common/README.chromium
index 9b1608da..8e7872f3 100644
--- a/third_party/androidx/committed/libs/androidx_arch_core_core_common/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_arch_core_core_common/README.chromium
@@ -1,6 +1,6 @@
 Name: Arch-Common
 Short Name: core-common
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/arch/core/core-common/2.3.0-SNAPSHOT/core-common-2.3.0-20250926.202706-1.jar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/arch/core/core-common/2.3.0-SNAPSHOT/core-common-2.3.0-20250927.084818-1.jar
 Version: 2.3.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_arch_core_core_runtime/README.chromium b/third_party/androidx/committed/libs/androidx_arch_core_core_runtime/README.chromium
index cf92238..8a8b5f2b 100644
--- a/third_party/androidx/committed/libs/androidx_arch_core_core_runtime/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_arch_core_core_runtime/README.chromium
@@ -1,6 +1,6 @@
 Name: Arch-Runtime
 Short Name: core-runtime
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/arch/core/core-runtime/2.3.0-SNAPSHOT/core-runtime-2.3.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/arch/core/core-runtime/2.3.0-SNAPSHOT/core-runtime-2.3.0-20250927.084818-1.aar
 Version: 2.3.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_autofill_autofill/README.chromium b/third_party/androidx/committed/libs/androidx_autofill_autofill/README.chromium
index 7f26682..6482cad 100644
--- a/third_party/androidx/committed/libs/androidx_autofill_autofill/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_autofill_autofill/README.chromium
@@ -1,6 +1,6 @@
 Name: Autofill
 Short Name: autofill
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/autofill/autofill/1.4.0-SNAPSHOT/autofill-1.4.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/autofill/autofill/1.4.0-SNAPSHOT/autofill-1.4.0-20250927.084818-1.aar
 Version: 1.4.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_common/README.chromium b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_common/README.chromium
index b2d8cb5..99f06ad 100644
--- a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_common/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_common/README.chromium
@@ -1,6 +1,6 @@
 Name: Benchmark - Common
 Short Name: benchmark-common
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/benchmark/benchmark-common/1.5.0-SNAPSHOT/benchmark-common-1.5.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/benchmark/benchmark-common/1.5.0-SNAPSHOT/benchmark-common-1.5.0-20250927.084818-1.aar
 Version: 1.5.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_junit4/README.chromium b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_junit4/README.chromium
index 44cc53b..66f06cf 100644
--- a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_junit4/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_junit4/README.chromium
@@ -1,6 +1,6 @@
 Name: Benchmark - JUnit4
 Short Name: benchmark-junit4
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/benchmark/benchmark-junit4/1.5.0-SNAPSHOT/benchmark-junit4-1.5.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/benchmark/benchmark-junit4/1.5.0-SNAPSHOT/benchmark-junit4-1.5.0-20250927.084818-1.aar
 Version: 1.5.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro/README.chromium b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro/README.chromium
index db2a732..a4e0c9e 100644
--- a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro/README.chromium
@@ -1,6 +1,6 @@
 Name: Benchmark - Macrobenchmark
 Short Name: benchmark-macro
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/benchmark/benchmark-macro/1.5.0-SNAPSHOT/benchmark-macro-1.5.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/benchmark/benchmark-macro/1.5.0-SNAPSHOT/benchmark-macro-1.5.0-20250927.084818-1.aar
 Version: 1.5.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro_junit4/README.chromium b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro_junit4/README.chromium
index f43739c..cf8b512c 100644
--- a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro_junit4/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro_junit4/README.chromium
@@ -1,6 +1,6 @@
 Name: Benchmark - Macrobenchmark JUnit4
 Short Name: benchmark-macro-junit4
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/benchmark/benchmark-macro-junit4/1.5.0-SNAPSHOT/benchmark-macro-junit4-1.5.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/benchmark/benchmark-macro-junit4/1.5.0-SNAPSHOT/benchmark-macro-junit4-1.5.0-20250927.084818-1.aar
 Version: 1.5.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_traceprocessor_android/README.chromium b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_traceprocessor_android/README.chromium
index 4f7a2b4..9526bf1eb 100644
--- a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_traceprocessor_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_traceprocessor_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Benchmark TraceProcessor
 Short Name: benchmark-traceprocessor-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/benchmark/benchmark-traceprocessor-android/1.5.0-SNAPSHOT/benchmark-traceprocessor-android-1.5.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/benchmark/benchmark-traceprocessor-android/1.5.0-SNAPSHOT/benchmark-traceprocessor-android-1.5.0-20250927.084818-1.aar
 Version: 1.5.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_biometric_biometric/README.chromium b/third_party/androidx/committed/libs/androidx_biometric_biometric/README.chromium
index af026d9..c511a67f 100644
--- a/third_party/androidx/committed/libs/androidx_biometric_biometric/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_biometric_biometric/README.chromium
@@ -1,6 +1,6 @@
 Name: Biometric
 Short Name: biometric
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/biometric/biometric/1.4.0-SNAPSHOT/biometric-1.4.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/biometric/biometric/1.4.0-SNAPSHOT/biometric-1.4.0-20250927.084818-1.aar
 Version: 1.4.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_browser_browser/README.chromium b/third_party/androidx/committed/libs/androidx_browser_browser/README.chromium
index 1fdfd21c..ac553d2b 100644
--- a/third_party/androidx/committed/libs/androidx_browser_browser/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_browser_browser/README.chromium
@@ -1,6 +1,6 @@
 Name: Browser
 Short Name: browser
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/browser/browser/1.10.0-SNAPSHOT/browser-1.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/browser/browser/1.10.0-SNAPSHOT/browser-1.10.0-20250927.084818-1.aar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_cardview_cardview/README.chromium b/third_party/androidx/committed/libs/androidx_cardview_cardview/README.chromium
index c6b4539..b62b3aa6 100644
--- a/third_party/androidx/committed/libs/androidx_cardview_cardview/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_cardview_cardview/README.chromium
@@ -1,6 +1,6 @@
 Name: CardView
 Short Name: cardview
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/cardview/cardview/1.1.0-SNAPSHOT/cardview-1.1.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/cardview/cardview/1.1.0-SNAPSHOT/cardview-1.1.0-20250927.084818-1.aar
 Version: 1.1.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_collection_collection_jvm/README.chromium b/third_party/androidx/committed/libs/androidx_collection_collection_jvm/README.chromium
index cab46536..3704bbf 100644
--- a/third_party/androidx/committed/libs/androidx_collection_collection_jvm/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_collection_collection_jvm/README.chromium
@@ -1,6 +1,6 @@
 Name: collections
 Short Name: collection-jvm
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/collection/collection-jvm/1.6.0-SNAPSHOT/collection-jvm-1.6.0-20250926.202706-1.jar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/collection/collection-jvm/1.6.0-SNAPSHOT/collection-jvm-1.6.0-20250927.084818-1.jar
 Version: 1.6.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_collection_collection_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_collection_collection_ktx/README.chromium
index 5a4c8c3..c1d62523 100644
--- a/third_party/androidx/committed/libs/androidx_collection_collection_ktx/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_collection_collection_ktx/README.chromium
@@ -1,6 +1,6 @@
 Name: Collections Kotlin Extensions
 Short Name: collection-ktx
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/collection/collection-ktx/1.6.0-SNAPSHOT/collection-ktx-1.6.0-20250926.202706-1.jar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/collection/collection-ktx/1.6.0-SNAPSHOT/collection-ktx-1.6.0-20250927.084818-1.jar
 Version: 1.6.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_animation_animation_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_animation_animation_android/README.chromium
index 6b98ece..91d20a6 100644
--- a/third_party/androidx/committed/libs/androidx_compose_animation_animation_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_compose_animation_animation_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose Animation
 Short Name: animation-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/animation/animation-android/1.10.0-SNAPSHOT/animation-android-1.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/animation/animation-android/1.10.0-SNAPSHOT/animation-android-1.10.0-20250927.084818-1.aar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_animation_animation_core_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_animation_animation_core_android/README.chromium
index be8978c6..5d7135d 100644
--- a/third_party/androidx/committed/libs/androidx_compose_animation_animation_core_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_compose_animation_animation_core_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose Animation Core
 Short Name: animation-core-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/animation/animation-core-android/1.10.0-SNAPSHOT/animation-core-android-1.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/animation/animation-core-android/1.10.0-SNAPSHOT/animation-core-android-1.10.0-20250927.084818-1.aar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_android/README.chromium
index fe7d1a9e..e87db0b 100644
--- a/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose Foundation
 Short Name: foundation-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/foundation/foundation-android/1.10.0-SNAPSHOT/foundation-android-1.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/foundation/foundation-android/1.10.0-SNAPSHOT/foundation-android-1.10.0-20250927.084818-1.aar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_layout_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_layout_android/README.chromium
index f437480..6b9c275 100644
--- a/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_layout_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_layout_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose Layouts
 Short Name: foundation-layout-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/foundation/foundation-layout-android/1.10.0-SNAPSHOT/foundation-layout-android-1.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/foundation/foundation-layout-android/1.10.0-SNAPSHOT/foundation-layout-android-1.10.0-20250927.084818-1.aar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_material3_material3_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_material3_material3_android/README.chromium
index 52139af..8c72cdc 100644
--- a/third_party/androidx/committed/libs/androidx_compose_material3_material3_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_compose_material3_material3_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose Material3 Components
 Short Name: material3-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/material3/material3-android/1.5.0-SNAPSHOT/material3-android-1.5.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/material3/material3-android/1.5.0-SNAPSHOT/material3-android-1.5.0-20250927.084818-1.aar
 Version: 1.5.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_material_material_ripple_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_material_material_ripple_android/README.chromium
index d0c2dde..25a7668 100644
--- a/third_party/androidx/committed/libs/androidx_compose_material_material_ripple_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_compose_material_material_ripple_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose Material Ripple
 Short Name: material-ripple-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/material/material-ripple-android/1.10.0-SNAPSHOT/material-ripple-android-1.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/material/material-ripple-android/1.10.0-SNAPSHOT/material-ripple-android-1.10.0-20250927.084818-1.aar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_android/README.chromium
index 6685b53..fb09d83 100644
--- a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose Runtime
 Short Name: runtime-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/runtime/runtime-android/1.10.0-SNAPSHOT/runtime-android-1.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/runtime/runtime-android/1.10.0-SNAPSHOT/runtime-android-1.10.0-20250927.084818-1.aar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_annotation_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_annotation_android/README.chromium
index bdbbb8ea..72d71f82 100644
--- a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_annotation_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_annotation_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose Runtime Annotation
 Short Name: runtime-annotation-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/runtime/runtime-annotation-android/1.10.0-SNAPSHOT/runtime-annotation-android-1.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/runtime/runtime-annotation-android/1.10.0-SNAPSHOT/runtime-annotation-android-1.10.0-20250927.084818-1.aar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_retain_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_retain_android/README.chromium
index b653a90..3eb58d90 100644
--- a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_retain_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_retain_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose Runtime Retain
 Short Name: runtime-retain-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/runtime/runtime-retain-android/1.10.0-SNAPSHOT/runtime-retain-android-1.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/runtime/runtime-retain-android/1.10.0-SNAPSHOT/runtime-retain-android-1.10.0-20250927.084818-1.aar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_saveable_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_saveable_android/README.chromium
index 1d2fb78..ba2e494 100644
--- a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_saveable_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_saveable_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose Saveable
 Short Name: runtime-saveable-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/runtime/runtime-saveable-android/1.10.0-SNAPSHOT/runtime-saveable-android-1.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/runtime/runtime-saveable-android/1.10.0-SNAPSHOT/runtime-saveable-android-1.10.0-20250927.084818-1.aar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_android/README.chromium
index 84421b3..0884557 100644
--- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose UI
 Short Name: ui-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/ui/ui-android/1.10.0-SNAPSHOT/ui-android-1.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/ui/ui-android/1.10.0-SNAPSHOT/ui-android-1.10.0-20250927.084818-1.aar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_geometry_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_geometry_android/README.chromium
index 8d36a795..9ca16f0d 100644
--- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_geometry_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_geometry_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose Geometry
 Short Name: ui-geometry-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/ui/ui-geometry-android/1.10.0-SNAPSHOT/ui-geometry-android-1.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/ui/ui-geometry-android/1.10.0-SNAPSHOT/ui-geometry-android-1.10.0-20250927.084818-1.aar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_graphics_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_graphics_android/README.chromium
index cc9573a7..0382592 100644
--- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_graphics_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_graphics_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose Graphics
 Short Name: ui-graphics-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/ui/ui-graphics-android/1.10.0-SNAPSHOT/ui-graphics-android-1.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/ui/ui-graphics-android/1.10.0-SNAPSHOT/ui-graphics-android-1.10.0-20250927.084818-1.aar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_android/README.chromium
index 02caea8c..f7e19a81 100644
--- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose Testing
 Short Name: ui-test-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/ui/ui-test-android/1.10.0-SNAPSHOT/ui-test-android-1.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/ui/ui-test-android/1.10.0-SNAPSHOT/ui-test-android-1.10.0-20250927.084818-1.aar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_junit4_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_junit4_android/README.chromium
index e591faa..bfeb361 100644
--- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_junit4_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_junit4_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose Testing for JUnit4
 Short Name: ui-test-junit4-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/ui/ui-test-junit4-android/1.10.0-SNAPSHOT/ui-test-junit4-android-1.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/ui/ui-test-junit4-android/1.10.0-SNAPSHOT/ui-test-junit4-android-1.10.0-20250927.084818-1.aar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_manifest/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_manifest/README.chromium
index ba2d28ff..848f1ff 100644
--- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_manifest/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_manifest/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose Testing manifest dependency
 Short Name: ui-test-manifest
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/ui/ui-test-manifest/1.10.0-SNAPSHOT/ui-test-manifest-1.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/ui/ui-test-manifest/1.10.0-SNAPSHOT/ui-test-manifest-1.10.0-20250927.084818-1.aar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_android/README.chromium
index 72df54a4..239e7e9 100644
--- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose UI Text
 Short Name: ui-text-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/ui/ui-text-android/1.10.0-SNAPSHOT/ui-text-android-1.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/ui/ui-text-android/1.10.0-SNAPSHOT/ui-text-android-1.10.0-20250927.084818-1.aar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_google_fonts/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_google_fonts/README.chromium
index 73e9465..6798003 100644
--- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_google_fonts/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_google_fonts/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose Google Fonts integration
 Short Name: ui-text-google-fonts
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/ui/ui-text-google-fonts/1.10.0-SNAPSHOT/ui-text-google-fonts-1.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/ui/ui-text-google-fonts/1.10.0-SNAPSHOT/ui-text-google-fonts-1.10.0-20250927.084818-1.aar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_unit_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_unit_android/README.chromium
index 7d092ccd..b057339 100644
--- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_unit_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_unit_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose Unit
 Short Name: ui-unit-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/ui/ui-unit-android/1.10.0-SNAPSHOT/ui-unit-android-1.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/ui/ui-unit-android/1.10.0-SNAPSHOT/ui-unit-android-1.10.0-20250927.084818-1.aar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_util_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_util_android/README.chromium
index 3bdc03b..317049e2 100644
--- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_util_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_util_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose Util
 Short Name: ui-util-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/ui/ui-util-android/1.10.0-SNAPSHOT/ui-util-android-1.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/ui/ui-util-android/1.10.0-SNAPSHOT/ui-util-android-1.10.0-20250927.084818-1.aar
 Version: 1.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout/README.chromium b/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout/README.chromium
index 28d7ea4..6d62738 100644
--- a/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout/README.chromium
@@ -1,6 +1,6 @@
 Name: ConstraintLayout
 Short Name: constraintlayout
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/constraintlayout/constraintlayout/2.3.0-SNAPSHOT/constraintlayout-2.3.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/constraintlayout/constraintlayout/2.3.0-SNAPSHOT/constraintlayout-2.3.0-20250927.084818-1.aar
 Version: 2.3.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout_core/README.chromium b/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout_core/README.chromium
index 467ba93..bd3b0a98 100644
--- a/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout_core/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout_core/README.chromium
@@ -1,6 +1,6 @@
 Name: ConstraintLayout Core
 Short Name: constraintlayout-core
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/constraintlayout/constraintlayout-core/1.2.0-SNAPSHOT/constraintlayout-core-1.2.0-20250926.202706-1.jar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/constraintlayout/constraintlayout-core/1.2.0-SNAPSHOT/constraintlayout-core-1.2.0-20250927.084818-1.jar
 Version: 1.2.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_core_core/README.chromium b/third_party/androidx/committed/libs/androidx_core_core/README.chromium
index 92383ec..af8ea9a2 100644
--- a/third_party/androidx/committed/libs/androidx_core_core/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_core_core/README.chromium
@@ -1,6 +1,6 @@
 Name: Core
 Short Name: core
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/core/core/1.18.0-SNAPSHOT/core-1.18.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/core/core/1.18.0-SNAPSHOT/core-1.18.0-20250927.084818-1.aar
 Version: 1.18.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_core_core_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_core_core_ktx/README.chromium
index 077aa1c..54f267e 100644
--- a/third_party/androidx/committed/libs/androidx_core_core_ktx/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_core_core_ktx/README.chromium
@@ -1,6 +1,6 @@
 Name: Core Kotlin Extensions
 Short Name: core-ktx
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/core/core-ktx/1.18.0-SNAPSHOT/core-ktx-1.18.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/core/core-ktx/1.18.0-SNAPSHOT/core-ktx-1.18.0-20250927.084818-1.aar
 Version: 1.18.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_core_core_viewtree/README.chromium b/third_party/androidx/committed/libs/androidx_core_core_viewtree/README.chromium
index eb252c55..276b4e3 100644
--- a/third_party/androidx/committed/libs/androidx_core_core_viewtree/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_core_core_viewtree/README.chromium
@@ -1,6 +1,6 @@
 Name: androidx.core:core-viewtree
 Short Name: core-viewtree
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/core/core-viewtree/1.1.0-SNAPSHOT/core-viewtree-1.1.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/core/core-viewtree/1.1.0-SNAPSHOT/core-viewtree-1.1.0-20250927.084818-1.aar
 Version: 1.1.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_credentials_credentials/README.chromium b/third_party/androidx/committed/libs/androidx_credentials_credentials/README.chromium
index 25f5932..e754a15c 100644
--- a/third_party/androidx/committed/libs/androidx_credentials_credentials/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_credentials_credentials/README.chromium
@@ -1,6 +1,6 @@
 Name: Credentials
 Short Name: credentials
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/credentials/credentials/1.6.0-SNAPSHOT/credentials-1.6.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/credentials/credentials/1.6.0-SNAPSHOT/credentials-1.6.0-20250927.084818-1.aar
 Version: 1.6.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_credentials_credentials_play_services_auth/README.chromium b/third_party/androidx/committed/libs/androidx_credentials_credentials_play_services_auth/README.chromium
index 50d4a2d0..9d5565f7 100644
--- a/third_party/androidx/committed/libs/androidx_credentials_credentials_play_services_auth/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_credentials_credentials_play_services_auth/README.chromium
@@ -1,6 +1,6 @@
 Name: Credentials Play Services Auth
 Short Name: credentials-play-services-auth
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/credentials/credentials-play-services-auth/1.6.0-SNAPSHOT/credentials-play-services-auth-1.6.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/credentials/credentials-play-services-auth/1.6.0-SNAPSHOT/credentials-play-services-auth-1.6.0-20250927.084818-1.aar
 Version: 1.6.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider/README.chromium b/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider/README.chromium
index 4d6992f..727615d 100644
--- a/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider/README.chromium
@@ -1,6 +1,6 @@
 Name: androidx.credentials.registry:registry-provider
 Short Name: registry-provider
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/credentials/registry/registry-provider/1.0.0-SNAPSHOT/registry-provider-1.0.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/credentials/registry/registry-provider/1.0.0-SNAPSHOT/registry-provider-1.0.0-20250927.084818-1.aar
 Version: 1.0.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider_play_services/README.chromium b/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider_play_services/README.chromium
index bfcc42cc..c1f39a1 100644
--- a/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider_play_services/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider_play_services/README.chromium
@@ -1,6 +1,6 @@
 Name: androidx.credentials.registry:registry-provider-play-services
 Short Name: registry-provider-play-services
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/credentials/registry/registry-provider-play-services/1.0.0-SNAPSHOT/registry-provider-play-services-1.0.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/credentials/registry/registry-provider-play-services/1.0.0-SNAPSHOT/registry-provider-play-services-1.0.0-20250927.084818-1.aar
 Version: 1.0.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_cursoradapter_cursoradapter/README.chromium b/third_party/androidx/committed/libs/androidx_cursoradapter_cursoradapter/README.chromium
index 12397d4..50d1b0c4 100644
--- a/third_party/androidx/committed/libs/androidx_cursoradapter_cursoradapter/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_cursoradapter_cursoradapter/README.chromium
@@ -1,6 +1,6 @@
 Name: Cursor Adapter
 Short Name: cursoradapter
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/cursoradapter/cursoradapter/1.1.0-SNAPSHOT/cursoradapter-1.1.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/cursoradapter/cursoradapter/1.1.0-SNAPSHOT/cursoradapter-1.1.0-20250927.084818-1.aar
 Version: 1.1.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_android/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_android/README.chromium
index 4404745..11ff131 100644
--- a/third_party/androidx/committed/libs/androidx_datastore_datastore_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_android/README.chromium
@@ -1,6 +1,6 @@
 Name: DataStore
 Short Name: datastore-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/datastore/datastore-android/1.2.0-SNAPSHOT/datastore-android-1.2.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/datastore/datastore-android/1.2.0-SNAPSHOT/datastore-android-1.2.0-20250927.084818-1.aar
 Version: 1.2.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_core_android/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_core_android/README.chromium
index f7a001b..e41839f 100644
--- a/third_party/androidx/committed/libs/androidx_datastore_datastore_core_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_core_android/README.chromium
@@ -1,6 +1,6 @@
 Name: DataStore Core
 Short Name: datastore-core-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/datastore/datastore-core-android/1.2.0-SNAPSHOT/datastore-core-android-1.2.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/datastore/datastore-core-android/1.2.0-SNAPSHOT/datastore-core-android-1.2.0-20250927.084818-1.aar
 Version: 1.2.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_core_okio_jvm/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_core_okio_jvm/README.chromium
index ebb56c1..02e0190 100644
--- a/third_party/androidx/committed/libs/androidx_datastore_datastore_core_okio_jvm/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_core_okio_jvm/README.chromium
@@ -1,6 +1,6 @@
 Name: DataStore Core Okio
 Short Name: datastore-core-okio-jvm
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/datastore/datastore-core-okio-jvm/1.2.0-SNAPSHOT/datastore-core-okio-jvm-1.2.0-20250926.202706-1.jar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/datastore/datastore-core-okio-jvm/1.2.0-SNAPSHOT/datastore-core-okio-jvm-1.2.0-20250927.084818-1.jar
 Version: 1.2.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_android/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_android/README.chromium
index ea82e78f..31901bc 100644
--- a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Preferences DataStore
 Short Name: datastore-preferences-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/datastore/datastore-preferences-android/1.2.0-SNAPSHOT/datastore-preferences-android-1.2.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/datastore/datastore-preferences-android/1.2.0-SNAPSHOT/datastore-preferences-android-1.2.0-20250927.084818-1.aar
 Version: 1.2.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_core_android/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_core_android/README.chromium
index 783e24a..f1ea3fa8 100644
--- a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_core_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_core_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Preferences DataStore Core
 Short Name: datastore-preferences-core-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/datastore/datastore-preferences-core-android/1.2.0-SNAPSHOT/datastore-preferences-core-android-1.2.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/datastore/datastore-preferences-core-android/1.2.0-SNAPSHOT/datastore-preferences-core-android-1.2.0-20250927.084818-1.aar
 Version: 1.2.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_external_protobuf/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_external_protobuf/README.chromium
index 528a42c6..a1bf438 100644
--- a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_external_protobuf/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_external_protobuf/README.chromium
@@ -1,6 +1,6 @@
 Name: Preferences External Protobuf
 Short Name: datastore-preferences-external-protobuf
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/datastore/datastore-preferences-external-protobuf/1.2.0-SNAPSHOT/datastore-preferences-external-protobuf-1.2.0-20250926.202706-1.jar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/datastore/datastore-preferences-external-protobuf/1.2.0-SNAPSHOT/datastore-preferences-external-protobuf-1.2.0-20250927.084818-1.jar
 Version: 1.2.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: BSD-3-Clause
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_proto/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_proto/README.chromium
index 3bcbccc..2a032a8 100644
--- a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_proto/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_proto/README.chromium
@@ -1,6 +1,6 @@
 Name: Preferences DataStore Proto
 Short Name: datastore-preferences-proto
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/datastore/datastore-preferences-proto/1.2.0-SNAPSHOT/datastore-preferences-proto-1.2.0-20250926.202706-1.jar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/datastore/datastore-preferences-proto/1.2.0-SNAPSHOT/datastore-preferences-proto-1.2.0-20250927.084818-1.jar
 Version: 1.2.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_drawerlayout_drawerlayout/README.chromium b/third_party/androidx/committed/libs/androidx_drawerlayout_drawerlayout/README.chromium
index 06e0b74..118f1d42 100644
--- a/third_party/androidx/committed/libs/androidx_drawerlayout_drawerlayout/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_drawerlayout_drawerlayout/README.chromium
@@ -1,6 +1,6 @@
 Name: Drawer Layout
 Short Name: drawerlayout
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/drawerlayout/drawerlayout/1.3.0-SNAPSHOT/drawerlayout-1.3.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/drawerlayout/drawerlayout/1.3.0-SNAPSHOT/drawerlayout-1.3.0-20250927.084818-1.aar
 Version: 1.3.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_emoji_emoji/README.chromium b/third_party/androidx/committed/libs/androidx_emoji_emoji/README.chromium
index 623afb0..d08940c 100644
--- a/third_party/androidx/committed/libs/androidx_emoji_emoji/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_emoji_emoji/README.chromium
@@ -1,6 +1,6 @@
 Name: Emoji
 Short Name: emoji
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/emoji/emoji/1.2.0-SNAPSHOT/emoji-1.2.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/emoji/emoji/1.2.0-SNAPSHOT/emoji-1.2.0-20250927.084818-1.aar
 Version: 1.2.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0, SIL Open Font License, Version 1.1, Unicode, Inc. License
diff --git a/third_party/androidx/committed/libs/androidx_fragment_fragment/README.chromium b/third_party/androidx/committed/libs/androidx_fragment_fragment/README.chromium
index 04e6744..37426622 100644
--- a/third_party/androidx/committed/libs/androidx_fragment_fragment/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_fragment_fragment/README.chromium
@@ -1,6 +1,6 @@
 Name: fragment
 Short Name: fragment
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/fragment/fragment/1.9.0-SNAPSHOT/fragment-1.9.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/fragment/fragment/1.9.0-SNAPSHOT/fragment-1.9.0-20250927.084818-1.aar
 Version: 1.9.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_fragment_fragment_compose/README.chromium b/third_party/androidx/committed/libs/androidx_fragment_fragment_compose/README.chromium
index 00f6d28e..2eefb957 100644
--- a/third_party/androidx/committed/libs/androidx_fragment_fragment_compose/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_fragment_fragment_compose/README.chromium
@@ -1,6 +1,6 @@
 Name: Fragment Compose
 Short Name: fragment-compose
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/fragment/fragment-compose/1.9.0-SNAPSHOT/fragment-compose-1.9.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/fragment/fragment-compose/1.9.0-SNAPSHOT/fragment-compose-1.9.0-20250927.084818-1.aar
 Version: 1.9.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_fragment_fragment_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_fragment_fragment_ktx/README.chromium
index 509a4d7b..dc7e78c 100644
--- a/third_party/androidx/committed/libs/androidx_fragment_fragment_ktx/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_fragment_fragment_ktx/README.chromium
@@ -1,6 +1,6 @@
 Name: Fragment Kotlin Extensions
 Short Name: fragment-ktx
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/fragment/fragment-ktx/1.9.0-SNAPSHOT/fragment-ktx-1.9.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/fragment/fragment-ktx/1.9.0-SNAPSHOT/fragment-ktx-1.9.0-20250927.084818-1.aar
 Version: 1.9.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_fragment_fragment_testing/README.chromium b/third_party/androidx/committed/libs/androidx_fragment_fragment_testing/README.chromium
index 40ad791..3cf5a7b8 100644
--- a/third_party/androidx/committed/libs/androidx_fragment_fragment_testing/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_fragment_fragment_testing/README.chromium
@@ -1,6 +1,6 @@
 Name: Fragment Testing Extensions
 Short Name: fragment-testing
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/fragment/fragment-testing/1.9.0-SNAPSHOT/fragment-testing-1.9.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/fragment/fragment-testing/1.9.0-SNAPSHOT/fragment-testing-1.9.0-20250927.084818-1.aar
 Version: 1.9.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_fragment_fragment_testing_manifest/README.chromium b/third_party/androidx/committed/libs/androidx_fragment_fragment_testing_manifest/README.chromium
index baf49ed5..ab331ce 100644
--- a/third_party/androidx/committed/libs/androidx_fragment_fragment_testing_manifest/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_fragment_fragment_testing_manifest/README.chromium
@@ -1,6 +1,6 @@
 Name: Fragment Testing Manifest dependency
 Short Name: fragment-testing-manifest
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/fragment/fragment-testing-manifest/1.9.0-SNAPSHOT/fragment-testing-manifest-1.9.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/fragment/fragment-testing-manifest/1.9.0-SNAPSHOT/fragment-testing-manifest-1.9.0-20250927.084818-1.aar
 Version: 1.9.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_graphics_graphics_path/README.chromium b/third_party/androidx/committed/libs/androidx_graphics_graphics_path/README.chromium
index 81218fc6..904b3e46 100644
--- a/third_party/androidx/committed/libs/androidx_graphics_graphics_path/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_graphics_graphics_path/README.chromium
@@ -1,6 +1,6 @@
 Name: Android Graphics Path
 Short Name: graphics-path
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/graphics/graphics-path/1.1.0-SNAPSHOT/graphics-path-1.1.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/graphics/graphics-path/1.1.0-SNAPSHOT/graphics-path-1.1.0-20250927.084818-1.aar
 Version: 1.1.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_graphics_graphics_shapes_android/README.chromium b/third_party/androidx/committed/libs/androidx_graphics_graphics_shapes_android/README.chromium
index 0609297..ec973bc 100644
--- a/third_party/androidx/committed/libs/androidx_graphics_graphics_shapes_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_graphics_graphics_shapes_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Graphics Shapes
 Short Name: graphics-shapes-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/graphics/graphics-shapes-android/1.1.0-SNAPSHOT/graphics-shapes-android-1.1.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/graphics/graphics-shapes-android/1.1.0-SNAPSHOT/graphics-shapes-android-1.1.0-20250927.084818-1.aar
 Version: 1.1.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_interpolator_interpolator/README.chromium b/third_party/androidx/committed/libs/androidx_interpolator_interpolator/README.chromium
index 639db776..3e7a5203 100644
--- a/third_party/androidx/committed/libs/androidx_interpolator_interpolator/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_interpolator_interpolator/README.chromium
@@ -1,6 +1,6 @@
 Name: Interpolators
 Short Name: interpolator
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/interpolator/interpolator/1.1.0-SNAPSHOT/interpolator-1.1.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/interpolator/interpolator/1.1.0-SNAPSHOT/interpolator-1.1.0-20250927.084818-1.aar
 Version: 1.1.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_java8/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_java8/README.chromium
index c43dee9a1e..29d3244 100644
--- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_java8/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_java8/README.chromium
@@ -1,6 +1,6 @@
 Name: Lifecycle-Common for Java 8
 Short Name: lifecycle-common-java8
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-common-java8/2.10.0-SNAPSHOT/lifecycle-common-java8-2.10.0-20250926.202706-1.jar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-common-java8/2.10.0-SNAPSHOT/lifecycle-common-java8-2.10.0-20250927.084818-1.jar
 Version: 2.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_jvm/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_jvm/README.chromium
index 8c411d3..befd4cb 100644
--- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_jvm/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_jvm/README.chromium
@@ -1,6 +1,6 @@
 Name: Lifecycle-Common
 Short Name: lifecycle-common-jvm
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-common-jvm/2.10.0-SNAPSHOT/lifecycle-common-jvm-2.10.0-20250926.202706-1.jar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-common-jvm/2.10.0-SNAPSHOT/lifecycle-common-jvm-2.10.0-20250927.084818-1.jar
 Version: 2.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata/README.chromium
index f3fdfd81..a722345 100644
--- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata/README.chromium
@@ -1,6 +1,6 @@
 Name: Lifecycle LiveData
 Short Name: lifecycle-livedata
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-livedata/2.10.0-SNAPSHOT/lifecycle-livedata-2.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-livedata/2.10.0-SNAPSHOT/lifecycle-livedata-2.10.0-20250927.084818-1.aar
 Version: 2.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core/README.chromium
index 81087fb..e4249a0 100644
--- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core/README.chromium
@@ -1,6 +1,6 @@
 Name: Lifecycle LiveData Core
 Short Name: lifecycle-livedata-core
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-livedata-core/2.10.0-SNAPSHOT/lifecycle-livedata-core-2.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-livedata-core/2.10.0-SNAPSHOT/lifecycle-livedata-core-2.10.0-20250927.084818-1.aar
 Version: 2.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core_ktx/README.chromium
index e32d3a7b..a78e3c7 100644
--- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core_ktx/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core_ktx/README.chromium
@@ -1,6 +1,6 @@
 Name: LiveData Core Kotlin Extensions
 Short Name: lifecycle-livedata-core-ktx
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-livedata-core-ktx/2.10.0-SNAPSHOT/lifecycle-livedata-core-ktx-2.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-livedata-core-ktx/2.10.0-SNAPSHOT/lifecycle-livedata-core-ktx-2.10.0-20250927.084818-1.aar
 Version: 2.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_ktx/README.chromium
index 31d659c..373c0e85 100644
--- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_ktx/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_ktx/README.chromium
@@ -1,6 +1,6 @@
 Name: LiveData Kotlin Extensions
 Short Name: lifecycle-livedata-ktx
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-livedata-ktx/2.10.0-SNAPSHOT/lifecycle-livedata-ktx-2.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-livedata-ktx/2.10.0-SNAPSHOT/lifecycle-livedata-ktx-2.10.0-20250927.084818-1.aar
 Version: 2.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_process/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_process/README.chromium
index 57efaa5..2c4eb68 100644
--- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_process/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_process/README.chromium
@@ -1,6 +1,6 @@
 Name: Lifecycle Process
 Short Name: lifecycle-process
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-process/2.10.0-SNAPSHOT/lifecycle-process-2.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-process/2.10.0-SNAPSHOT/lifecycle-process-2.10.0-20250927.084818-1.aar
 Version: 2.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_android/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_android/README.chromium
index e3df1c7d..a0ee0a8 100644
--- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Lifecycle Runtime
 Short Name: lifecycle-runtime-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-runtime-android/2.10.0-SNAPSHOT/lifecycle-runtime-android-2.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-runtime-android/2.10.0-SNAPSHOT/lifecycle-runtime-android-2.10.0-20250927.084818-1.aar
 Version: 2.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_compose_android/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_compose_android/README.chromium
index 5f7e6a1d..b6513d7b 100644
--- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_compose_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_compose_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Lifecycle Runtime Compose
 Short Name: lifecycle-runtime-compose-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-runtime-compose-android/2.10.0-SNAPSHOT/lifecycle-runtime-compose-android-2.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-runtime-compose-android/2.10.0-SNAPSHOT/lifecycle-runtime-compose-android-2.10.0-20250927.084818-1.aar
 Version: 2.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_ktx_android/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_ktx_android/README.chromium
index b4c80a41..68eecdda 100644
--- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_ktx_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_ktx_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Lifecycle Kotlin Extensions
 Short Name: lifecycle-runtime-ktx-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-runtime-ktx-android/2.10.0-SNAPSHOT/lifecycle-runtime-ktx-android-2.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-runtime-ktx-android/2.10.0-SNAPSHOT/lifecycle-runtime-ktx-android-2.10.0-20250927.084818-1.aar
 Version: 2.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_service/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_service/README.chromium
index 198c4ffc..5b6186f0 100644
--- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_service/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_service/README.chromium
@@ -1,6 +1,6 @@
 Name: Lifecycle Service
 Short Name: lifecycle-service
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-service/2.10.0-SNAPSHOT/lifecycle-service-2.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-service/2.10.0-SNAPSHOT/lifecycle-service-2.10.0-20250927.084818-1.aar
 Version: 2.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_android/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_android/README.chromium
index a606d679..40aee92 100644
--- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Lifecycle ViewModel
 Short Name: lifecycle-viewmodel-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-android/2.10.0-SNAPSHOT/lifecycle-viewmodel-android-2.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-android/2.10.0-SNAPSHOT/lifecycle-viewmodel-android-2.10.0-20250927.084818-1.aar
 Version: 2.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_compose_android/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_compose_android/README.chromium
index 9a3194e..5c4655b 100644
--- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_compose_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_compose_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Lifecycle ViewModel Compose
 Short Name: lifecycle-viewmodel-compose-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-compose-android/2.10.0-SNAPSHOT/lifecycle-viewmodel-compose-android-2.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-compose-android/2.10.0-SNAPSHOT/lifecycle-viewmodel-compose-android-2.10.0-20250927.084818-1.aar
 Version: 2.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_ktx/README.chromium
index 1afdb4e..707f476 100644
--- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_ktx/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_ktx/README.chromium
@@ -1,6 +1,6 @@
 Name: Lifecycle ViewModel Kotlin Extensions
 Short Name: lifecycle-viewmodel-ktx
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-ktx/2.10.0-SNAPSHOT/lifecycle-viewmodel-ktx-2.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-ktx/2.10.0-SNAPSHOT/lifecycle-viewmodel-ktx-2.10.0-20250927.084818-1.aar
 Version: 2.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_savedstate_android/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_savedstate_android/README.chromium
index 2a547a8..b7d6b07 100644
--- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_savedstate_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_savedstate_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Lifecycle ViewModel with SavedState
 Short Name: lifecycle-viewmodel-savedstate-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-savedstate-android/2.10.0-SNAPSHOT/lifecycle-viewmodel-savedstate-android-2.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-savedstate-android/2.10.0-SNAPSHOT/lifecycle-viewmodel-savedstate-android-2.10.0-20250927.084818-1.aar
 Version: 2.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_loader_loader/README.chromium b/third_party/androidx/committed/libs/androidx_loader_loader/README.chromium
index 49cdd77..69f73f72 100644
--- a/third_party/androidx/committed/libs/androidx_loader_loader/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_loader_loader/README.chromium
@@ -1,6 +1,6 @@
 Name: loader
 Short Name: loader
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/loader/loader/1.2.0-SNAPSHOT/loader-1.2.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/loader/loader/1.2.0-SNAPSHOT/loader-1.2.0-20250927.084818-1.aar
 Version: 1.2.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_media_media/README.chromium b/third_party/androidx/committed/libs/androidx_media_media/README.chromium
index 7ffeca2..192131f 100644
--- a/third_party/androidx/committed/libs/androidx_media_media/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_media_media/README.chromium
@@ -1,6 +1,6 @@
 Name: Media
 Short Name: media
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/media/media/1.8.0-SNAPSHOT/media-1.8.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/media/media/1.8.0-SNAPSHOT/media-1.8.0-20250927.084818-1.aar
 Version: 1.8.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_navigation_navigation_common_android/README.chromium b/third_party/androidx/committed/libs/androidx_navigation_navigation_common_android/README.chromium
index 9fbd0cd3..d385ce1 100644
--- a/third_party/androidx/committed/libs/androidx_navigation_navigation_common_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_navigation_navigation_common_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Navigation Common
 Short Name: navigation-common-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/navigation/navigation-common-android/2.10.0-SNAPSHOT/navigation-common-android-2.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/navigation/navigation-common-android/2.10.0-SNAPSHOT/navigation-common-android-2.10.0-20250927.084818-1.aar
 Version: 2.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_navigation_navigation_compose_android/README.chromium b/third_party/androidx/committed/libs/androidx_navigation_navigation_compose_android/README.chromium
index 4a5474a5..d9f3051 100644
--- a/third_party/androidx/committed/libs/androidx_navigation_navigation_compose_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_navigation_navigation_compose_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Compose Navigation
 Short Name: navigation-compose-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/navigation/navigation-compose-android/2.10.0-SNAPSHOT/navigation-compose-android-2.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/navigation/navigation-compose-android/2.10.0-SNAPSHOT/navigation-compose-android-2.10.0-20250927.084818-1.aar
 Version: 2.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_navigation_navigation_runtime_android/README.chromium b/third_party/androidx/committed/libs/androidx_navigation_navigation_runtime_android/README.chromium
index 8728b2a..d8a76d7 100644
--- a/third_party/androidx/committed/libs/androidx_navigation_navigation_runtime_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_navigation_navigation_runtime_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Navigation Runtime
 Short Name: navigation-runtime-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/navigation/navigation-runtime-android/2.10.0-SNAPSHOT/navigation-runtime-android-2.10.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/navigation/navigation-runtime-android/2.10.0-SNAPSHOT/navigation-runtime-android-2.10.0-20250927.084818-1.aar
 Version: 2.10.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_android/README.chromium b/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_android/README.chromium
index 66e4f241..2b15887 100644
--- a/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Navigation Event
 Short Name: navigationevent-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/navigationevent/navigationevent-android/1.0.0-SNAPSHOT/navigationevent-android-1.0.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/navigationevent/navigationevent-android/1.0.0-SNAPSHOT/navigationevent-android-1.0.0-20250927.084818-1.aar
 Version: 1.0.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_compose_android/README.chromium b/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_compose_android/README.chromium
index f847e02..6617ef4 100644
--- a/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_compose_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_compose_android/README.chromium
@@ -1,6 +1,6 @@
 Name: NavigationEvent Compose
 Short Name: navigationevent-compose-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/navigationevent/navigationevent-compose-android/1.0.0-SNAPSHOT/navigationevent-compose-android-1.0.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/navigationevent/navigationevent-compose-android/1.0.0-SNAPSHOT/navigationevent-compose-android-1.0.0-20250927.084818-1.aar
 Version: 1.0.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_paging_paging_common_android/README.chromium b/third_party/androidx/committed/libs/androidx_paging_paging_common_android/README.chromium
index def1d2f..3374f12 100644
--- a/third_party/androidx/committed/libs/androidx_paging_paging_common_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_paging_paging_common_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Paging-Common
 Short Name: paging-common-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/paging/paging-common-android/3.4.0-SNAPSHOT/paging-common-android-3.4.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/paging/paging-common-android/3.4.0-SNAPSHOT/paging-common-android-3.4.0-20250927.084818-1.aar
 Version: 3.4.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_paging_paging_common_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_paging_paging_common_ktx/README.chromium
index bba6ccc..f2aef89 100644
--- a/third_party/androidx/committed/libs/androidx_paging_paging_common_ktx/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_paging_paging_common_ktx/README.chromium
@@ -1,6 +1,6 @@
 Name: Paging-Common Kotlin Extensions
 Short Name: paging-common-ktx
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/paging/paging-common-ktx/3.4.0-SNAPSHOT/paging-common-ktx-3.4.0-20250926.202706-1.jar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/paging/paging-common-ktx/3.4.0-SNAPSHOT/paging-common-ktx-3.4.0-20250927.084818-1.jar
 Version: 3.4.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_paging_paging_compose_android/README.chromium b/third_party/androidx/committed/libs/androidx_paging_paging_compose_android/README.chromium
index 298e580..52ce1144 100644
--- a/third_party/androidx/committed/libs/androidx_paging_paging_compose_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_paging_paging_compose_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Paging-Compose
 Short Name: paging-compose-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/paging/paging-compose-android/3.4.0-SNAPSHOT/paging-compose-android-3.4.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/paging/paging-compose-android/3.4.0-SNAPSHOT/paging-compose-android-3.4.0-20250927.084818-1.aar
 Version: 3.4.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_paging_paging_runtime/README.chromium b/third_party/androidx/committed/libs/androidx_paging_paging_runtime/README.chromium
index 845e9757..a065e29 100644
--- a/third_party/androidx/committed/libs/androidx_paging_paging_runtime/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_paging_paging_runtime/README.chromium
@@ -1,6 +1,6 @@
 Name: Paging-Runtime
 Short Name: paging-runtime
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/paging/paging-runtime/3.4.0-SNAPSHOT/paging-runtime-3.4.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/paging/paging-runtime/3.4.0-SNAPSHOT/paging-runtime-3.4.0-20250927.084818-1.aar
 Version: 3.4.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_palette_palette/README.chromium b/third_party/androidx/committed/libs/androidx_palette_palette/README.chromium
index 8971521..515cff9 100644
--- a/third_party/androidx/committed/libs/androidx_palette_palette/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_palette_palette/README.chromium
@@ -1,6 +1,6 @@
 Name: Palette
 Short Name: palette
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/palette/palette/1.1.0-SNAPSHOT/palette-1.1.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/palette/palette/1.1.0-SNAPSHOT/palette-1.1.0-20250927.084818-1.aar
 Version: 1.1.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_preference_preference/README.chromium b/third_party/androidx/committed/libs/androidx_preference_preference/README.chromium
index 6fed9a2b..0846342 100644
--- a/third_party/androidx/committed/libs/androidx_preference_preference/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_preference_preference/README.chromium
@@ -1,6 +1,6 @@
 Name: Preference
 Short Name: preference
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/preference/preference/1.3.0-SNAPSHOT/preference-1.3.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/preference/preference/1.3.0-SNAPSHOT/preference-1.3.0-20250927.084818-1.aar
 Version: 1.3.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_profileinstaller_profileinstaller/README.chromium b/third_party/androidx/committed/libs/androidx_profileinstaller_profileinstaller/README.chromium
index b28ee268..52bcc96 100644
--- a/third_party/androidx/committed/libs/androidx_profileinstaller_profileinstaller/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_profileinstaller_profileinstaller/README.chromium
@@ -1,6 +1,6 @@
 Name: Profile Installer
 Short Name: profileinstaller
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/profileinstaller/profileinstaller/1.5.0-SNAPSHOT/profileinstaller-1.5.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/profileinstaller/profileinstaller/1.5.0-SNAPSHOT/profileinstaller-1.5.0-20250927.084818-1.aar
 Version: 1.5.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_recyclerview_recyclerview/README.chromium b/third_party/androidx/committed/libs/androidx_recyclerview_recyclerview/README.chromium
index e07ede34..d16ec34 100644
--- a/third_party/androidx/committed/libs/androidx_recyclerview_recyclerview/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_recyclerview_recyclerview/README.chromium
@@ -1,6 +1,6 @@
 Name: RecyclerView
 Short Name: recyclerview
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/recyclerview/recyclerview/1.5.0-SNAPSHOT/recyclerview-1.5.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/recyclerview/recyclerview/1.5.0-SNAPSHOT/recyclerview-1.5.0-20250927.084818-1.aar
 Version: 1.5.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_resourceinspection_resourceinspection_annotation/README.chromium b/third_party/androidx/committed/libs/androidx_resourceinspection_resourceinspection_annotation/README.chromium
index 7c7fdbd0..7ed5498 100644
--- a/third_party/androidx/committed/libs/androidx_resourceinspection_resourceinspection_annotation/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_resourceinspection_resourceinspection_annotation/README.chromium
@@ -1,6 +1,6 @@
 Name: Resource Inspection - Annotations
 Short Name: resourceinspection-annotation
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/resourceinspection/resourceinspection-annotation/1.1.0-SNAPSHOT/resourceinspection-annotation-1.1.0-20250926.202706-1.jar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/resourceinspection/resourceinspection-annotation/1.1.0-SNAPSHOT/resourceinspection-annotation-1.1.0-20250927.084818-1.jar
 Version: 1.1.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_savedstate_savedstate_android/README.chromium b/third_party/androidx/committed/libs/androidx_savedstate_savedstate_android/README.chromium
index 048b3677..406ca8c 100644
--- a/third_party/androidx/committed/libs/androidx_savedstate_savedstate_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_savedstate_savedstate_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Saved State
 Short Name: savedstate-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/savedstate/savedstate-android/1.4.0-SNAPSHOT/savedstate-android-1.4.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/savedstate/savedstate-android/1.4.0-SNAPSHOT/savedstate-android-1.4.0-20250927.084818-1.aar
 Version: 1.4.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_savedstate_savedstate_compose_android/README.chromium b/third_party/androidx/committed/libs/androidx_savedstate_savedstate_compose_android/README.chromium
index f26215b..db0d1e65a 100644
--- a/third_party/androidx/committed/libs/androidx_savedstate_savedstate_compose_android/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_savedstate_savedstate_compose_android/README.chromium
@@ -1,6 +1,6 @@
 Name: Saved State Compose
 Short Name: savedstate-compose-android
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/savedstate/savedstate-compose-android/1.4.0-SNAPSHOT/savedstate-compose-android-1.4.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/savedstate/savedstate-compose-android/1.4.0-SNAPSHOT/savedstate-compose-android-1.4.0-20250927.084818-1.aar
 Version: 1.4.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_savedstate_savedstate_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_savedstate_savedstate_ktx/README.chromium
index 774578e..72dc4c2 100644
--- a/third_party/androidx/committed/libs/androidx_savedstate_savedstate_ktx/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_savedstate_savedstate_ktx/README.chromium
@@ -1,6 +1,6 @@
 Name: SavedState Kotlin Extensions
 Short Name: savedstate-ktx
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/savedstate/savedstate-ktx/1.4.0-SNAPSHOT/savedstate-ktx-1.4.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/savedstate/savedstate-ktx/1.4.0-SNAPSHOT/savedstate-ktx-1.4.0-20250927.084818-1.aar
 Version: 1.4.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_slidingpanelayout_slidingpanelayout/README.chromium b/third_party/androidx/committed/libs/androidx_slidingpanelayout_slidingpanelayout/README.chromium
index ad0305ab..85c4e385 100644
--- a/third_party/androidx/committed/libs/androidx_slidingpanelayout_slidingpanelayout/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_slidingpanelayout_slidingpanelayout/README.chromium
@@ -1,6 +1,6 @@
 Name: Sliding Pane Layout
 Short Name: slidingpanelayout
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/slidingpanelayout/slidingpanelayout/1.3.0-SNAPSHOT/slidingpanelayout-1.3.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/slidingpanelayout/slidingpanelayout/1.3.0-SNAPSHOT/slidingpanelayout-1.3.0-20250927.084818-1.aar
 Version: 1.3.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_swiperefreshlayout_swiperefreshlayout/README.chromium b/third_party/androidx/committed/libs/androidx_swiperefreshlayout_swiperefreshlayout/README.chromium
index 25ffbcb..9365afe 100644
--- a/third_party/androidx/committed/libs/androidx_swiperefreshlayout_swiperefreshlayout/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_swiperefreshlayout_swiperefreshlayout/README.chromium
@@ -1,6 +1,6 @@
 Name: Swipe Refresh Layout
 Short Name: swiperefreshlayout
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/swiperefreshlayout/swiperefreshlayout/1.2.0-SNAPSHOT/swiperefreshlayout-1.2.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/swiperefreshlayout/swiperefreshlayout/1.2.0-SNAPSHOT/swiperefreshlayout-1.2.0-20250927.084818-1.aar
 Version: 1.2.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_test_uiautomator_uiautomator/README.chromium b/third_party/androidx/committed/libs/androidx_test_uiautomator_uiautomator/README.chromium
index 7e3048ad..722bab1 100644
--- a/third_party/androidx/committed/libs/androidx_test_uiautomator_uiautomator/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_test_uiautomator_uiautomator/README.chromium
@@ -1,6 +1,6 @@
 Name: UIAutomator
 Short Name: uiautomator
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/test/uiautomator/uiautomator/2.4.0-SNAPSHOT/uiautomator-2.4.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/test/uiautomator/uiautomator/2.4.0-SNAPSHOT/uiautomator-2.4.0-20250927.084818-1.aar
 Version: 2.4.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_transition_transition/README.chromium b/third_party/androidx/committed/libs/androidx_transition_transition/README.chromium
index 99f561d..3e42528 100644
--- a/third_party/androidx/committed/libs/androidx_transition_transition/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_transition_transition/README.chromium
@@ -1,6 +1,6 @@
 Name: Transition
 Short Name: transition
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/transition/transition/1.7.0-SNAPSHOT/transition-1.7.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/transition/transition/1.7.0-SNAPSHOT/transition-1.7.0-20250927.084818-1.aar
 Version: 1.7.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_viewpager2_viewpager2/README.chromium b/third_party/androidx/committed/libs/androidx_viewpager2_viewpager2/README.chromium
index e6f9213..e9dd5ef3 100644
--- a/third_party/androidx/committed/libs/androidx_viewpager2_viewpager2/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_viewpager2_viewpager2/README.chromium
@@ -1,6 +1,6 @@
 Name: ViewPager2
 Short Name: viewpager2
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/viewpager2/viewpager2/1.2.0-SNAPSHOT/viewpager2-1.2.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/viewpager2/viewpager2/1.2.0-SNAPSHOT/viewpager2-1.2.0-20250927.084818-1.aar
 Version: 1.2.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_webkit_webkit/README.chromium b/third_party/androidx/committed/libs/androidx_webkit_webkit/README.chromium
index 594388c..ecad736 100644
--- a/third_party/androidx/committed/libs/androidx_webkit_webkit/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_webkit_webkit/README.chromium
@@ -1,6 +1,6 @@
 Name: WebKit
 Short Name: webkit
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/webkit/webkit/1.15.0-SNAPSHOT/webkit-1.15.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/webkit/webkit/1.15.0-SNAPSHOT/webkit-1.15.0-20250927.084818-1.aar
 Version: 1.15.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_window_sidecar_sidecar/README.chromium b/third_party/androidx/committed/libs/androidx_window_sidecar_sidecar/README.chromium
index 0ccd155..2b12207 100644
--- a/third_party/androidx/committed/libs/androidx_window_sidecar_sidecar/README.chromium
+++ b/third_party/androidx/committed/libs/androidx_window_sidecar_sidecar/README.chromium
@@ -1,6 +1,6 @@
 Name: WindowManager Sidecar
 Short Name: sidecar
-URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/window/sidecar/sidecar/1.0.0-SNAPSHOT/sidecar-1.0.0-20250926.202706-1.aar
+URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/window/sidecar/sidecar/1.0.0-SNAPSHOT/sidecar-1.0.0-20250927.084818-1.aar
 Version: 1.0.0-SNAPSHOT
 Update Mechanism: Autoroll
 License: Apache-2.0
diff --git a/third_party/blink/renderer/core/css/css_selector.cc b/third_party/blink/renderer/core/css/css_selector.cc
index 6646d17..8cad051 100644
--- a/third_party/blink/renderer/core/css/css_selector.cc
+++ b/third_party/blink/renderer/core/css/css_selector.cc
@@ -1945,14 +1945,6 @@
   return false;
 }
 
-bool CSSSelector::FollowsSlotted() const {
-  const CSSSelector* previous = NextSimpleSelector();
-  if (!previous) {
-    return false;
-  }
-  return previous->GetPseudoType() == kPseudoSlotted;
-}
-
 bool CSSSelector::CrossesTreeScopes() const {
   for (const CSSSelector* s = this; s; s = s->NextSimpleSelector()) {
     switch (s->Relation()) {
diff --git a/third_party/blink/renderer/core/css/css_selector.h b/third_party/blink/renderer/core/css/css_selector.h
index 6c75e83..27f8975 100644
--- a/third_party/blink/renderer/core/css/css_selector.h
+++ b/third_party/blink/renderer/core/css/css_selector.h
@@ -642,9 +642,6 @@
   static bool IsElementBackedPseudoElement(CSSSelector::PseudoType pseudo);
   bool IsAllowedAfterPart() const;
 
-  // Returns true if the immediately preceding simple selector is ::slotted.
-  bool FollowsSlotted() const;
-
   // Returns true if any preceding selectors have combinators that cross tree
   // scopes.
   bool CrossesTreeScopes() const;
diff --git a/third_party/blink/renderer/core/css/rule_set.cc b/third_party/blink/renderer/core/css/rule_set.cc
index ee5b893..715c7ca 100644
--- a/third_party/blink/renderer/core/css/rule_set.cc
+++ b/third_party/blink/renderer/core/css/rule_set.cc
@@ -326,8 +326,9 @@
   AtomicString custom_pseudo_element_name;
   AtomicString tag_name;
   AtomicString part_name;
-  AtomicString picker_name;
+  AtomicString ua_shadow_pseudo;
   CSSSelector::PseudoType pseudo_type = CSSSelector::kPseudoUnknown;
+  bool has_slotted = false;
 };
 
 }  // namespace
@@ -375,6 +376,9 @@
         case CSSSelector::kPseudoActiveViewTransition:
           // Pseudo classes.
           values.pseudo_type = selector->GetPseudoType();
+          if (values.pseudo_type == CSSSelector::kPseudoSlotted) {
+            values.has_slotted = true;
+          }
           break;
         case CSSSelector::kPseudoPlaceholder:
         case CSSSelector::kPseudoDetailsContent:
@@ -389,6 +393,9 @@
           // (in particular, :host).
           if (values.pseudo_type == CSSSelector::kPseudoUnknown) {
             values.pseudo_type = selector->GetPseudoType();
+            values.ua_shadow_pseudo =
+                shadow_element_utils::StringForUAShadowPseudoId(
+                    CSSSelector::GetPseudoId(values.pseudo_type));
           }
           break;
         case CSSSelector::kPseudoWebKitCustomElement:
@@ -399,7 +406,9 @@
           values.part_name = selector->Value();
           break;
         case CSSSelector::kPseudoPicker:
-          values.picker_name = selector->Argument();
+          if (selector->Argument() == "select") {
+            values.ua_shadow_pseudo = shadow_element_names::kPickerSelect;
+          }
           break;
         case CSSSelector::kPseudoIs:
         case CSSSelector::kPseudoWhere:
@@ -472,23 +481,49 @@
 
 // For a (possibly compound) selector, extract the values used for determining
 // its buckets (e.g. for “.foo[baz]”, will return foo for class_name and
-// baz for attr_name). Returns the last subselector in the group, which is also
-// the one given the highest priority.
-static const CSSSelector* ExtractBestBucketingValues(
-    const CSSSelector& component,
-    const StyleScope* style_scope,
-    BucketingValues& values) {
-  const CSSSelector* it = &component;
-  for (; it && it->Relation() == CSSSelector::kSubSelector;
-       it = it->NextSimpleSelector()) {
+// baz for attr_name).
+static void ExtractBestBucketingValues(const CSSSelector& component,
+                                       const StyleScope* style_scope,
+                                       BucketingValues& values) {
+  for (const CSSSelector* it = &component; it; it = it->NextSimpleSelector()) {
     if (!ExtractBucketingValues(it, style_scope, values)) {
-      return it;
+      return;
+    }
+    switch (it->Relation()) {
+      case CSSSelector::kSubSelector:
+        continue;
+      case CSSSelector::kUAShadow: {
+        // Any selector containing ::slotted() currently *must* go in
+        // the slotted bucket. Since we allow UA-shadow pseudo-element
+        // selectors after ::slotted(), and because such selectors exist
+        // in a different compound from ::slotted() (effectively [1]),
+        // we have to check if the originating compound contains ::slotted()
+        // as well.
+        //
+        // Note that the same is not true for ::part(); selectors on
+        // on the form ::part(p)::ua-shadow must bucket according
+        // to ::ua-shadow.
+        //
+        // This discrepancy comes from the fact that StyleResolver::
+        // MatchOuterScopeRules (which handles parts and UA shadow
+        // pseudos) does look in the UA shadow bucket across trees,
+        // but MatchSlottedRules *only* looks in the slotted bucket.
+        // TODO(crbug.com/40068507): This discrepancy is weird.
+        //
+        // [1] CSSSelectorParser::SplitCompoundAtImplicitCombinator
+        const CSSSelector* originating = it->NextSimpleSelector();
+        CHECK(originating);
+        BucketingValues originating_values;
+        ExtractBestBucketingValues(*originating, style_scope,
+                                   originating_values);
+        values.has_slotted |= originating_values.has_slotted;
+        return;
+      };
+      default:
+        // We reached the end of the compound selector.
+        return;
     }
   }
-  if (it) {
-    ExtractBucketingValues(it, style_scope, values);
-  }
-  return it;
 }
 
 template <class Func>
@@ -538,55 +573,79 @@
   all_rules_.push_back(rule_data);
 #endif  // DCHECK_IS_ON()
 
-  const CSSSelector* it =
-      ExtractBestBucketingValues(component, style_scope, values);
+  ExtractBestBucketingValues(component, style_scope, values);
 
-  // Prefer rule sets in order of most likely to apply infrequently.
+  // ::slotted() selectors *must* go in the slotted-bucket; we only look
+  // for rules in that bucket across shadows.
+  if (values.has_slotted) {
+    AddToBucket(slotted_pseudo_element_rules_, rule_data);
+    return;
+  }
 
-  // NOTE: For ::part:focus and similar, we need to go into the ::part bucket
-  // (see below). This isn't a problem for #id::part and similar, since there is
-  // a hidden combinator that stops ExtractBestBucketingValues() before it finds
-  // the #id.
-  if (values.part_name.empty()) {
-    if (values.pseudo_type == CSSSelector::kPseudoFocus) {
-      if (bucket_coverage == BucketCoverage::kCompute) {
-        MarkAsCoveredByBucketing(component, [](const CSSSelector& selector) {
-          return selector.Match() == CSSSelector::kPseudoClass &&
-                 selector.GetPseudoType() == CSSSelector::kPseudoFocus;
-        });
-      }
-      AddToBucket(focus_pseudo_class_rules_, rule_data);
-      return;
+  // Similarly, UA-shadow pseudo-element selectors and ::part() selectors
+  // must go in their respective buckets, even when there's another selector
+  // that is normally considered more specific for bucketing, e.g.
+  // ::part(a):hover.
+
+  if (!values.ua_shadow_pseudo.empty()) {
+    // Note that `ua_shadow_pseudo` and `part_name` may never be set
+    // at the same time due to the implicit combinators [1] inserted before
+    // such selectors. This means that it doesn't matter if we try to bucket
+    // for `ua_shadow_pseudo` first or for `part_name` first.
+    // [1] CSSSelectorParser:: SplitCompoundAtImplicitCombinator.
+    CHECK(values.part_name.empty());
+    AddToBucket(values.ua_shadow_pseudo, ua_shadow_pseudo_element_rules_,
+                rule_data);
+    return;
+  }
+
+  if (!values.part_name.empty()) {
+    CHECK(values.ua_shadow_pseudo.empty()); // See ua_shadow_pseudo branch above.
+    // TODO: Mark as covered by bucketing?
+    AddToBucket(part_pseudo_rules_, rule_data);
+    return;
+  }
+
+  // Prefer buckets in order of most likely to apply infrequently.
+
+  if (values.pseudo_type == CSSSelector::kPseudoFocus) {
+    if (bucket_coverage == BucketCoverage::kCompute) {
+      MarkAsCoveredByBucketing(component, [](const CSSSelector& selector) {
+        return selector.Match() == CSSSelector::kPseudoClass &&
+               selector.GetPseudoType() == CSSSelector::kPseudoFocus;
+      });
     }
-    if (values.pseudo_type == CSSSelector::kPseudoFocusVisible) {
-      if (bucket_coverage == BucketCoverage::kCompute) {
-        MarkAsCoveredByBucketing(component, [](const CSSSelector& selector) {
-          return selector.Match() == CSSSelector::kPseudoClass &&
-                 selector.GetPseudoType() == CSSSelector::kPseudoFocusVisible;
-        });
-      }
-      AddToBucket(focus_visible_pseudo_class_rules_, rule_data);
-      return;
+    AddToBucket(focus_pseudo_class_rules_, rule_data);
+    return;
+  }
+  if (values.pseudo_type == CSSSelector::kPseudoFocusVisible) {
+    if (bucket_coverage == BucketCoverage::kCompute) {
+      MarkAsCoveredByBucketing(component, [](const CSSSelector& selector) {
+        return selector.Match() == CSSSelector::kPseudoClass &&
+               selector.GetPseudoType() == CSSSelector::kPseudoFocusVisible;
+      });
     }
-    if (values.pseudo_type == CSSSelector::kPseudoScrollbarButton ||
-        values.pseudo_type == CSSSelector::kPseudoScrollbarCorner ||
-        values.pseudo_type == CSSSelector::kPseudoScrollbarThumb ||
-        values.pseudo_type == CSSSelector::kPseudoScrollbarTrack ||
-        values.pseudo_type == CSSSelector::kPseudoScrollbarTrackPiece) {
-      AddToBucket(scrollbar_rules_, rule_data);
-      return;
+    AddToBucket(focus_visible_pseudo_class_rules_, rule_data);
+    return;
+  }
+  if (values.pseudo_type == CSSSelector::kPseudoScrollbarButton ||
+      values.pseudo_type == CSSSelector::kPseudoScrollbarCorner ||
+      values.pseudo_type == CSSSelector::kPseudoScrollbarThumb ||
+      values.pseudo_type == CSSSelector::kPseudoScrollbarTrack ||
+      values.pseudo_type == CSSSelector::kPseudoScrollbarTrackPiece) {
+    AddToBucket(scrollbar_rules_, rule_data);
+    return;
+  }
+  if (values.pseudo_type == CSSSelector::kPseudoActiveViewTransition) {
+    if (bucket_coverage == BucketCoverage::kCompute) {
+      MarkAsCoveredByBucketing(component, [](const CSSSelector& selector) {
+        return selector.Match() == CSSSelector::kPseudoClass &&
+               selector.GetPseudoType() ==
+                   CSSSelector::kPseudoActiveViewTransition;
+      });
     }
-    if (values.pseudo_type == CSSSelector::kPseudoActiveViewTransition) {
-      if (bucket_coverage == BucketCoverage::kCompute) {
-        MarkAsCoveredByBucketing(component, [](const CSSSelector& selector) {
-          return selector.Match() == CSSSelector::kPseudoClass &&
-                 selector.GetPseudoType() ==
-                     CSSSelector::kPseudoActiveViewTransition;
-        });
-      }
-      AddToBucket(active_view_transition_rules_, rule_data);
-      return;
-    }
+    AddToBucket(active_view_transition_rules_, rule_data);
+    return;
   }
 
   if (!values.id.empty()) {
@@ -645,41 +704,6 @@
     return;
   }
 
-  auto get_ua_shadow_pseudo = [&]() -> const AtomicString& {
-    if (values.picker_name == "select") {
-      return shadow_element_names::kPickerSelect;
-    } else if (values.pseudo_type != CSSSelector::kPseudoUnknown) {
-      return shadow_element_utils::StringForUAShadowPseudoId(
-          CSSSelector::GetPseudoId(values.pseudo_type));
-    }
-    return g_null_atom;
-  };
-
-  AtomicString ua_shadow_pseudo = get_ua_shadow_pseudo();
-
-  // Any selector with or following ::part() or a UA shadow pseudo-element
-  // must go in the bucket for the *innermost* such pseudo-element.
-
-  // TODO(dbaron): Should this eventually check kShadowSlot as well?
-  if (values.part_name.empty() && ua_shadow_pseudo == g_null_atom && it &&
-      (it->Relation() == CSSSelector::RelationType::kUAShadow ||
-       it->Relation() == CSSSelector::RelationType::kShadowPart)) {
-    const CSSSelector* previous = it->NextSimpleSelector();
-    if (previous->Match() == CSSSelector::kPseudoElement) {
-      ExtractBucketingValues(previous, style_scope, values);
-      ua_shadow_pseudo = get_ua_shadow_pseudo();
-    }
-  }
-
-  // Any selector with or following ::part() must go in the part bucket,
-  // because we look in that bucket in higher scopes to find rules that need
-  // to match inside the shadow tree.
-  if (!values.part_name.empty()) {
-    // TODO: Mark as covered by bucketing?
-    AddToBucket(part_pseudo_rules_, rule_data);
-    return;
-  }
-
   if (!values.custom_pseudo_element_name.empty()) {
     // Custom pseudos come before ids and classes in the order of
     // NextSimpleSelector(), and have a relation of ShadowPseudo between them.
@@ -693,19 +717,6 @@
     return;
   }
 
-  if (ua_shadow_pseudo != g_null_atom) {
-    // TODO(dbaron): This needs further work to support multiple
-    // pseudo-elements after ::slotted().  This likely requires reorganization
-    // of how MatchSlottedRules interacts with MatchOuterScopeRules.
-    CHECK(it);
-    if (it->FollowsSlotted()) {
-      AddToBucket(slotted_pseudo_element_rules_, rule_data);
-    } else {
-      AddToBucket(ua_shadow_pseudo, ua_shadow_pseudo_element_rules_, rule_data);
-    }
-    return;
-  }
-
   switch (values.pseudo_type) {
     case CSSSelector::kPseudoCue:
       AddToBucket(cue_pseudo_rules_, rule_data);
@@ -740,7 +751,8 @@
       AddToBucket(shadow_host_rules_, rule_data);
       return;
     case CSSSelector::kPseudoSlotted:
-      AddToBucket(slotted_pseudo_element_rules_, rule_data);
+      // Handled above.
+      NOTREACHED();
       return;
     case CSSSelector::kPseudoRoot:
       if (bucket_coverage == BucketCoverage::kCompute) {
diff --git a/third_party/blink/renderer/core/css/rule_set_test.cc b/third_party/blink/renderer/core/css/rule_set_test.cc
index f51863b4..4079f472 100644
--- a/third_party/blink/renderer/core/css/rule_set_test.cc
+++ b/third_party/blink/renderer/core/css/rule_set_test.cc
@@ -331,6 +331,56 @@
   ASSERT_EQ(0u, part_rules.size());
 }
 
+TEST(RuleSetTest, FindBestBucketAndAdd_PartBefore) {
+  test::TaskEnvironment task_environment;
+  css_test_helpers::TestStyleSheet sheet;
+
+  sheet.AddCSSRules("::part(p)::before { }");
+  RuleSet& rule_set = sheet.GetRuleSet();
+  const base::span<const RuleData> part_rules = rule_set.PartPseudoRules();
+  ASSERT_EQ(1u, part_rules.size());
+}
+
+TEST(RuleSetTest, FindBestBucketAndAdd_PartFocus) {
+  test::TaskEnvironment task_environment;
+  css_test_helpers::TestStyleSheet sheet;
+
+  sheet.AddCSSRules("::part(p):focus { }");
+  RuleSet& rule_set = sheet.GetRuleSet();
+  const base::span<const RuleData> part_rules = rule_set.PartPseudoRules();
+  ASSERT_EQ(1u, part_rules.size());
+}
+
+TEST(RuleSetTest, FindBestBucketAndAdd_Slotted) {
+  test::TaskEnvironment task_environment;
+  css_test_helpers::TestStyleSheet sheet;
+
+  sheet.AddCSSRules("::slotted(.a) { }");
+  RuleSet& rule_set = sheet.GetRuleSet();
+  const base::span<const RuleData> rules = rule_set.SlottedPseudoElementRules();
+  ASSERT_EQ(1u, rules.size());
+}
+
+TEST(RuleSetTest, FindBestBucketAndAdd_SlottedBefore) {
+  test::TaskEnvironment task_environment;
+  css_test_helpers::TestStyleSheet sheet;
+
+  sheet.AddCSSRules("::slotted(.a)::before { }");
+  RuleSet& rule_set = sheet.GetRuleSet();
+  const base::span<const RuleData> rules = rule_set.SlottedPseudoElementRules();
+  ASSERT_EQ(1u, rules.size());
+}
+
+TEST(RuleSetTest, FindBestBucketAndAdd_SlottedUAShadow) {
+  test::TaskEnvironment task_environment;
+  css_test_helpers::TestStyleSheet sheet;
+
+  sheet.AddCSSRules("::slotted(.a)::file-selector-button { }");
+  RuleSet& rule_set = sheet.GetRuleSet();
+  const base::span<const RuleData> rules = rule_set.SlottedPseudoElementRules();
+  ASSERT_EQ(1u, rules.size());
+}
+
 TEST(RuleSetTest, FindBestBucketAndAdd_IsSingleArg) {
   test::TaskEnvironment task_environment;
   css_test_helpers::TestStyleSheet sheet;
diff --git a/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry.cc b/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry.cc
index ea98871..6a62f3eb2 100644
--- a/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry.cc
+++ b/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry.cc
@@ -27,6 +27,8 @@
 #include "third_party/blink/renderer/platform/heap/trace_traits.h"
 #include "third_party/blink/renderer/platform/wtf/functional.h"
 #include "third_party/blink/renderer/platform/wtf/key_value_pair.h"
+#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h"
+#include "third_party/blink/renderer/core/html_names.h"
 
 namespace blink {
 
@@ -506,7 +508,8 @@
 
   MutationObserverInit* init = MutationObserverInit::Create();
   init->setAttributes(true);
-  init->setAttributeFilter(Vector<String>{"name", "content"});
+  init->setAttributeFilter(
+      {html_names::kNameAttr.LocalName(), html_names::kContentAttr.LocalName()});
   DummyExceptionStateForTesting exception_state;
   attribute_observer->observe(meta, init, exception_state);
   DCHECK(!exception_state.HadException());
@@ -527,7 +530,7 @@
 
   MutationObserverInit* init = MutationObserverInit::Create();
   init->setAttributes(true);
-  init->setAttributeFilter(Vector<String>{"type"});
+  init->setAttributeFilter({html_names::kTypeAttr.LocalName()});
   init->setChildList(true);  // For text content changes.
   DummyExceptionStateForTesting exception_state;
   attribute_observer->observe(script, init, exception_state);
@@ -595,8 +598,12 @@
     for (HTMLMetaElement& meta :
          Traversal<HTMLMetaElement>::ChildrenOf(*head)) {
       const String& name = meta.GetName();
+      String content = meta.Content();
+      if (content.IsNull()) {
+        content = String("");
+      }
       if (!name.IsNull() && all_metatag_name_counts_.Contains(name)) {
-        name_to_content_map.Set(name, meta.Content());
+        name_to_content_map.Set(name, content);
       }
     }
   }
diff --git a/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry_unittest.cc b/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry_unittest.cc
index f251dd0..b2a0eef 100644
--- a/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry_unittest.cc
+++ b/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry_unittest.cc
@@ -101,6 +101,12 @@
     EXPECT_EQ(meta_tags[0]->content, "Gary");
   }
 
+  void VerifyAuthorMetaTagNoContent(const Vector<mojom::blink::MetaTagPtr>& meta_tags) {
+    ASSERT_EQ(meta_tags.size(), 1u);
+    EXPECT_EQ(meta_tags[0]->name, "author");
+    EXPECT_EQ(meta_tags[0]->content, "");
+  }
+
  protected:
   test::TaskEnvironment task_environment_;
   frame_test_helpers::WebViewHelper helper_;
@@ -444,6 +450,28 @@
   VerifyAuthorMetaTag(observer.future().Take());
 }
 
+TEST_F(FrameMetadataObserverRegistryTest, MetaTagsWithNoContent) {
+  LoadHTML(R"HTML(
+    <head>
+      <meta charset="UTF-8">
+      <meta name="author">
+    </head>
+    <body></body>
+  )HTML");
+  BindRegistry();
+
+  MockMetaTagsObserver observer;
+  Vector<String> names_to_observe;
+  names_to_observe.push_back("author");
+
+  registry_->AddMetaTagsObserver(names_to_observe,
+                                 observer.BindNewPipeAndPassRemote());
+  test::RunPendingTasks();
+
+  ASSERT_TRUE(observer.future().IsReady());
+  VerifyAuthorMetaTagNoContent(observer.future().Take());
+}
+
 // Re-enable this test once we support observing head elements that are added
 // dynamically.
 TEST_F(FrameMetadataObserverRegistryTest, MetaTagsAddedWithHead) {
diff --git a/third_party/compiler-rt/src b/third_party/compiler-rt/src
index 0214529..45b0d10 160000
--- a/third_party/compiler-rt/src
+++ b/third_party/compiler-rt/src
@@ -1 +1 @@
-Subproject commit 02145296c3a848274a6146176a74d0e468452e68
+Subproject commit 45b0d106857b21348a01c292cb30a261ef968b7e
diff --git a/third_party/crossbench b/third_party/crossbench
index 0f26144..9355cb1 160000
--- a/third_party/crossbench
+++ b/third_party/crossbench
@@ -1 +1 @@
-Subproject commit 0f26144e3635a33fc18bdb726a6439090dc9e990
+Subproject commit 9355cb1425d7c25994b2e945fb39c54350651176
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src
index 77804ac..ad8438e 160000
--- a/third_party/devtools-frontend/src
+++ b/third_party/devtools-frontend/src
@@ -1 +1 @@
-Subproject commit 77804ac0072e8c287727e6d393eafb49374c46e3
+Subproject commit ad8438edb0fff5b4a87669fe237ec2ae7d30c86e
diff --git a/third_party/libc++/src b/third_party/libc++/src
index bcc74d7..0cb7f02 160000
--- a/third_party/libc++/src
+++ b/third_party/libc++/src
@@ -1 +1 @@
-Subproject commit bcc74d7745a74dae059f1a4ca97e2979f5f77661
+Subproject commit 0cb7f02f783ef23ba0a9f73d632a5ae95af042c5
diff --git a/third_party/skia b/third_party/skia
index fed805f..beb6739 160000
--- a/third_party/skia
+++ b/third_party/skia
@@ -1 +1 @@
-Subproject commit fed805fe6ee67e7f5252b9faecc6741c057464d8
+Subproject commit beb6739688027fa5d1e1da5a946defa18217f171
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps
index 14f79df..8571c2c 160000
--- a/third_party/vulkan-deps
+++ b/third_party/vulkan-deps
@@ -1 +1 @@
-Subproject commit 14f79df6f67f644d2b26ddc5d690ffa8f2030e6b
+Subproject commit 8571c2cb2137af5bb8754d5e501aae90831fb7e1
diff --git a/third_party/vulkan-validation-layers/src b/third_party/vulkan-validation-layers/src
index 5e817f0..e7ba8af 160000
--- a/third_party/vulkan-validation-layers/src
+++ b/third_party/vulkan-validation-layers/src
@@ -1 +1 @@
-Subproject commit 5e817f0563ce8c6d9c023f85133ad0628d0dfc05
+Subproject commit e7ba8af40a7e9b8e5d24eb8c5459d0bdd8101498
diff --git a/third_party/webrtc b/third_party/webrtc
index c412d47..8d5c61b 160000
--- a/third_party/webrtc
+++ b/third_party/webrtc
@@ -1 +1 @@
-Subproject commit c412d4776ca54546b9dd41be15eeaf9147a2f753
+Subproject commit 8d5c61bb7ab3464a8dc3354bc54c78100eb92335
diff --git a/tools/metrics/common/enums.py b/tools/metrics/common/enums.py
index ec15a85c..a0926cd 100644
--- a/tools/metrics/common/enums.py
+++ b/tools/metrics/common/enums.py
@@ -17,6 +17,7 @@
 
 _METRIC_FILES_WITH_ENUMS = [
     path_util.GetInputFile('tools/metrics/ukm/ukm.xml'),
+    path_util.GetInputFile('tools/metrics/private_metrics/dkm.xml'),
     path_util.GetInputFile('tools/metrics/private_metrics/dwa.xml'),
 ]
 
@@ -59,7 +60,7 @@
 
   metric_enum_names = (
       _get_enums_referenced_by_metric_nodes(_METRIC_FILES_WITH_ENUMS))
-  logging.info(f'Found {len(metric_enum_names)} enums from ukm and dwa.')
+  logging.info(f'Found {len(metric_enum_names)} enums from ukm, dkm, and dwa.')
 
   enum_names.update(metric_enum_names)
   logging.info(f'Found {len(enum_names)} enums total.')
diff --git a/tools/metrics/common/presubmit_util.py b/tools/metrics/common/presubmit_util.py
index 3347b2e..2a8b774 100644
--- a/tools/metrics/common/presubmit_util.py
+++ b/tools/metrics/common/presubmit_util.py
@@ -137,7 +137,7 @@
 
   cwd = input_api.PresubmitLocalPath()
   pretty_print_args = [
-      input_api.python3_executable, 'pretty_print.py', '--presubmit'
+      input_api.python3_executable, 'pretty_print.py', '--presubmit', xml_file
   ]
 
   exit_code = input_api.subprocess.call(pretty_print_args, cwd=cwd)
@@ -148,7 +148,8 @@
     ]
 
   validate_format_args = [
-      input_api.python3_executable, 'validate_format.py', '--presubmit'
+      input_api.python3_executable, 'validate_format.py', '--presubmit',
+      xml_file
   ]
   exit_code = input_api.subprocess.call(validate_format_args, cwd=cwd)
   if exit_code != 0:
diff --git a/tools/metrics/histograms/histogram_paths.py b/tools/metrics/histograms/histogram_paths.py
index 0a13d69..7a2e04aaf 100755
--- a/tools/metrics/histograms/histogram_paths.py
+++ b/tools/metrics/histograms/histogram_paths.py
@@ -51,6 +51,7 @@
 ENUMS_XMLS = [path_util.GetInputFile(f) for f in _ENUMS_XML_RELATIVE]
 UKM_XML = path_util.GetInputFile('tools/metrics/ukm/ukm.xml')
 DWA_XML = path_util.GetInputFile('tools/metrics/private_metrics/dwa.xml')
+DKM_XML = path_util.GetInputFile('tools/metrics/private_metrics/dkm.xml')
 HISTOGRAMS_XMLS = [path_util.GetInputFile(f) for f in _HISTOGRAMS_XMLS_RELATIVE]
 ALL_XMLS = [path_util.GetInputFile(f) for f in ALL_XMLS_RELATIVE]
 
diff --git a/tools/metrics/private_metrics/PRESUBMIT.py b/tools/metrics/private_metrics/PRESUBMIT.py
index 513557c..b479588 100644
--- a/tools/metrics/private_metrics/PRESUBMIT.py
+++ b/tools/metrics/private_metrics/PRESUBMIT.py
@@ -1,7 +1,7 @@
 # Copyright 2024 The Chromium Authors
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
-"""Presubmit script for dwa.xml.
+"""Presubmit script for Private Metrics XML configuration.
 
 See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
 for more details on the presubmit API built into gcl.
@@ -14,12 +14,19 @@
     os.path.join(os.path.dirname(os.path.abspath('__file__')), '..', 'common'))
 import presubmit_util
 
-_DWA_XML = 'dwa.xml'
+DWA_XML = 'dwa.xml'
+DKM_XML = 'dkm.xml'
 
 
 def CheckChangeOnUpload(input_api, output_api):
-  return presubmit_util.CheckChange(_DWA_XML, input_api, output_api)
+  result = []
+  result.extend(presubmit_util.CheckChange(DWA_XML, input_api, output_api))
+  result.extend(presubmit_util.CheckChange(DKM_XML, input_api, output_api))
+  return result
 
 
 def CheckChangeOnCommit(input_api, output_api):
-  return presubmit_util.CheckChange(_DWA_XML, input_api, output_api)
+  result = []
+  result.extend(presubmit_util.CheckChange(DWA_XML, input_api, output_api))
+  result.extend(presubmit_util.CheckChange(DKM_XML, input_api, output_api))
+  return result
diff --git a/tools/metrics/private_metrics/dkm.xml b/tools/metrics/private_metrics/dkm.xml
new file mode 100644
index 0000000..e02ffae
--- /dev/null
+++ b/tools/metrics/private_metrics/dkm.xml
@@ -0,0 +1,16 @@
+<!--
+Copyright 2025 The Chromium Authors
+Use of this source code is governed by a BSD-style license that can be
+found in the LICENSE file.
+-->
+
+<!--
+This file is used to generate a comprehensive list of Chrome DKM metrics
+along with a detailed description for each metric.
+
+Events may be marked with the attribute singular="True" to indicate that
+the event will only occur once per source, and multiple entries will just
+be describing additional metrics about the same event.
+-->
+
+<dkm-configuration/>
diff --git a/tools/metrics/private_metrics/dkm_model.py b/tools/metrics/private_metrics/dkm_model.py
new file mode 100644
index 0000000..bf9a5e17
--- /dev/null
+++ b/tools/metrics/private_metrics/dkm_model.py
@@ -0,0 +1,22 @@
+# Copyright 2025 The Chromium Authors
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+"""Model objects for dkm.xml contents."""
+
+import private_metrics_model_shared
+
+DKM_XML_TYPE = private_metrics_model_shared.create_event_based_document_type(
+    'dkm-configuration')
+
+
+def prettify_xml(original_xml):
+  """Parses the original xml and return a pretty printed version.
+
+  Args:
+    original_xml: A string containing the original xml file contents.
+
+  Returns:
+    A pretty-printed xml string, or None if the config contains errors.
+  """
+  config = DKM_XML_TYPE.Parse(original_xml)
+  return DKM_XML_TYPE.PrettyPrint(config)
diff --git a/tools/metrics/private_metrics/pretty_print.py b/tools/metrics/private_metrics/pretty_print.py
index 96f9a5b5..e128e1ff 100755
--- a/tools/metrics/private_metrics/pretty_print.py
+++ b/tools/metrics/private_metrics/pretty_print.py
@@ -7,6 +7,7 @@
 import sys
 import argparse
 
+import dkm_model
 import dwa_model
 
 sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common'))
@@ -14,7 +15,7 @@
 
 
 def main():
-  """Pretty-prints the DWA Chrome metrics in dwa.xml file.
+  """Pretty-prints Private Metrics' XML configuration files.
 
   Args:
     --non-interactive: (Optional) Does not print log info messages and does not
@@ -28,6 +29,7 @@
     pretty_print.py --diff --cleanup
   """
   parser = argparse.ArgumentParser()
+  parser.add_argument('filepath', help="relative path to XML file")
   # The following optional flags are used by common/presubmit_util.py
   parser.add_argument('--non-interactive', action="store_true")
   parser.add_argument('--presubmit', action="store_true")
@@ -36,9 +38,22 @@
                       action="store_true",
                       help="Remove the backup file after a successful run.")
 
-  presubmit_util.DoPresubmitMain(sys.argv, 'dwa.xml', 'dwa.old.xml',
-                                 dwa_model.PrettifyXML)
+  args = parser.parse_args()
 
+  filepath = args.filepath
+
+  status = 0
+  if filepath.endswith('dwa.xml'):
+    status = presubmit_util.DoPresubmit(sys.argv, filepath, 'dwa.old.xml',
+                                        dwa_model.PrettifyXML)
+  elif filepath.endswith('dkm.xml'):
+    status = presubmit_util.DoPresubmit(sys.argv, filepath, 'dkm.old.xml',
+                                        dkm_model.prettify_xml)
+  else:
+    print(f'Unsupported file: {filepath}', file=sys.stderr)
+    return 1
+
+  return status
 
 if __name__ == '__main__':
   sys.exit(main())
diff --git a/tools/metrics/private_metrics/private_metrics_validations.py b/tools/metrics/private_metrics/private_metrics_validations.py
index 28c5ac3..0ffb004 100644
--- a/tools/metrics/private_metrics/private_metrics_validations.py
+++ b/tools/metrics/private_metrics/private_metrics_validations.py
@@ -53,6 +53,18 @@
     return (is_success, errors)
 
 
+class DkmXmlValidation(EventBasedXmlValidation):
+  """Validations for the content of dkm.xml."""
+
+  def __init__(self, dkm_config: xml.dom.minidom.Element) -> None:
+    """Attributes:
+
+    dkm_config: A XML minidom Element representing the root node of the DKM
+        config tree.
+    """
+    super().__init__(dkm_config, "DKM")
+
+
 class DwaXmlValidation(EventBasedXmlValidation):
   """Validations for the content of dwa.xml."""
 
diff --git a/tools/metrics/private_metrics/validate_format.py b/tools/metrics/private_metrics/validate_format.py
index 363c46d64..048eec7 100755
--- a/tools/metrics/private_metrics/validate_format.py
+++ b/tools/metrics/private_metrics/validate_format.py
@@ -4,23 +4,37 @@
 # found in the LICENSE file.
 """Verifies that the DWA XML file is well-formatted."""
 
-import os
 import sys
-import private_metrics_validations
-
-sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common'))
-import path_util
-
+import argparse
 from xml.dom import minidom
 
-_DWA_XML = path_util.GetInputFile('tools/metrics/private_metrics/dwa.xml')
+import private_metrics_validations
 
 
 def main():
-  with open(_DWA_XML, 'r') as config_file:
+  parser = argparse.ArgumentParser()
+  parser.add_argument('filepath', help="relative path to XML file")
+  # The following optional flags are used by common/presubmit_util.py
+  parser.add_argument('--presubmit', action="store_true")
+
+  args = parser.parse_args()
+
+  filepath = args.filepath
+
+  if filepath.endswith('dwa.xml'):
+    root_tag = 'dwa-configuration'
+    validation = private_metrics_validations.DwaXmlValidation
+  elif filepath.endswith('dkm.xml'):
+    root_tag = 'dkm-configuration'
+    validation = private_metrics_validations.DkmXmlValidation
+  else:
+    print(f'Unsupported file: {filepath}', file=sys.stderr)
+    sys.exit(1)
+
+  with open(filepath, 'r') as config_file:
     document = minidom.parse(config_file)
-    [config] = document.getElementsByTagName('dwa-configuration')
-    validator = private_metrics_validations.DwaXmlValidation(config)
+    [config] = document.getElementsByTagName(root_tag)
+    validator = validation(config)
 
     owner_check_success, owner_check_errors = validator.checkEventsHaveOwners()
     metric_check_success, metric_check_errors = (
diff --git a/v8 b/v8
index f5fc76f..ec517fdf 160000
--- a/v8
+++ b/v8
@@ -1 +1 @@
-Subproject commit f5fc76fe8c184b0173d3e88a4a038fdf0cd05734
+Subproject commit ec517fdfbd438e98cc95d6d9fd93816c710e9dc8