diff --git a/DEPS b/DEPS
index dc379e72..82aebdb 100644
--- a/DEPS
+++ b/DEPS
@@ -269,15 +269,15 @@
   # 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': 'd7ddbe668dc4ae7f25eebebea058e759e7024609',
+  'skia_revision': '1fb7b3d7012eced7ee859d5bbe3964f8ca7870be',
   # 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': '026e5f1d313bdfc95fe0fdeadc274e6e52a9d118',
+  'v8_revision': '8dbcd272b9220a710db891d64274ed30d50bebab',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling ANGLE
   # and whatever else without interference from each other.
-  'angle_revision': '9865ed8b8117a083eb138247bbcb029a6bb0f2e4',
+  'angle_revision': 'd734686731fcc325e664866b46648bd3c8271eda',
   # Three lines of non-changing comments so that
   # the commit queue can handle CLs rolling SwiftShader
   # and whatever else without interference from each other.
@@ -348,7 +348,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': '1e107eb37e9911274e874ed10b309e96589520b7',
+  'devtools_frontend_revision': '07dca225ab48fadbaf3e7a0dce46c4c49e2c554b',
   # 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.
@@ -835,7 +835,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/linux-amd64',
-          'version': 'Za_qLVSxYAVMNOI26VNoq-V2rB9Bv_enhrAVEtxiXK4C',
+          'version': 'mkosepe6QK2m_CJD3P4H5WaTVUhaZhNZ6iTSKy8mRrgC',
         },
       ],
       'dep_type': 'cipd',
@@ -846,7 +846,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/mac-amd64',
-          'version': '9TKQAIyS8eao4QCAB1rm8eTgtlHekvLsOt04Kg1b2gYC',
+          'version': '9VezPS0HrzSGrdyij79SlgDuRql2xpotrFs5NmOb8p0C',
         },
       ],
       'dep_type': 'cipd',
@@ -857,7 +857,7 @@
       'packages': [
         {
           'package': 'chromium/rts/model/windows-amd64',
-          'version': 'qvdWcE4PDtYM_zQZ4PkSMq1JwKWOMxvmqOzuaoqK5hkC',
+          'version': 'oecek1eR7SzNitz3l5g0c1UJaLGZWtpO3YqbXOa7_x0C',
         },
       ],
       'dep_type': 'cipd',
@@ -1107,7 +1107,7 @@
   # Tools used when building Chrome for Chrome OS. This affects both the Simple
   # Chrome workflow, as well as the chromeos-chrome ebuild.
   'src/third_party/chromite': {
-      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + '00d5e6c82f01be266133b84961cdced4bad0936e',
+      'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'd6897cdddda7966d2e00af247625726b652e08e4',
       'condition': 'checkout_chromeos',
   },
 
@@ -1527,7 +1527,7 @@
   },
 
   'src/third_party/perfetto':
-    Var('android_git') + '/platform/external/perfetto.git' + '@' + '56b37e59834912b55539a47bc13528a74d8b782c',
+    Var('android_git') + '/platform/external/perfetto.git' + '@' + '2308bab3aebd39f00010c846cdcab351046158cc',
 
   'src/third_party/perl': {
       'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3',
@@ -1608,7 +1608,7 @@
       'packages': [
           {
               'package': 'fuchsia/third_party/android/aemu/release/linux-amd64',
-              'version': 'izknbKn4wkfyyxlvvIJZHuBS5l8pBABjTU_XS1ExspoC'
+              'version': '86fN7dZ7etlUxmr58DACf2a421kg2dGxbL5H5DgXFNcC'
           },
       ],
       'condition': 'host_os == "linux" and checkout_fuchsia',
@@ -1757,7 +1757,7 @@
     Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'a912567d309f6bde49e7e0c3b0671a2e138ab96c',
 
   'src/third_party/webrtc':
-    Var('webrtc_git') + '/src.git' + '@' + '3c2359c663a6935e47e08977204c346baf44f8df',
+    Var('webrtc_git') + '/src.git' + '@' + '8615bf0582c736fd8e5168ace669ae1f88299483',
 
   'src/third_party/libgifcodec':
      Var('skia_git') + '/libgifcodec' + '@'+  Var('libgifcodec_revision'),
@@ -1830,7 +1830,7 @@
     Var('chromium_git') + '/v8/v8.git' + '@' +  Var('v8_revision'),
 
   'src-internal': {
-    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@005868c795f2170b40397d487cf6c984bcb7aed0',
+    'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@5ba5fcb1e6366ac64856691f29b20c8dd4c9bf58',
     'condition': 'checkout_src_internal',
   },
 
@@ -1860,7 +1860,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/help_app/app',
-        'version': 'Tc4FhXWtDX_fU3e24SCxymzOkhkETFwP1GC5jOGM7sYC',
+        'version': 'gegd9RbiGYFhFSgvBH9OuwmmAssjgtfMq0tMKsSzR8UC',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
@@ -1871,7 +1871,7 @@
     'packages': [
       {
         'package': 'chromeos_internal/apps/media_app/app',
-        'version': 'S3pWzmJCCVf-J8HtHnPKIW3GYQ7I7TyTZfl9_TMUDe4C',
+        'version': 'S7S99TvHZARF0XdCKnismW-MIvAsMmF71byKnT78fM0C',
       },
     ],
     'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/ash/BUILD.gn b/ash/BUILD.gn
index 6533610d..651ed93 100644
--- a/ash/BUILD.gn
+++ b/ash/BUILD.gn
@@ -735,6 +735,8 @@
     "metrics/task_switch_source.h",
     "metrics/task_switch_time_tracker.cc",
     "metrics/task_switch_time_tracker.h",
+    "metrics/ui_throughput_recorder.cc",
+    "metrics/ui_throughput_recorder.h",
     "metrics/user_metrics_recorder.cc",
     "metrics/user_metrics_recorder.h",
     "multi_device_setup/multi_device_notification_presenter.cc",
@@ -1835,14 +1837,8 @@
     "wm/desks/scroll_arrow_button.h",
     "wm/desks/templates/desks_templates_animations.cc",
     "wm/desks/templates/desks_templates_animations.h",
-    "wm/desks/templates/desks_templates_dialog_controller.cc",
-    "wm/desks/templates/desks_templates_dialog_controller.h",
     "wm/desks/templates/desks_templates_grid_view.cc",
     "wm/desks/templates/desks_templates_grid_view.h",
-    "wm/desks/templates/desks_templates_icon_container.cc",
-    "wm/desks/templates/desks_templates_icon_container.h",
-    "wm/desks/templates/desks_templates_icon_view.cc",
-    "wm/desks/templates/desks_templates_icon_view.h",
     "wm/desks/templates/desks_templates_metrics_util.cc",
     "wm/desks/templates/desks_templates_metrics_util.h",
     "wm/desks/templates/desks_templates_presenter.cc",
@@ -1855,6 +1851,12 @@
     "wm/desks/templates/save_desk_template_button.h",
     "wm/desks/templates/save_desk_template_button_container.cc",
     "wm/desks/templates/save_desk_template_button_container.h",
+    "wm/desks/templates/saved_desk_dialog_controller.cc",
+    "wm/desks/templates/saved_desk_dialog_controller.h",
+    "wm/desks/templates/saved_desk_icon_container.cc",
+    "wm/desks/templates/saved_desk_icon_container.h",
+    "wm/desks/templates/saved_desk_icon_view.cc",
+    "wm/desks/templates/saved_desk_icon_view.h",
     "wm/desks/templates/saved_desk_item_view.cc",
     "wm/desks/templates/saved_desk_item_view.h",
     "wm/desks/templates/saved_desk_name_view.cc",
diff --git a/ash/app_list/views/apps_container_view.cc b/ash/app_list/views/apps_container_view.cc
index fb4b244..c88c646 100644
--- a/ash/app_list/views/apps_container_view.cc
+++ b/ash/app_list/views/apps_container_view.cc
@@ -390,17 +390,10 @@
 
 void AppsContainerView::UpdateTopLevelGridDimensions() {
   const GridLayout grid_layout = CalculateGridLayout();
-  if (features::IsProductivityLauncherEnabled()) {
-    apps_grid_view_->SetMaxColumnsAndRows(
-        /*max_columns=*/grid_layout.columns,
-        /*max_rows_on_first_page=*/grid_layout.first_page_rows,
-        /*max_rows=*/grid_layout.rows);
-  } else {
-    apps_grid_view_->SetMaxColumnsAndRows(
-        /*max_columns=*/grid_layout.columns,
-        /*max_rows_on_first_page=*/grid_layout.first_page_rows,
-        /*max_rows=*/grid_layout.rows);
-  }
+  apps_grid_view_->SetMaxColumnsAndRows(
+      /*max_columns=*/grid_layout.columns,
+      /*max_rows_on_first_page=*/grid_layout.first_page_rows,
+      /*max_rows=*/grid_layout.rows);
 }
 
 gfx::Rect AppsContainerView::CalculateAvailableBoundsForAppsGrid(
diff --git a/ash/capture_mode/capture_mode_session.cc b/ash/capture_mode/capture_mode_session.cc
index 2d33355..485ee8d 100644
--- a/ash/capture_mode/capture_mode_session.cc
+++ b/ash/capture_mode/capture_mode_session.cc
@@ -1871,7 +1871,6 @@
   }
 
   DCHECK(is_capture_region);
-  DCHECK(cursor_setter_);
   // Allow events that are located on the capture mode bar or settings menu to
   // pass through so we can click the buttons.
   if (!is_event_on_capture_bar &&
diff --git a/ash/capture_mode/capture_mode_unittests.cc b/ash/capture_mode/capture_mode_unittests.cc
index f38e782..355c81b 100644
--- a/ash/capture_mode/capture_mode_unittests.cc
+++ b/ash/capture_mode/capture_mode_unittests.cc
@@ -4570,6 +4570,7 @@
   MockProjectorClient* projector_client() {
     return projector_helper_.projector_client();
   }
+  aura::Window* window() const { return window_.get(); }
 
   // CaptureModeTest:
   void SetUp() override {
@@ -4632,8 +4633,9 @@
       ASSERT_EQ(parent, window_being_recorded);
       EXPECT_EQ(window_being_recorded->children().back(), overlay_window);
     } else {
-      auto* menu_container = overlay_window->GetRootWindow()->GetChildById(
-          kShellWindowId_MenuContainer);
+      auto* menu_container =
+          window_being_recorded->GetRootWindow()->GetChildById(
+              kShellWindowId_MenuContainer);
       ASSERT_EQ(parent, menu_container);
       EXPECT_EQ(menu_container->children().front(), overlay_window);
     }
@@ -4641,9 +4643,7 @@
 
   void VerifyOverlayWindow(aura::Window* overlay_window,
                            CaptureModeSource source) {
-    auto* controller = CaptureModeController::Get();
-    auto* recording_watcher = controller->video_recording_watcher_for_testing();
-    auto* window_being_recorded = recording_watcher->window_being_recorded();
+    auto* window_being_recorded = GetWindowBeingRecorded();
 
     VerifyOverlayStacking(overlay_window, window_being_recorded, source);
 
@@ -4660,6 +4660,13 @@
     }
   }
 
+  aura::Window* GetWindowBeingRecorded() const {
+    auto* controller = CaptureModeController::Get();
+    DCHECK(controller->is_recording_in_progress());
+    return controller->video_recording_watcher_for_testing()
+        ->window_being_recorded();
+  }
+
  protected:
   ProjectorCaptureModeIntegrationHelper projector_helper_;
   std::unique_ptr<aura::Window> window_;
@@ -5023,6 +5030,31 @@
   VerifyOverlayWindow(overlay_window, capture_source);
 }
 
+// Regression test for https://crbug.com/1322655.
+TEST_P(ProjectorCaptureModeIntegrationTests,
+       RecordingOverlayWidgetBoundsSecondDisplay) {
+  UpdateDisplay("800x700,801+0-800x700");
+  const gfx::Point point_in_second_display = gfx::Point(1000, 500);
+  auto* event_generator = GetEventGenerator();
+  MoveMouseToAndUpdateCursorDisplay(point_in_second_display, event_generator);
+  window()->SetBoundsInScreen(
+      gfx::Rect(900, 0, 600, 500),
+      display::Screen::GetScreen()->GetDisplayNearestWindow(
+          Shell::GetAllRootWindows()[1]));
+
+  const auto capture_source = GetParam();
+  StartRecordingForProjectorFromSource(capture_source);
+  const auto roots = Shell::GetAllRootWindows();
+  EXPECT_EQ(roots[1], GetWindowBeingRecorded()->GetRootWindow());
+
+  CaptureModeTestApi test_api;
+  RecordingOverlayController* overlay_controller =
+      test_api.GetRecordingOverlayController();
+  EXPECT_FALSE(overlay_controller->is_enabled());
+  auto* overlay_window = overlay_controller->GetOverlayNativeWindow();
+  VerifyOverlayWindow(overlay_window, capture_source);
+}
+
 namespace {
 
 // Defines a class that intercepts the events at the post-target handling phase
diff --git a/ash/capture_mode/recording_overlay_controller.cc b/ash/capture_mode/recording_overlay_controller.cc
index d0a5eb7..b6cecfc 100644
--- a/ash/capture_mode/recording_overlay_controller.cc
+++ b/ash/capture_mode/recording_overlay_controller.cc
@@ -18,6 +18,7 @@
 #include "ui/gfx/geometry/rect.h"
 #include "ui/views/widget/widget.h"
 #include "ui/wm/core/coordinate_conversion.h"
+#include "ui/wm/core/window_properties.h"
 
 namespace ash {
 
@@ -60,6 +61,19 @@
              : window_being_recorded;
 }
 
+// Given the `bounds_in_parent` of the overlay widget, returns the bounds in the
+// correct coordinate system depending on whether the `overlay_window_parent`
+// uses screen coordinates or not.
+gfx::Rect MaybeAdjustOverlayBounds(const gfx::Rect& bounds_in_parent,
+                                   aura::Window* overlay_window_parent) {
+  DCHECK(overlay_window_parent);
+  if (!overlay_window_parent->GetProperty(wm::kUsesScreenCoordinatesKey))
+    return bounds_in_parent;
+  gfx::Rect bounds_in_screen = bounds_in_parent;
+  wm::ConvertRectToScreen(overlay_window_parent, &bounds_in_screen);
+  return bounds_in_screen;
+}
+
 // Defines a window targeter that will be installed on the overlay widget's
 // window so that we can allow located events over the projector shelf pod or
 // its associated bubble widget to go through and not be consumed by the
@@ -155,11 +169,13 @@
   params.name = "RecordingOverlayWidget";
   params.child = true;
   params.parent = GetWidgetParent(window_being_recorded);
+
   // The overlay hosts transparent contents so actual contents of the window
   // being recorded shows up underneath.
   params.layer_type = ui::LAYER_NOT_DRAWN;
   params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent;
-  params.bounds = initial_bounds_in_parent;
+  params.bounds =
+      MaybeAdjustOverlayBounds(initial_bounds_in_parent, params.parent);
   // The overlay window does not receive any events until it's shown and
   // enabled. See |Start()| below.
   params.activatable = views::Widget::InitParams::Activatable::kNo;
@@ -182,7 +198,8 @@
 }
 
 void RecordingOverlayController::SetBounds(const gfx::Rect& bounds_in_parent) {
-  overlay_widget_->SetBounds(bounds_in_parent);
+  overlay_widget_->SetBounds(MaybeAdjustOverlayBounds(
+      bounds_in_parent, overlay_widget_->GetNativeWindow()));
 }
 
 aura::Window* RecordingOverlayController::GetOverlayNativeWindow() {
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc
index ba6222d..368e447a 100644
--- a/ash/constants/ash_features.cc
+++ b/ash/constants/ash_features.cc
@@ -857,6 +857,12 @@
 const base::Feature kImprovedDesksKeyboardShortcuts{
     "ImprovedDesksKeyboardShortcuts", base::FEATURE_ENABLED_BY_DEFAULT};
 
+// Controls whether to show new improved UI for cryptohome errors that happened
+// during login. UI contains links to help center and might provide actions
+// that can be taken to resolve the problem.
+const base::Feature kImprovedLoginErrorHandling{
+    "ImprovedLoginErrorHandling", base::FEATURE_DISABLED_BY_DEFAULT};
+
 // Enables or disables Instant Tethering on ChromeOS.
 const base::Feature kInstantTethering{"InstantTethering",
                                       base::FEATURE_ENABLED_BY_DEFAULT};
@@ -1386,7 +1392,7 @@
 // Uses new  AuthSession-based API in cryptohome to authenticate users during
 // sign-in.
 const base::Feature kUseAuthsessionAuthentication{
-    "UseAuthsessionAuthentication", base::FEATURE_DISABLED_BY_DEFAULT};
+    "UseAuthsessionAuthentication", base::FEATURE_ENABLED_BY_DEFAULT};
 
 // Enables using the BluetoothSystem Mojo interface for Bluetooth operations.
 const base::Feature kUseBluetoothSystemInAsh{"UseBluetoothSystemInAsh",
@@ -2124,6 +2130,11 @@
   return base::FeatureList::IsEnabled(kShimlessRMAFlow);
 }
 
+bool IsShimlessRMAStandaloneAppEnabled() {
+  return base::FeatureList::IsEnabled(kShimlessRMAEnableStandalone) &&
+         IsShimlessRMAFlowEnabled();
+}
+
 bool IsSimLockPolicyEnabled() {
   return base::FeatureList::IsEnabled(kSimLockPolicy);
 }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h
index d5ea3c4..a9972c90 100644
--- a/ash/constants/ash_features.h
+++ b/ash/constants/ash_features.h
@@ -342,6 +342,8 @@
 extern const base::Feature kImeStylusHandwriting;
 COMPONENT_EXPORT(ASH_CONSTANTS)
 extern const base::Feature kImprovedDesksKeyboardShortcuts;
+COMPONENT_EXPORT(ASH_CONSTANTS)
+extern const base::Feature kImprovedLoginErrorHandling;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kInstantTethering;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kLacrosOnly;
 COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kLacrosPrimary;
@@ -743,6 +745,7 @@
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsShelfLauncherNudgeEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsSimLockPolicyEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsShimlessRMAFlowEnabled();
+COMPONENT_EXPORT(ASH_CONSTANTS) bool IsShimlessRMAStandaloneAppEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsSnoopingProtectionEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsSyncSettingsCategorizationEnabled();
 COMPONENT_EXPORT(ASH_CONSTANTS) bool IsStylusBatteryStatusEnabled();
diff --git a/ash/login/login_screen_test_api.cc b/ash/login/login_screen_test_api.cc
index c3342fa..0d90056d 100644
--- a/ash/login/login_screen_test_api.cc
+++ b/ash/login/login_screen_test_api.cc
@@ -20,6 +20,8 @@
 #include "ash/login/ui/login_user_view.h"
 #include "ash/login/ui/pin_request_view.h"
 #include "ash/login/ui/pin_request_widget.h"
+#include "ash/public/cpp/login_screen.h"
+#include "ash/public/cpp/login_screen_client.h"
 #include "ash/shelf/login_shelf_view.h"
 #include "ash/shelf/shelf.h"
 #include "ash/shelf/shelf_widget.h"
@@ -28,6 +30,7 @@
 #include "base/check.h"
 #include "base/run_loop.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "ui/base/test/ui_controls.h"
 #include "ui/compositor/layer.h"
 #include "ui/events/test/event_generator.h"
 #include "ui/gfx/geometry/rect.h"
@@ -482,11 +485,30 @@
 
 // static
 bool LoginScreenTestApi::PressAccelerator(const ui::Accelerator& accelerator) {
+  // TODO(https://crbug.com/1321609): Migrate to SendAcceleratorNatively.
   LockScreen::TestApi lock_screen_test(LockScreen::Get());
   return lock_screen_test.contents_view()->AcceleratorPressed(accelerator);
 }
 
 // static
+bool LoginScreenTestApi::SendAcceleratorNatively(
+    const ui::Accelerator& accelerator) {
+  gfx::NativeWindow login_window = nullptr;
+  if (LockScreen::HasInstance()) {
+    login_window = LockScreen::Get()->widget()->GetNativeWindow();
+  } else {
+    login_window =
+        LoginScreen::Get()->GetLoginWindowWidget()->GetNativeWindow();
+  }
+  if (!login_window)
+    return false;
+  return ui_controls::SendKeyPress(
+      login_window, accelerator.key_code(), accelerator.IsCtrlDown(),
+      accelerator.IsShiftDown(), accelerator.IsAltDown(),
+      accelerator.IsCmdDown());
+}
+
+// static
 bool LoginScreenTestApi::WaitForUiUpdate(int64_t previous_update_count) {
   LoginShelfView* view = GetLoginShelfView();
   if (view) {
diff --git a/ash/metrics/DEPS b/ash/metrics/DEPS
index 5e26955..5216bac 100644
--- a/ash/metrics/DEPS
+++ b/ash/metrics/DEPS
@@ -1,4 +1,5 @@
 include_rules = [
+  "+cc/metrics",
   "+chromeos/login/login_state",
   "+chromeos/metrics",
 ]
diff --git a/ash/metrics/login_unlock_throughput_recorder.cc b/ash/metrics/login_unlock_throughput_recorder.cc
index 4f6ff91c..bc809618 100644
--- a/ash/metrics/login_unlock_throughput_recorder.cc
+++ b/ash/metrics/login_unlock_throughput_recorder.cc
@@ -108,12 +108,21 @@
   if (login_state->IsUserLoggedIn() &&
       (logged_in_user == chromeos::LoginState::LOGGED_IN_USER_OWNER ||
        logged_in_user == chromeos::LoginState::LOGGED_IN_USER_REGULAR)) {
+    ui_recorder_.OnUserLoggedIn();
     auto* primary_root = Shell::GetPrimaryRootWindow();
     new ui::TotalAnimationThroughputReporter(
         primary_root->GetHost()->compositor(),
-        base::BindOnce(&ReportLogin, base::TimeTicks::Now()),
+        base::BindOnce(&LoginUnlockThroughputRecorder::OnLoginAnimationFinish,
+                       weak_ptr_factory_.GetWeakPtr(), base::TimeTicks::Now()),
         /*self_destruct=*/true);
   }
 }
 
+void LoginUnlockThroughputRecorder::OnLoginAnimationFinish(
+    base::TimeTicks start,
+    const cc::FrameSequenceMetrics::CustomReportData& data) {
+  ui_recorder_.OnPostLoginAnimationFinish();
+  ReportLogin(start, data);
+}
+
 }  // namespace ash
diff --git a/ash/metrics/login_unlock_throughput_recorder.h b/ash/metrics/login_unlock_throughput_recorder.h
index aeba869d..bcc3f894 100644
--- a/ash/metrics/login_unlock_throughput_recorder.h
+++ b/ash/metrics/login_unlock_throughput_recorder.h
@@ -6,7 +6,11 @@
 #define ASH_METRICS_LOGIN_UNLOCK_THROUGHPUT_RECORDER_H_
 
 #include "ash/ash_export.h"
+#include "ash/metrics/ui_throughput_recorder.h"
 #include "ash/public/cpp/session/session_observer.h"
+#include "base/memory/weak_ptr.h"
+#include "base/time/time.h"
+#include "cc/metrics/frame_sequence_metrics.h"
 #include "chromeos/login/login_state/login_state.h"
 
 namespace ash {
@@ -26,6 +30,14 @@
 
   // chromeos::LoginState::Observer:
   void LoggedInStateChanged() override;
+
+ private:
+  void OnLoginAnimationFinish(
+      base::TimeTicks start,
+      const cc::FrameSequenceMetrics::CustomReportData& data);
+
+  UiThroughputRecorder ui_recorder_;
+  base::WeakPtrFactory<LoginUnlockThroughputRecorder> weak_ptr_factory_{this};
 };
 
 }  // namespace ash
diff --git a/ash/metrics/ui_throughput_recorder.cc b/ash/metrics/ui_throughput_recorder.cc
new file mode 100644
index 0000000..026132a
--- /dev/null
+++ b/ash/metrics/ui_throughput_recorder.cc
@@ -0,0 +1,67 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ash/metrics/ui_throughput_recorder.h"
+
+#include "base/check_op.h"
+#include "base/metrics/histogram_macros.h"
+
+namespace ash {
+
+UiThroughputRecorder::UiThroughputRecorder() = default;
+UiThroughputRecorder::~UiThroughputRecorder() = default;
+
+void UiThroughputRecorder::OnUserLoggedIn() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  // OnUserLoggedIn could be called multiple times from any states.
+  // e.g.
+  //   from kBeforeLogin: sign-in from the login screen and on cryptohome mount
+  //   from kDuringLogin: during user profile loading after checking ownership
+  //   from kInSession: adding a new user to the existing session.
+  // Only set kDuringLogin on first OnUserLoggedIn call from kBeforeLogin so
+  // that kDuringLogin starts from cryptohome mount.
+  if (state_ == State::kBeforeLogin)
+    state_ = State::kDuringLogin;
+}
+
+void UiThroughputRecorder::OnPostLoginAnimationFinish() {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  // This happens when adding a user to the existing session. Ignore it to
+  // treat secondary user login as in session since multiple profile feature is
+  // deprecating.
+  if (state_ == State::kInSession)
+    return;
+
+  DCHECK_EQ(State::kDuringLogin, state_);
+  state_ = State::kInSession;
+}
+
+void UiThroughputRecorder::ReportPercentDroppedFramesInOneSecoundWindow(
+    double percentage) {
+  DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
+
+  UMA_HISTOGRAM_PERCENTAGE("Ash.Smoothness.PercentDroppedFrames_1sWindow",
+                           percentage);
+
+  switch (state_) {
+    case State::kBeforeLogin:
+      UMA_HISTOGRAM_PERCENTAGE(
+          "Ash.Smoothness.PercentDroppedFrames_1sWindow.BeforeLogin",
+          percentage);
+      break;
+    case State::kDuringLogin:
+      UMA_HISTOGRAM_PERCENTAGE(
+          "Ash.Smoothness.PercentDroppedFrames_1sWindow.DuringLogin",
+          percentage);
+      break;
+    case State::kInSession:
+      UMA_HISTOGRAM_PERCENTAGE(
+          "Ash.Smoothness.PercentDroppedFrames_1sWindow.InSession", percentage);
+      break;
+  }
+}
+
+}  // namespace ash
diff --git a/ash/metrics/ui_throughput_recorder.h b/ash/metrics/ui_throughput_recorder.h
new file mode 100644
index 0000000..37f0530
--- /dev/null
+++ b/ash/metrics/ui_throughput_recorder.h
@@ -0,0 +1,44 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef ASH_METRICS_UI_THROUGHPUT_RECORDER_H_
+#define ASH_METRICS_UI_THROUGHPUT_RECORDER_H_
+
+#include "ash/ash_export.h"
+#include "base/sequence_checker.h"
+#include "cc/metrics/custom_metrics_recorder.h"
+
+namespace ash {
+
+// Records throughput metrics for ash UI. Note this class is not thread-safe.
+class ASH_EXPORT UiThroughputRecorder : public cc::CustomMetricRecorder {
+ public:
+  UiThroughputRecorder();
+  ~UiThroughputRecorder() override;
+
+  // Invoked on a user login. This is expected to be called after cryptohome
+  // mount but before user profile loading.
+  void OnUserLoggedIn();
+
+  // Invoked after post-login animation finishes.
+  void OnPostLoginAnimationFinish();
+
+  // cc::CustomMetricRecorder:
+  void ReportPercentDroppedFramesInOneSecoundWindow(double percentage) override;
+
+ private:
+  // State to split "Ash.Smoothness.PercentDroppedFrames_1sWindow".
+  enum class State {
+    kBeforeLogin,
+    kDuringLogin,
+    kInSession,
+  };
+
+  State state_ = State::kBeforeLogin;
+  SEQUENCE_CHECKER(sequence_checker_);
+};
+
+}  // namespace ash
+
+#endif  // ASH_METRICS_UI_THROUGHPUT_RECORDER_H_
diff --git a/ash/public/cpp/login_screen_test_api.h b/ash/public/cpp/login_screen_test_api.h
index 89430b3..2e028688 100644
--- a/ash/public/cpp/login_screen_test_api.h
+++ b/ash/public/cpp/login_screen_test_api.h
@@ -62,6 +62,7 @@
   static bool ClickEnterpriseEnrollmentButton();
   static bool ClickOsInstallButton();
   static bool PressAccelerator(const ui::Accelerator& accelerator);
+  static bool SendAcceleratorNatively(const ui::Accelerator& accelerator);
   static bool WaitForUiUpdate(int64_t previous_update_count);
   static int GetUsersCount();
   static bool FocusUser(const AccountId& account_id);
diff --git a/ash/services/device_sync/public/cpp/device_sync_prefs.cc b/ash/services/device_sync/public/cpp/device_sync_prefs.cc
index 8881877..024a020 100644
--- a/ash/services/device_sync/public/cpp/device_sync_prefs.cc
+++ b/ash/services/device_sync/public/cpp/device_sync_prefs.cc
@@ -5,6 +5,7 @@
 #include "ash/services/device_sync/public/cpp/device_sync_prefs.h"
 
 #include "ash/constants/ash_features.h"
+#include "ash/services/device_sync/attestation_certificates_syncer_impl.h"
 #include "ash/services/device_sync/cryptauth_device_manager.h"
 #include "ash/services/device_sync/cryptauth_device_registry_impl.h"
 #include "ash/services/device_sync/cryptauth_enrollment_manager_impl.h"
@@ -37,6 +38,10 @@
     CryptAuthMetadataSyncerImpl::RegisterPrefs(registry);
     SyncedBluetoothAddressTrackerImpl::RegisterPrefs(registry);
   }
+
+  if (base::FeatureList::IsEnabled(chromeos::features::kEcheSWA)) {
+    AttestationCertificatesSyncerImpl::RegisterPrefs(registry);
+  }
 }
 
 }  // namespace device_sync
diff --git a/ash/system/network/fake_network_detailed_network_view.cc b/ash/system/network/fake_network_detailed_network_view.cc
index fd4cf99..5f2e981 100644
--- a/ash/system/network/fake_network_detailed_network_view.cc
+++ b/ash/system/network/fake_network_detailed_network_view.cc
@@ -19,6 +19,14 @@
 
 FakeNetworkDetailedNetworkView::~FakeNetworkDetailedNetworkView() = default;
 
+void FakeNetworkDetailedNetworkView::NotifyNetworkListChanged() {
+  notify_network_list_changed_call_count_++;
+}
+
+views::View* FakeNetworkDetailedNetworkView::network_list() {
+  return network_list_.get();
+};
+
 views::View* FakeNetworkDetailedNetworkView::GetAsView() {
   return this;
 }
diff --git a/ash/system/network/fake_network_detailed_network_view.h b/ash/system/network/fake_network_detailed_network_view.h
index 4fbae39..324ef2e 100644
--- a/ash/system/network/fake_network_detailed_network_view.h
+++ b/ash/system/network/fake_network_detailed_network_view.h
@@ -26,12 +26,19 @@
       const FakeNetworkDetailedNetworkView&) = delete;
   ~FakeNetworkDetailedNetworkView() override;
 
+  size_t notify_network_list_changed_call_count() {
+    return notify_network_list_changed_call_count_;
+  }
+
   const NetworkListItemView* last_clicked_network_list_item() const {
     return last_clicked_network_list_item_;
   }
 
+  views::View* network_list() override;
+
  private:
   // NetworkDetailedNetworkView:
+  void NotifyNetworkListChanged() override;
   views::View* GetAsView() override;
   NetworkListNetworkItemView* AddNetworkListItem() override;
   NetworkListNetworkHeaderView* AddWifiSectionHeader() override;
@@ -41,6 +48,7 @@
   void OnViewClicked(views::View* view) override;
 
   std::unique_ptr<views::View> network_list_;
+  size_t notify_network_list_changed_call_count_;
   NetworkListItemView* last_clicked_network_list_item_ = nullptr;
 };
 
diff --git a/ash/system/network/network_detailed_network_view.h b/ash/system/network/network_detailed_network_view.h
index 119ebff..eb460bb 100644
--- a/ash/system/network/network_detailed_network_view.h
+++ b/ash/system/network/network_detailed_network_view.h
@@ -9,6 +9,7 @@
 #include "ash/system/network/network_detailed_view.h"
 #include "ash/system/network/network_list_network_header_view.h"
 #include "ash/system/network/network_list_network_item_view.h"
+#include "ui/views/view.h"
 
 namespace ash {
 
@@ -54,6 +55,9 @@
       delete;
   virtual ~NetworkDetailedNetworkView() = default;
 
+  // Notifies that the network list has changed and the layout is invalid.
+  virtual void NotifyNetworkListChanged() = 0;
+
   // Returns the implementation casted to views::View*. This may be |nullptr|
   // when testing, where the implementation might not inherit from views::View.
   virtual views::View* GetAsView() = 0;
@@ -73,6 +77,9 @@
   // removing and rearranging the sub-header.
   virtual NetworkListNetworkHeaderView* AddMobileSectionHeader() = 0;
 
+  // Returns the network list.
+  virtual views::View* network_list() = 0;
+
  protected:
   explicit NetworkDetailedNetworkView(Delegate* delegate);
 
diff --git a/ash/system/network/network_detailed_network_view_impl.cc b/ash/system/network/network_detailed_network_view_impl.cc
index 171cff85..3652229 100644
--- a/ash/system/network/network_detailed_network_view_impl.cc
+++ b/ash/system/network/network_detailed_network_view_impl.cc
@@ -26,6 +26,11 @@
 
 NetworkDetailedNetworkViewImpl::~NetworkDetailedNetworkViewImpl() = default;
 
+void NetworkDetailedNetworkViewImpl::NotifyNetworkListChanged() {
+  scroll_content()->InvalidateLayout();
+  Layout();
+}
+
 views::View* NetworkDetailedNetworkViewImpl::GetAsView() {
   return this;
 }
@@ -48,6 +53,10 @@
       new NetworkListMobileHeaderViewImpl(/*delegate=*/this));
 }
 
+views::View* NetworkDetailedNetworkViewImpl::network_list() {
+  return scroll_content();
+}
+
 void NetworkDetailedNetworkViewImpl::OnMobileToggleClicked(bool new_state) {
   NetworkDetailedNetworkView::delegate()->OnMobileToggleClicked(new_state);
 }
diff --git a/ash/system/network/network_detailed_network_view_impl.h b/ash/system/network/network_detailed_network_view_impl.h
index cd40e9ef..79487785 100644
--- a/ash/system/network/network_detailed_network_view_impl.h
+++ b/ash/system/network/network_detailed_network_view_impl.h
@@ -11,6 +11,7 @@
 #include "ash/system/network/network_list_network_header_view.h"
 #include "ash/system/network/network_list_network_item_view.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
+#include "ui/views/view.h"
 
 namespace ash {
 
@@ -37,10 +38,12 @@
   friend class NetworkDetailedNetworkViewTest;
 
   // NetworkDetailedNetworkView:
+  void NotifyNetworkListChanged() override;
   views::View* GetAsView() override;
   NetworkListNetworkItemView* AddNetworkListItem() override;
   NetworkListNetworkHeaderView* AddMobileSectionHeader() override;
   NetworkListNetworkHeaderView* AddWifiSectionHeader() override;
+  views::View* network_list() override;
 
   // NetworkListNetworkHeaderView::Delegate:
   void OnMobileToggleClicked(bool new_state) override;
diff --git a/ash/system/network/network_detailed_view.cc b/ash/system/network/network_detailed_view.cc
index 181fd8e..c3fd03f 100644
--- a/ash/system/network/network_detailed_view.cc
+++ b/ash/system/network/network_detailed_view.cc
@@ -42,11 +42,6 @@
 
 NetworkDetailedView::~NetworkDetailedView() = default;
 
-void NetworkDetailedView::NotifyNetworkListChanged() {
-  scroll_content()->InvalidateLayout();
-  Layout();
-}
-
 void NetworkDetailedView::HandleViewClicked(views::View* view) {
   if (login_ == LoginStatus::LOCKED)
     return;
@@ -54,10 +49,6 @@
       static_cast<NetworkListItemView*>(view)->network_properties());
 }
 
-views::View* NetworkDetailedView::network_list() {
-  return scroll_content();
-}
-
 void NetworkDetailedView::CreateTitleRowButtons() {
   DCHECK(!info_button_);
   tri_view()->SetContainerVisible(TriView::Container::END, true);
diff --git a/ash/system/network/network_detailed_view.h b/ash/system/network/network_detailed_view.h
index b8f703e..6e4a832 100644
--- a/ash/system/network/network_detailed_view.h
+++ b/ash/system/network/network_detailed_view.h
@@ -47,12 +47,6 @@
   NetworkDetailedView& operator=(const NetworkDetailedView&) = delete;
   ~NetworkDetailedView() override;
 
-  // Notifies that the network list has changed and the layout is invalid.
-  void NotifyNetworkListChanged();
-
-  // Returns the network list.
-  views::View* network_list();
-
  protected:
   enum ListType { LIST_TYPE_NETWORK, LIST_TYPE_VPN };
 
diff --git a/ash/wallpaper/wallpaper_controller_impl.cc b/ash/wallpaper/wallpaper_controller_impl.cc
index d416484..a295f6a 100644
--- a/ash/wallpaper/wallpaper_controller_impl.cc
+++ b/ash/wallpaper/wallpaper_controller_impl.cc
@@ -769,6 +769,23 @@
                                  kLargeWallpaperMaxHeight));
 }
 
+void DownloadGooglePhotosImage(
+    const GURL& url,
+    const AccountId& account_id,
+    ImageDownloader::DownloadCallback callback,
+    const absl::optional<std::string>& access_token) {
+  GURL url_with_dimensions = AddDimensionsToGooglePhotosURL(url);
+
+  net::HttpRequestHeaders headers;
+  if (access_token.has_value()) {
+    headers.SetHeader(net::HttpRequestHeaders::kAuthorization,
+                      "Bearer " + access_token.value());
+  }
+  ImageDownloader::Get()->Download(url_with_dimensions,
+                                   kDownloadGooglePhotoTrafficAnnotation,
+                                   headers, absl::nullopt, std::move(callback));
+}
+
 // Returns an appropriate ColorMode value based on the Light/Dark mode state.
 OnlineWallpaperVariantInfoFetcher::ColorMode GetColorMode() {
   return Shell::Get()->ash_color_provider()->IsDarkModeEnabled()
@@ -2415,15 +2432,13 @@
     return;
   }
 
-  GURL url = AddDimensionsToGooglePhotosURL(photo->url);
-
   ImageDownloader::DownloadCallback download_callback = base::BindOnce(
       &WallpaperControllerImpl::OnDailyGooglePhotosWallpaperDownloaded,
       set_wallpaper_weak_factory_.GetWeakPtr(), account_id, photo->id, album_id,
       std::move(callback));
-  ImageDownloader::Get()->Download(url, kDownloadGooglePhotoTrafficAnnotation,
-                                   {}, account_id,
-                                   std::move(download_callback));
+  wallpaper_controller_client_->FetchGooglePhotosAccessToken(
+      account_id, base::BindOnce(&DownloadGooglePhotosImage, photo->url,
+                                 account_id, std::move(download_callback)));
 }
 
 void WallpaperControllerImpl::OnDailyGooglePhotosWallpaperDownloaded(
@@ -2477,14 +2492,13 @@
                        std::move(callback)),
         cached_path);
   } else {
-    GURL url = AddDimensionsToGooglePhotosURL(photo->url);
-
     ImageDownloader::DownloadCallback download_callback = base::BindOnce(
         &WallpaperControllerImpl::OnGooglePhotosWallpaperDownloaded,
         set_wallpaper_weak_factory_.GetWeakPtr(), params, std::move(callback));
-    ImageDownloader::Get()->Download(url, kDownloadGooglePhotoTrafficAnnotation,
-                                     {}, params.account_id,
-                                     std::move(download_callback));
+    wallpaper_controller_client_->FetchGooglePhotosAccessToken(
+        params.account_id,
+        base::BindOnce(&DownloadGooglePhotosImage, photo->url,
+                       params.account_id, std::move(download_callback)));
   }
 }
 
diff --git a/ash/webui/personalization_app/mojom/personalization_app.mojom b/ash/webui/personalization_app/mojom/personalization_app.mojom
index 22b80c2..a2830cd 100644
--- a/ash/webui/personalization_app/mojom/personalization_app.mojom
+++ b/ash/webui/personalization_app/mojom/personalization_app.mojom
@@ -219,10 +219,6 @@
     FetchGooglePhotosAlbums(string? resume_token) =>
         (FetchGooglePhotosAlbumsResponse response);
 
-    // Fetch the number of photos the user has stored in Google Photos. |count|
-    // will be -1 on failure.
-    FetchGooglePhotosCount() => (int32 count);
-
     // Fetch whether the user is allowed to access Google Photos data.
     FetchGooglePhotosEnabled() => (GooglePhotosEnablementState state);
 
diff --git a/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.cc b/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.cc
index f006ed71..c867ee7 100644
--- a/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.cc
+++ b/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.cc
@@ -71,11 +71,6 @@
       ash::personalization_app::mojom::FetchGooglePhotosAlbumsResponse::New());
 }
 
-void FakePersonalizationAppWallpaperProvider::FetchGooglePhotosCount(
-    FetchGooglePhotosCountCallback callback) {
-  std::move(callback).Run(0);
-}
-
 void FakePersonalizationAppWallpaperProvider::FetchGooglePhotosEnabled(
     FetchGooglePhotosEnabledCallback callback) {
   std::move(callback).Run(
diff --git a/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.h b/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.h
index 19538c2..52441610 100644
--- a/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.h
+++ b/ash/webui/personalization_app/test/fake_personalization_app_wallpaper_provider.h
@@ -53,8 +53,6 @@
       const absl::optional<std::string>& resume_token,
       FetchGooglePhotosAlbumsCallback callback) override;
 
-  void FetchGooglePhotosCount(FetchGooglePhotosCountCallback callback) override;
-
   void FetchGooglePhotosEnabled(
       FetchGooglePhotosEnabledCallback callback) override;
 
diff --git a/ash/wm/desks/desk_mini_view.cc b/ash/wm/desks/desk_mini_view.cc
index 4a72e5d3..15b8270 100644
--- a/ash/wm/desks/desk_mini_view.cc
+++ b/ash/wm/desks/desk_mini_view.cc
@@ -328,6 +328,8 @@
   }
 
   if (DesksController::Get()->CanRemoveDesks()) {
+    // TODO(sammiequon): Update this once we get strings from UX writing since
+    // close all supports Ctrl+Shift+W.
     node_data->AddStringAttribute(
         ax::mojom::StringAttribute::kDescription,
         l10n_util::GetStringUTF8(
@@ -385,11 +387,11 @@
                                        DesksSwitchSource::kMiniViewButton);
 }
 
-void DeskMiniView::MaybeCloseHighlightedView() {
-  // TODO(crbug.com/1307011): This function is called when we press ctrl+W
-  // while highlighted over a desk mini view to combine desks. Should be
-  // reworked when we add an accelerator for close-all.
-  OnRemovingDesk(DeskCloseType::kCombineDesks);
+void DeskMiniView::MaybeCloseHighlightedView(bool primary_action) {
+  // The primary action (Ctrl + W) is to remove the desk and not close the
+  // windows (combine the desk with one on the right or left). The secondary
+  // action (Ctrl + Shift + W) is to close the desk and all its applications.
+  OnRemovingDesk(/*close_windows=*/!primary_action);
 }
 
 void DeskMiniView::MaybeSwapHighlightedView(bool right) {
diff --git a/ash/wm/desks/desk_mini_view.h b/ash/wm/desks/desk_mini_view.h
index 90f3bd6d..569a435 100644
--- a/ash/wm/desks/desk_mini_view.h
+++ b/ash/wm/desks/desk_mini_view.h
@@ -117,7 +117,7 @@
   // OverviewHighlightableView:
   views::View* GetView() override;
   void MaybeActivateHighlightedView() override;
-  void MaybeCloseHighlightedView() override;
+  void MaybeCloseHighlightedView(bool primary_action) override;
   void MaybeSwapHighlightedView(bool right) override;
   bool MaybeActivateHighlightedViewOnOverviewExit(
       OverviewSession* overview_session) override;
diff --git a/ash/wm/desks/desks_controller.cc b/ash/wm/desks/desks_controller.cc
index fdaa673..09fa375 100644
--- a/ash/wm/desks/desks_controller.cc
+++ b/ash/wm/desks/desks_controller.cc
@@ -30,7 +30,7 @@
 #include "ash/wm/desks/desks_animations.h"
 #include "ash/wm/desks/desks_restore_util.h"
 #include "ash/wm/desks/desks_util.h"
-#include "ash/wm/desks/templates/desks_templates_dialog_controller.h"
+#include "ash/wm/desks/templates/saved_desk_dialog_controller.h"
 #include "ash/wm/mru_window_tracker.h"
 #include "ash/wm/overview/overview_controller.h"
 #include "ash/wm/overview/overview_grid.h"
diff --git a/ash/wm/desks/desks_textfield.cc b/ash/wm/desks/desks_textfield.cc
index 31ec315..f02b82d 100644
--- a/ash/wm/desks/desks_textfield.cc
+++ b/ash/wm/desks/desks_textfield.cc
@@ -152,7 +152,7 @@
   RequestFocus();
 }
 
-void DesksTextfield::MaybeCloseHighlightedView() {}
+void DesksTextfield::MaybeCloseHighlightedView(bool primary_action) {}
 
 void DesksTextfield::MaybeSwapHighlightedView(bool right) {}
 
diff --git a/ash/wm/desks/desks_textfield.h b/ash/wm/desks/desks_textfield.h
index 32005774..fa923f2 100644
--- a/ash/wm/desks/desks_textfield.h
+++ b/ash/wm/desks/desks_textfield.h
@@ -51,7 +51,7 @@
   // OverviewHighlightableView:
   views::View* GetView() override;
   void MaybeActivateHighlightedView() override;
-  void MaybeCloseHighlightedView() override;
+  void MaybeCloseHighlightedView(bool primary_action) override;
   void MaybeSwapHighlightedView(bool right) override;
   void OnViewHighlighted() override;
   void OnViewUnhighlighted() override;
diff --git a/ash/wm/desks/desks_unittests.cc b/ash/wm/desks/desks_unittests.cc
index afde41a..95f6740 100644
--- a/ash/wm/desks/desks_unittests.cc
+++ b/ash/wm/desks/desks_unittests.cc
@@ -7405,6 +7405,43 @@
       DeskActionContextMenu::CommandId::kCombineDesks));
 }
 
+// Tests that the shortcut to close all (Ctrl + Shift + W) on a desk mini view
+// works as expected.
+TEST_F(DesksCloseAllTest, ShortcutCloseAll) {
+  WindowHolder window1(CreateAppWindow());
+  WindowHolder window2(CreateAppWindow());
+  NewDesk();
+  auto* controller = DesksController::Get();
+  ASSERT_EQ(2u, controller->desks().size());
+  Desk* desk_1 = controller->desks()[0].get();
+  ASSERT_TRUE(desk_1->is_active());
+  ASSERT_TRUE(base::Contains(desk_1->windows(), window1.window()));
+  ASSERT_TRUE(base::Contains(desk_1->windows(), window2.window()));
+
+  EnterOverview();
+  auto* overview_session =
+      Shell::Get()->overview_controller()->overview_session();
+  ASSERT_TRUE(overview_session);
+
+  auto* desks_bar =
+      GetOverviewGridForRoot(Shell::GetPrimaryRootWindow())->desks_bar_view();
+  auto* mini_view = desks_bar->mini_views()[0];
+
+  SendKey(ui::VKEY_TAB);
+  SendKey(ui::VKEY_TAB);
+  SendKey(ui::VKEY_TAB);
+  ASSERT_EQ(mini_view,
+            overview_session->highlight_controller()->highlighted_view());
+
+  // Tests that after hitting Ctrl + Shift + W, the desk is destroyed along with
+  // all it's app windows.
+  SendKey(ui::VKEY_W, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN);
+  WaitForMilliseconds(ToastData::kDefaultToastDuration.InMilliseconds());
+  EXPECT_EQ(1u, controller->desks().size());
+  EXPECT_FALSE(window1.is_valid());
+  EXPECT_FALSE(window2.is_valid());
+}
+
 // TODO(crbug.com/1308429): Should have tests for opening and closing the
 // DeskActionContextMenu (which should also add and remove the highlight
 // overview on the desk preview).
diff --git a/ash/wm/desks/templates/desks_templates_test_util.cc b/ash/wm/desks/templates/desks_templates_test_util.cc
index 8051612..3d4dc00 100644
--- a/ash/wm/desks/templates/desks_templates_test_util.cc
+++ b/ash/wm/desks/templates/desks_templates_test_util.cc
@@ -8,8 +8,8 @@
 #include "ash/style/close_button.h"
 #include "ash/wm/desks/desks_bar_view.h"
 #include "ash/wm/desks/expanded_desks_bar_button.h"
-#include "ash/wm/desks/templates/desks_templates_dialog_controller.h"
 #include "ash/wm/desks/templates/desks_templates_presenter.h"
+#include "ash/wm/desks/templates/saved_desk_dialog_controller.h"
 #include "ash/wm/desks/templates/saved_desk_item_view.h"
 #include "ash/wm/desks/zero_state_button.h"
 #include "ash/wm/overview/overview_grid.h"
@@ -102,23 +102,21 @@
 
 SavedDeskItemViewTestApi::~SavedDeskItemViewTestApi() = default;
 
-std::vector<DesksTemplatesIconView*> SavedDeskItemViewTestApi::GetIconViews()
-    const {
-  std::vector<DesksTemplatesIconView*> casted_icon_views;
+std::vector<SavedDeskIconView*> SavedDeskItemViewTestApi::GetIconViews() const {
+  std::vector<SavedDeskIconView*> casted_icon_views;
   for (auto* icon_view : item_view_->icon_container_view_->children()) {
-    casted_icon_views.push_back(
-        static_cast<DesksTemplatesIconView*>(icon_view));
+    casted_icon_views.push_back(static_cast<SavedDeskIconView*>(icon_view));
   }
   return casted_icon_views;
 }
 
-DesksTemplatesIconViewTestApi::DesksTemplatesIconViewTestApi(
-    const DesksTemplatesIconView* desks_templates_icon_view)
+SavedDeskIconViewTestApi::SavedDeskIconViewTestApi(
+    const SavedDeskIconView* desks_templates_icon_view)
     : desks_templates_icon_view_(desks_templates_icon_view) {
   DCHECK(desks_templates_icon_view_);
 }
 
-DesksTemplatesIconViewTestApi::~DesksTemplatesIconViewTestApi() = default;
+SavedDeskIconViewTestApi::~SavedDeskIconViewTestApi() = default;
 
 SavedDeskItemView* GetItemViewFromTemplatesGrid(int grid_item_index) {
   const auto* overview_grid = GetPrimaryOverviewGrid();
@@ -182,9 +180,9 @@
               : nullptr;
 }
 
-views::Button* GetDesksTemplatesDialogAcceptButton() {
+views::Button* GetSavedDeskDialogAcceptButton() {
   const views::Widget* dialog_widget =
-      DesksTemplatesDialogController::Get()->dialog_widget();
+      SavedDeskDialogController::Get()->dialog_widget();
   if (!dialog_widget)
     return nullptr;
   return dialog_widget->widget_delegate()->AsDialogDelegate()->GetOkButton();
diff --git a/ash/wm/desks/templates/desks_templates_test_util.h b/ash/wm/desks/templates/desks_templates_test_util.h
index 4c7bf3f..35a2040 100644
--- a/ash/wm/desks/templates/desks_templates_test_util.h
+++ b/ash/wm/desks/templates/desks_templates_test_util.h
@@ -9,8 +9,8 @@
 
 #include "ash/public/cpp/desk_template.h"
 #include "ash/wm/desks/templates/desks_templates_grid_view.h"
-#include "ash/wm/desks/templates/desks_templates_icon_container.h"
-#include "ash/wm/desks/templates/desks_templates_icon_view.h"
+#include "ash/wm/desks/templates/saved_desk_icon_container.h"
+#include "ash/wm/desks/templates/saved_desk_icon_view.h"
 #include "ash/wm/desks/templates/saved_desk_item_view.h"
 #include "ash/wm/desks/templates/saved_desk_name_view.h"
 #include "base/callback_helpers.h"
@@ -85,23 +85,22 @@
   }
 
   // Icons views are stored in the view hierarchy so this convenience function
-  // returns them as a vector of DesksTemplatesIconView*.
-  std::vector<DesksTemplatesIconView*> GetIconViews() const;
+  // returns them as a vector of SavedDeskIconView*.
+  std::vector<SavedDeskIconView*> GetIconViews() const;
 
  private:
   const SavedDeskItemView* item_view_;
 };
 
-// Wrapper for `DesksTemplatesIconView` that exposes internal state to test
+// Wrapper for `SavedDeskIconView` that exposes internal state to test
 // functions.
-class DesksTemplatesIconViewTestApi {
+class SavedDeskIconViewTestApi {
  public:
-  explicit DesksTemplatesIconViewTestApi(
-      const DesksTemplatesIconView* desks_templates_icon_view);
-  DesksTemplatesIconViewTestApi(const DesksTemplatesIconViewTestApi&) = delete;
-  DesksTemplatesIconViewTestApi& operator=(
-      const DesksTemplatesIconViewTestApi&) = delete;
-  ~DesksTemplatesIconViewTestApi();
+  explicit SavedDeskIconViewTestApi(
+      const SavedDeskIconView* desks_templates_icon_view);
+  SavedDeskIconViewTestApi(const SavedDeskIconViewTestApi&) = delete;
+  SavedDeskIconViewTestApi& operator=(const SavedDeskIconViewTestApi&) = delete;
+  ~SavedDeskIconViewTestApi();
 
   const views::Label* count_label() const {
     return desks_templates_icon_view_->count_label_;
@@ -111,12 +110,12 @@
     return desks_templates_icon_view_->icon_view_;
   }
 
-  const DesksTemplatesIconView* desks_templates_icon_view() const {
+  const SavedDeskIconView* desks_templates_icon_view() const {
     return desks_templates_icon_view_;
   }
 
  private:
-  const DesksTemplatesIconView* desks_templates_icon_view_;
+  const SavedDeskIconView* desks_templates_icon_view_;
 };
 
 // Return the `grid_item_index`th `SavedDeskItemView` from the first
@@ -129,7 +128,7 @@
 views::Button* GetSaveDeskAsTemplateButton();
 views::Button* GetTemplateItemButton(int index);
 views::Button* GetTemplateItemDeleteButton(int index);
-views::Button* GetDesksTemplatesDialogAcceptButton();
+views::Button* GetSavedDeskDialogAcceptButton();
 
 // A lot of the UI relies on calling into the local desk data manager to
 // update, which sends callbacks via posting tasks. Call
diff --git a/ash/wm/desks/templates/desks_templates_unittest.cc b/ash/wm/desks/templates/desks_templates_unittest.cc
index 80074621..4fcffb3 100644
--- a/ash/wm/desks/templates/desks_templates_unittest.cc
+++ b/ash/wm/desks/templates/desks_templates_unittest.cc
@@ -24,15 +24,15 @@
 #include "ash/wm/desks/desks_bar_view.h"
 #include "ash/wm/desks/desks_test_util.h"
 #include "ash/wm/desks/expanded_desks_bar_button.h"
-#include "ash/wm/desks/templates/desks_templates_dialog_controller.h"
 #include "ash/wm/desks/templates/desks_templates_grid_view.h"
-#include "ash/wm/desks/templates/desks_templates_icon_container.h"
-#include "ash/wm/desks/templates/desks_templates_icon_view.h"
 #include "ash/wm/desks/templates/desks_templates_metrics_util.h"
 #include "ash/wm/desks/templates/desks_templates_presenter.h"
 #include "ash/wm/desks/templates/desks_templates_test_util.h"
 #include "ash/wm/desks/templates/save_desk_template_button.h"
 #include "ash/wm/desks/templates/save_desk_template_button_container.h"
+#include "ash/wm/desks/templates/saved_desk_dialog_controller.h"
+#include "ash/wm/desks/templates/saved_desk_icon_container.h"
+#include "ash/wm/desks/templates/saved_desk_icon_view.h"
 #include "ash/wm/desks/templates/saved_desk_item_view.h"
 #include "ash/wm/desks/templates/saved_desk_name_view.h"
 #include "ash/wm/desks/zero_state_button.h"
@@ -284,7 +284,7 @@
 
     // Click the delete button on the delete dialog. Show delete dialog and
     // select accept.
-    auto* dialog_controller = DesksTemplatesDialogController::Get();
+    auto* dialog_controller = SavedDeskDialogController::Get();
     auto* dialog_delegate = dialog_controller->dialog_widget()
                                 ->widget_delegate()
                                 ->AsDialogDelegate();
@@ -722,7 +722,7 @@
   ASSERT_TRUE(GetOverviewSession());
 
   // Show one of the dialogs. Activating the dialog keeps us in overview mode.
-  auto* dialog_controller = DesksTemplatesDialogController::Get();
+  auto* dialog_controller = SavedDeskDialogController::Get();
   dialog_controller->ShowReplaceDialog(Shell::GetPrimaryRootWindow(), u"Bento",
                                        base::DoNothing(), base::DoNothing());
   EXPECT_TRUE(Shell::IsSystemModalWindowOpen());
@@ -1098,11 +1098,11 @@
   // Get the icon views.
   SavedDeskItemView* item_view = GetItemViewFromTemplatesGrid(
       /*grid_item_index=*/0);
-  const std::vector<DesksTemplatesIconView*>& icon_views =
+  const std::vector<SavedDeskIconView*>& icon_views =
       SavedDeskItemViewTestApi(item_view).GetIconViews();
 
   // The items previews should be ordered by activation index. Exclude the
-  // final DesksTemplatesIconView since it will be the overflow counter.
+  // final SavedDeskIconView since it will be the overflow counter.
   EXPECT_EQ(5u, icon_views.size());
   for (size_t i = 0; i < icon_views.size() - 2; ++i) {
     int current_id;
@@ -1161,7 +1161,7 @@
   // There is also the overflow icon, which is created but hidden.
   SavedDeskItemView* item_view = GetItemViewFromTemplatesGrid(
       /*grid_item_index=*/0);
-  const std::vector<DesksTemplatesIconView*>& icon_views =
+  const std::vector<SavedDeskIconView*>& icon_views =
       SavedDeskItemViewTestApi(item_view).GetIconViews();
   EXPECT_EQ(5u, icon_views.size());
 }
@@ -1213,7 +1213,7 @@
   // Get the icon views.
   SavedDeskItemView* item_view = GetItemViewFromTemplatesGrid(
       /*grid_item_index=*/0);
-  const std::vector<DesksTemplatesIconView*>& icon_views =
+  const std::vector<SavedDeskIconView*>& icon_views =
       SavedDeskItemViewTestApi(item_view).GetIconViews();
 
   // Check the icon views. The first two items should be the active tabs,
@@ -1259,7 +1259,7 @@
   // Get the icon views.
   SavedDeskItemView* item_view = GetItemViewFromTemplatesGrid(
       /*grid_item_index=*/0);
-  const std::vector<DesksTemplatesIconView*>& icon_views =
+  const std::vector<SavedDeskIconView*>& icon_views =
       SavedDeskItemViewTestApi(item_view).GetIconViews();
 
   // There should be one icon view for both the urls, and another icon view for
@@ -1276,13 +1276,13 @@
 }
 
 // Tests that the overflow count view is visible, in bounds, displays the right
-// count when there is more than `DesksTemplatesIconContainer::kMaxIcons` icons.
+// count when there is more than `SavedDeskIconContainer::kMaxIcons` icons.
 TEST_F(DesksTemplatesTest, OverflowIconView) {
   // Create a `DeskTemplate` using which has 1 app more than the max and each
   // app has 1 window.
   const int kNumOverflowApps = 1;
   std::vector<int> window_info(
-      kNumOverflowApps + DesksTemplatesIconContainer::kMaxIcons, 1);
+      kNumOverflowApps + SavedDeskIconContainer::kMaxIcons, 1);
   AddEntry(base::GUID::GenerateRandomV4(), "template_1", base::Time::Now(),
            DeskTemplateSource::kUser, DeskTemplateType::kTemplate,
            CreateRestoreData(window_info));
@@ -1292,17 +1292,17 @@
   // Get the icon views.
   SavedDeskItemView* item_view = GetItemViewFromTemplatesGrid(
       /*grid_item_index=*/0);
-  const std::vector<DesksTemplatesIconView*>& icon_views =
+  const std::vector<SavedDeskIconView*>& icon_views =
       SavedDeskItemViewTestApi(item_view).GetIconViews();
 
   // There should only be the max number of icons plus the overflow icon.
-  EXPECT_EQ(DesksTemplatesIconContainer::kMaxIcons + 1,
+  EXPECT_EQ(SavedDeskIconContainer::kMaxIcons + 1,
             static_cast<int>(icon_views.size()));
 
   // The overflow counter should have no identifier and its count should be
   // non-zero. It should also be visible and within the bounds of the host
   // SavedDeskItemView.
-  DesksTemplatesIconViewTestApi overflow_icon_view{icon_views.back()};
+  SavedDeskIconViewTestApi overflow_icon_view{icon_views.back()};
   EXPECT_FALSE(overflow_icon_view.icon_view());
   EXPECT_TRUE(overflow_icon_view.count_label());
   EXPECT_EQ(u"+1", overflow_icon_view.count_label()->GetText());
@@ -1312,17 +1312,17 @@
 }
 
 // Tests that when there isn't enough space to display
-// `DesksTemplatesIconContainer::kMaxIcons` icons and the overflow
+// `SavedDeskIconContainer::kMaxIcons` icons and the overflow
 // icon view, the overflow icon view is visible and its count incremented by the
 // number of icons that had to be hidden.
 TEST_F(DesksTemplatesTest, OverflowIconViewIncrementsForHiddenIcons) {
   // Create a `DeskTemplate` using which has 3 apps more than
-  // `DesksTemplatesIconContainer::kMaxIcons` and each app has 2 windows.
+  // `SavedDeskIconContainer::kMaxIcons` and each app has 2 windows.
   // With each app having 2 windows, only 2 app icon views and the overflow view
   // will be able to fit in the container, the rest will overflow.
   const int kNumOverflowApps = 3;
   std::vector<int> window_info(
-      kNumOverflowApps + DesksTemplatesIconContainer::kMaxIcons, 2);
+      kNumOverflowApps + SavedDeskIconContainer::kMaxIcons, 2);
   AddEntry(base::GUID::GenerateRandomV4(), "template_1", base::Time::Now(),
            DeskTemplateSource::kUser, DeskTemplateType::kTemplate,
            CreateRestoreData(window_info));
@@ -1332,13 +1332,13 @@
   // Get the icon views.
   SavedDeskItemView* item_view = GetItemViewFromTemplatesGrid(
       /*grid_item_index=*/0);
-  const std::vector<DesksTemplatesIconView*>& icon_views =
+  const std::vector<SavedDeskIconView*>& icon_views =
       SavedDeskItemViewTestApi(item_view).GetIconViews();
 
-  // Even though there are more than `DesksTemplatesIconContainer::kMaxIcons`,
-  // there should still be `DesksTemplatesIconContainer::kMaxIcons`+ 1
-  // DesksTemplatesIconView's created.
-  EXPECT_EQ(icon_views.size(), DesksTemplatesIconContainer::kMaxIcons + 1u);
+  // Even though there are more than `SavedDeskIconContainer::kMaxIcons`,
+  // there should still be `SavedDeskIconContainer::kMaxIcons`+ 1
+  // SavedDeskIconView's created.
+  EXPECT_EQ(icon_views.size(), SavedDeskIconContainer::kMaxIcons + 1u);
 
   // Count the number of hidden icon views and also check that there's a
   // contiguous block of visible icon views, followed by a contiguous block of
@@ -1365,7 +1365,7 @@
   // non-zero, accounting for the number of windows that are not represented by
   // app icons. It should also be visible and within the bounds of the host
   // SavedDeskItemView.
-  DesksTemplatesIconViewTestApi overflow_icon_view{icon_views.back()};
+  SavedDeskIconViewTestApi overflow_icon_view{icon_views.back()};
   EXPECT_FALSE(overflow_icon_view.icon_view());
   EXPECT_TRUE(overflow_icon_view.count_label());
 
@@ -1401,7 +1401,7 @@
   // Get the icon views.
   SavedDeskItemView* item_view = GetItemViewFromTemplatesGrid(
       /*grid_item_index=*/0);
-  const std::vector<DesksTemplatesIconView*>& icon_views =
+  const std::vector<SavedDeskIconView*>& icon_views =
       SavedDeskItemViewTestApi(item_view).GetIconViews();
 
   // There should be 1 * 2 icon views for the 2 apps with 1 window, 2 * 2 icon
@@ -1409,26 +1409,26 @@
   EXPECT_EQ(5u, icon_views.size());
 
   // Verify each of the apps' count labels are correct.
-  DesksTemplatesIconViewTestApi icon_view_1(icon_views[0]);
+  SavedDeskIconViewTestApi icon_view_1(icon_views[0]);
   EXPECT_TRUE(icon_view_1.icon_view());
   EXPECT_FALSE(icon_view_1.count_label());
 
-  DesksTemplatesIconViewTestApi icon_view_2(icon_views[1]);
+  SavedDeskIconViewTestApi icon_view_2(icon_views[1]);
   EXPECT_TRUE(icon_view_2.icon_view());
   EXPECT_FALSE(icon_view_2.count_label());
 
-  DesksTemplatesIconViewTestApi icon_view_3(icon_views[2]);
+  SavedDeskIconViewTestApi icon_view_3(icon_views[2]);
   EXPECT_TRUE(icon_view_3.icon_view());
   EXPECT_TRUE(icon_view_3.count_label());
   EXPECT_EQ(u"+1", icon_view_3.count_label()->GetText());
 
-  DesksTemplatesIconViewTestApi icon_view_4(icon_views[3]);
+  SavedDeskIconViewTestApi icon_view_4(icon_views[3]);
   EXPECT_TRUE(icon_view_4.icon_view());
   EXPECT_TRUE(icon_view_4.count_label());
   EXPECT_EQ(u"+1", icon_view_4.count_label()->GetText());
 
   // The overflow counter should display the number of excess windows.
-  DesksTemplatesIconViewTestApi overflow_icon_view{icon_views.back()};
+  SavedDeskIconViewTestApi overflow_icon_view{icon_views.back()};
   EXPECT_FALSE(overflow_icon_view.icon_view());
   EXPECT_TRUE(overflow_icon_view.count_label());
   EXPECT_EQ(u"+5", overflow_icon_view.count_label()->GetText());
@@ -1448,7 +1448,7 @@
   // Get the icon views.
   SavedDeskItemView* item_view = GetItemViewFromTemplatesGrid(
       /*grid_item_index=*/0);
-  const std::vector<DesksTemplatesIconView*>& icon_views =
+  const std::vector<SavedDeskIconView*>& icon_views =
       SavedDeskItemViewTestApi(item_view).GetIconViews();
 
   // There should only be 1 icon view for the app and 1 icon view for the
@@ -1456,7 +1456,7 @@
   EXPECT_EQ(2u, icon_views.size());
 
   // The app's icon view should have a "+99" label.
-  DesksTemplatesIconViewTestApi icon_view(icon_views[0]);
+  SavedDeskIconViewTestApi icon_view(icon_views[0]);
   EXPECT_TRUE(icon_view.icon_view());
   EXPECT_TRUE(icon_view.count_label());
   EXPECT_EQ(u"+99", icon_view.count_label()->GetText());
@@ -1465,12 +1465,12 @@
   EXPECT_FALSE(icon_views.back()->GetVisible());
 }
 
-// Tests that when there are less than `DesksTemplatesIconContainer::kMaxIcons`
+// Tests that when there are less than `SavedDeskIconContainer::kMaxIcons`
 // the overflow icon is not visible.
 TEST_F(DesksTemplatesTest, OverflowIconViewHiddenOnNoOverflow) {
   // Create a `DeskTemplate` using which has
-  // `DesksTemplatesIconContainer::kMaxIcons` apps and each app has 1 window.
-  std::vector<int> window_info(DesksTemplatesIconContainer::kMaxIcons, 1);
+  // `SavedDeskIconContainer::kMaxIcons` apps and each app has 1 window.
+  std::vector<int> window_info(SavedDeskIconContainer::kMaxIcons, 1);
   AddEntry(base::GUID::GenerateRandomV4(), "template_1", base::Time::Now(),
            DeskTemplateSource::kUser, DeskTemplateType::kTemplate,
            CreateRestoreData(window_info));
@@ -1480,7 +1480,7 @@
   // Get the icon views.
   SavedDeskItemView* item_view = GetItemViewFromTemplatesGrid(
       /*grid_item_index=*/0);
-  const std::vector<DesksTemplatesIconView*>& icon_views =
+  const std::vector<SavedDeskIconView*>& icon_views =
       SavedDeskItemViewTestApi(item_view).GetIconViews();
 
   // All the icon views should be visible and the overflow icon view should be
@@ -1511,14 +1511,14 @@
   // Get the icon views.
   SavedDeskItemView* item_view = GetItemViewFromTemplatesGrid(
       /*grid_item_index=*/0);
-  const std::vector<DesksTemplatesIconView*>& icon_views =
+  const std::vector<SavedDeskIconView*>& icon_views =
       SavedDeskItemViewTestApi(item_view).GetIconViews();
 
   // The 2 available app icons should be visible, and the overflow icon should
   // contain the hidden (0) + unavailable (2) app counts.
   EXPECT_EQ(3u, icon_views.size());
 
-  DesksTemplatesIconViewTestApi overflow_icon_view{icon_views.back()};
+  SavedDeskIconViewTestApi overflow_icon_view{icon_views.back()};
   EXPECT_FALSE(overflow_icon_view.icon_view());
   EXPECT_TRUE(overflow_icon_view.count_label());
   EXPECT_EQ(u"+2", overflow_icon_view.count_label()->GetText());
@@ -1545,14 +1545,14 @@
   // Get the icon views.
   SavedDeskItemView* item_view = GetItemViewFromTemplatesGrid(
       /*grid_item_index=*/0);
-  const std::vector<DesksTemplatesIconView*>& icon_views =
+  const std::vector<SavedDeskIconView*>& icon_views =
       SavedDeskItemViewTestApi(item_view).GetIconViews();
 
   // The 4 available app icons should be visible, and the overflow icon should
   // contain the hidden (2) + unavailable (2) app counts.
   EXPECT_EQ(5u, icon_views.size());
 
-  DesksTemplatesIconViewTestApi overflow_icon_view{icon_views.back()};
+  SavedDeskIconViewTestApi overflow_icon_view{icon_views.back()};
   EXPECT_FALSE(overflow_icon_view.icon_view());
   EXPECT_TRUE(overflow_icon_view.count_label());
   EXPECT_EQ(u"+4", overflow_icon_view.count_label()->GetText());
@@ -1578,14 +1578,14 @@
   // Get the icon views.
   SavedDeskItemView* item_view = GetItemViewFromTemplatesGrid(
       /*grid_item_index=*/0);
-  const std::vector<DesksTemplatesIconView*>& icon_views =
+  const std::vector<SavedDeskIconView*>& icon_views =
       SavedDeskItemViewTestApi(item_view).GetIconViews();
 
   // The only added icon view is the overflow icon, and it should have a "10"
   // label without the plus sign.
   EXPECT_EQ(1u, icon_views.size());
 
-  DesksTemplatesIconViewTestApi overflow_icon_view{icon_views.back()};
+  SavedDeskIconViewTestApi overflow_icon_view{icon_views.back()};
   EXPECT_FALSE(overflow_icon_view.icon_view());
   EXPECT_TRUE(overflow_icon_view.count_label());
   EXPECT_EQ(u"10", overflow_icon_view.count_label()->GetText());
@@ -1849,7 +1849,7 @@
 
   // Decline the dialog. We should stay in overview and no template should have
   // been saved.
-  auto* dialog_controller = DesksTemplatesDialogController::Get();
+  auto* dialog_controller = SavedDeskDialogController::Get();
   dialog_controller->dialog_widget()
       ->widget_delegate()
       ->AsDialogDelegate()
@@ -1865,7 +1865,7 @@
 
   // Accept the dialog. The template should have been saved and the templates
   // grid should now be shown.
-  dialog_controller = DesksTemplatesDialogController::Get();
+  dialog_controller = SavedDeskDialogController::Get();
   dialog_controller->dialog_widget()
       ->widget_delegate()
       ->AsDialogDelegate()
@@ -2992,7 +2992,7 @@
   SavedDeskItemView* item_view = GetItemViewFromTemplatesGrid(
       /*grid_item_index=*/1);
   // Show replace dialogs.
-  auto* dialog_controller = DesksTemplatesDialogController::Get();
+  auto* dialog_controller = SavedDeskDialogController::Get();
   auto callback = base::BindLambdaForTesting(
       [&]() { item_view->ReplaceTemplate(uuid_1.AsLowercaseString()); });
 
diff --git a/ash/wm/desks/templates/restore_data_collector.cc b/ash/wm/desks/templates/restore_data_collector.cc
index d06d168c..c0cad51 100644
--- a/ash/wm/desks/templates/restore_data_collector.cc
+++ b/ash/wm/desks/templates/restore_data_collector.cc
@@ -6,7 +6,7 @@
 
 #include "ash/public/cpp/desks_templates_delegate.h"
 #include "ash/shell.h"
-#include "ash/wm/desks/templates/desks_templates_dialog_controller.h"
+#include "ash/wm/desks/templates/saved_desk_dialog_controller.h"
 #include "ash/wm/mru_window_tracker.h"
 #include "ash/wm/overview/overview_controller.h"
 #include "ash/wm/window_restore/window_restore_util.h"
@@ -148,7 +148,7 @@
 
     // There were some unsupported apps in the active desk so open up a dialog
     // to let the user know.
-    DesksTemplatesDialogController::Get()->ShowUnsupportedAppsDialog(
+    SavedDeskDialogController::Get()->ShowUnsupportedAppsDialog(
         root_window_to_show, std::move(call.unsupported_apps),
         std::move(call.callback), std::move(desk_template));
   } else {
diff --git a/ash/wm/desks/templates/save_desk_template_button.cc b/ash/wm/desks/templates/save_desk_template_button.cc
index 722e6fcb..7d3d66b 100644
--- a/ash/wm/desks/templates/save_desk_template_button.cc
+++ b/ash/wm/desks/templates/save_desk_template_button.cc
@@ -33,7 +33,7 @@
   callback_.Run();
 }
 
-void SaveDeskTemplateButton::MaybeCloseHighlightedView() {}
+void SaveDeskTemplateButton::MaybeCloseHighlightedView(bool primary_action) {}
 
 void SaveDeskTemplateButton::MaybeSwapHighlightedView(bool right) {}
 
diff --git a/ash/wm/desks/templates/save_desk_template_button.h b/ash/wm/desks/templates/save_desk_template_button.h
index a011e39..49d1504 100644
--- a/ash/wm/desks/templates/save_desk_template_button.h
+++ b/ash/wm/desks/templates/save_desk_template_button.h
@@ -40,7 +40,7 @@
   // OverviewHighlightableView:
   views::View* GetView() override;
   void MaybeActivateHighlightedView() override;
-  void MaybeCloseHighlightedView() override;
+  void MaybeCloseHighlightedView(bool primary_action) override;
   void MaybeSwapHighlightedView(bool right) override;
   void OnViewHighlighted() override;
   void OnViewUnhighlighted() override;
diff --git a/ash/wm/desks/templates/desks_templates_dialog_controller.cc b/ash/wm/desks/templates/saved_desk_dialog_controller.cc
similarity index 81%
rename from ash/wm/desks/templates/desks_templates_dialog_controller.cc
rename to ash/wm/desks/templates/saved_desk_dialog_controller.cc
index fea0428..94db992 100644
--- a/ash/wm/desks/templates/desks_templates_dialog_controller.cc
+++ b/ash/wm/desks/templates/saved_desk_dialog_controller.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ash/wm/desks/templates/desks_templates_dialog_controller.h"
+#include "ash/wm/desks/templates/saved_desk_dialog_controller.h"
 
 #include "ash/constants/app_types.h"
 #include "ash/public/cpp/desks_templates_delegate.h"
@@ -10,8 +10,8 @@
 #include "ash/strings/grit/ash_strings.h"
 #include "ash/style/ash_color_provider.h"
 #include "ash/wm/desks/templates/desks_templates_grid_view.h"
-#include "ash/wm/desks/templates/desks_templates_icon_container.h"
 #include "ash/wm/desks/templates/desks_templates_metrics_util.h"
+#include "ash/wm/desks/templates/saved_desk_icon_container.h"
 #include "ash/wm/desks/templates/saved_desk_item_view.h"
 #include "ash/wm/overview/overview_controller.h"
 #include "ash/wm/overview/overview_grid.h"
@@ -32,7 +32,7 @@
 
 namespace {
 
-DesksTemplatesDialogController* g_instance = nullptr;
+SavedDeskDialogController* g_instance = nullptr;
 
 std::u16string GetStringWithQuotes(const std::u16string& str) {
   return u"\"" + str + u"\"";
@@ -43,11 +43,11 @@
 // The client view of the dialog. Contains a label which is a description, and
 // optionally a couple images of unsupported apps. This dialog will block the
 // entire system.
-class DesksTemplatesDialog : public views::DialogDelegateView {
+class SavedDeskDialog : public views::DialogDelegateView {
  public:
-  METADATA_HEADER(DesksTemplatesDialog);
+  METADATA_HEADER(SavedDeskDialog);
 
-  DesksTemplatesDialog() {
+  SavedDeskDialog() {
     SetModalType(ui::MODAL_TYPE_SYSTEM);
     SetShowCloseButton(false);
     SetButtonLabel(ui::DIALOG_BUTTON_CANCEL,
@@ -74,9 +74,9 @@
             .SetHorizontalAlignment(gfx::ALIGN_LEFT)
             .Build());
   }
-  DesksTemplatesDialog(const DesksTemplatesDialog&) = delete;
-  DesksTemplatesDialog& operator=(const DesksTemplatesDialog&) = delete;
-  ~DesksTemplatesDialog() override = default;
+  SavedDeskDialog(const SavedDeskDialog&) = delete;
+  SavedDeskDialog& operator=(const SavedDeskDialog&) = delete;
+  ~SavedDeskDialog() override = default;
 
   void SetTitleText(int message_id) {
     SetTitle(l10n_util::GetStringUTF16(message_id));
@@ -100,34 +100,32 @@
   views::Label* description_label_ = nullptr;
 };
 
-BEGIN_VIEW_BUILDER(/* no export */,
-                   DesksTemplatesDialog,
-                   views::DialogDelegateView)
+BEGIN_VIEW_BUILDER(/* no export */, SavedDeskDialog, views::DialogDelegateView)
 VIEW_BUILDER_PROPERTY(int, TitleText)
 VIEW_BUILDER_PROPERTY(int, ConfirmButtonText)
 VIEW_BUILDER_PROPERTY(std::u16string, DescriptionText)
 VIEW_BUILDER_PROPERTY(std::u16string, DescriptionAccessibleName)
 END_VIEW_BUILDER
 
-BEGIN_METADATA(DesksTemplatesDialog, views::DialogDelegateView)
+BEGIN_METADATA(SavedDeskDialog, views::DialogDelegateView)
 END_METADATA
 
 }  // namespace ash
 
 // Must be in global namespace and defined before usage.
-DEFINE_VIEW_BUILDER(/* no export */, ash::DesksTemplatesDialog)
+DEFINE_VIEW_BUILDER(/* no export */, ash::SavedDeskDialog)
 
 namespace ash {
 
 //-----------------------------------------------------------------------------
-// DesksTemplatesDialogController:
+// SavedDeskDialogController:
 
-DesksTemplatesDialogController::DesksTemplatesDialogController() {
+SavedDeskDialogController::SavedDeskDialogController() {
   DCHECK_EQ(nullptr, g_instance);
   g_instance = this;
 }
 
-DesksTemplatesDialogController::~DesksTemplatesDialogController() {
+SavedDeskDialogController::~SavedDeskDialogController() {
   if (dialog_widget_ && !dialog_widget_->IsClosed())
     dialog_widget_->CloseNow();
 
@@ -136,12 +134,12 @@
 }
 
 // static
-DesksTemplatesDialogController* DesksTemplatesDialogController::Get() {
+SavedDeskDialogController* SavedDeskDialogController::Get() {
   DCHECK(g_instance);
   return g_instance;
 }
 
-void DesksTemplatesDialogController::ShowUnsupportedAppsDialog(
+void SavedDeskDialogController::ShowUnsupportedAppsDialog(
     aura::Window* root_window,
     const std::vector<aura::Window*>& unsupported_apps,
     DesksController::GetDeskTemplateCallback callback,
@@ -187,23 +185,20 @@
   }
 
   auto dialog =
-      views::Builder<DesksTemplatesDialog>()
+      views::Builder<SavedDeskDialog>()
           .SetTitleText(IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_APPS_DIALOG_TITLE)
           .SetConfirmButtonText(
               IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_APPS_DIALOG_CONFIRM_BUTTON)
           .SetDescriptionText(l10n_util::GetStringUTF16(app_description_id))
-          .SetCancelCallback(
-              base::BindOnce(&DesksTemplatesDialogController::
-                                 OnUserCanceledUnsupportedAppsDialog,
-                             weak_ptr_factory_.GetWeakPtr()))
-          .SetCloseCallback(
-              base::BindOnce(&DesksTemplatesDialogController::
-                                 OnUserCanceledUnsupportedAppsDialog,
-                             weak_ptr_factory_.GetWeakPtr()))
-          .SetAcceptCallback(
-              base::BindOnce(&DesksTemplatesDialogController::
-                                 OnUserAcceptedUnsupportedAppsDialog,
-                             weak_ptr_factory_.GetWeakPtr()))
+          .SetCancelCallback(base::BindOnce(
+              &SavedDeskDialogController::OnUserCanceledUnsupportedAppsDialog,
+              weak_ptr_factory_.GetWeakPtr()))
+          .SetCloseCallback(base::BindOnce(
+              &SavedDeskDialogController::OnUserCanceledUnsupportedAppsDialog,
+              weak_ptr_factory_.GetWeakPtr()))
+          .SetAcceptCallback(base::BindOnce(
+              &SavedDeskDialogController::OnUserAcceptedUnsupportedAppsDialog,
+              weak_ptr_factory_.GetWeakPtr()))
           .AddChildren(
               views::Builder<views::Label>()
                   .SetHorizontalAlignment(gfx::ALIGN_LEFT)
@@ -215,19 +210,19 @@
                               kTextColorPrimary))
                   .SetText(l10n_util::GetStringUTF16(
                       IDS_ASH_DESKS_TEMPLATES_UNSUPPORTED_APPS_DIALOG_HEADER)),
-              views::Builder<DesksTemplatesIconContainer>()
+              views::Builder<SavedDeskIconContainer>()
                   .PopulateIconContainerFromWindows(unsupported_apps))
           .Build();
   CreateDialogWidget(std::move(dialog), root_window);
   RecordUnsupportedAppDialogShowHistogram();
 }
 
-void DesksTemplatesDialogController::ShowReplaceDialog(
+void SavedDeskDialogController::ShowReplaceDialog(
     aura::Window* root_window,
     const std::u16string& template_name,
     base::OnceClosure on_accept_callback,
     base::OnceClosure on_cancel_callback) {
-  auto dialog = views::Builder<DesksTemplatesDialog>()
+  auto dialog = views::Builder<SavedDeskDialog>()
                     .SetTitleText(IDS_ASH_DESKS_TEMPLATES_REPLACE_DIALOG_TITLE)
                     .SetConfirmButtonText(
                         IDS_ASH_DESKS_TEMPLATES_REPLACE_DIALOG_CONFIRM_BUTTON)
@@ -243,12 +238,12 @@
   CreateDialogWidget(std::move(dialog), root_window);
 }
 
-void DesksTemplatesDialogController::ShowDeleteDialog(
+void SavedDeskDialogController::ShowDeleteDialog(
     aura::Window* root_window,
     const std::u16string& template_name,
     base::OnceClosure on_accept_callback) {
   auto dialog =
-      views::Builder<DesksTemplatesDialog>()
+      views::Builder<SavedDeskDialog>()
           .SetTitleText(IDS_ASH_DESKS_TEMPLATES_DELETE_DIALOG_TITLE)
           .SetButtonLabel(
               ui::DIALOG_BUTTON_OK,
@@ -265,7 +260,7 @@
   CreateDialogWidget(std::move(dialog), root_window);
 }
 
-void DesksTemplatesDialogController::OnWidgetDestroying(views::Widget* widget) {
+void SavedDeskDialogController::OnWidgetDestroying(views::Widget* widget) {
   DCHECK_EQ(dialog_widget_, widget);
   for (auto& overview_grid :
        Shell::Get()->overview_controller()->overview_session()->grid_list()) {
@@ -287,8 +282,8 @@
   dialog_widget_ = nullptr;
 }
 
-void DesksTemplatesDialogController::CreateDialogWidget(
-    std::unique_ptr<DesksTemplatesDialog> dialog,
+void SavedDeskDialogController::CreateDialogWidget(
+    std::unique_ptr<SavedDeskDialog> dialog,
     aura::Window* root_window) {
   if (dialog_widget_)
     dialog_widget_->CloseNow();
@@ -304,14 +299,14 @@
   dialog_widget_observation_.Observe(dialog_widget_);
 }
 
-void DesksTemplatesDialogController::OnUserAcceptedUnsupportedAppsDialog() {
+void SavedDeskDialogController::OnUserAcceptedUnsupportedAppsDialog() {
   DCHECK(!unsupported_apps_callback_.is_null());
   DCHECK(unsupported_apps_template_);
   std::move(unsupported_apps_callback_)
       .Run(std::move(unsupported_apps_template_));
 }
 
-void DesksTemplatesDialogController::OnUserCanceledUnsupportedAppsDialog() {
+void SavedDeskDialogController::OnUserCanceledUnsupportedAppsDialog() {
   DCHECK(!unsupported_apps_callback_.is_null());
   std::move(unsupported_apps_callback_).Run(nullptr);
   unsupported_apps_template_.reset();
diff --git a/ash/wm/desks/templates/desks_templates_dialog_controller.h b/ash/wm/desks/templates/saved_desk_dialog_controller.h
similarity index 77%
rename from ash/wm/desks/templates/desks_templates_dialog_controller.h
rename to ash/wm/desks/templates/saved_desk_dialog_controller.h
index a98f5e3f..f84c6c43 100644
--- a/ash/wm/desks/templates/desks_templates_dialog_controller.h
+++ b/ash/wm/desks/templates/saved_desk_dialog_controller.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ASH_WM_DESKS_TEMPLATES_DESKS_TEMPLATES_DIALOG_CONTROLLER_H_
-#define ASH_WM_DESKS_TEMPLATES_DESKS_TEMPLATES_DIALOG_CONTROLLER_H_
+#ifndef ASH_WM_DESKS_TEMPLATES_SAVED_DESK_DIALOG_CONTROLLER_H_
+#define ASH_WM_DESKS_TEMPLATES_SAVED_DESK_DIALOG_CONTROLLER_H_
 
 #include <memory>
 
@@ -22,22 +22,21 @@
 
 namespace ash {
 
-class DesksTemplatesDialog;
+class SavedDeskDialog;
 
-// DesksTemplatesDialogController controls when to show the various confirmation
+// SavedDeskDialogController controls when to show the various confirmation
 // dialogs for modifying desk templates.
-class ASH_EXPORT DesksTemplatesDialogController : public views::WidgetObserver {
+class ASH_EXPORT SavedDeskDialogController : public views::WidgetObserver {
  public:
-  DesksTemplatesDialogController();
-  DesksTemplatesDialogController(const DesksTemplatesDialogController&) =
+  SavedDeskDialogController();
+  SavedDeskDialogController(const SavedDeskDialogController&) = delete;
+  SavedDeskDialogController& operator=(const SavedDeskDialogController&) =
       delete;
-  DesksTemplatesDialogController& operator=(
-      const DesksTemplatesDialogController&) = delete;
-  ~DesksTemplatesDialogController() override;
+  ~SavedDeskDialogController() override;
 
   // Convenience function to get the controller instance, which is created and
   // owned by OverviewSession.
-  static DesksTemplatesDialogController* Get();
+  static SavedDeskDialogController* Get();
 
   const views::Widget* dialog_widget() const { return dialog_widget_; }
 
@@ -66,7 +65,7 @@
 
  private:
   // Creates and shows the dialog on `root_window`.
-  void CreateDialogWidget(std::unique_ptr<DesksTemplatesDialog> dialog,
+  void CreateDialogWidget(std::unique_ptr<SavedDeskDialog> dialog,
                           aura::Window* root_window);
 
   // Callbacks for when a user has either accepted the unsupported apps dialog
@@ -86,9 +85,9 @@
   base::ScopedObservation<views::Widget, views::WidgetObserver>
       dialog_widget_observation_{this};
 
-  base::WeakPtrFactory<DesksTemplatesDialogController> weak_ptr_factory_{this};
+  base::WeakPtrFactory<SavedDeskDialogController> weak_ptr_factory_{this};
 };
 
 }  // namespace ash
 
-#endif  // ASH_WM_DESKS_TEMPLATES_DESKS_TEMPLATES_DIALOG_CONTROLLER_H_
+#endif  // ASH_WM_DESKS_TEMPLATES_SAVED_DESK_DIALOG_CONTROLLER_H_
diff --git a/ash/wm/desks/templates/desks_templates_icon_container.cc b/ash/wm/desks/templates/saved_desk_icon_container.cc
similarity index 86%
rename from ash/wm/desks/templates/desks_templates_icon_container.cc
rename to ash/wm/desks/templates/saved_desk_icon_container.cc
index c9fdd13..ee9c4e0 100644
--- a/ash/wm/desks/templates/desks_templates_icon_container.cc
+++ b/ash/wm/desks/templates/saved_desk_icon_container.cc
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ash/wm/desks/templates/desks_templates_icon_container.h"
+#include "ash/wm/desks/templates/saved_desk_icon_container.h"
 
 #include "ash/public/cpp/desk_template.h"
 #include "ash/public/cpp/desks_templates_delegate.h"
@@ -10,7 +10,7 @@
 #include "ash/public/cpp/window_properties.h"
 #include "ash/shell.h"
 #include "ash/style/ash_color_provider.h"
-#include "ash/wm/desks/templates/desks_templates_icon_view.h"
+#include "ash/wm/desks/templates/saved_desk_icon_view.h"
 #include "base/containers/contains.h"
 #include "components/app_constants/constants.h"
 #include "components/app_restore/app_launch_info.h"
@@ -35,13 +35,13 @@
 
 // Given a map of unique icon identifiers to icon info, returns a vector of the
 // same key, value pair ordered by icons' activation index.
-std::vector<DesksTemplatesIconContainer::IconIdentifierAndIconInfo>
+std::vector<SavedDeskIconContainer::IconIdentifierAndIconInfo>
 SortIconIdentifierToIconInfo(
-    std::map<std::string, DesksTemplatesIconContainer::IconInfo>&
+    std::map<std::string, SavedDeskIconContainer::IconInfo>&
         icon_identifier_to_icon_info) {
   // Create a vector using `sorted_icon_identifier_to_icon_info` that contains
   // pairs of identifiers and counts. This will initially be unsorted.
-  std::vector<DesksTemplatesIconContainer::IconIdentifierAndIconInfo>
+  std::vector<SavedDeskIconContainer::IconIdentifierAndIconInfo>
       sorted_icon_identifier_to_icon_info;
 
   for (const auto& entry : icon_identifier_to_icon_info) {
@@ -56,9 +56,8 @@
       sorted_icon_identifier_to_icon_info.begin(),
       sorted_icon_identifier_to_icon_info.end(),
       [&icon_identifier_to_icon_info](
-          const DesksTemplatesIconContainer::IconIdentifierAndIconInfo& data_1,
-          const DesksTemplatesIconContainer::IconIdentifierAndIconInfo&
-              data_2) {
+          const SavedDeskIconContainer::IconIdentifierAndIconInfo& data_1,
+          const SavedDeskIconContainer::IconIdentifierAndIconInfo& data_2) {
         return icon_identifier_to_icon_info.at(data_1.first).activation_index <
                icon_identifier_to_icon_info.at(data_2.first).activation_index;
       });
@@ -74,7 +73,7 @@
     const std::u16string& app_title,
     const std::string& identifier,
     int activation_index,
-    std::map<std::string, DesksTemplatesIconContainer::IconInfo>*
+    std::map<std::string, SavedDeskIconContainer::IconInfo>*
         out_icon_identifier_to_icon_info) {
   // A single app/site can have multiple windows so count their occurrences and
   // use the smallest activation index for sorting purposes.
@@ -95,7 +94,7 @@
 void InsertIconIdentifierToIconInfoFromLaunchList(
     const std::string& app_id,
     const app_restore::RestoreData::LaunchList& launch_list,
-    std::map<std::string, DesksTemplatesIconContainer::IconInfo>*
+    std::map<std::string, SavedDeskIconContainer::IconInfo>*
         out_icon_identifier_to_icon_info) {
   // We want to group active tabs and apps ahead of inactive tabs so offsets
   // inactive tabs activation index by `kInactiveTabOffset`. In almost every use
@@ -152,16 +151,16 @@
 
 }  // namespace
 
-DesksTemplatesIconContainer::DesksTemplatesIconContainer() {
-  views::Builder<DesksTemplatesIconContainer>(this)
+SavedDeskIconContainer::SavedDeskIconContainer() {
+  views::Builder<SavedDeskIconContainer>(this)
       .SetOrientation(views::BoxLayout::Orientation::kHorizontal)
       .SetBetweenChildSpacing(kIconSpacingDp)
       .BuildChildren();
 }
 
-DesksTemplatesIconContainer::~DesksTemplatesIconContainer() = default;
+SavedDeskIconContainer::~SavedDeskIconContainer() = default;
 
-void DesksTemplatesIconContainer::PopulateIconContainerFromTemplate(
+void SavedDeskIconContainer::PopulateIconContainerFromTemplate(
     DeskTemplate* desk_template) {
   const app_restore::RestoreData* restore_data =
       desk_template->desk_restore_data();
@@ -182,7 +181,7 @@
       SortIconIdentifierToIconInfo(icon_identifier_to_icon_info));
 }
 
-void DesksTemplatesIconContainer::PopulateIconContainerFromWindows(
+void SavedDeskIconContainer::PopulateIconContainerFromWindows(
     const std::vector<aura::Window*>& windows) {
   DCHECK(!windows.empty());
 
@@ -217,7 +216,7 @@
       SortIconIdentifierToIconInfo(icon_identifier_to_icon_info));
 }
 
-void DesksTemplatesIconContainer::Layout() {
+void SavedDeskIconContainer::Layout() {
   views::BoxLayoutView::Layout();
 
   auto icon_views = children();
@@ -228,8 +227,7 @@
   // Use the preferred size of this since this will provide the width as if
   // every view in `icon_views` is shown.
   int used_horizontal_space = GetPreferredSize().width();
-  auto* overflow_icon_view =
-      static_cast<DesksTemplatesIconView*>(icon_views.back());
+  auto* overflow_icon_view = static_cast<SavedDeskIconView*>(icon_views.back());
   if (used_horizontal_space > available_horizontal_space) {
     // Reverse iterate through `icon_views` starting with the first
     // non-overflow icon view (i.e. the second-last element). Hide as many icons
@@ -241,8 +239,7 @@
         used_horizontal_space -=
             ((*it)->GetPreferredSize().width() + kIconSpacingDp);
         (*it)->SetVisible(false);
-        num_hidden_icons +=
-            static_cast<DesksTemplatesIconView*>((*it))->count();
+        num_hidden_icons += static_cast<SavedDeskIconView*>((*it))->count();
       }
 
       if (used_horizontal_space <= available_horizontal_space)
@@ -258,7 +255,7 @@
   }
 }
 
-void DesksTemplatesIconContainer::CreateIconViewsFromIconIdentifiers(
+void SavedDeskIconContainer::CreateIconViewsFromIconIdentifiers(
     const std::vector<IconIdentifierAndIconInfo>&
         icon_identifier_to_icon_info) {
   DCHECK(children().empty());
@@ -274,18 +271,18 @@
     // Don't create new icons once we have reached the max, or if the app is
     // unavailable (uninstalled or unsupported). Count the amount of skipped
     // apps so we know what to display on the overflow. In addition, dialog
-    // popups may show incognito window icons. Saved templates will not have
+    // popups may show incognito window icons. Saved desks will not have
     // incognito window icon identifiers and will not count them here.
     if (children().size() < kMaxIcons &&
         (icon_identifier == DeskTemplate::kIncognitoWindowIdentifier ||
          delegate->IsAppAvailable(icon_info.app_id))) {
-      DesksTemplatesIconView* icon_view =
-          AddChildView(views::Builder<DesksTemplatesIconView>()
+      SavedDeskIconView* icon_view =
+          AddChildView(views::Builder<SavedDeskIconView>()
                            .SetBackground(views::CreateRoundedRectBackground(
                                AshColorProvider::Get()->GetControlsLayerColor(
                                    AshColorProvider::ControlsLayerType::
                                        kControlBackgroundColorInactive),
-                               DesksTemplatesIconView::kIconViewSize / 2))
+                               SavedDeskIconView::kIconViewSize / 2))
                            .Build());
       icon_view->SetIconIdentifierAndCount(icon_identifier, icon_info.app_id,
                                            icon_info.app_title, icon_info.count,
@@ -299,15 +296,15 @@
   // apps so we should *not* show plus.
   const bool show_plus = !children().empty();
 
-  // Always add a `DesksTemplatesIconView` overflow counter in case the width
+  // Always add a `SavedDeskIconView` overflow counter in case the width
   // of the view changes. It will be hidden if not needed.
-  DesksTemplatesIconView* overflow_icon_view =
-      AddChildView(views::Builder<DesksTemplatesIconView>()
+  SavedDeskIconView* overflow_icon_view =
+      AddChildView(views::Builder<SavedDeskIconView>()
                        .SetBackground(views::CreateRoundedRectBackground(
                            AshColorProvider::Get()->GetControlsLayerColor(
                                AshColorProvider::ControlsLayerType::
                                    kControlBackgroundColorInactive),
-                           DesksTemplatesIconView::kIconViewSize / 2))
+                           SavedDeskIconView::kIconViewSize / 2))
                        .Build());
 
   // Set `icon_identifier`, `app_id` and `app_title` to be empty strings for
@@ -318,7 +315,7 @@
       /*count=*/num_hidden_icons, show_plus);
 }
 
-BEGIN_METADATA(DesksTemplatesIconContainer, views::BoxLayoutView)
+BEGIN_METADATA(SavedDeskIconContainer, views::BoxLayoutView)
 END_METADATA
 
 }  // namespace ash
diff --git a/ash/wm/desks/templates/desks_templates_icon_container.h b/ash/wm/desks/templates/saved_desk_icon_container.h
similarity index 73%
rename from ash/wm/desks/templates/desks_templates_icon_container.h
rename to ash/wm/desks/templates/saved_desk_icon_container.h
index cc7c736..3696945 100644
--- a/ash/wm/desks/templates/desks_templates_icon_container.h
+++ b/ash/wm/desks/templates/saved_desk_icon_container.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ASH_WM_DESKS_TEMPLATES_DESKS_TEMPLATES_ICON_CONTAINER_H_
-#define ASH_WM_DESKS_TEMPLATES_DESKS_TEMPLATES_ICON_CONTAINER_H_
+#ifndef ASH_WM_DESKS_TEMPLATES_SAVED_DESK_ICON_CONTAINER_H_
+#define ASH_WM_DESKS_TEMPLATES_SAVED_DESK_ICON_CONTAINER_H_
 
 #include <string>
 #include <utility>
@@ -19,11 +19,11 @@
 namespace ash {
 
 class DeskTemplate;
-class DesksTemplatesIconView;
+class SavedDeskIconView;
 
 // This class for determines which app icons/favicons to show for a desk
-// template and creates the according DesksTemplatesIconView's for them.
-// The last DesksTemplatesIconView in the layout is used for storing the
+// template and creates the according SavedDeskIconView's for them.
+// The last SavedDeskIconView in the layout is used for storing the
 // overflow count of icons. Not every view in the container is visible.
 //   _______________________________________________________________________
 //   |  _________  _________   _________________   _________   _________   |
@@ -36,9 +36,9 @@
 // once with a +N label attached, up to +99. If there are too many icons to be
 // displayed within the given width, we draw as many and a label at the end that
 // says +N, up to +99.
-class DesksTemplatesIconContainer : public views::BoxLayoutView {
+class SavedDeskIconContainer : public views::BoxLayoutView {
  public:
-  METADATA_HEADER(DesksTemplatesIconContainer);
+  METADATA_HEADER(SavedDeskIconContainer);
 
   // A struct for storing the various information used to determine which app
   // icons/favicons to display.
@@ -51,11 +51,10 @@
 
   using IconIdentifierAndIconInfo = std::pair<std::string, IconInfo>;
 
-  DesksTemplatesIconContainer();
-  DesksTemplatesIconContainer(const DesksTemplatesIconContainer&) = delete;
-  DesksTemplatesIconContainer& operator=(const DesksTemplatesIconContainer&) =
-      delete;
-  ~DesksTemplatesIconContainer() override;
+  SavedDeskIconContainer();
+  SavedDeskIconContainer(const SavedDeskIconContainer&) = delete;
+  SavedDeskIconContainer& operator=(const SavedDeskIconContainer&) = delete;
+  ~SavedDeskIconContainer() override;
 
   // The maximum number of icons that can be displayed.
   static constexpr int kMaxIcons = 4;
@@ -64,12 +63,12 @@
     return incognito_window_color_provider_;
   }
 
-  // Given a desk template, determine which icons to show in this and create
-  // the according DesksTemplatesIconView's.
+  // Given a saved desk, determine which icons to show in this and create
+  // the according SavedDeskIconView's.
   void PopulateIconContainerFromTemplate(DeskTemplate* desk_template);
 
   // Given `windows`, determine which icons to show in this and create the
-  // according DesksTemplatesIconView's.
+  // according SavedDeskIconView's.
   void PopulateIconContainerFromWindows(
       const std::vector<aura::Window*>& windows);
 
@@ -89,7 +88,7 @@
 };
 
 BEGIN_VIEW_BUILDER(/* no export */,
-                   DesksTemplatesIconContainer,
+                   SavedDeskIconContainer,
                    views::BoxLayoutView)
 VIEW_BUILDER_METHOD(PopulateIconContainerFromTemplate, DeskTemplate*)
 VIEW_BUILDER_METHOD(PopulateIconContainerFromWindows,
@@ -98,6 +97,6 @@
 
 }  // namespace ash
 
-DEFINE_VIEW_BUILDER(/* no export */, ash::DesksTemplatesIconContainer)
+DEFINE_VIEW_BUILDER(/* no export */, ash::SavedDeskIconContainer)
 
-#endif  // ASH_WM_DESKS_TEMPLATES_DESKS_TEMPLATES_ICON_CONTAINER_H_
+#endif  // ASH_WM_DESKS_TEMPLATES_SAVED_DESK_ICON_CONTAINER_H_
diff --git a/ash/wm/desks/templates/desks_templates_icon_view.cc b/ash/wm/desks/templates/saved_desk_icon_view.cc
similarity index 87%
rename from ash/wm/desks/templates/desks_templates_icon_view.cc
rename to ash/wm/desks/templates/saved_desk_icon_view.cc
index 5e7c1a3f..e08d2f1 100644
--- a/ash/wm/desks/templates/desks_templates_icon_view.cc
+++ b/ash/wm/desks/templates/saved_desk_icon_view.cc
@@ -2,13 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "ash/wm/desks/templates/desks_templates_icon_view.h"
+#include "ash/wm/desks/templates/saved_desk_icon_view.h"
 
 #include "ash/public/cpp/desks_templates_delegate.h"
 #include "ash/public/cpp/rounded_image_view.h"
 #include "ash/shell.h"
 #include "ash/style/ash_color_provider.h"
-#include "ash/wm/desks/templates/desks_templates_icon_container.h"
+#include "ash/wm/desks/templates/saved_desk_icon_container.h"
 #include "base/bind.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/utf_string_conversions.h"
@@ -66,11 +66,11 @@
 
 }  // namespace
 
-DesksTemplatesIconView::DesksTemplatesIconView() = default;
+SavedDeskIconView::SavedDeskIconView() = default;
 
-DesksTemplatesIconView::~DesksTemplatesIconView() = default;
+SavedDeskIconView::~SavedDeskIconView() = default;
 
-void DesksTemplatesIconView::SetIconIdentifierAndCount(
+void SavedDeskIconView::SetIconIdentifierAndCount(
     const std::string& icon_identifier,
     const std::string& app_id,
     const std::string& app_title,
@@ -120,7 +120,7 @@
   auto* delegate = Shell::Get()->desks_templates_delegate();
   absl::optional<gfx::ImageSkia> chrome_icon =
       delegate->MaybeRetrieveIconForSpecialIdentifier(
-          icon_identifier_, static_cast<DesksTemplatesIconContainer*>(parent())
+          icon_identifier_, static_cast<SavedDeskIconContainer*>(parent())
                                 ->incognito_window_color_provider());
 
   icon_view_->GetViewAccessibility().OverrideRole(ax::mojom::Role::kImage);
@@ -141,27 +141,25 @@
   // app id. If `icon_identifier_` is not a valid url then it's an app id.
   GURL potential_url{icon_identifier_};
   if (!potential_url.is_valid()) {
-    delegate->GetIconForAppId(
-        icon_identifier_, kAppIdImageSize,
-        base::BindOnce(&DesksTemplatesIconView::OnIconLoaded,
-                       weak_ptr_factory_.GetWeakPtr()));
+    delegate->GetIconForAppId(icon_identifier_, kAppIdImageSize,
+                              base::BindOnce(&SavedDeskIconView::OnIconLoaded,
+                                             weak_ptr_factory_.GetWeakPtr()));
     return;
   }
 
-  delegate->GetFaviconForUrl(
-      icon_identifier_,
-      base::BindOnce(&DesksTemplatesIconView::OnIconLoaded,
-                     weak_ptr_factory_.GetWeakPtr()),
-      &cancelable_task_tracker_);
+  delegate->GetFaviconForUrl(icon_identifier_,
+                             base::BindOnce(&SavedDeskIconView::OnIconLoaded,
+                                            weak_ptr_factory_.GetWeakPtr()),
+                             &cancelable_task_tracker_);
 }
 
-void DesksTemplatesIconView::UpdateCount(int count) {
+void SavedDeskIconView::UpdateCount(int count) {
   count_ = count;
   DCHECK(count_label_);
   count_label_->SetText(GetCountString(count_, /*show_plus=*/true));
 }
 
-gfx::Size DesksTemplatesIconView::CalculatePreferredSize() const {
+gfx::Size SavedDeskIconView::CalculatePreferredSize() const {
   int width = (icon_view_ ? kIconViewSize : 0);
   if (count_ > 1 && count_label_) {
     width +=
@@ -170,7 +168,7 @@
   return gfx::Size(width, kIconViewSize);
 }
 
-void DesksTemplatesIconView::Layout() {
+void SavedDeskIconView::Layout() {
   if (icon_view_) {
     gfx::Size icon_preferred_size = icon_view_->CalculatePreferredSize();
     icon_view_->SetBoundsRect(gfx::Rect(
@@ -185,7 +183,7 @@
   }
 }
 
-void DesksTemplatesIconView::OnIconLoaded(const gfx::ImageSkia& icon) {
+void SavedDeskIconView::OnIconLoaded(const gfx::ImageSkia& icon) {
   if (!icon.isNull()) {
     icon_view_->SetImage(
         CreateResizedImageToIconSize(icon, /*is_default=*/false));
@@ -194,7 +192,7 @@
   LoadDefaultIcon();
 }
 
-void DesksTemplatesIconView::LoadDefaultIcon() {
+void SavedDeskIconView::LoadDefaultIcon() {
   const ui::NativeTheme* native_theme =
       ui::NativeTheme::GetInstanceForNativeUi();
   // Use a higher resolution image as it will look better after resizing.
@@ -223,7 +221,7 @@
   }
 }
 
-BEGIN_METADATA(DesksTemplatesIconView, views::View)
+BEGIN_METADATA(SavedDeskIconView, views::View)
 END_METADATA
 
 }  // namespace ash
diff --git a/ash/wm/desks/templates/desks_templates_icon_view.h b/ash/wm/desks/templates/saved_desk_icon_view.h
similarity index 77%
rename from ash/wm/desks/templates/desks_templates_icon_view.h
rename to ash/wm/desks/templates/saved_desk_icon_view.h
index 0318c49..ff77571 100644
--- a/ash/wm/desks/templates/desks_templates_icon_view.h
+++ b/ash/wm/desks/templates/saved_desk_icon_view.h
@@ -2,8 +2,8 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#ifndef ASH_WM_DESKS_TEMPLATES_DESKS_TEMPLATES_ICON_VIEW_H_
-#define ASH_WM_DESKS_TEMPLATES_DESKS_TEMPLATES_ICON_VIEW_H_
+#ifndef ASH_WM_DESKS_TEMPLATES_SAVED_DESK_ICON_VIEW_H_
+#define ASH_WM_DESKS_TEMPLATES_SAVED_DESK_ICON_VIEW_H_
 
 #include <string>
 
@@ -27,14 +27,14 @@
 // A class for loading and displaying the icon of apps/urls used in a
 // SavedDeskItemView. Depending on the `count_` and `icon_identifier_`,
 // this View may have only an icon, only a count label, or both.
-class DesksTemplatesIconView : public views::View {
+class SavedDeskIconView : public views::View {
  public:
-  METADATA_HEADER(DesksTemplatesIconView);
+  METADATA_HEADER(SavedDeskIconView);
 
-  DesksTemplatesIconView();
-  DesksTemplatesIconView(const DesksTemplatesIconView&) = delete;
-  DesksTemplatesIconView& operator=(const DesksTemplatesIconView&) = delete;
-  ~DesksTemplatesIconView() override;
+  SavedDeskIconView();
+  SavedDeskIconView(const SavedDeskIconView&) = delete;
+  SavedDeskIconView& operator=(const SavedDeskIconView&) = delete;
+  ~SavedDeskIconView() override;
 
   // The size of the background the icon sits inside of.
   static constexpr int kIconViewSize = 28;
@@ -62,7 +62,7 @@
   void Layout() override;
 
  private:
-  friend class DesksTemplatesIconViewTestApi;
+  friend class SavedDeskIconViewTestApi;
 
   // Callbacks for when the app icon/favicon has been fetched. If the result is
   // non-null/empty then we'll set this's image to the result. Otherwise, we'll
@@ -78,7 +78,7 @@
   std::string icon_identifier_;
 
   // The number of instances of this icon's respective app/url stored in this's
-  // respective DeskTemplate.
+  // respective SavedDesk.
   int count_ = 0;
 
   // Owned by the views hierarchy.
@@ -88,14 +88,14 @@
   // Used for favicon loading tasks.
   base::CancelableTaskTracker cancelable_task_tracker_;
 
-  base::WeakPtrFactory<DesksTemplatesIconView> weak_ptr_factory_{this};
+  base::WeakPtrFactory<SavedDeskIconView> weak_ptr_factory_{this};
 };
 
-BEGIN_VIEW_BUILDER(/* no export */, DesksTemplatesIconView, views::View)
+BEGIN_VIEW_BUILDER(/* no export */, SavedDeskIconView, views::View)
 END_VIEW_BUILDER
 
 }  // namespace ash
 
-DEFINE_VIEW_BUILDER(/* no export */, ash::DesksTemplatesIconView)
+DEFINE_VIEW_BUILDER(/* no export */, ash::SavedDeskIconView)
 
-#endif  // ASH_WM_DESKS_TEMPLATES_DESKS_TEMPLATES_ICON_VIEW_H_
+#endif  // ASH_WM_DESKS_TEMPLATES_SAVED_DESK_ICON_VIEW_H_
diff --git a/ash/wm/desks/templates/saved_desk_item_view.cc b/ash/wm/desks/templates/saved_desk_item_view.cc
index 38ed8781..3f7049b 100644
--- a/ash/wm/desks/templates/saved_desk_item_view.cc
+++ b/ash/wm/desks/templates/saved_desk_item_view.cc
@@ -19,11 +19,11 @@
 #include "ash/style/system_shadow.h"
 #include "ash/wm/desks/desk.h"
 #include "ash/wm/desks/desks_textfield.h"
-#include "ash/wm/desks/templates/desks_templates_dialog_controller.h"
 #include "ash/wm/desks/templates/desks_templates_grid_view.h"
-#include "ash/wm/desks/templates/desks_templates_icon_container.h"
 #include "ash/wm/desks/templates/desks_templates_metrics_util.h"
 #include "ash/wm/desks/templates/desks_templates_presenter.h"
+#include "ash/wm/desks/templates/saved_desk_dialog_controller.h"
+#include "ash/wm/desks/templates/saved_desk_icon_container.h"
 #include "ash/wm/desks/templates/saved_desk_name_view.h"
 #include "ash/wm/overview/overview_constants.h"
 #include "ash/wm/overview/overview_controller.h"
@@ -191,7 +191,7 @@
                       views::FlexSpecification(
                           views::MinimumFlexSizeRule::kScaleToZero,
                           views::MaximumFlexSizeRule::kUnbounded)),
-                  views::Builder<DesksTemplatesIconContainer>()
+                  views::Builder<SavedDeskIconContainer>()
                       .CopyAddressTo(&icon_container_view_)
                       .PopulateIconContainerFromTemplate(desk_template_.get())
                       .SetVisible(true)),
@@ -480,7 +480,7 @@
   // Show replace template dialog. If accepted, replace old template and commit
   // name change.
   aura::Window* root_window = GetWidget()->GetNativeWindow()->GetRootWindow();
-  DesksTemplatesDialogController::Get()->ShowReplaceDialog(
+  SavedDeskDialogController::Get()->ShowReplaceDialog(
       root_window, name_view_->GetText(),
       base::BindOnce(
           &SavedDeskItemView::ReplaceTemplate, weak_ptr_factory_.GetWeakPtr(),
@@ -635,7 +635,7 @@
 
 void SavedDeskItemView::OnDeleteButtonPressed() {
   // Show the dialog to confirm the deletion.
-  auto* dialog_controller = DesksTemplatesDialogController::Get();
+  auto* dialog_controller = SavedDeskDialogController::Get();
   dialog_controller->ShowDeleteDialog(
       GetWidget()->GetNativeWindow()->GetRootWindow(),
       name_view_->GetAccessibleName(),
@@ -690,8 +690,9 @@
   MaybeLaunchTemplate(/*should_delay=*/false);
 }
 
-void SavedDeskItemView::MaybeCloseHighlightedView() {
-  OnDeleteButtonPressed();
+void SavedDeskItemView::MaybeCloseHighlightedView(bool primary_action) {
+  if (primary_action)
+    OnDeleteButtonPressed();
 }
 
 void SavedDeskItemView::MaybeSwapHighlightedView(bool right) {}
diff --git a/ash/wm/desks/templates/saved_desk_item_view.h b/ash/wm/desks/templates/saved_desk_item_view.h
index 3c132b49..7448a65 100644
--- a/ash/wm/desks/templates/saved_desk_item_view.h
+++ b/ash/wm/desks/templates/saved_desk_item_view.h
@@ -24,8 +24,8 @@
 namespace ash {
 
 class CloseButton;
-class DesksTemplatesIconContainer;
 class PillButton;
+class SavedDeskIconContainer;
 class SavedDeskNameView;
 class ViewShadow;
 
@@ -47,7 +47,7 @@
 // contains the name of the saved desk.
 // `time_view_`: middle-left: Label: A label that lets the user know when the
 // saved desk was created.
-// `icon_container_view_`: bottom-center: DesksTemplatesIconContainer: A
+// `icon_container_view_`: bottom-center: SavedDeskIconContainer: A
 // container that houses a couple icons/text that give an indication of which
 // apps are part of the saved desk.
 // `managed_status_indicator`: top-right: ImageView: A icon that is visible if
@@ -150,7 +150,7 @@
   // OverviewHighlightableView:
   views::View* GetView() override;
   void MaybeActivateHighlightedView() override;
-  void MaybeCloseHighlightedView() override;
+  void MaybeCloseHighlightedView(bool primary_action) override;
   void MaybeSwapHighlightedView(bool right) override;
   void OnViewHighlighted() override;
   void OnViewUnhighlighted() override;
@@ -163,7 +163,7 @@
   // When template is managed by admin, `time_view_` will display management
   // description instead.
   views::Label* time_view_ = nullptr;
-  DesksTemplatesIconContainer* icon_container_view_ = nullptr;
+  SavedDeskIconContainer* icon_container_view_ = nullptr;
   CloseButton* delete_button_ = nullptr;
   PillButton* launch_button_ = nullptr;
   // Container used for holding all the views that appear on hover.
diff --git a/ash/wm/desks/zero_state_button.cc b/ash/wm/desks/zero_state_button.cc
index 32becc5..b396f06 100644
--- a/ash/wm/desks/zero_state_button.cc
+++ b/ash/wm/desks/zero_state_button.cc
@@ -112,9 +112,9 @@
   OnButtonPressed();
 }
 
-void DeskButtonBase::MaybeSwapHighlightedView(bool right) {}
+void DeskButtonBase::MaybeCloseHighlightedView(bool primary_action) {}
 
-void DeskButtonBase::MaybeCloseHighlightedView() {}
+void DeskButtonBase::MaybeSwapHighlightedView(bool right) {}
 
 void DeskButtonBase::OnViewHighlighted() {
   UpdateBorderState();
diff --git a/ash/wm/desks/zero_state_button.h b/ash/wm/desks/zero_state_button.h
index ddc2cc5..e393fd4d 100644
--- a/ash/wm/desks/zero_state_button.h
+++ b/ash/wm/desks/zero_state_button.h
@@ -47,7 +47,7 @@
   // OverviewHighlightableView:
   views::View* GetView() override;
   void MaybeActivateHighlightedView() override;
-  void MaybeCloseHighlightedView() override;
+  void MaybeCloseHighlightedView(bool primary_action) override;
   void MaybeSwapHighlightedView(bool right) override;
   void OnViewHighlighted() override;
   void OnViewUnhighlighted() override;
diff --git a/ash/wm/overview/overview_highlight_controller.cc b/ash/wm/overview/overview_highlight_controller.cc
index a90e46e9..3084e91 100644
--- a/ash/wm/overview/overview_highlight_controller.cc
+++ b/ash/wm/overview/overview_highlight_controller.cc
@@ -130,11 +130,12 @@
   return true;
 }
 
-bool OverviewHighlightController::MaybeCloseHighlightedView() {
+bool OverviewHighlightController::MaybeCloseHighlightedView(
+    bool primary_action) {
   if (!highlighted_view_)
     return false;
 
-  highlighted_view_->MaybeCloseHighlightedView();
+  highlighted_view_->MaybeCloseHighlightedView(primary_action);
   return true;
 }
 
diff --git a/ash/wm/overview/overview_highlight_controller.h b/ash/wm/overview/overview_highlight_controller.h
index 81630c6..437e07df 100644
--- a/ash/wm/overview/overview_highlight_controller.h
+++ b/ash/wm/overview/overview_highlight_controller.h
@@ -55,7 +55,7 @@
   // Activates or closes the currently highlighted view (if any) if it supports
   // the activation or closing operations respectively.
   bool MaybeActivateHighlightedView();
-  bool MaybeCloseHighlightedView();
+  bool MaybeCloseHighlightedView(bool primary_action);
 
   // Swaps the currently highlighted view with its neighbor views.
   bool MaybeSwapHighlightedView(bool right);
diff --git a/ash/wm/overview/overview_highlightable_view.h b/ash/wm/overview/overview_highlightable_view.h
index cc371e7..50cf2ed 100644
--- a/ash/wm/overview/overview_highlightable_view.h
+++ b/ash/wm/overview/overview_highlightable_view.h
@@ -22,9 +22,11 @@
   // Get the view class associated with |this|.
   virtual views::View* GetView() = 0;
 
-  // Attempts to activate or close this view. Overriders may do nothing.
+  // Attempts to activate or close this view. Overriders may do nothing. Closing
+  // supports a primary action and a secondary action, as some overrides may
+  // have two actions that are related to closing.
   virtual void MaybeActivateHighlightedView() = 0;
-  virtual void MaybeCloseHighlightedView() = 0;
+  virtual void MaybeCloseHighlightedView(bool primary_action) = 0;
 
   // Attempts to swap the view with its neighbor views. (Mainly used for
   // |DeskMiniView|).
diff --git a/ash/wm/overview/overview_item_view.cc b/ash/wm/overview/overview_item_view.cc
index 82469caa..e1fb512 100644
--- a/ash/wm/overview/overview_item_view.cc
+++ b/ash/wm/overview/overview_item_view.cc
@@ -243,8 +243,8 @@
     overview_item_->OnHighlightedViewActivated();
 }
 
-void OverviewItemView::MaybeCloseHighlightedView() {
-  if (overview_item_)
+void OverviewItemView::MaybeCloseHighlightedView(bool primary_action) {
+  if (overview_item_ && primary_action)
     overview_item_->OnHighlightedViewClosed();
 }
 
diff --git a/ash/wm/overview/overview_item_view.h b/ash/wm/overview/overview_item_view.h
index 608d462..acbf569 100644
--- a/ash/wm/overview/overview_item_view.h
+++ b/ash/wm/overview/overview_item_view.h
@@ -76,7 +76,7 @@
   // OverviewHighlightableView:
   views::View* GetView() override;
   void MaybeActivateHighlightedView() override;
-  void MaybeCloseHighlightedView() override;
+  void MaybeCloseHighlightedView(bool primary_action) override;
   void MaybeSwapHighlightedView(bool right) override;
   bool MaybeActivateHighlightedViewOnOverviewExit(
       OverviewSession* overview_session) override;
diff --git a/ash/wm/overview/overview_session.cc b/ash/wm/overview/overview_session.cc
index b5cee1d..eb795fe 100644
--- a/ash/wm/overview/overview_session.cc
+++ b/ash/wm/overview/overview_session.cc
@@ -31,9 +31,9 @@
 #include "ash/wm/desks/desks_bar_view.h"
 #include "ash/wm/desks/desks_controller.h"
 #include "ash/wm/desks/desks_util.h"
-#include "ash/wm/desks/templates/desks_templates_dialog_controller.h"
 #include "ash/wm/desks/templates/desks_templates_presenter.h"
 #include "ash/wm/desks/templates/desks_templates_util.h"
+#include "ash/wm/desks/templates/saved_desk_dialog_controller.h"
 #include "ash/wm/mru_window_tracker.h"
 #include "ash/wm/overview/overview_controller.h"
 #include "ash/wm/overview/overview_delegate.h"
@@ -187,8 +187,8 @@
       !desks_templates_presenter_) {
     desks_templates_presenter_ =
         std::make_unique<DesksTemplatesPresenter>(this);
-    desks_templates_dialog_controller_ =
-        std::make_unique<DesksTemplatesDialogController>();
+    saved_desk_dialog_controller_ =
+        std::make_unique<SavedDeskDialogController>();
   }
 
   aura::Window::Windows root_windows = Shell::GetAllRootWindows();
@@ -302,7 +302,7 @@
 
   // Resetting here will close any dialogs, and DCHECK anyone trying to open a
   // dialog past this point.
-  desks_templates_dialog_controller_.reset();
+  saved_desk_dialog_controller_.reset();
 
   // Stop observing screen metrics changes first to avoid auto-positioning
   // windows in response to work area changes from window activation.
@@ -796,10 +796,8 @@
   // Activating or deactivating one of the confirmation dialogs associated with
   // desks templates should not end overview.
   if (gained_active && desks_templates_util::IsSavedDesksEnabled()) {
-    if (ShouldKeepOverviewOpenForDesksTemplatesDialog(gained_active,
-                                                      lost_active)) {
+    if (ShouldKeepOverviewOpenForSavedDeskDialog(gained_active, lost_active))
       return;
-    }
   }
 
   if (DesksController::Get()->AreDesksBeingModified()) {
@@ -899,10 +897,10 @@
     }
   }
 
-  return desks_templates_dialog_controller_ &&
-         desks_templates_dialog_controller_->dialog_widget() &&
-         desks_templates_dialog_controller_->dialog_widget()
-                 ->GetNativeWindow() == lost_active;
+  return saved_desk_dialog_controller_ &&
+         saved_desk_dialog_controller_->dialog_widget() &&
+         saved_desk_dialog_controller_->dialog_widget()->GetNativeWindow() ==
+             lost_active;
 }
 
 aura::Window* OverviewSession::GetOverviewFocusWindow() {
@@ -1218,8 +1216,8 @@
   }
 
   // If a desk templates dialog is visible it should receive the key events.
-  if (desks_templates_dialog_controller_ &&
-      desks_templates_dialog_controller_->dialog_widget()) {
+  if (saved_desk_dialog_controller_ &&
+      saved_desk_dialog_controller_->dialog_widget()) {
     return;
   }
 
@@ -1252,7 +1250,7 @@
   if (!is_key_press)
     return;
 
-  bool is_control_down = event->IsControlDown();
+  const bool is_control_down = event->IsControlDown();
 
   switch (key_code) {
     case ui::VKEY_BROWSER_BACK:
@@ -1275,7 +1273,7 @@
       }
       break;
     case ui::VKEY_TAB: {
-      const bool reverse = event->flags() & ui::EF_SHIFT_DOWN;
+      const bool reverse = event->IsShiftDown();
       ++num_key_presses_;
       Move(reverse);
       break;
@@ -1314,10 +1312,11 @@
 #endif
     }
     case ui::VKEY_W: {
-      if (!(event->flags() & ui::EF_CONTROL_DOWN))
+      if (!is_control_down)
         return;
 
-      if (!highlight_controller_->MaybeCloseHighlightedView())
+      const bool primary_action = !event->IsShiftDown();
+      if (!highlight_controller_->MaybeCloseHighlightedView(primary_action))
         return;
       break;
     }
@@ -1517,12 +1516,12 @@
   UpdateAccessibilityFocus();
 }
 
-bool OverviewSession::ShouldKeepOverviewOpenForDesksTemplatesDialog(
+bool OverviewSession::ShouldKeepOverviewOpenForSavedDeskDialog(
     aura::Window* gained_active,
     aura::Window* lost_active) {
   DCHECK(desks_templates_util::IsSavedDesksEnabled());
   const views::Widget* dialog_widget =
-      desks_templates_dialog_controller_->dialog_widget();
+      saved_desk_dialog_controller_->dialog_widget();
   if (!dialog_widget)
     return false;
 
diff --git a/ash/wm/overview/overview_session.h b/ash/wm/overview/overview_session.h
index 7a33a41a..07e5720 100644
--- a/ash/wm/overview/overview_session.h
+++ b/ash/wm/overview/overview_session.h
@@ -45,7 +45,7 @@
 namespace ash {
 
 class DesksTemplatesPresenter;
-class DesksTemplatesDialogController;
+class SavedDeskDialogController;
 class OverviewDelegate;
 class OverviewGrid;
 class OverviewHighlightController;
@@ -233,7 +233,7 @@
       aura::Window* lost_active);
 
   // Returns true when either the `DesksTemplatesGridWidget` or
-  // `DesksTemplatesDialog` is the window that is losing activation.
+  // `SavedDeskDialog` is the window that is losing activation.
   bool IsTemplatesUiLosingActivation(aura::Window* lost_active);
 
   // Gets the window which keeps focus for the duration of overview mode.
@@ -408,13 +408,11 @@
 
   void OnItemAdded(aura::Window* window);
 
-  // Called when a window is activated or deactivated and the desks templates
-  // feature is enabled. Returns true if we should keep overview open. Overview
-  // should be kept open if |gained_active| or |lost_active| is a desks
-  // templates dialog.
-  bool ShouldKeepOverviewOpenForDesksTemplatesDialog(
-      aura::Window* gained_active,
-      aura::Window* lost_active);
+  // Called when a window is activated or deactivated and the saved desk feature
+  // is enabled. Returns true if we should keep overview open. Overview should
+  // be kept open if `gained_active` or `lost_active` is a saved desk dialog.
+  bool ShouldKeepOverviewOpenForSavedDeskDialog(aura::Window* gained_active,
+                                                aura::Window* lost_active);
 
   // Weak pointer to the overview delegate which will be called when a selection
   // is made.
@@ -478,8 +476,7 @@
   // The object responsible to talking to the desk model.
   std::unique_ptr<DesksTemplatesPresenter> desks_templates_presenter_;
 
-  std::unique_ptr<DesksTemplatesDialogController>
-      desks_templates_dialog_controller_;
+  std::unique_ptr<SavedDeskDialogController> saved_desk_dialog_controller_;
 
   absl::optional<display::ScopedDisplayObserver> display_observer_;
 
diff --git a/base/containers/span.h b/base/containers/span.h
index 6d5fed1..4a66026 100644
--- a/base/containers/span.h
+++ b/base/containers/span.h
@@ -7,7 +7,6 @@
 
 #include <stddef.h>
 
-#include <algorithm>
 #include <array>
 #include <iterator>
 #include <limits>
diff --git a/base/containers/span_unittest.cc b/base/containers/span_unittest.cc
index 6dfb4f9..cbd3200 100644
--- a/base/containers/span_unittest.cc
+++ b/base/containers/span_unittest.cc
@@ -8,7 +8,7 @@
 // build time. Try not to raise this limit unless absolutely necessary. See
 // https://chromium.googlesource.com/chromium/src/+/HEAD/docs/wmax_tokens.md
 #ifndef NACL_TC_REV
-#pragma clang max_tokens_here 272000
+#pragma clang max_tokens_here 267000
 #endif
 
 #include <stdint.h>
diff --git a/base/tools_sanity_unittest.cc b/base/tools_sanity_unittest.cc
index c97bd455..4fddb9b 100644
--- a/base/tools_sanity_unittest.cc
+++ b/base/tools_sanity_unittest.cc
@@ -177,7 +177,8 @@
 // alloc_dealloc_mismatch defaults to
 // !SANITIZER_MAC && !SANITIZER_WINDOWS && !SANITIZER_ANDROID,
 // in the sanitizer runtime upstream.
-#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN)
+#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || \
+    BUILDFLAG(IS_FUCHSIA)
 #define MAYBE_SingleElementDeletedWithBraces \
     DISABLED_SingleElementDeletedWithBraces
 #define MAYBE_ArrayDeletedWithoutBraces DISABLED_ArrayDeletedWithoutBraces
diff --git a/build/android/gyp/util/diff_utils.py b/build/android/gyp/util/diff_utils.py
index 530a688..2dc09649 100644
--- a/build/android/gyp/util/diff_utils.py
+++ b/build/android/gyp/util/diff_utils.py
@@ -34,7 +34,15 @@
       '{}\n'.format(l.rstrip()) for l in actual_data.splitlines() if l.strip()
   ]
 
-  diff = difflib.ndiff(expected_lines, actual_lines)
+  # This helps the diff to not over-anchor on comments or closing braces in
+  # proguard configs.
+  def is_junk_line(l):
+    l = l.strip()
+    if l.startswith('# File:'):
+      return False
+    return l == '' or l == '}' or l.startswith('#')
+
+  diff = difflib.ndiff(expected_lines, actual_lines, linejunk=is_junk_line)
   filtered_diff = (l for l in diff if l.startswith('+'))
   return ''.join(filtered_diff)
 
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1
index b72f997..e6b3e0ad 100644
--- a/build/fuchsia/linux_internal.sdk.sha1
+++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@
-8.20220505.1.1
+8.20220505.2.1
diff --git a/cc/BUILD.gn b/cc/BUILD.gn
index f3f6fa79..6f7d5ba9 100644
--- a/cc/BUILD.gn
+++ b/cc/BUILD.gn
@@ -178,6 +178,8 @@
     "metrics/compositor_frame_reporting_controller.h",
     "metrics/compositor_timing_history.cc",
     "metrics/compositor_timing_history.h",
+    "metrics/custom_metrics_recorder.cc",
+    "metrics/custom_metrics_recorder.h",
     "metrics/dropped_frame_counter.cc",
     "metrics/dropped_frame_counter.h",
     "metrics/event_latency_tracing_recorder.cc",
diff --git a/cc/metrics/custom_metrics_recorder.cc b/cc/metrics/custom_metrics_recorder.cc
new file mode 100644
index 0000000..5b25f114
--- /dev/null
+++ b/cc/metrics/custom_metrics_recorder.cc
@@ -0,0 +1,31 @@
+// Copyright 2020 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "cc/metrics/custom_metrics_recorder.h"
+
+#include "base/check_op.h"
+
+namespace cc {
+namespace {
+
+CustomMetricRecorder* g_instance = nullptr;
+
+}  // namespace
+
+// static
+CustomMetricRecorder* CustomMetricRecorder::Get() {
+  return g_instance;
+}
+
+CustomMetricRecorder::CustomMetricRecorder() {
+  DCHECK_EQ(nullptr, g_instance);
+  g_instance = this;
+}
+
+CustomMetricRecorder::~CustomMetricRecorder() {
+  DCHECK_EQ(this, g_instance);
+  g_instance = nullptr;
+}
+
+}  // namespace cc
diff --git a/cc/metrics/custom_metrics_recorder.h b/cc/metrics/custom_metrics_recorder.h
new file mode 100644
index 0000000..fa4f8ad3
--- /dev/null
+++ b/cc/metrics/custom_metrics_recorder.h
@@ -0,0 +1,27 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CC_METRICS_CUSTOM_METRICS_RECORDER_H_
+#define CC_METRICS_CUSTOM_METRICS_RECORDER_H_
+
+#include "cc/cc_export.h"
+
+namespace cc {
+
+// Customize cc metric recording. E.g. reporting metrics under different names.
+class CC_EXPORT CustomMetricRecorder {
+ public:
+  static CustomMetricRecorder* Get();
+
+  // Invoked to report "PercentDroppedFrames_1sWindow".
+  virtual void ReportPercentDroppedFramesInOneSecoundWindow(double percent) = 0;
+
+ protected:
+  CustomMetricRecorder();
+  virtual ~CustomMetricRecorder();
+};
+
+}  // namespace cc
+
+#endif  // CC_METRICS_CUSTOM_METRICS_RECORDER_H_
diff --git a/cc/metrics/dropped_frame_counter.cc b/cc/metrics/dropped_frame_counter.cc
index e7fd9cf..3ad8364 100644
--- a/cc/metrics/dropped_frame_counter.cc
+++ b/cc/metrics/dropped_frame_counter.cc
@@ -15,6 +15,7 @@
 #include "base/trace_event/trace_event.h"
 #include "build/chromeos_buildflags.h"
 #include "cc/base/features.h"
+#include "cc/metrics/custom_metrics_recorder.h"
 #include "cc/metrics/frame_sorter.h"
 #include "cc/metrics/total_frame_counter.h"
 #include "cc/metrics/ukm_smoothness_data.h"
@@ -397,10 +398,13 @@
 
 void DroppedFrameCounter::ReportFramesForUI() {
   DCHECK(report_for_ui_);
-#if BUILDFLAG(IS_CHROMEOS_ASH)
-  UMA_HISTOGRAM_PERCENTAGE("Ash.Smoothness.PercentDroppedFrames_1sWindow",
-                           sliding_window_current_percent_dropped_);
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
+
+  auto* recorder = CustomMetricRecorder::Get();
+  if (!recorder)
+    return;
+
+  recorder->ReportPercentDroppedFramesInOneSecoundWindow(
+      sliding_window_current_percent_dropped_);
 }
 
 double DroppedFrameCounter::GetMostRecentAverageSmoothness() const {
diff --git a/cc/metrics/dropped_frame_counter_unittest.cc b/cc/metrics/dropped_frame_counter_unittest.cc
index cc48999..9216765 100644
--- a/cc/metrics/dropped_frame_counter_unittest.cc
+++ b/cc/metrics/dropped_frame_counter_unittest.cc
@@ -9,10 +9,10 @@
 #include "base/memory/raw_ptr.h"
 #include "base/synchronization/lock.h"
 #include "base/synchronization/waitable_event.h"
-#include "base/test/metrics/histogram_tester.h"
 #include "base/time/time.h"
 #include "build/chromeos_buildflags.h"
 #include "cc/animation/animation_host.h"
+#include "cc/metrics/custom_metrics_recorder.h"
 #include "cc/test/fake_content_layer_client.h"
 #include "cc/test/fake_frame_info.h"
 #include "cc/test/fake_picture_layer.h"
@@ -29,6 +29,31 @@
                                  : FrameInfo::FrameFinalState::kPresentedAll);
 }
 
+class TestCustomMetricsRecorder : public CustomMetricRecorder {
+ public:
+  TestCustomMetricsRecorder() = default;
+  ~TestCustomMetricsRecorder() override = default;
+
+  // CustomMetricRecorder:
+  void ReportPercentDroppedFramesInOneSecoundWindow(
+      double percentage) override {
+    ++percent_dropped_frames_count_;
+    last_percent_dropped_frames_ = percentage;
+  }
+
+  int percent_dropped_frames_count() const {
+    return percent_dropped_frames_count_;
+  }
+
+  double last_percent_dropped_frames() const {
+    return last_percent_dropped_frames_;
+  }
+
+ private:
+  int percent_dropped_frames_count_ = 0;
+  double last_percent_dropped_frames_ = 0;
+};
+
 class DroppedFrameCounterTestBase : public LayerTreeTest {
  public:
   DroppedFrameCounterTestBase() = default;
@@ -917,7 +942,6 @@
   EXPECT_FLOAT_EQ(MaxPercentDroppedFrameAfter5Sec(), 100);
 }
 
-#if BUILDFLAG(IS_CHROMEOS_ASH)
 TEST_F(DroppedFrameCounterTest, ReportForUI) {
   constexpr auto kInterval = base::Milliseconds(10);
   constexpr size_t kFps = base::Seconds(1) / kInterval;
@@ -927,17 +951,15 @@
   SetInterval(kInterval);
 
   dropped_frame_counter_.EnableReporForUI();
-  base::HistogramTester histogram_tester;
+  TestCustomMetricsRecorder recorder;
 
   // 4 seconds with 20% dropped frames.
   SimulateFrameSequence({false, false, false, false, true}, (kFps / 5) * 4);
 
   // Recorded more than 1 samples of 20% dropped frame percentage.
-  EXPECT_GE(histogram_tester.GetBucketCount(
-                "Ash.Smoothness.PercentDroppedFrames_1sWindow", 20),
-            1);
+  EXPECT_GE(recorder.percent_dropped_frames_count(), 1);
+  EXPECT_EQ(recorder.last_percent_dropped_frames(), 20.0f);
 }
-#endif  // BUILDFLAG(IS_CHROMEOS_ASH)
 
 }  // namespace
 }  // namespace cc
diff --git a/cc/raster/raster_buffer_provider_perftest.cc b/cc/raster/raster_buffer_provider_perftest.cc
index 78cd768..f6c3993 100644
--- a/cc/raster/raster_buffer_provider_perftest.cc
+++ b/cc/raster/raster_buffer_provider_perftest.cc
@@ -40,12 +40,6 @@
 
 class PerfGLES2Interface : public gpu::gles2::GLES2InterfaceStub {
   // Overridden from gpu::gles2::GLES2Interface:
-  GLuint CreateImageCHROMIUM(ClientBuffer buffer,
-                             GLsizei width,
-                             GLsizei height,
-                             GLenum internalformat) override {
-    return 1u;
-  }
   void GenBuffers(GLsizei n, GLuint* buffers) override {
     for (GLsizei i = 0; i < n; ++i)
       buffers[i] = 1u;
diff --git a/chrome/VERSION b/chrome/VERSION
index 23ac0894..3aad9fe 100644
--- a/chrome/VERSION
+++ b/chrome/VERSION
@@ -1,4 +1,4 @@
 MAJOR=103
 MINOR=0
-BUILD=5045
+BUILD=5046
 PATCH=0
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCustomTabTestRule.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCustomTabTestRule.java
index afe23bd..71adaa54 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCustomTabTestRule.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantCustomTabTestRule.java
@@ -24,11 +24,8 @@
     public void startActivity() {
         getTestRule().startCustomTabActivityWithIntent(
                 CustomTabsTestUtils.createMinimalCustomTabIntent(
-                        InstrumentationRegistry.getTargetContext(), getURL()));
-    }
-
-    public String getURL() {
-        return getTestRule().getTestServer().getURL(HTML_DIRECTORY + mTestPage);
+                        InstrumentationRegistry.getTargetContext(),
+                        getTestRule().getTestServer().getURL(HTML_DIRECTORY + mTestPage)));
     }
 
     @Override
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/DirectActionsIntegrationTest.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/DirectActionsIntegrationTest.java
index 560660e2..803c0395 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/DirectActionsIntegrationTest.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/DirectActionsIntegrationTest.java
@@ -8,7 +8,6 @@
 import static androidx.test.espresso.action.ViewActions.click;
 import static androidx.test.espresso.assertion.ViewAssertions.doesNotExist;
 import static androidx.test.espresso.assertion.ViewAssertions.matches;
-import static androidx.test.espresso.matcher.ViewMatchers.isCompletelyDisplayed;
 import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed;
 import static androidx.test.espresso.matcher.ViewMatchers.withContentDescription;
 import static androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility;
@@ -22,10 +21,7 @@
 import static org.mockito.Mockito.verify;
 
 import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.checkElementExists;
-import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.createDefaultTriggerScriptUI;
-import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.startAutofillAssistantWithParams;
 import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.waitUntil;
-import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.waitUntilViewAssertionTrue;
 import static org.chromium.chrome.browser.autofill_assistant.AutofillAssistantUiTestUtil.waitUntilViewMatchesCondition;
 import static org.chromium.chrome.browser.autofill_assistant.MiniActionTestUtil.addTapSteps;
 import static org.chromium.chrome.browser.autofill_assistant.ProtoTestUtil.toCssSelector;
@@ -52,9 +48,7 @@
 import org.chromium.base.test.util.DisabledTest;
 import org.chromium.chrome.browser.autofill_assistant.proto.ActionProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ChipProto;
-import org.chromium.chrome.browser.autofill_assistant.proto.CollectUserDataProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.DirectActionProto;
-import org.chromium.chrome.browser.autofill_assistant.proto.GetTriggerScriptsResponseProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.InfoBoxProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.PromptProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.ShowInfoBoxProto;
@@ -62,15 +56,11 @@
 import org.chromium.chrome.browser.autofill_assistant.proto.SupportedScriptProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.SupportedScriptProto.PresentationProto;
 import org.chromium.chrome.browser.autofill_assistant.proto.TellProto;
-import org.chromium.chrome.browser.autofill_assistant.proto.TriggerScriptProto;
-import org.chromium.chrome.browser.autofill_assistant.proto.UserFormSectionProto;
 import org.chromium.chrome.browser.customtabs.CustomTabActivityTestRule;
 import org.chromium.chrome.browser.directactions.DirectActionHandler;
 import org.chromium.chrome.browser.directactions.FakeDirectActionReporter;
 import org.chromium.chrome.browser.flags.ChromeFeatureList;
 import org.chromium.chrome.browser.flags.ChromeSwitches;
-import org.chromium.chrome.browser.profiles.Profile;
-import org.chromium.chrome.browser.signin.services.UnifiedConsentServiceBridge;
 import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
 import org.chromium.chrome.test.util.browser.Features.EnableFeatures;
 import org.chromium.components.autofill_assistant.AssistantDependencies;
@@ -83,7 +73,6 @@
 
 import java.util.ArrayList;
 import java.util.Collections;
-import java.util.HashMap;
 
 /**
  * Tests autofill-assistant direct actions.
@@ -94,12 +83,11 @@
     public DirectActionsIntegrationTest() {}
 
     private final CustomTabActivityTestRule mTestRule = new CustomTabActivityTestRule();
-    private final AutofillAssistantCustomTabTestRule mAssistantTestRule =
-            new AutofillAssistantCustomTabTestRule(
-                    mTestRule, "autofill_assistant_target_website.html");
 
     @Rule
-    public final TestRule mRulesChain = RuleChain.outerRule(mTestRule).around(mAssistantTestRule);
+    public final TestRule mRulesChain =
+            RuleChain.outerRule(mTestRule).around(new AutofillAssistantCustomTabTestRule(
+                    mTestRule, "autofill_assistant_target_website.html"));
 
     @Rule
     public MockitoRule mMockitoRule = MockitoJUnit.rule();
@@ -453,103 +441,4 @@
         onView(allOf(withContentDescription("Close"), withEffectiveVisibility(Visibility.VISIBLE)))
                 .perform(click());
     }
-
-    /**
-     * Regression test for b/209399694.
-     */
-    @Test
-    @MediumTest
-    @EnableFeatures({ChromeFeatureList.DIRECT_ACTIONS, AssistantFeatures.AUTOFILL_ASSISTANT_NAME,
-            AssistantFeatures.AUTOFILL_ASSISTANT_DIRECT_ACTIONS_NAME})
-    public void
-    testDirectActionWhileTriggerUiOpen() {
-        String pageToLoad = "autofill_assistant_target_website.html";
-        // The problem happens when you trigger a direct action while the
-        // trigger UI is visible.
-
-        // Enable MSBB.
-        TestThreadUtils.runOnUiThreadBlocking(() -> {
-            UnifiedConsentServiceBridge.setUrlKeyedAnonymizedDataCollectionEnabled(
-                    Profile.getLastUsedRegularProfile(), true);
-        });
-
-        // First set-up trigger script
-        TriggerScriptProto.Builder triggerScript =
-                TriggerScriptProto
-                        .newBuilder()
-                        /* no trigger condition */
-                        .setUserInterface(createDefaultTriggerScriptUI("Hello world",
-                                /* bubbleMessage = */ "",
-                                /* withProgressBar = */ false));
-        GetTriggerScriptsResponseProto triggerScripts = GetTriggerScriptsResponseProto.newBuilder()
-                                                                .addTriggerScripts(triggerScript)
-                                                                .build();
-        AutofillAssistantTestServiceRequestSender testServiceRequestSender =
-                new AutofillAssistantTestServiceRequestSender();
-        testServiceRequestSender.setNextResponse(/* httpStatus = */ 200, triggerScripts);
-        testServiceRequestSender.scheduleForInjection();
-
-        // Set up direct action script.
-        ArrayList<ActionProto> list = new ArrayList<>();
-        ArrayList<UserFormSectionProto> additionalSections = new ArrayList<>();
-        list.add(ActionProto.newBuilder()
-                         .setCollectUserData(
-                                 CollectUserDataProto.newBuilder()
-                                         .addAllAdditionalAppendedSections(additionalSections)
-                                         .setRequestTermsAndConditions(false))
-                         .build());
-        list.add(ActionProto.newBuilder()
-                         .setPrompt(PromptProto.newBuilder().addChoices(
-                                 PromptProto.Choice.newBuilder().setChip(
-                                         ChipProto.newBuilder().setText("Prompt"))))
-                         .build());
-
-        AutofillAssistantTestScript script = new AutofillAssistantTestScript(
-                SupportedScriptProto.newBuilder()
-                        .setPath(pageToLoad)
-                        .setPresentation(PresentationProto.newBuilder().setDirectAction(
-                                DirectActionProto.newBuilder()
-                                        .addNames("some_direct_action")
-                                        .build()))
-                        .build(),
-                list);
-        AutofillAssistantTestService testService =
-                new AutofillAssistantTestService(Collections.singletonList(script));
-        testService.scheduleForInjection();
-
-        // Start trigger script
-        HashMap<String, Object> parameters = new HashMap();
-        parameters.put("START_IMMEDIATELY", false);
-        parameters.put("REQUEST_TRIGGER_SCRIPT", true);
-        startAutofillAssistantWithParams(
-                mTestRule.getActivity(), mAssistantTestRule.getURL(), parameters);
-
-        // Wait until trigger UI is visible.
-        waitUntilViewMatchesCondition(withText("Hello world"), isCompletelyDisplayed());
-
-        // Trigger direct action.
-        TestThreadUtils.runOnUiThreadBlocking(() -> {
-            mDirectActionHandler.reportAvailableDirectActions(mDirectActionReporter);
-            Assert.assertThat(mDirectActionReporter.getDirectActions(),
-                    containsInAnyOrder("fetch_website_actions"));
-            mDirectActionHandler.performDirectAction(
-                    "fetch_website_actions", new Bundle(), mDirectActionResultCallback);
-            verify(mDirectActionResultCallback)
-                    .onResult(argThat(bundle -> bundle.getBoolean("success")));
-
-            mDirectActionHandler.reportAvailableDirectActions(mDirectActionReporter);
-            Assert.assertThat(mDirectActionReporter.getDirectActions(),
-                    containsInAnyOrder("fetch_website_actions", "some_direct_action"));
-            mDirectActionHandler.performDirectAction(
-                    "some_direct_action", new Bundle(), mDirectActionResultCallback);
-        });
-        waitUntilViewMatchesCondition(withText("Continue"), isDisplayed());
-
-        // Tapping on close button should stop script, close UI and not open
-        // trigger UI.
-        onView(allOf(withContentDescription("Close"), isDisplayed())).perform(click());
-        waitUntilViewAssertionTrue(withText("Hello world"), doesNotExist(), 2000L);
-        waitUntilViewAssertionTrue(withText("Prompt"), doesNotExist(), 2000L);
-        waitUntilViewAssertionTrue(withId(R.id.autofill_assistant), doesNotExist(), 2000L);
-    }
 }
diff --git a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/TestingAutofillAssistantModuleEntryProvider.java b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/TestingAutofillAssistantModuleEntryProvider.java
index e56d99b..b604695 100644
--- a/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/TestingAutofillAssistantModuleEntryProvider.java
+++ b/chrome/android/features/autofill_assistant/javatests/src/org/chromium/chrome/browser/autofill_assistant/TestingAutofillAssistantModuleEntryProvider.java
@@ -52,7 +52,7 @@
                           staticDependencies.getBrowserContext(), browserControlsFactory, rootView,
                           staticDependencies.getAccessibilityUtil(),
                           staticDependencies.createInfoPageUtil()),
-                    webContentsSupplier, staticDependencies, bottomSheetController);
+                    webContentsSupplier, staticDependencies);
         }
 
         @Override
diff --git a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionHandler.java b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionHandler.java
index 4b035eb..479fba3 100644
--- a/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionHandler.java
+++ b/chrome/android/features/autofill_assistant/public/java/src/org/chromium/chrome/browser/autofill_assistant/AutofillAssistantDirectActionHandler.java
@@ -25,7 +25,6 @@
 import org.chromium.components.autofill_assistant.AutofillAssistantModuleEntry;
 import org.chromium.components.autofill_assistant.AutofillAssistantModuleEntryProvider;
 import org.chromium.components.autofill_assistant.AutofillAssistantPreferencesUtil;
-import org.chromium.components.autofill_assistant.Starter;
 import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.content_public.browser.WebContents;
 
@@ -190,16 +189,6 @@
         String experimentIds = arguments.getString(EXPERIMENT_IDS, "");
         arguments.remove(EXPERIMENT_IDS);
 
-        // In case a trigger UI is open, request closing it.
-        // See b/209399694.
-        Tab tab = mActivityTabProvider.get();
-        if (tab != null) {
-            Starter starter = AutofillAssistantTabHelper.get(tab);
-            if (starter != null) {
-                starter.onDirectActionTriggered();
-            }
-        }
-
         getDelegate(/* installIfNecessary= */ true, (delegate) -> {
             if (delegate == null) {
                 booleanCallback.onResult(false);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
index 8ed9095..a104de9 100644
--- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
+++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
@@ -376,8 +376,10 @@
         ((FrameLayout.LayoutParams) mCloseButton.getLayoutParams()).gravity =
                 Gravity.CENTER_VERTICAL | Gravity.END;
 
-        ((FrameLayout.LayoutParams) mCustomActionButtons.getLayoutParams())
-                .setMarginEnd(buttonWidth);
+        FrameLayout.LayoutParams actionButtonsLayoutParams =
+                (FrameLayout.LayoutParams) mCustomActionButtons.getLayoutParams();
+        actionButtonsLayoutParams.setMarginEnd(buttonWidth);
+        mCustomActionButtons.setLayoutParams(actionButtonsLayoutParams);
     }
 
     private void updateToolbarLayoutMargin() {
diff --git a/chrome/browser/ash/login/reset_browsertest.cc b/chrome/browser/ash/login/reset_browsertest.cc
index 305af48..7bd7cf42 100644
--- a/chrome/browser/ash/login/reset_browsertest.cc
+++ b/chrome/browser/ash/login/reset_browsertest.cc
@@ -7,6 +7,7 @@
 #include "ash/constants/ash_switches.h"
 #include "ash/public/cpp/login_accelerators.h"
 #include "ash/public/cpp/login_screen_test_api.h"
+#include "ash/public/cpp/test/shell_test_api.h"
 #include "base/command_line.h"
 #include "chrome/browser/ash/login/login_wizard.h"
 #include "chrome/browser/ash/login/oobe_screen.h"
@@ -59,8 +60,9 @@
 constexpr char kCancelPowerwashButton[] = "cancelButton";
 constexpr char kRestartButton[] = "restart";
 
-void InvokeRollbackOption() {
-  test::ExecuteOobeJS("cr.ui.Oobe.handleAccelerator('reset');");
+void InvokeResetAccelerator() {
+  ASSERT_TRUE(LoginScreenTestApi::SendAcceleratorNatively(ui::Accelerator(
+      ui::VKEY_R, ui::EF_CONTROL_DOWN | ui::EF_SHIFT_DOWN | ui::EF_ALT_DOWN)));
 }
 
 void ClickCancelButton() {
@@ -162,7 +164,7 @@
 
   // Simulates reset screen request from OOBE UI.
   void InvokeResetScreen() {
-    InvokeRollbackOption();
+    InvokeResetAccelerator();
     OobeScreenWaiter(ResetView::kScreenId).Wait();
     EXPECT_FALSE(LoginScreenTestApi::IsGuestButtonShown());
     ExpectConfirmationDialogClosed();
@@ -348,7 +350,7 @@
   update_engine_client()->set_can_rollback_check_result(true);
   prefs->SetBoolean(prefs::kFactoryResetRequested, true);
   InvokeResetScreen();
-  InvokeRollbackOption();
+  InvokeResetAccelerator();
 
   ClickToConfirmButton();
   WaitForConfirmationDialogToOpen();
@@ -377,7 +379,7 @@
   EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
   EXPECT_EQ(0, FakeSessionManagerClient::Get()->start_device_wipe_call_count());
   EXPECT_EQ(0, update_engine_client()->rollback_call_count());
-  InvokeRollbackOption();  // No changes
+  InvokeResetAccelerator();  // No changes
   ClickToConfirmButton();
   ClickResetButton();
   EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
@@ -419,7 +421,7 @@
   // Next invocation leads to simple reset, not rollback view.
   prefs->SetBoolean(prefs::kFactoryResetRequested, true);
   InvokeResetScreen();
-  InvokeRollbackOption();  // Shows rollback.
+  InvokeResetAccelerator();  // Shows rollback.
   EXPECT_FALSE(LoginScreenTestApi::IsGuestButtonShown());
   ClickDismissConfirmationButton();
   EXPECT_FALSE(LoginScreenTestApi::IsGuestButtonShown());
@@ -435,7 +437,7 @@
 
   prefs->SetBoolean(prefs::kFactoryResetRequested, true);
   InvokeResetScreen();
-  InvokeRollbackOption();  // Shows rollback.
+  InvokeResetAccelerator();  // Shows rollback.
   ClickToConfirmButton();
   ClickResetButton();
   EXPECT_EQ(0, FakePowerManagerClient::Get()->num_request_restart_calls());
@@ -452,7 +454,7 @@
   EXPECT_EQ(0, update_engine_client()->rollback_call_count());
   test::OobeJS().ExpectHasNoClass("revert-promise-view", {kResetScreen});
 
-  InvokeRollbackOption();
+  InvokeResetAccelerator();
   ClickToConfirmButton();
   ClickResetButton();
 
@@ -484,7 +486,7 @@
   test::OobeJS().ExpectVisible(kResetScreen);
   test::OobeJS().ExpectHasNoClass("rollback-proposal-view", {kResetScreen});
 
-  InvokeRollbackOption();
+  InvokeResetAccelerator();
   test::OobeJS()
       .CreateHasClassWaiter(true, "rollback-proposal-view", {kResetScreen})
       ->Wait();
@@ -492,7 +494,7 @@
   CloseResetScreenAndWait();
   InvokeResetScreen();
 
-  InvokeRollbackOption();
+  InvokeResetAccelerator();
   test::OobeJS()
       .CreateHasClassWaiter(true, "rollback-proposal-view", {kResetScreen})
       ->Wait();
diff --git a/chrome/browser/ash/login/screens/reset_screen.cc b/chrome/browser/ash/login/screens/reset_screen.cc
index 8bfe1a7..fdaa5d6 100644
--- a/chrome/browser/ash/login/screens/reset_screen.cc
+++ b/chrome/browser/ash/login/screens/reset_screen.cc
@@ -7,6 +7,7 @@
 #include <utility>
 
 #include "ash/constants/ash_switches.h"
+#include "ash/public/cpp/login_accelerators.h"
 #include "ash/public/cpp/login_screen.h"
 #include "ash/public/cpp/scoped_guest_button_blocker.h"
 #include "base/bind.h"
@@ -303,6 +304,14 @@
     BaseScreen::OnUserActionDeprecated(action_id);
 }
 
+bool ResetScreen::HandleAccelerator(LoginAcceleratorAction action) {
+  if (action == LoginAcceleratorAction::kShowResetScreen) {
+    OnToggleRollback();
+    return true;
+  }
+  return false;
+}
+
 void ResetScreen::OnCancel() {
   if (is_hidden() ||
       (view_ && view_->GetScreenState() == ResetView::State::kRevertPromise)) {
diff --git a/chrome/browser/ash/login/screens/reset_screen.h b/chrome/browser/ash/login/screens/reset_screen.h
index 5453ad0..f4f37da 100644
--- a/chrome/browser/ash/login/screens/reset_screen.h
+++ b/chrome/browser/ash/login/screens/reset_screen.h
@@ -9,6 +9,7 @@
 #include <set>
 #include <string>
 
+#include "ash/public/cpp/login_accelerators.h"
 #include "base/callback.h"
 #include "base/memory/ref_counted.h"
 #include "base/memory/weak_ptr.h"
@@ -69,6 +70,7 @@
   void ShowImpl() override;
   void HideImpl() override;
   void OnUserActionDeprecated(const std::string& action_id) override;
+  bool HandleAccelerator(LoginAcceleratorAction action) final;
 
   // UpdateEngineClient::Observer implementation:
   void UpdateStatusChanged(const update_engine::StatusResult& status) override;
diff --git a/chrome/browser/ash/login/ui/login_display_host_common.cc b/chrome/browser/ash/login/ui/login_display_host_common.cc
index b32505c..929585a 100644
--- a/chrome/browser/ash/login/ui/login_display_host_common.cc
+++ b/chrome/browser/ash/login/ui/login_display_host_common.cc
@@ -20,6 +20,7 @@
 #include "chrome/browser/ash/login/screens/encryption_migration_screen.h"
 #include "chrome/browser/ash/login/screens/gaia_screen.h"
 #include "chrome/browser/ash/login/screens/pin_setup_screen.h"
+#include "chrome/browser/ash/login/screens/reset_screen.h"
 #include "chrome/browser/ash/login/screens/saml_confirm_password_screen.h"
 #include "chrome/browser/ash/login/screens/signin_fatal_error_screen.h"
 #include "chrome/browser/ash/login/startup_utils.h"
@@ -40,10 +41,12 @@
 #include "chrome/browser/ui/webui/chromeos/login/locale_switch_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/management_transition_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/os_install_screen_handler.h"
+#include "chrome/browser/ui/webui/chromeos/login/reset_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/saml_confirm_password_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/signin_fatal_error_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/terms_of_service_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/user_creation_screen_handler.h"
+#include "chrome/common/pref_names.h"
 #include "chrome/grit/generated_resources.h"
 #include "components/keep_alive_registry/keep_alive_types.h"
 #include "components/strings/grit/components_strings.h"
@@ -417,6 +420,18 @@
       GetWizardController()->HandleAccelerator(action)) {
     return true;
   }
+
+  // We check the reset screen accelerator after checking with the
+  // WizardController because this accelerator is also handled by the
+  // reset screen itself - triggering the rollback option. In such case we
+  // return in the previous statement.
+  if (action == LoginAcceleratorAction::kShowResetScreen) {
+    ResetScreen::CheckIfPowerwashAllowed(
+        base::BindOnce(&LoginDisplayHostCommon::OnPowerwashAllowedCallback,
+                       weak_factory_.GetWeakPtr()));
+    return true;
+  }
+
   // There are currently no global accelerators for the lock screen that
   // require WebUI. So we do not need to specifically load it when user is
   // logged in.
@@ -439,6 +454,20 @@
   wizard_context_->screen_after_managed_tos = screen_id;
 }
 
+void LoginDisplayHostCommon::OnPowerwashAllowedCallback(
+    bool is_reset_allowed,
+    absl::optional<tpm_firmware_update::Mode> tpm_firmware_update_mode) {
+  if (!is_reset_allowed)
+    return;
+  if (tpm_firmware_update_mode.has_value()) {
+    // Force the TPM firmware update option to be enabled.
+    g_browser_process->local_state()->SetInteger(
+        prefs::kFactoryResetTPMFirmwareUpdateMode,
+        static_cast<int>(tpm_firmware_update_mode.value()));
+  }
+  StartWizard(ResetView::kScreenId);
+}
+
 void LoginDisplayHostCommon::StartUserOnboarding() {
   StartWizard(LocaleSwitchView::kScreenId);
 }
diff --git a/chrome/browser/ash/login/ui/login_display_host_common.h b/chrome/browser/ash/login/ui/login_display_host_common.h
index de179c9..679f1281 100644
--- a/chrome/browser/ash/login/ui/login_display_host_common.h
+++ b/chrome/browser/ash/login/ui/login_display_host_common.h
@@ -132,6 +132,10 @@
   // TermsOfServiceScreen.
   void SetScreenAfterManagedTos(OobeScreenId screen_id);
 
+  void OnPowerwashAllowedCallback(
+      bool is_reset_allowed,
+      absl::optional<tpm_firmware_update::Mode> tpm_firmware_update_mode);
+
   // True if session start is in progress.
   bool session_starting_ = false;
 
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/network/https_latency_sampler.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/network/https_latency_sampler.cc
index 6d58163b..53331516 100644
--- a/chrome/browser/ash/policy/reporting/metrics_reporting/network/https_latency_sampler.cc
+++ b/chrome/browser/ash/policy/reporting/metrics_reporting/network/https_latency_sampler.cc
@@ -102,7 +102,7 @@
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 }
 
-void HttpsLatencySampler::Collect(MetricCallback callback) {
+void HttpsLatencySampler::MaybeCollect(OptionalMetricCallback callback) {
   CHECK(base::SequencedTaskRunnerHandle::IsSet());
   DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_);
 
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/network/https_latency_sampler.h b/chrome/browser/ash/policy/reporting/metrics_reporting/network/https_latency_sampler.h
index 69c41db0..e9bfcbc 100644
--- a/chrome/browser/ash/policy/reporting/metrics_reporting/network/https_latency_sampler.h
+++ b/chrome/browser/ash/policy/reporting/metrics_reporting/network/https_latency_sampler.h
@@ -52,7 +52,7 @@
 
   ~HttpsLatencySampler() override;
 
-  void Collect(MetricCallback callback) override;
+  void MaybeCollect(OptionalMetricCallback callback) override;
 
  private:
   void OnHttpsLatencyRoutineCompleted(
@@ -63,7 +63,7 @@
   mojo::Remote<
       ::chromeos::network_diagnostics::mojom::NetworkDiagnosticsRoutines>
       network_diagnostics_service_;
-  base::queue<MetricCallback> metric_callbacks_;
+  base::queue<OptionalMetricCallback> metric_callbacks_;
 
   const std::unique_ptr<Delegate> delegate_;
 
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/network/https_latency_sampler_unittest.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/network/https_latency_sampler_unittest.cc
index 52b3e14..1902598 100644
--- a/chrome/browser/ash/policy/reporting/metrics_reporting/network/https_latency_sampler_unittest.cc
+++ b/chrome/browser/ash/policy/reporting/metrics_reporting/network/https_latency_sampler_unittest.cc
@@ -141,10 +141,14 @@
   HttpsLatencySampler sampler(
       std::make_unique<FakeHttpsLatencyDelegate>(&diagnostics));
 
-  test::TestEvent<MetricData> metric_collect_event;
-  sampler.Collect(metric_collect_event.cb());
+  test::TestEvent<absl::optional<MetricData>> metric_collect_event;
+  sampler.MaybeCollect(metric_collect_event.cb());
   diagnostics.ExecuteCallback();
-  const auto metric_result = metric_collect_event.result();
+  const absl::optional<MetricData> optional_result =
+      metric_collect_event.result();
+
+  ASSERT_TRUE(optional_result.has_value());
+  const MetricData& metric_result = optional_result.value();
 
   ASSERT_TRUE(metric_result.has_telemetry_data());
   EXPECT_EQ(metric_result.telemetry_data()
@@ -171,10 +175,14 @@
   HttpsLatencySampler sampler(
       std::make_unique<FakeHttpsLatencyDelegate>(&diagnostics));
 
-  test::TestEvent<MetricData> metric_collect_event;
-  sampler.Collect(metric_collect_event.cb());
+  test::TestEvent<absl::optional<MetricData>> metric_collect_event;
+  sampler.MaybeCollect(metric_collect_event.cb());
   diagnostics.ExecuteCallback();
-  const auto metric_result = metric_collect_event.result();
+  const absl::optional<MetricData> optional_result =
+      metric_collect_event.result();
+
+  ASSERT_TRUE(optional_result.has_value());
+  const MetricData& metric_result = optional_result.value();
 
   ASSERT_TRUE(metric_result.has_telemetry_data());
   EXPECT_EQ(metric_result.telemetry_data()
@@ -201,12 +209,16 @@
   HttpsLatencySampler sampler(
       std::make_unique<FakeHttpsLatencyDelegate>(&diagnostics));
 
-  test::TestEvent<MetricData> metric_collect_events[2];
-  sampler.Collect(metric_collect_events[0].cb());
-  sampler.Collect(metric_collect_events[1].cb());
+  test::TestEvent<absl::optional<MetricData>> metric_collect_events[2];
+  sampler.MaybeCollect(metric_collect_events[0].cb());
+  sampler.MaybeCollect(metric_collect_events[1].cb());
   diagnostics.ExecuteCallback();
+  const absl::optional<MetricData> first_optional_result =
+      metric_collect_events[0].result();
 
-  const auto first_metric_result = metric_collect_events[0].result();
+  ASSERT_TRUE(first_optional_result.has_value());
+  const MetricData& first_metric_result = first_optional_result.value();
+
   ASSERT_TRUE(first_metric_result.has_telemetry_data());
   EXPECT_EQ(first_metric_result.telemetry_data()
                 .networks_telemetry()
@@ -223,7 +235,12 @@
                 .problem(),
             HttpsLatencyProblem::FAILED_DNS_RESOLUTIONS);
 
-  const auto second_metric_result = metric_collect_events[1].result();
+  const absl::optional<MetricData> second_optional_result =
+      metric_collect_events[1].result();
+
+  ASSERT_TRUE(second_optional_result.has_value());
+  const MetricData& second_metric_result = second_optional_result.value();
+
   ASSERT_TRUE(second_metric_result.has_telemetry_data());
   EXPECT_EQ(second_metric_result.telemetry_data()
                 .networks_telemetry()
@@ -252,10 +269,14 @@
     const int latency_ms = 1000;
     diagnostics.SetResultProblemLatency(HttpsLatencyProblemMojom::kHighLatency,
                                         latency_ms);
-    test::TestEvent<MetricData> metric_collect_event;
-    sampler.Collect(metric_collect_event.cb());
+    test::TestEvent<absl::optional<MetricData>> metric_collect_event;
+    sampler.MaybeCollect(metric_collect_event.cb());
     diagnostics.ExecuteCallback();
-    const auto first_metric_result = metric_collect_event.result();
+    const absl::optional<MetricData> first_optional_result =
+        metric_collect_event.result();
+
+    ASSERT_TRUE(first_optional_result.has_value());
+    const MetricData& first_metric_result = first_optional_result.value();
 
     ASSERT_TRUE(first_metric_result.has_telemetry_data());
     EXPECT_EQ(first_metric_result.telemetry_data()
@@ -279,10 +300,14 @@
     const int latency_ms = 5000;
     diagnostics.SetResultProblemLatency(
         HttpsLatencyProblemMojom::kVeryHighLatency, latency_ms);
-    test::TestEvent<MetricData> metric_collect_event;
-    sampler.Collect(metric_collect_event.cb());
+    test::TestEvent<absl::optional<MetricData>> metric_collect_event;
+    sampler.MaybeCollect(metric_collect_event.cb());
     diagnostics.ExecuteCallback();
-    const auto second_metric_result = metric_collect_event.result();
+    const absl::optional<MetricData> second_optional_result =
+        metric_collect_event.result();
+
+    ASSERT_TRUE(second_optional_result.has_value());
+    const MetricData& second_metric_result = second_optional_result.value();
 
     ASSERT_TRUE(second_metric_result.has_telemetry_data());
     EXPECT_EQ(second_metric_result.telemetry_data()
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_info_sampler.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_info_sampler.cc
index 984f22d..d59678c 100644
--- a/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_info_sampler.cc
+++ b/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_info_sampler.cc
@@ -34,7 +34,7 @@
 
 }  // namespace
 
-void NetworkInfoSampler::Collect(MetricCallback callback) {
+void NetworkInfoSampler::MaybeCollect(OptionalMetricCallback callback) {
   ::ash::NetworkStateHandler::DeviceStateList device_list;
   ::ash::NetworkStateHandler* network_state_handler =
       ::ash::NetworkHandler::Get()->network_state_handler();
@@ -85,7 +85,10 @@
 
   if (!networks_info->network_interfaces().empty()) {
     std::move(callback).Run(std::move(metric_data));
+    return;
   }
+
+  std::move(callback).Run(absl::nullopt);
 }
 
 }  // namespace reporting
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_info_sampler.h b/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_info_sampler.h
index 42e46bc3..960b02b8 100644
--- a/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_info_sampler.h
+++ b/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_info_sampler.h
@@ -19,7 +19,7 @@
 
   ~NetworkInfoSampler() override = default;
 
-  void Collect(MetricCallback callback) override;
+  void MaybeCollect(OptionalMetricCallback callback) override;
 };
 
 }  // namespace reporting
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_info_sampler_unittest.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_info_sampler_unittest.cc
index e21ab535..c1dc25a 100644
--- a/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_info_sampler_unittest.cc
+++ b/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_info_sampler_unittest.cc
@@ -20,6 +20,7 @@
 #include "chromeos/network/network_state_handler.h"
 #include "dbus/object_path.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
 
 namespace reporting {
@@ -49,6 +50,7 @@
   void SetUp() override {
     device_client_ = network_handler_test_helper_.device_test();
     device_client_->ClearDevices();
+    base::RunLoop().RunUntilIdle();
   }
 
   ::ash::ShillDeviceClient::TestInterface* device_client_;
@@ -95,8 +97,11 @@
 
   MetricData result;
   NetworkInfoSampler sampler;
-  sampler.Collect(base::BindLambdaForTesting(
-      [&](MetricData metric_data) { result = std::move(metric_data); }));
+  sampler.MaybeCollect(
+      base::BindLambdaForTesting([&](absl::optional<MetricData> metric_data) {
+        ASSERT_TRUE(metric_data.has_value());
+        result = std::move(metric_data.value());
+      }));
 
   ASSERT_TRUE(result.has_info_data());
   ASSERT_TRUE(result.info_data().has_networks_info());
@@ -180,8 +185,11 @@
 
   MetricData result;
   NetworkInfoSampler sampler;
-  sampler.Collect(base::BindLambdaForTesting(
-      [&](MetricData metric_data) { result = std::move(metric_data); }));
+  sampler.MaybeCollect(
+      base::BindLambdaForTesting([&](absl::optional<MetricData> metric_data) {
+        ASSERT_TRUE(metric_data.has_value());
+        result = std::move(metric_data.value());
+      }));
 
   ASSERT_TRUE(result.has_info_data());
   ASSERT_TRUE(result.info_data().has_networks_info());
@@ -208,5 +216,17 @@
       result.info_data().networks_info().network_interfaces(0).eids().empty());
 }
 
+TEST_F(NetworkInfoSamplerTest, NoDevices) {
+  bool callback_called = false;
+  NetworkInfoSampler sampler;
+  sampler.MaybeCollect(
+      base::BindLambdaForTesting([&](absl::optional<MetricData> metric_data) {
+        ASSERT_FALSE(metric_data.has_value());
+        callback_called = true;
+      }));
+
+  ASSERT_TRUE(callback_called);
+}
+
 }  // namespace
 }  // namespace reporting
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler.cc
index 8f09e72..6a3bcee 100644
--- a/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler.cc
+++ b/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler.cc
@@ -100,10 +100,12 @@
   return NetworkType::NETWORK_TYPE_UNSPECIFIED;  // Unsupported
 }
 
-void OnHttpsLatencySamplerCompleted(MetricCallback callback,
+void OnHttpsLatencySamplerCompleted(OptionalMetricCallback callback,
                                     MetricData network_data,
-                                    MetricData latency_data) {
-  network_data.CheckTypeAndMergeFrom(latency_data);
+                                    absl::optional<MetricData> latency_data) {
+  if (latency_data.has_value()) {
+    network_data.CheckTypeAndMergeFrom(latency_data.value());
+  }
   std::move(callback).Run(std::move(network_data));
 }
 }  // namespace
@@ -113,7 +115,7 @@
 
 NetworkTelemetrySampler::~NetworkTelemetrySampler() = default;
 
-void NetworkTelemetrySampler::Collect(MetricCallback callback) {
+void NetworkTelemetrySampler::MaybeCollect(OptionalMetricCallback callback) {
   auto handle_probe_result_cb =
       base::BindOnce(&NetworkTelemetrySampler::HandleNetworkTelemetryResult,
                      weak_ptr_factory_.GetWeakPtr(), std::move(callback));
@@ -125,7 +127,7 @@
 }
 
 void NetworkTelemetrySampler::HandleNetworkTelemetryResult(
-    MetricCallback callback,
+    OptionalMetricCallback callback,
     ::chromeos::cros_healthd::mojom::TelemetryInfoPtr result) {
   bool full_telemetry_reporting_enabled = base::FeatureList::IsEnabled(
       MetricReportingManager::kEnableNetworkTelemetryReporting);
@@ -146,6 +148,7 @@
       /*limit=*/0,  // no limit to number of results
       &network_state_list);
   if (network_state_list.empty()) {
+    std::move(callback).Run(absl::nullopt);
     return;
   }
 
@@ -237,11 +240,17 @@
   }
 
   if (should_collect_latency) {
-    https_latency_sampler_->Collect(
+    https_latency_sampler_->MaybeCollect(
         base::BindOnce(OnHttpsLatencySamplerCompleted, std::move(callback),
                        std::move(metric_data)));
-  } else if (should_report) {
-    std::move(callback).Run(std::move(metric_data));
+    return;
   }
+  if (should_report) {
+    std::move(callback).Run(std::move(metric_data));
+    return;
+  }
+
+  std::move(callback).Run(absl::nullopt);
 }
+
 }  // namespace reporting
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler.h b/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler.h
index 7a4fc979..e7f5d133 100644
--- a/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler.h
+++ b/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler.h
@@ -22,11 +22,11 @@
 
   ~NetworkTelemetrySampler() override;
 
-  void Collect(MetricCallback callback) override;
+  void MaybeCollect(OptionalMetricCallback callback) override;
 
  private:
   void HandleNetworkTelemetryResult(
-      MetricCallback callback,
+      OptionalMetricCallback callback,
       ::chromeos::cros_healthd::mojom::TelemetryInfoPtr result);
 
   Sampler* const https_latency_sampler_;
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler_unittest.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler_unittest.cc
index 09bdcb2..1b1cac4 100644
--- a/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler_unittest.cc
+++ b/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler_unittest.cc
@@ -27,6 +27,7 @@
 #include "components/reporting/util/test_support_callbacks.h"
 #include "testing/gmock/include/gmock/gmock.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/abseil-cpp/absl/types/optional.h"
 #include "third_party/cros_system_api/dbus/shill/dbus-constants.h"
 
 namespace reporting {
@@ -197,9 +198,15 @@
   SetNetworkData(networks_data);
   NetworkTelemetrySampler network_telemetry_sampler(
       https_latency_sampler_.get());
-  test::TestEvent<MetricData> metric_collect_event;
-  network_telemetry_sampler.Collect(metric_collect_event.cb());
-  TelemetryData result = metric_collect_event.result().telemetry_data();
+  test::TestEvent<absl::optional<MetricData>> metric_collect_event;
+  network_telemetry_sampler.MaybeCollect(metric_collect_event.cb());
+  const absl::optional<MetricData> optional_result =
+      metric_collect_event.result();
+
+  ASSERT_TRUE(optional_result.has_value());
+  ASSERT_TRUE(optional_result->has_telemetry_data());
+  const TelemetryData& result = optional_result->telemetry_data();
+  ASSERT_TRUE(result.has_networks_telemetry());
 
   // No online networks, no latency data should be collected.
   EXPECT_FALSE(result.networks_telemetry().has_https_latency_data());
@@ -236,6 +243,18 @@
                    .has_power_management_enabled());
 }
 
+TEST_F(NetworkTelemetrySamplerTest, NoNetworkData) {
+  SetNetworkData({});
+
+  NetworkTelemetrySampler network_telemetry_sampler(
+      https_latency_sampler_.get());
+  test::TestEvent<absl::optional<MetricData>> metric_collect_event;
+  network_telemetry_sampler.MaybeCollect(metric_collect_event.cb());
+  const absl::optional<MetricData> result = metric_collect_event.result();
+
+  ASSERT_FALSE(result.has_value());
+}
+
 TEST_F(NetworkTelemetrySamplerTest, CellularNotConnected) {
   // Signal strength should be ignored for non wifi networks even if it is set.
   const std::vector<FakeNetworkData> networks_data = {
@@ -246,12 +265,11 @@
   SetNetworkData(networks_data);
   NetworkTelemetrySampler network_telemetry_sampler(
       https_latency_sampler_.get());
-  bool is_collected = false;
-  network_telemetry_sampler.Collect(
-      base::BindLambdaForTesting([&](MetricData) { is_collected = true; }));
-  base::RunLoop().RunUntilIdle();
+  test::TestEvent<absl::optional<MetricData>> metric_collect_event;
+  network_telemetry_sampler.MaybeCollect(metric_collect_event.cb());
+  const absl::optional<MetricData> result = metric_collect_event.result();
 
-  ASSERT_FALSE(is_collected);
+  ASSERT_FALSE(result.has_value());
 }
 
 TEST_F(NetworkTelemetrySamplerTest, WifiNotConnected_NoSignalStrength) {
@@ -263,12 +281,11 @@
   SetNetworkData(networks_data);
   NetworkTelemetrySampler network_telemetry_sampler(
       https_latency_sampler_.get());
-  bool is_collected = false;
-  network_telemetry_sampler.Collect(
-      base::BindLambdaForTesting([&](MetricData) { is_collected = true; }));
-  base::RunLoop().RunUntilIdle();
+  test::TestEvent<absl::optional<MetricData>> metric_collect_event;
+  network_telemetry_sampler.MaybeCollect(metric_collect_event.cb());
+  const absl::optional<MetricData> result = metric_collect_event.result();
 
-  ASSERT_FALSE(is_collected);
+  ASSERT_FALSE(result.has_value());
 }
 
 TEST_F(NetworkTelemetrySamplerTest, EthernetPortal) {
@@ -281,9 +298,15 @@
   SetNetworkData(networks_data);
   NetworkTelemetrySampler network_telemetry_sampler(
       https_latency_sampler_.get());
-  test::TestEvent<MetricData> metric_collect_event;
-  network_telemetry_sampler.Collect(metric_collect_event.cb());
-  TelemetryData result = metric_collect_event.result().telemetry_data();
+  test::TestEvent<absl::optional<MetricData>> metric_collect_event;
+  network_telemetry_sampler.MaybeCollect(metric_collect_event.cb());
+  const absl::optional<MetricData> optional_result =
+      metric_collect_event.result();
+
+  ASSERT_TRUE(optional_result.has_value());
+  ASSERT_TRUE(optional_result->has_telemetry_data());
+  const TelemetryData& result = optional_result->telemetry_data();
+  ASSERT_TRUE(result.has_networks_telemetry());
 
   // No online networks, no latency data should be collected.
   EXPECT_FALSE(result.networks_telemetry().has_https_latency_data());
@@ -321,6 +344,64 @@
                    .has_power_management_enabled());
 }
 
+TEST_F(NetworkTelemetrySamplerTest, EmptyLatencyData) {
+  const std::vector<FakeNetworkData> networks_data = {
+      {"guid1", shill::kStateOnline, shill::kTypeEthernet,
+       0 /* signal_strength */, "eth0", "192.168.86.25" /* ip_address */,
+       "192.168.86.1" /* gateway */, true /* is_portal */,
+       true /* is_visible */, true /* is_configured */}};
+
+  SetNetworkData(networks_data);
+  https_latency_sampler_->SetMetricData(absl::nullopt);
+
+  NetworkTelemetrySampler network_telemetry_sampler(
+      https_latency_sampler_.get());
+  test::TestEvent<absl::optional<MetricData>> metric_collect_event;
+  network_telemetry_sampler.MaybeCollect(metric_collect_event.cb());
+  const absl::optional<MetricData> optional_result =
+      metric_collect_event.result();
+
+  ASSERT_TRUE(optional_result.has_value());
+  ASSERT_TRUE(optional_result->has_telemetry_data());
+  const TelemetryData& result = optional_result->telemetry_data();
+  ASSERT_TRUE(result.has_networks_telemetry());
+
+  // Latency data is absent but network data is still collected.
+  EXPECT_FALSE(result.networks_telemetry().has_https_latency_data());
+
+  ASSERT_THAT(result.networks_telemetry().network_telemetry(),
+              ::testing::SizeIs(networks_data.size()));
+  EXPECT_EQ(result.networks_telemetry().network_telemetry(0).guid(),
+            networks_data[0].guid);
+  EXPECT_EQ(result.networks_telemetry().network_telemetry(0).connection_state(),
+            NetworkConnectionState::ONLINE);
+  EXPECT_FALSE(
+      result.networks_telemetry().network_telemetry(0).has_signal_strength());
+  EXPECT_EQ(result.networks_telemetry().network_telemetry(0).device_path(),
+            DevicePath(networks_data[0].device_name));
+  EXPECT_EQ(result.networks_telemetry().network_telemetry(0).ip_address(),
+            networks_data[0].ip_address);
+  EXPECT_EQ(result.networks_telemetry().network_telemetry(0).gateway(),
+            networks_data[0].gateway);
+  EXPECT_EQ(result.networks_telemetry().network_telemetry(0).type(),
+            NetworkType::ETHERNET);
+
+  // Make sure wireless interface info wasn't added.
+  EXPECT_FALSE(
+      result.networks_telemetry().network_telemetry(0).has_tx_bit_rate_mbps());
+  EXPECT_FALSE(
+      result.networks_telemetry().network_telemetry(0).has_rx_bit_rate_mbps());
+  EXPECT_FALSE(
+      result.networks_telemetry().network_telemetry(0).has_tx_power_dbm());
+  EXPECT_FALSE(
+      result.networks_telemetry().network_telemetry(0).has_encryption_on());
+  EXPECT_FALSE(
+      result.networks_telemetry().network_telemetry(0).has_link_quality());
+  EXPECT_FALSE(result.networks_telemetry()
+                   .network_telemetry(0)
+                   .has_power_management_enabled());
+}
+
 TEST_F(NetworkTelemetrySamplerTest, MixTypesAndConfigurations) {
   const std::vector<FakeNetworkData> networks_data = {
       {"guid1", shill::kStateReady, shill::kTypeWifi, 10 /* signal_strength */,
@@ -338,9 +419,15 @@
   SetNetworkData(networks_data);
   NetworkTelemetrySampler network_telemetry_sampler(
       https_latency_sampler_.get());
-  test::TestEvent<MetricData> metric_collect_event;
-  network_telemetry_sampler.Collect(metric_collect_event.cb());
-  TelemetryData result = metric_collect_event.result().telemetry_data();
+  test::TestEvent<absl::optional<MetricData>> metric_collect_event;
+  network_telemetry_sampler.MaybeCollect(metric_collect_event.cb());
+  const absl::optional<MetricData> optional_result =
+      metric_collect_event.result();
+
+  ASSERT_TRUE(optional_result.has_value());
+  ASSERT_TRUE(optional_result->has_telemetry_data());
+  const TelemetryData& result = optional_result->telemetry_data();
+  ASSERT_TRUE(result.has_networks_telemetry());
 
   // An online network exists, latency data should be collected.
   ASSERT_TRUE(result.networks_telemetry().has_https_latency_data());
@@ -435,9 +522,15 @@
                  /*enable_full_network_telemetry_reporting=*/false);
   NetworkTelemetrySampler network_telemetry_sampler(
       https_latency_sampler_.get());
-  test::TestEvent<MetricData> metric_collect_event;
-  network_telemetry_sampler.Collect(metric_collect_event.cb());
-  TelemetryData result = metric_collect_event.result().telemetry_data();
+  test::TestEvent<absl::optional<MetricData>> metric_collect_event;
+  network_telemetry_sampler.MaybeCollect(metric_collect_event.cb());
+  const absl::optional<MetricData> optional_result =
+      metric_collect_event.result();
+
+  ASSERT_TRUE(optional_result.has_value());
+  ASSERT_TRUE(optional_result->has_telemetry_data());
+  const TelemetryData& result = optional_result->telemetry_data();
+  ASSERT_TRUE(result.has_networks_telemetry());
 
   // Flag is disabled, no latency data should be collected
   EXPECT_FALSE(result.networks_telemetry().has_https_latency_data());
@@ -484,9 +577,15 @@
   SetNetworkData(networks_data);
   NetworkTelemetrySampler network_telemetry_sampler(
       https_latency_sampler_.get());
-  test::TestEvent<MetricData> metric_collect_event;
-  network_telemetry_sampler.Collect(metric_collect_event.cb());
-  TelemetryData result = metric_collect_event.result().telemetry_data();
+  test::TestEvent<absl::optional<MetricData>> metric_collect_event;
+  network_telemetry_sampler.MaybeCollect(metric_collect_event.cb());
+  const absl::optional<MetricData> optional_result =
+      metric_collect_event.result();
+
+  ASSERT_TRUE(optional_result.has_value());
+  ASSERT_TRUE(optional_result->has_telemetry_data());
+  const TelemetryData& result = optional_result->telemetry_data();
+  ASSERT_TRUE(result.has_networks_telemetry());
 
   // No online networks, no latency data should be collected.
   EXPECT_FALSE(result.networks_telemetry().has_https_latency_data());
diff --git a/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.cc b/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.cc
index 0626e9f..262a4a6 100644
--- a/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.cc
+++ b/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.cc
@@ -44,27 +44,6 @@
   return GooglePhotosAlbumsFetcher::GetResultCount(result);
 }
 
-MockGooglePhotosCountFetcher::MockGooglePhotosCountFetcher(Profile* profile)
-    : GooglePhotosCountFetcher(profile) {
-  ON_CALL(*this, AddRequestAndStartIfNecessary)
-      .WillByDefault([](base::OnceCallback<void(int)> callback) {
-        base::SequencedTaskRunnerHandle::Get()->PostTask(
-            FROM_HERE, base::BindOnce(std::move(callback), /*count=*/0));
-      });
-
-  ON_CALL(*this, ParseResponse)
-      .WillByDefault([this](const base::Value::Dict* response) {
-        return GooglePhotosCountFetcher::ParseResponse(response);
-      });
-}
-
-MockGooglePhotosCountFetcher::~MockGooglePhotosCountFetcher() = default;
-
-absl::optional<size_t> MockGooglePhotosCountFetcher::GetResultCount(
-    const int& result) {
-  return GooglePhotosCountFetcher::GetResultCount(result);
-}
-
 MockGooglePhotosEnabledFetcher::MockGooglePhotosEnabledFetcher(Profile* profile)
     : GooglePhotosEnabledFetcher(profile) {
   ON_CALL(*this, AddRequestAndStartIfNecessary)
diff --git a/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.h b/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.h
index 4820fd2..fc26d910 100644
--- a/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.h
+++ b/chrome/browser/ash/wallpaper_handlers/mock_wallpaper_handlers.h
@@ -41,33 +41,6 @@
       const GooglePhotosAlbumsCbkArgs& result) override;
 };
 
-// Fetcher that returns a dummy value for the number of photos in a user's
-// Google Photos library. Used to avoid network requests in unit tests.
-class MockGooglePhotosCountFetcher : public GooglePhotosCountFetcher {
- public:
-  explicit MockGooglePhotosCountFetcher(Profile* profile);
-
-  MockGooglePhotosCountFetcher(const MockGooglePhotosCountFetcher&) = delete;
-  MockGooglePhotosCountFetcher& operator=(const MockGooglePhotosCountFetcher&) =
-      delete;
-
-  ~MockGooglePhotosCountFetcher() override;
-
-  // GooglePhotosCountFetcher:
-  MOCK_METHOD(void,
-              AddRequestAndStartIfNecessary,
-              (base::OnceCallback<void(int)> callback),
-              (override));
-
-  MOCK_METHOD(int,
-              ParseResponse,
-              (const base::Value::Dict* response),
-              (override));
-
-  // Overridden to increase visibility.
-  absl::optional<size_t> GetResultCount(const int& result) override;
-};
-
 // Fetcher that claims the user is allowed to access Google Photos data. Used to
 // avoid network requests in unit tests.
 class MockGooglePhotosEnabledFetcher : public GooglePhotosEnabledFetcher {
diff --git a/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc b/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc
index 964983e..2e86e40 100644
--- a/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc
+++ b/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc
@@ -105,30 +105,6 @@
           "Not implemented, considered not necessary."
       })");
 
-// The URL to download the number of photos in a user's Google Photos library.
-constexpr char kGooglePhotosCountUrl[] =
-    "https://photosfirstparty-pa.googleapis.com/v1/chromeos/user:read";
-
-constexpr net::NetworkTrafficAnnotationTag kGooglePhotosCountTrafficAnnotation =
-    net::DefineNetworkTrafficAnnotation("wallpaper_google_photos_count",
-                                        R"(
-      semantics {
-        sender: "ChromeOS Wallpaper Picker"
-        description:
-          "The ChromeOS Wallpaper Picker displays a tile to view and pick from "
-          "a user's Google Photos library. The tile shows the library's number "
-          "of photos, which this query fetches."
-        trigger: "When the user opens the ChromeOS Wallpaper Picker app."
-        data: "OAuth credentials for the user's Google Photos account."
-        destination: GOOGLE_OWNED_SERVICE
-      }
-      policy {
-        cookies_allowed: NO
-        setting: "N/A"
-        policy_exception_justification:
-          "Not implemented, considered not necessary."
-      })");
-
 // The URL to download whether the user is allowed to access Google Photos data.
 constexpr char kGooglePhotosEnabledUrl[] =
     "https://photosfirstparty-pa.googleapis.com/v1/chromeos/userenabled:read";
@@ -258,8 +234,6 @@
     return GooglePhotosApi::kGetPhoto;
   if (base::StartsWith(spec, kGooglePhotosPhotosUrl))
     return GooglePhotosApi::kGetPhotos;
-  if (base::StartsWith(spec, kGooglePhotosCountUrl))
-    return GooglePhotosApi::kGetPhotosCount;
   return absl::nullopt;
 }
 
@@ -773,40 +747,6 @@
                                   : absl::nullopt;
 }
 
-GooglePhotosCountFetcher::GooglePhotosCountFetcher(Profile* profile)
-    : GooglePhotosFetcher(profile, kGooglePhotosCountTrafficAnnotation) {
-  DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
-}
-
-GooglePhotosCountFetcher::~GooglePhotosCountFetcher() = default;
-
-void GooglePhotosCountFetcher::AddRequestAndStartIfNecessary(
-    base::OnceCallback<void(int)> callback) {
-  GooglePhotosFetcher::AddRequestAndStartIfNecessary(
-      GURL(kGooglePhotosCountUrl), std::move(callback));
-}
-
-int GooglePhotosCountFetcher::ParseResponse(const base::Value::Dict* response) {
-  if (!response)
-    return -1;
-
-  const auto* count_string = response->FindStringByDottedPath("user.numPhotos");
-
-  int64_t count;
-  if (!count_string || !base::StringToInt64(*count_string, &count) ||
-      count < 0) {
-    LOG(ERROR) << "Failed to parse Google Photos count response.";
-    return -1;
-  }
-
-  return base::saturated_cast<int>(count);
-}
-
-absl::optional<size_t> GooglePhotosCountFetcher::GetResultCount(
-    const int& result) {
-  return result >= 0 ? absl::make_optional(1u) : absl::nullopt;
-}
-
 GooglePhotosEnabledFetcher::GooglePhotosEnabledFetcher(Profile* profile)
     : GooglePhotosFetcher(profile, kGooglePhotosEnabledTrafficAnnotation) {
   DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
diff --git a/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.h b/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.h
index 105e5cd3..da67df1 100644
--- a/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.h
+++ b/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.h
@@ -241,25 +241,6 @@
       const GooglePhotosAlbumsCbkArgs& result) override;
 };
 
-// Downloads the number of photos in a user's Google Photos library.
-class GooglePhotosCountFetcher : public GooglePhotosFetcher<int> {
- public:
-  explicit GooglePhotosCountFetcher(Profile* profile);
-
-  GooglePhotosCountFetcher(const GooglePhotosCountFetcher&) = delete;
-  GooglePhotosCountFetcher& operator=(const GooglePhotosCountFetcher&) = delete;
-
-  ~GooglePhotosCountFetcher() override;
-
-  virtual void AddRequestAndStartIfNecessary(
-      base::OnceCallback<void(int)> callback);
-
- protected:
-  // GooglePhotosFetcher:
-  int ParseResponse(const base::Value::Dict* response) override;
-  absl::optional<size_t> GetResultCount(const int& result) override;
-};
-
 using ash::personalization_app::mojom::GooglePhotosEnablementState;
 // Downloads whether the user is allowed to access Google Photos data.
 class GooglePhotosEnabledFetcher
diff --git a/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers_metric_utils.cc b/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers_metric_utils.cc
index 5f2470d..48d2de7a 100644
--- a/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers_metric_utils.cc
+++ b/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers_metric_utils.cc
@@ -23,8 +23,6 @@
       return "Ash.Wallpaper.GooglePhotos.Api.GetPhoto";
     case GooglePhotosApi::kGetPhotos:
       return "Ash.Wallpaper.GooglePhotos.Api.GetPhotos";
-    case GooglePhotosApi::kGetPhotosCount:
-      return "Ash.Wallpaper.GooglePhotos.Api.GetPhotosCount";
   }
 }
 
diff --git a/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers_metric_utils.h b/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers_metric_utils.h
index 49b61727..dcfd5c6e 100644
--- a/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers_metric_utils.h
+++ b/chrome/browser/ash/wallpaper_handlers/wallpaper_handlers_metric_utils.h
@@ -17,7 +17,6 @@
   kGetEnabled,
   kGetPhoto,
   kGetPhotos,
-  kGetPhotosCount,
 };
 
 // Records the following on Google Photos API response parsing completion:
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.cc
index 1ccccfd..d78acbf3 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.cc
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.cc
@@ -227,33 +227,6 @@
       resume_token, std::move(callback));
 }
 
-void PersonalizationAppWallpaperProviderImpl::FetchGooglePhotosCount(
-    FetchGooglePhotosCountCallback callback) {
-  if (!ash::features::IsWallpaperGooglePhotosIntegrationEnabled()) {
-    mojo::ReportBadMessage(
-        "Cannot call `FetchGooglePhotosCount()` without Google Photos "
-        "Wallpaper integration enabled.");
-    std::move(callback).Run(-1);
-    return;
-  }
-
-  if (!is_google_photos_enterprise_enabled_) {
-    mojo::ReportBadMessage(
-        "Cannot call `FetchGooglePhotosCount()` without confirming that the "
-        "Google Photos enterprise setting is enabled.");
-    std::move(callback).Run(-1);
-    return;
-  }
-
-  if (!google_photos_count_fetcher_) {
-    google_photos_count_fetcher_ =
-        std::make_unique<wallpaper_handlers::GooglePhotosCountFetcher>(
-            profile_);
-  }
-  google_photos_count_fetcher_->AddRequestAndStartIfNecessary(
-      std::move(callback));
-}
-
 void PersonalizationAppWallpaperProviderImpl::FetchGooglePhotosEnabled(
     FetchGooglePhotosEnabledCallback callback) {
   if (!ash::features::IsWallpaperGooglePhotosIntegrationEnabled()) {
@@ -661,13 +634,6 @@
   return google_photos_albums_fetcher_.get();
 }
 
-wallpaper_handlers::GooglePhotosCountFetcher*
-PersonalizationAppWallpaperProviderImpl::SetGooglePhotosCountFetcherForTest(
-    std::unique_ptr<wallpaper_handlers::GooglePhotosCountFetcher> fetcher) {
-  google_photos_count_fetcher_ = std::move(fetcher);
-  return google_photos_count_fetcher_.get();
-}
-
 wallpaper_handlers::GooglePhotosEnabledFetcher*
 PersonalizationAppWallpaperProviderImpl::SetGooglePhotosEnabledFetcherForTest(
     std::unique_ptr<wallpaper_handlers::GooglePhotosEnabledFetcher> fetcher) {
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.h b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.h
index d647e237..7c199ec 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.h
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl.h
@@ -47,7 +47,6 @@
 class BackdropCollectionInfoFetcher;
 class BackdropImageInfoFetcher;
 class GooglePhotosAlbumsFetcher;
-class GooglePhotosCountFetcher;
 class GooglePhotosEnabledFetcher;
 class GooglePhotosPhotosFetcher;
 }  // namespace wallpaper_handlers
@@ -101,8 +100,6 @@
       const absl::optional<std::string>& resume_token,
       FetchGooglePhotosAlbumsCallback callback) override;
 
-  void FetchGooglePhotosCount(FetchGooglePhotosCountCallback callback) override;
-
   void FetchGooglePhotosEnabled(
       FetchGooglePhotosEnabledCallback callback) override;
 
@@ -175,10 +172,6 @@
   SetGooglePhotosAlbumsFetcherForTest(
       std::unique_ptr<wallpaper_handlers::GooglePhotosAlbumsFetcher> fetcher);
 
-  wallpaper_handlers::GooglePhotosCountFetcher*
-  SetGooglePhotosCountFetcherForTest(
-      std::unique_ptr<wallpaper_handlers::GooglePhotosCountFetcher> fetcher);
-
   wallpaper_handlers::GooglePhotosEnabledFetcher*
   SetGooglePhotosEnabledFetcherForTest(
       std::unique_ptr<wallpaper_handlers::GooglePhotosEnabledFetcher> fetcher);
@@ -277,13 +270,6 @@
   std::unique_ptr<wallpaper_handlers::GooglePhotosAlbumsFetcher>
       google_photos_albums_fetcher_;
 
-  // Fetches the number of photos in the user's Google Photos library.
-  // Constructed lazily at the time of the first request and then persists for
-  // the rest of the delegate's lifetime, unless preemptively or subsequently
-  // replaced by a mock in a test.
-  std::unique_ptr<wallpaper_handlers::GooglePhotosCountFetcher>
-      google_photos_count_fetcher_;
-
   // Fetches the state of the user's permission to access Google Photos data.
   // Constructed lazily at the time of the first request and then persists for
   // the rest of the delegate's lifetime, unless preemptively or subsequently
diff --git a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl_unittest.cc b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl_unittest.cc
index f1b80f5..9fa8c4f9c4 100644
--- a/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl_unittest.cc
+++ b/chrome/browser/ash/web_applications/personalization_app/personalization_app_wallpaper_provider_impl_unittest.cc
@@ -565,40 +565,6 @@
   wallpaper_provider_remote()->FlushForTesting();
 }
 
-TEST_P(PersonalizationAppWallpaperProviderImplGooglePhotosTest, FetchCount) {
-  // Mock a fetcher for the photos count query.
-  auto* const google_photos_count_fetcher = static_cast<
-      ::testing::NiceMock<wallpaper_handlers::MockGooglePhotosCountFetcher>*>(
-      delegate()->SetGooglePhotosCountFetcherForTest(
-          std::make_unique<::testing::NiceMock<
-              wallpaper_handlers::MockGooglePhotosCountFetcher>>(profile())));
-
-  // Simulate the client making multiple requests for the same information to
-  // test that all callbacks for that query are called.
-  EXPECT_CALL(*google_photos_count_fetcher, AddRequestAndStartIfNecessary)
-      .Times(GooglePhotosEnabled() ? kNumFetches : 0);
-
-  // Test fetching Google Photos count before fetching the enterprise setting.
-  // No requests should be made.
-  for (size_t i = 0; i < kNumFetches; ++i) {
-    wallpaper_provider_remote()->get()->FetchGooglePhotosCount(
-        base::BindLambdaForTesting([](int count) { EXPECT_EQ(count, -1); }));
-  }
-  wallpaper_provider_remote()->FlushForTesting();
-
-  // Test fetching Google Photos count after fetching the enterprise setting.
-  // Requests should be made if and only if the Google Photos wallpaper
-  // integration is enabled.
-  FetchGooglePhotosEnabled();
-  for (size_t i = 0; i < kNumFetches; ++i) {
-    wallpaper_provider_remote()->get()->FetchGooglePhotosCount(
-        base::BindLambdaForTesting([this](int count) {
-          EXPECT_EQ(count, GooglePhotosEnabled() ? 0 : -1);
-        }));
-  }
-  wallpaper_provider_remote()->FlushForTesting();
-}
-
 TEST_P(PersonalizationAppWallpaperProviderImplGooglePhotosTest, FetchEnabled) {
   // Simulate the client making multiple requests for the same information to
   // test that all callbacks for that query are called.
@@ -760,47 +726,6 @@
             absl::make_optional<size_t>(valid_albums_vector.size()));
 }
 
-TEST_P(PersonalizationAppWallpaperProviderImplGooglePhotosTest, ParseCount) {
-  // Mock a fetcher to parse constructed responses.
-  auto* const google_photos_count_fetcher = static_cast<
-      ::testing::NiceMock<wallpaper_handlers::MockGooglePhotosCountFetcher>*>(
-      delegate()->SetGooglePhotosCountFetcherForTest(
-          std::make_unique<::testing::NiceMock<
-              wallpaper_handlers::MockGooglePhotosCountFetcher>>(profile())));
-
-  // Parse an absent response (simulating a fetching error).
-  auto result = -1;
-  EXPECT_EQ(google_photos_count_fetcher->ParseResponse(nullptr), result);
-  EXPECT_EQ(google_photos_count_fetcher->GetResultCount(result), absl::nullopt);
-
-  // Parse a response without a photo count.
-  base::Value::Dict response;
-  EXPECT_EQ(google_photos_count_fetcher->ParseResponse(&response), result);
-  EXPECT_EQ(google_photos_count_fetcher->GetResultCount(result), absl::nullopt);
-
-  // Parse a response with an empty photo count.
-  response.SetByDottedPath("user.numPhotos", "");
-  EXPECT_EQ(google_photos_count_fetcher->ParseResponse(&response), result);
-  EXPECT_EQ(google_photos_count_fetcher->GetResultCount(result), absl::nullopt);
-
-  // Parse a response with a non-integer photo count.
-  response.SetByDottedPath("user.numPhotos", "NaN");
-  EXPECT_EQ(google_photos_count_fetcher->ParseResponse(&response), result);
-  EXPECT_EQ(google_photos_count_fetcher->GetResultCount(result), absl::nullopt);
-
-  // Parse a response with a negative photo count.
-  response.SetByDottedPath("user.numPhotos", "-2");
-  EXPECT_EQ(google_photos_count_fetcher->ParseResponse(&response), result);
-  EXPECT_EQ(google_photos_count_fetcher->GetResultCount(result), absl::nullopt);
-
-  // Parse a valid response.
-  response.SetByDottedPath("user.numPhotos", "2");
-  result = 2;
-  EXPECT_EQ(google_photos_count_fetcher->ParseResponse(&response), result);
-  EXPECT_EQ(google_photos_count_fetcher->GetResultCount(result),
-            absl::make_optional<size_t>(1u));
-}
-
 TEST_P(PersonalizationAppWallpaperProviderImplGooglePhotosTest, ParseEnabled) {
   using ash::personalization_app::mojom::GooglePhotosEnablementState;
 
diff --git a/chrome/browser/ash/web_applications/shimless_rma_integration_browsertest.cc b/chrome/browser/ash/web_applications/shimless_rma_integration_browsertest.cc
index c8f1523..a123dac8 100644
--- a/chrome/browser/ash/web_applications/shimless_rma_integration_browsertest.cc
+++ b/chrome/browser/ash/web_applications/shimless_rma_integration_browsertest.cc
@@ -21,7 +21,9 @@
  public:
   ShimlessRMAIntegrationTest() {
     scoped_feature_list_.InitWithFeatures(
-        {chromeos::features::kShimlessRMAFlow}, {});
+        {chromeos::features::kShimlessRMAFlow,
+         chromeos::features::kShimlessRMAEnableStandalone},
+        {});
   }
 
  protected:
diff --git a/chrome/browser/component_updater/metadata_table_chromeos.cc b/chrome/browser/component_updater/metadata_table_chromeos.cc
index 061aa17e..0b6c54a 100644
--- a/chrome/browser/component_updater/metadata_table_chromeos.cc
+++ b/chrome/browser/component_updater/metadata_table_chromeos.cc
@@ -9,7 +9,6 @@
 #include <utility>
 #include <vector>
 
-#include "ash/components/cryptohome/system_salt_getter.h"
 #include "base/hash/sha1.h"
 #include "base/memory/ptr_util.h"
 #include "base/strings/string_number_conversions.h"
@@ -56,18 +55,11 @@
 
 // Converts username to a hashed string.
 std::string HashUsername(const std::string& username) {
-  chromeos::SystemSaltGetter* salt_getter = chromeos::SystemSaltGetter::Get();
-  DCHECK(salt_getter);
-
-  // System salt must be defined at this point.
-  const chromeos::SystemSaltGetter::RawSalt* salt = salt_getter->GetRawSalt();
-  DCHECK(salt);
-
   unsigned char binmd[base::kSHA1Length];
   std::string lowercase(username);
   std::transform(lowercase.begin(), lowercase.end(), lowercase.begin(),
                  ::tolower);
-  std::vector<uint8_t> data = *salt;
+  std::vector<uint8_t> data;
   std::copy(lowercase.begin(), lowercase.end(), std::back_inserter(data));
   base::SHA1HashBytes(data.data(), data.size(), binmd);
   std::string result = base::HexEncode(binmd, sizeof(binmd));
diff --git a/chrome/browser/download/bubble/download_bubble_controller.cc b/chrome/browser/download/bubble/download_bubble_controller.cc
index 3a61133c..c76f91b 100644
--- a/chrome/browser/download/bubble/download_bubble_controller.cc
+++ b/chrome/browser/download/bubble/download_bubble_controller.cc
@@ -82,6 +82,11 @@
           profile_->GetProfileKey())),
       offline_manager_(
           OfflineItemModelManagerFactory::GetForBrowserContext(profile_)) {
+  if (profile_->IsOffTheRecord()) {
+    Profile* original_profile = profile_->GetOriginalProfile();
+    original_notifier_ = std::make_unique<download::AllDownloadItemNotifier>(
+        original_profile->GetDownloadManager(), this);
+  }
   observation_.Observe(aggregator_.get());
 }
 
@@ -218,6 +223,13 @@
     download::DownloadItem* item) {
   auto model = DownloadItemModel::Wrap(
       item, std::make_unique<DownloadUIModel::BubbleStatusTextBuilder>());
+  // manager can be different from download_notifier_ when the current profile
+  // is off the record.
+  if (manager != download_notifier_.GetManager()) {
+    display_controller_->OnUpdatedItem(model->IsDone(),
+                                       /*show_details_if_done=*/false);
+    return;
+  }
   bool show_details_if_done =
       model->ShouldShowInBubble() &&
       (browser_ == chrome::FindLastActiveWithProfile(profile_.get()));
@@ -262,6 +274,9 @@
   }
   std::vector<download::DownloadItem*> download_items;
   download_manager_->GetAllDownloads(&download_items);
+  if (original_notifier_) {
+    original_notifier_->GetManager()->GetAllDownloads(&download_items);
+  }
   for (download::DownloadItem* item : download_items) {
     DownloadUIModelPtr model = DownloadItemModel::Wrap(
         item, std::make_unique<DownloadUIModel::BubbleStatusTextBuilder>());
diff --git a/chrome/browser/download/bubble/download_bubble_controller.h b/chrome/browser/download/bubble/download_bubble_controller.h
index a02901c..7469599 100644
--- a/chrome/browser/download/bubble/download_bubble_controller.h
+++ b/chrome/browser/download/bubble/download_bubble_controller.h
@@ -84,12 +84,17 @@
     return download_notifier_;
   }
 
+  download::AllDownloadItemNotifier* get_original_notifier_for_testing() {
+    return original_notifier_.get();
+  }
+
   void set_manager_for_testing(content::DownloadManager* manager) {
     download_manager_ = manager;
   }
 
  private:
   friend class DownloadBubbleUIControllerTest;
+  friend class DownloadBubbleUIControllerIncognitoTest;
   // AllDownloadItemNotifier::Observer
   void OnDownloadUpdated(content::DownloadManager* manager,
                          download::DownloadItem* item) override;
@@ -135,6 +140,8 @@
   raw_ptr<Profile> profile_;
   raw_ptr<content::DownloadManager> download_manager_;
   download::AllDownloadItemNotifier download_notifier_;
+  // Null if the profile is not off the record.
+  std::unique_ptr<download::AllDownloadItemNotifier> original_notifier_;
   raw_ptr<OfflineContentAggregator> aggregator_;
   raw_ptr<OfflineItemModelManager> offline_manager_;
   base::ScopedObservation<OfflineContentProvider,
diff --git a/chrome/browser/download/bubble/download_bubble_controller_unittest.cc b/chrome/browser/download/bubble/download_bubble_controller_unittest.cc
index cbd94c121..2742152 100644
--- a/chrome/browser/download/bubble/download_bubble_controller_unittest.cc
+++ b/chrome/browser/download/bubble/download_bubble_controller_unittest.cc
@@ -73,8 +73,7 @@
 class DownloadBubbleUIControllerTest : public testing::Test {
  public:
   DownloadBubbleUIControllerTest()
-      : manager_(std::make_unique<NiceMock<content::MockDownloadManager>>()),
-        testing_profile_manager_(TestingBrowserProcess::GetGlobal()) {}
+      : testing_profile_manager_(TestingBrowserProcess::GetGlobal()) {}
   DownloadBubbleUIControllerTest(const DownloadBubbleUIControllerTest&) =
       delete;
   DownloadBubbleUIControllerTest& operator=(
@@ -85,8 +84,11 @@
     ASSERT_TRUE(testing_profile_manager_.SetUp());
 
     profile_ = testing_profile_manager_.CreateTestingProfile("testing_profile");
-    EXPECT_CALL(*manager_.get(), GetBrowserContext())
-        .WillRepeatedly(Return(profile_));
+    auto manager = std::make_unique<NiceMock<content::MockDownloadManager>>();
+    manager_ = manager.get();
+    EXPECT_CALL(*manager, GetBrowserContext()).WillRepeatedly(Return(profile_));
+    EXPECT_CALL(*manager, RemoveObserver(_)).WillRepeatedly(Return());
+    profile_->SetDownloadManagerForTesting(std::move(manager));
 
     // Set test delegate to get the corresponding download prefs.
     auto delegate = std::make_unique<ChromeDownloadManagerDelegate>(profile_);
@@ -107,25 +109,32 @@
     display_controller_ =
         std::make_unique<NiceMock<MockDownloadDisplayController>>(
             profile_, controller_.get());
-    controller_->set_manager_for_testing(manager_.get());
+    controller_->set_manager_for_testing(manager_);
   }
 
   void TearDown() override {
+    DownloadCoreServiceFactory::GetForBrowserContext(profile_)
+        ->SetDownloadManagerDelegateForTesting(nullptr);
     for (auto& item : items_) {
       item->RemoveObserver(&controller_->get_download_notifier_for_testing());
     }
     // The controller needs to be reset before download manager, because the
     // download_notifier_ will unregister itself from the manager.
     controller_.reset();
+    display_controller_.reset();
   }
 
  protected:
-  NiceMock<content::MockDownloadManager>& manager() { return *manager_.get(); }
+  NiceMock<content::MockDownloadManager>& manager() { return *manager_; }
   download::MockDownloadItem& item(size_t index) { return *items_[index]; }
+  std::vector<std::unique_ptr<StrictMockDownloadItem>>& items() {
+    return items_;
+  }
   NiceMock<MockDownloadDisplayController>& display_controller() {
     return *display_controller_;
   }
   DownloadBubbleUIController& controller() { return *controller_; }
+  TestingProfile* profile() { return profile_; }
   NiceMock<offline_items_collection::MockOfflineContentProvider>&
   content_provider() {
     return *content_provider_;
@@ -168,7 +177,7 @@
     for (size_t i = 0; i < items_.size(); ++i) {
       items.push_back(&item(i));
     }
-    EXPECT_CALL(*manager_.get(), GetAllDownloads(_))
+    EXPECT_CALL(*manager_, GetAllDownloads(_))
         .WillRepeatedly(SetArgPointee<0>(items));
     item(index).AddObserver(&controller().get_download_notifier_for_testing());
     content::DownloadItemUtils::AttachInfoForTesting(&(item(index)), profile_,
@@ -215,14 +224,14 @@
   std::unique_ptr<NiceMock<MockDownloadDisplayController>> display_controller_;
   std::vector<std::unique_ptr<StrictMockDownloadItem>> items_;
   OfflineItemList offline_items_;
-  std::unique_ptr<NiceMock<content::MockDownloadManager>> manager_;
+  NiceMock<content::MockDownloadManager>* manager_;
   TestingProfileManager testing_profile_manager_;
   std::unique_ptr<
       NiceMock<offline_items_collection::MockOfflineContentProvider>>
       content_provider_;
   std::unique_ptr<TestBrowserWindow> window_;
   std::unique_ptr<Browser> browser_;
-  Profile* profile_;
+  TestingProfile* profile_;
 };
 
 TEST_F(DownloadBubbleUIControllerTest, ProcessesNewItems) {
@@ -349,3 +358,76 @@
       controller().GetPartialView();
   EXPECT_EQ(partial_view_empty.size(), 0ul);
 }
+
+class DownloadBubbleUIControllerIncognitoTest
+    : public DownloadBubbleUIControllerTest {
+ public:
+  DownloadBubbleUIControllerIncognitoTest() = default;
+  DownloadBubbleUIControllerIncognitoTest(
+      const DownloadBubbleUIControllerIncognitoTest&) = delete;
+  DownloadBubbleUIControllerIncognitoTest& operator=(
+      const DownloadBubbleUIControllerIncognitoTest&) = delete;
+
+  void SetUp() override {
+    DownloadBubbleUIControllerTest::SetUp();
+    incognito_profile_ = TestingProfile::Builder().BuildIncognito(profile());
+    incognito_window_ = std::make_unique<TestBrowserWindow>();
+    Browser::CreateParams params(incognito_profile_, true);
+    params.type = Browser::TYPE_NORMAL;
+    params.window = incognito_window_.get();
+    incognito_browser_ = std::unique_ptr<Browser>(Browser::Create(params));
+    incognito_controller_ =
+        std::make_unique<DownloadBubbleUIController>(incognito_browser_.get());
+    incognito_display_controller_ =
+        std::make_unique<NiceMock<MockDownloadDisplayController>>(
+            incognito_profile_, incognito_controller_.get());
+  }
+
+  void TearDown() override {
+    for (auto& item : items()) {
+      item->RemoveObserver(
+          incognito_controller_->get_original_notifier_for_testing());
+    }
+    // The controller needs to be reset before download manager, because the
+    // download_notifier_ will unregister itself from the manager.
+    incognito_controller_.reset();
+    incognito_display_controller_.reset();
+    DownloadBubbleUIControllerTest::TearDown();
+  }
+
+ protected:
+  std::unique_ptr<TestBrowserWindow> incognito_window_;
+  std::unique_ptr<Browser> incognito_browser_;
+  TestingProfile* incognito_profile_;
+  std::unique_ptr<DownloadBubbleUIController> incognito_controller_;
+  std::unique_ptr<NiceMock<MockDownloadDisplayController>>
+      incognito_display_controller_;
+};
+
+TEST_F(DownloadBubbleUIControllerIncognitoTest,
+       IncludeDownloadsFromMainProfile) {
+  std::string download_id = "Download 1";
+  InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"),
+                   download::DownloadItem::IN_PROGRESS, download_id);
+  std::vector<DownloadUIModelPtr> main_view =
+      incognito_controller_->GetMainView();
+  // The main view should contain downloads from the main profile.
+  EXPECT_EQ(main_view.size(), 1ul);
+}
+
+TEST_F(DownloadBubbleUIControllerIncognitoTest, DoesNotShowDetailsIfDone) {
+  std::string download_id = "Download 1";
+  InitDownloadItem(FILE_PATH_LITERAL("/foo/bar.pdf"),
+                   download::DownloadItem::IN_PROGRESS, download_id);
+  UpdateDownloadItem(/*item_index=*/0, DownloadState::COMPLETE);
+  item(0).AddObserver(
+      incognito_controller_->get_original_notifier_for_testing());
+  content::DownloadItemUtils::AttachInfoForTesting(&(item(0)),
+                                                   incognito_profile_, nullptr);
+  // `show_details_if_done` is false because the download is initiated from the
+  // main profile.
+  EXPECT_CALL(*incognito_display_controller_,
+              OnUpdatedItem(/*is_done=*/true, /*show_details_if_done=*/false))
+      .Times(1);
+  item(0).NotifyObserversDownloadUpdated();
+}
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json
index d91570c..756fdfd 100644
--- a/chrome/browser/flag-metadata.json
+++ b/chrome/browser/flag-metadata.json
@@ -1944,7 +1944,7 @@
   {
     "name": "enable-desktop-pwas-window-controls-overlay",
     "owners": [ "ambake@microsoft.com", "desktop-pwas-team@google.com" ],
-    "expiry_milestone": 102
+    "expiry_milestone": 106
   },
   {
     "name": "enable-device-trust-connector",
diff --git a/chrome/browser/password_manager/android/credential_leak_controller_android.cc b/chrome/browser/password_manager/android/credential_leak_controller_android.cc
index 6f64cf3..a81849c 100644
--- a/chrome/browser/password_manager/android/credential_leak_controller_android.cc
+++ b/chrome/browser/password_manager/android/credential_leak_controller_android.cc
@@ -17,6 +17,7 @@
 #include "ui/android/window_android.h"
 #include "url/android/gurl_android.h"
 
+using password_manager::CreateDialogTraits;
 using password_manager::PasswordChangeSuccessTracker;
 using password_manager::metrics_util::LeakDialogDismissalReason;
 using password_manager::metrics_util::LeakDialogType;
@@ -32,7 +33,8 @@
       origin_(origin),
       username_(username),
       password_change_success_tracker_(password_change_success_tracker),
-      window_android_(window_android) {}
+      window_android_(window_android),
+      leak_dialog_traits_(CreateDialogTraits(leak_type)) {}
 
 CredentialLeakControllerAndroid::~CredentialLeakControllerAndroid() = default;
 
@@ -113,23 +115,23 @@
 }
 
 std::u16string CredentialLeakControllerAndroid::GetAcceptButtonLabel() const {
-  return password_manager::GetAcceptButtonLabel(leak_type_);
+  return leak_dialog_traits_->GetAcceptButtonLabel();
 }
 
 std::u16string CredentialLeakControllerAndroid::GetCancelButtonLabel() const {
-  return password_manager::GetCancelButtonLabel(leak_type_);
+  return leak_dialog_traits_->GetCancelButtonLabel();
 }
 
 std::u16string CredentialLeakControllerAndroid::GetDescription() const {
-  return password_manager::GetDescription(leak_type_);
+  return leak_dialog_traits_->GetDescription();
 }
 
 std::u16string CredentialLeakControllerAndroid::GetTitle() const {
-  return password_manager::GetTitle(leak_type_);
+  return leak_dialog_traits_->GetTitle();
 }
 
 bool CredentialLeakControllerAndroid::ShouldShowCancelButton() const {
-  return password_manager::ShouldShowCancelButton(leak_type_);
+  return leak_dialog_traits_->ShouldShowCancelButton();
 }
 
 bool CredentialLeakControllerAndroid::ShouldShowAutomaticChangePasswordButton()
diff --git a/chrome/browser/password_manager/android/credential_leak_controller_android.h b/chrome/browser/password_manager/android/credential_leak_controller_android.h
index 16c33a1..27d3d23 100644
--- a/chrome/browser/password_manager/android/credential_leak_controller_android.h
+++ b/chrome/browser/password_manager/android/credential_leak_controller_android.h
@@ -87,6 +87,8 @@
   const raw_ptr<ui::WindowAndroid> window_android_;
 
   std::unique_ptr<CredentialLeakDialogViewAndroid> dialog_view_;
+
+  std::unique_ptr<password_manager::LeakDialogTraits> leak_dialog_traits_;
 };
 
 #endif  // CHROME_BROWSER_PASSWORD_MANAGER_ANDROID_CREDENTIAL_LEAK_CONTROLLER_ANDROID_H_
diff --git a/chrome/browser/resources/chromeos/login/components/behaviors/login_screen_behavior.js b/chrome/browser/resources/chromeos/login/components/behaviors/login_screen_behavior.js
index 30baad2..8071242 100644
--- a/chrome/browser/resources/chromeos/login/components/behaviors/login_screen_behavior.js
+++ b/chrome/browser/resources/chromeos/login/components/behaviors/login_screen_behavior.js
@@ -2,7 +2,7 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// #import {OOBE_UI_STATE, DisplayManagerScreenAttributes} from '../display_manager_types.m.js';
+// #import {OOBE_UI_STATE} from '../display_manager_types.m.js';
 // #import {OobeTypes} from '../oobe_types.m.js';
 // #import {Oobe} from '../../cr_ui.m.js';
 
@@ -24,9 +24,8 @@
   /**
    * Initialize screen behavior.
    * @param {string} screenName Name of created class (external api prefix).
-   * @param {DisplayManagerScreenAttributes} attributes
    */
-  initializeLoginScreen(screenName, attributes) {
+  initializeLoginScreen(screenName) {
     const api = {};
 
     if (this.EXTERNAL_API.length != 0) {
@@ -42,7 +41,7 @@
     }
     this.sendPrefix_ = 'login.' + screenName + '.';
     this.registerScreenApi_(screenName, api);
-    Oobe.getInstance().registerScreen(this, attributes);
+    Oobe.getInstance().registerScreen(this);
   },
 
 
@@ -158,9 +157,8 @@
 /* #export */ class LoginScreenBehaviorInterface {
   /**
    * @param {string} screenName
-   * @param {DisplayManagerScreenAttributes} attributes
    */
-  initializeLoginScreen(screenName, attributes) {}
+  initializeLoginScreen(screenName) {}
 
   userActed(action_id) {}
 
diff --git a/chrome/browser/resources/chromeos/login/components/common_styles/common_styles.html b/chrome/browser/resources/chromeos/login/components/common_styles/common_styles.html
index 41b569b..91006b34 100644
--- a/chrome/browser/resources/chromeos/login/components/common_styles/common_styles.html
+++ b/chrome/browser/resources/chromeos/login/components/common_styles/common_styles.html
@@ -66,18 +66,18 @@
       /* Links styles used within OOBE */
 
       .oobe-local-link {
-        color: rgb(17, 85, 204); /* #1155CC */
+        color: var(--cros-link-color);
         cursor: pointer;
         text-decoration: none;
       }
 
       .oobe-local-link:focus {
-        outline-color: rgb(77, 144, 254); /* #4D90FE */
+        outline-color: var(--cros-button-active-shadow-color-ambient-primary);
         transition: outline-color 200ms;
       }
 
       .oobe-optin-row {
-        border-top: 1px solid var(--google-grey-200);
+        border-top: 1px solid var(--cros-color-primary-inverted);
         font-size: 13px;
         margin-top: 12px;
         padding-top: 12px;
diff --git a/chrome/browser/resources/chromeos/login/components/common_styles/cr_card_radio_group_styles.html b/chrome/browser/resources/chromeos/login/components/common_styles/cr_card_radio_group_styles.html
index c2693e56..4c3da6db 100644
--- a/chrome/browser/resources/chromeos/login/components/common_styles/cr_card_radio_group_styles.html
+++ b/chrome/browser/resources/chromeos/login/components/common_styles/cr_card_radio_group_styles.html
@@ -31,7 +31,9 @@
         --cr-card-radio-button-margin: 0;
         --cr-card-radio-button-padding: 0;
         --cr-card-radio-button-width: 100%;
+        /* TODO(https://crbug.com/1320715) Revise the color
         --cr-checked-color: var(--google-blue-500);
+        */
         --cr-radio-button-ink-size: 0;
         --cr-radio-group-item-padding: 0;
     }
diff --git a/chrome/browser/resources/chromeos/login/components/display_manager_types.js b/chrome/browser/resources/chromeos/login/components/display_manager_types.js
index eb95a70..3e9a83a 100644
--- a/chrome/browser/resources/chromeos/login/components/display_manager_types.js
+++ b/chrome/browser/resources/chromeos/login/components/display_manager_types.js
@@ -8,19 +8,6 @@
  */
 
 /**
- * @typedef {{
- *   resetAllowed: (boolean|undefined),
- * }}
- */
-/* #export */ const DisplayManagerScreenAttributes = {};
-
-/**
- * True if device reset is allowed on the screen.
- * @type {boolean|undefined}
- */
-DisplayManagerScreenAttributes.resetAllowed;
-
-/**
  * Possible types of UI.
  * @enum {string}
  */
@@ -61,65 +48,11 @@
 
 // TODO(crbug.com/1229130) - Refactor/remove these constants.
 /* #export */ const SCREEN_WELCOME = 'connect';
-/* #export */ const SCREEN_OOBE_NETWORK = 'network-selection';
-/* #export */ const SCREEN_OOBE_HID_DETECTION = 'hid-detection';
-/* #export */ const SCREEN_OOBE_ENABLE_DEBUGGING = 'debugging';
-/* #export */ const SCREEN_OOBE_UPDATE = 'oobe-update';
-/* #export */ const SCREEN_OOBE_RESET = 'reset';
-/* #export */ const SCREEN_OOBE_ENROLLMENT = 'enterprise-enrollment';
-/* #export */ const SCREEN_OOBE_DEMO_SETUP = 'demo-setup';
-/* #export */ const SCREEN_OOBE_DEMO_PREFERENCES = 'demo-preferences';
-/* #export */ const SCREEN_OOBE_KIOSK_ENABLE = 'kiosk-enable';
-/* #export */ const SCREEN_PACKAGED_LICENSE = 'packaged-license';
 /* #export */ const SCREEN_GAIA_SIGNIN = 'gaia-signin';
-/* #export */ const SCREEN_ERROR_MESSAGE = 'error-message';
-/* #export */ const SCREEN_PASSWORD_CHANGED = 'gaia-password-changed';
-/* #export */ const SCREEN_CONFIRM_PASSWORD = 'saml-confirm-password';
-/* #export */ const SCREEN_FATAL_ERROR = 'fatal-error';
-/* #export */ const SCREEN_KIOSK_ENABLE = 'kiosk-enable';
-/* #export */ const SCREEN_TERMS_OF_SERVICE = 'terms-of-service';
-/* #export */ const SCREEN_ARC_TERMS_OF_SERVICE = 'arc-tos';
 /* #export */ const SCREEN_DEVICE_DISABLED = 'device-disabled';
-/* #export */ const SCREEN_UPDATE_REQUIRED = 'update-required';
-/* #export */ const SCREEN_ACTIVE_DIRECTORY_PASSWORD_CHANGE =
-'ad-password-change';
-/* #export */ const SCREEN_SYNC_CONSENT = 'sync-consent';
-/* #export */ const SCREEN_FINGERPRINT_SETUP = 'fingerprint-setup';
-// TODO(crbug.com/1261902): Remove.
-/* #export */ const SCREEN_RECOMMEND_APPS_OLD = 'recommend-apps-old';
-/* #export */ const SCREEN_RECOMMEND_APPS = 'recommend-apps';
-/* #export */ const SCREEN_APP_DOWNLOADING = 'app-downloading';
-/* #export */ const SCREEN_PIN_SETUP = 'pin-setup';
-/* #export */ const SCREEN_MARKETING_OPT_IN = 'marketing-opt-in';
 
 /* Accelerator identifiers.
  * Must be kept in sync with webui_accelerator_mapping.cc.
  */
 /* #export */ const ACCELERATOR_CANCEL = 'cancel';
 /* #export */ const ACCELERATOR_VERSION = 'version';
-/* #export */ const ACCELERATOR_RESET = 'reset';
-
-/* #export */ const USER_ACTION_ROLLBACK_TOGGLED = 'rollback-toggled';
-
-
-/**
- * Group of screens (screen IDs) where factory-reset screen invocation is
- * available. Newer screens using Polymer use the attribute
- * `resetAllowed` in their `ready()` method.
- * @type Array<string>
- * @const
- */
-/* #export */ var RESET_AVAILABLE_SCREEN_GROUP = [
-  SCREEN_OOBE_NETWORK,
-  SCREEN_GAIA_SIGNIN,
-  SCREEN_KIOSK_ENABLE,
-  SCREEN_ERROR_MESSAGE,
-  SCREEN_PASSWORD_CHANGED,
-  SCREEN_ARC_TERMS_OF_SERVICE,
-  SCREEN_CONFIRM_PASSWORD,
-  SCREEN_UPDATE_REQUIRED,
-  SCREEN_SYNC_CONSENT,
-  SCREEN_APP_DOWNLOADING,
-  SCREEN_PIN_SETUP,
-  SCREEN_MARKETING_OPT_IN,
-];
diff --git a/chrome/browser/resources/chromeos/login/components/gaia_button.html b/chrome/browser/resources/chromeos/login/components/gaia_button.html
index 0d6fda3..4864621b 100644
--- a/chrome/browser/resources/chromeos/login/components/gaia_button.html
+++ b/chrome/browser/resources/chromeos/login/components/gaia_button.html
@@ -30,14 +30,14 @@
         border: none;
         border-radius: 0;
         box-shadow: none;
-        color: var(--google-blue-600);
+        color: var(--cros-link-color);
         font-weight: 400;
         margin: 0 -0.57em;
         min-width: 0;
       }
 
       :host([link]) cr-button:focus {
-        background-color: rgba(66, 133, 244, 0.12);
+        background-color: var(--cros-button-active-shadow-color-ambient-primary);
       }
 
       :host-context(.focus-outline-visible):host([link]) cr-button:focus {
@@ -45,7 +45,7 @@
       }
 
       :host([link]) cr-button[disabled] {
-        color: rgb(168, 168, 168);
+        color: var(--cros-color-disabled);
       }
     </style>
     <cr-button id="button" disabled="[[disabled]]" on-click="onClick_"
diff --git a/chrome/browser/resources/chromeos/login/components/notification_card.html b/chrome/browser/resources/chromeos/login/components/notification_card.html
index fae0f1d0..5133402 100644
--- a/chrome/browser/resources/chromeos/login/components/notification_card.html
+++ b/chrome/browser/resources/chromeos/login/components/notification_card.html
@@ -13,9 +13,9 @@
 <link rel="import" href="./common_styles/common_styles.html">
 
 <!--
-  A simple notification card with a button, link (optional) and icon (optional).
+  A simple warning notification card with a button, link (optional) and icon.
   Example:
-    <notification-card button-label="OK" link-label="What?" type="success">
+    <notification-card button-label="OK" link-label="What?">
       Great success!
     </notification-card>
 
@@ -23,8 +23,6 @@
    'button-label' - label displayed on the button. If empty or not set, the
                    button is hidden.
    'link-label' - text of the link. If empty or not set, the link is hidden.
-   'type' - icon type. Can be either 'success' or 'fail'. If not set, no icon
-            is displayed.
 
   Events:
     'buttonclick' - fired on button click.
@@ -43,44 +41,40 @@
       }
 
       :host iron-icon {
+        color: var(--cros-icon-color-warning);
         height: 28px;
         width: 28px;
       }
 
-      iron-icon[icon='cr:warning'] {
-        color: var(--google-yellow-500);
-      }
-
-      iron-icon[icon='notification-card:done'] {
-        color: var(--google-green-500);
-      }
-
       #text-container {
-        color: grey;
+        /* TODO(https://crbug.com/1320715) Revise the color */
+        color: var(--cros-text-color-primary);
         line-height: 130%;
         max-width: 240px;
         text-align: center;
       }
 
       a {
-        color: rgb(17, 85, 204); /* #1155CC */
+        /* TODO(https://crbug.com/1320715) Revise the color
+        color: rgb(17, 85, 204);  #1155CC
+        */
         cursor: pointer;
         text-decoration: none;
       }
 
       a:focus {
-        outline-color: rgb(77, 144, 254); /* #4D90FE */
+        /* TODO(https://crbug.com/1320715) Revise the color
+        outline-color: rgb(77, 144, 254);  #4D90FE
+        */
         transition: outline-color 200ms;
       }
     </style>
     <div id="container" class="vertical layout center fit">
       <div class="flex vertical layout center center-justified">
-        <template is="dom-if" if="[[type]]">
-          <div id="icon-container" class="vertical layout center">
-            <iron-icon icon$="[[iconNameByType_(type)]]">
-            </iron-icon>
-          </div>
-        </template>
+        <div id="icon-container" class="vertical layout center">
+          <iron-icon icon="cr:warning">
+          </iron-icon>
+        </div>
         <div id="text-container">
           <slot></slot>
         </div>
diff --git a/chrome/browser/resources/chromeos/login/components/notification_card.js b/chrome/browser/resources/chromeos/login/components/notification_card.js
index 10a3c20f5..ead90c5 100644
--- a/chrome/browser/resources/chromeos/login/components/notification_card.js
+++ b/chrome/browser/resources/chromeos/login/components/notification_card.js
@@ -4,12 +4,6 @@
 
 /* #js_imports_placeholder */
 
-/** @enum {string} */
-const NotificationCardType = {
-  FAIL: 'fail',
-  SUCCESS: 'success',
-};
-
 class NotificationCard extends Polymer.Element {
 
   static get is() {
@@ -23,26 +17,9 @@
       buttonLabel: {type: String, value: ''},
 
       linkLabel: {type: String, value: ''},
-
-      type: {type: String, value: ''}
     };
   }
 
-  /**
-   * @param {NotificationCardType} type
-   * @private
-   */
-  iconNameByType_(type) {
-    if (type == NotificationCardType.FAIL) {
-      return 'cr:warning';
-    }
-    if (type == NotificationCardType.SUCCESS) {
-      return 'oobe-24:done';
-    }
-    console.error('Unknown type "' + type + '".');
-    return '';
-  }
-
   /** @private */
   buttonClicked_() {
     this.dispatchEvent(new CustomEvent('buttonclick',
diff --git a/chrome/browser/resources/chromeos/login/components/oobe_icons.html b/chrome/browser/resources/chromeos/login/components/oobe_icons.html
index 0d809a0..23e3b5f 100644
--- a/chrome/browser/resources/chromeos/login/components/oobe_icons.html
+++ b/chrome/browser/resources/chromeos/login/components/oobe_icons.html
@@ -52,9 +52,6 @@
       <g id="domain">
         <path d="M12 7V3H2v18h20V7H12zM6 19H4v-2h2v2zm0-4H4v-2h2v2zm0-4H4V9h2v2zm0-4H4V5h2v2zm4 12H8v-2h2v2zm0-4H8v-2h2v2zm0-4H8V9h2v2zm0-4H8V5h2v2zm10 12h-8v-2h2v-2h-2v-2h2v-2h-2V9h8v10zm-2-8h-2v2h2v-2zm0 4h-2v2h2v-2z"></path>
       </g>
-      <g id="done">
-        <path d="M9 16.2L4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4L9 16.2z"></path>
-      </g>
       <g id="os-trial-install" fill="none" fill-rule="evenodd">
         <path fill="#fff" d="M0 0h24v24H0z"></path>
         <path fill="#1A73E8" clip-rule="evenodd" d="M3.6 13.7904C3.6 15.7788 5.2116 17.3904 7.2 17.3904H18C19.3248 17.3904 20.4 16.3152 20.4 14.9904C20.4 13.6656 19.3248 12.5904 18 12.5904H16.1928V11.4C16.1928 9.08039 14.3124 7.19999 11.9928 7.19999C10.0968 7.19999 8.5128 8.46479 7.9908 10.1904H7.2C5.2116 10.1904 3.6 11.802 3.6 13.7904ZM6.4548 7.87439C7.6248 6.03479 9.6576 4.79999 12 4.79999C15.252 4.79999 17.9484 7.15319 18.4932 10.2492C20.9088 10.5 22.8 12.5172 22.8 15C22.8 17.6508 20.6508 19.8 18 19.8H7.2C3.8868 19.8 1.2 17.1144 1.2 13.8C1.2 10.7412 3.4968 8.24519 6.4548 7.87439ZM15.304 12.6L13.894 11.19L12.804 12.27V9.59999H10.804V12.27L9.71398 11.19L8.30398 12.6L11.094 15.39L11.804 16.1L12.514 15.39L15.304 12.6Z"></path>
diff --git a/chrome/browser/resources/chromeos/login/components/progress_list_item/progress_list_item.html b/chrome/browser/resources/chromeos/login/components/progress_list_item/progress_list_item.html
index 45a050f..c4aa038a 100644
--- a/chrome/browser/resources/chromeos/login/components/progress_list_item/progress_list_item.html
+++ b/chrome/browser/resources/chromeos/login/components/progress_list_item/progress_list_item.html
@@ -39,7 +39,7 @@
       }
 
       #icon-pending {
-        background-color: var(--google-grey-500);
+        background-color: var(--cros-icon-color-disabled);
         border-radius: 50%;
         height: 8px;
         margin-inline-start: 8px;
@@ -52,7 +52,7 @@
       }
 
       #icon-completed {
-        color: var(--google-blue-600);
+        color: var(--cros-icon-color-blue);
       }
 
       #text {
@@ -63,7 +63,7 @@
       }
 
       #text-active {
-        color: black;
+        color: var(--cros-text-color-primary);
       }
     </style>
 
diff --git a/chrome/browser/resources/chromeos/login/components/security_token_pin.html b/chrome/browser/resources/chromeos/login/components/security_token_pin.html
index 2126c24..20ef4ba9 100644
--- a/chrome/browser/resources/chromeos/login/components/security_token_pin.html
+++ b/chrome/browser/resources/chromeos/login/components/security_token_pin.html
@@ -32,12 +32,12 @@
           width: 192px;
         };
         --pin-keyboard-input-letter-spacing: 13px;
-        --pin-keyboard-number-color: var(--google-grey-900);
+        --pin-keyboard-number-color: var(--cros-text-color-primary);
         --cr-icon-button-margin-start: 5px;
       }
 
       #errorContainer {
-        color: var(--google-red-600);
+        color: var(--cros-icon-color-red);
         font-size: 12px;
         padding: 4px 0 0;
         text-align: center;
diff --git a/chrome/browser/resources/chromeos/login/display_manager.js b/chrome/browser/resources/chromeos/login/display_manager.js
index 9990da7..fdf23d1 100644
--- a/chrome/browser/resources/chromeos/login/display_manager.js
+++ b/chrome/browser/resources/chromeos/login/display_manager.js
@@ -11,11 +11,9 @@
 // #import {loadTimeData} from './i18n_setup.js';
 // #import {OobeTypes} from './components/oobe_types.m.js';
 
-
-// #import {RESET_AVAILABLE_SCREEN_GROUP, DISPLAY_TYPE, ACCELERATOR_CANCEL, ACCELERATOR_VERSION, ACCELERATOR_RESET, SCREEN_OOBE_RESET, SCREEN_DEVICE_DISABLED, USER_ACTION_ROLLBACK_TOGGLED, OOBE_UI_STATE, SCREEN_WELCOME } from './components/display_manager_types.m.js';
+ // #import {DISPLAY_TYPE, ACCELERATOR_CANCEL, ACCELERATOR_VERSION, SCREEN_DEVICE_DISABLED, OOBE_UI_STATE, SCREEN_WELCOME } from './components/display_manager_types.m.js';
 // #import {MultiTapDetector} from './multi_tap_detector.m.js';
 // #import {keyboard} from './keyboard_utils.m.js'
-// #import {DisplayManagerScreenAttributes} from './components/display_manager_types.m.js'
 
 cr.define('cr.ui.login', function() {
   /**
@@ -80,12 +78,6 @@
       this.screens_ = [];
 
       /**
-       * Attributes of the registered screens.
-       * @type {Array<DisplayManagerScreenAttributes>}
-       */
-      this.screensAttributes_ = [];
-
-      /**
        * Current OOBE step, index in the screens array.
        * @type {number}
        */
@@ -262,7 +254,6 @@
         return;
       }
       const currentStepId = this.screens_[this.currentStep_];
-      const attributes = this.screensAttributes_[this.currentStep_] || {};
       if (name == ACCELERATOR_CANCEL) {
         if (this.currentScreen && this.currentScreen.cancel) {
           this.currentScreen.cancel();
@@ -271,14 +262,6 @@
         if (this.allowToggleVersion_) {
           $('version-labels').hidden = !$('version-labels').hidden;
         }
-      } else if (name == ACCELERATOR_RESET) {
-        if (currentStepId == SCREEN_OOBE_RESET) {
-          $('reset').userActed(USER_ACTION_ROLLBACK_TOGGLED);
-        } else if (
-            attributes.resetAllowed ||
-            RESET_AVAILABLE_SCREEN_GROUP.indexOf(currentStepId) != -1) {
-          chrome.send('toggleResetScreen');
-        }
       }
     }
 
@@ -413,9 +396,8 @@
     /**
      * Register an oobe screen.
      * @param {Element} el Decorated screen element.
-     * @param {DisplayManagerScreenAttributes} attributes
      */
-    registerScreen(el, attributes) {
+    registerScreen(el) {
       const screenId = el.id;
       assert(screenId);
       assert(!this.screens_.includes(screenId), 'Duplicate screen ID.');
@@ -424,7 +406,6 @@
           'Can not register Device disabled screen as the first');
 
       this.screens_.push(screenId);
-      this.screensAttributes_.push(attributes);
 
       if (el.updateOobeConfiguration && this.oobe_configuration_) {
         el.updateOobeConfiguration(this.oobe_configuration_);
diff --git a/chrome/browser/resources/chromeos/login/screens/common/adb_sideloading.js b/chrome/browser/resources/chromeos/login/screens/common/adb_sideloading.js
index b0149f26..7be4ba5d 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/adb_sideloading.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/adb_sideloading.js
@@ -64,9 +64,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('EnableAdbSideloadingScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('EnableAdbSideloadingScreen');
   }
 
   /*
@@ -120,4 +118,4 @@
   }
 }
 
-customElements.define(AdbSideloading.is, AdbSideloading);
\ No newline at end of file
+customElements.define(AdbSideloading.is, AdbSideloading);
diff --git a/chrome/browser/resources/chromeos/login/screens/common/app_downloading.js b/chrome/browser/resources/chromeos/login/screens/common/app_downloading.js
index ea10137..288475dc 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/app_downloading.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/app_downloading.js
@@ -32,9 +32,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('AppDownloadingScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('AppDownloadingScreen');
   }
 
   /** Initial UI State for screen */
diff --git a/chrome/browser/resources/chromeos/login/screens/common/app_launch_splash.js b/chrome/browser/resources/chromeos/login/screens/common/app_launch_splash.js
index ca53fa9e..396d9e9 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/app_launch_splash.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/app_launch_splash.js
@@ -57,9 +57,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('AppLaunchSplashScreen', {
-      resetAllowed: false,
-    });
+    this.initializeLoginScreen('AppLaunchSplashScreen');
 
     const networkContainer = this.$.configNetworkContainer;
     networkContainer.addEventListener(
diff --git a/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.js b/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.js
index a05cdfe..5409973 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.js
@@ -236,9 +236,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('ArcTermsOfServiceScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('ArcTermsOfServiceScreen');
 
     if (loadTimeData.valueExists('arcTosHostNameForTesting')) {
       this.setTosHostNameForTesting_(
diff --git a/chrome/browser/resources/chromeos/login/screens/common/assistant_optin.js b/chrome/browser/resources/chromeos/login/screens/common/assistant_optin.js
index 5098234a..11b45d6 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/assistant_optin.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/assistant_optin.js
@@ -35,9 +35,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('AssistantOptInFlowScreen', {
-      resetAllowed: false,
-    });
+    this.initializeLoginScreen('AssistantOptInFlowScreen');
   }
 
   /**
@@ -107,4 +105,4 @@
   }
 }
 
-customElements.define(AssistantOptin.is, AssistantOptin);
\ No newline at end of file
+customElements.define(AssistantOptin.is, AssistantOptin);
diff --git a/chrome/browser/resources/chromeos/login/screens/common/autolaunch.js b/chrome/browser/resources/chromeos/login/screens/common/autolaunch.js
index 3dba725..dd90fc7 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/autolaunch.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/autolaunch.js
@@ -52,9 +52,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('AutolaunchScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('AutolaunchScreen');
   }
 
   onConfirm_() {
diff --git a/chrome/browser/resources/chromeos/login/screens/common/consolidated_consent.js b/chrome/browser/resources/chromeos/login/screens/common/consolidated_consent.js
index ba85a1d..8a57aaf 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/consolidated_consent.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/consolidated_consent.js
@@ -181,9 +181,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('ConsolidatedConsentScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('ConsolidatedConsentScreen');
     this.updateLocalizedContent();
 
     if (loadTimeData.valueExists(
diff --git a/chrome/browser/resources/chromeos/login/screens/common/device_disabled.js b/chrome/browser/resources/chromeos/login/screens/common/device_disabled.js
index 44e205cc6..275a99fe 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/device_disabled.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/device_disabled.js
@@ -71,9 +71,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('DeviceDisabledScreen', {
-      resetAllowed: false,
-    });
+    this.initializeLoginScreen('DeviceDisabledScreen');
   }
 
   /** @override */
diff --git a/chrome/browser/resources/chromeos/login/screens/common/enable_kiosk.js b/chrome/browser/resources/chromeos/login/screens/common/enable_kiosk.js
index 28d1e75..46acb4f 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/enable_kiosk.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/enable_kiosk.js
@@ -62,9 +62,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('KioskEnableScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('KioskEnableScreen');
   }
 
   /** Called after resources are updated. */
@@ -117,4 +115,4 @@
   }
 }
 
-customElements.define(EnableKiosk.is, EnableKiosk);
\ No newline at end of file
+customElements.define(EnableKiosk.is, EnableKiosk);
diff --git a/chrome/browser/resources/chromeos/login/screens/common/error_message.js b/chrome/browser/resources/chromeos/login/screens/common/error_message.js
index 84a08fcf..d226c7e 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/error_message.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/error_message.js
@@ -222,9 +222,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('ErrorMessageScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('ErrorMessageScreen');
 
     this.updateLocalizedContent();
   }
diff --git a/chrome/browser/resources/chromeos/login/screens/common/family_link_notice.js b/chrome/browser/resources/chromeos/login/screens/common/family_link_notice.js
index 0f2fafc34..af535dd 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/family_link_notice.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/family_link_notice.js
@@ -79,7 +79,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('FamilyLinkNoticeScreen', {resetAllowed: true});
+    this.initializeLoginScreen('FamilyLinkNoticeScreen');
   }
 
   /**
diff --git a/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js b/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js
index 9707900..d5bced2 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/fingerprint_setup.js
@@ -132,9 +132,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('FingerprintSetupScreen', {
-      resetAllowed: false,
-    });
+    this.initializeLoginScreen('FingerprintSetupScreen');
   }
 
   /** Initial UI State for screen */
diff --git a/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.html b/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.html
index 34ed9d8..1d23fd3c 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.html
+++ b/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.html
@@ -123,7 +123,7 @@
         for-step="loading, gaia-loading">
       <throbber-notice text-key="gaiaLoading"></throbber-notice>
     </div>
-    <notification-card id="gaia-allowlist-error" type="fail" class="fit"
+    <notification-card id="gaia-allowlist-error" class="fit"
         for-step="allowlist-error"
         on-buttonclick="onAllowlistErrorTryAgainClick_"
         on-linkclick="onAllowlistErrorLinkClick_"
diff --git a/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.js b/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.js
index 9ef7398..a64ad492 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/gaia_signin.js
@@ -380,9 +380,7 @@
     this.authenticator_.recordSAMLProviderCallback =
         this.recordSAMLProvider_.bind(this);
 
-    this.initializeLoginScreen('GaiaSigninScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('GaiaSigninScreen');
   }
 
   /**
diff --git a/chrome/browser/resources/chromeos/login/screens/common/gesture_navigation.js b/chrome/browser/resources/chromeos/login/screens/common/gesture_navigation.js
index 39d37813..60a8261 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/gesture_navigation.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/gesture_navigation.js
@@ -54,7 +54,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('GestureNavigationScreen', {resetAllowed: true});
+    this.initializeLoginScreen('GestureNavigationScreen');
   }
 
   /**
diff --git a/chrome/browser/resources/chromeos/login/screens/common/guest_tos.js b/chrome/browser/resources/chromeos/login/screens/common/guest_tos.js
index 79cf2c16..e4453d4 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/guest_tos.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/guest_tos.js
@@ -76,9 +76,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('GuestTosScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('GuestTosScreen');
     this.updateLocalizedContent();
   }
 
diff --git a/chrome/browser/resources/chromeos/login/screens/common/hw_data_collection.js b/chrome/browser/resources/chromeos/login/screens/common/hw_data_collection.js
index acff78f..fd377c4 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/hw_data_collection.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/hw_data_collection.js
@@ -55,9 +55,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('HWDataCollectionScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('HWDataCollectionScreen');
   }
 
   /**
diff --git a/chrome/browser/resources/chromeos/login/screens/common/managed_terms_of_service.js b/chrome/browser/resources/chromeos/login/screens/common/managed_terms_of_service.js
index baf4826f..1e0e2146 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/managed_terms_of_service.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/managed_terms_of_service.js
@@ -106,9 +106,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('TermsOfServiceScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('TermsOfServiceScreen');
   }
 
   focus() {
diff --git a/chrome/browser/resources/chromeos/login/screens/common/marketing_opt_in.js b/chrome/browser/resources/chromeos/login/screens/common/marketing_opt_in.js
index a9e5c05..b355efef 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/marketing_opt_in.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/marketing_opt_in.js
@@ -126,7 +126,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('MarketingOptInScreen', {resetAllowed: true});
+    this.initializeLoginScreen('MarketingOptInScreen');
   }
 
   /** Shortcut method to control animation */
diff --git a/chrome/browser/resources/chromeos/login/screens/common/multidevice_setup.js b/chrome/browser/resources/chromeos/login/screens/common/multidevice_setup.js
index 1ffe3152..1a1e851 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/multidevice_setup.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/multidevice_setup.js
@@ -141,7 +141,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('MultiDeviceSetupScreen', {});
+    this.initializeLoginScreen('MultiDeviceSetupScreen');
     this.updateLocalizedContent();
   }
 
@@ -184,4 +184,4 @@
   }
 }
 
-customElements.define(MultiDeviceSetupScreen.is, MultiDeviceSetupScreen);
\ No newline at end of file
+customElements.define(MultiDeviceSetupScreen.is, MultiDeviceSetupScreen);
diff --git a/chrome/browser/resources/chromeos/login/screens/common/offline_ad_login.js b/chrome/browser/resources/chromeos/login/screens/common/offline_ad_login.js
index a5d33d6..17480de 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/offline_ad_login.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/offline_ad_login.js
@@ -258,9 +258,7 @@
     if (this.isDomainJoin) {
       this.setupEncList();
     } else {
-      this.initializeLoginScreen('ActiveDirectoryLoginScreen', {
-        resetAllowed: true,
-      });
+      this.initializeLoginScreen('ActiveDirectoryLoginScreen');
     }
   }
 
diff --git a/chrome/browser/resources/chromeos/login/screens/common/oobe_eula.js b/chrome/browser/resources/chromeos/login/screens/common/oobe_eula.js
index 0779962..d6f30d4 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/oobe_eula.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/oobe_eula.js
@@ -360,9 +360,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('EulaScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('EulaScreen');
   }
 
   /**
diff --git a/chrome/browser/resources/chromeos/login/screens/common/oobe_reset.js b/chrome/browser/resources/chromeos/login/screens/common/oobe_reset.js
index badf524..d222481 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/oobe_reset.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/oobe_reset.js
@@ -205,7 +205,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('ResetScreen', {resetAllowed: false});
+    this.initializeLoginScreen('ResetScreen');
   }
 
   /**
diff --git a/chrome/browser/resources/chromeos/login/screens/common/os_install.js b/chrome/browser/resources/chromeos/login/screens/common/os_install.js
index 67c4e7f8..3ef772c 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/os_install.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/os_install.js
@@ -75,9 +75,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('OsInstallScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('OsInstallScreen');
   }
 
   /**
diff --git a/chrome/browser/resources/chromeos/login/screens/common/os_trial.js b/chrome/browser/resources/chromeos/login/screens/common/os_trial.js
index c4791ff5..4adca45 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/os_trial.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/os_trial.js
@@ -55,9 +55,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('OsTrialScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('OsTrialScreen');
   }
 
   /**
diff --git a/chrome/browser/resources/chromeos/login/screens/common/parental_handoff.js b/chrome/browser/resources/chromeos/login/screens/common/parental_handoff.js
index 53839ce..b704683d 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/parental_handoff.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/parental_handoff.js
@@ -66,9 +66,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('ParentalHandoffScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('ParentalHandoffScreen');
   }
 
   /*
diff --git a/chrome/browser/resources/chromeos/login/screens/common/pin_setup.js b/chrome/browser/resources/chromeos/login/screens/common/pin_setup.js
index 1e142ec6..e77cb60 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/pin_setup.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/pin_setup.js
@@ -117,9 +117,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('PinSetupScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('PinSetupScreen');
   }
 
   defaultUIStep() {
@@ -210,4 +208,4 @@
   }
 }
 
-customElements.define(PinSetup.is, PinSetup);
\ No newline at end of file
+customElements.define(PinSetup.is, PinSetup);
diff --git a/chrome/browser/resources/chromeos/login/screens/common/recommend_apps.js b/chrome/browser/resources/chromeos/login/screens/common/recommend_apps.js
index eb1c547..f38bdf84 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/recommend_apps.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/recommend_apps.js
@@ -78,9 +78,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('RecommendAppsScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('RecommendAppsScreen');
     window.addEventListener('message', this.onMessage_.bind(this));
   }
 
diff --git a/chrome/browser/resources/chromeos/login/screens/common/recommend_apps_old.js b/chrome/browser/resources/chromeos/login/screens/common/recommend_apps_old.js
index 2764686..55b0bfeb 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/recommend_apps_old.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/recommend_apps_old.js
@@ -79,9 +79,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('RecommendAppsOldScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('RecommendAppsOldScreen');
     window.addEventListener('message', this.onMessage_.bind(this));
   }
 
diff --git a/chrome/browser/resources/chromeos/login/screens/common/saml_confirm_password.js b/chrome/browser/resources/chromeos/login/screens/common/saml_confirm_password.js
index 4081c86..129343d 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/saml_confirm_password.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/saml_confirm_password.js
@@ -75,9 +75,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('ConfirmSamlPasswordScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('ConfirmSamlPasswordScreen');
 
     cr.ui.LoginUITools.addSubmitListener(
         this.$.passwordInput, this.submit_.bind(this));
diff --git a/chrome/browser/resources/chromeos/login/screens/common/signin_fatal_error.js b/chrome/browser/resources/chromeos/login/screens/common/signin_fatal_error.js
index 7e8f0d9..3190f0b 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/signin_fatal_error.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/signin_fatal_error.js
@@ -84,9 +84,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('SignInFatalErrorScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('SignInFatalErrorScreen');
   }
 
   /** Initial UI State for screen */
diff --git a/chrome/browser/resources/chromeos/login/screens/common/smart_privacy_protection.js b/chrome/browser/resources/chromeos/login/screens/common/smart_privacy_protection.js
index e5397b1..43721ab 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/smart_privacy_protection.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/smart_privacy_protection.js
@@ -74,9 +74,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('SmartPrivacyProtectionScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('SmartPrivacyProtectionScreen');
   }
 
   /**
diff --git a/chrome/browser/resources/chromeos/login/screens/common/sync_consent.js b/chrome/browser/resources/chromeos/login/screens/common/sync_consent.js
index e94bc559..564d8ceb 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/sync_consent.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/sync_consent.js
@@ -117,9 +117,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('SyncConsentScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('SyncConsentScreen');
 
     if (this.locale === '') {
       // Update the locale just in case the locale switched between the element
diff --git a/chrome/browser/resources/chromeos/login/screens/common/theme_selection.js b/chrome/browser/resources/chromeos/login/screens/common/theme_selection.js
index b61b0e2..21bd601bc 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/theme_selection.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/theme_selection.js
@@ -68,9 +68,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('ThemeSelectionScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('ThemeSelectionScreen');
     this.selectedTheme = 'auto';
   }
 
diff --git a/chrome/browser/resources/chromeos/login/screens/common/tpm_error.js b/chrome/browser/resources/chromeos/login/screens/common/tpm_error.js
index 09b99d3..737b1084 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/tpm_error.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/tpm_error.js
@@ -51,9 +51,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('TPMErrorMessageScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('TPMErrorMessageScreen');
   }
 
   /** @override */
diff --git a/chrome/browser/resources/chromeos/login/screens/common/user_creation.js b/chrome/browser/resources/chromeos/login/screens/common/user_creation.js
index 1803582..735b848175 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/user_creation.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/user_creation.js
@@ -136,9 +136,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('UserCreationScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('UserCreationScreen');
   }
 
   getOobeUIInitialState() {
@@ -189,4 +187,4 @@
     this.$.learnMoreLink.focus();
   }
 }
-customElements.define(UserCreation.is, UserCreation);
\ No newline at end of file
+customElements.define(UserCreation.is, UserCreation);
diff --git a/chrome/browser/resources/chromeos/login/screens/common/wrong_hwid.js b/chrome/browser/resources/chromeos/login/screens/common/wrong_hwid.js
index de6c4334..f32d3bc 100644
--- a/chrome/browser/resources/chromeos/login/screens/common/wrong_hwid.js
+++ b/chrome/browser/resources/chromeos/login/screens/common/wrong_hwid.js
@@ -34,9 +34,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('WrongHWIDMessageScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('WrongHWIDMessageScreen');
   }
 
   /** Initial UI State for screen */
diff --git a/chrome/browser/resources/chromeos/login/screens/login/active_directory_password_change.js b/chrome/browser/resources/chromeos/login/screens/login/active_directory_password_change.js
index 6b2f554..a22a662 100644
--- a/chrome/browser/resources/chromeos/login/screens/login/active_directory_password_change.js
+++ b/chrome/browser/resources/chromeos/login/screens/login/active_directory_password_change.js
@@ -122,9 +122,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('ActiveDirectoryPasswordChangeScreen', {
-      resetAllowed: false,
-    });
+    this.initializeLoginScreen('ActiveDirectoryPasswordChangeScreen');
   }
 
   /**
diff --git a/chrome/browser/resources/chromeos/login/screens/login/encryption_migration.js b/chrome/browser/resources/chromeos/login/screens/login/encryption_migration.js
index 6cb98c67..1404627 100644
--- a/chrome/browser/resources/chromeos/login/screens/login/encryption_migration.js
+++ b/chrome/browser/resources/chromeos/login/screens/login/encryption_migration.js
@@ -134,9 +134,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('EncryptionMigrationScreen', {
-      resetAllowed: false,
-    });
+    this.initializeLoginScreen('EncryptionMigrationScreen');
   }
 
   /**
diff --git a/chrome/browser/resources/chromeos/login/screens/login/gaia_password_changed.js b/chrome/browser/resources/chromeos/login/screens/login/gaia_password_changed.js
index 75b4064..98d6a89 100644
--- a/chrome/browser/resources/chromeos/login/screens/login/gaia_password_changed.js
+++ b/chrome/browser/resources/chromeos/login/screens/login/gaia_password_changed.js
@@ -76,9 +76,7 @@
    */
   ready() {
     super.ready();
-    this.initializeLoginScreen('GaiaPasswordChangedScreen', {
-      resetAllowed: false,
-    });
+    this.initializeLoginScreen('GaiaPasswordChangedScreen');
 
     cr.ui.LoginUITools.addSubmitListener(
         this.$.oldPasswordInput, this.submit_.bind(this));
diff --git a/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.js b/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.js
index cb73b2d..889c27c 100644
--- a/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.js
+++ b/chrome/browser/resources/chromeos/login/screens/login/lacros_data_migration.js
@@ -105,9 +105,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('LacrosDataMigrationScreen', {
-      resetAllowed: false,
-    });
+    this.initializeLoginScreen('LacrosDataMigrationScreen');
   }
 
   onSkipButtonClicked_() {
diff --git a/chrome/browser/resources/chromeos/login/screens/login/management_transition.js b/chrome/browser/resources/chromeos/login/screens/login/management_transition.js
index 78e0d8a..5401d64 100644
--- a/chrome/browser/resources/chromeos/login/screens/login/management_transition.js
+++ b/chrome/browser/resources/chromeos/login/screens/login/management_transition.js
@@ -81,9 +81,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('ManagementTransitionScreen', {
-      resetAllowed: false,
-    });
+    this.initializeLoginScreen('ManagementTransitionScreen');
   }
 
   onBeforeShow(data) {
diff --git a/chrome/browser/resources/chromeos/login/screens/login/offline_login.js b/chrome/browser/resources/chromeos/login/screens/login/offline_login.js
index 6e5a418..9b1397e 100644
--- a/chrome/browser/resources/chromeos/login/screens/login/offline_login.js
+++ b/chrome/browser/resources/chromeos/login/screens/login/offline_login.js
@@ -129,9 +129,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('OfflineLoginScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('OfflineLoginScreen');
   }
 
   attached() {
diff --git a/chrome/browser/resources/chromeos/login/screens/login/update_required_card.js b/chrome/browser/resources/chromeos/login/screens/login/update_required_card.js
index 12ef951..81c0391 100644
--- a/chrome/browser/resources/chromeos/login/screens/login/update_required_card.js
+++ b/chrome/browser/resources/chromeos/login/screens/login/update_required_card.js
@@ -106,9 +106,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('UpdateRequiredScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('UpdateRequiredScreen');
     this.updateEolDeleteUsersDataMessage_();
   }
 
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/auto_enrollment_check.js b/chrome/browser/resources/chromeos/login/screens/oobe/auto_enrollment_check.js
index f3ead6c..05506d4 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/auto_enrollment_check.js
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/auto_enrollment_check.js
@@ -27,9 +27,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('AutoEnrollmentCheckScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('AutoEnrollmentCheckScreen');
   }
 }
 
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/demo_preferences.js b/chrome/browser/resources/chromeos/login/screens/oobe/demo_preferences.js
index 5046abde..812ed31 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/demo_preferences.js
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/demo_preferences.js
@@ -80,9 +80,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('DemoPreferencesScreen', {
-      resetAllowed: false,
-    });
+    this.initializeLoginScreen('DemoPreferencesScreen');
     this.updateLocalizedContent();
   }
 
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/demo_setup.js b/chrome/browser/resources/chromeos/login/screens/oobe/demo_setup.js
index 09b863b..4d24c2aa 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/demo_setup.js
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/demo_setup.js
@@ -80,9 +80,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('DemoSetupScreen', {
-      resetAllowed: false,
-    });
+    this.initializeLoginScreen('DemoSetupScreen');
   }
 
   defaultUIStep() {
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/enable_debugging.js b/chrome/browser/resources/chromeos/login/screens/oobe/enable_debugging.js
index 5cf63060..3c0ad03 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/enable_debugging.js
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/enable_debugging.js
@@ -81,9 +81,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('EnableDebuggingScreen', {
-      resetAllowed: false,
-    });
+    this.initializeLoginScreen('EnableDebuggingScreen');
   }
 
   defaultUIStep() {
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.js b/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.js
index 1e35b22..da64741 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.js
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/enterprise_enrollment.js
@@ -194,9 +194,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('OAuthEnrollmentScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('OAuthEnrollmentScreen');
 
     // Establish an initial messaging between content script and
     // host script so that content script can message back.
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/hid_detection.js b/chrome/browser/resources/chromeos/login/screens/oobe/hid_detection.js
index e39a66bc..f7743ad 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/hid_detection.js
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/hid_detection.js
@@ -157,9 +157,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('HIDDetectionScreen', {
-      resetAllowed: false,
-    });
+    this.initializeLoginScreen('HIDDetectionScreen');
   }
 
   getPrerequisitesText_(locale, touchscreenDetected) {
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.js b/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.js
index efeb756..7c20f32 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.js
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.js
@@ -112,9 +112,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('NetworkScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('NetworkScreen');
     this.updateLocalizedContent();
   }
 
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/packaged_license.js b/chrome/browser/resources/chromeos/login/screens/oobe/packaged_license.js
index cea8c3c..85b83df 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/packaged_license.js
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/packaged_license.js
@@ -43,7 +43,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('PackagedLicenseScreen', {resetAllowed: true});
+    this.initializeLoginScreen('PackagedLicenseScreen');
   }
 
   /**
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/quick_start.js b/chrome/browser/resources/chromeos/login/screens/oobe/quick_start.js
index 114107b1..8eff2203 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/quick_start.js
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/quick_start.js
@@ -61,9 +61,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('QuickStartScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('QuickStartScreen');
   }
 
   /** @override */
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/update.js b/chrome/browser/resources/chromeos/login/screens/oobe/update.js
index ce74033..a93391c8 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/update.js
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/update.js
@@ -176,9 +176,7 @@
 
   ready() {
     super.ready();
-    this.initializeLoginScreen('UpdateScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('UpdateScreen');
   }
 
   /**
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/welcome.js b/chrome/browser/resources/chromeos/login/screens/oobe/welcome.js
index 56666f07..e07e0ef 100644
--- a/chrome/browser/resources/chromeos/login/screens/oobe/welcome.js
+++ b/chrome/browser/resources/chromeos/login/screens/oobe/welcome.js
@@ -187,9 +187,7 @@
   /** @override */
   ready() {
     super.ready();
-    this.initializeLoginScreen('WelcomeScreen', {
-      resetAllowed: true,
-    });
+    this.initializeLoginScreen('WelcomeScreen');
     this.updateLocalizedContent();
   }
 
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_devices_subpage_browser_proxy.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_devices_subpage_browser_proxy.js
index 6ecf32c..0260a01f 100644
--- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_devices_subpage_browser_proxy.js
+++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_devices_subpage_browser_proxy.js
@@ -2,10 +2,6 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-// clang-format off
-import {addSingletonGetter} from 'chrome://resources/js/cr.m.js';
-// clang-format on
-
 /** @interface */
 export class OsBluetoothDevicesSubpageBrowserProxy {
   /**
@@ -23,8 +19,18 @@
   requestFastPairDeviceSupport() {
     chrome.send('requestFastPairDeviceSupportStatus');
   }
+
+  /** @return {!OsBluetoothDevicesSubpageBrowserProxy} */
+  static getInstance() {
+    return instance ||
+        (instance = new OsBluetoothDevicesSubpageBrowserProxyImpl());
+  }
+
+  /** @param {!OsBluetoothDevicesSubpageBrowserProxy} obj */
+  static setInstance(obj) {
+    instance = obj;
+  }
 }
 
-// The singleton instance_ is replaced with a test version of this wrapper
-// during testing.
-addSingletonGetter(OsBluetoothDevicesSubpageBrowserProxyImpl);
\ No newline at end of file
+/** @type {?OsBluetoothDevicesSubpageBrowserProxy} */
+let instance = null;
diff --git a/chrome/browser/ui/ash/desks_templates/desks_templates_client_browsertest.cc b/chrome/browser/ui/ash/desks_templates/desks_templates_client_browsertest.cc
index f978e40..5433058 100644
--- a/chrome/browser/ui/ash/desks_templates/desks_templates_client_browsertest.cc
+++ b/chrome/browser/ui/ash/desks_templates/desks_templates_client_browsertest.cc
@@ -1309,8 +1309,7 @@
   // dialog buttons think a click generated by the event generator is an
   // accidentally click and therefore ignores it.
   ClickSaveDeskAsTemplateButton(/*wait_for_ui=*/false);
-  views::Button* dialog_accept_button =
-      ash::GetDesksTemplatesDialogAcceptButton();
+  views::Button* dialog_accept_button = ash::GetSavedDeskDialogAcceptButton();
   ASSERT_TRUE(dialog_accept_button);
   aura::Window* root_window =
       dialog_accept_button->GetWidget()->GetNativeWindow()->GetRootWindow();
@@ -1858,8 +1857,7 @@
   // Confirm deleting a template. Use a key press to accept the dialog instead
   // of a click as dialog buttons think a click generated by the event generator
   // is an accidentally click and therefore ignores it.
-  views::Button* dialog_accept_button =
-      ash::GetDesksTemplatesDialogAcceptButton();
+  views::Button* dialog_accept_button = ash::GetSavedDeskDialogAcceptButton();
   ASSERT_TRUE(dialog_accept_button);
   aura::Window* root_window =
       dialog_accept_button->GetWidget()->GetNativeWindow()->GetRootWindow();
diff --git a/chrome/browser/ui/views/webid/account_selection_bubble_view.cc b/chrome/browser/ui/views/webid/account_selection_bubble_view.cc
index a852f90..347f7338 100644
--- a/chrome/browser/ui/views/webid/account_selection_bubble_view.cc
+++ b/chrome/browser/ui/views/webid/account_selection_bubble_view.cc
@@ -16,6 +16,7 @@
 #include "components/image_fetcher/core/image_fetcher_impl.h"
 #include "content/public/browser/storage_partition.h"
 #include "net/traffic_annotation/network_traffic_annotation.h"
+#include "skia/ext/image_operations.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/base/metadata/metadata_impl_macros.h"
 #include "ui/gfx/image/canvas_image_source.h"
@@ -34,6 +35,7 @@
 constexpr int kButtonRadius = 20;
 constexpr int kBubbleWidth = 375;
 constexpr int kDesiredAvatarSize = 40;
+constexpr int kDesiredIconSize = 20;
 constexpr int kPadding = 5;
 constexpr int kProgressBarHeight = 2;
 
@@ -112,7 +114,10 @@
   SetTitle(l10n_util::GetStringFUTF16(
       IDS_ACCOUNT_SELECTION_SHEET_TITLE_EXPLICIT,
       base::UTF8ToUTF16(rp_etld_plus_one), idp_etld_plus_one_));
-  auto imageSkia = gfx::ImageSkia::CreateFrom1xBitmap(idp_metadata.brand_icon);
+  gfx::ImageSkia imageSkia =
+      gfx::ImageSkia::CreateFrom1xBitmap(skia::ImageOperations::Resize(
+          idp_metadata.brand_icon, skia::ImageOperations::RESIZE_LANCZOS3,
+          kDesiredIconSize, kDesiredIconSize));
   SetIcon(imageSkia);
   SetShowIcon(true);
   SetShowCloseButton(true);
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
index 9674d3af..bdaedc43 100644
--- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
+++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -1006,7 +1006,8 @@
     return &NewWebUI<ash::printing::printing_manager::PrintManagementUI>;
   if (url.host_piece() == ash::kChromeUIScanningAppHost)
     return &NewWebUI<ash::ScanningUI>;
-  if (ash::features::IsShimlessRMAFlowEnabled() &&
+  if ((ash::shimless_rma::HasLaunchRmaSwitchAndIsAllowed() ||
+       ash::features::IsShimlessRMAStandaloneAppEnabled()) &&
       url.host_piece() == ash::kChromeUIShimlessRMAHost) {
     return &NewWebUI<ash::ShimlessRMADialogUI>;
   }
diff --git a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
index 16f3c9a..1637044 100644
--- a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
+++ b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.cc
@@ -22,7 +22,6 @@
 #include "chrome/browser/ash/login/demo_mode/demo_setup_controller.h"
 #include "chrome/browser/ash/login/helper.h"
 #include "chrome/browser/ash/login/lock/screen_locker.h"
-#include "chrome/browser/ash/login/screens/reset_screen.h"
 #include "chrome/browser/ash/login/ui/login_display_host.h"
 #include "chrome/browser/ash/login/ui/oobe_dialog_size_utils.h"
 #include "chrome/browser/ash/login/wizard_controller.h"
@@ -35,7 +34,6 @@
 #include "chrome/browser/ui/webui/chromeos/login/demo_setup_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/eula_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/oobe_ui.h"
-#include "chrome/browser/ui/webui/chromeos/login/reset_screen_handler.h"
 #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h"
 #include "chrome/common/channel_info.h"
 #include "chrome/common/chrome_constants.h"
@@ -129,7 +127,6 @@
   AddCallback("skipToLoginForTesting",
               &CoreOobeHandler::HandleSkipToLoginForTesting);
   AddCallback("launchHelpApp", &CoreOobeHandler::HandleLaunchHelpApp);
-  AddCallback("toggleResetScreen", &CoreOobeHandler::HandleToggleResetScreen);
   AddCallback("raiseTabKeyEvent", &CoreOobeHandler::HandleRaiseTabKeyEvent);
   AddCallback("startDemoModeSetupForTesting",
               &CoreOobeHandler::HandleStartDemoModeSetupForTesting);
@@ -181,29 +178,6 @@
     WizardController::default_controller()->SkipToLoginForTesting();
 }
 
-void CoreOobeHandler::HandleToggleResetScreen() {
-  base::OnceCallback<void(bool, absl::optional<tpm_firmware_update::Mode>)>
-      callback =
-          base::BindOnce(&CoreOobeHandler::HandleToggleResetScreenCallback,
-                         weak_ptr_factory_.GetWeakPtr());
-  ResetScreen::CheckIfPowerwashAllowed(std::move(callback));
-}
-
-void CoreOobeHandler::HandleToggleResetScreenCallback(
-    bool is_reset_allowed,
-    absl::optional<tpm_firmware_update::Mode> tpm_firmware_update_mode) {
-  if (!is_reset_allowed)
-    return;
-  if (tpm_firmware_update_mode.has_value()) {
-    // Force the TPM firmware update option to be enabled.
-    g_browser_process->local_state()->SetInteger(
-        prefs::kFactoryResetTPMFirmwareUpdateMode,
-        static_cast<int>(tpm_firmware_update_mode.value()));
-  }
-  DCHECK(LoginDisplayHost::default_host());
-  LoginDisplayHost::default_host()->StartWizard(ResetView::kScreenId);
-}
-
 void CoreOobeHandler::ShowOobeUI(bool show) {
   if (show == show_oobe_ui_)
     return;
diff --git a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h
index 9c7b508..1bb0d31 100644
--- a/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h
+++ b/chrome/browser/ui/webui/chromeos/login/core_oobe_handler.h
@@ -11,7 +11,6 @@
 
 #include "ash/public/cpp/tablet_mode_observer.h"
 #include "base/callback.h"
-#include "base/memory/weak_ptr.h"
 #include "base/values.h"
 #include "chrome/browser/ash/login/help_app_launcher.h"
 #include "chrome/browser/ash/login/oobe_configuration.h"
@@ -113,18 +112,11 @@
   void HandleUpdateCurrentScreen(const std::string& screen);
   void HandleSkipToLoginForTesting();
   void HandleLaunchHelpApp(int help_topic_id);
-  void HandleToggleResetScreen();
   // Handles demo mode setup for tests. Accepts 'online' and 'offline' as
   // `demo_config`.
   void HandleStartDemoModeSetupForTesting(const std::string& demo_config);
   void HandleUpdateOobeUIState(int state);
 
-  // Shows the reset screen if `is_reset_allowed` and updates the
-  // tpm_firmware_update in settings.
-  void HandleToggleResetScreenCallback(
-      bool is_reset_allowed,
-      absl::optional<tpm_firmware_update::Mode> tpm_firmware_update_mode);
-
   // When keyboard_utils.js arrow key down event is reached, raise it
   // to tab/shift-tab event.
   void HandleRaiseTabKeyEvent(bool reverse);
@@ -143,8 +135,6 @@
 
   // Help application used for help dialogs.
   scoped_refptr<HelpAppLauncher> help_app_;
-
-  base::WeakPtrFactory<CoreOobeHandler> weak_ptr_factory_{this};
 };
 
 }  // namespace chromeos
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_power_handler.cc b/chrome/browser/ui/webui/settings/chromeos/device_power_handler.cc
index 5d5fd0f..55ee8bb4 100644
--- a/chrome/browser/ui/webui/settings/chromeos/device_power_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/device_power_handler.cc
@@ -363,19 +363,19 @@
   const absl::optional<power_manager::PowerSupplyProperties>& proto =
       PowerManagerClient::Get()->GetLastStatus();
   DCHECK(proto);
-  base::ListValue sources_list;
+  base::Value::List sources_list;
   for (int i = 0; i < proto->available_external_power_source_size(); i++) {
     const auto& source = proto->available_external_power_source(i);
-    std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
-    dict->SetStringKey("id", source.id());
-    dict->SetBoolKey("is_dedicated_charger", source.active_by_default());
-    dict->SetStringKey("description", l10n_util::GetStringUTF16(
-                                          PowerSourceToDisplayId(source)));
+    base::Value::Dict dict;
+    dict.Set("id", source.id());
+    dict.Set("is_dedicated_charger", source.active_by_default());
+    dict.Set("description",
+             l10n_util::GetStringUTF16(PowerSourceToDisplayId(source)));
     sources_list.Append(std::move(dict));
   }
 
   FireWebUIListener(
-      "power-sources-changed", sources_list,
+      "power-sources-changed", base::Value(std::move(sources_list)),
       base::Value(proto->external_power_source_id()),
       base::Value(proto->external_power() ==
                   power_manager::PowerSupplyProperties_ExternalPower_USB));
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc b/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc
index 6bbafad..0ba696c 100644
--- a/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc
+++ b/chrome/browser/ui/webui/settings/chromeos/device_stylus_handler.cc
@@ -87,7 +87,7 @@
 void StylusHandler::UpdateNoteTakingApps() {
   bool waiting_for_android = false;
   note_taking_app_ids_.clear();
-  base::ListValue apps_list;
+  base::Value::List apps_list;
 
   NoteTakingHelper* helper = NoteTakingHelper::Get();
   if (helper->play_store_enabled() && !helper->android_apps_received()) {
@@ -98,19 +98,20 @@
     std::vector<NoteTakingAppInfo> available_apps =
         helper->GetAvailableApps(Profile::FromWebUI(web_ui()));
     for (const NoteTakingAppInfo& info : available_apps) {
-      auto dict = std::make_unique<base::DictionaryValue>();
-      dict->SetStringKey(kAppNameKey, info.name);
-      dict->SetStringKey(kAppIdKey, info.app_id);
-      dict->SetBoolKey(kAppPreferredKey, info.preferred);
-      dict->SetIntKey(kAppLockScreenSupportKey,
-                      static_cast<int>(info.lock_screen_support));
+      base::Value::Dict dict;
+      dict.Set(kAppNameKey, info.name);
+      dict.Set(kAppIdKey, info.app_id);
+      dict.Set(kAppPreferredKey, info.preferred);
+      dict.Set(kAppLockScreenSupportKey,
+               static_cast<int>(info.lock_screen_support));
       apps_list.Append(std::move(dict));
 
       note_taking_app_ids_.insert(info.app_id);
     }
   }
 
-  FireWebUIListener("onNoteTakingAppsUpdated", apps_list,
+  FireWebUIListener("onNoteTakingAppsUpdated",
+                    base::Value(std::move(apps_list)),
                     base::Value(waiting_for_android));
 }
 
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt
index 08a53f17..cb9c38d 100644
--- a/chrome/build/linux.pgo.txt
+++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@
-chrome-linux-main-1651730035-7c2bc9c754f16e0cb15fef8a61ff068912477ab5.profdata
+chrome-linux-main-1651751587-5fdbaa7bc5b1deae92c86c67b2e8d3b90a2f804b.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt
index 4da8153..843da7a6 100644
--- a/chrome/build/win64.pgo.txt
+++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@
-chrome-win64-main-1651741175-0cba574163b2cccf6f333c4857519a31c7927c60.profdata
+chrome-win64-main-1651751587-7c6fd745490407fec4f6e9b020e737262f7aa665.profdata
diff --git a/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts b/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts
index 3ae118be..161482bb 100644
--- a/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts
+++ b/chrome/test/data/webui/chromeos/personalization_app/test_wallpaper_interface_provider.ts
@@ -5,7 +5,7 @@
 import {CurrentWallpaper, FetchGooglePhotosAlbumsResponse, FetchGooglePhotosPhotosResponse, GooglePhotosAlbum, GooglePhotosEnablementState, GooglePhotosPhoto, OnlineImageType, WallpaperCollection, WallpaperImage, WallpaperLayout, WallpaperObserverInterface, WallpaperObserverRemote, WallpaperProviderInterface, WallpaperType} from 'chrome://personalization/trusted/personalization_app.js';
 import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js';
 import {FilePath} from 'chrome://resources/mojo/mojo/public/mojom/base/file_path.mojom-webui.js';
-import {assertNotReached, assertTrue} from 'chrome://webui-test/chai_assert.js';
+import {assertTrue} from 'chrome://webui-test/chai_assert.js';
 import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js';
 
 export class TestWallpaperProvider extends
@@ -18,7 +18,6 @@
       'fetchCollections',
       'fetchImagesForCollection',
       'fetchGooglePhotosAlbums',
-      'fetchGooglePhotosCount',
       'fetchGooglePhotosEnabled',
       'fetchGooglePhotosPhotos',
       'getDefaultImageThumbnail',
@@ -174,11 +173,6 @@
     return Promise.resolve({response});
   }
 
-  fetchGooglePhotosCount() {
-    assertNotReached();
-    return Promise.resolve({count: -1});
-  }
-
   fetchGooglePhotosEnabled() {
     this.methodCalled('fetchGooglePhotosEnabled');
     const state = loadTimeData.getBoolean('isGooglePhotosIntegrationEnabled') ?
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_browsertest.js b/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_browsertest.js
index 68c92942..6fa106e0 100644
--- a/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_browsertest.js
+++ b/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_browsertest.js
@@ -31,7 +31,12 @@
 
   /** @override */
   get featureList() {
-    return {enabled: ['chromeos::features::kShimlessRMAFlow']};
+    return {
+      enabled: [
+        'chromeos::features::kShimlessRMAFlow',
+        'chromeos::features::kShimlessRMAEnableStandalone'
+      ]
+    };
   }
 };
 
diff --git a/chrome/tools/build/mac/BUILD.gn b/chrome/tools/build/mac/BUILD.gn
index cd080ae..4666937 100644
--- a/chrome/tools/build/mac/BUILD.gn
+++ b/chrome/tools/build/mac/BUILD.gn
@@ -2,6 +2,19 @@
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
 
+if (current_toolchain != default_toolchain) {
+  # Builds string resources with the default toolchain, then copies them into a temp
+  # include directory for the current toolchain.
+  copy("copy_chrome_strings_headers") {
+    sources = [ "$root_build_dir/gen/chrome/grit/chromium_strings.h" ]
+    outputs = [
+      "$root_out_dir/infoplist_strings_util_gen/chrome/grit/chromium_strings.h",
+    ]
+
+    deps = [ "//chrome:strings($default_toolchain)" ]
+  }
+}
+
 executable("infoplist_strings_util") {
   configs += [ "//build/config/compiler:wexit_time_destructors" ]
 
@@ -10,8 +23,16 @@
   deps = [
     "//base",
     "//base:i18n",
-    "//chrome:strings",
     "//third_party/icu",
     "//ui/base:ui_data_pack",
   ]
+
+  # This runs as part of the build, on the host, but needs to process strings
+  # for the target.
+  if (current_toolchain == default_toolchain) {
+    deps += [ "//chrome:strings" ]
+  } else {
+    deps += [ ":copy_chrome_strings_headers" ]
+    include_dirs = [ "$root_out_dir/infoplist_strings_util_gen" ]
+  }
 }
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM
index c92a551..2ab5f722 100644
--- a/chromeos/CHROMEOS_LKGM
+++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@
-14764.0.0
\ No newline at end of file
+14776.0.0
\ No newline at end of file
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd
index 0c01023..93edc6a 100644
--- a/chromeos/chromeos_strings.grd
+++ b/chromeos/chromeos_strings.grd
@@ -2946,10 +2946,10 @@
         Shut down
       </message>
       <!-- Run calibration page -->
-      <message name="IDS_SHIMLESS_RMA_RUN_CALIBRATION_PAGE_TITLE" translateable="false" desc="Title for the page shown when running component calibration steps.">
-        Calibrating device components
+      <message name="IDS_SHIMLESS_RMA_RUN_CALIBRATION_PAGE_TITLE" desc="Title for the page shown when running component calibration steps.">
+        Calibrating components...
       </message>
-      <message name="IDS_SHIMLESS_RMA_RUN_CALIBRATION_COMPLETE_TITLE" translateable="false" desc="Title for the page shown when component calibration steps are complete.">
+      <message name="IDS_SHIMLESS_RMA_RUN_CALIBRATION_COMPLETE_TITLE" desc="Title for the page shown when component calibration steps are complete.">
         Calibration complete
       </message>
       <!-- OS update page -->
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_RUN_CALIBRATION_COMPLETE_TITLE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_RUN_CALIBRATION_COMPLETE_TITLE.png.sha1
new file mode 100644
index 0000000..8cbf8a3
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_RUN_CALIBRATION_COMPLETE_TITLE.png.sha1
@@ -0,0 +1 @@
+8c3b002e7118d62f97165eb4113c1260e5811b58
\ No newline at end of file
diff --git a/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_RUN_CALIBRATION_PAGE_TITLE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_RUN_CALIBRATION_PAGE_TITLE.png.sha1
new file mode 100644
index 0000000..82114c0
--- /dev/null
+++ b/chromeos/chromeos_strings_grd/IDS_SHIMLESS_RMA_RUN_CALIBRATION_PAGE_TITLE.png.sha1
@@ -0,0 +1 @@
+b32d3b07caa3fba62f59b27ae672aca4d7b9c1ee
\ No newline at end of file
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomBarCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomBarCoordinator.java
index d8eaedb..cdaf867 100644
--- a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomBarCoordinator.java
+++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomBarCoordinator.java
@@ -113,9 +113,7 @@
         mWindowApplicationInsetSupplier.addSupplier(mInsetSupplier);
 
         BottomSheetContent currentSheetContent = controller.getCurrentSheetContent();
-        boolean shouldReuseContent = currentSheetContent instanceof AssistantBottomSheetContent
-                && ((AssistantBottomSheetContent) currentSheetContent).isReusable();
-        if (shouldReuseContent) {
+        if (currentSheetContent instanceof AssistantBottomSheetContent) {
             mContent = (AssistantBottomSheetContent) currentSheetContent;
             mContent.setDelegate(model::getBottomBarDelegate);
         } else {
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomSheetContent.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomSheetContent.java
index 24dee04..d7c4ee7 100644
--- a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomSheetContent.java
+++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomSheetContent.java
@@ -31,7 +31,6 @@
     private BottomSheetController mController;
     @Nullable
     private Callback<Integer> mOffsetController;
-    private boolean mDoNotReuse;
 
     public AssistantBottomSheetContent(
             Context context, Supplier<AssistantBottomBarDelegate> supplier) {
@@ -170,17 +169,4 @@
     public Callback<Integer> getOffsetController() {
         return mOffsetController;
     }
-
-    /**
-     * Marks the content as non-reusable. This is used in cases where it would be hard to properly
-     * transfer the content (like Trigger UI to Direct Action), and having a bottom sheet animation
-     * is expected/acceptable. See b/209399694.
-     */
-    public void setDoNotReuse(boolean doNotReuse) {
-        mDoNotReuse = doNotReuse;
-    }
-
-    public boolean isReusable() {
-        return !mDoNotReuse;
-    }
 }
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantActionHandlerImpl.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantActionHandlerImpl.java
index 58b731f..d929c1a 100644
--- a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantActionHandlerImpl.java
+++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantActionHandlerImpl.java
@@ -16,8 +16,6 @@
 import org.chromium.components.autofill_assistant.onboarding.BaseOnboardingCoordinator;
 import org.chromium.components.autofill_assistant.onboarding.OnboardingCoordinatorFactory;
 import org.chromium.components.autofill_assistant.overlay.AssistantOverlayCoordinator;
-import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent;
-import org.chromium.components.browser_ui.bottomsheet.BottomSheetController;
 import org.chromium.content_public.browser.WebContents;
 import org.chromium.ui.base.WindowAndroid;
 
@@ -33,17 +31,14 @@
     private final OnboardingCoordinatorFactory mOnboardingCoordinatorFactory;
     private final AssistantStaticDependencies mStaticDependencies;
     private final Supplier<WebContents> mWebContentsSupplier;
-    private final BottomSheetController mBottomSheetController;
 
     public AutofillAssistantActionHandlerImpl(
             OnboardingCoordinatorFactory onboardingCoordinatorFactory,
             Supplier<WebContents> webContentsSupplier,
-            AssistantStaticDependencies staticDependencies,
-            BottomSheetController bottomSheetController) {
+            AssistantStaticDependencies staticDependencies) {
         mOnboardingCoordinatorFactory = onboardingCoordinatorFactory;
         mWebContentsSupplier = webContentsSupplier;
         mStaticDependencies = staticDependencies;
-        mBottomSheetController = bottomSheetController;
     }
 
     @Override
@@ -100,9 +95,6 @@
             callback.onResult(false);
             return;
         }
-        // Direct actions should not reuse the UI of existing flows, whether they are earlier direct
-        // actions or regular flows. See b/209399694.
-        preventContentReuse();
 
         Map<String, String> argumentMap = toArgumentMap(arguments);
         Callback<AssistantOverlayCoordinator> afterOnboarding = (overlayCoordinator) -> {
@@ -137,16 +129,6 @@
     }
 
     /**
-     * Marks the current bottom sheet content, if any, as not reusable.
-     */
-    private void preventContentReuse() {
-        BottomSheetContent currentContent = mBottomSheetController.getCurrentSheetContent();
-        if (currentContent instanceof AssistantBottomSheetContent) {
-            ((AssistantBottomSheetContent) currentContent).setDoNotReuse(true);
-        }
-    }
-
-    /**
      * Returns a client for the current tab or {@code null} if there's no current tab or the current
      * tab doesn't have an associated browser content.
      */
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantModuleEntryImpl.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantModuleEntryImpl.java
index 6f72f78..64584803 100644
--- a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantModuleEntryImpl.java
+++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AutofillAssistantModuleEntryImpl.java
@@ -34,6 +34,6 @@
                         staticDependencies.getBrowserContext(), browserControlsFactory, rootView,
                         staticDependencies.getAccessibilityUtil(),
                         staticDependencies.createInfoPageUtil()),
-                webContentsSupplier, staticDependencies, bottomSheetController);
+                webContentsSupplier, staticDependencies);
     }
 }
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayCoordinator.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayCoordinator.java
index 109f77e..1d58afc 100644
--- a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayCoordinator.java
+++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/overlay/AssistantOverlayCoordinator.java
@@ -156,10 +156,7 @@
                                            .with(ScrimProperties.GESTURE_DETECTOR, mEventFilter)
                                            .build();
             mScrim.showScrim(params);
-        } else if (mScrim.isShowingScrim()) {
-            // The mScrim.isShowingScrim() check is because of a race condition during a test where
-            // two OverlayCoordinators from two different direct action runs try to hide the scrim
-            // at the same time causing an exception.
+        } else {
             mScrim.hideScrim(/* fadeOut= */ true);
         }
         mScrimEnabled = enabled;
diff --git a/components/autofill_assistant/android/public/java/src/org/chromium/components/autofill_assistant/Starter.java b/components/autofill_assistant/android/public/java/src/org/chromium/components/autofill_assistant/Starter.java
index 6b35b322..9f92ed1 100644
--- a/components/autofill_assistant/android/public/java/src/org/chromium/components/autofill_assistant/Starter.java
+++ b/components/autofill_assistant/android/public/java/src/org/chromium/components/autofill_assistant/Starter.java
@@ -161,10 +161,6 @@
         safeNativeOnInteractabilityChanged(isInteractable);
     }
 
-    public void onDirectActionTriggered() {
-        safeNativeOnDirectActionTriggered();
-    }
-
     /**
      * Forces native to re-evaluate the Chrome settings. Integration tests may need to call this to
      * ensure that programmatic updates to the Chrome settings are received by the native starter.
@@ -278,14 +274,6 @@
         StarterJni.get().onOnboardingFinished(mNativeStarter, Starter.this, shown, result);
     }
 
-    private void safeNativeOnDirectActionTriggered() {
-        if (mNativeStarter == 0) {
-            return;
-        }
-
-        StarterJni.get().onDirectActionTriggered(mNativeStarter, Starter.this);
-    }
-
     @CalledByNative
     static boolean getProactiveHelpSettingEnabled() {
         return AutofillAssistantPreferencesUtil.isProactiveHelpOn();
@@ -344,7 +332,6 @@
         void onInteractabilityChanged(
                 long nativeStarterDelegateAndroid, Starter caller, boolean isInteractable);
         void onActivityAttachmentChanged(long nativeStarterDelegateAndroid, Starter caller);
-        void onDirectActionTriggered(long nativeStarterDelegateAndroid, Starter caller);
         void start(long nativeStarterDelegateAndroid, Starter caller, String experimentIds,
                 String[] parameterNames, String[] parameterValues,
                 String[] deviceOnlyParameterNames, String[] deviceOnlyParameterValues,
diff --git a/components/autofill_assistant/browser/android/starter_delegate_android.cc b/components/autofill_assistant/browser/android/starter_delegate_android.cc
index f080ceda..eb0f569a 100644
--- a/components/autofill_assistant/browser/android/starter_delegate_android.cc
+++ b/components/autofill_assistant/browser/android/starter_delegate_android.cc
@@ -157,16 +157,6 @@
   starter_->OnDependenciesInvalidated();
 }
 
-void StarterDelegateAndroid::OnDirectActionTriggered(
-    JNIEnv* env,
-    const base::android::JavaParamRef<jobject>& jcaller) {
-  if (!starter_) {
-    return;
-  }
-
-  starter_->OnDirectActionTriggered();
-}
-
 bool StarterDelegateAndroid::GetIsFirstTimeUser() const {
   return Java_Starter_getIsFirstTimeUser(base::android::AttachCurrentThread());
 }
diff --git a/components/autofill_assistant/browser/android/starter_delegate_android.h b/components/autofill_assistant/browser/android/starter_delegate_android.h
index 433458a3..86a4bef 100644
--- a/components/autofill_assistant/browser/android/starter_delegate_android.h
+++ b/components/autofill_assistant/browser/android/starter_delegate_android.h
@@ -122,10 +122,6 @@
       JNIEnv* env,
       const base::android::JavaParamRef<jobject>& jcaller);
 
-  void OnDirectActionTriggered(
-      JNIEnv* env,
-      const base::android::JavaParamRef<jobject>& jcaller);
-
  private:
   friend class content::WebContentsUserData<StarterDelegateAndroid>;
   StarterDelegateAndroid(content::WebContents* web_contents,
diff --git a/components/autofill_assistant/browser/starter.cc b/components/autofill_assistant/browser/starter.cc
index dc63b62a..02a1eaf 100644
--- a/components/autofill_assistant/browser/starter.cc
+++ b/components/autofill_assistant/browser/starter.cc
@@ -456,10 +456,6 @@
   Start(std::move(trigger_context));
 }
 
-void Starter::OnDirectActionTriggered() {
-  CancelPendingStartup(Metrics::TriggerScriptFinishedState::CANCELED);
-}
-
 void Starter::Start(std::unique_ptr<TriggerContext> trigger_context) {
   DCHECK(trigger_context);
   DCHECK(!trigger_context->GetDirectAction());
diff --git a/components/autofill_assistant/browser/starter.h b/components/autofill_assistant/browser/starter.h
index 8e66462..795821e 100644
--- a/components/autofill_assistant/browser/starter.h
+++ b/components/autofill_assistant/browser/starter.h
@@ -83,10 +83,6 @@
   // When the activity is changed on Android.
   void OnDependenciesInvalidated();
 
-  // Called when a direct action is triggered. Cancels the pending startup and
-  // closes JITT UI.
-  void OnDirectActionTriggered();
-
   const CommonDependencies* GetCommonDependencies();
   const PlatformDependencies* GetPlatformDependencies();
 
diff --git a/components/embedder_support/user_agent_utils_unittest.cc b/components/embedder_support/user_agent_utils_unittest.cc
index 52c8ac3..910b7ab9 100644
--- a/components/embedder_support/user_agent_utils_unittest.cc
+++ b/components/embedder_support/user_agent_utils_unittest.cc
@@ -616,11 +616,8 @@
   EXPECT_EQ(metadata.wow64, content::IsWoW64());
 }
 
-TEST_F(UserAgentUtilsTest, GenerateBrandVersionList) {
+TEST_F(UserAgentUtilsTest, GenerateBrandVersionListUnbranded) {
   blink::UserAgentMetadata metadata;
-
-  // The updated GREASE algorithm is used by default; separate tests are below
-  // to ensure the old algorithm is maintained.
   metadata.brand_version_list = GenerateBrandVersionList(
       84, absl::nullopt, "84", absl::nullopt, absl::nullopt, true,
       blink::UserAgentBrandVersionType::kMajorVersion);
@@ -634,6 +631,17 @@
   std::string brand_list_w_fv = metadata.SerializeBrandFullVersionList();
   EXPECT_EQ(R"("/Not=A?Brand";v="8.0.0.0", "Chromium";v="84.0.0.0")",
             brand_list_w_fv);
+}
+
+TEST_F(UserAgentUtilsTest, GenerateBrandVersionListUnbrandedVerifySeedChanges) {
+  blink::UserAgentMetadata metadata;
+
+  metadata.brand_version_list = GenerateBrandVersionList(
+      84, absl::nullopt, "84", absl::nullopt, absl::nullopt, true,
+      blink::UserAgentBrandVersionType::kMajorVersion);
+  // Capture the serialized brand lists with version 84 as the seed.
+  std::string brand_list = metadata.SerializeBrandMajorVersionList();
+  std::string brand_list_w_fv = metadata.SerializeBrandFullVersionList();
 
   metadata.brand_version_list = GenerateBrandVersionList(
       85, absl::nullopt, "85", absl::nullopt, absl::nullopt, true,
@@ -641,9 +649,10 @@
   metadata.brand_full_version_list = GenerateBrandVersionList(
       85, absl::nullopt, "85.0.0.0", absl::nullopt, absl::nullopt, true,
       blink::UserAgentBrandVersionType::kFullVersion);
-  std::string brand_list_diff = metadata.SerializeBrandMajorVersionList();
-  // Make sure the lists are different for different seeds
+
+  // Make sure the lists are different for different seeds (84 vs 85).
   // 1. verify major version
+  std::string brand_list_diff = metadata.SerializeBrandMajorVersionList();
   EXPECT_EQ(R"("Chromium";v="85", ")Not?A_Brand";v="99")", brand_list_diff);
   EXPECT_NE(brand_list, brand_list_diff);
   // 2.verify full version
@@ -651,25 +660,10 @@
   EXPECT_EQ(R"("Chromium";v="85.0.0.0", ")Not?A_Brand";v="99.0.0.0")",
             brand_list_diff_w_fv);
   EXPECT_NE(brand_list_w_fv, brand_list_diff_w_fv);
+}
 
-  metadata.brand_version_list = GenerateBrandVersionList(
-      84, "Totally A Brand", "84", absl::nullopt, absl::nullopt, true,
-      blink::UserAgentBrandVersionType::kMajorVersion);
-  metadata.brand_full_version_list = GenerateBrandVersionList(
-      84, "Totally A Brand", "84.0.0.0", absl::nullopt, absl::nullopt, true,
-      blink::UserAgentBrandVersionType::kFullVersion);
-  // 1. verify major version
-  std::string brand_list_w_brand = metadata.SerializeBrandMajorVersionList();
-  EXPECT_EQ(
-      R"("/Not=A?Brand";v="8", "Chromium";v="84", "Totally A Brand";v="84")",
-      brand_list_w_brand);
-  // 2. verify full version
-  std::string brand_list_w_brand_fv = metadata.SerializeBrandFullVersionList();
-  EXPECT_EQ(base::StrCat({"\"/Not=A?Brand\";v=\"8.0.0.0\", ",
-                          "\"Chromium\";v=\"84.0.0.0\", ",
-                          "\"Totally A Brand\";v=\"84.0.0.0\""}),
-            brand_list_w_brand_fv);
-
+TEST_F(UserAgentUtilsTest, GenerateBrandVersionListWithGreaseBrandOverride) {
+  blink::UserAgentMetadata metadata;
   // The GREASE generation algorithm should respond to experiment overrides.
   metadata.brand_version_list = GenerateBrandVersionList(
       84, absl::nullopt, "84", "Clean GREASE", absl::nullopt, true,
@@ -687,6 +681,11 @@
       metadata.SerializeBrandFullVersionList();
   EXPECT_EQ(R"("Clean GREASE";v="8.0.0.0", "Chromium";v="84.0.0.0")",
             brand_list_grease_override_fv);
+}
+
+TEST_F(UserAgentUtilsTest,
+       GenerateBrandVersionListWithGreaseBrandAndVersionOverride) {
+  blink::UserAgentMetadata metadata;
 
   metadata.brand_version_list = GenerateBrandVersionList(
       84, absl::nullopt, "84", "Clean GREASE", "1024", true,
@@ -704,6 +703,10 @@
       metadata.SerializeBrandFullVersionList();
   EXPECT_EQ(R"("Clean GREASE";v="1024.0.0.0", "Chromium";v="84.0.0.0")",
             brand_list_and_version_grease_override_fv);
+}
+
+TEST_F(UserAgentUtilsTest, GenerateBrandVersionListWithGreaseVersionOverride) {
+  blink::UserAgentMetadata metadata;
 
   metadata.brand_version_list = GenerateBrandVersionList(
       84, absl::nullopt, "84", absl::nullopt, "1024", true,
@@ -721,7 +724,30 @@
       metadata.SerializeBrandFullVersionList();
   EXPECT_EQ(R"("/Not=A?Brand";v="1024.0.0.0", "Chromium";v="84.0.0.0")",
             brand_version_grease_override_fv);
+}
 
+TEST_F(UserAgentUtilsTest, GenerateBrandVersionListWithBrand) {
+  blink::UserAgentMetadata metadata;
+  metadata.brand_version_list = GenerateBrandVersionList(
+      84, "Totally A Brand", "84", absl::nullopt, absl::nullopt, true,
+      blink::UserAgentBrandVersionType::kMajorVersion);
+  metadata.brand_full_version_list = GenerateBrandVersionList(
+      84, "Totally A Brand", "84.0.0.0", absl::nullopt, absl::nullopt, true,
+      blink::UserAgentBrandVersionType::kFullVersion);
+  // 1. verify major version
+  std::string brand_list_w_brand = metadata.SerializeBrandMajorVersionList();
+  EXPECT_EQ(
+      R"("/Not=A?Brand";v="8", "Chromium";v="84", "Totally A Brand";v="84")",
+      brand_list_w_brand);
+  // 2. verify full version
+  std::string brand_list_w_brand_fv = metadata.SerializeBrandFullVersionList();
+  EXPECT_EQ(base::StrCat({"\"/Not=A?Brand\";v=\"8.0.0.0\", ",
+                          "\"Chromium\";v=\"84.0.0.0\", ",
+                          "\"Totally A Brand\";v=\"84.0.0.0\""}),
+            brand_list_w_brand_fv);
+}
+
+TEST_F(UserAgentUtilsTest, GenerateBrandVersionListInvalidSeed) {
   // Should DCHECK on negative numbers
   EXPECT_DCHECK_DEATH(GenerateBrandVersionList(
       -1, absl::nullopt, "99", absl::nullopt, absl::nullopt, true,
@@ -731,9 +757,9 @@
       blink::UserAgentBrandVersionType::kFullVersion));
 }
 
-TEST_F(UserAgentUtilsTest, GetGreasedUserAgentBrandVersion) {
+TEST_F(UserAgentUtilsTest, GetGreasedUserAgentBrandVersionOldAlgorithm) {
   base::test::ScopedFeatureList scoped_feature_list;
-  // Test to ensure the old algorithm is respected when the flag is not set.
+  // Test to ensure the old algorithm is respected when opted into.
   scoped_feature_list.InitAndEnableFeatureWithParameters(
       features::kGreaseUACH, {{"updated_algorithm", "false"}});
 
@@ -749,10 +775,18 @@
       blink::UserAgentBrandVersionType::kFullVersion);
   EXPECT_EQ(greased_bv.brand, " Not A;Brand");
   EXPECT_EQ(greased_bv.version, "99.0.0.0");
+}
 
+TEST_F(UserAgentUtilsTest,
+       GetGreasedUserAgentBrandVersionOldAlgorithmIgnoresBrandOverrides) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  // Test to ensure the old algorithm is respected when the flag is not set.
+  scoped_feature_list.InitAndEnableFeatureWithParameters(
+      features::kGreaseUACH, {{"updated_algorithm", "false"}});
   // With the new algorithm disabled, we want to avoid experiment params
   // ("WhatIsGrease", 1024) from taking an effect.
-  greased_bv = GetGreasedUserAgentBrandVersion(
+  std::vector<int> permuted_order{0, 1, 2};
+  blink::UserAgentBrandVersion greased_bv = GetGreasedUserAgentBrandVersion(
       permuted_order, 84, "WhatIsGrease", absl::nullopt, true,
       blink::UserAgentBrandVersionType::kMajorVersion);
   EXPECT_EQ(greased_bv.brand, " Not A;Brand");
@@ -763,37 +797,57 @@
       blink::UserAgentBrandVersionType::kFullVersion);
   EXPECT_EQ(greased_bv.brand, " Not A;Brand");
   EXPECT_EQ(greased_bv.version, "99.0.0.0");
+}
 
-  greased_bv = GetGreasedUserAgentBrandVersion(
-      permuted_order, 84, absl::nullopt, "1024", true,
-      blink::UserAgentBrandVersionType::kMajorVersion);
-  EXPECT_EQ(greased_bv.brand, " Not A;Brand");
-  EXPECT_EQ(greased_bv.version, "99");
-
-  greased_bv = GetGreasedUserAgentBrandVersion(
-      permuted_order, 84, absl::nullopt, "1024", true,
-      blink::UserAgentBrandVersionType::kFullVersion);
-  EXPECT_EQ(greased_bv.brand, " Not A;Brand");
-  EXPECT_EQ(greased_bv.version, "99.0.0.0");
-
-  greased_bv = GetGreasedUserAgentBrandVersion(
-      permuted_order, 84, "WhatIsGrease", "1024", true,
-      blink::UserAgentBrandVersionType::kMajorVersion);
-  EXPECT_EQ(greased_bv.brand, " Not A;Brand");
-  EXPECT_EQ(greased_bv.version, "99");
-
-  greased_bv = GetGreasedUserAgentBrandVersion(
-      permuted_order, 84, "WhatIsGrease", "1024", true,
-      blink::UserAgentBrandVersionType::kFullVersion);
-  EXPECT_EQ(greased_bv.brand, " Not A;Brand");
-  EXPECT_EQ(greased_bv.version, "99.0.0.0");
-
-  // Test to ensure the new algorithm works and is still overridable.
-  scoped_feature_list.Reset();
+TEST_F(UserAgentUtilsTest,
+       GetGreasedUserAgentBrandVersionOldAlgorithmIgnoresVersionOverrides) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  // Test to ensure the old algorithm is respected when the flag is not set.
   scoped_feature_list.InitAndEnableFeatureWithParameters(
-      features::kGreaseUACH, {{"updated_algorithm", "true"}});
+      features::kGreaseUACH, {{"updated_algorithm", "false"}});
+  // With the new algorithm disabled, we want to avoid experiment params
+  // ("WhatIsGrease", 1024) from taking an effect.
+  std::vector<int> permuted_order{0, 1, 2};
+  blink::UserAgentBrandVersion greased_bv = GetGreasedUserAgentBrandVersion(
+      permuted_order, 84, absl::nullopt, "1024", true,
+      blink::UserAgentBrandVersionType::kMajorVersion);
+  EXPECT_EQ(greased_bv.brand, " Not A;Brand");
+  EXPECT_EQ(greased_bv.version, "99");
 
   greased_bv = GetGreasedUserAgentBrandVersion(
+      permuted_order, 84, absl::nullopt, "1024", true,
+      blink::UserAgentBrandVersionType::kFullVersion);
+  EXPECT_EQ(greased_bv.brand, " Not A;Brand");
+  EXPECT_EQ(greased_bv.version, "99.0.0.0");
+}
+
+TEST_F(
+    UserAgentUtilsTest,
+    GetGreasedUserAgentBrandVersionOldAlgorithmIgnoresBrandAndVersionOverrides) {
+  base::test::ScopedFeatureList scoped_feature_list;
+  // Test to ensure the old algorithm is respected when the flag is not set.
+  scoped_feature_list.InitAndEnableFeatureWithParameters(
+      features::kGreaseUACH, {{"updated_algorithm", "false"}});
+  // With the new algorithm disabled, we want to avoid experiment params
+  // ("WhatIsGrease", 1024) from taking an effect.
+  std::vector<int> permuted_order{0, 1, 2};
+  blink::UserAgentBrandVersion greased_bv = GetGreasedUserAgentBrandVersion(
+      permuted_order, 84, "WhatIsGrease", "1024", true,
+      blink::UserAgentBrandVersionType::kMajorVersion);
+  EXPECT_EQ(greased_bv.brand, " Not A;Brand");
+  EXPECT_EQ(greased_bv.version, "99");
+
+  greased_bv = GetGreasedUserAgentBrandVersion(
+      permuted_order, 84, "WhatIsGrease", "1024", true,
+      blink::UserAgentBrandVersionType::kFullVersion);
+  EXPECT_EQ(greased_bv.brand, " Not A;Brand");
+  EXPECT_EQ(greased_bv.version, "99.0.0.0");
+}
+
+// Tests to ensure the new algorithm works and is still overridable.
+TEST_F(UserAgentUtilsTest, GetGreasedUserAgentBrandVersionNewAlgorithm) {
+  std::vector<int> permuted_order{0, 1, 2};
+  blink::UserAgentBrandVersion greased_bv = GetGreasedUserAgentBrandVersion(
       permuted_order, 84, absl::nullopt, absl::nullopt, true,
       blink::UserAgentBrandVersionType::kMajorVersion);
   EXPECT_EQ(greased_bv.brand, "/Not=A?Brand");
@@ -804,8 +858,12 @@
       blink::UserAgentBrandVersionType::kFullVersion);
   EXPECT_EQ(greased_bv.brand, "/Not=A?Brand");
   EXPECT_EQ(greased_bv.version, "8.0.0.0");
+}
 
-  greased_bv = GetGreasedUserAgentBrandVersion(
+TEST_F(UserAgentUtilsTest,
+       GetGreasedUserAgentBrandVersionNewAlgorithmBrandOverride) {
+  std::vector<int> permuted_order{0, 1, 2};
+  blink::UserAgentBrandVersion greased_bv = GetGreasedUserAgentBrandVersion(
       permuted_order, 84, "WhatIsGrease", absl::nullopt, true,
       blink::UserAgentBrandVersionType::kMajorVersion);
   EXPECT_EQ(greased_bv.brand, "WhatIsGrease");
@@ -816,8 +874,12 @@
       blink::UserAgentBrandVersionType::kFullVersion);
   EXPECT_EQ(greased_bv.brand, "WhatIsGrease");
   EXPECT_EQ(greased_bv.version, "8.0.0.0");
+}
 
-  greased_bv = GetGreasedUserAgentBrandVersion(
+TEST_F(UserAgentUtilsTest,
+       GetGreasedUserAgentBrandVersionNewAlgorithmVersionOverride) {
+  std::vector<int> permuted_order{0, 1, 2};
+  blink::UserAgentBrandVersion greased_bv = GetGreasedUserAgentBrandVersion(
       permuted_order, 84, absl::nullopt, "1024", true,
       blink::UserAgentBrandVersionType::kMajorVersion);
   EXPECT_EQ(greased_bv.brand, "/Not=A?Brand");
@@ -828,8 +890,12 @@
       blink::UserAgentBrandVersionType::kFullVersion);
   EXPECT_EQ(greased_bv.brand, "/Not=A?Brand");
   EXPECT_EQ(greased_bv.version, "1024.0.0.0");
+}
 
-  greased_bv = GetGreasedUserAgentBrandVersion(
+TEST_F(UserAgentUtilsTest,
+       GetGreasedUserAgentBrandVersionNewAlgorithmBrandAndVersionOverride) {
+  std::vector<int> permuted_order{0, 1, 2};
+  blink::UserAgentBrandVersion greased_bv = GetGreasedUserAgentBrandVersion(
       permuted_order, 84, "WhatIsGrease", "1024", true,
       blink::UserAgentBrandVersionType::kMajorVersion);
   EXPECT_EQ(greased_bv.brand, "WhatIsGrease");
@@ -840,9 +906,11 @@
       blink::UserAgentBrandVersionType::kFullVersion);
   EXPECT_EQ(greased_bv.brand, "WhatIsGrease");
   EXPECT_EQ(greased_bv.version, "1024.0.0.0");
+}
 
-  permuted_order = {2, 1, 0};
-  greased_bv = GetGreasedUserAgentBrandVersion(
+TEST_F(UserAgentUtilsTest, GetGreasedUserAgentBrandVersionFullVersions) {
+  std::vector<int> permuted_order = {2, 1, 0};
+  blink::UserAgentBrandVersion greased_bv = GetGreasedUserAgentBrandVersion(
       permuted_order, 86, absl::nullopt, absl::nullopt, true,
       blink::UserAgentBrandVersionType::kMajorVersion);
   EXPECT_EQ(greased_bv.brand, ";Not_A Brand");
@@ -866,11 +934,13 @@
       blink::UserAgentBrandVersionType::kFullVersion);
   EXPECT_EQ(greased_bv.brand, "/Not=A?Brand");
   EXPECT_EQ(greased_bv.version, "1024.0.0.0");
+}
 
-  // Ensure the enterprise override bool takes precedence over the command line
-  // flag
-  permuted_order = {0, 1, 2};
-  greased_bv = GetGreasedUserAgentBrandVersion(
+TEST_F(UserAgentUtilsTest, GetGreasedUserAgentBrandVersionEnterpriseOverride) {
+  // Ensure the enterprise override bool can force the old GREASE algorithm to
+  // be used.
+  std::vector<int> permuted_order = {0, 1, 2};
+  blink::UserAgentBrandVersion greased_bv = GetGreasedUserAgentBrandVersion(
       permuted_order, 84, absl::nullopt, absl::nullopt, false,
       blink::UserAgentBrandVersionType::kMajorVersion);
   EXPECT_EQ(greased_bv.brand, " Not A;Brand");
@@ -881,7 +951,30 @@
       blink::UserAgentBrandVersionType::kFullVersion);
   EXPECT_EQ(greased_bv.brand, " Not A;Brand");
   EXPECT_EQ(greased_bv.version, "99.0.0.0");
+}
 
+TEST_F(
+    UserAgentUtilsTest,
+    GetGreasedUserAgentBrandVersionEnterpriseOverrideSupersedesOtherOverrides) {
+  // Ensure the enterprise override bool can force the old GREASE algorithm to
+  // be used and supersedes passed-in brand/version overrides.
+  std::vector<int> permuted_order = {0, 1, 2};
+  blink::UserAgentBrandVersion greased_bv = GetGreasedUserAgentBrandVersion(
+      permuted_order, 84, "helloWorld", "100000", false,
+      blink::UserAgentBrandVersionType::kMajorVersion);
+  EXPECT_EQ(greased_bv.brand, " Not A;Brand");
+  EXPECT_EQ(greased_bv.version, "99");
+
+  greased_bv = GetGreasedUserAgentBrandVersion(
+      permuted_order, 84, "helloWorld", "100000", false,
+      blink::UserAgentBrandVersionType::kFullVersion);
+  EXPECT_EQ(greased_bv.brand, " Not A;Brand");
+  EXPECT_EQ(greased_bv.version, "99.0.0.0");
+}
+
+TEST_F(UserAgentUtilsTest, GetGreasedUserAgentBrandVersionNoLeadingWhitespace) {
+  std::vector<int> permuted_order = {0, 1, 2};
+  blink::UserAgentBrandVersion greased_bv;
   // Go up to 110 based on the 11 total chars * 10 possible first chars.
   for (int i = 0; i < 110; i++) {
     // Regardless of the major version seed, the spec calls for no leading
diff --git a/components/history/core/browser/OWNERS b/components/history/core/browser/OWNERS
new file mode 100644
index 0000000..a3afacdb
--- /dev/null
+++ b/components/history/core/browser/OWNERS
@@ -0,0 +1,3 @@
+# This is for the common case of adding or renaming files. If you're doing
+# structural changes, use usual OWNERS rules.
+per-file BUILD.gn=*
diff --git a/components/viz/test/test_gles2_interface.cc b/components/viz/test/test_gles2_interface.cc
index 7ea3e529..e31685a 100644
--- a/components/viz/test/test_gles2_interface.cc
+++ b/components/viz/test/test_gles2_interface.cc
@@ -275,27 +275,6 @@
   }
 }
 
-GLuint TestGLES2Interface::CreateImageCHROMIUM(ClientBuffer buffer,
-                                               GLsizei width,
-                                               GLsizei height,
-                                               GLenum internalformat) {
-  DCHECK(internalformat == GL_RGB || internalformat == GL_RGBA ||
-         (test_capabilities_.texture_format_bgra8888 &&
-          internalformat == GL_BGRA_EXT));
-  GLuint image_id = NextImageId();
-  images_.insert(image_id);
-  return image_id;
-}
-
-void TestGLES2Interface::DestroyImageCHROMIUM(GLuint image_id) {
-  RetireImageId(image_id);
-  if (!images_.count(image_id)) {
-    ADD_FAILURE() << "destroyImageCHROMIUM called on unknown image "
-                  << image_id;
-  }
-  images_.erase(image_id);
-}
-
 void* TestGLES2Interface::MapBufferCHROMIUM(GLuint target, GLenum access) {
   DCHECK_GT(bound_buffer_.count(target), 0u);
   DCHECK_GT(buffers_.count(bound_buffer_[target]), 0u);
diff --git a/components/viz/test/test_gles2_interface.h b/components/viz/test/test_gles2_interface.h
index af21b1f..d927b0d 100644
--- a/components/viz/test/test_gles2_interface.h
+++ b/components/viz/test/test_gles2_interface.h
@@ -73,12 +73,6 @@
 
   void PixelStorei(GLenum pname, GLint param) override;
 
-  GLuint CreateImageCHROMIUM(ClientBuffer buffer,
-                             GLsizei width,
-                             GLsizei height,
-                             GLenum internalformat) override;
-  void DestroyImageCHROMIUM(GLuint image_id) override;
-
   void* MapBufferCHROMIUM(GLuint target, GLenum access) override;
   GLboolean UnmapBufferCHROMIUM(GLuint target) override;
   void BufferData(GLenum target,
@@ -242,7 +236,6 @@
   unsigned next_texture_id_ = 1;
   unsigned next_renderbuffer_id_ = 1;
   std::unordered_map<unsigned, std::unique_ptr<Buffer>> buffers_;
-  std::unordered_set<unsigned> images_;
   std::unordered_set<unsigned> textures_;
   std::unordered_set<unsigned> renderbuffer_set_;
 
diff --git a/content/browser/attribution_reporting/attribution_src_browsertest.cc b/content/browser/attribution_reporting/attribution_src_browsertest.cc
index b5cc736..a63fa80 100644
--- a/content/browser/attribution_reporting/attribution_src_browsertest.cc
+++ b/content/browser/attribution_reporting/attribution_src_browsertest.cc
@@ -234,6 +234,44 @@
   // AttributionsBrowserTest.
 }
 
+// See crbug.com/1322450
+IN_PROC_BROWSER_TEST_F(AttributionSrcBrowserTest,
+                       AttributionSrcWindowOpen_URLEncoded_SourceRegistered) {
+  // Create a separate server as we cannot register a `ControllableHttpResponse`
+  // after the server starts.
+  auto https_server = std::make_unique<net::EmbeddedTestServer>(
+      net::EmbeddedTestServer::TYPE_HTTPS);
+  https_server->SetSSLConfig(net::EmbeddedTestServer::CERT_TEST_NAMES);
+  https_server->ServeFilesFromSourceDirectory(
+      "content/test/data/attribution_reporting");
+
+  auto register_response =
+      std::make_unique<net::test_server::ControllableHttpResponse>(
+          https_server.get(), "/register_source?a=b&c=d");
+  ASSERT_TRUE(https_server->Start());
+
+  GURL page_url =
+      https_server->GetURL("b.test", "/page_with_impression_creator.html");
+  EXPECT_TRUE(NavigateToURL(web_contents(), page_url));
+
+  TestNavigationObserver observer(web_contents());
+
+  // This attributionsrc will only be handled properly if the value is
+  // URL-decoded before being passed to the attributionsrc loader.
+  EXPECT_TRUE(ExecJs(web_contents(), R"(
+  window.open("page_with_conversion_redirect.html", "_top",
+  "attributionsrc=register_source%3Fa%3Db%26c%3Dd");)"));
+
+  register_response->WaitForRequest();
+  register_response->Done();
+
+  // TODO(crbug.com/1322525): Remove this once we use a pure mock.
+  observer.Wait();
+
+  EXPECT_EQ(register_response->http_request()->relative_url,
+            "/register_source?a=b&c=d");
+}
+
 IN_PROC_BROWSER_TEST_F(
     AttributionSrcBrowserTest,
     AttributionSrcWindowOpenNoUserGesture_SourceNotRegistered) {
diff --git a/content/browser/renderer_host/back_forward_cache_impl.cc b/content/browser/renderer_host/back_forward_cache_impl.cc
index b153ce2..6e9e34c 100644
--- a/content/browser/renderer_host/back_forward_cache_impl.cc
+++ b/content/browser/renderer_host/back_forward_cache_impl.cc
@@ -308,7 +308,6 @@
     DCHECK(trigger);
     trigger->UpdateRequest(navigation_start, false /* destination_is_loaded */,
                            false /* show_reason_tab_switching */,
-                           false /* show_reason_unoccluded */,
                            true /* show_reason_bfcache_restore */);
   }
 }
diff --git a/content/browser/renderer_host/frame_tree_browsertest.cc b/content/browser/renderer_host/frame_tree_browsertest.cc
index a00d4de..a534c30 100644
--- a/content/browser/renderer_host/frame_tree_browsertest.cc
+++ b/content/browser/renderer_host/frame_tree_browsertest.cc
@@ -2334,8 +2334,8 @@
 // Tests successfully going back to a page with a fenced frame.
 IN_PROC_BROWSER_TEST_P(FencedFrameTreeBrowserTest,
                        GoBackToPageWithFencedFrame) {
-  GURL main_url(
-      https_server()->GetURL("a.test", "/fenced_frames/opaque_ads.html"));
+  GURL main_url(https_server()->GetURL(
+      "a.test", "/fenced_frames/basic_fenced_frame_src.html"));
   EXPECT_TRUE(NavigateToURL(shell(), main_url));
 
   // It is safe to obtain the root frame tree node here, as it doesn't change.
@@ -2371,7 +2371,7 @@
   // Navigate the fenced frame. It should do a replace navigation and therefore
   // the `controller().GetEntryCount()` stays at 1.
   GURL fenced_frame_url_2(
-      https_server()->GetURL("c.test", "/fenced_frames/title1.html"));
+      https_server()->GetURL("a.test", "/fenced_frames/title1.html"));
   std::string script = JsReplace("location.assign($1);", fenced_frame_url_2);
   UpdateHistoryOrReloadFromFencedFrameTreeAndWaitForFinishedLoad(fenced_frame,
                                                                  script);
@@ -2420,41 +2420,6 @@
     EXPECT_EQ(fenced_frame_url_1,
               fenced_frame->current_frame_host()->GetLastCommittedURL());
   }
-
-  // Reloading a page with a fenced frame should work. Ensure that the main
-  // navigation happens as well as the navigation within the fenced frame.
-  // A page with a fenced frame, when reloaded, will cause the fenced frame
-  // to navigate to its initial URL.
-  TestNavigationObserver reload_observer(web_contents());
-  EXPECT_TRUE(ExecJs(root, "window.location.reload();"));
-  reload_observer.Wait();
-  EXPECT_EQ(2, root->navigator().controller().GetEntryCount());
-  EXPECT_TRUE(reload_observer.last_navigation_succeeded());
-  fenced_frame = GetFencedFrameRootNode(root->child_at(0));
-  EXPECT_EQ(fenced_frame_url_1, fenced_frame->current_url());
-
-  // Now let's try to use unfencedTop and come back to the page with the fenced
-  // frame.
-  TestFrameNavigationObserver observer(root);
-  EXPECT_TRUE(ExecJs(fenced_frame, JsReplace("window.open($1, '_unfencedTop');",
-                                             new_main_url)));
-  observer.Wait();
-  EXPECT_EQ(2, root->navigator().controller().GetEntryCount());
-  EXPECT_EQ(new_main_url, root->current_frame_host()->GetLastCommittedURL());
-
-  // Go back.
-  {
-    TestNavigationObserver back_load_observer(shell()->web_contents());
-    EXPECT_TRUE(ExecJs(root, "history.back();"));
-    back_load_observer.Wait();
-  }
-  EXPECT_EQ(2, root->navigator().controller().GetEntryCount());
-  EXPECT_EQ(main_url, root->current_frame_host()->GetLastCommittedURL());
-  EXPECT_EQ(1U, root->child_count());
-  fenced_frame = GetFencedFrameRootNode(root->child_at(0));
-  EXPECT_TRUE(fenced_frame->IsFencedFrameRoot());
-  EXPECT_TRUE(fenced_frame->IsInFencedFrameTree());
-  EXPECT_EQ(fenced_frame_url_1, fenced_frame->current_url());
 }
 
 // Simulates the crash in crbug.com/1317642 by disabling BFCache and going back
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc
index a3eb862..dc52cc5 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -550,21 +550,8 @@
   DCHECK(host_->is_hidden());
   DCHECK_NE(visibility_, Visibility::VISIBLE);
 
-  const Visibility old_visibility = visibility_;
   visibility_ = Visibility::VISIBLE;
 
-  if (old_visibility == Visibility::OCCLUDED) {
-    // Add an unocclusion timing request. If `tab_switch_start_state` is null,
-    // this will return the new request unchanged.
-    tab_switch_start_state = VisibleTimeRequestTrigger::ConsumeAndMergeRequests(
-        std::move(tab_switch_start_state),
-        blink::mojom::RecordContentToVisibleTimeRequest::New(
-            base::TimeTicks::Now(), false /* destination_is_loaded */,
-            false /* show_reason_tab_switching */,
-            true /* show_reason_unoccluded */,
-            false /* show_reason_bfcache_restore */));
-  }
-
   bool has_saved_frame = delegated_frame_host_->HasSavedFrame();
 
   bool show_reason_bfcache_restore =
diff --git a/content/browser/renderer_host/render_widget_host_view_browsertest.cc b/content/browser/renderer_host/render_widget_host_view_browsertest.cc
index 491168d..9206c717 100644
--- a/content/browser/renderer_host/render_widget_host_view_browsertest.cc
+++ b/content/browser/renderer_host/render_widget_host_view_browsertest.cc
@@ -1066,7 +1066,6 @@
     request_trigger->UpdateRequest(base::TimeTicks::Now(),
                                    /*destination_is_loaded=*/true,
                                    /*show_reason_tab_switching=*/true,
-                                   /*show_reason_unoccluded=*/false,
                                    /*show_reason_bfcache_restore=*/false);
   }
 
diff --git a/content/browser/renderer_host/render_widget_host_view_child_frame_browsertest.cc b/content/browser/renderer_host/render_widget_host_view_child_frame_browsertest.cc
index 9636056..522dd24b 100644
--- a/content/browser/renderer_host/render_widget_host_view_child_frame_browsertest.cc
+++ b/content/browser/renderer_host/render_widget_host_view_child_frame_browsertest.cc
@@ -413,7 +413,6 @@
             base::TimeTicks::Now(),
             /* destination_is_loaded */ true,
             /* show_reason_tab_switching */ true,
-            /* show_reason_unoccluded */ false,
             /* show_reason_bfcache_restore */ false));
     // Force the child to submit a new frame.
     return ExecJs(root->child_at(0)->current_frame_host(),
diff --git a/content/browser/renderer_host/visible_time_request_trigger.cc b/content/browser/renderer_host/visible_time_request_trigger.cc
index 21e6f86..f4496dc 100644
--- a/content/browser/renderer_host/visible_time_request_trigger.cc
+++ b/content/browser/renderer_host/visible_time_request_trigger.cc
@@ -44,7 +44,6 @@
         std::min(to->event_start_time, from->event_start_time);
     to->destination_is_loaded |= from->destination_is_loaded;
     to->show_reason_tab_switching |= from->show_reason_tab_switching;
-    to->show_reason_unoccluded |= from->show_reason_unoccluded;
     to->show_reason_bfcache_restore |= from->show_reason_bfcache_restore;
   }
   return to;
@@ -54,11 +53,10 @@
     base::TimeTicks start_time,
     bool destination_is_loaded,
     bool show_reason_tab_switching,
-    bool show_reason_unoccluded,
     bool show_reason_bfcache_restore) {
   auto new_request = blink::mojom::RecordContentToVisibleTimeRequest::New(
       start_time, destination_is_loaded, show_reason_tab_switching,
-      show_reason_unoccluded, show_reason_bfcache_restore);
+      show_reason_bfcache_restore);
   // If `last_request_` is null, this will return `new_request` unchanged.
   last_request_ =
       ConsumeAndMergeRequests(std::move(last_request_), std::move(new_request));
diff --git a/content/browser/renderer_host/visible_time_request_trigger.h b/content/browser/renderer_host/visible_time_request_trigger.h
index c6d776b..278b702 100644
--- a/content/browser/renderer_host/visible_time_request_trigger.h
+++ b/content/browser/renderer_host/visible_time_request_trigger.h
@@ -56,14 +56,11 @@
   //   contents. It is only used when |show_reason_tab_switching| is true.
   // |show_reason_tab_switching| is true when tab switch event should be
   //   reported.
-  // |show_reason_unoccluded| is true when "unoccluded" event should be
-  //   reported.
   // |show_reason_bfcache_restore| is true when page restored from bfcache event
   //   should be reported.
   void UpdateRequest(base::TimeTicks start_time,
                      bool destination_is_loaded,
                      bool show_reason_tab_switching,
-                     bool show_reason_unoccluded,
                      bool show_reason_bfcache_restore);
 
   // Returns the time set by UpdateRequest. If this was not preceded by a call
diff --git a/content/browser/renderer_host/visible_time_request_trigger_unittest.cc b/content/browser/renderer_host/visible_time_request_trigger_unittest.cc
index 08e4b97..94ae9df 100644
--- a/content/browser/renderer_host/visible_time_request_trigger_unittest.cc
+++ b/content/browser/renderer_host/visible_time_request_trigger_unittest.cc
@@ -27,7 +27,6 @@
   enum class RequestField {
     kDestinationIsLoaded,
     kShowReasonTabSwitching,
-    kShowReasonUnOccluded,
     kShowReasonBFCacheRestore,
   };
   using RequestFieldSet =
@@ -53,7 +52,6 @@
         StartTimeFromDelta(start_time),
         enabled_fields.Has(RequestField::kDestinationIsLoaded),
         enabled_fields.Has(RequestField::kShowReasonTabSwitching),
-        enabled_fields.Has(RequestField::kShowReasonUnOccluded),
         enabled_fields.Has(RequestField::kShowReasonBFCacheRestore));
   }
 
@@ -66,7 +64,6 @@
     EXPECT_EQ(request->destination_is_loaded, expected.destination_is_loaded);
     EXPECT_EQ(request->show_reason_tab_switching,
               expected.show_reason_tab_switching);
-    EXPECT_EQ(request->show_reason_unoccluded, expected.show_reason_unoccluded);
     EXPECT_EQ(request->show_reason_bfcache_restore,
               expected.show_reason_bfcache_restore);
   }
@@ -200,7 +197,6 @@
     trigger.UpdateRequest(StartTimeFromDelta(base::Seconds(1)),
                           /*destination_is_loaded=*/false,
                           /*show_reason_tab_switching=*/true,
-                          /*show_reason_unoccluded=*/false,
                           /*show_reason_bfcache_restore=*/false);
     ExpectEqualRequests(trigger.TakeRequest(), *expected);
     EXPECT_TRUE(trigger.TakeRequest().is_null());
@@ -216,12 +212,10 @@
     trigger.UpdateRequest(StartTimeFromDelta(base::Seconds(2)),
                           /*destination_is_loaded=*/true,
                           /*show_reason_tab_switching=*/true,
-                          /*show_reason_unoccluded=*/false,
                           /*show_reason_bfcache_restore=*/false);
     trigger.UpdateRequest(StartTimeFromDelta(base::Seconds(3)),
                           /*destination_is_loaded=*/false,
                           /*show_reason_tab_switching=*/false,
-                          /*show_reason_unoccluded=*/false,
                           /*show_reason_bfcache_restore=*/true);
     ExpectEqualRequests(trigger.TakeRequest(), *expected);
     EXPECT_TRUE(trigger.TakeRequest().is_null());
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc
index c18ec94..955e757 100644
--- a/content/browser/web_contents/web_contents_impl.cc
+++ b/content/browser/web_contents/web_contents_impl.cc
@@ -9375,7 +9375,6 @@
     return;
   trigger->UpdateRequest(start_time, destination_is_loaded,
                          /*show_reason_tab_switching=*/true,
-                         /*show_reason_unoccluded=*/false,
                          /*show_reason_bfcache_restore=*/false);
 }
 
diff --git a/content/test/data/accessibility/event/aria-combo-box-expand-expected-win.txt b/content/test/data/accessibility/event/aria-combo-box-expand-expected-win.txt
index 5db16f2..4de1892 100644
--- a/content/test/data/accessibility/event/aria-combo-box-expand-expected-win.txt
+++ b/content/test/data/accessibility/event/aria-combo-box-expand-expected-win.txt
@@ -1,6 +1,4 @@
 EVENT_OBJECT_FOCUS on <input> role=ROLE_SYSTEM_COMBOBOX FOCUSED,COLLAPSED,FOCUSABLE,HASPOPUP IA2_STATE_EDITABLE,IA2_STATE_SELECTABLE_TEXT,IA2_STATE_SINGLE_LINE,IA2_STATE_SUPPORTS_AUTOCOMPLETION
-EVENT_OBJECT_LOCATIONCHANGE role=ROLE_SYSTEM_CARET  window_class=Chrome_WidgetWin_0
-EVENT_OBJECT_SHOW role=ROLE_SYSTEM_CARET  window_class=Chrome_WidgetWin_0
 IA2_EVENT_TEXT_CARET_MOVED on <input> role=ROLE_SYSTEM_COMBOBOX FOCUSED,COLLAPSED,FOCUSABLE,HASPOPUP IA2_STATE_EDITABLE,IA2_STATE_SELECTABLE_TEXT,IA2_STATE_SINGLE_LINE,IA2_STATE_SUPPORTS_AUTOCOMPLETION
 === Start Continuation ===
 EVENT_OBJECT_STATECHANGE on <input> role=ROLE_SYSTEM_COMBOBOX FOCUSED,EXPANDED,FOCUSABLE,HASPOPUP IA2_STATE_EDITABLE,IA2_STATE_SELECTABLE_TEXT,IA2_STATE_SINGLE_LINE,IA2_STATE_SUPPORTS_AUTOCOMPLETION
diff --git a/content/test/data/accessibility/event/aria-combo-box-expand.html b/content/test/data/accessibility/event/aria-combo-box-expand.html
index 9623859..23b4a98 100644
--- a/content/test/data/accessibility/event/aria-combo-box-expand.html
+++ b/content/test/data/accessibility/event/aria-combo-box-expand.html
@@ -1,3 +1,8 @@
+<!--
+Unflake the test for IA2 which may or may not include these events for ROLE_SYSTEM_CARET
+@WIN-DENY:EVENT_OBJECT_LOCATIONCHANGE*
+@WIN-DENY:EVENT_OBJECT_SHOW*
+-->
 <!DOCTYPE html>
 <html>
 <body>
diff --git a/content/test/data/fenced_frames/opaque_ads.html b/content/test/data/fenced_frames/opaque_ads.html
index baac518e..1f365a7 100644
--- a/content/test/data/fenced_frames/opaque_ads.html
+++ b/content/test/data/fenced_frames/opaque_ads.html
@@ -1,6 +1,6 @@
 <!DOCTYPE html>
 <html>
 <body>
-  <fencedframe mode=opaque-ads src="title1.html"></fencedframe>
+  <fencedframe mode=opaque-ads></fencedframe>
 </body>
 </html>
diff --git a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_image.txt b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_image.txt
deleted file mode 100644
index 0d6a4c4..0000000
--- a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_image.txt
+++ /dev/null
@@ -1,132 +0,0 @@
-Name
-
-    CHROMIUM_image
-
-Name Strings
-
-    GL_CHROMIUM_image
-
-Version
-
-    Last Modifed Date: May 13, 2015
-
-Dependencies
-
-    OpenGL ES 2.0 is required.
-
-    EXT_texture_format_BGRA8888 affects the definition of this extension.
-    ARB_texture_rg affects the definition of this extension.
-
-Overview
-
-    This extension defines a new resource type that is suitable for
-    sharing 2D arrays of image data between client APIs.
-
-Issues
-
-    None
-
-New Tokens
-
-    None
-
-New Procedures and Functions
-
-  GLuint CreateImageCHROMIUM(ClientBuffer buffer,
-                             GLsizei width,
-                             GLsizei height,
-                             GLenum internalformat)
-
-    Create an image from <buffer> with width equal to <width> and
-    height equal to <height> and format equal to <internalformat>.
-
-    Returns a unique identifier for the image that could be used in
-    subsequent operations.
-
-    INVALID_VALUE is generated if <width> or <height> is nonpositive.
-
-    INVALID_VALUE is generated if <internalformat> is not one of
-    RED, RGB, RGBA, BGRA_EXT, ATC_RGB_AMD, ATC_RGBA_INTERPOLATED_ALPHA_AMD,
-    COMPRESSED_RGB_S3TC_DXT1_EXT, COMPRESSED_RGBA_S3TC_DXT5_EXT or
-    ETC1_RGB8_OES.
-
-  void DestroyImageCHROMIUM(GLuint image_id)
-
-    Frees the image previously created by a call to CreateImageCHROMIUM.
-
-    INVALID_OPERATION is generated if <image_id> is not a valid image id.
-
-  void BindTexImage2DCHROMIUM(GLenum target, GLint image_id)
-
-    Binds the texture object currently bound to <target> to the image
-    <image_id> previously created by a call to CreateImageCHROMIUM.
-
-    INVALID_OPERATION is generated if no texture is bound to <target>.
-
-    INVALID_OPERATION is generated if <image_id> is not a valid image id.
-
-  void BindTexImage2DWithInternalformatCHROMIUM(GLenum target,
-                                                GLenum internalformat,
-                                                GLint image_id)
-
-    Behaves exactly like BindTexImage2DCHROMIUM, but forces the
-    texture to use the specified <internalformat> rather than the
-    default one. This function is provided solely as a workaround for
-    driver bugs on some platforms. BindTexImage2DCHROMIUM should be
-    used by almost all users.
-
-  void ReleaseTexImage2DCHROMIUM(GLenum target, GLint image_id)
-
-    Unbinds the texture object bound to <target> from the image
-    <image_id> previously created by a call to CreateImageCHROMIUM. If
-    the texture is not currently bound to the image, has no effect,
-    though may still generate errors.
-
-    INVALID_OPERATION is generated if no texture is bound to <target>.
-
-    INVALID_OPERATION is generated if <image_id> is not a valid image id.
-
-Dependencies on EXT_texture_format_BGRA8888
-
-    If EXT_texture_format_BGRA8888 is not supported:
-     * delete any reference to the BGRA_EXT format.
-
-Dependencies on ARB_texture_rg
-
-    If ARB_texture_rg is not supported:
-     * delete any reference to the RED format.
-
-Dependencies on AMD_compressed_ATC_texture
-
-    If AMD_compressed_ATC_texture is not supported:
-     * delete any reference to the ATC_RGB_AMD and
-       ATC_RGBA_INTERPOLATED_ALPHA_AMD formats.
-
-Dependencies on EXT_texture_compression_s3tc
-
-    If EXT_texture_compression_s3tc is not supported:
-     * delete any reference to the COMPRESSED_RGB_S3TC_DXT1_EXT and
-       COMPRESSED_RGBA_S3TC_DXT5_EXT formats.
-
-Dependencies on OES_compressed_ETC1_RGB8_texture
-
-    If OES_compressed_ETC1_RGB8_texture is not supported:
-     * delete any reference to the ETC1_RGB8_OES format.
-
-Errors
-
-    None.
-
-New State
-
-    None.
-
-Revision History
-
-    5/9/2013    Documented the extension
-    4/30/2014   Moved usage flag to creation function.
-    10/7/2014   Remove map/unmap API.
-    4/6/2015    Add BGRA_EXT format.
-    2/7/2015    Add R8 format.
-    5/13/2015   Add compressed formats.
-    11/5/2015   Change R8 format to RED.
diff --git a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_ycbcr_420v_image.txt b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_ycbcr_420v_image.txt
index db0957b6..be3525f 100644
--- a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_ycbcr_420v_image.txt
+++ b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_ycbcr_420v_image.txt
@@ -8,22 +8,17 @@
 
 Version
 
-    Last Modifed Date: October 26, 2015
+    Last Modified Date: May 3, 2022
 
 Dependencies
 
     OpenGL ES 2.0 is required.
 
-    GL_CHROMIUM_image is required.
-
 Overview
 
     This extension provides a new internal image format to use when creating an
     image from underlying '420v' buffers.
 
-    This extension is useful in conjunction with CreateImageCHROMIUM to define
-    the format of GpuMemoryBuffer backing the image.
-
 New Procedures and Functions
 
     None.
@@ -34,7 +29,7 @@
 
 New Tokens
 
-    Accepted by the <internalformat> parameter of CreateImageCHROMIUM.
+    GL_RGB_YCBCR_420V_CHROMIUM    0x78FC
 
 New State
 
@@ -43,3 +38,4 @@
 Revision History
 
     10/26/2015   Documented the extension
+    5/3/2022     Removed references to GL_CHROMIUM_image.
diff --git a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_ycbcr_422_image.txt b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_ycbcr_422_image.txt
index 2ab489b..23fddfb5 100644
--- a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_ycbcr_422_image.txt
+++ b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_ycbcr_422_image.txt
@@ -8,21 +8,16 @@
 
 Version
 
-    Last Modifed Date: August 26, 2015
+    Last Modified Date: May 3, 2022
 
 Dependencies
 
     OpenGL ES 2.0 is required.
 
-    GL_CHROMIUM_image is required.
-
 Overview
 
-    This extension provides a new internal image format to use when creating an 
-    image from underlying '2vuy' buffers. 
-
-    This extension is useful in conjunction with CreateImageCHROMIUM to define
-    the format of GpuMemoryBuffer backing the image.
+    This extension provides a new internal image format to use when creating an
+    image from underlying '2vuy' buffers.
 
 New Procedures and Functions
 
@@ -33,8 +28,8 @@
     None.
 
 New Tokens
-    
-    Accepted by the <internalformat> parameter of CreateImageCHROMIUM.
+
+    GL_RGB_YCBCR_422_CHROMIUM    0x78FB
 
 New State
 
@@ -43,3 +38,4 @@
 Revision History
 
     8/26/2015   Documented the extension
+    5/3/2022    Removed references to GL_CHROMIUM_image.
diff --git a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_ycbcr_p010_image.txt b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_ycbcr_p010_image.txt
index 2d40454..f8883b4 100644
--- a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_ycbcr_p010_image.txt
+++ b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_ycbcr_p010_image.txt
@@ -8,22 +8,17 @@
 
 Version
 
-    Last Modified Date: June 12, 2019
+    Last Modified Date: May 3, 2022
 
 Dependencies
 
     OpenGL ES 2.0 is required.
 
-    GL_CHROMIUM_image is required.
-
 Overview
 
     This extension provides a new internal image format to use when creating an
     image from underlying p010 buffers.
 
-    This extension is useful in conjunction with CreateImageCHROMIUM to define
-    the format of GpuMemoryBuffer backing the image.
-
 New Procedures and Functions
 
     None.
@@ -34,7 +29,7 @@
 
 New Tokens
 
-    Accepted by the <internalformat> parameter of CreateImageCHROMIUM.
+    GL_RGB_YCBCR_P010_CHROMIUM    0x78FD
 
 New State
 
@@ -43,3 +38,4 @@
 Revision History
 
     06/12/2019   Documented the extension
+    5/3/2022     Removed references to GL_CHROMIUM_image.
diff --git a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_ycrcb_420_image.txt b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_ycrcb_420_image.txt
index c87b5e0..b8f4452 100644
--- a/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_ycrcb_420_image.txt
+++ b/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_ycrcb_420_image.txt
@@ -8,21 +8,16 @@
 
 Version
 
-    Last Modifed Date: April 10, 2015
+    Last Modified Date: May 3, 2022
 
 Dependencies
 
     OpenGL ES 2.0 is required.
 
-    GL_CHROMIUM_image is required.
-
 Overview
 
-    This extension provides a new internal image format to use when creating an 
-    image from underlying YV12 buffers with YVU components. 
-
-    This extension is useful in conjunction with CreateImageCHROMIUM to define
-    the format of GpuMemoryBuffer backing the image.
+    This extension provides a new internal image format to use when creating an
+    image from underlying YV12 buffers with YVU components.
 
 New Procedures and Functions
 
@@ -33,8 +28,8 @@
     None.
 
 New Tokens
-    
-    Accepted by the <internalformat> parameter of CreateImageCHROMIUM.
+
+    GL_RGB_YCRCB_420_CHROMIUM    0x78FA
 
 New State
 
@@ -43,3 +38,4 @@
 Revision History
 
     4/10/2015   Documented the extension
+    5/3/2022    Removed references to GL_CHROMIUM_image.
diff --git a/gpu/GLES2/gl2chromium_autogen.h b/gpu/GLES2/gl2chromium_autogen.h
index b4ee5a0..0e2e2a5 100644
--- a/gpu/GLES2/gl2chromium_autogen.h
+++ b/gpu/GLES2/gl2chromium_autogen.h
@@ -312,8 +312,6 @@
 #define glGetTransformFeedbackVaryingsCHROMIUM \
   GLES2_GET_FUN(GetTransformFeedbackVaryingsCHROMIUM)
 #define glGetUniformsES3CHROMIUM GLES2_GET_FUN(GetUniformsES3CHROMIUM)
-#define glCreateImageCHROMIUM GLES2_GET_FUN(CreateImageCHROMIUM)
-#define glDestroyImageCHROMIUM GLES2_GET_FUN(DestroyImageCHROMIUM)
 #define glDescheduleUntilFinishedCHROMIUM \
   GLES2_GET_FUN(DescheduleUntilFinishedCHROMIUM)
 #define glGetTranslatedShaderSourceANGLE \
@@ -333,10 +331,6 @@
 #define glCreateAndConsumeTextureCHROMIUM \
   GLES2_GET_FUN(CreateAndConsumeTextureCHROMIUM)
 #define glBindUniformLocationCHROMIUM GLES2_GET_FUN(BindUniformLocationCHROMIUM)
-#define glBindTexImage2DCHROMIUM GLES2_GET_FUN(BindTexImage2DCHROMIUM)
-#define glBindTexImage2DWithInternalformatCHROMIUM \
-  GLES2_GET_FUN(BindTexImage2DWithInternalformatCHROMIUM)
-#define glReleaseTexImage2DCHROMIUM GLES2_GET_FUN(ReleaseTexImage2DCHROMIUM)
 #define glTraceBeginCHROMIUM GLES2_GET_FUN(TraceBeginCHROMIUM)
 #define glTraceEndCHROMIUM GLES2_GET_FUN(TraceEndCHROMIUM)
 #define glDiscardFramebufferEXT GLES2_GET_FUN(DiscardFramebufferEXT)
diff --git a/gpu/GLES2/gl2extchromium.h b/gpu/GLES2/gl2extchromium.h
index e7087e6..005e180 100644
--- a/gpu/GLES2/gl2extchromium.h
+++ b/gpu/GLES2/gl2extchromium.h
@@ -63,44 +63,6 @@
 #endif
 #endif  /* GL_CHROMIUM_pixel_transfer_buffer_object */
 
-/* GL_CHROMIUM_image */
-#ifndef GL_CHROMIUM_image
-#define GL_CHROMIUM_image 1
-
-typedef struct _ClientBuffer* ClientBuffer;
-
-#ifdef GL_GLEXT_PROTOTYPES
-GL_APICALL GLuint GL_APIENTRY glCreateImageCHROMIUM(ClientBuffer buffer,
-                                                    GLsizei width,
-                                                    GLsizei height,
-                                                    GLenum internalformat);
-GL_APICALL void GL_APIENTRY glDestroyImageCHROMIUM(GLuint image_id);
-GL_APICALL void GL_APIENTRY glBindTexImage2DCHROMIUM(GLenum target,
-                                                     GLint imageId);
-GL_APICALL void GL_APIENTRY
-glBindTexImage2DWithInternalformatCHROMIUM(GLenum target,
-                                           GLenum internalformat,
-                                           GLint imageId);
-GL_APICALL void GL_APIENTRY glReleaseTexImage2DCHROMIUM(GLenum target,
-                                                        GLint imageId);
-#endif
-typedef GLuint(GL_APIENTRYP PFNGLCREATEIMAGECHROMIUMPROC)(
-    ClientBuffer buffer,
-    GLsizei width,
-    GLsizei height,
-    GLenum internalformat);
-typedef void (
-    GL_APIENTRYP PFNGLDESTROYIMAGECHROMIUMPROC)(GLuint image_id);
-typedef void(GL_APIENTRYP PFNGLBINDTEXIMAGE2DCHROMIUMPROC)(GLenum target,
-                                                           GLint imageId);
-typedef void(GL_APIENTRYP PFNGLBINDTEXIMAGE2DWITHINTERNALFORMATCHROMIUMPROC)(
-    GLenum target,
-    GLenum internalformat,
-    GLint imageId);
-typedef void(GL_APIENTRYP PFNGLRELEASETEXIMAGE2DCHROMIUMPROC)(GLenum target,
-                                                              GLint imageId);
-#endif  /* GL_CHROMIUM_image */
-
 #ifndef GL_RGB_YCRCB_420_CHROMIUM
 #define GL_RGB_YCRCB_420_CHROMIUM 0x78FA
 #endif
diff --git a/gpu/command_buffer/build_gles2_cmd_buffer.py b/gpu/command_buffer/build_gles2_cmd_buffer.py
index 92e6882..100f866 100755
--- a/gpu/command_buffer/build_gles2_cmd_buffer.py
+++ b/gpu/command_buffer/build_gles2_cmd_buffer.py
@@ -1952,20 +1952,6 @@
     'es3': True,
     'trace_level': 1,
   },
-  'CreateImageCHROMIUM': {
-    'type': 'NoCommand',
-    'cmd_args':
-        'ClientBuffer buffer, GLsizei width, GLsizei height, '
-        'GLenum internalformat',
-    'result': ['GLuint'],
-    'extension': "CHROMIUM_image",
-    'trace_level': 1,
-  },
-  'DestroyImageCHROMIUM': {
-    'type': 'NoCommand',
-    'extension': "CHROMIUM_image",
-    'trace_level': 1,
-  },
   'DescheduleUntilFinishedCHROMIUM': {
     'type': 'Custom',
     'decoder_func': 'DoDescheduleUntilFinishedCHROMIUM',
@@ -3904,21 +3890,6 @@
     'unit_test': False,
     'pepper_interface': 'VertexArrayObject',
   },
-  'BindTexImage2DCHROMIUM': {
-    'decoder_func': 'DoBindTexImage2DCHROMIUM',
-    'unit_test': False,
-    'extension': "CHROMIUM_image",
-  },
-  'BindTexImage2DWithInternalformatCHROMIUM': {
-    'decoder_func': 'DoBindTexImage2DWithInternalformatCHROMIUM',
-    'unit_test': False,
-    'extension': "CHROMIUM_image",
-  },
-  'ReleaseTexImage2DCHROMIUM': {
-    'decoder_func': 'DoReleaseTexImage2DCHROMIUM',
-    'unit_test': False,
-    'extension': "CHROMIUM_image",
-  },
   'ShallowFinishCHROMIUM': {
     'type': 'NoCommand',
     'extension': 'CHROMIUM_ordering_barrier',
diff --git a/gpu/command_buffer/client/gles2_c_lib_autogen.h b/gpu/command_buffer/client/gles2_c_lib_autogen.h
index 128eb82..32753b4 100644
--- a/gpu/command_buffer/client/gles2_c_lib_autogen.h
+++ b/gpu/command_buffer/client/gles2_c_lib_autogen.h
@@ -1451,16 +1451,6 @@
                                              void* info) {
   gles2::GetGLContext()->GetUniformsES3CHROMIUM(program, bufsize, size, info);
 }
-GLuint GL_APIENTRY GLES2CreateImageCHROMIUM(ClientBuffer buffer,
-                                            GLsizei width,
-                                            GLsizei height,
-                                            GLenum internalformat) {
-  return gles2::GetGLContext()->CreateImageCHROMIUM(buffer, width, height,
-                                                    internalformat);
-}
-void GL_APIENTRY GLES2DestroyImageCHROMIUM(GLuint image_id) {
-  gles2::GetGLContext()->DestroyImageCHROMIUM(image_id);
-}
 void GL_APIENTRY GLES2DescheduleUntilFinishedCHROMIUM() {
   gles2::GetGLContext()->DescheduleUntilFinishedCHROMIUM();
 }
@@ -1565,19 +1555,6 @@
                                                   const char* name) {
   gles2::GetGLContext()->BindUniformLocationCHROMIUM(program, location, name);
 }
-void GL_APIENTRY GLES2BindTexImage2DCHROMIUM(GLenum target, GLint imageId) {
-  gles2::GetGLContext()->BindTexImage2DCHROMIUM(target, imageId);
-}
-void GL_APIENTRY
-GLES2BindTexImage2DWithInternalformatCHROMIUM(GLenum target,
-                                              GLenum internalformat,
-                                              GLint imageId) {
-  gles2::GetGLContext()->BindTexImage2DWithInternalformatCHROMIUM(
-      target, internalformat, imageId);
-}
-void GL_APIENTRY GLES2ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) {
-  gles2::GetGLContext()->ReleaseTexImage2DCHROMIUM(target, imageId);
-}
 void GL_APIENTRY GLES2TraceBeginCHROMIUM(const char* category_name,
                                          const char* trace_name) {
   gles2::GetGLContext()->TraceBeginCHROMIUM(category_name, trace_name);
@@ -3006,14 +2983,6 @@
         reinterpret_cast<GLES2FunctionPointer>(glGetUniformsES3CHROMIUM),
     },
     {
-        "glCreateImageCHROMIUM",
-        reinterpret_cast<GLES2FunctionPointer>(glCreateImageCHROMIUM),
-    },
-    {
-        "glDestroyImageCHROMIUM",
-        reinterpret_cast<GLES2FunctionPointer>(glDestroyImageCHROMIUM),
-    },
-    {
         "glDescheduleUntilFinishedCHROMIUM",
         reinterpret_cast<GLES2FunctionPointer>(
             glDescheduleUntilFinishedCHROMIUM),
@@ -3071,19 +3040,6 @@
         reinterpret_cast<GLES2FunctionPointer>(glBindUniformLocationCHROMIUM),
     },
     {
-        "glBindTexImage2DCHROMIUM",
-        reinterpret_cast<GLES2FunctionPointer>(glBindTexImage2DCHROMIUM),
-    },
-    {
-        "glBindTexImage2DWithInternalformatCHROMIUM",
-        reinterpret_cast<GLES2FunctionPointer>(
-            glBindTexImage2DWithInternalformatCHROMIUM),
-    },
-    {
-        "glReleaseTexImage2DCHROMIUM",
-        reinterpret_cast<GLES2FunctionPointer>(glReleaseTexImage2DCHROMIUM),
-    },
-    {
         "glTraceBeginCHROMIUM",
         reinterpret_cast<GLES2FunctionPointer>(glTraceBeginCHROMIUM),
     },
diff --git a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
index 390b85f..11e22a5 100644
--- a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
+++ b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
@@ -2936,32 +2936,6 @@
   }
 }
 
-void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) {
-  gles2::cmds::BindTexImage2DCHROMIUM* c =
-      GetCmdSpace<gles2::cmds::BindTexImage2DCHROMIUM>();
-  if (c) {
-    c->Init(target, imageId);
-  }
-}
-
-void BindTexImage2DWithInternalformatCHROMIUM(GLenum target,
-                                              GLenum internalformat,
-                                              GLint imageId) {
-  gles2::cmds::BindTexImage2DWithInternalformatCHROMIUM* c =
-      GetCmdSpace<gles2::cmds::BindTexImage2DWithInternalformatCHROMIUM>();
-  if (c) {
-    c->Init(target, internalformat, imageId);
-  }
-}
-
-void ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) {
-  gles2::cmds::ReleaseTexImage2DCHROMIUM* c =
-      GetCmdSpace<gles2::cmds::ReleaseTexImage2DCHROMIUM>();
-  if (c) {
-    c->Init(target, imageId);
-  }
-}
-
 void TraceBeginCHROMIUM(GLuint category_bucket_id, GLuint name_bucket_id) {
   gles2::cmds::TraceBeginCHROMIUM* c =
       GetCmdSpace<gles2::cmds::TraceBeginCHROMIUM>();
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc
index 7c33d18..6906b17f 100644
--- a/gpu/command_buffer/client/gles2_implementation.cc
+++ b/gpu/command_buffer/client/gles2_implementation.cc
@@ -4476,7 +4476,6 @@
     // Adds extensions implemented on client side only.
     if (name == GL_EXTENSIONS) {
       str += std::string(str.empty() ? "" : " ") +
-             "GL_CHROMIUM_image "
              "GL_CHROMIUM_map_sub "
              "GL_CHROMIUM_ordering_barrier "
              "GL_CHROMIUM_sync_point "
@@ -7190,94 +7189,6 @@
   return false;
 }
 
-namespace {
-
-bool CreateImageValidInternalFormat(GLenum internalformat,
-                                    const Capabilities& capabilities) {
-  switch (internalformat) {
-    case GL_R16_EXT:
-      return capabilities.texture_norm16;
-    case GL_RGB10_A2_EXT:
-      return capabilities.image_ar30 || capabilities.image_ab30;
-    case GL_RGB_YCBCR_P010_CHROMIUM:
-      return capabilities.image_ycbcr_p010;
-    case GL_RED:
-    case GL_RG_EXT:
-    case GL_RGB:
-    case GL_RGBA:
-    case GL_RGB_YCBCR_422_CHROMIUM:
-    case GL_RGB_YCBCR_420V_CHROMIUM:
-    case GL_RGB_YCRCB_420_CHROMIUM:
-    case GL_BGRA_EXT:
-      return true;
-    default:
-      return false;
-  }
-}
-
-}  // namespace
-
-GLuint GLES2Implementation::CreateImageCHROMIUMHelper(ClientBuffer buffer,
-                                                      GLsizei width,
-                                                      GLsizei height,
-                                                      GLenum internalformat) {
-  if (width <= 0) {
-    SetGLError(GL_INVALID_VALUE, "glCreateImageCHROMIUM", "width <= 0");
-    return 0;
-  }
-
-  if (height <= 0) {
-    SetGLError(GL_INVALID_VALUE, "glCreateImageCHROMIUM", "height <= 0");
-    return 0;
-  }
-
-  if (!CreateImageValidInternalFormat(internalformat, capabilities_)) {
-    SetGLError(GL_INVALID_VALUE, "glCreateImageCHROMIUM", "invalid format");
-    return 0;
-  }
-
-  // CreateImage creates a fence sync so we must flush first to ensure all
-  // previously created fence syncs are flushed first.
-  FlushHelper();
-
-  int32_t image_id = gpu_control_->CreateImage(buffer, width, height);
-  if (image_id < 0) {
-    SetGLError(GL_OUT_OF_MEMORY, "glCreateImageCHROMIUM", "image_id < 0");
-    return 0;
-  }
-  return image_id;
-}
-
-GLuint GLES2Implementation::CreateImageCHROMIUM(ClientBuffer buffer,
-                                                GLsizei width,
-                                                GLsizei height,
-                                                GLenum internalformat) {
-  GPU_CLIENT_SINGLE_THREAD_CHECK();
-  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glCreateImageCHROMIUM(" << width
-                     << ", " << height << ", "
-                     << GLES2Util::GetStringImageInternalFormat(internalformat)
-                     << ")");
-  GLuint image_id =
-      CreateImageCHROMIUMHelper(buffer, width, height, internalformat);
-  CheckGLError();
-  return image_id;
-}
-
-void GLES2Implementation::DestroyImageCHROMIUMHelper(GLuint image_id) {
-  // Flush the command stream to make sure all pending commands
-  // that may refer to the image_id are executed on the service side.
-  helper_->CommandBufferHelper::Flush();
-  gpu_control_->DestroyImage(image_id);
-}
-
-void GLES2Implementation::DestroyImageCHROMIUM(GLuint image_id) {
-  GPU_CLIENT_SINGLE_THREAD_CHECK();
-  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glDestroyImageCHROMIUM("
-                     << image_id << ")");
-  DestroyImageCHROMIUMHelper(image_id);
-  CheckGLError();
-}
-
 bool GLES2Implementation::ValidateSize(const char* func, GLsizeiptr size) {
   if (size < 0) {
     SetGLError(GL_INVALID_VALUE, func, "size < 0");
diff --git a/gpu/command_buffer/client/gles2_implementation.h b/gpu/command_buffer/client/gles2_implementation.h
index b8c4ff5..86f8eb42 100644
--- a/gpu/command_buffer/client/gles2_implementation.h
+++ b/gpu/command_buffer/client/gles2_implementation.h
@@ -549,12 +549,6 @@
       const GLuint* baseInstances,
       GLsizei drawcount);
 
-  GLuint CreateImageCHROMIUMHelper(ClientBuffer buffer,
-                                   GLsizei width,
-                                   GLsizei height,
-                                   GLenum internalformat);
-  void DestroyImageCHROMIUMHelper(GLuint image_id);
-
   // Helper for GetVertexAttrib
   bool GetVertexAttribHelper(GLuint index, GLenum pname, uint32_t* param);
 
diff --git a/gpu/command_buffer/client/gles2_implementation_autogen.h b/gpu/command_buffer/client/gles2_implementation_autogen.h
index f2ec6d8..8e1aa82a 100644
--- a/gpu/command_buffer/client/gles2_implementation_autogen.h
+++ b/gpu/command_buffer/client/gles2_implementation_autogen.h
@@ -1021,13 +1021,6 @@
                             GLsizei* size,
                             void* info) override;
 
-GLuint CreateImageCHROMIUM(ClientBuffer buffer,
-                           GLsizei width,
-                           GLsizei height,
-                           GLenum internalformat) override;
-
-void DestroyImageCHROMIUM(GLuint image_id) override;
-
 void DescheduleUntilFinishedCHROMIUM() override;
 
 void GetTranslatedShaderSourceANGLE(GLuint shader,
@@ -1104,14 +1097,6 @@
                                  GLint location,
                                  const char* name) override;
 
-void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) override;
-
-void BindTexImage2DWithInternalformatCHROMIUM(GLenum target,
-                                              GLenum internalformat,
-                                              GLint imageId) override;
-
-void ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) override;
-
 void TraceBeginCHROMIUM(const char* category_name,
                         const char* trace_name) override;
 
diff --git a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
index 9bff1f3..61de0b65 100644
--- a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
+++ b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
@@ -3326,40 +3326,6 @@
   CheckGLError();
 }
 
-void GLES2Implementation::BindTexImage2DCHROMIUM(GLenum target, GLint imageId) {
-  GPU_CLIENT_SINGLE_THREAD_CHECK();
-  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glBindTexImage2DCHROMIUM("
-                     << GLES2Util::GetStringTextureBindTarget(target) << ", "
-                     << imageId << ")");
-  helper_->BindTexImage2DCHROMIUM(target, imageId);
-  CheckGLError();
-}
-
-void GLES2Implementation::BindTexImage2DWithInternalformatCHROMIUM(
-    GLenum target,
-    GLenum internalformat,
-    GLint imageId) {
-  GPU_CLIENT_SINGLE_THREAD_CHECK();
-  GPU_CLIENT_LOG(
-      "[" << GetLogPrefix() << "] glBindTexImage2DWithInternalformatCHROMIUM("
-          << GLES2Util::GetStringTextureBindTarget(target) << ", "
-          << GLES2Util::GetStringTextureInternalFormat(internalformat) << ", "
-          << imageId << ")");
-  helper_->BindTexImage2DWithInternalformatCHROMIUM(target, internalformat,
-                                                    imageId);
-  CheckGLError();
-}
-
-void GLES2Implementation::ReleaseTexImage2DCHROMIUM(GLenum target,
-                                                    GLint imageId) {
-  GPU_CLIENT_SINGLE_THREAD_CHECK();
-  GPU_CLIENT_LOG("[" << GetLogPrefix() << "] glReleaseTexImage2DCHROMIUM("
-                     << GLES2Util::GetStringTextureBindTarget(target) << ", "
-                     << imageId << ")");
-  helper_->ReleaseTexImage2DCHROMIUM(target, imageId);
-  CheckGLError();
-}
-
 void GLES2Implementation::DiscardFramebufferEXT(GLenum target,
                                                 GLsizei count,
                                                 const GLenum* attachments) {
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest.cc b/gpu/command_buffer/client/gles2_implementation_unittest.cc
index c182abc..38b4539f 100644
--- a/gpu/command_buffer/client/gles2_implementation_unittest.cc
+++ b/gpu/command_buffer/client/gles2_implementation_unittest.cc
@@ -3002,7 +3002,6 @@
   // GL_CHROMIUM_map_sub is hard coded into GLES2Implementation.
   const char* expected_str =
       "foobar "
-      "GL_CHROMIUM_image "
       "GL_CHROMIUM_map_sub "
       "GL_CHROMIUM_ordering_barrier "
       "GL_CHROMIUM_sync_point "
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h b/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
index ea92758bb..d53173a4 100644
--- a/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
+++ b/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
@@ -2874,39 +2874,6 @@
   EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
 }
 
-TEST_F(GLES2ImplementationTest, BindTexImage2DCHROMIUM) {
-  struct Cmds {
-    cmds::BindTexImage2DCHROMIUM cmd;
-  };
-  Cmds expected;
-  expected.cmd.Init(GL_TEXTURE_2D, 2);
-
-  gl_->BindTexImage2DCHROMIUM(GL_TEXTURE_2D, 2);
-  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
-}
-
-TEST_F(GLES2ImplementationTest, BindTexImage2DWithInternalformatCHROMIUM) {
-  struct Cmds {
-    cmds::BindTexImage2DWithInternalformatCHROMIUM cmd;
-  };
-  Cmds expected;
-  expected.cmd.Init(GL_TEXTURE_2D, GL_ALPHA, 3);
-
-  gl_->BindTexImage2DWithInternalformatCHROMIUM(GL_TEXTURE_2D, GL_ALPHA, 3);
-  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
-}
-
-TEST_F(GLES2ImplementationTest, ReleaseTexImage2DCHROMIUM) {
-  struct Cmds {
-    cmds::ReleaseTexImage2DCHROMIUM cmd;
-  };
-  Cmds expected;
-  expected.cmd.Init(GL_TEXTURE_2D, 2);
-
-  gl_->ReleaseTexImage2DCHROMIUM(GL_TEXTURE_2D, 2);
-  EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected)));
-}
-
 TEST_F(GLES2ImplementationTest, DiscardFramebufferEXT) {
   GLenum data[2][1] = {{0}};
   struct Cmds {
diff --git a/gpu/command_buffer/client/gles2_interface_autogen.h b/gpu/command_buffer/client/gles2_interface_autogen.h
index c35e07b..e877895 100644
--- a/gpu/command_buffer/client/gles2_interface_autogen.h
+++ b/gpu/command_buffer/client/gles2_interface_autogen.h
@@ -757,11 +757,6 @@
                                     GLsizei bufsize,
                                     GLsizei* size,
                                     void* info) = 0;
-virtual GLuint CreateImageCHROMIUM(ClientBuffer buffer,
-                                   GLsizei width,
-                                   GLsizei height,
-                                   GLenum internalformat) = 0;
-virtual void DestroyImageCHROMIUM(GLuint image_id) = 0;
 virtual void DescheduleUntilFinishedCHROMIUM() = 0;
 virtual void GetTranslatedShaderSourceANGLE(GLuint shader,
                                             GLsizei bufsize,
@@ -825,11 +820,6 @@
 virtual void BindUniformLocationCHROMIUM(GLuint program,
                                          GLint location,
                                          const char* name) = 0;
-virtual void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) = 0;
-virtual void BindTexImage2DWithInternalformatCHROMIUM(GLenum target,
-                                                      GLenum internalformat,
-                                                      GLint imageId) = 0;
-virtual void ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) = 0;
 virtual void TraceBeginCHROMIUM(const char* category_name,
                                 const char* trace_name) = 0;
 virtual void TraceEndCHROMIUM() = 0;
diff --git a/gpu/command_buffer/client/gles2_interface_stub_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_autogen.h
index fa3798f..8350fc4 100644
--- a/gpu/command_buffer/client/gles2_interface_stub_autogen.h
+++ b/gpu/command_buffer/client/gles2_interface_stub_autogen.h
@@ -733,11 +733,6 @@
                             GLsizei bufsize,
                             GLsizei* size,
                             void* info) override;
-GLuint CreateImageCHROMIUM(ClientBuffer buffer,
-                           GLsizei width,
-                           GLsizei height,
-                           GLenum internalformat) override;
-void DestroyImageCHROMIUM(GLuint image_id) override;
 void DescheduleUntilFinishedCHROMIUM() override;
 void GetTranslatedShaderSourceANGLE(GLuint shader,
                                     GLsizei bufsize,
@@ -801,11 +796,6 @@
 void BindUniformLocationCHROMIUM(GLuint program,
                                  GLint location,
                                  const char* name) override;
-void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) override;
-void BindTexImage2DWithInternalformatCHROMIUM(GLenum target,
-                                              GLenum internalformat,
-                                              GLint imageId) override;
-void ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) override;
 void TraceBeginCHROMIUM(const char* category_name,
                         const char* trace_name) override;
 void TraceEndCHROMIUM() override;
diff --git a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
index 76fb3d2..d018890 100644
--- a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
+++ b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
@@ -991,13 +991,6 @@
                                                 GLsizei /* bufsize */,
                                                 GLsizei* /* size */,
                                                 void* /* info */) {}
-GLuint GLES2InterfaceStub::CreateImageCHROMIUM(ClientBuffer /* buffer */,
-                                               GLsizei /* width */,
-                                               GLsizei /* height */,
-                                               GLenum /* internalformat */) {
-  return 0;
-}
-void GLES2InterfaceStub::DestroyImageCHROMIUM(GLuint /* image_id */) {}
 void GLES2InterfaceStub::DescheduleUntilFinishedCHROMIUM() {}
 void GLES2InterfaceStub::GetTranslatedShaderSourceANGLE(GLuint /* shader */,
                                                         GLsizei /* bufsize */,
@@ -1069,14 +1062,6 @@
 void GLES2InterfaceStub::BindUniformLocationCHROMIUM(GLuint /* program */,
                                                      GLint /* location */,
                                                      const char* /* name */) {}
-void GLES2InterfaceStub::BindTexImage2DCHROMIUM(GLenum /* target */,
-                                                GLint /* imageId */) {}
-void GLES2InterfaceStub::BindTexImage2DWithInternalformatCHROMIUM(
-    GLenum /* target */,
-    GLenum /* internalformat */,
-    GLint /* imageId */) {}
-void GLES2InterfaceStub::ReleaseTexImage2DCHROMIUM(GLenum /* target */,
-                                                   GLint /* imageId */) {}
 void GLES2InterfaceStub::TraceBeginCHROMIUM(const char* /* category_name */,
                                             const char* /* trace_name */) {}
 void GLES2InterfaceStub::TraceEndCHROMIUM() {}
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
index a8a7a91..45ddce1 100644
--- a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
+++ b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
@@ -733,11 +733,6 @@
                             GLsizei bufsize,
                             GLsizei* size,
                             void* info) override;
-GLuint CreateImageCHROMIUM(ClientBuffer buffer,
-                           GLsizei width,
-                           GLsizei height,
-                           GLenum internalformat) override;
-void DestroyImageCHROMIUM(GLuint image_id) override;
 void DescheduleUntilFinishedCHROMIUM() override;
 void GetTranslatedShaderSourceANGLE(GLuint shader,
                                     GLsizei bufsize,
@@ -801,11 +796,6 @@
 void BindUniformLocationCHROMIUM(GLuint program,
                                  GLint location,
                                  const char* name) override;
-void BindTexImage2DCHROMIUM(GLenum target, GLint imageId) override;
-void BindTexImage2DWithInternalformatCHROMIUM(GLenum target,
-                                              GLenum internalformat,
-                                              GLint imageId) override;
-void ReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId) override;
 void TraceBeginCHROMIUM(const char* category_name,
                         const char* trace_name) override;
 void TraceEndCHROMIUM() override;
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
index 6bc4502..ab66f113 100644
--- a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
+++ b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
@@ -2091,19 +2091,6 @@
   gl_->GetUniformsES3CHROMIUM(program, bufsize, size, info);
 }
 
-GLuint GLES2TraceImplementation::CreateImageCHROMIUM(ClientBuffer buffer,
-                                                     GLsizei width,
-                                                     GLsizei height,
-                                                     GLenum internalformat) {
-  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::CreateImageCHROMIUM");
-  return gl_->CreateImageCHROMIUM(buffer, width, height, internalformat);
-}
-
-void GLES2TraceImplementation::DestroyImageCHROMIUM(GLuint image_id) {
-  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::DestroyImageCHROMIUM");
-  gl_->DestroyImageCHROMIUM(image_id);
-}
-
 void GLES2TraceImplementation::DescheduleUntilFinishedCHROMIUM() {
   TRACE_EVENT_BINARY_EFFICIENT0("gpu",
                                 "GLES2Trace::DescheduleUntilFinishedCHROMIUM");
@@ -2240,28 +2227,6 @@
   gl_->BindUniformLocationCHROMIUM(program, location, name);
 }
 
-void GLES2TraceImplementation::BindTexImage2DCHROMIUM(GLenum target,
-                                                      GLint imageId) {
-  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::BindTexImage2DCHROMIUM");
-  gl_->BindTexImage2DCHROMIUM(target, imageId);
-}
-
-void GLES2TraceImplementation::BindTexImage2DWithInternalformatCHROMIUM(
-    GLenum target,
-    GLenum internalformat,
-    GLint imageId) {
-  TRACE_EVENT_BINARY_EFFICIENT0(
-      "gpu", "GLES2Trace::BindTexImage2DWithInternalformatCHROMIUM");
-  gl_->BindTexImage2DWithInternalformatCHROMIUM(target, internalformat,
-                                                imageId);
-}
-
-void GLES2TraceImplementation::ReleaseTexImage2DCHROMIUM(GLenum target,
-                                                         GLint imageId) {
-  TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::ReleaseTexImage2DCHROMIUM");
-  gl_->ReleaseTexImage2DCHROMIUM(target, imageId);
-}
-
 void GLES2TraceImplementation::TraceBeginCHROMIUM(const char* category_name,
                                                   const char* trace_name) {
   TRACE_EVENT_BINARY_EFFICIENT0("gpu", "GLES2Trace::TraceBeginCHROMIUM");
diff --git a/gpu/command_buffer/client/gpu_control.h b/gpu/command_buffer/client/gpu_control.h
index fc9a6a3..4bcb13a 100644
--- a/gpu/command_buffer/client/gpu_control.h
+++ b/gpu/command_buffer/client/gpu_control.h
@@ -47,15 +47,6 @@
 
   virtual const Capabilities& GetCapabilities() const = 0;
 
-  // Create an image for a client buffer with the given dimensions. Returns its
-  // ID or -1 on error.
-  virtual int32_t CreateImage(ClientBuffer buffer,
-                              size_t width,
-                              size_t height) = 0;
-
-  // Destroy an image. The ID must be positive.
-  virtual void DestroyImage(int32_t id) = 0;
-
   // Runs |callback| when a query created via glCreateQueryEXT() has cleared
   // passed the glEndQueryEXT() point.
   virtual void SignalQuery(uint32_t query, base::OnceClosure callback) = 0;
diff --git a/gpu/command_buffer/client/raster_implementation_gles_unittest.cc b/gpu/command_buffer/client/raster_implementation_gles_unittest.cc
index ce230d29..7d1fe72 100644
--- a/gpu/command_buffer/client/raster_implementation_gles_unittest.cc
+++ b/gpu/command_buffer/client/raster_implementation_gles_unittest.cc
@@ -92,16 +92,6 @@
                void(GLuint texture, GLenum mode));
   MOCK_METHOD1(EndSharedImageAccessDirectCHROMIUM, void(GLuint texture));
 
-  // Image objects.
-  MOCK_METHOD4(CreateImageCHROMIUM,
-               GLuint(ClientBuffer buffer,
-                      GLsizei width,
-                      GLsizei height,
-                      GLenum internalformat));
-  MOCK_METHOD2(BindTexImage2DCHROMIUM, void(GLenum target, GLint imageId));
-  MOCK_METHOD2(ReleaseTexImage2DCHROMIUM, void(GLenum target, GLint imageId));
-  MOCK_METHOD1(DestroyImageCHROMIUM, void(GLuint image_id));
-
   // Texture allocation and copying.
   MOCK_METHOD9(TexImage2D,
                void(GLenum target,
diff --git a/gpu/command_buffer/common/gles2_cmd_format_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
index 3c392f59..a7061f6 100644
--- a/gpu/command_buffer/common/gles2_cmd_format_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
@@ -14612,126 +14612,6 @@
     offsetof(BindUniformLocationCHROMIUMBucket, name_bucket_id) == 12,
     "offset of BindUniformLocationCHROMIUMBucket name_bucket_id should be 12");
 
-struct BindTexImage2DCHROMIUM {
-  typedef BindTexImage2DCHROMIUM ValueType;
-  static const CommandId kCmdId = kBindTexImage2DCHROMIUM;
-  static const cmd::ArgFlags kArgFlags = cmd::kFixed;
-  static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
-
-  static uint32_t ComputeSize() {
-    return static_cast<uint32_t>(sizeof(ValueType));  // NOLINT
-  }
-
-  void SetHeader() { header.SetCmd<ValueType>(); }
-
-  void Init(GLenum _target, GLint _imageId) {
-    SetHeader();
-    target = _target;
-    imageId = _imageId;
-  }
-
-  void* Set(void* cmd, GLenum _target, GLint _imageId) {
-    static_cast<ValueType*>(cmd)->Init(_target, _imageId);
-    return NextCmdAddress<ValueType>(cmd);
-  }
-
-  gpu::CommandHeader header;
-  uint32_t target;
-  int32_t imageId;
-};
-
-static_assert(sizeof(BindTexImage2DCHROMIUM) == 12,
-              "size of BindTexImage2DCHROMIUM should be 12");
-static_assert(offsetof(BindTexImage2DCHROMIUM, header) == 0,
-              "offset of BindTexImage2DCHROMIUM header should be 0");
-static_assert(offsetof(BindTexImage2DCHROMIUM, target) == 4,
-              "offset of BindTexImage2DCHROMIUM target should be 4");
-static_assert(offsetof(BindTexImage2DCHROMIUM, imageId) == 8,
-              "offset of BindTexImage2DCHROMIUM imageId should be 8");
-
-struct BindTexImage2DWithInternalformatCHROMIUM {
-  typedef BindTexImage2DWithInternalformatCHROMIUM ValueType;
-  static const CommandId kCmdId = kBindTexImage2DWithInternalformatCHROMIUM;
-  static const cmd::ArgFlags kArgFlags = cmd::kFixed;
-  static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
-
-  static uint32_t ComputeSize() {
-    return static_cast<uint32_t>(sizeof(ValueType));  // NOLINT
-  }
-
-  void SetHeader() { header.SetCmd<ValueType>(); }
-
-  void Init(GLenum _target, GLenum _internalformat, GLint _imageId) {
-    SetHeader();
-    target = _target;
-    internalformat = _internalformat;
-    imageId = _imageId;
-  }
-
-  void* Set(void* cmd, GLenum _target, GLenum _internalformat, GLint _imageId) {
-    static_cast<ValueType*>(cmd)->Init(_target, _internalformat, _imageId);
-    return NextCmdAddress<ValueType>(cmd);
-  }
-
-  gpu::CommandHeader header;
-  uint32_t target;
-  uint32_t internalformat;
-  int32_t imageId;
-};
-
-static_assert(sizeof(BindTexImage2DWithInternalformatCHROMIUM) == 16,
-              "size of BindTexImage2DWithInternalformatCHROMIUM should be 16");
-static_assert(
-    offsetof(BindTexImage2DWithInternalformatCHROMIUM, header) == 0,
-    "offset of BindTexImage2DWithInternalformatCHROMIUM header should be 0");
-static_assert(
-    offsetof(BindTexImage2DWithInternalformatCHROMIUM, target) == 4,
-    "offset of BindTexImage2DWithInternalformatCHROMIUM target should be 4");
-static_assert(offsetof(BindTexImage2DWithInternalformatCHROMIUM,
-                       internalformat) == 8,
-              "offset of BindTexImage2DWithInternalformatCHROMIUM "
-              "internalformat should be 8");
-static_assert(
-    offsetof(BindTexImage2DWithInternalformatCHROMIUM, imageId) == 12,
-    "offset of BindTexImage2DWithInternalformatCHROMIUM imageId should be 12");
-
-struct ReleaseTexImage2DCHROMIUM {
-  typedef ReleaseTexImage2DCHROMIUM ValueType;
-  static const CommandId kCmdId = kReleaseTexImage2DCHROMIUM;
-  static const cmd::ArgFlags kArgFlags = cmd::kFixed;
-  static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(3);
-
-  static uint32_t ComputeSize() {
-    return static_cast<uint32_t>(sizeof(ValueType));  // NOLINT
-  }
-
-  void SetHeader() { header.SetCmd<ValueType>(); }
-
-  void Init(GLenum _target, GLint _imageId) {
-    SetHeader();
-    target = _target;
-    imageId = _imageId;
-  }
-
-  void* Set(void* cmd, GLenum _target, GLint _imageId) {
-    static_cast<ValueType*>(cmd)->Init(_target, _imageId);
-    return NextCmdAddress<ValueType>(cmd);
-  }
-
-  gpu::CommandHeader header;
-  uint32_t target;
-  int32_t imageId;
-};
-
-static_assert(sizeof(ReleaseTexImage2DCHROMIUM) == 12,
-              "size of ReleaseTexImage2DCHROMIUM should be 12");
-static_assert(offsetof(ReleaseTexImage2DCHROMIUM, header) == 0,
-              "offset of ReleaseTexImage2DCHROMIUM header should be 0");
-static_assert(offsetof(ReleaseTexImage2DCHROMIUM, target) == 4,
-              "offset of ReleaseTexImage2DCHROMIUM target should be 4");
-static_assert(offsetof(ReleaseTexImage2DCHROMIUM, imageId) == 8,
-              "offset of ReleaseTexImage2DCHROMIUM imageId should be 8");
-
 struct TraceBeginCHROMIUM {
   typedef TraceBeginCHROMIUM ValueType;
   static const CommandId kCmdId = kTraceBeginCHROMIUM;
diff --git a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
index 6f23f44b..41b430d 100644
--- a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
@@ -4814,47 +4814,6 @@
   CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
 }
 
-TEST_F(GLES2FormatTest, BindTexImage2DCHROMIUM) {
-  cmds::BindTexImage2DCHROMIUM& cmd =
-      *GetBufferAs<cmds::BindTexImage2DCHROMIUM>();
-  void* next_cmd =
-      cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLint>(12));
-  EXPECT_EQ(static_cast<uint32_t>(cmds::BindTexImage2DCHROMIUM::kCmdId),
-            cmd.header.command);
-  EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
-  EXPECT_EQ(static_cast<GLenum>(11), cmd.target);
-  EXPECT_EQ(static_cast<GLint>(12), cmd.imageId);
-  CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
-}
-
-TEST_F(GLES2FormatTest, BindTexImage2DWithInternalformatCHROMIUM) {
-  cmds::BindTexImage2DWithInternalformatCHROMIUM& cmd =
-      *GetBufferAs<cmds::BindTexImage2DWithInternalformatCHROMIUM>();
-  void* next_cmd = cmd.Set(&cmd, static_cast<GLenum>(11),
-                           static_cast<GLenum>(12), static_cast<GLint>(13));
-  EXPECT_EQ(static_cast<uint32_t>(
-                cmds::BindTexImage2DWithInternalformatCHROMIUM::kCmdId),
-            cmd.header.command);
-  EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
-  EXPECT_EQ(static_cast<GLenum>(11), cmd.target);
-  EXPECT_EQ(static_cast<GLenum>(12), cmd.internalformat);
-  EXPECT_EQ(static_cast<GLint>(13), cmd.imageId);
-  CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
-}
-
-TEST_F(GLES2FormatTest, ReleaseTexImage2DCHROMIUM) {
-  cmds::ReleaseTexImage2DCHROMIUM& cmd =
-      *GetBufferAs<cmds::ReleaseTexImage2DCHROMIUM>();
-  void* next_cmd =
-      cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLint>(12));
-  EXPECT_EQ(static_cast<uint32_t>(cmds::ReleaseTexImage2DCHROMIUM::kCmdId),
-            cmd.header.command);
-  EXPECT_EQ(sizeof(cmd), cmd.header.size * 4u);
-  EXPECT_EQ(static_cast<GLenum>(11), cmd.target);
-  EXPECT_EQ(static_cast<GLint>(12), cmd.imageId);
-  CheckBytesWrittenMatchesExpectedSize(next_cmd, sizeof(cmd));
-}
-
 TEST_F(GLES2FormatTest, TraceBeginCHROMIUM) {
   cmds::TraceBeginCHROMIUM& cmd = *GetBufferAs<cmds::TraceBeginCHROMIUM>();
   void* next_cmd =
diff --git a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
index ea3a56c..437031d 100644
--- a/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
+++ b/gpu/command_buffer/common/gles2_cmd_ids_autogen.h
@@ -302,57 +302,54 @@
   OP(ProduceTextureDirectCHROMIUMImmediate)                    /* 543 */ \
   OP(CreateAndConsumeTextureINTERNALImmediate)                 /* 544 */ \
   OP(BindUniformLocationCHROMIUMBucket)                        /* 545 */ \
-  OP(BindTexImage2DCHROMIUM)                                   /* 546 */ \
-  OP(BindTexImage2DWithInternalformatCHROMIUM)                 /* 547 */ \
-  OP(ReleaseTexImage2DCHROMIUM)                                /* 548 */ \
-  OP(TraceBeginCHROMIUM)                                       /* 549 */ \
-  OP(TraceEndCHROMIUM)                                         /* 550 */ \
-  OP(DiscardFramebufferEXTImmediate)                           /* 551 */ \
-  OP(LoseContextCHROMIUM)                                      /* 552 */ \
-  OP(DrawBuffersEXTImmediate)                                  /* 553 */ \
-  OP(DiscardBackbufferCHROMIUM)                                /* 554 */ \
-  OP(ScheduleOverlayPlaneCHROMIUM)                             /* 555 */ \
-  OP(ScheduleCALayerSharedStateCHROMIUM)                       /* 556 */ \
-  OP(ScheduleCALayerCHROMIUM)                                  /* 557 */ \
-  OP(ScheduleCALayerInUseQueryCHROMIUMImmediate)               /* 558 */ \
-  OP(CommitOverlayPlanesCHROMIUM)                              /* 559 */ \
-  OP(FlushDriverCachesCHROMIUM)                                /* 560 */ \
-  OP(ScheduleDCLayerCHROMIUM)                                  /* 561 */ \
-  OP(SetActiveURLCHROMIUM)                                     /* 562 */ \
-  OP(ContextVisibilityHintCHROMIUM)                            /* 563 */ \
-  OP(CoverageModulationCHROMIUM)                               /* 564 */ \
-  OP(BlendBarrierKHR)                                          /* 565 */ \
-  OP(BindFragDataLocationIndexedEXTBucket)                     /* 566 */ \
-  OP(BindFragDataLocationEXTBucket)                            /* 567 */ \
-  OP(GetFragDataIndexEXT)                                      /* 568 */ \
-  OP(SwapBuffersWithBoundsCHROMIUMImmediate)                   /* 569 */ \
-  OP(SetDrawRectangleCHROMIUM)                                 /* 570 */ \
-  OP(SetEnableDCLayersCHROMIUM)                                /* 571 */ \
-  OP(InitializeDiscardableTextureCHROMIUM)                     /* 572 */ \
-  OP(UnlockDiscardableTextureCHROMIUM)                         /* 573 */ \
-  OP(LockDiscardableTextureCHROMIUM)                           /* 574 */ \
-  OP(TexStorage2DImageCHROMIUM)                                /* 575 */ \
-  OP(SetColorSpaceMetadataCHROMIUM)                            /* 576 */ \
-  OP(WindowRectanglesEXTImmediate)                             /* 577 */ \
-  OP(CreateGpuFenceINTERNAL)                                   /* 578 */ \
-  OP(WaitGpuFenceCHROMIUM)                                     /* 579 */ \
-  OP(DestroyGpuFenceCHROMIUM)                                  /* 580 */ \
-  OP(SetReadbackBufferShadowAllocationINTERNAL)                /* 581 */ \
-  OP(FramebufferTextureMultiviewOVR)                           /* 582 */ \
-  OP(MaxShaderCompilerThreadsKHR)                              /* 583 */ \
-  OP(CreateAndTexStorage2DSharedImageINTERNALImmediate)        /* 584 */ \
-  OP(BeginSharedImageAccessDirectCHROMIUM)                     /* 585 */ \
-  OP(EndSharedImageAccessDirectCHROMIUM)                       /* 586 */ \
-  OP(BeginBatchReadAccessSharedImageCHROMIUM)                  /* 587 */ \
-  OP(EndBatchReadAccessSharedImageCHROMIUM)                    /* 588 */ \
-  OP(EnableiOES)                                               /* 589 */ \
-  OP(DisableiOES)                                              /* 590 */ \
-  OP(BlendEquationiOES)                                        /* 591 */ \
-  OP(BlendEquationSeparateiOES)                                /* 592 */ \
-  OP(BlendFunciOES)                                            /* 593 */ \
-  OP(BlendFuncSeparateiOES)                                    /* 594 */ \
-  OP(ColorMaskiOES)                                            /* 595 */ \
-  OP(IsEnablediOES)                                            /* 596 */
+  OP(TraceBeginCHROMIUM)                                       /* 546 */ \
+  OP(TraceEndCHROMIUM)                                         /* 547 */ \
+  OP(DiscardFramebufferEXTImmediate)                           /* 548 */ \
+  OP(LoseContextCHROMIUM)                                      /* 549 */ \
+  OP(DrawBuffersEXTImmediate)                                  /* 550 */ \
+  OP(DiscardBackbufferCHROMIUM)                                /* 551 */ \
+  OP(ScheduleOverlayPlaneCHROMIUM)                             /* 552 */ \
+  OP(ScheduleCALayerSharedStateCHROMIUM)                       /* 553 */ \
+  OP(ScheduleCALayerCHROMIUM)                                  /* 554 */ \
+  OP(ScheduleCALayerInUseQueryCHROMIUMImmediate)               /* 555 */ \
+  OP(CommitOverlayPlanesCHROMIUM)                              /* 556 */ \
+  OP(FlushDriverCachesCHROMIUM)                                /* 557 */ \
+  OP(ScheduleDCLayerCHROMIUM)                                  /* 558 */ \
+  OP(SetActiveURLCHROMIUM)                                     /* 559 */ \
+  OP(ContextVisibilityHintCHROMIUM)                            /* 560 */ \
+  OP(CoverageModulationCHROMIUM)                               /* 561 */ \
+  OP(BlendBarrierKHR)                                          /* 562 */ \
+  OP(BindFragDataLocationIndexedEXTBucket)                     /* 563 */ \
+  OP(BindFragDataLocationEXTBucket)                            /* 564 */ \
+  OP(GetFragDataIndexEXT)                                      /* 565 */ \
+  OP(SwapBuffersWithBoundsCHROMIUMImmediate)                   /* 566 */ \
+  OP(SetDrawRectangleCHROMIUM)                                 /* 567 */ \
+  OP(SetEnableDCLayersCHROMIUM)                                /* 568 */ \
+  OP(InitializeDiscardableTextureCHROMIUM)                     /* 569 */ \
+  OP(UnlockDiscardableTextureCHROMIUM)                         /* 570 */ \
+  OP(LockDiscardableTextureCHROMIUM)                           /* 571 */ \
+  OP(TexStorage2DImageCHROMIUM)                                /* 572 */ \
+  OP(SetColorSpaceMetadataCHROMIUM)                            /* 573 */ \
+  OP(WindowRectanglesEXTImmediate)                             /* 574 */ \
+  OP(CreateGpuFenceINTERNAL)                                   /* 575 */ \
+  OP(WaitGpuFenceCHROMIUM)                                     /* 576 */ \
+  OP(DestroyGpuFenceCHROMIUM)                                  /* 577 */ \
+  OP(SetReadbackBufferShadowAllocationINTERNAL)                /* 578 */ \
+  OP(FramebufferTextureMultiviewOVR)                           /* 579 */ \
+  OP(MaxShaderCompilerThreadsKHR)                              /* 580 */ \
+  OP(CreateAndTexStorage2DSharedImageINTERNALImmediate)        /* 581 */ \
+  OP(BeginSharedImageAccessDirectCHROMIUM)                     /* 582 */ \
+  OP(EndSharedImageAccessDirectCHROMIUM)                       /* 583 */ \
+  OP(BeginBatchReadAccessSharedImageCHROMIUM)                  /* 584 */ \
+  OP(EndBatchReadAccessSharedImageCHROMIUM)                    /* 585 */ \
+  OP(EnableiOES)                                               /* 586 */ \
+  OP(DisableiOES)                                              /* 587 */ \
+  OP(BlendEquationiOES)                                        /* 588 */ \
+  OP(BlendEquationSeparateiOES)                                /* 589 */ \
+  OP(BlendFunciOES)                                            /* 590 */ \
+  OP(BlendFuncSeparateiOES)                                    /* 591 */ \
+  OP(ColorMaskiOES)                                            /* 592 */ \
+  OP(IsEnablediOES)                                            /* 593 */
 
 enum CommandId {
   kOneBeforeStartPoint =
diff --git a/gpu/command_buffer/gles2_cmd_buffer_functions.txt b/gpu/command_buffer/gles2_cmd_buffer_functions.txt
index f6e8734..22a77da 100644
--- a/gpu/command_buffer/gles2_cmd_buffer_functions.txt
+++ b/gpu/command_buffer/gles2_cmd_buffer_functions.txt
@@ -310,8 +310,6 @@
 GL_APICALL void         GL_APIENTRY glGetUniformBlocksCHROMIUM (GLidProgram program, GLsizeiNotNegative bufsize, GLsizei* size, void* info);
 GL_APICALL void         GL_APIENTRY glGetTransformFeedbackVaryingsCHROMIUM (GLidProgram program, GLsizeiNotNegative bufsize, GLsizei* size, void* info);
 GL_APICALL void         GL_APIENTRY glGetUniformsES3CHROMIUM (GLidProgram program, GLsizeiNotNegative bufsize, GLsizei* size, void* info);
-GL_APICALL GLuint       GL_APIENTRY glCreateImageCHROMIUM (ClientBuffer buffer, GLsizei width, GLsizei height, GLenum internalformat);
-GL_APICALL void         GL_APIENTRY glDestroyImageCHROMIUM (GLuint image_id);
 GL_APICALL void         GL_APIENTRY glDescheduleUntilFinishedCHROMIUM (void);
 GL_APICALL void         GL_APIENTRY glGetTranslatedShaderSourceANGLE (GLidShader shader, GLsizeiNotNegative bufsize, GLsizeiOptional* length, char* source);
 GL_APICALL void         GL_APIENTRY glPostSubBufferCHROMIUM (GLuint64 swap_id, GLint x, GLint y, GLint width, GLint height, GLbitfieldSwapBuffersFlags flags = 0);
@@ -326,9 +324,6 @@
 GL_APICALL GLuint       GL_APIENTRY glCreateAndConsumeTextureCHROMIUM (const GLbyte* mailbox);
 GL_APICALL void         GL_APIENTRY glCreateAndConsumeTextureINTERNAL (GLuint texture, const GLbyte* mailbox);
 GL_APICALL void         GL_APIENTRY glBindUniformLocationCHROMIUM (GLidProgram program, GLint location, const char* name);
-GL_APICALL void         GL_APIENTRY glBindTexImage2DCHROMIUM (GLenumTextureBindTarget target, GLint imageId);
-GL_APICALL void         GL_APIENTRY glBindTexImage2DWithInternalformatCHROMIUM (GLenumTextureBindTarget target, GLenumTextureInternalFormat internalformat, GLint imageId);
-GL_APICALL void         GL_APIENTRY glReleaseTexImage2DCHROMIUM (GLenumTextureBindTarget target, GLint imageId);
 GL_APICALL void         GL_APIENTRY glTraceBeginCHROMIUM (const char* category_name, const char* trace_name);
 GL_APICALL void         GL_APIENTRY glTraceEndCHROMIUM (void);
 GL_APICALL void         GL_APIENTRY glDiscardFramebufferEXT (GLenumFramebufferTarget target, GLsizei count, const GLenum* attachments);
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc
index 4847ff34..54a14f9 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -1242,20 +1242,6 @@
                  uint32_t texture_target,
                  gl::GLImage* image,
                  bool can_bind_to_sampler) override;
-  void DoBindTexImage2DCHROMIUM(
-      GLenum target,
-      GLint image_id);
-  void DoBindTexImage2DWithInternalformatCHROMIUM(GLenum target,
-                                                  GLenum internalformat,
-                                                  GLint image_id);
-  // Common implementation of DoBindTexImage2DCHROMIUM entry points.
-  void BindTexImage2DCHROMIUMImpl(const char* function_name,
-                                  GLenum target,
-                                  GLenum internalformat,
-                                  GLint image_id);
-  void DoReleaseTexImage2DCHROMIUM(
-      GLenum target,
-      GLint image_id);
 
   void DoTraceEndCHROMIUM(void);
 
@@ -19119,118 +19105,6 @@
                                        : gpu::gles2::Texture::UNBOUND);
 }
 
-void GLES2DecoderImpl::DoBindTexImage2DCHROMIUM(
-    GLenum target, GLint image_id) {
-  TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoBindTexImage2DCHROMIUM");
-
-  BindTexImage2DCHROMIUMImpl("glBindTexImage2DCHROMIUM", target, 0, image_id);
-}
-
-void GLES2DecoderImpl::DoBindTexImage2DWithInternalformatCHROMIUM(
-    GLenum target,
-    GLenum internalformat,
-    GLint image_id) {
-  TRACE_EVENT0("gpu",
-               "GLES2DecoderImpl::DoBindTexImage2DWithInternalformatCHROMIUM");
-
-  BindTexImage2DCHROMIUMImpl("glBindTexImage2DWithInternalformatCHROMIUM",
-                             target, internalformat, image_id);
-}
-
-void GLES2DecoderImpl::BindTexImage2DCHROMIUMImpl(const char* function_name,
-                                                  GLenum target,
-                                                  GLenum internalformat,
-                                                  GLint image_id) {
-  if (target == GL_TEXTURE_CUBE_MAP) {
-    LOCAL_SET_GL_ERROR(GL_INVALID_ENUM, function_name, "invalid target");
-    return;
-  }
-
-  // Default target might be conceptually valid, but disallow it to avoid
-  // accidents.
-  TextureRef* texture_ref =
-      texture_manager()->GetTextureInfoForTargetUnlessDefault(&state_, target);
-  if (!texture_ref) {
-    LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name, "no texture bound");
-    return;
-  }
-
-  gl::GLImage* image = image_manager()->LookupImage(image_id);
-  if (!image) {
-    LOCAL_SET_GL_ERROR(GL_INVALID_OPERATION, function_name,
-                       "no image found with the given ID");
-    return;
-  }
-
-  Texture::ImageState image_state = Texture::UNBOUND;
-
-  if (image->ShouldBindOrCopy() == gl::GLImage::BIND) {
-    ScopedGLErrorSuppressor suppressor(
-        "GLES2DecoderImpl::DoBindTexImage2DCHROMIUM", error_state_.get());
-
-    // Note: We fallback to using CopyTexImage() before the texture is used
-    // when BindTexImage() fails.
-    if (internalformat) {
-      if (image->BindTexImageWithInternalformat(target, internalformat))
-        image_state = Texture::BOUND;
-    } else {
-      if (image->BindTexImage(target))
-        image_state = Texture::BOUND;
-    }
-  }
-
-  gfx::Size size = image->GetSize();
-  GLenum texture_internalformat =
-      internalformat ? internalformat : image->GetInternalFormat();
-  texture_manager()->SetLevelInfo(texture_ref, target, 0,
-                                  texture_internalformat, size.width(),
-                                  size.height(), 1, 0, image->GetDataFormat(),
-                                  image->GetDataType(), gfx::Rect(size));
-  texture_manager()->SetLevelImage(texture_ref, target, 0, image, image_state);
-}
-
-void GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM(
-    GLenum target, GLint image_id) {
-  TRACE_EVENT0("gpu", "GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM");
-
-  // Default target might be conceptually valid, but disallow it to avoid
-  // accidents.
-  TextureRef* texture_ref =
-      texture_manager()->GetTextureInfoForTargetUnlessDefault(&state_, target);
-  if (!texture_ref) {
-    LOCAL_SET_GL_ERROR(
-        GL_INVALID_OPERATION,
-        "glReleaseTexImage2DCHROMIUM", "no texture bound");
-    return;
-  }
-
-  gl::GLImage* image = image_manager()->LookupImage(image_id);
-  if (!image) {
-    LOCAL_SET_GL_ERROR(
-        GL_INVALID_OPERATION,
-        "glReleaseTexImage2DCHROMIUM", "no image found with the given ID");
-    return;
-  }
-
-  Texture::ImageState image_state;
-
-  // Do nothing when image is not currently bound.
-  if (texture_ref->texture()->GetLevelImage(target, 0, &image_state) != image)
-    return;
-
-  if (image_state == Texture::BOUND) {
-    ScopedGLErrorSuppressor suppressor(
-        "GLES2DecoderImpl::DoReleaseTexImage2DCHROMIUM", error_state_.get());
-
-    image->ReleaseTexImage(target);
-    texture_manager()->SetLevelInfo(texture_ref, target, 0, GL_RGBA, 0, 0, 1, 0,
-                                    GL_RGBA, GL_UNSIGNED_BYTE, gfx::Rect());
-  }
-
-  texture_manager()->SetLevelImage(texture_ref, target, 0, nullptr,
-                                   Texture::UNBOUND);
-}
-
 error::Error GLES2DecoderImpl::HandleTraceBeginCHROMIUM(
     uint32_t immediate_data_size,
     const volatile void* cmd_data) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
index 85544c9..e1361c48 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
@@ -5026,64 +5026,6 @@
   return error::kNoError;
 }
 
-error::Error GLES2DecoderImpl::HandleBindTexImage2DCHROMIUM(
-    uint32_t immediate_data_size,
-    const volatile void* cmd_data) {
-  const volatile gles2::cmds::BindTexImage2DCHROMIUM& c =
-      *static_cast<const volatile gles2::cmds::BindTexImage2DCHROMIUM*>(
-          cmd_data);
-  GLenum target = static_cast<GLenum>(c.target);
-  GLint imageId = static_cast<GLint>(c.imageId);
-  if (!validators_->texture_bind_target.IsValid(target)) {
-    LOCAL_SET_GL_ERROR_INVALID_ENUM("glBindTexImage2DCHROMIUM", target,
-                                    "target");
-    return error::kNoError;
-  }
-  DoBindTexImage2DCHROMIUM(target, imageId);
-  return error::kNoError;
-}
-
-error::Error GLES2DecoderImpl::HandleBindTexImage2DWithInternalformatCHROMIUM(
-    uint32_t immediate_data_size,
-    const volatile void* cmd_data) {
-  const volatile gles2::cmds::BindTexImage2DWithInternalformatCHROMIUM& c =
-      *static_cast<const volatile gles2::cmds::
-                       BindTexImage2DWithInternalformatCHROMIUM*>(cmd_data);
-  GLenum target = static_cast<GLenum>(c.target);
-  GLenum internalformat = static_cast<GLenum>(c.internalformat);
-  GLint imageId = static_cast<GLint>(c.imageId);
-  if (!validators_->texture_bind_target.IsValid(target)) {
-    LOCAL_SET_GL_ERROR_INVALID_ENUM(
-        "glBindTexImage2DWithInternalformatCHROMIUM", target, "target");
-    return error::kNoError;
-  }
-  if (!validators_->texture_internal_format.IsValid(internalformat)) {
-    LOCAL_SET_GL_ERROR_INVALID_ENUM(
-        "glBindTexImage2DWithInternalformatCHROMIUM", internalformat,
-        "internalformat");
-    return error::kNoError;
-  }
-  DoBindTexImage2DWithInternalformatCHROMIUM(target, internalformat, imageId);
-  return error::kNoError;
-}
-
-error::Error GLES2DecoderImpl::HandleReleaseTexImage2DCHROMIUM(
-    uint32_t immediate_data_size,
-    const volatile void* cmd_data) {
-  const volatile gles2::cmds::ReleaseTexImage2DCHROMIUM& c =
-      *static_cast<const volatile gles2::cmds::ReleaseTexImage2DCHROMIUM*>(
-          cmd_data);
-  GLenum target = static_cast<GLenum>(c.target);
-  GLint imageId = static_cast<GLint>(c.imageId);
-  if (!validators_->texture_bind_target.IsValid(target)) {
-    LOCAL_SET_GL_ERROR_INVALID_ENUM("glReleaseTexImage2DCHROMIUM", target,
-                                    "target");
-    return error::kNoError;
-  }
-  DoReleaseTexImage2DCHROMIUM(target, imageId);
-  return error::kNoError;
-}
-
 error::Error GLES2DecoderImpl::HandleTraceEndCHROMIUM(
     uint32_t immediate_data_size,
     const volatile void* cmd_data) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
index 1ef96d7..5188aaa 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.cc
@@ -2978,52 +2978,6 @@
   return error::kNoError;
 }
 
-error::Error GLES2DecoderPassthroughImpl::BindTexImage2DCHROMIUMImpl(
-    GLenum target,
-    GLenum internalformat,
-    GLint imageId) {
-  TextureTarget target_enum = GLenumToTextureTarget(target);
-  if (target_enum == TextureTarget::kCubeMap ||
-      target_enum == TextureTarget::kUnkown) {
-    InsertError(GL_INVALID_ENUM, "Invalid target");
-    return error::kNoError;
-  }
-
-  gl::GLImage* image = group_->image_manager()->LookupImage(imageId);
-  if (image == nullptr) {
-    InsertError(GL_INVALID_OPERATION, "No image found with the given ID");
-    return error::kNoError;
-  }
-
-  const BoundTexture& bound_texture =
-      bound_textures_[static_cast<size_t>(target_enum)][active_texture_unit_];
-  if (bound_texture.texture == nullptr) {
-    InsertError(GL_INVALID_OPERATION, "No texture bound");
-    return error::kNoError;
-  }
-
-  if (image->ShouldBindOrCopy() == gl::GLImage::BIND) {
-    if (internalformat)
-      image->BindTexImageWithInternalformat(target, internalformat);
-    else
-      image->BindTexImage(target);
-  } else {
-    image->CopyTexImage(target);
-  }
-
-  // Target is already validated
-  UpdateTextureSizeFromTarget(target);
-
-  DCHECK(bound_texture.texture != nullptr);
-  bound_texture.texture->SetLevelImage(target, 0, image);
-
-  // If there was any GLImage bound to |target| on this texture unit, then
-  // forget it.
-  RemovePendingBindingTexture(target, active_texture_unit_);
-
-  return error::kNoError;
-}
-
 void GLES2DecoderPassthroughImpl::VerifyServiceTextureObjectsExist() {
   resources_->texture_object_map.ForEach(
       [this](GLuint client_id, scoped_refptr<TexturePassthrough> texture) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h
index 17c788e..5eeee8d 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough.h
@@ -469,10 +469,6 @@
   // up-to-date.
   void LazilyUpdateCurrentlyBoundElementArrayBuffer();
 
-  error::Error BindTexImage2DCHROMIUMImpl(GLenum target,
-                                          GLenum internalformat,
-                                          GLint image_id);
-
   void VerifyServiceTextureObjectsExist();
 
   bool IsEmulatedFramebufferBound(GLenum target) const;
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h
index 044308c..4ffa37d 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h
@@ -888,11 +888,6 @@
 error::Error DoBindUniformLocationCHROMIUM(GLuint program,
                                            GLint location,
                                            const char* name);
-error::Error DoBindTexImage2DCHROMIUM(GLenum target, GLint imageId);
-error::Error DoBindTexImage2DWithInternalformatCHROMIUM(GLenum target,
-                                                        GLenum internalformat,
-                                                        GLint imageId);
-error::Error DoReleaseTexImage2DCHROMIUM(GLenum target, GLint imageId);
 error::Error DoTraceBeginCHROMIUM(const char* category_name,
                                   const char* trace_name);
 error::Error DoTraceEndCHROMIUM();
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
index 59caeec..7894f4c6 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
@@ -4677,55 +4677,6 @@
   return error::kNoError;
 }
 
-error::Error GLES2DecoderPassthroughImpl::DoBindTexImage2DCHROMIUM(
-    GLenum target,
-    GLint imageId) {
-  return BindTexImage2DCHROMIUMImpl(target, 0, imageId);
-}
-
-error::Error
-GLES2DecoderPassthroughImpl::DoBindTexImage2DWithInternalformatCHROMIUM(
-    GLenum target,
-    GLenum internalformat,
-    GLint imageId) {
-  return BindTexImage2DCHROMIUMImpl(target, internalformat, imageId);
-}
-
-error::Error GLES2DecoderPassthroughImpl::DoReleaseTexImage2DCHROMIUM(
-    GLenum target,
-    GLint imageId) {
-  TextureTarget target_enum = GLenumToTextureTarget(target);
-  if (target_enum == TextureTarget::kCubeMap ||
-      target_enum == TextureTarget::kUnkown) {
-    InsertError(GL_INVALID_ENUM, "Invalid target");
-    return error::kNoError;
-  }
-
-  const BoundTexture& bound_texture =
-      bound_textures_[static_cast<size_t>(target_enum)][active_texture_unit_];
-  if (bound_texture.texture == nullptr) {
-    InsertError(GL_INVALID_OPERATION, "No texture bound");
-    return error::kNoError;
-  }
-
-  gl::GLImage* image = group_->image_manager()->LookupImage(imageId);
-  if (image == nullptr) {
-    InsertError(GL_INVALID_OPERATION, "No image found with the given ID");
-    return error::kNoError;
-  }
-
-  // Only release the image if it is currently bound
-  if (bound_texture.texture->GetLevelImage(target, 0) == image) {
-    image->ReleaseTexImage(target);
-    bound_texture.texture->SetLevelImage(target, 0, nullptr);
-  }
-
-  // Target is already validated
-  UpdateTextureSizeFromTarget(target);
-
-  return error::kNoError;
-}
-
 error::Error GLES2DecoderPassthroughImpl::DoTraceBeginCHROMIUM(
     const char* category_name,
     const char* trace_name) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc
index d24c1f3..ca1ab17 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc
@@ -4302,54 +4302,6 @@
   return error::kNoError;
 }
 
-error::Error GLES2DecoderPassthroughImpl::HandleBindTexImage2DCHROMIUM(
-    uint32_t immediate_data_size,
-    const volatile void* cmd_data) {
-  const volatile gles2::cmds::BindTexImage2DCHROMIUM& c =
-      *static_cast<const volatile gles2::cmds::BindTexImage2DCHROMIUM*>(
-          cmd_data);
-  GLenum target = static_cast<GLenum>(c.target);
-  GLint imageId = static_cast<GLint>(c.imageId);
-  error::Error error = DoBindTexImage2DCHROMIUM(target, imageId);
-  if (error != error::kNoError) {
-    return error;
-  }
-  return error::kNoError;
-}
-
-error::Error
-GLES2DecoderPassthroughImpl::HandleBindTexImage2DWithInternalformatCHROMIUM(
-    uint32_t immediate_data_size,
-    const volatile void* cmd_data) {
-  const volatile gles2::cmds::BindTexImage2DWithInternalformatCHROMIUM& c =
-      *static_cast<const volatile gles2::cmds::
-                       BindTexImage2DWithInternalformatCHROMIUM*>(cmd_data);
-  GLenum target = static_cast<GLenum>(c.target);
-  GLenum internalformat = static_cast<GLenum>(c.internalformat);
-  GLint imageId = static_cast<GLint>(c.imageId);
-  error::Error error = DoBindTexImage2DWithInternalformatCHROMIUM(
-      target, internalformat, imageId);
-  if (error != error::kNoError) {
-    return error;
-  }
-  return error::kNoError;
-}
-
-error::Error GLES2DecoderPassthroughImpl::HandleReleaseTexImage2DCHROMIUM(
-    uint32_t immediate_data_size,
-    const volatile void* cmd_data) {
-  const volatile gles2::cmds::ReleaseTexImage2DCHROMIUM& c =
-      *static_cast<const volatile gles2::cmds::ReleaseTexImage2DCHROMIUM*>(
-          cmd_data);
-  GLenum target = static_cast<GLenum>(c.target);
-  GLint imageId = static_cast<GLint>(c.imageId);
-  error::Error error = DoReleaseTexImage2DCHROMIUM(target, imageId);
-  if (error != error::kNoError) {
-    return error;
-  }
-  return error::kNoError;
-}
-
 error::Error GLES2DecoderPassthroughImpl::HandleTraceEndCHROMIUM(
     uint32_t immediate_data_size,
     const volatile void* cmd_data) {
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
index 8aa9a770..1ab9e6d 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.cc
@@ -1402,19 +1402,6 @@
   }
 }
 
-void GLES2DecoderTestBase::DoBindTexImage2DCHROMIUM(GLenum target,
-                                                    GLint image_id) {
-  cmds::BindTexImage2DCHROMIUM bind_tex_image_2d_cmd;
-  bind_tex_image_2d_cmd.Init(target, image_id);
-  EXPECT_CALL(*gl_, GetError())
-      .Times(AtMost(2))
-      .WillOnce(Return(GL_NO_ERROR))
-      .WillOnce(Return(GL_NO_ERROR))
-      .RetiresOnSaturation();
-  EXPECT_EQ(error::kNoError, ExecuteCmd(bind_tex_image_2d_cmd));
-  EXPECT_EQ(GL_NO_ERROR, GetGLError());
-}
-
 void GLES2DecoderTestBase::DoTexImage2D(GLenum target,
                                         GLint level,
                                         GLenum internal_format,
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h
index 7773b9f..db9c633 100644
--- a/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h
+++ b/gpu/command_buffer/service/gles2_cmd_decoder_unittest_base.h
@@ -343,7 +343,6 @@
                               GLint border,
                               GLsizei size,
                               uint32_t bucket_id);
-  void DoBindTexImage2DCHROMIUM(GLenum target, GLint image_id);
   void DoTexImage2D(GLenum target,
                     GLint level,
                     GLenum internal_format,
diff --git a/gpu/command_buffer/tests/decoder_perftest.cc b/gpu/command_buffer/tests/decoder_perftest.cc
index 8010a4e..47b3222 100644
--- a/gpu/command_buffer/tests/decoder_perftest.cc
+++ b/gpu/command_buffer/tests/decoder_perftest.cc
@@ -265,15 +265,6 @@
 
   const Capabilities& GetCapabilities() const override { return capabilities_; }
 
-  int32_t CreateImage(ClientBuffer buffer,
-                      size_t width,
-                      size_t height) override {
-    NOTIMPLEMENTED();
-    return -1;
-  }
-
-  void DestroyImage(int32_t id) override { NOTREACHED(); }
-
   void SignalQuery(uint32_t query, base::OnceClosure callback) override {
     NOTREACHED();
   }
diff --git a/gpu/command_buffer/tests/gl_manager.cc b/gpu/command_buffer/tests/gl_manager.cc
index 52f4a67..62d7145 100644
--- a/gpu/command_buffer/tests/gl_manager.cc
+++ b/gpu/command_buffer/tests/gl_manager.cc
@@ -497,69 +497,6 @@
   return capabilities_;
 }
 
-int32_t GLManager::CreateImage(ClientBuffer buffer,
-                               size_t width,
-                               size_t height) {
-  gfx::Size size(width, height);
-  scoped_refptr<gl::GLImage> gl_image;
-
-#if BUILDFLAG(IS_MAC)
-  if (use_iosurface_memory_buffers_) {
-    IOSurfaceGpuMemoryBuffer* gpu_memory_buffer =
-        IOSurfaceGpuMemoryBuffer::FromClientBuffer(buffer);
-    unsigned internalformat =
-        gl::BufferFormatToGLInternalFormat(gpu_memory_buffer->GetFormat());
-    const uint32_t io_surface_plane = 0;
-    scoped_refptr<gl::GLImageIOSurface> image(
-        gl::GLImageIOSurface::Create(size, internalformat));
-    if (!image->Initialize(gpu_memory_buffer->iosurface(), io_surface_plane,
-                           gfx::GenericSharedMemoryId(1),
-                           gfx::BufferFormat::BGRA_8888)) {
-      return -1;
-    }
-    gl_image = image;
-  }
-#endif  // BUILDFLAG(IS_MAC)
-
-  if (use_native_pixmap_memory_buffers_) {
-    gfx::GpuMemoryBuffer* gpu_memory_buffer =
-        reinterpret_cast<gfx::GpuMemoryBuffer*>(buffer);
-    DCHECK(gpu_memory_buffer);
-    if (gpu_memory_buffer->GetType() == gfx::NATIVE_PIXMAP) {
-      gfx::GpuMemoryBufferHandle handle = gpu_memory_buffer->CloneHandle();
-      gfx::BufferFormat format = gpu_memory_buffer->GetFormat();
-      gl_image =
-          gpu_memory_buffer_factory_->AsImageFactory()
-              ->CreateImageForGpuMemoryBuffer(
-                  std::move(handle), size, format, gfx::BufferPlane::DEFAULT,
-                  gpu::kDisplayCompositorClientId, gpu::kNullSurfaceHandle);
-      if (!gl_image)
-        return -1;
-    }
-  }
-
-  if (!gl_image) {
-    GpuMemoryBufferImpl* gpu_memory_buffer =
-        GpuMemoryBufferImpl::FromClientBuffer(buffer);
-
-    gfx::BufferFormat format = gpu_memory_buffer->GetFormat();
-    auto image = base::MakeRefCounted<gl::GLImageRefCountedMemory>(size);
-    if (!image->Initialize(gpu_memory_buffer->bytes(), format)) {
-      return -1;
-    }
-    gl_image = image;
-  }
-
-  static int32_t next_id = 1;
-  int32_t new_id = next_id++;
-  image_manager_.AddImage(gl_image.get(), new_id);
-  return new_id;
-}
-
-void GLManager::DestroyImage(int32_t id) {
-  image_manager_.RemoveImage(id);
-}
-
 void GLManager::SignalQuery(uint32_t query, base::OnceClosure callback) {
   NOTREACHED();
 }
diff --git a/gpu/command_buffer/tests/gl_manager.h b/gpu/command_buffer/tests/gl_manager.h
index 47d3743..f7a0894 100644
--- a/gpu/command_buffer/tests/gl_manager.h
+++ b/gpu/command_buffer/tests/gl_manager.h
@@ -145,10 +145,6 @@
   // GpuControl implementation.
   void SetGpuControlClient(GpuControlClient*) override;
   const Capabilities& GetCapabilities() const override;
-  int32_t CreateImage(ClientBuffer buffer,
-                      size_t width,
-                      size_t height) override;
-  void DestroyImage(int32_t id) override;
   void SignalQuery(uint32_t query, base::OnceClosure callback) override;
   void CreateGpuFence(uint32_t gpu_fence_id, ClientGpuFence source) override;
   void GetGpuFence(uint32_t gpu_fence_id,
diff --git a/gpu/gles2_conform_support/egl/context.cc b/gpu/gles2_conform_support/egl/context.cc
index c8cca8f2..ac5f5490 100644
--- a/gpu/gles2_conform_support/egl/context.cc
+++ b/gpu/gles2_conform_support/egl/context.cc
@@ -173,15 +173,6 @@
   return capabilities_;
 }
 
-int32_t Context::CreateImage(ClientBuffer buffer, size_t width, size_t height) {
-  NOTREACHED();
-  return -1;
-}
-
-void Context::DestroyImage(int32_t id) {
-  NOTREACHED();
-}
-
 void Context::SignalQuery(uint32_t query, base::OnceClosure callback) {
   NOTREACHED();
 }
diff --git a/gpu/gles2_conform_support/egl/context.h b/gpu/gles2_conform_support/egl/context.h
index edae298c..8850757 100644
--- a/gpu/gles2_conform_support/egl/context.h
+++ b/gpu/gles2_conform_support/egl/context.h
@@ -67,10 +67,6 @@
   // GpuControl implementation.
   void SetGpuControlClient(gpu::GpuControlClient*) override;
   const gpu::Capabilities& GetCapabilities() const override;
-  int32_t CreateImage(ClientBuffer buffer,
-                      size_t width,
-                      size_t height) override;
-  void DestroyImage(int32_t id) override;
   void SignalQuery(uint32_t query, base::OnceClosure callback) override;
   void CreateGpuFence(uint32_t gpu_fence_id, ClientGpuFence source) override;
   void GetGpuFence(uint32_t gpu_fence_id,
diff --git a/gpu/ipc/client/command_buffer_proxy_impl.cc b/gpu/ipc/client/command_buffer_proxy_impl.cc
index 0e20b901..15b5e13 100644
--- a/gpu/ipc/client/command_buffer_proxy_impl.cc
+++ b/gpu/ipc/client/command_buffer_proxy_impl.cc
@@ -405,70 +405,6 @@
   return capabilities_;
 }
 
-int32_t CommandBufferProxyImpl::CreateImage(ClientBuffer buffer,
-                                            size_t width,
-                                            size_t height) {
-  CheckLock();
-  base::AutoLock lock(last_state_lock_);
-  if (last_state_.error != gpu::error::kNoError)
-    return -1;
-
-  int32_t new_id = channel_->ReserveImageId();
-
-  gfx::GpuMemoryBuffer* gpu_memory_buffer =
-      reinterpret_cast<gfx::GpuMemoryBuffer*>(buffer);
-  DCHECK(gpu_memory_buffer);
-
-  // This handle is owned by the GPU process and must be passed to it or it
-  // will leak. In otherwords, do not early out on error between here and the
-  // sending of the CreateImage IPC below.
-  gfx::GpuMemoryBufferHandle handle = gpu_memory_buffer->CloneHandle();
-  bool requires_sync_token = handle.type == gfx::IO_SURFACE_BUFFER;
-
-  uint64_t image_fence_sync = 0;
-  if (requires_sync_token)
-    image_fence_sync = GenerateFenceSyncRelease();
-
-  DCHECK(gpu::IsImageFromGpuMemoryBufferFormatSupported(
-      gpu_memory_buffer->GetFormat(), capabilities_))
-      << gfx::BufferFormatToString(gpu_memory_buffer->GetFormat());
-  DCHECK(gpu::IsImageSizeValidForGpuMemoryBufferFormat(
-      gfx::Size(width, height), gpu_memory_buffer->GetFormat()))
-      << gfx::BufferFormatToString(gpu_memory_buffer->GetFormat());
-
-  auto params = mojom::CreateImageParams::New();
-  params->id = new_id;
-  params->gpu_memory_buffer = std::move(handle);
-  params->size = gfx::Size(width, height);
-  params->format = gpu_memory_buffer->GetFormat();
-  params->plane = gfx::BufferPlane::DEFAULT;
-  params->image_release_count = image_fence_sync;
-  command_buffer_->CreateImage(std::move(params));
-
-  if (image_fence_sync) {
-    gpu::SyncToken sync_token(GetNamespaceID(), GetCommandBufferID(),
-                              image_fence_sync);
-
-    // Force a synchronous IPC to validate sync token.
-    EnsureWorkVisible();
-    sync_token.SetVerifyFlush();
-
-    gpu_memory_buffer_manager_->SetDestructionSyncToken(gpu_memory_buffer,
-                                                        sync_token);
-  }
-
-  return new_id;
-}
-
-void CommandBufferProxyImpl::DestroyImage(int32_t id) {
-  CheckLock();
-  base::AutoLock lock(last_state_lock_);
-  if (last_state_.error != gpu::error::kNoError)
-    return;
-
-  command_buffer_->DestroyImage(id);
-}
-
 void CommandBufferProxyImpl::SetLock(base::Lock* lock) {
   lock_ = lock;
 }
diff --git a/gpu/ipc/client/command_buffer_proxy_impl.h b/gpu/ipc/client/command_buffer_proxy_impl.h
index f8203533..16cb8202 100644
--- a/gpu/ipc/client/command_buffer_proxy_impl.h
+++ b/gpu/ipc/client/command_buffer_proxy_impl.h
@@ -125,10 +125,6 @@
   // gpu::GpuControl implementation:
   void SetGpuControlClient(GpuControlClient* client) override;
   const gpu::Capabilities& GetCapabilities() const override;
-  int32_t CreateImage(ClientBuffer buffer,
-                      size_t width,
-                      size_t height) override;
-  void DestroyImage(int32_t id) override;
   void SignalQuery(uint32_t query, base::OnceClosure callback) override;
   void CreateGpuFence(uint32_t gpu_fence_id, ClientGpuFence source) override;
   void GetGpuFence(uint32_t gpu_fence_id,
diff --git a/gpu/ipc/common/gpu_channel.mojom b/gpu/ipc/common/gpu_channel.mojom
index ca6f51ad..20ad182 100644
--- a/gpu/ipc/common/gpu_channel.mojom
+++ b/gpu/ipc/common/gpu_channel.mojom
@@ -237,15 +237,6 @@
   ReleaseSysmemBufferCollection(mojo_base.mojom.UnguessableToken id);
 };
 
-struct CreateImageParams {
-  int32 id;
-  gfx.mojom.GpuMemoryBufferHandle gpu_memory_buffer;
-  gfx.mojom.Size size;
-  gfx.mojom.BufferFormat format;
-  gfx.mojom.BufferPlane plane;
-  uint64 image_release_count;
-};
-
 // Interface used to issue commands to a specific CommandBuffer instance in the
 // GPU process.
 interface CommandBuffer {
@@ -266,17 +257,6 @@
   // Requests retrieval of a GpuFenceHandle by ID.
   GetGpuFenceHandle(uint32 id) => (gfx.mojom.GpuFenceHandle? fence_handle);
 
-  // Creates an image from an existing gpu memory buffer. The id that can be
-  // used to identify the image from a command buffer.
-  //
-  // TODO(crbug.com/1216120): Remove this once CreateImageCHROMIUM is gone.
-  CreateImage(CreateImageParams params);
-
-  // Destroys a previously created image identified by `id`.
-  //
-  // TODO(crbug.com/1216120): Remove this once CreateImageCHROMIUM is gone.
-  DestroyImage(int32 id);
-
   // Asynchronously waits until the SyncToken is signaled, then sends a
   // corresponding SignalAck on the CommandBufferClient interface, using
   // `signal_id` to identify this request.
diff --git a/gpu/ipc/in_process_command_buffer.cc b/gpu/ipc/in_process_command_buffer.cc
index d0bb708..e3e1352 100644
--- a/gpu/ipc/in_process_command_buffer.cc
+++ b/gpu/ipc/in_process_command_buffer.cc
@@ -96,8 +96,6 @@
 
 namespace {
 
-base::AtomicSequenceNumber g_next_image_id;
-
 template <typename T>
 base::OnceClosure WrapTaskWithResult(base::OnceCallback<T(void)> task,
                                      T* result,
@@ -1064,118 +1062,6 @@
   return task_executor_->gpu_feature_info();
 }
 
-int32_t InProcessCommandBuffer::CreateImage(ClientBuffer buffer,
-                                            size_t width,
-                                            size_t height) {
-  DCHECK(gpu_memory_buffer_manager_);
-  gfx::GpuMemoryBuffer* gpu_memory_buffer =
-      reinterpret_cast<gfx::GpuMemoryBuffer*>(buffer);
-  DCHECK(gpu_memory_buffer);
-
-  int32_t new_id = g_next_image_id.GetNext() + 1;
-
-  DCHECK(IsImageFromGpuMemoryBufferFormatSupported(
-      gpu_memory_buffer->GetFormat(), capabilities_));
-
-  // This handle is owned by the GPU thread and must be passed to it or it
-  // will leak. In otherwords, do not early out on error between here and the
-  // queuing of the CreateImage task below.
-  gfx::GpuMemoryBufferHandle handle = gpu_memory_buffer->CloneHandle();
-  bool requires_sync_point = handle.type == gfx::IO_SURFACE_BUFFER;
-
-  uint64_t fence_sync = 0;
-  if (requires_sync_point)
-    fence_sync = GenerateFenceSyncRelease();
-
-  ScheduleGpuTask(base::BindOnce(
-      &InProcessCommandBuffer::CreateImageOnGpuThread,
-      gpu_thread_weak_ptr_factory_.GetWeakPtr(), new_id, std::move(handle),
-      gfx::Size(base::checked_cast<int>(width),
-                base::checked_cast<int>(height)),
-      gpu_memory_buffer->GetFormat(), fence_sync));
-
-  if (fence_sync) {
-    SyncToken sync_token(GetNamespaceID(), GetCommandBufferID(), fence_sync);
-    sync_token.SetVerifyFlush();
-    gpu_memory_buffer_manager_->SetDestructionSyncToken(gpu_memory_buffer,
-                                                        sync_token);
-  }
-
-  return new_id;
-}
-
-void InProcessCommandBuffer::CreateImageOnGpuThread(
-    int32_t id,
-    gfx::GpuMemoryBufferHandle handle,
-    const gfx::Size& size,
-    gfx::BufferFormat format,
-    uint64_t fence_sync) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(gpu_sequence_checker_);
-  gles2::ImageManager* image_manager = task_executor_->image_manager();
-  DCHECK(image_manager);
-  if (image_manager->LookupImage(id)) {
-    LOG(ERROR) << "Image already exists with same ID.";
-    return;
-  }
-
-  switch (handle.type) {
-    case gfx::SHARED_MEMORY_BUFFER: {
-      if (!base::IsValueInRangeForNumericType<size_t>(handle.stride)) {
-        LOG(ERROR) << "Invalid stride for image.";
-        return;
-      }
-      auto image = base::MakeRefCounted<gl::GLImageSharedMemory>(size);
-      if (!image->Initialize(handle.region, handle.id, format, handle.offset,
-                             handle.stride)) {
-        LOG(ERROR) << "Failed to initialize image.";
-        return;
-      }
-
-      image_manager->AddImage(image.get(), id);
-      break;
-    }
-    default: {
-      if (!image_factory_) {
-        LOG(ERROR) << "Image factory missing but required by buffer type.";
-        return;
-      }
-
-      scoped_refptr<gl::GLImage> image =
-          image_factory_->CreateImageForGpuMemoryBuffer(
-              std::move(handle), size, format, gfx::BufferPlane::DEFAULT,
-              kDisplayCompositorClientId, kNullSurfaceHandle);
-      if (!image.get()) {
-        LOG(ERROR) << "Failed to create image for buffer.";
-        return;
-      }
-
-      image_manager->AddImage(image.get(), id);
-      break;
-    }
-  }
-
-  if (fence_sync)
-    sync_point_client_state_->ReleaseFenceSync(fence_sync);
-}
-
-void InProcessCommandBuffer::DestroyImage(int32_t id) {
-  ScheduleGpuTask(
-      base::BindOnce(&InProcessCommandBuffer::DestroyImageOnGpuThread,
-                     gpu_thread_weak_ptr_factory_.GetWeakPtr(), id));
-}
-
-void InProcessCommandBuffer::DestroyImageOnGpuThread(int32_t id) {
-  DCHECK_CALLED_ON_VALID_SEQUENCE(gpu_sequence_checker_);
-  gles2::ImageManager* image_manager = task_executor_->image_manager();
-  DCHECK(image_manager);
-  if (!image_manager->LookupImage(id)) {
-    LOG(ERROR) << "Image with ID doesn't exist.";
-    return;
-  }
-
-  image_manager->RemoveImage(id);
-}
-
 void InProcessCommandBuffer::OnConsoleMessage(int32_t id,
                                               const std::string& message) {
   // TODO(piman): implement this.
diff --git a/gpu/ipc/in_process_command_buffer.h b/gpu/ipc/in_process_command_buffer.h
index 20b099d..fd2bac4 100644
--- a/gpu/ipc/in_process_command_buffer.h
+++ b/gpu/ipc/in_process_command_buffer.h
@@ -61,7 +61,6 @@
 
 namespace gfx {
 struct GpuFenceHandle;
-class Size;
 }
 
 namespace ui {
@@ -153,10 +152,6 @@
   void SetGpuControlClient(GpuControlClient*) override;
   // GetCapabilities() can be called on any thread.
   const Capabilities& GetCapabilities() const override;
-  int32_t CreateImage(ClientBuffer buffer,
-                      size_t width,
-                      size_t height) override;
-  void DestroyImage(int32_t id) override;
   void SignalQuery(uint32_t query_id, base::OnceClosure callback) override;
   void CreateGpuFence(uint32_t gpu_fence_id, ClientGpuFence source) override;
   void GetGpuFence(uint32_t gpu_fence_id,
@@ -327,13 +322,6 @@
                                          scoped_refptr<Buffer> buffer);
   void DestroyTransferBufferOnGpuThread(int32_t id);
 
-  void CreateImageOnGpuThread(int32_t id,
-                              gfx::GpuMemoryBufferHandle handle,
-                              const gfx::Size& size,
-                              gfx::BufferFormat format,
-                              uint64_t fence_sync);
-  void DestroyImageOnGpuThread(int32_t id);
-
   void SetGetBufferOnGpuThread(int32_t shm_id, base::WaitableEvent* completion);
 
   void CreateGpuFenceOnGpuThread(uint32_t gpu_fence_id,
diff --git a/gpu/ipc/service/command_buffer_stub.cc b/gpu/ipc/service/command_buffer_stub.cc
index 0c08d33a..e62d3ecc 100644
--- a/gpu/ipc/service/command_buffer_stub.cc
+++ b/gpu/ipc/service/command_buffer_stub.cc
@@ -545,14 +545,6 @@
   std::move(callback).Run(gfx::GpuFenceHandle());
 }
 
-void CommandBufferStub::CreateImage(mojom::CreateImageParamsPtr params) {
-  DLOG(ERROR) << "CreateImage unsupported.";
-}
-
-void CommandBufferStub::DestroyImage(int32_t id) {
-  DLOG(ERROR) << "DestroyImage unsupported.";
-}
-
 void CommandBufferStub::OnDestroyTransferBuffer(int32_t id) {
   TRACE_EVENT0("gpu", "CommandBufferStub::OnDestroyTransferBuffer");
 
diff --git a/gpu/ipc/service/command_buffer_stub.h b/gpu/ipc/service/command_buffer_stub.h
index 7d3c6b01..2f06894 100644
--- a/gpu/ipc/service/command_buffer_stub.h
+++ b/gpu/ipc/service/command_buffer_stub.h
@@ -217,8 +217,6 @@
                                 gfx::GpuFenceHandle handle) override;
   void GetGpuFenceHandle(uint32_t id,
                          GetGpuFenceHandleCallback callback) override;
-  void CreateImage(mojom::CreateImageParamsPtr params) override;
-  void DestroyImage(int32_t id) override;
   void SignalSyncToken(const SyncToken& sync_token, uint32_t id) override;
   void SignalQuery(uint32_t query, uint32_t id) override;
   void BindMediaReceiver(mojo::GenericPendingAssociatedReceiver receiver,
diff --git a/gpu/ipc/service/gles2_command_buffer_stub.cc b/gpu/ipc/service/gles2_command_buffer_stub.cc
index edbb14e..4529e2b1 100644
--- a/gpu/ipc/service/gles2_command_buffer_stub.cc
+++ b/gpu/ipc/service/gles2_command_buffer_stub.cc
@@ -503,68 +503,6 @@
   std::move(callback).Run(std::move(handle));
 }
 
-void GLES2CommandBufferStub::CreateImage(mojom::CreateImageParamsPtr params) {
-  TRACE_EVENT0("gpu", "GLES2CommandBufferStub::OnCreateImage");
-  const int32_t id = params->id;
-  const gfx::Size& size = params->size;
-  const gfx::BufferFormat& format = params->format;
-  const gfx::BufferPlane& plane = params->plane;
-  const uint64_t image_release_count = params->image_release_count;
-  ScopedContextOperation operation(*this);
-  if (!operation.is_context_current())
-    return;
-
-  gles2::ImageManager* image_manager = channel_->image_manager();
-  DCHECK(image_manager);
-  if (image_manager->LookupImage(id)) {
-    LOG(ERROR) << "Image already exists with same ID.";
-    return;
-  }
-
-  if (!gpu::IsImageFromGpuMemoryBufferFormatSupported(
-          format, gles2_decoder_->GetCapabilities())) {
-    LOG(ERROR) << "Format is not supported.";
-    return;
-  }
-
-  if (!gpu::IsImageSizeValidForGpuMemoryBufferFormat(size, format)) {
-    LOG(ERROR) << "Invalid image size for format.";
-    return;
-  }
-
-  if (!gpu::IsPlaneValidForGpuMemoryBufferFormat(plane, format)) {
-    LOG(ERROR) << "Invalid plane " << gfx::BufferPlaneToString(plane) << " for "
-               << gfx::BufferFormatToString(format);
-    return;
-  }
-
-  scoped_refptr<gl::GLImage> image = channel()->CreateImageForGpuMemoryBuffer(
-      std::move(params->gpu_memory_buffer), size, format, plane,
-      surface_handle_);
-  if (!image.get())
-    return;
-
-  image_manager->AddImage(image.get(), id);
-  if (image_release_count)
-    sync_point_client_state_->ReleaseFenceSync(image_release_count);
-}
-
-void GLES2CommandBufferStub::DestroyImage(int32_t id) {
-  TRACE_EVENT0("gpu", "GLES2CommandBufferStub::OnDestroyImage");
-  ScopedContextOperation operation(*this);
-  if (!operation.is_context_current())
-    return;
-
-  gles2::ImageManager* image_manager = channel_->image_manager();
-  DCHECK(image_manager);
-  if (!image_manager->LookupImage(id)) {
-    LOG(ERROR) << "Image with ID doesn't exist.";
-    return;
-  }
-
-  image_manager->RemoveImage(id);
-}
-
 void GLES2CommandBufferStub::OnSwapBuffers(uint64_t swap_id, uint32_t flags) {
   pending_swap_completed_params_.push_back({swap_id, flags});
   pending_presented_params_.push_back({swap_id, flags});
diff --git a/gpu/ipc/service/gles2_command_buffer_stub.h b/gpu/ipc/service/gles2_command_buffer_stub.h
index 28c0b1b..ee8ef7e 100644
--- a/gpu/ipc/service/gles2_command_buffer_stub.h
+++ b/gpu/ipc/service/gles2_command_buffer_stub.h
@@ -68,8 +68,6 @@
                                 gfx::GpuFenceHandle handle) override;
   void GetGpuFenceHandle(uint32_t gpu_fence_id,
                          GetGpuFenceHandleCallback callback) override;
-  void CreateImage(mojom::CreateImageParamsPtr params) override;
-  void DestroyImage(int32_t id) override;
 
   void OnSwapBuffers(uint64_t swap_id, uint32_t flags) override;
 
diff --git a/gpu/ipc/service/gpu_memory_buffer_factory_io_surface.h b/gpu/ipc/service/gpu_memory_buffer_factory_io_surface.h
index 73153f6f..bdc39b7 100644
--- a/gpu/ipc/service/gpu_memory_buffer_factory_io_surface.h
+++ b/gpu/ipc/service/gpu_memory_buffer_factory_io_surface.h
@@ -77,8 +77,7 @@
   typedef std::unordered_map<IOSurfaceMapKey,
                              base::ScopedCFTypeRef<IOSurfaceRef>>
       IOSurfaceMap;
-  // TODO(reveman): Remove |io_surfaces_| and allow IOSurface backed GMBs to be
-  // used with any GPU process by passing a mach_port to CreateImageCHROMIUM.
+
   IOSurfaceMap io_surfaces_;
   base::Lock io_surfaces_lock_;
 };
diff --git a/infra/config/generated/builders/ci/android-archive-dbg/properties.json b/infra/config/generated/builders/ci/android-archive-dbg/properties.json
index 4209457..415ccdc 100644
--- a/infra/config/generated/builders/ci/android-archive-dbg/properties.json
+++ b/infra/config/generated/builders/ci/android-archive-dbg/properties.json
@@ -1,4 +1,50 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "android-archive-dbg",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "builder_group": "chromium",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_android_config": {
+                "config": "main_builder"
+              },
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "clobber",
+                  "mb"
+                ],
+                "build_config": "Debug",
+                "config": "android",
+                "target_arch": "arm",
+                "target_platform": "android"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "android",
+                  "enable_reclient"
+                ],
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "android-archive-dbg",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
   "$build/reclient": {
     "instance": "rbe-chromium-trusted",
     "jobs": 500,
diff --git a/infra/config/generated/builders/ci/android-archive-rel/properties.json b/infra/config/generated/builders/ci/android-archive-rel/properties.json
index c4f72cd..5295ac5 100644
--- a/infra/config/generated/builders/ci/android-archive-rel/properties.json
+++ b/infra/config/generated/builders/ci/android-archive-rel/properties.json
@@ -7,6 +7,58 @@
       "android-archive-rel.json"
     ]
   },
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "android-archive-rel",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "builder_group": "chromium",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_android_config": {
+                "config": "main_builder"
+              },
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "clobber",
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "android",
+                "target_arch": "arm",
+                "target_platform": "android"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "android",
+                  "enable_reclient"
+                ],
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "android-archive-rel",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "android_archive_rel_ng",
+          "group": "tryserver.chromium.android"
+        }
+      ]
+    }
+  },
   "$build/reclient": {
     "instance": "rbe-chromium-trusted",
     "jobs": 500,
diff --git a/infra/config/generated/builders/ci/linux-archive-dbg/properties.json b/infra/config/generated/builders/ci/linux-archive-dbg/properties.json
index 4209457..9ed7c93 100644
--- a/infra/config/generated/builders/ci/linux-archive-dbg/properties.json
+++ b/infra/config/generated/builders/ci/linux-archive-dbg/properties.json
@@ -1,4 +1,45 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "linux-archive-dbg",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "builder_group": "chromium",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "clobber",
+                  "mb"
+                ],
+                "build_config": "Debug",
+                "config": "chromium",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "enable_reclient"
+                ],
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "linux-archive-dbg",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
   "$build/reclient": {
     "instance": "rbe-chromium-trusted",
     "jobs": 500,
diff --git a/infra/config/generated/builders/ci/win-archive-rel/properties.json b/infra/config/generated/builders/ci/win-archive-rel/properties.json
index 9b3f89d..ff9172e 100644
--- a/infra/config/generated/builders/ci/win-archive-rel/properties.json
+++ b/infra/config/generated/builders/ci/win-archive-rel/properties.json
@@ -7,6 +7,50 @@
       "win-archive-rel.json"
     ]
   },
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "win-archive-rel",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "builder_group": "chromium",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "clobber",
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "win-archive-rel",
+          "project": "chromium"
+        }
+      ],
+      "mirroring_builder_group_and_names": [
+        {
+          "builder": "win_x64_archive",
+          "group": "tryserver.chromium.win"
+        }
+      ]
+    }
+  },
   "$build/reclient": {
     "instance": "rbe-chromium-trusted",
     "jobs": 250,
diff --git a/infra/config/generated/builders/try/android_archive_rel_ng/properties.json b/infra/config/generated/builders/try/android_archive_rel_ng/properties.json
index d90599c..2a16c590 100644
--- a/infra/config/generated/builders/try/android_archive_rel_ng/properties.json
+++ b/infra/config/generated/builders/try/android_archive_rel_ng/properties.json
@@ -1,4 +1,50 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "android-archive-rel",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "builder_group": "chromium",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_android_config": {
+                "config": "main_builder"
+              },
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "clobber",
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "android",
+                "target_arch": "arm",
+                "target_platform": "android"
+              },
+              "legacy_gclient_config": {
+                "apply_configs": [
+                  "android",
+                  "enable_reclient"
+                ],
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "android-archive-rel",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
   "$build/goma": {
     "enable_ats": true,
     "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/builders/try/win_x64_archive/properties.json b/infra/config/generated/builders/try/win_x64_archive/properties.json
index d4fde02b..ad875c4 100644
--- a/infra/config/generated/builders/try/win_x64_archive/properties.json
+++ b/infra/config/generated/builders/try/win_x64_archive/properties.json
@@ -1,4 +1,42 @@
 {
+  "$build/chromium_tests_builder_config": {
+    "builder_config": {
+      "builder_db": {
+        "entries": [
+          {
+            "builder_id": {
+              "bucket": "ci",
+              "builder": "win-archive-rel",
+              "project": "chromium"
+            },
+            "builder_spec": {
+              "builder_group": "chromium",
+              "execution_mode": "COMPILE_AND_TEST",
+              "legacy_chromium_config": {
+                "apply_configs": [
+                  "clobber",
+                  "mb"
+                ],
+                "build_config": "Release",
+                "config": "chromium",
+                "target_bits": 64
+              },
+              "legacy_gclient_config": {
+                "config": "chromium"
+              }
+            }
+          }
+        ]
+      },
+      "builder_ids": [
+        {
+          "bucket": "ci",
+          "builder": "win-archive-rel",
+          "project": "chromium"
+        }
+      ]
+    }
+  },
   "$build/goma": {
     "enable_ats": false,
     "rpc_extra_params": "?prod",
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg
index 2e4631bd..9ddb2d7 100644
--- a/infra/config/generated/luci/cr-buildbucket.cfg
+++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -71502,7 +71502,7 @@
       dimensions: "builderless:1"
       dimensions: "cores:32"
       dimensions: "cpu:x86-64"
-      dimensions: "os:Ubuntu-14.04"
+      dimensions: "os:Ubuntu-18.04"
       dimensions: "pool:luci.chromium.try"
       dimensions: "ssd:0"
       exe {
diff --git a/infra/config/subprojects/chromium/ci/chromium.star b/infra/config/subprojects/chromium/ci/chromium.star
index 6f6de85..1b58024 100644
--- a/infra/config/subprojects/chromium/ci/chromium.star
+++ b/infra/config/subprojects/chromium/ci/chromium.star
@@ -40,6 +40,28 @@
 
 ci.builder(
     name = "android-archive-dbg",
+    builder_spec = builder_config.builder_spec(
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+            apply_configs = [
+                "android",
+                "enable_reclient",
+            ],
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "android",
+            apply_configs = [
+                "clobber",
+                "mb",
+            ],
+            build_config = builder_config.build_config.DEBUG,
+            target_platform = builder_config.target_platform.ANDROID,
+            target_arch = builder_config.target_arch.ARM,
+        ),
+        android_config = builder_config.android_config(
+            config = "main_builder",
+        ),
+    ),
     # Bump to 32 if needed.
     console_view_entry = consoles.console_view_entry(
         category = "android",
@@ -56,6 +78,28 @@
 
 ci.builder(
     name = "android-archive-rel",
+    builder_spec = builder_config.builder_spec(
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+            apply_configs = [
+                "android",
+                "enable_reclient",
+            ],
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "android",
+            apply_configs = [
+                "clobber",
+                "mb",
+            ],
+            build_config = builder_config.build_config.RELEASE,
+            target_platform = builder_config.target_platform.ANDROID,
+            target_arch = builder_config.target_arch.ARM,
+        ),
+        android_config = builder_config.android_config(
+            config = "main_builder",
+        ),
+    ),
     console_view_entry = consoles.console_view_entry(
         category = "android",
         short_name = "rel",
@@ -171,6 +215,23 @@
 
 ci.builder(
     name = "linux-archive-dbg",
+    builder_spec = builder_config.builder_spec(
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+            apply_configs = [
+                "enable_reclient",
+            ],
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium",
+            apply_configs = [
+                "clobber",
+                "mb",
+            ],
+            build_config = builder_config.build_config.DEBUG,
+            target_bits = 64,
+        ),
+    ),
     console_view_entry = consoles.console_view_entry(
         category = "linux",
         short_name = "dbg",
@@ -440,6 +501,20 @@
 
 ci.builder(
     name = "win-archive-rel",
+    builder_spec = builder_config.builder_spec(
+        gclient_config = builder_config.gclient_config(
+            config = "chromium",
+        ),
+        chromium_config = builder_config.chromium_config(
+            config = "chromium",
+            apply_configs = [
+                "clobber",
+                "mb",
+            ],
+            build_config = builder_config.build_config.RELEASE,
+            target_bits = 64,
+        ),
+    ),
     console_view_entry = consoles.console_view_entry(
         category = "win|rel",
         short_name = "64",
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
index c29cadc5..96007e4 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
@@ -439,6 +439,9 @@
 
 try_.builder(
     name = "android_archive_rel_ng",
+    mirrors = [
+        "ci/android-archive-rel",
+    ],
 )
 
 try_.builder(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
index 47d0a99..78fcef7 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.linux.star
@@ -604,9 +604,7 @@
     # This builder produces the clang binaries used on all builders. Since it
     # uses the system's sysroot when compiling, the builder needs to run on the
     # OS version that's the oldest used on any bot.
-    # TODO(crbug.com/1199405): Move this to bionic once _all_ builders have
-    # migrated.
-    os = os.LINUX_TRUSTY,
+    os = os.LINUX_BIONIC,
     notifies = ["chrome-rust-toolchain"],
 )
 
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.win.star b/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
index ae7898c7..a0132c5 100644
--- a/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
+++ b/infra/config/subprojects/chromium/try/tryserver.chromium.win.star
@@ -108,6 +108,9 @@
 
 try_.builder(
     name = "win_x64_archive",
+    mirrors = [
+        "ci/win-archive-rel",
+    ],
 )
 
 try_.builder(
diff --git a/infra/orchestrator/BUILD.gn b/infra/orchestrator/BUILD.gn
index 2f0e184..40df940 100644
--- a/infra/orchestrator/BUILD.gn
+++ b/infra/orchestrator/BUILD.gn
@@ -21,16 +21,20 @@
   # Test specs the Orchestrator needs to trigger swarming tests
   data = [ "//testing/buildbot/*.json" ]
 
-  # coverage tool for the Orchestrator to merge and output coverage data
+  # Orchestrator will run this script to curl for the coverage tool, which
+  # merges and outputs coverage data
   if (use_clang_coverage) {
     data += [
+      "//tools/clang/scripts/update.py",
+
+      # TODO(kimstephanie): Remove once orchestrator recipe is updated to run
+      # tools/clang/scripts/update.py instead
       "//third_party/llvm-build/Release+Asserts/bin/llvm-cov",
       "//third_party/llvm-build/Release+Asserts/bin/llvm-profdata",
       "//third_party/llvm-build/Release+Asserts/lib",
     ]
   }
-  write_runtime_deps =
-      "$root_out_dir/orchestrator_all.runtime_deps"
+  write_runtime_deps = "$root_out_dir/orchestrator_all.runtime_deps"
 }
 
 # blink merge scripts pydeps files for the Orchestrator
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd
index 1a8efa4..fe89826 100644
--- a/ios/chrome/app/strings/ios_strings.grd
+++ b/ios/chrome/app/strings/ios_strings.grd
@@ -175,7 +175,7 @@
         Choose an Account
       </message>
       <message name="IDS_IOS_ACCOUNT_UNIFIED_CONSENT_TITLE" desc="Title on the sync consent dialog to explain why sync can be useful for the user. [iOS only]">
-        Turn on sync?
+        Turn On Sync?
       </message>
       <message name="IDS_IOS_SYNC_PROMO_TURN_ON_SYNC" desc="Button that the user can press if they want to turn on sync with this account. [iOS only]">
         Turn On Sync
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ACCOUNT_UNIFIED_CONSENT_TITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ACCOUNT_UNIFIED_CONSENT_TITLE.png.sha1
index 00cbd17..71638f4e 100644
--- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ACCOUNT_UNIFIED_CONSENT_TITLE.png.sha1
+++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_ACCOUNT_UNIFIED_CONSENT_TITLE.png.sha1
@@ -1 +1 @@
-b63102438325c11e56bb2768e34e683ca6a0cfba
\ No newline at end of file
+ffaf0973dff03cecaddfda9607fecacfc1089f4b
\ No newline at end of file
diff --git a/ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider.mm b/ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider.mm
index 7caeae22..51bd9b9 100644
--- a/ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider.mm
+++ b/ios/chrome/browser/metrics/mobile_session_shutdown_metrics_provider.mm
@@ -191,9 +191,8 @@
       return;
   };
 
-  UMA_STABILITY_HISTOGRAM_ENUMERATION(
-      "Stability.iOS.Experimental.Counts", type,
-      IOSStabilityUserVisibleCrashType::kMaxValue);
+  UMA_STABILITY_HISTOGRAM_ENUMERATION("Stability.iOS.Experimental.Counts2",
+                                      type);
 }
 
 // Logs |type| in the shutdown type histogram.
diff --git a/ios/chrome/browser/snapshots/snapshot_browser_agent.h b/ios/chrome/browser/snapshots/snapshot_browser_agent.h
index 0159cc27..2e52ddaa 100644
--- a/ios/chrome/browser/snapshots/snapshot_browser_agent.h
+++ b/ios/chrome/browser/snapshots/snapshot_browser_agent.h
@@ -14,16 +14,15 @@
 @class SnapshotCache;
 
 // Associates a SnapshotCache to a Browser.
-class SnapshotBrowserAgent : BrowserObserver,
+class SnapshotBrowserAgent : public BrowserObserver,
                              public WebStateListObserver,
                              public BrowserUserData<SnapshotBrowserAgent> {
  public:
-  SnapshotBrowserAgent();
-  ~SnapshotBrowserAgent() override;
-
   SnapshotBrowserAgent(const SnapshotBrowserAgent&) = delete;
   SnapshotBrowserAgent& operator=(const SnapshotBrowserAgent&) = delete;
 
+  ~SnapshotBrowserAgent() override;
+
   // Set a session identification string that will be used to locate the
   // snapshots directory. Setting this more than once on the same agent is
   // probably a programming error.
diff --git a/ios/chrome/browser/ui/omnibox/popup/autocomplete_result_consumer.h b/ios/chrome/browser/ui/omnibox/popup/autocomplete_result_consumer.h
index ba1f7fd..a745953 100644
--- a/ios/chrome/browser/ui/omnibox/popup/autocomplete_result_consumer.h
+++ b/ios/chrome/browser/ui/omnibox/popup/autocomplete_result_consumer.h
@@ -50,8 +50,7 @@
 // `preselectedMatchGroupIndex` is the section selected by default when no row
 // is highlighted.
 - (void)updateMatches:(NSArray<id<AutocompleteSuggestionGroup>>*)result
-    preselectedMatchGroupIndex:(NSInteger)groupIndex
-                 withAnimation:(BOOL)animation;
+    preselectedMatchGroupIndex:(NSInteger)groupIndex;
 
 // Sets the text alignment of the popup content.
 - (void)setTextAlignment:(NSTextAlignment)alignment;
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_mediator.h b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_mediator.h
index 8b76fc8c..c16d5e6 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_mediator.h
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_mediator.h
@@ -51,19 +51,10 @@
 // Whether the mediator has results to show.
 @property(nonatomic, assign) BOOL hasResults;
 
-- (void)updateMatches:(const AutocompleteResult&)result
-        withAnimation:(BOOL)animated;
-
-// Sets the text alignment of the popup content.
-- (void)setTextAlignment:(NSTextAlignment)alignment;
-
 // Sets the semantic content attribute of the popup content.
 - (void)setSemanticContentAttribute:
     (UISemanticContentAttribute)semanticContentAttribute;
 
-// Updates the popup with the |results|.
-- (void)updateWithResults:(const AutocompleteResult&)results;
-
 @property(nonatomic, weak) id<BrowserCommands> dispatcher;
 @property(nonatomic, weak) id<AutocompleteResultConsumer> consumer;
 // Scheduler to notify about events happening in this popup.
@@ -91,8 +82,7 @@
                   faviconLoader:(FaviconLoader*)faviconLoader
                        delegate:(OmniboxPopupMediatorDelegate*)delegate;
 
-- (void)updateMatches:(const AutocompleteResult&)result
-        withAnimation:(BOOL)animated;
+- (void)updateMatches:(const AutocompleteResult&)result;
 
 // Sets the text alignment of the popup content.
 - (void)setTextAlignment:(NSTextAlignment)alignment;
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_mediator.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_mediator.mm
index 6a3098f..ba5f456a 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_mediator.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_mediator.mm
@@ -63,8 +63,7 @@
   return self;
 }
 
-- (void)updateMatches:(const AutocompleteResult&)result
-        withAnimation:(BOOL)animation {
+- (void)updateMatches:(const AutocompleteResult&)result {
   _currentResult.Reset();
   _currentResult.CopyFrom(result);
 
@@ -75,8 +74,7 @@
   [self.consumer updateMatches:@[ [AutocompleteSuggestionGroupImpl
                                    groupWithTitle:nil
                                       suggestions:matches] ]
-      preselectedMatchGroupIndex:0
-                   withAnimation:animation];
+      preselectedMatchGroupIndex:0];
 
   [self loadModelImages];
 }
@@ -103,17 +101,8 @@
 }
 
 - (void)updateWithResults:(const AutocompleteResult&)result {
-  if (!self.open && !result.empty()) {
-    // The popup is not currently open and there are results to display. Update
-    // and animate the cells
-    [self updateMatches:result withAnimation:YES];
-  } else {
-    // The popup is already displayed or there are no results to display. Update
-    // the cells without animating.
-    [self updateMatches:result withAnimation:NO];
-  }
+  [self updateMatches:result];
   self.open = !result.empty();
-
   [self.presenter updatePopup];
 }
 
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm
index 74a208ef9..76fea53f 100644
--- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm
@@ -154,8 +154,7 @@
 #pragma mark - AutocompleteResultConsumer
 
 - (void)updateMatches:(NSArray<id<AutocompleteSuggestionGroup>>*)result
-    preselectedMatchGroupIndex:(NSInteger)groupIndex
-                 withAnimation:(BOOL)animation {
+    preselectedMatchGroupIndex:(NSInteger)groupIndex {
   self.forwardsScrollEvents = NO;
   // Reset highlight state.
   if (self.highlightedIndexPath) {
diff --git a/ios/chrome/browser/ui/omnibox/popup/pedal_section_extractor.mm b/ios/chrome/browser/ui/omnibox/popup/pedal_section_extractor.mm
index 8df1a4f..3b767ee 100644
--- a/ios/chrome/browser/ui/omnibox/popup/pedal_section_extractor.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/pedal_section_extractor.mm
@@ -50,8 +50,7 @@
 #pragma mark - AutocompleteResultConsumer
 
 - (void)updateMatches:(NSArray<id<AutocompleteSuggestionGroup>>*)result
-    preselectedMatchGroupIndex:(NSInteger)groupIndex
-                 withAnimation:(BOOL)animation {
+    preselectedMatchGroupIndex:(NSInteger)groupIndex {
   NSMutableArray* extractedPedals = [[NSMutableArray alloc] init];
   self.highlightedPedalIndex = NSNotFound;
   self.originalResult = result;
@@ -70,9 +69,7 @@
     // If no pedals, display old pedal for a duration of `kPedalDebouceTimer`
     // with new suggestion. This avoids pedal flickering because the pedal
     // results are async. (cf. crbug.com/1316404).
-    [self updateMatchesWithPedals:self.extractedPedals
-                  suggestionGroup:result
-                        animation:animation];
+    [self updateMatchesWithPedals:self.extractedPedals suggestionGroup:result];
     if (!self.removePedalsTimer) {
       self.removePedalsTimer =
           [NSTimer scheduledTimerWithTimeInterval:kPedalDebouceTimer
@@ -89,9 +86,7 @@
 
   self.extractedPedals = extractedPedals;
 
-  [self updateMatchesWithPedals:extractedPedals
-                suggestionGroup:result
-                      animation:animation];
+  [self updateMatchesWithPedals:extractedPedals suggestionGroup:result];
 }
 
 - (void)setTextAlignment:(NSTextAlignment)alignment {
@@ -220,8 +215,7 @@
 // to avoid pedal flickering.
 - (void)removePedals:(NSTimer*)timer {
   [self.dataSink updateMatches:self.originalResult
-      preselectedMatchGroupIndex:0
-                   withAnimation:NO];
+      preselectedMatchGroupIndex:0];
 
   self.extractedPedals = nil;
   self.removePedalsTimer = nil;
@@ -232,12 +226,9 @@
 - (void)updateMatchesWithPedals:
             (NSArray<id<OmniboxPedal, OmniboxIcon>>*)extractedPedals
                 suggestionGroup:
-                    (NSArray<id<AutocompleteSuggestionGroup>>*)result
-                      animation:(BOOL)animation {
+                    (NSArray<id<AutocompleteSuggestionGroup>>*)result {
   if (extractedPedals.count == 0) {
-    [self.dataSink updateMatches:result
-        preselectedMatchGroupIndex:0
-                     withAnimation:animation];
+    [self.dataSink updateMatches:result preselectedMatchGroupIndex:0];
     return;
   }
 
@@ -255,8 +246,7 @@
   const NSInteger suggestionGroupIndexInCombinedGroups = 1;
 
   [self.dataSink updateMatches:combinedGroups
-      preselectedMatchGroupIndex:suggestionGroupIndexInCombinedGroups
-                   withAnimation:animation];
+      preselectedMatchGroupIndex:suggestionGroupIndexInCombinedGroups];
 }
 
 @end
diff --git a/ios/chrome/browser/ui/omnibox/popup/pedal_section_extractor_unittest.mm b/ios/chrome/browser/ui/omnibox/popup/pedal_section_extractor_unittest.mm
index 2f19c12..8db6087 100644
--- a/ios/chrome/browser/ui/omnibox/popup/pedal_section_extractor_unittest.mm
+++ b/ios/chrome/browser/ui/omnibox/popup/pedal_section_extractor_unittest.mm
@@ -60,13 +60,9 @@
       [AutocompleteSuggestionGroupImpl groupWithTitle:@""
                                           suggestions:@[ mockSuggestion ]];
 
-  [[data_sink_ expect] updateMatches:@[ group ]
-          preselectedMatchGroupIndex:0
-                       withAnimation:NO];
+  [[data_sink_ expect] updateMatches:@[ group ] preselectedMatchGroupIndex:0];
 
-  [extractor_ updateMatches:@[ group ]
-      preselectedMatchGroupIndex:0
-                   withAnimation:NO];
+  [extractor_ updateMatches:@[ group ] preselectedMatchGroupIndex:0];
 
   [data_sink_ verify];
 }
@@ -103,12 +99,9 @@
   };
 
   [[[data_sink_ stub] andDo:verifyGroups] updateMatches:[OCMArg any]
-                             preselectedMatchGroupIndex:1
-                                          withAnimation:NO];
+                             preselectedMatchGroupIndex:1];
 
-  [extractor_ updateMatches:@[ group ]
-      preselectedMatchGroupIndex:0
-                   withAnimation:NO];
+  [extractor_ updateMatches:@[ group ] preselectedMatchGroupIndex:0];
 
   [data_sink_ verify];
 }
@@ -132,12 +125,8 @@
 
   // Showing a result with pedals passes a pedal to the sink.
 
-  [[data_sink_ expect] updateMatches:[OCMArg any]
-          preselectedMatchGroupIndex:1
-                       withAnimation:NO];
-  [extractor_ updateMatches:@[ group ]
-      preselectedMatchGroupIndex:0
-                   withAnimation:NO];
+  [[data_sink_ expect] updateMatches:[OCMArg any] preselectedMatchGroupIndex:1];
+  [extractor_ updateMatches:@[ group ] preselectedMatchGroupIndex:0];
   [data_sink_ verify];
 
   AutocompleteSuggestionGroupImpl* groupNoPedals =
@@ -147,19 +136,14 @@
 
   // Updating with no pedals continues to pass a pedal to the sink.
 
-  [[data_sink_ expect] updateMatches:[OCMArg any]
-          preselectedMatchGroupIndex:1
-                       withAnimation:NO];
-  [extractor_ updateMatches:@[ groupNoPedals ]
-      preselectedMatchGroupIndex:0
-                   withAnimation:NO];
+  [[data_sink_ expect] updateMatches:[OCMArg any] preselectedMatchGroupIndex:1];
+  [extractor_ updateMatches:@[ groupNoPedals ] preselectedMatchGroupIndex:0];
 
   [data_sink_ verify];
 
   // Expect pedal removal when debounce timer expires
   [[data_sink_ expect] updateMatches:@[ groupNoPedals ]
-          preselectedMatchGroupIndex:0
-                       withAnimation:NO];
+          preselectedMatchGroupIndex:0];
 
   // Wait for debounce to happen
   Wait(1);
@@ -167,11 +151,8 @@
 
   // Now updating from no pedals to no pedals, nothing happens
   [[data_sink_ expect] updateMatches:@[ groupNoPedals ]
-          preselectedMatchGroupIndex:0
-                       withAnimation:NO];
-  [extractor_ updateMatches:@[ groupNoPedals ]
-      preselectedMatchGroupIndex:0
-                   withAnimation:NO];
+          preselectedMatchGroupIndex:0];
+  [extractor_ updateMatches:@[ groupNoPedals ] preselectedMatchGroupIndex:0];
 
   [data_sink_ verify];
 
@@ -226,11 +207,8 @@
            suggestions:@[ mockSuggestionNoPedal, mockSuggestionWithPedal ]];
 
     [[data_sink_ expect] updateMatches:[OCMArg any]
-            preselectedMatchGroupIndex:1
-                         withAnimation:NO];
-    [extractor_ updateMatches:@[ group ]
-        preselectedMatchGroupIndex:0
-                     withAnimation:NO];
+            preselectedMatchGroupIndex:1];
+    [extractor_ updateMatches:@[ group ] preselectedMatchGroupIndex:0];
   }
 
   OCMockObject<OmniboxPedal>* mock_pedal_;
diff --git a/ios/chrome/browser/ui/omnibox/popup/shared/gradient_text_view.swift b/ios/chrome/browser/ui/omnibox/popup/shared/gradient_text_view.swift
index 7e544adb..1e6ebcb 100644
--- a/ios/chrome/browser/ui/omnibox/popup/shared/gradient_text_view.swift
+++ b/ios/chrome/browser/ui/omnibox/popup/shared/gradient_text_view.swift
@@ -17,6 +17,11 @@
 
 /// A text view that clips long strings with a gradient mask.
 struct GradientTextView: View {
+  enum Dimensions {
+    /// When the text size variations are less than this value, they are ignored
+    /// so as to avoid triggering to many SwiftUI rendering cycles.
+    static let epsilon: CGFloat = 1.0
+  }
 
   // Text to be displayed.
   let text: NSAttributedString
@@ -45,10 +50,9 @@
     return NSLocale.characterDirection(forLanguage: languageCode as String) == .leftToRight
   }
 
-  /// True when the string doesn't fit into the text view and needs to be truncated and masked.
-  @State var truncated: Bool = false
-  /// Content text height as measured at rendering. Used to resize the container to not exceed the height of the text.
-  @State var textHeight: CGFloat = 0
+  /// Content text size as measured at rendering. Used to resize the container to not exceed the height of the text,
+  /// as well as detecting when the text needs to be truncated.
+  @State var textSize: CGSize = .zero
 
   var gradient: LinearGradient {
 
@@ -68,7 +72,6 @@
   }
 
   var body: some View {
-
     // This is equivalent to left/right since the locale is ignored below.
     let alignment: Alignment = isTextLTR ? .leading : .trailing
 
@@ -85,25 +88,29 @@
             geometry[bounds].size
           }
           .onPreferenceChange(SizePreferenceKey.self) { newSize in
-            truncated = newSize.width > geometry.size.width
-            textHeight = newSize.height
+            let textSizeChangedSufficiently =
+              abs(textSize.width - newSize.width) > Dimensions.epsilon
+              || abs(textSize.height - newSize.height) > Dimensions.epsilon
+            if textSizeChangedSufficiently {
+              textSize = newSize
+            }
           }
 
         // Wrap the text in a container with a fixed frame. The `text` is rendered
         // at fixedSize inside of it, therefore this acts as a way to clip it.
         let contents = VStack { text }
-          .frame(width: geometry.size.width, height: textHeight, alignment: alignment)
+          .frame(width: geometry.size.width, alignment: alignment)
           // Force LTR layout direction to prevent incorrect behavior in RTL locales.
           // The goal is to deal with the text language, not the user's locale.
           .environment(\.layoutDirection, .leftToRight)
 
+        let truncated = textSize.width > geometry.size.width
         if truncated {
           contents.mask(gradient)
         } else {
           contents
         }
-      }.frame(height: textHeight)
-
-    }
+      }
+    }.frame(height: textSize.height)
   }
 }
diff --git a/ios/chrome/browser/ui/omnibox/popup/shared/popup_match_row_view.swift b/ios/chrome/browser/ui/omnibox/popup/shared/popup_match_row_view.swift
index bef7a37d..9c7a190 100644
--- a/ios/chrome/browser/ui/omnibox/popup/shared/popup_match_row_view.swift
+++ b/ios/chrome/browser/ui/omnibox/popup/shared/popup_match_row_view.swift
@@ -19,7 +19,6 @@
     static let actionButtonOuterPadding = EdgeInsets(top: 2, leading: 0, bottom: 2, trailing: 0)
     static let leadingSpacing: CGFloat = 60
     static let minHeight: CGFloat = 58
-    static let maxHeight: CGFloat = 320
     static let padding = EdgeInsets(top: 9, leading: 0, bottom: 9, trailing: 16)
   }
 
@@ -146,7 +145,7 @@
       }
       .padding(Dimensions.padding)
     }
-    .frame(maxWidth: .infinity, minHeight: Dimensions.minHeight, maxHeight: Dimensions.maxHeight)
+    .frame(maxWidth: .infinity, minHeight: Dimensions.minHeight)
   }
 
   var backgroundColor: Color {
diff --git a/ios/chrome/browser/ui/omnibox/popup/shared/popup_model.swift b/ios/chrome/browser/ui/omnibox/popup/shared/popup_model.swift
index 21e9fb5..d6189cc9 100644
--- a/ios/chrome/browser/ui/omnibox/popup/shared/popup_model.swift
+++ b/ios/chrome/browser/ui/omnibox/popup/shared/popup_model.swift
@@ -40,8 +40,7 @@
   // MARK: AutocompleteResultConsumer
 
   public func updateMatches(
-    _ matchGroups: [AutocompleteSuggestionGroup], preselectedMatchGroupIndex: NSInteger,
-    withAnimation: Bool
+    _ matchGroups: [AutocompleteSuggestionGroup], preselectedMatchGroupIndex: NSInteger
   ) {
     // Reset highlight state.
     self.highlightedMatchIndexPath = nil
diff --git a/ios/chrome/browser/ui/popup_menu/BUILD.gn b/ios/chrome/browser/ui/popup_menu/BUILD.gn
index e539ca4..80ecdcfa 100644
--- a/ios/chrome/browser/ui/popup_menu/BUILD.gn
+++ b/ios/chrome/browser/ui/popup_menu/BUILD.gn
@@ -89,6 +89,7 @@
     "//ios/chrome/browser/ui/icons:action_icons",
     "//ios/chrome/browser/ui/icons:symbols",
     "//ios/chrome/browser/ui/list_model",
+    "//ios/chrome/browser/ui/popup_menu:metrics_protocols",
     "//ios/chrome/browser/ui/popup_menu/cells",
     "//ios/chrome/browser/ui/popup_menu/overflow_menu",
     "//ios/chrome/browser/ui/popup_menu/overflow_menu:feature_flags",
@@ -127,6 +128,11 @@
   ]
 }
 
+source_set("metrics_protocols") {
+  configs += [ "//build/config/compiler:enable_arc" ]
+  sources = [ "popup_menu_metrics_handler.h" ]
+}
+
 source_set("unit_tests") {
   testonly = true
 
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/BUILD.gn b/ios/chrome/browser/ui/popup_menu/overflow_menu/BUILD.gn
index c76b74a..58daff47 100644
--- a/ios/chrome/browser/ui/popup_menu/overflow_menu/BUILD.gn
+++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/BUILD.gn
@@ -66,6 +66,7 @@
     "//ios/chrome/browser/ui/default_promo:utils",
     "//ios/chrome/browser/ui/follow",
     "//ios/chrome/browser/ui/popup_menu:constants",
+    "//ios/chrome/browser/ui/popup_menu:metrics_protocols",
     "//ios/chrome/browser/ui/util",
     "//ios/chrome/browser/web",
     "//ios/chrome/browser/web/font_size",
@@ -104,6 +105,7 @@
   deps = [
     "//base",
     "//ios/chrome/app/strings:ios_strings_grit",
+    "//ios/chrome/browser/ui/popup_menu:metrics_protocols",
     "//ios/chrome/common/ui/colors:swift",
   ]
 
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_action_list.swift b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_action_list.swift
index bd453fa..7eb93339 100644
--- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_action_list.swift
+++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_action_list.swift
@@ -16,12 +16,20 @@
   /// The list of action groups for this view.
   var actionGroups: [OverflowMenuActionGroup]
 
+  /// The metrics handler to alert when the user takes metrics actions.
+  weak var metricsHandler: PopupMenuMetricsHandler?
+
   var body: some View {
     List {
       ForEach(actionGroups) { actionGroup in
-        OverflowMenuActionSection(actionGroup: actionGroup)
+        OverflowMenuActionSection(actionGroup: actionGroup, metricsHandler: metricsHandler)
       }
     }
+    .simultaneousGesture(
+      DragGesture().onChanged({ _ in
+        metricsHandler?.popupMenuScrolled()
+      })
+    )
     .accessibilityIdentifier(kPopupMenuToolsMenuActionListId)
     .listStyle(InsetGroupedListStyle())
     // Allow sections to have very small headers controlling section spacing.
@@ -29,3 +37,25 @@
     .environment(\.defaultMinListRowHeight, Constants.minimumRowHeight)
   }
 }
+
+/// Calls `onScroll` when the user performs a drag gesture over the content of the list.
+struct ListScrollDetectionModifier: ViewModifier {
+  let onScroll: () -> Void
+  func body(content: Content) -> some View {
+    content
+      // For some reason, without this, user interaction is not forwarded to the list.
+      .onTapGesture(perform: {})
+      // Long press gestures are dismissed and `onPressingChanged` called with
+      // `pressing` equal to `false` when the user performs a drag gesture
+      // over the content, hence why this works. `DragGesture` cannot be used
+      // here, even with a `simultaneousGesture` modifier, because it prevents
+      // swipe-to-delete from correctly triggering within the list.
+      .onLongPressGesture(
+        perform: {},
+        onPressingChanged: { pressing in
+          if !pressing {
+            onScroll()
+          }
+        })
+  }
+}
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_action_row.swift b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_action_row.swift
index 63f5012..818e532 100644
--- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_action_row.swift
+++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_action_row.swift
@@ -11,9 +11,14 @@
   /// The action for this row.
   @ObservedObject var action: OverflowMenuAction
 
+  weak var metricsHandler: PopupMenuMetricsHandler?
+
   var body: some View {
     Button(
-      action: action.handler,
+      action: {
+        metricsHandler?.popupMenuTookAction()
+        action.handler()
+      },
       label: {
         HStack {
           Text(action.name).lineLimit(1)
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_action_section.swift b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_action_section.swift
index bf1def3..9ab16c4 100644
--- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_action_section.swift
+++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_action_section.swift
@@ -16,11 +16,13 @@
 
   @ObservedObject var actionGroup: OverflowMenuActionGroup
 
+  weak var metricsHandler: PopupMenuMetricsHandler?
+
   var body: some View {
     Section(
       content: {
         ForEach(actionGroup.actions) { action in
-          OverflowMenuActionRow(action: action)
+          OverflowMenuActionRow(action: action, metricsHandler: metricsHandler)
         }
       },
       header: {
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_destination_list.swift b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_destination_list.swift
index b97b632..0500f91 100644
--- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_destination_list.swift
+++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_destination_list.swift
@@ -44,6 +44,8 @@
   /// The destinations for this view.
   var destinations: [OverflowMenuDestination]
 
+  weak var metricsHandler: PopupMenuMetricsHandler?
+
   var body: some View {
     GeometryReader { geometry in
       ScrollView(.horizontal, showsIndicators: false) {
@@ -61,7 +63,8 @@
           LazyHStack(alignment: alignment, spacing: 0) {
             ForEach(destinations) { destination in
               OverflowMenuDestinationView(
-                destination: destination, layoutParameters: layoutParameters)
+                destination: destination, layoutParameters: layoutParameters,
+                metricsHandler: metricsHandler)
             }
           }
         }
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_destination_view.swift b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_destination_view.swift
index 2efd550..091687e 100644
--- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_destination_view.swift
+++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_destination_view.swift
@@ -46,6 +46,8 @@
   /// The layout parameters for this view.
   var layoutParameters: OverflowMenuDestinationView.LayoutParameters
 
+  weak var metricsHandler: PopupMenuMetricsHandler?
+
   func makeBody(configuration: Configuration) -> some View {
     Group {
       switch layoutParameters {
@@ -164,9 +166,14 @@
   /// The layout parameters for this view.
   var layoutParameters: LayoutParameters
 
+  weak var metricsHandler: PopupMenuMetricsHandler?
+
   var body: some View {
     Button(
-      action: destination.handler,
+      action: {
+        metricsHandler?.popupMenuTookAction()
+        destination.handler()
+      },
       label: {
         EmptyView()
       }
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_swift_bridge.h b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_swift_bridge.h
index e8750ea..0c8dc95 100644
--- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_swift_bridge.h
+++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_swift_bridge.h
@@ -11,6 +11,7 @@
 #include "ios/chrome/grit/ios_strings.h"
 
 #import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h"
+#import "ios/chrome/browser/ui/popup_menu/popup_menu_metrics_handler.h"
 #include "ui/base/l10n/l10n_util_mac_bridge.h"
 
 #include "ios/chrome/common/ui/colors/swift_bridge.h"
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_view.swift b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_view.swift
index 9989dcdd..dc172fb74 100644
--- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_view.swift
+++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_view.swift
@@ -10,7 +10,10 @@
     static let destinationListHeight: CGFloat = 123
   }
 
-  @EnvironmentObject var model: OverflowMenuModel
+  var model: OverflowMenuModel
+
+  weak var metricsHandler: PopupMenuMetricsHandler?
+
   var body: some View {
     VStack(
       alignment: .leading,
@@ -18,10 +21,10 @@
       // include proper spacing.
       spacing: 0
     ) {
-      OverflowMenuDestinationList(destinations: model.destinations)
+      OverflowMenuDestinationList(destinations: model.destinations, metricsHandler: metricsHandler)
         .frame(height: Dimensions.destinationListHeight)
       Divider()
-      OverflowMenuActionList(actionGroups: model.actionGroups)
+      OverflowMenuActionList(actionGroups: model.actionGroups, metricsHandler: metricsHandler)
     }.background(Color(.systemGroupedBackground).edgesIgnoringSafeArea(.all))
   }
 }
diff --git a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_view_provider.swift b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_view_provider.swift
index 6de34374..2c16f8e 100644
--- a/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_view_provider.swift
+++ b/ios/chrome/browser/ui/popup_menu/overflow_menu/overflow_menu_view_provider.swift
@@ -9,7 +9,10 @@
 // necessary because Objective C can't see SwiftUI types.
 @available(iOS 15, *)
 @objcMembers public class OverflowMenuViewProvider: NSObject {
-  public static func makeViewController(withModel model: OverflowMenuModel) -> UIViewController {
-    return OverflowMenuHostingController(rootView: OverflowMenuView().environmentObject(model))
+  public static func makeViewController(
+    withModel model: OverflowMenuModel, metricsHandler: PopupMenuMetricsHandler
+  ) -> UIViewController {
+    return OverflowMenuHostingController(
+      rootView: OverflowMenuView(model: model, metricsHandler: metricsHandler))
   }
 }
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm b/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm
index 4a397c7..36db1877 100644
--- a/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.mm
@@ -5,6 +5,7 @@
 #import "ios/chrome/browser/ui/popup_menu/popup_menu_coordinator.h"
 
 #include "base/check.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/metrics/histogram_macros.h"
 #include "base/metrics/user_metrics.h"
 #include "base/metrics/user_metrics_action.h"
@@ -32,6 +33,7 @@
 #import "ios/chrome/browser/ui/popup_menu/popup_menu_action_handler.h"
 #import "ios/chrome/browser/ui/popup_menu/popup_menu_constants.h"
 #import "ios/chrome/browser/ui/popup_menu/popup_menu_mediator.h"
+#import "ios/chrome/browser/ui/popup_menu/popup_menu_metrics_handler.h"
 #import "ios/chrome/browser/ui/popup_menu/public/popup_menu_presenter.h"
 #import "ios/chrome/browser/ui/popup_menu/public/popup_menu_presenter_delegate.h"
 #import "ios/chrome/browser/ui/popup_menu/public/popup_menu_table_view_controller.h"
@@ -56,9 +58,21 @@
     return PopupMenuCommandTypeToolsMenu;
   return PopupMenuCommandTypeDefault;
 }
+
+// Enum for IOS.OverflowMenu.ActionType histogram.
+// Entries should not be renumbered and numeric values should never be reused.
+enum class IOSOverflowMenuActionType {
+  kNoScrollNoAction = 0,
+  kScrollNoAction = 1,
+  kNoScrollAction = 2,
+  kScrollAction = 3,
+  kMaxValue = kScrollAction,
+};
+
 }  // namespace
 
 @interface PopupMenuCoordinator () <PopupMenuCommands,
+                                    PopupMenuMetricsHandler,
                                     PopupMenuPresenterDelegate,
                                     UIPopoverPresentationControllerDelegate,
                                     UISheetPresentationControllerDelegate>
@@ -79,6 +93,13 @@
 // Time when the presentation of the popup menu is requested.
 @property(nonatomic, assign) NSTimeInterval requestStartTime;
 
+// Time when the tools menu opened.
+@property(nonatomic, assign) NSTimeInterval toolsMenuOpenTime;
+// Whether the tools menu was scrolled while it was open.
+@property(nonatomic, assign) BOOL toolsMenuWasScrolled;
+// Whether the user took an action on the tools menu while it was open.
+@property(nonatomic, assign) BOOL toolsMenuUserTookAction;
+
 @end
 
 @implementation PopupMenuCoordinator
@@ -154,6 +175,34 @@
 
 - (void)dismissPopupMenuAnimated:(BOOL)animated {
   [self.UIUpdater updateUIForMenuDismissed];
+
+  if (self.toolsMenuOpenTime != 0) {
+    base::TimeDelta elapsed = base::Seconds(
+        [NSDate timeIntervalSinceReferenceDate] - self.toolsMenuOpenTime);
+    UMA_HISTOGRAM_MEDIUM_TIMES("IOS.OverflowMenu.TimeOpen", elapsed);
+    // Reset the start time to ensure that whatever happens, we only record
+    // this once.
+    self.toolsMenuOpenTime = 0;
+
+    IOSOverflowMenuActionType actionType;
+    if (self.toolsMenuWasScrolled) {
+      if (self.toolsMenuUserTookAction) {
+        actionType = IOSOverflowMenuActionType::kScrollAction;
+      } else {
+        actionType = IOSOverflowMenuActionType::kScrollNoAction;
+      }
+    } else {
+      if (self.toolsMenuUserTookAction) {
+        actionType = IOSOverflowMenuActionType::kNoScrollAction;
+      } else {
+        actionType = IOSOverflowMenuActionType::kNoScrollNoAction;
+      }
+    }
+    base::UmaHistogramEnumeration("IOS.OverflowMenu.ActionType", actionType);
+    self.toolsMenuWasScrolled = NO;
+    self.toolsMenuUserTookAction = NO;
+  }
+
   if (self.overflowMenuMediator) {
     [self.baseViewController dismissViewControllerAnimated:animated
                                                 completion:nil];
@@ -206,6 +255,24 @@
   [self dismissPopupMenuAnimated:NO];
 }
 
+#pragma mark - UISheetPresentationControllerDelegate
+
+- (void)sheetPresentationControllerDidChangeSelectedDetentIdentifier:
+    (UISheetPresentationController*)sheetPresentationController
+    API_AVAILABLE(ios(15)) {
+  [self popupMenuScrolled];
+}
+
+#pragma mark - PopupMenuMetricsHandler
+
+- (void)popupMenuScrolled {
+  self.toolsMenuWasScrolled = YES;
+}
+
+- (void)popupMenuTookAction {
+  self.toolsMenuUserTookAction = YES;
+}
+
 #pragma mark - Notification callback
 
 - (void)applicationDidEnterBackground:(NSNotification*)note {
@@ -264,85 +331,93 @@
 
   // Create the overflow menu mediator first so the popup mediator isn't created
   // if not needed.
-  if (type == PopupMenuTypeToolsMenu && IsNewOverflowMenuEnabled()) {
-    if (@available(iOS 15, *)) {
-      self.overflowMenuMediator = [[OverflowMenuMediator alloc] init];
-      self.overflowMenuMediator.dispatcher =
-          static_cast<id<ApplicationCommands, BrowserCommands,
-                         FindInPageCommands, TextZoomCommands>>(
-              self.browser->GetCommandDispatcher());
-      self.overflowMenuMediator.webStateList = self.browser->GetWebStateList();
-      self.overflowMenuMediator.navigationAgent =
-          WebNavigationBrowserAgent::FromBrowser(self.browser);
-      self.overflowMenuMediator.baseViewController = self.baseViewController;
-      self.overflowMenuMediator.isIncognito =
-          self.browser->GetBrowserState()->IsOffTheRecord();
-      self.overflowMenuMediator.bookmarkModel =
-          ios::BookmarkModelFactory::GetForBrowserState(
-              self.browser->GetBrowserState());
-      self.overflowMenuMediator.prefService =
-          self.browser->GetBrowserState()->GetPrefs();
-      self.overflowMenuMediator.engagementTracker =
-          feature_engagement::TrackerFactory::GetForBrowserState(
-              self.browser->GetBrowserState());
-      self.overflowMenuMediator.webContentAreaOverlayPresenter =
-          overlayPresenter;
-      self.overflowMenuMediator.browserPolicyConnector =
-          GetApplicationContext()->GetBrowserPolicyConnector();
+  if (type == PopupMenuTypeToolsMenu) {
+    self.toolsMenuOpenTime = [NSDate timeIntervalSinceReferenceDate];
+    self.toolsMenuWasScrolled = NO;
+    self.toolsMenuUserTookAction = NO;
+    if (IsNewOverflowMenuEnabled()) {
+      if (@available(iOS 15, *)) {
+        self.overflowMenuMediator = [[OverflowMenuMediator alloc] init];
+        self.overflowMenuMediator.dispatcher =
+            static_cast<id<ApplicationCommands, BrowserCommands,
+                           FindInPageCommands, TextZoomCommands>>(
+                self.browser->GetCommandDispatcher());
+        self.overflowMenuMediator.webStateList =
+            self.browser->GetWebStateList();
+        self.overflowMenuMediator.navigationAgent =
+            WebNavigationBrowserAgent::FromBrowser(self.browser);
+        self.overflowMenuMediator.baseViewController = self.baseViewController;
+        self.overflowMenuMediator.isIncognito =
+            self.browser->GetBrowserState()->IsOffTheRecord();
+        self.overflowMenuMediator.bookmarkModel =
+            ios::BookmarkModelFactory::GetForBrowserState(
+                self.browser->GetBrowserState());
+        self.overflowMenuMediator.prefService =
+            self.browser->GetBrowserState()->GetPrefs();
+        self.overflowMenuMediator.engagementTracker =
+            feature_engagement::TrackerFactory::GetForBrowserState(
+                self.browser->GetBrowserState());
+        self.overflowMenuMediator.webContentAreaOverlayPresenter =
+            overlayPresenter;
+        self.overflowMenuMediator.browserPolicyConnector =
+            GetApplicationContext()->GetBrowserPolicyConnector();
 
-      if (IsWebChannelsEnabled()) {
-        self.overflowMenuMediator.followActionState = GetFollowActionState(
-            self.browser->GetWebStateList()->GetActiveWebState());
-        ios::GetChromeBrowserProvider()
-            .GetFollowProvider()
-            ->SetFollowEventDelegate(self.browser);
-      } else {
-        self.overflowMenuMediator.followActionState = FollowActionStateHidden;
+        if (IsWebChannelsEnabled()) {
+          self.overflowMenuMediator.followActionState = GetFollowActionState(
+              self.browser->GetWebStateList()->GetActiveWebState());
+          ios::GetChromeBrowserProvider()
+              .GetFollowProvider()
+              ->SetFollowEventDelegate(self.browser);
+        } else {
+          self.overflowMenuMediator.followActionState = FollowActionStateHidden;
+        }
+
+        self.contentBlockerMediator.consumer = self.overflowMenuMediator;
+
+        UIViewController* menu = [OverflowMenuViewProvider
+            makeViewControllerWithModel:self.overflowMenuMediator
+                                            .overflowMenuModel
+                         metricsHandler:self];
+
+        NamedGuide* guide =
+            [NamedGuide guideWithName:guideName
+                                 view:self.baseViewController.view];
+        menu.modalPresentationStyle = UIModalPresentationPopover;
+
+        UIPopoverPresentationController* popoverPresentationController =
+            menu.popoverPresentationController;
+        popoverPresentationController.sourceView = guide.constrainedView;
+        popoverPresentationController.sourceRect = guide.constrainedView.bounds;
+        popoverPresentationController.permittedArrowDirections =
+            UIPopoverArrowDirectionUp;
+        popoverPresentationController.delegate = self;
+        popoverPresentationController.backgroundColor =
+            [UIColor colorNamed:kBackgroundColor];
+
+        // The adaptive controller adjusts styles based on window size: sheet
+        // for slim windows on iPhone and iPad, popover for larger windows on
+        // ipad.
+        UISheetPresentationController* sheetPresentationController =
+            popoverPresentationController.adaptiveSheetPresentationController;
+        if (sheetPresentationController) {
+          sheetPresentationController.delegate = self;
+          sheetPresentationController.prefersGrabberVisible = YES;
+          sheetPresentationController.prefersEdgeAttachedInCompactHeight = YES;
+          sheetPresentationController
+              .widthFollowsPreferredContentSizeWhenEdgeAttached = YES;
+
+          sheetPresentationController.detents = @[
+            [UISheetPresentationControllerDetent mediumDetent],
+            [UISheetPresentationControllerDetent largeDetent]
+          ];
+        }
+
+        [self.UIUpdater updateUIForMenuDisplayed:type];
+        [self.baseViewController presentViewController:menu
+                                              animated:YES
+                                            completion:nil];
+        return;
       }
-
-      self.contentBlockerMediator.consumer = self.overflowMenuMediator;
-
-      UIViewController* menu = [OverflowMenuViewProvider
-          makeViewControllerWithModel:self.overflowMenuMediator
-                                          .overflowMenuModel];
-
-      NamedGuide* guide =
-          [NamedGuide guideWithName:guideName
-                               view:self.baseViewController.view];
-      menu.modalPresentationStyle = UIModalPresentationPopover;
-
-      UIPopoverPresentationController* popoverPresentationController =
-          menu.popoverPresentationController;
-      popoverPresentationController.sourceView = guide.constrainedView;
-      popoverPresentationController.sourceRect = guide.constrainedView.bounds;
-      popoverPresentationController.permittedArrowDirections =
-          UIPopoverArrowDirectionUp;
-      popoverPresentationController.delegate = self;
-      popoverPresentationController.backgroundColor =
-          [UIColor colorNamed:kBackgroundColor];
-
-      // The adaptive controller adjusts styles based on window size: sheet for
-      // slim windows on iPhone and iPad, popover for larger windows on ipad.
-      UISheetPresentationController* sheetPresentationController =
-          popoverPresentationController.adaptiveSheetPresentationController;
-      if (sheetPresentationController) {
-        sheetPresentationController.delegate = self;
-        sheetPresentationController.prefersGrabberVisible = YES;
-        sheetPresentationController.prefersEdgeAttachedInCompactHeight = YES;
-        sheetPresentationController
-            .widthFollowsPreferredContentSizeWhenEdgeAttached = YES;
-
-        sheetPresentationController.detents = @[
-          [UISheetPresentationControllerDetent mediumDetent],
-          [UISheetPresentationControllerDetent largeDetent]
-        ];
-      }
-
-      [self.UIUpdater updateUIForMenuDisplayed:type];
-      [self.baseViewController presentViewController:menu
-                                            animated:YES
-                                          completion:nil];
-      return;
     }
   }
 
@@ -395,6 +470,12 @@
 
   [self.presenter prepareForPresentation];
   [self.presenter presentAnimated:YES];
+
+  // Scrolls happen during prepareForPresentation, so only attach the metrics
+  // handler after presentation is done.
+  if (type == PopupMenuTypeToolsMenu) {
+    tableViewController.metricsHandler = self;
+  }
 }
 
 @end
diff --git a/ios/chrome/browser/ui/popup_menu/popup_menu_metrics_handler.h b/ios/chrome/browser/ui/popup_menu/popup_menu_metrics_handler.h
new file mode 100644
index 0000000..f77ee66
--- /dev/null
+++ b/ios/chrome/browser/ui/popup_menu/popup_menu_metrics_handler.h
@@ -0,0 +1,20 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IOS_CHROME_BROWSER_UI_POPUP_MENU_POPUP_MENU_METRICS_HANDLER_H_
+#define IOS_CHROME_BROWSER_UI_POPUP_MENU_POPUP_MENU_METRICS_HANDLER_H_
+
+// Protocol for informing the coordinator of metrics-trackable events that
+// happen in the view, so it can fire the correct metrics.
+@protocol PopupMenuMetricsHandler
+
+// Called when the popup menu is scrolled.
+- (void)popupMenuScrolled;
+
+// Called when the user takes an action in the popup menu.
+- (void)popupMenuTookAction;
+
+@end
+
+#endif  // IOS_CHROME_BROWSER_UI_POPUP_MENU_POPUP_MENU_METRICS_HANDLER_H_
diff --git a/ios/chrome/browser/ui/popup_menu/public/BUILD.gn b/ios/chrome/browser/ui/popup_menu/public/BUILD.gn
index fcfa675..dd5096a 100644
--- a/ios/chrome/browser/ui/popup_menu/public/BUILD.gn
+++ b/ios/chrome/browser/ui/popup_menu/public/BUILD.gn
@@ -31,6 +31,7 @@
     "//base",
     "//ios/chrome/app/strings",
     "//ios/chrome/browser/ui/image_util",
+    "//ios/chrome/browser/ui/popup_menu:metrics_protocols",
     "//ios/chrome/browser/ui/popup_menu/cells",
     "//ios/chrome/browser/ui/popup_menu/overflow_menu:feature_flags",
     "//ios/chrome/browser/ui/popup_menu/public/",
diff --git a/ios/chrome/browser/ui/popup_menu/public/popup_menu_table_view_controller.h b/ios/chrome/browser/ui/popup_menu/public/popup_menu_table_view_controller.h
index 364081c..706bff2 100644
--- a/ios/chrome/browser/ui/popup_menu/public/popup_menu_table_view_controller.h
+++ b/ios/chrome/browser/ui/popup_menu/public/popup_menu_table_view_controller.h
@@ -9,6 +9,7 @@
 #import "ios/chrome/browser/ui/table_view/chrome_table_view_controller.h"
 
 @protocol PopupMenuItem;
+@protocol PopupMenuMetricsHandler;
 @protocol PopupMenuTableViewControllerDelegate;
 
 // TableViewController for the popup menu.
@@ -26,6 +27,9 @@
 // result of an interaction with the popup.
 @property(nonatomic, weak) UIViewController* baseViewController;
 
+// Metrics handler for tracking events happening in this view controller.
+@property(nonatomic, weak) id<PopupMenuMetricsHandler> metricsHandler;
+
 // Initializers.
 - (instancetype)init NS_DESIGNATED_INITIALIZER;
 - (instancetype)initWithStyle:(UITableViewStyle)style NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/popup_menu/public/popup_menu_table_view_controller.mm b/ios/chrome/browser/ui/popup_menu/public/popup_menu_table_view_controller.mm
index c467a77..4e98456c 100644
--- a/ios/chrome/browser/ui/popup_menu/public/popup_menu_table_view_controller.mm
+++ b/ios/chrome/browser/ui/popup_menu/public/popup_menu_table_view_controller.mm
@@ -7,6 +7,7 @@
 #include "base/ios/ios_util.h"
 #include "base/metrics/user_metrics.h"
 #include "base/metrics/user_metrics_action.h"
+#import "ios/chrome/browser/ui/popup_menu/popup_menu_metrics_handler.h"
 #import "ios/chrome/browser/ui/popup_menu/public/cells/popup_menu_footer_item.h"
 #import "ios/chrome/browser/ui/popup_menu/public/cells/popup_menu_item.h"
 #import "ios/chrome/browser/ui/popup_menu/public/popup_menu_table_view_controller_delegate.h"
@@ -196,10 +197,17 @@
   return CGSizeMake(width, ceil(height));
 }
 
+#pragma mark - UIScrollViewDelegate
+
+- (void)scrollViewDidScroll:(UIScrollView*)scrollView {
+  [self.metricsHandler popupMenuScrolled];
+}
+
 #pragma mark - UITableViewDelegate
 
 - (void)tableView:(UITableView*)tableView
     didSelectRowAtIndexPath:(NSIndexPath*)indexPath {
+  [self.metricsHandler popupMenuTookAction];
   UIView* cell = [self.tableView cellForRowAtIndexPath:indexPath];
   CGPoint center = [cell convertPoint:cell.center toView:nil];
   [self.delegate popupMenuTableViewController:self
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn
index 4792e9c..bdb0db8 100644
--- a/ios/chrome/test/BUILD.gn
+++ b/ios/chrome/test/BUILD.gn
@@ -24,7 +24,11 @@
 
 group("all_fuzzer_tests") {
   testonly = true
-  deps = [ "//ios/chrome/browser/crash_report:crashpad_fuzzer_tests" ]
+  deps = [
+    "//components/autofill/ios/form_util:form_activity_tab_helper_fuzzer",
+    "//ios/chrome/browser/crash_report:crashpad_fuzzer_tests",
+    "//ios/chrome/browser/web/image_fetch:image_fetch_java_script_feature_fuzzer",
+  ]
 }
 
 source_set("test_support") {
diff --git a/ios/showcase/omnibox_popup/sc_omnibox_popup_mediator.mm b/ios/showcase/omnibox_popup/sc_omnibox_popup_mediator.mm
index ce0240e..20a12ed 100644
--- a/ios/showcase/omnibox_popup/sc_omnibox_popup_mediator.mm
+++ b/ios/showcase/omnibox_popup/sc_omnibox_popup_mediator.mm
@@ -56,9 +56,7 @@
       [AutocompleteSuggestionGroupImpl groupWithTitle:nil
                                           suggestions:suggestions];
 
-  [self.consumer updateMatches:@[ group ]
-      preselectedMatchGroupIndex:0
-                   withAnimation:YES];
+  [self.consumer updateMatches:@[ group ] preselectedMatchGroupIndex:0];
 }
 
 @end
diff --git a/ios/web/BUILD.gn b/ios/web/BUILD.gn
index 6d9ca82..49852555 100644
--- a/ios/web/BUILD.gn
+++ b/ios/web/BUILD.gn
@@ -625,6 +625,7 @@
     "public/test/http_server_inttest.mm",
     "test/run_all_unittests.cc",
     "url_loader_inttest.mm",
+    "web_state/bad_ssl_response_inttest.mm",
     "web_state/error_page_inttest.mm",
     "web_state/http_auth_inttest.mm",
     "web_state/keep_render_process_alive_inttest.mm",
diff --git a/ios/web/web_state/bad_ssl_response_inttest.mm b/ios/web/web_state/bad_ssl_response_inttest.mm
new file mode 100644
index 0000000..a7a66c83e
--- /dev/null
+++ b/ios/web/web_state/bad_ssl_response_inttest.mm
@@ -0,0 +1,96 @@
+// Copyright 2019 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "base/run_loop.h"
+#import "base/test/ios/wait_util.h"
+#include "base/test/scoped_feature_list.h"
+#import "ios/net/protocol_handler_util.h"
+#include "ios/web/common/features.h"
+#import "ios/web/public/navigation/navigation_manager.h"
+#include "ios/web/public/security/certificate_policy_cache.h"
+#include "ios/web/public/security/security_style.h"
+#include "ios/web/public/security/ssl_status.h"
+#import "ios/web/public/session/crw_session_certificate_policy_cache_storage.h"
+#import "ios/web/public/session/crw_session_storage.h"
+#include "ios/web/public/session/session_certificate_policy_cache.h"
+#import "ios/web/public/test/error_test_util.h"
+#import "ios/web/public/test/fakes/fake_web_client.h"
+#include "ios/web/public/test/fakes/fake_web_state_observer.h"
+#import "ios/web/public/test/navigation_test_util.h"
+#import "ios/web/public/test/web_test_with_web_state.h"
+#import "ios/web/public/test/web_view_content_test_util.h"
+#import "ios/web/public/web_state.h"
+#include "net/cert/x509_certificate.h"
+#include "net/ssl/ssl_info.h"
+#include "net/test/embedded_test_server/default_handlers.h"
+#include "net/test/embedded_test_server/embedded_test_server.h"
+#include "testing/gtest/include/gtest/gtest.h"
+
+#if !defined(__has_feature) || !__has_feature(objc_arc)
+#error "This file requires ARC support."
+#endif
+
+using base::test::ios::kWaitForPageLoadTimeout;
+using base::test::ios::WaitUntilConditionOrTimeout;
+
+namespace web {
+
+// Test fixture for loading https pages with self signed certificate.
+class BadSslResponseTest : public WebTestWithWebState {
+ public:
+  BadSslResponseTest(const BadSslResponseTest&) = delete;
+  BadSslResponseTest& operator=(const BadSslResponseTest&) = delete;
+
+ protected:
+  BadSslResponseTest()
+      : WebTestWithWebState(std::make_unique<FakeWebClient>()),
+        https_server_(net::test_server::EmbeddedTestServer::TYPE_HTTPS) {
+    RegisterDefaultHandlers(&https_server_);
+  }
+
+  void SetUp() override {
+    WebTestWithWebState::SetUp();
+
+    web_state_observer_ = std::make_unique<FakeWebStateObserver>(web_state());
+    ASSERT_TRUE(https_server_.Start());
+  }
+
+  FakeWebClient* web_client() {
+    return static_cast<FakeWebClient*>(GetWebClient());
+  }
+
+  TestDidChangeVisibleSecurityStateInfo* security_state_info() {
+    return web_state_observer_->did_change_visible_security_state_info();
+  }
+
+  net::test_server::EmbeddedTestServer https_server_;
+  base::test::ScopedFeatureList scoped_feature_list_;
+  std::unique_ptr<FakeWebStateObserver> web_state_observer_;
+};
+
+// Tests that an error page is shown for SSL cert errors when committed
+// interstitials are enabled.
+TEST_F(BadSslResponseTest, ShowSSLErrorPageCommittedInterstitial) {
+  const GURL url = https_server_.GetURL("/");
+  test::LoadUrl(web_state(), url);
+  EXPECT_TRUE(WaitUntilConditionOrTimeout(kWaitForPageLoadTimeout, ^{
+    base::RunLoop().RunUntilIdle();
+    return !web_state()->IsLoading();
+  }));
+  NSError* error = testing::CreateErrorWithUnderlyingErrorChain(
+      {{@"NSURLErrorDomain", NSURLErrorServerCertificateUntrusted},
+       {@"kCFErrorDomainCFNetwork", kCFURLErrorServerCertificateUntrusted},
+       {net::kNSErrorDomain, net::ERR_CERT_AUTHORITY_INVALID}});
+  ASSERT_TRUE(test::WaitForWebViewContainingText(
+      web_state(), testing::GetErrorText(
+                       web_state(), url, error,
+                       /*is_post=*/false, /*is_otr=*/false,
+                       /*cert_status=*/net::CERT_STATUS_AUTHORITY_INVALID)));
+  ASSERT_TRUE(security_state_info());
+  ASSERT_TRUE(security_state_info()->visible_ssl_status);
+  EXPECT_EQ(SECURITY_STYLE_AUTHENTICATION_BROKEN,
+            security_state_info()->visible_ssl_status->security_style);
+}
+
+}  // namespace web
diff --git a/media/renderers/win/media_foundation_video_stream.cc b/media/renderers/win/media_foundation_video_stream.cc
index 03d7fa1..a2d5751 100644
--- a/media/renderers/win/media_foundation_video_stream.cc
+++ b/media/renderers/win/media_foundation_video_stream.cc
@@ -26,6 +26,10 @@
 // This is supported by Media Foundation.
 DEFINE_MEDIATYPE_GUID(MFVideoFormat_THEORA, FCC('theo'))
 
+// MF_MT_MIN_MASTERING_LUMINANCE values are in 1/10000th of a nit (0.0001 nit).
+// https://docs.microsoft.com/en-us/windows/win32/api/dxgi1_5/ns-dxgi1_5-dxgi_hdr_metadata_hdr10
+constexpr int kMasteringDispLuminanceScale = 10000;
+
 GUID VideoCodecToMFSubtype(VideoCodec codec, VideoCodecProfile profile) {
   switch (codec) {
     case VideoCodec::kH264:
@@ -160,6 +164,22 @@
   return MFVideoTransFunc_Unknown;
 }
 
+MT_CUSTOM_VIDEO_PRIMARIES CustomVideoPrimaryToMF(
+    gfx::ColorVolumeMetadata color_volume_metadata) {
+  // MT_CUSTOM_VIDEO_PRIMARIES stores value in float no scaling factor needed
+  // https://docs.microsoft.com/en-us/windows/win32/api/mfapi/ns-mfapi-mt_custom_video_primaries
+  MT_CUSTOM_VIDEO_PRIMARIES primaries = {0};
+  primaries.fRx = color_volume_metadata.primary_r.x();
+  primaries.fRy = color_volume_metadata.primary_r.y();
+  primaries.fGx = color_volume_metadata.primary_g.x();
+  primaries.fGy = color_volume_metadata.primary_g.y();
+  primaries.fBx = color_volume_metadata.primary_b.x();
+  primaries.fBy = color_volume_metadata.primary_b.y();
+  primaries.fWx = color_volume_metadata.white_point.x();
+  primaries.fWy = color_volume_metadata.white_point.y();
+  return primaries;
+}
+
 #if BUILDFLAG(ENABLE_PLATFORM_DOLBY_VISION)
 // To MediaFoundation, DolbyVision renderer profile strings are always 7
 // characters. For HEVC based profiles, it's in the format "dvhe.xx". For AVC
@@ -261,6 +281,31 @@
   RETURN_IF_FAILED(
       media_type->SetUINT32(MF_MT_VIDEO_PRIMARIES, mf_video_primary));
 
+  UINT32 video_nominal_range =
+      config.color_space_info().range == gfx::ColorSpace::RangeID::FULL
+          ? MFNominalRange_0_255
+          : MFNominalRange_16_235;
+  RETURN_IF_FAILED(
+      media_type->SetUINT32(MF_MT_VIDEO_NOMINAL_RANGE, video_nominal_range));
+
+  if (config.hdr_metadata().has_value()) {
+    UINT32 max_display_mastering_luminance =
+        config.hdr_metadata()->color_volume_metadata.luminance_max;
+    RETURN_IF_FAILED(media_type->SetUINT32(MF_MT_MAX_MASTERING_LUMINANCE,
+                                           max_display_mastering_luminance));
+
+    UINT32 min_display_mastering_luminance =
+        config.hdr_metadata()->color_volume_metadata.luminance_min *
+        kMasteringDispLuminanceScale;
+    RETURN_IF_FAILED(media_type->SetUINT32(MF_MT_MIN_MASTERING_LUMINANCE,
+                                           min_display_mastering_luminance));
+
+    MT_CUSTOM_VIDEO_PRIMARIES primaries =
+        CustomVideoPrimaryToMF(config.hdr_metadata()->color_volume_metadata);
+    RETURN_IF_FAILED(media_type->SetBlob(MF_MT_CUSTOM_VIDEO_PRIMARIES,
+                                         reinterpret_cast<UINT8*>(&primaries),
+                                         sizeof(MT_CUSTOM_VIDEO_PRIMARIES)));
+  }
   base::UmaHistogramEnumeration(
       "Media.MediaFoundation.VideoColorSpace.TransferID",
       config.color_space_info().transfer);
diff --git a/mojo/public/rust/system/trap.rs b/mojo/public/rust/system/trap.rs
index 0d7d2c9..9b1cd1b 100644
--- a/mojo/public/rust/system/trap.rs
+++ b/mojo/public/rust/system/trap.rs
@@ -54,24 +54,6 @@
     }
 }
 
-impl Default for UnsafeTrapEvent {
-    fn default() -> Self {
-        // `UnsafeTrapEvent` wraps a C FFI struct that is POD and valid when
-        // zero-initialized.
-        //
-        // We do it this way since the struct members vary based on pointer
-        // size: the C struct has a bitfield to ensure `trigger_context` is
-        // always 8 bytes regardless of platform pointer size, and bindgen gives
-        // significantly different struct bindings in the 32- and 64-bit case.
-        // Zero-initializing it is simpler than using cfg conditionals.
-        let raw_event: raw_ffi::MojoTrapEvent = unsafe { mem::zeroed() };
-        UnsafeTrapEvent(raw_ffi::MojoTrapEvent {
-            struct_size: mem::size_of::<raw_ffi::MojoTrapEvent>() as u32,
-            ..raw_event
-        })
-    }
-}
-
 pub type EventHandler = extern "C" fn(&UnsafeTrapEvent);
 
 /// The result of arming an `UnsafeTrap`.
@@ -79,7 +61,8 @@
     /// The trap was successfully armed with no blocking events.
     Armed,
     /// An event would have triggered immediately, blocking the arm. Contains
-    /// the event(s).
+    /// the event(s). The returned slice is a reborrow of the buffer passed to
+    /// `UnsafeTrap::arm`.
     Blocked(&'a [UnsafeTrapEvent]),
     /// Arming failed due to a different Mojo error. If no buffer was passed in
     /// to `arm` but there were blocking events Failed(FailedPrecondition) will
@@ -193,20 +176,31 @@
     ///
     /// If arming was successful, the trap remains armed until an event is
     /// received. At this point it is immediately disarmed.
-    pub fn arm<'a>(&self, blocking_events: Option<&'a mut [UnsafeTrapEvent]>) -> ArmResult<'a> {
+    pub fn arm<'a>(
+        &self,
+        blocking_events: Option<&'a mut [mem::MaybeUninit<UnsafeTrapEvent>]>,
+    ) -> ArmResult<'a> {
         // Initialized to the available space in `blocking_events` (or 0), then
         // updated in-place by the Mojo FFI call.
         let mut num_events = blocking_events
             .as_ref()
             .map_or(0, |b| u32::try_from(b.len()).expect("`blocking_events` too large"));
 
-        // Ensure `struct_size` fields are set correctly for versioning.
+        // Initialize `blocking_events` and set `struct_size` fields which are
+        // used by Mojo for struct versioning.
         let mut blocking_events: Option<&'a mut [UnsafeTrapEvent]> =
-            blocking_events.map(|events| {
-                assert!(events.len() > 0);
-                // The `Default` impl sets `struct_size`.
-                events.fill(Default::default());
-                events
+            blocking_events.map(|blocking_events| {
+                for uninit_event in blocking_events.iter_mut() {
+                    // `UnsafeTrapEvent` wraps a C FFI struct that is POD and
+                    // valid when zero-initialized.
+                    let mut event: UnsafeTrapEvent = unsafe { mem::zeroed() };
+                    event.0.struct_size = mem::size_of::<UnsafeTrapEvent>() as u32;
+                    uninit_event.write(event);
+                }
+
+                // Now that all elements are initialized it is sound to
+                // assume_init.
+                unsafe { mem::MaybeUninit::slice_assume_init_mut(blocking_events) }
             });
 
         let (blocking_events_ptr, num_events_ptr) = match blocking_events.as_mut() {
@@ -468,7 +462,7 @@
     ///   * Failed for some other reason. Returns the error.
     pub fn arm(&self) -> MojoResult {
         const MAX_BLOCKING_EVENTS: usize = 16;
-        let mut buf = [Default::default(); MAX_BLOCKING_EVENTS];
+        let mut buf = [mem::MaybeUninit::uninit(); MAX_BLOCKING_EVENTS];
 
         // Try to arm the trap. If blocking events were returned handle them.
         let blocking_events: &[UnsafeTrapEvent] = match self.trap.arm(Some(&mut buf)) {
diff --git a/mojo/public/rust/tests/system.rs b/mojo/public/rust/tests/system.rs
index db7739da..e837ff4 100644
--- a/mojo/public/rust/tests/system.rs
+++ b/mojo/public/rust/tests/system.rs
@@ -232,7 +232,7 @@
                              TriggerCondition::SignalsUnsatisfied,
                              2));
 
-        let mut blocking_events_buf = [Default::default(); 16];
+        let mut blocking_events_buf = [std::mem::MaybeUninit::uninit(); 16];
         // The trap should arm with no blocking events since nothing should be
         // triggered yet.
         match trap.arm(Some(&mut blocking_events_buf)) {
diff --git a/ppapi/proxy/ppapi_command_buffer_proxy.cc b/ppapi/proxy/ppapi_command_buffer_proxy.cc
index a76aaab2..52dbfdac 100644
--- a/ppapi/proxy/ppapi_command_buffer_proxy.cc
+++ b/ppapi/proxy/ppapi_command_buffer_proxy.cc
@@ -257,17 +257,6 @@
   return capabilities_;
 }
 
-int32_t PpapiCommandBufferProxy::CreateImage(ClientBuffer buffer,
-                                             size_t width,
-                                             size_t height) {
-  NOTREACHED();
-  return -1;
-}
-
-void PpapiCommandBufferProxy::DestroyImage(int32_t id) {
-  NOTREACHED();
-}
-
 bool PpapiCommandBufferProxy::Send(IPC::Message* msg) {
   DCHECK(last_state_.error == gpu::error::kNoError);
 
diff --git a/ppapi/proxy/ppapi_command_buffer_proxy.h b/ppapi/proxy/ppapi_command_buffer_proxy.h
index ee2bcec..5a9dffa 100644
--- a/ppapi/proxy/ppapi_command_buffer_proxy.h
+++ b/ppapi/proxy/ppapi_command_buffer_proxy.h
@@ -62,10 +62,6 @@
   // gpu::GpuControl implementation:
   void SetGpuControlClient(gpu::GpuControlClient*) override;
   const gpu::Capabilities& GetCapabilities() const override;
-  int32_t CreateImage(ClientBuffer buffer,
-                      size_t width,
-                      size_t height) override;
-  void DestroyImage(int32_t id) override;
   void SignalQuery(uint32_t query, base::OnceClosure callback) override;
   void CreateGpuFence(uint32_t gpu_fence_id, ClientGpuFence source) override;
   void GetGpuFence(uint32_t gpu_fence_id,
diff --git a/remoting/codec/webrtc_video_encoder_vpx.cc b/remoting/codec/webrtc_video_encoder_vpx.cc
index a01494f..aa631c2d 100644
--- a/remoting/codec/webrtc_video_encoder_vpx.cc
+++ b/remoting/codec/webrtc_video_encoder_vpx.cc
@@ -143,7 +143,7 @@
   // Request the lowest-CPU usage that VP9 supports, which depends on whether
   // we are encoding lossy or lossless.
   // Note that this knob uses the same parameter name as VP8.
-  int cpu_used = lossless_encode ? 5 : 7;
+  int cpu_used = lossless_encode ? 5 : 8;
   vpx_codec_err_t ret = vpx_codec_control(codec, VP8E_SET_CPUUSED, cpu_used);
   DCHECK_EQ(VPX_CODEC_OK, ret) << "Failed to set CPUUSED";
 
diff --git a/services/audio/mixing_graph_impl.cc b/services/audio/mixing_graph_impl.cc
index 3ae4c17..0b36327 100644
--- a/services/audio/mixing_graph_impl.cc
+++ b/services/audio/mixing_graph_impl.cc
@@ -5,6 +5,7 @@
 #include "services/audio/mixing_graph_impl.h"
 
 #include "base/compiler_specific.h"
+#include "base/metrics/histogram_functions.h"
 #include "base/trace_event/trace_event.h"
 #include "media/base/audio_timestamp_helper.h"
 #include "media/base/loopback_audio_converter.h"
@@ -42,6 +43,37 @@
 }
 }  // namespace
 
+// Counts how often mixing callback duration exceeded the given time limit and
+// logs it as a UMA histogram.
+class MixingGraphImpl::OvertimeLogger {
+ public:
+  // Logs once every 10s, assuming 10ms buffers.
+  constexpr static int kCallbacksPerLogPeriod = 1000;
+
+  explicit OvertimeLogger(base::TimeDelta timeout) : timeout_(timeout) {}
+
+  void Log(base::TimeTicks callback_start) {
+    ++callback_count_;
+
+    if (base::TimeTicks::Now() - callback_start > timeout_)
+      overtime_count_++;
+
+    if (callback_count_ % kCallbacksPerLogPeriod)
+      return;
+
+    // Clipped to 100 to give more resolution to lower values.
+    base::UmaHistogramCounts100(
+        "Media.Audio.OutputDeviceMixer.OvertimeCount", overtime_count_);
+
+    overtime_count_ = 0;
+  }
+
+ private:
+  const base::TimeDelta timeout_;
+  int callback_count_ = 0;
+  int overtime_count_ = 0;
+};
+
 MixingGraphImpl::MixingGraphImpl(const media::AudioParameters& output_params,
                                  OnMoreDataCallback on_more_data_cb,
                                  OnErrorCallback on_error_cb)
@@ -58,6 +90,8 @@
       on_more_data_cb_(std::move(on_more_data_cb)),
       on_error_cb_(std::move(on_error_cb)),
       create_converter_cb_(std::move(create_converter_cb)),
+      overtime_logger_(
+          std::make_unique<OvertimeLogger>(output_params.GetBufferDuration())),
       main_converter_(output_params, output_params, /*disable_fifo=*/true) {}
 
 MixingGraphImpl::~MixingGraphImpl() {
@@ -190,13 +224,13 @@
                                 base::TimeTicks delay_timestamp,
                                 int prior_frames_skipped,
                                 media::AudioBus* dest) {
+  const base::TimeTicks start_time(base::TimeTicks::Now());
   TRACE_EVENT_BEGIN2(TRACE_DISABLED_BY_DEFAULT("audio"),
                      "MixingGraphImpl::OnMoreData", "delay", delay,
                      "delay_timestamp", delay_timestamp);
 
   // The expected playout time is |delay_timestamp| + |delay|.
-  base::TimeDelta total_delay =
-      delay_timestamp + delay - base::TimeTicks::Now();
+  base::TimeDelta total_delay = delay_timestamp + delay - start_time;
   if (total_delay < base::TimeDelta())
     total_delay = base::TimeDelta();
 
@@ -214,6 +248,7 @@
   TRACE_EVENT_END2(TRACE_DISABLED_BY_DEFAULT("audio"),
                    "MixingGraphImpl::OnMoreData", "total_delay", total_delay,
                    "frames_delayed", frames_delayed);
+  overtime_logger_->Log(start_time);
   return dest->frames();
 }
 
diff --git a/services/audio/mixing_graph_impl.h b/services/audio/mixing_graph_impl.h
index acb9fc0..057f9595 100644
--- a/services/audio/mixing_graph_impl.h
+++ b/services/audio/mixing_graph_impl.h
@@ -47,6 +47,8 @@
   void OnError(ErrorType type) final;
 
  protected:
+  class OvertimeLogger;
+
   media::LoopbackAudioConverter* FindOrAddConverter(
       const media::AudioParameters& input_params,
       const media::AudioParameters& output_params,
@@ -112,6 +114,9 @@
   // Called when a new converter needs to be created.
   const CreateConverterCallback create_converter_cb_;
 
+  // UMA logging.
+  const std::unique_ptr<OvertimeLogger> overtime_logger_;
+
   base::Lock lock_;
 
   // The |main_converter_|, the |converters_| and the inputs are connected
diff --git a/storage/browser/blob/blob_url_loader.cc b/storage/browser/blob/blob_url_loader.cc
index e3a0b782..aa80b1c 100644
--- a/storage/browser/blob/blob_url_loader.cc
+++ b/storage/browser/blob/blob_url_loader.cc
@@ -11,7 +11,6 @@
 #include "base/format_macros.h"
 #include "base/memory/ptr_util.h"
 #include "base/memory/weak_ptr.h"
-#include "base/metrics/histogram_functions.h"
 #include "base/notreached.h"
 #include "base/strings/string_number_conversions.h"
 #include "base/strings/stringprintf.h"
@@ -206,9 +205,6 @@
 
 void BlobURLLoader::OnComplete(net::Error error_code,
                                uint64_t total_written_bytes) {
-  base::UmaHistogramSparse("Storage.Blob.BlobUrlLoader.FailureType",
-                           error_code);
-
   network::URLLoaderCompletionStatus status(error_code);
   status.encoded_body_length = total_written_bytes;
   status.decoded_body_length = total_written_bytes;
diff --git a/storage/browser/quota/usage_tracker.cc b/storage/browser/quota/usage_tracker.cc
index 6a897bec..052a3fad 100644
--- a/storage/browser/quota/usage_tracker.cc
+++ b/storage/browser/quota/usage_tracker.cc
@@ -39,6 +39,7 @@
     client_tracker_map_[client_type].push_back(
         std::make_unique<ClientUsageTracker>(this, client, type,
                                              special_storage_policy));
+    client_tracker_count_ += 1;
   }
 }
 
@@ -86,7 +87,7 @@
   auto info = std::make_unique<AccumulateInfo>();
   auto* info_ptr = info.get();
   base::RepeatingClosure barrier = base::BarrierClosure(
-      client_tracker_map_.size(),
+      client_tracker_count_,
       base::BindOnce(&UsageTracker::FinallySendBucketUsageWithBreakdown,
                      weak_factory_.GetWeakPtr(), std::move(info), bucket));
 
@@ -195,7 +196,7 @@
 
   auto* info_ptr = info.get();
   base::RepeatingClosure barrier = base::BarrierClosure(
-      client_tracker_map_.size(),
+      client_tracker_count_,
       base::BindOnce(&UsageTracker::FinallySendGlobalUsage,
                      weak_factory_.GetWeakPtr(), std::move(info)));
 
@@ -235,7 +236,7 @@
 
   auto* info_ptr = info.get();
   base::RepeatingClosure barrier = base::BarrierClosure(
-      client_tracker_map_.size(),
+      client_tracker_count_,
       base::BindOnce(&UsageTracker::FinallySendHostUsageWithBreakdown,
                      weak_factory_.GetWeakPtr(), std::move(info), host));
 
diff --git a/storage/browser/quota/usage_tracker.h b/storage/browser/quota/usage_tracker.h
index e7254888..1c9f1c0 100644
--- a/storage/browser/quota/usage_tracker.h
+++ b/storage/browser/quota/usage_tracker.h
@@ -145,6 +145,7 @@
   base::flat_map<QuotaClientType,
                  std::vector<std::unique_ptr<ClientUsageTracker>>>
       client_tracker_map_;
+  int client_tracker_count_ = 0;
 
   std::vector<UsageCallback> global_usage_callbacks_;
   std::map<std::string, std::vector<UsageWithBreakdownCallback>>
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json
index 2eaf6e9..53808df1 100644
--- a/testing/buildbot/chromium.mac.json
+++ b/testing/buildbot/chromium.mac.json
@@ -12165,8 +12165,8 @@
   },
   "ios-catalyst": {
     "additional_compile_targets": [
-      "form_activity_tab_helper_fuzzer",
-      "ios/chrome/app:chrome"
+      "ios/chrome/app:chrome",
+      "ios/chrome/test:all_fuzzer_tests"
     ]
   },
   "ios-device": {
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl
index 75fac48..9f8f25ee 100644
--- a/testing/buildbot/gn_isolate_map.pyl
+++ b/testing/buildbot/gn_isolate_map.pyl
@@ -858,12 +858,6 @@
     "script": "//testing/scripts/run_flatbuffers_unittests.py",
     "type": "script",
   },
-  # TODO(crbug.com/1256485): The target is not needed after iOS clusterfuzz
-  # upload bot is set up.
-  "form_activity_tab_helper_fuzzer": {
-    "label": "//components/autofill/ios/form_util:form_activity_tab_helper_fuzzer",
-    "type": "additional_compile_target",
-  },
   "fuchsia_mojo_unittests": {
     "label": "//fuchsia/mojom:fuchsia_mojo_unittests",
     "type": "console_test_launcher",
@@ -978,6 +972,10 @@
     "label": "//ios/chrome/app:chrome",
     "type": "additional_compile_target",
   },
+  "ios/chrome/test:all_fuzzer_tests": {
+    "label": "//ios/chrome/test:all_fuzzer_tests",
+    "type": "additional_compile_target",
+  },
   "ios_chrome_bookmarks_egtests": {
     "label": "//ios/chrome/test/earl_grey:ios_chrome_bookmarks_egtests",
     "type": "generated_script",
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl
index 5d56829..61be02c 100644
--- a/testing/buildbot/waterfalls.pyl
+++ b/testing/buildbot/waterfalls.pyl
@@ -5374,10 +5374,8 @@
       },
       'ios-catalyst': {
         'additional_compile_targets': [
-          # TODO(crbug.com/1256485): The bot won't need to compile fuzzers after
-          # the clusterfuzz upload bot is set up.
-          'form_activity_tab_helper_fuzzer',
           'ios/chrome/app:chrome',
+          'ios/chrome/test:all_fuzzer_tests',
         ],
       },
       'ios-device': {
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json
index deaf8fc..2d0055ad 100644
--- a/testing/variations/fieldtrial_testing_config.json
+++ b/testing/variations/fieldtrial_testing_config.json
@@ -4924,6 +4924,37 @@
             ]
         }
     ],
+    "NtpRealboxDesignUpdates": [
+        {
+            "platforms": [
+                "chromeos",
+                "chromeos_lacros",
+                "linux",
+                "mac",
+                "windows"
+            ],
+            "experiments": [
+                {
+                    "name": "Enabled",
+                    "params": {
+                        "RealboxMatchSearchboxThemeParam": "0"
+                    },
+                    "enable_features": [
+                        "NtpRealboxMatchSearchboxTheme"
+                    ]
+                },
+                {
+                    "name": "Enabled_Rounded_Corners",
+                    "params": {
+                        "RealboxMatchSearchboxThemeParam": "1"
+                    },
+                    "enable_features": [
+                        "NtpRealboxMatchSearchboxTheme"
+                    ]
+                }
+            ]
+        }
+    ],
     "NtpRealboxPedals": [
         {
             "platforms": [
@@ -8022,60 +8053,6 @@
             ]
         }
     ],
-    "V8WasmDynamicTiering": [
-        {
-            "platforms": [
-                "android",
-                "chromeos",
-                "chromeos_lacros",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "Enabled_20211210",
-                    "enable_features": [
-                        "WebAssemblyDynamicTiering"
-                    ]
-                }
-            ]
-        }
-    ],
-    "V8WasmMemoryProtection": [
-        {
-            "platforms": [
-                "android",
-                "chromeos",
-                "chromeos_lacros",
-                "ios",
-                "linux",
-                "mac",
-                "windows"
-            ],
-            "experiments": [
-                {
-                    "name": "EnabledPku",
-                    "enable_features": [
-                        "WebAssemblyCodeProtectionPku"
-                    ]
-                },
-                {
-                    "name": "EnabledMprotect",
-                    "enable_features": [
-                        "WebAssemblyCodeProtection"
-                    ]
-                },
-                {
-                    "name": "EnabledPkuWithMprotectFallback",
-                    "enable_features": [
-                        "WebAssemblyCodeProtection",
-                        "WebAssemblyCodeProtectionPku"
-                    ]
-                }
-            ]
-        }
-    ],
     "VaapiVideoDecoder": [
         {
             "platforms": [
diff --git a/third_party/abseil-cpp/symbols_arm64_rel.def b/third_party/abseil-cpp/symbols_arm64_rel.def
index cd37a120..7e0e42a 100644
--- a/third_party/abseil-cpp/symbols_arm64_rel.def
+++ b/third_party/abseil-cpp/symbols_arm64_rel.def
@@ -121,7 +121,6 @@
     ??0ByAnyChar@absl@@QEAA@Vstring_view@1@@Z
     ??0ByLength@absl@@QEAA@_J@Z
     ??0ByString@absl@@QEAA@Vstring_view@1@@Z
-    ??0ChunkIterator@Cord@absl@@AEAA@PEAUCordRep@cord_internal@2@@Z
     ??0ChunkIterator@Cord@absl@@AEAA@PEBV12@@Z
     ??0Condition@absl@@AEAA@XZ
     ??0Condition@absl@@QEAA@P6A_NPEAX@Z0@Z
diff --git a/third_party/abseil-cpp/symbols_x64_rel.def b/third_party/abseil-cpp/symbols_x64_rel.def
index 7415abb..8eb3cf3 100644
--- a/third_party/abseil-cpp/symbols_x64_rel.def
+++ b/third_party/abseil-cpp/symbols_x64_rel.def
@@ -76,8 +76,6 @@
     ??$SetEdge@$0A@@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z
     ??$StrReplaceAll@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@0@AEBV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@3@@Z
     ??$StrReplaceAll@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@@absl@@YAHAEBV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@2@@Z
-    ??$ToChronoDuration@V?$duration@JV?$ratio@$0DM@$00@__1@std@@@chrono@__1@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0DM@$00@__1@std@@@chrono@__1@std@@VDuration@1@@Z
-    ??$ToChronoDuration@V?$duration@JV?$ratio@$0OBA@$00@__1@std@@@chrono@__1@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0OBA@$00@__1@std@@@chrono@__1@std@@VDuration@1@@Z
     ??$__construct_node_hash@AEBUpiecewise_construct_t@__1@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@AEAA?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@@12@_KAEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@12@$$QEAV?$tuple@$$V@12@@Z
     ??$__emplace_back_slow_path@AEAVstring_view@absl@@AEBV12@AEA_K@?$vector@UViableSubstitution@strings_internal@absl@@V?$allocator@UViableSubstitution@strings_internal@absl@@@__1@std@@@__1@std@@AEAAXAEAVstring_view@absl@@AEBV34@AEA_K@Z
     ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@12@$$QEAV?$tuple@$$V@12@@Z
diff --git a/third_party/abseil-cpp/symbols_x64_rel_asan.def b/third_party/abseil-cpp/symbols_x64_rel_asan.def
index cfa682a..bec349b 100644
--- a/third_party/abseil-cpp/symbols_x64_rel_asan.def
+++ b/third_party/abseil-cpp/symbols_x64_rel_asan.def
@@ -75,8 +75,6 @@
     ??$SetEdge@$0A@@CordRepBtree@cord_internal@absl@@QEAA?AUOpResult@012@_NPEAUCordRep@12@_K@Z
     ??$StrReplaceAll@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@@absl@@YA?AV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@Vstring_view@0@AEBV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@3@@Z
     ??$StrReplaceAll@V?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@@absl@@YAHAEBV?$initializer_list@U?$pair@Vstring_view@absl@@V12@@__1@std@@@std@@PEAV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@2@@Z
-    ??$ToChronoDuration@V?$duration@JV?$ratio@$0DM@$00@__1@std@@@chrono@__1@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0DM@$00@__1@std@@@chrono@__1@std@@VDuration@1@@Z
-    ??$ToChronoDuration@V?$duration@JV?$ratio@$0OBA@$00@__1@std@@@chrono@__1@std@@@time_internal@absl@@YA?AV?$duration@JV?$ratio@$0OBA@$00@__1@std@@@chrono@__1@std@@VDuration@1@@Z
     ??$__construct_at_end@PEBVFormatArgImpl@str_format_internal@absl@@@?$vector@VFormatArgImpl@str_format_internal@absl@@V?$allocator@VFormatArgImpl@str_format_internal@absl@@@__1@std@@@__1@std@@AEAAXPEBVFormatArgImpl@str_format_internal@absl@@0_K@Z
     ??$__construct_node_hash@AEBUpiecewise_construct_t@__1@std@@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@AEAA?AV?$unique_ptr@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@V?$__hash_node_destructor@V?$allocator@U?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@@23@@12@_KAEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@12@$$QEAV?$tuple@$$V@12@@Z
     ??$__emplace_unique_key_args@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@AEBUpiecewise_construct_t@23@V?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@V?$tuple@$$V@23@@?$__hash_table@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@V?$__unordered_map_hasher@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$__unordered_map_equal@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@23@U?$equal_to@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@U?$hash@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@23@$00@23@V?$allocator@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@@23@@__1@std@@QEAA?AU?$pair@V?$__hash_iterator@PEAU?$__hash_node@U?$__hash_value_type@V?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@__1@std@@PEAX@__1@std@@@__1@std@@_N@12@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@12@AEBUpiecewise_construct_t@12@$$QEAV?$tuple@AEBV?$basic_string@DU?$char_traits@D@__1@std@@V?$allocator@D@23@@__1@std@@@12@$$QEAV?$tuple@$$V@12@@Z
@@ -405,7 +403,6 @@
     ?Find@ByChar@absl@@QEBA?AVstring_view@2@V32@_K@Z
     ?Find@ByLength@absl@@QEBA?AVstring_view@2@V32@_K@Z
     ?Find@ByString@absl@@QEBA?AVstring_view@2@V32@_K@Z
-    ?FindFlatStartPiece@InlineRep@Cord@absl@@QEBA?AVstring_view@3@XZ
     ?FindPath@GraphCycles@synchronization_internal@absl@@QEBAHUGraphId@23@0HQEAU423@@Z
     ?FindSlow@CordRepRing@cord_internal@absl@@AEBA?AUPosition@123@I_K@Z
     ?FindTailSlow@CordRepRing@cord_internal@absl@@AEBA?AUPosition@123@I_K@Z
diff --git a/third_party/androidx/fetch_all_androidx.py b/third_party/androidx/fetch_all_androidx.py
index 2d065aa..94c416a 100755
--- a/third_party/androidx/fetch_all_androidx.py
+++ b/third_party/androidx/fetch_all_androidx.py
@@ -89,7 +89,7 @@
 
     if line.strip() == '{{version_overrides}}':
         lines = ['versionOverrideMap = [:]']
-        for dependency, version in dependency_version_map.items():
+        for dependency, version in sorted(dependency_version_map.items()):
             lines.append(f"versionOverrideMap['{dependency}'] = '{version}'")
         return '\n'.join(lines)
 
diff --git a/third_party/blink/common/page/content_to_visible_time_reporter.cc b/third_party/blink/common/page/content_to_visible_time_reporter.cc
index caa5289..c8b80821 100644
--- a/third_party/blink/common/page/content_to_visible_time_reporter.cc
+++ b/third_party/blink/common/page/content_to_visible_time_reporter.cc
@@ -41,12 +41,6 @@
   }
 }
 
-void ReportUnOccludedMetric(const base::TimeTicks requested_time,
-                            const gfx::PresentationFeedback& feedback) {
-  const base::TimeDelta delta = feedback.timestamp - requested_time;
-  UMA_HISTOGRAM_TIMES("Aura.WebContentsWindowUnOccludedTime", delta);
-}
-
 void RecordBackForwardCacheRestoreMetric(
     const base::TimeTicks requested_time,
     const gfx::PresentationFeedback& feedback) {
@@ -86,7 +80,6 @@
     // every time a tab is backgrounded, even if the content is still visible.
     RecordHistogramsAndTraceEvents(TabSwitchResult::kMissedTabHide,
                                    true /* show_reason_tab_switching */,
-                                   false /* show_reason_unoccluded */,
                                    false /* show_reason_bfcache_restore */,
                                    gfx::PresentationFeedback::Failure());
   }
@@ -108,7 +101,6 @@
       &ContentToVisibleTimeReporter::RecordHistogramsAndTraceEvents,
       weak_ptr_factory_.GetWeakPtr(), TabSwitchResult::kSuccess,
       tab_switch_start_state_->show_reason_tab_switching,
-      tab_switch_start_state_->show_reason_unoccluded,
       tab_switch_start_state_->show_reason_bfcache_restore);
 }
 
@@ -117,20 +109,18 @@
                                           base::TimeTicks event_start_time,
                                           bool destination_is_loaded,
                                           bool show_reason_tab_switching,
-                                          bool show_reason_unoccluded,
                                           bool show_reason_bfcache_restore) {
   return TabWasShown(
       has_saved_frames,
       mojom::RecordContentToVisibleTimeRequest::New(
           event_start_time, destination_is_loaded, show_reason_tab_switching,
-          show_reason_unoccluded, show_reason_bfcache_restore));
+          show_reason_bfcache_restore));
 }
 
 void ContentToVisibleTimeReporter::TabWasHidden() {
   if (tab_switch_start_state_) {
     RecordHistogramsAndTraceEvents(TabSwitchResult::kIncomplete,
                                    true /* show_reason_tab_switching */,
-                                   false /* show_reason_unoccluded */,
                                    false /* show_reason_bfcache_restore */,
                                    gfx::PresentationFeedback::Failure());
     weak_ptr_factory_.InvalidateWeakPtrs();
@@ -148,14 +138,12 @@
 void ContentToVisibleTimeReporter::RecordHistogramsAndTraceEvents(
     TabSwitchResult tab_switch_result,
     bool show_reason_tab_switching,
-    bool show_reason_unoccluded,
     bool show_reason_bfcache_restore,
     const gfx::PresentationFeedback& feedback) {
   DCHECK(tab_switch_start_state_);
   // If the DCHECK fail, make sure RenderWidgetHostImpl::WasShown was triggered
   // for recording the event.
-  DCHECK(show_reason_bfcache_restore || show_reason_unoccluded ||
-         show_reason_tab_switching);
+  DCHECK(show_reason_bfcache_restore || show_reason_tab_switching);
   // The kPresentationFailure result should only be used if `feedback` has a
   // failure.
   DCHECK_NE(tab_switch_result, TabSwitchResult::kPresentationFailure);
@@ -165,10 +153,6 @@
         tab_switch_start_state_->event_start_time, feedback);
   }
 
-  if (show_reason_unoccluded) {
-    ReportUnOccludedMetric(tab_switch_start_state_->event_start_time, feedback);
-  }
-
   if (!show_reason_tab_switching)
     return;
 
diff --git a/third_party/blink/common/page/content_to_visible_time_reporter_unittest.cc b/third_party/blink/common/page/content_to_visible_time_reporter_unittest.cc
index c0e5561..f862d925 100644
--- a/third_party/blink/common/page/content_to_visible_time_reporter_unittest.cc
+++ b/third_party/blink/common/page/content_to_visible_time_reporter_unittest.cc
@@ -22,8 +22,6 @@
 
 namespace blink {
 
-constexpr char kWebContentsUnOccludedHistogram[] =
-    "Aura.WebContentsWindowUnOccludedTime";
 constexpr char kBfcacheRestoreHistogram[] =
     "BackForwardCache.Restore.NavigationToFirstPaint";
 
@@ -145,7 +143,7 @@
         "Browser.Tabs.TabSwitchResult2.NoSavedFrames_Loaded",
         "Browser.Tabs.TabSwitchResult2.NoSavedFrames_NotLoaded",
         // Non-tab switch.
-        kWebContentsUnOccludedHistogram, kBfcacheRestoreHistogram};
+        kBfcacheRestoreHistogram};
     std::vector<std::string> unexpected_histograms;
     for (const char* histogram : kAllHistograms) {
       if (!base::Contains(histograms_with_values, histogram))
@@ -210,7 +208,6 @@
       blink::mojom::RecordContentToVisibleTimeRequest::New(
           start, tab_state_.destination_is_loaded,
           /* show_reason_tab_switching */ true,
-          /* show_reason_unoccluded */ false,
           /* show_reason_bfcache_restore */ false));
   const auto end = start + kDuration;
   auto presentation_feedback = gfx::PresentationFeedback(
@@ -242,7 +239,6 @@
       blink::mojom::RecordContentToVisibleTimeRequest::New(
           start, tab_state_.destination_is_loaded,
           /* show_reason_tab_switching */ true,
-          /* show_reason_unoccluded */ false,
           /* show_reason_bfcache_restore */ false));
   std::move(callback).Run(gfx::PresentationFeedback::Failure());
 
@@ -264,7 +260,6 @@
       blink::mojom::RecordContentToVisibleTimeRequest::New(
           start1, tab_state_.destination_is_loaded,
           /* show_reason_tab_switching */ true,
-          /* show_reason_unoccluded */ false,
           /* show_reason_bfcache_restore */ false));
 
   task_environment_.FastForwardBy(kDuration);
@@ -291,7 +286,6 @@
       blink::mojom::RecordContentToVisibleTimeRequest::New(
           start2, tab_state_.destination_is_loaded,
           /* show_reason_tab_switching */ true,
-          /* show_reason_unoccluded */ false,
           /* show_reason_bfcache_restore */ false));
   const auto end2 = start2 + kOtherDuration;
   auto presentation_feedback = gfx::PresentationFeedback(
@@ -332,7 +326,6 @@
       blink::mojom::RecordContentToVisibleTimeRequest::New(
           start1, tab_state_.destination_is_loaded,
           /* show_reason_tab_switching */ true,
-          /* show_reason_unoccluded */ false,
           /* show_reason_bfcache_restore */ false));
 
   task_environment_.FastForwardBy(kDuration);
@@ -345,7 +338,6 @@
       blink::mojom::RecordContentToVisibleTimeRequest::New(
           start2, tab_state_.destination_is_loaded,
           /* show_reason_tab_switching */ true,
-          /* show_reason_unoccluded */ false,
           /* show_reason_bfcache_restore */ false));
   const auto end2 = start2 + kOtherDuration;
   auto presentation_feedback = gfx::PresentationFeedback(
@@ -376,46 +368,44 @@
       ContentToVisibleTimeReporter::TabSwitchResult::kSuccess, 1);
 }
 
-// Time is properly recorded to histogram when we have unoccluded event.
-TEST_P(ContentToVisibleTimeReporterTest, UnoccludedTimeIsRecorded) {
+// Time is properly recorded to histogram when we have bfcache restore event.
+TEST_P(ContentToVisibleTimeReporterTest, BfcacheRestoreTimeIsRecorded) {
   const auto start = base::TimeTicks::Now();
   auto callback = tab_switch_time_recorder_.TabWasShown(
       tab_state_.has_saved_frames,
       blink::mojom::RecordContentToVisibleTimeRequest::New(
           start, tab_state_.destination_is_loaded,
           /* show_reason_tab_switching */ false,
-          /* show_reason_unoccluded */ true,
-          /* show_reason_bfcache_restore */ false));
+          /* show_reason_bfcache_restore */ true));
   const auto end = start + kDuration;
   auto presentation_feedback = gfx::PresentationFeedback(
       end, end - start, gfx::PresentationFeedback::Flags::kHWCompletion);
   std::move(callback).Run(presentation_feedback);
 
-  ExpectHistogramsEmptyExcept({kWebContentsUnOccludedHistogram});
+  ExpectHistogramsEmptyExcept({kBfcacheRestoreHistogram});
 
-  // UnOccluded.
-  ExpectTotalSamples({kWebContentsUnOccludedHistogram}, 1);
-  ExpectTimeBucketCounts({kWebContentsUnOccludedHistogram}, kDuration, 1);
+  // Bfcache restore.
+  ExpectTotalSamples({kBfcacheRestoreHistogram}, 1);
+  ExpectTimeBucketCounts({kBfcacheRestoreHistogram}, kDuration, 1);
 }
 
 // Time is properly recorded to histogram when we have unoccluded event
 // and some other events too.
 TEST_P(ContentToVisibleTimeReporterTest,
-       TimeIsRecordedWithSavedFramesPlusUnoccludedTimeIsRecorded) {
+       TimeIsRecordedWithSavedFramesPlusBfcacheRestoreTimeIsRecorded) {
   const auto start = base::TimeTicks::Now();
   auto callback = tab_switch_time_recorder_.TabWasShown(
       tab_state_.has_saved_frames,
       blink::mojom::RecordContentToVisibleTimeRequest::New(
           start, tab_state_.destination_is_loaded,
           /* show_reason_tab_switching */ true,
-          /* show_reason_unoccluded */ true,
-          /* show_reason_bfcache_restore */ false));
+          /* show_reason_bfcache_restore */ true));
   const auto end = start + kDuration;
   auto presentation_feedback = gfx::PresentationFeedback(
       end, end - start, gfx::PresentationFeedback::Flags::kHWCompletion);
   std::move(callback).Run(presentation_feedback);
 
-  std::vector<std::string> expected_histograms{kWebContentsUnOccludedHistogram};
+  std::vector<std::string> expected_histograms{kBfcacheRestoreHistogram};
   base::Extend(expected_histograms, duration_histograms_);
   base::Extend(expected_histograms, result_histograms_);
   ExpectHistogramsEmptyExcept(expected_histograms);
@@ -430,28 +420,6 @@
       result_histograms_,
       ContentToVisibleTimeReporter::TabSwitchResult::kSuccess, 1);
 
-  // UnOccluded.
-  ExpectTotalSamples({kWebContentsUnOccludedHistogram}, 1);
-  ExpectTimeBucketCounts({kWebContentsUnOccludedHistogram}, kDuration, 1);
-}
-
-// Time is properly recorded to histogram when we have bfcache restore event.
-TEST_P(ContentToVisibleTimeReporterTest, BfcacheRestoreTimeIsRecorded) {
-  const auto start = base::TimeTicks::Now();
-  auto callback = tab_switch_time_recorder_.TabWasShown(
-      tab_state_.has_saved_frames,
-      blink::mojom::RecordContentToVisibleTimeRequest::New(
-          start, tab_state_.destination_is_loaded,
-          /* show_reason_tab_switching */ false,
-          /* show_reason_unoccluded */ false,
-          /* show_reason_bfcache_restore */ true));
-  const auto end = start + kDuration;
-  auto presentation_feedback = gfx::PresentationFeedback(
-      end, end - start, gfx::PresentationFeedback::Flags::kHWCompletion);
-  std::move(callback).Run(presentation_feedback);
-
-  ExpectHistogramsEmptyExcept({kBfcacheRestoreHistogram});
-
   // Bfcache restore.
   ExpectTotalSamples({kBfcacheRestoreHistogram}, 1);
   ExpectTimeBucketCounts({kBfcacheRestoreHistogram}, kDuration, 1);
diff --git a/third_party/blink/public/common/page/content_to_visible_time_reporter.h b/third_party/blink/public/common/page/content_to_visible_time_reporter.h
index 569d4811..22f2ee1 100644
--- a/third_party/blink/public/common/page/content_to_visible_time_reporter.h
+++ b/third_party/blink/public/common/page/content_to_visible_time_reporter.h
@@ -54,7 +54,6 @@
       base::TimeTicks event_start_time,
       bool destination_is_loaded,
       bool show_reason_tab_switching,
-      bool show_reason_unoccluded,
       bool show_reason_bfcache_restore);
 
   // Indicates that the tab associated with this recorder was hidden. If no
@@ -70,7 +69,6 @@
   void RecordHistogramsAndTraceEvents(
       TabSwitchResult tab_switch_result,
       bool show_reason_tab_switching,
-      bool show_reason_unoccluded,
       bool show_reason_bfcache_restore,
       const gfx::PresentationFeedback& feedback);
 
diff --git a/third_party/blink/public/mojom/widget/record_content_to_visible_time_request.mojom b/third_party/blink/public/mojom/widget/record_content_to_visible_time_request.mojom
index 994a465..1d3cacc 100644
--- a/third_party/blink/public/mojom/widget/record_content_to_visible_time_request.mojom
+++ b/third_party/blink/public/mojom/widget/record_content_to_visible_time_request.mojom
@@ -10,7 +10,7 @@
 // duration for different events. Here event indicates the reason for which the
 // web contents are visible. These values are set with
 // VisibleTimeRequestTrigger::SetRecordContentToVisibleTimeRequest. Note that
-// |show_reason_tab_switching| and |show_reason_unoccluded| can both be true at
+// |show_reason_tab_switching| and |show_reason_bfcache_restore| can both be true at
 // the same time.
 struct RecordContentToVisibleTimeRequest {
   // The time at which web contents become visible.
@@ -20,9 +20,6 @@
   // If |show_reason_tab_switching| is true, web contents has become visible
   // because of tab switching.
   bool show_reason_tab_switching = false;
-  // If |show_reason_unoccluded| is true, then web contents has become visible
-  // because window un-occlusion has happened.
-  bool show_reason_unoccluded = false;
   // If |show_reason_bfcache_restore| is true, web contents has become visible
   // because of restoring a page from bfcache.
   bool show_reason_bfcache_restore = false;
diff --git a/third_party/blink/renderer/core/annotation/text_annotation_selector.cc b/third_party/blink/renderer/core/annotation/text_annotation_selector.cc
index b8d1f8c..5da0902d 100644
--- a/third_party/blink/renderer/core/annotation/text_annotation_selector.cc
+++ b/third_party/blink/renderer/core/annotation/text_annotation_selector.cc
@@ -38,10 +38,8 @@
   finder_->FindMatch();
 }
 
-void TextAnnotationSelector::DidFindMatch(
-    const RangeInFlatTree& range,
-    const TextFragmentAnchorMetrics::Match match_metrics,
-    bool is_unique) {
+void TextAnnotationSelector::DidFindMatch(const RangeInFlatTree& range,
+                                          bool is_unique) {
   DCHECK(finished_callback_);
   std::move(finished_callback_).Run(&range);
 
diff --git a/third_party/blink/renderer/core/annotation/text_annotation_selector.h b/third_party/blink/renderer/core/annotation/text_annotation_selector.h
index 676503b..5c0fd68 100644
--- a/third_party/blink/renderer/core/annotation/text_annotation_selector.h
+++ b/third_party/blink/renderer/core/annotation/text_annotation_selector.h
@@ -33,9 +33,7 @@
                  FinishedCallback finished_cb) override;
 
   // TextFragmentFinder::Client Interface
-  void DidFindMatch(const RangeInFlatTree& range,
-                    const TextFragmentAnchorMetrics::Match match_metrics,
-                    bool is_unique) override;
+  void DidFindMatch(const RangeInFlatTree& range, bool is_unique) override;
   void NoMatchFound() override;
 
  private:
diff --git a/third_party/blink/renderer/core/fragment_directive/fragment_directive.h b/third_party/blink/renderer/core/fragment_directive/fragment_directive.h
index 7a0e35b..56fdf50 100644
--- a/third_party/blink/renderer/core/fragment_directive/fragment_directive.h
+++ b/third_party/blink/renderer/core/fragment_directive/fragment_directive.h
@@ -50,14 +50,6 @@
     return last_navigation_had_fragment_directive_;
   }
 
-  // Returns the length of the unparsed fragment directive string.
-  // TODO(bokan): This is used only for metrics. It's not clear how useful they
-  // still are. We should either remove the metrics and this method or move
-  // this method to where the FragmentDirective is read and stripped.
-  wtf_size_t LengthForMetrics() const {
-    return fragment_directive_string_length_;
-  }
-
   void Trace(Visitor*) const override;
 
   // Web-exposed FragmentDirective interface.
diff --git a/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor.cc b/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor.cc
index 577ceec..5cf824c0 100644
--- a/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor.cc
+++ b/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor.cc
@@ -193,9 +193,7 @@
   DCHECK(!text_directives.IsEmpty());
   DCHECK(frame_->View());
 
-  metrics_->DidCreateAnchor(
-      text_directives.size(),
-      frame.GetDocument()->fragmentDirective().LengthForMetrics());
+  metrics_->DidCreateAnchor(text_directives.size());
 
   directive_finder_pairs_.ReserveCapacity(text_directives.size());
   for (Member<TextDirective>& directive : text_directives) {
@@ -244,9 +242,6 @@
   frame_->GetDocument()->Markers().RemoveMarkersOfTypes(
       DocumentMarker::MarkerTypes::TextFragment());
 
-  if (user_scrolled_ && !did_scroll_into_view_)
-    metrics_->ScrollCancelled();
-
   if (!did_find_match_) {
     metrics_->DidStartSearch();
   }
@@ -283,17 +278,6 @@
 
 void TextFragmentAnchor::Installed() {}
 
-void TextFragmentAnchor::DidScroll(mojom::blink::ScrollType type) {
-  SelectorFragmentAnchor::DidScroll(type);
-
-  if ((type == mojom::blink::ScrollType::kUser ||
-       type == mojom::blink::ScrollType::kCompositor) &&
-      did_non_zero_scroll_ &&
-      frame_->View()->GetScrollableArea()->GetScrollOffset().IsZero()) {
-    metrics_->DidScrollToTop();
-  }
-}
-
 void TextFragmentAnchor::PerformPreRafActions() {
   if (!needs_perform_pre_raf_actions_)
     return;
@@ -323,10 +307,8 @@
   SelectorFragmentAnchor::Trace(visitor);
 }
 
-void TextFragmentAnchor::DidFindMatch(
-    const RangeInFlatTree& range,
-    const TextFragmentAnchorMetrics::Match match_metrics,
-    bool is_unique) {
+void TextFragmentAnchor::DidFindMatch(const RangeInFlatTree& range,
+                                      bool is_unique) {
   // TODO(bokan): Can this happen or should this be a DCHECK?
   if (search_finished_)
     return;
@@ -372,7 +354,7 @@
 
   Node& first_node = *range.ToEphemeralRange().Nodes().begin();
 
-  metrics_->DidFindMatch(match_metrics);
+  metrics_->DidFindMatch();
   did_find_match_ = true;
 
   if (first_match_needs_scroll_) {
@@ -396,28 +378,14 @@
             ScrollAlignment::CenterAlways(), ScrollAlignment::CenterAlways(),
             mojom::blink::ScrollType::kProgrammatic);
     params->cross_origin_boundaries = false;
-    PhysicalRect scrolled_bounding_box =
-        first_node.GetLayoutObject()->ScrollRectToVisible(bounding_box,
-                                                          std::move(params));
+    first_node.GetLayoutObject()->ScrollRectToVisible(bounding_box,
+                                                      std::move(params));
     did_scroll_into_view_ = true;
 
     if (AXObjectCache* cache = frame_->GetDocument()->ExistingAXObjectCache())
       cache->HandleScrolledToAnchor(&first_node);
 
-    metrics_->DidScroll();
-
-    // We scrolled the text into view if the main document scrolled or the text
-    // bounding box changed, i.e. if it was scrolled in a nested scroller.
-    // TODO(nburris): The rect returned by ScrollRectToVisible,
-    // scrolled_bounding_box, should be in frame coordinates in which case
-    // just checking its location would suffice, but there is a bug where it is
-    // actually in document coordinates and therefore does not change with a
-    // main document scroll.
-    if (!frame_->View()->GetScrollableArea()->GetScrollOffset().IsZero() ||
-        scrolled_bounding_box.offset != bounding_box.offset) {
-      did_non_zero_scroll_ = true;
-      metrics_->DidNonZeroScroll();
-    }
+    metrics_->DidInvokeScrollIntoView();
   }
   EphemeralRange dom_range =
       EphemeralRange(ToPositionInDOMTree(range.StartPosition()),
@@ -468,7 +436,6 @@
 
   frame_->GetDocument()->Markers().RemoveMarkersOfTypes(
       DocumentMarker::MarkerTypes::TextFragment());
-  metrics_->Dismissed();
 
   return SelectorFragmentAnchor::Dismiss();
 }
diff --git a/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor.h b/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor.h
index 8c6dd2c..816b476 100644
--- a/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor.h
+++ b/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor.h
@@ -58,8 +58,6 @@
 
   void Installed() override;
 
-  void DidScroll(mojom::blink::ScrollType type) override;
-
   void PerformPreRafActions() override;
 
   // Removes text match highlights if any highlight is in view.
@@ -70,9 +68,7 @@
   void Trace(Visitor*) const override;
 
   // TextFragmentFinder::Client interface
-  void DidFindMatch(const RangeInFlatTree& range,
-                    const TextFragmentAnchorMetrics::Match match_metrics,
-                    bool is_unique) override;
+  void DidFindMatch(const RangeInFlatTree& range, bool is_unique) override;
 
   void NoMatchFound() override {}
 
@@ -114,9 +110,6 @@
   // If the text fragment anchor is defined as a fragment directive and we don't
   // find a match, we fall back to the element anchor if it is present.
   Member<ElementFragmentAnchor> element_fragment_anchor_;
-  // Whether we performed a non-zero scroll to scroll a match into view. Used
-  // to determine whether the user subsequently scrolls back to the top.
-  bool did_non_zero_scroll_ = false;
   // Whether PerformPreRafActions should run at the next rAF.
   bool needs_perform_pre_raf_actions_ = false;
 
diff --git a/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor_metrics.cc b/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor_metrics.cc
index 2a8b8ce..99ef749 100644
--- a/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor_metrics.cc
+++ b/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor_metrics.cc
@@ -15,183 +15,73 @@
 
 namespace blink {
 
-namespace {
-
-const size_t kMaxTraceEventStringLength = 1000;
-
-}  // namespace
-
 TextFragmentAnchorMetrics::TextFragmentAnchorMetrics(Document* document)
     : document_(document), tick_clock_(base::DefaultTickClock::GetInstance()) {}
 
-void TextFragmentAnchorMetrics::DidCreateAnchor(int selector_count,
-                                                int directive_length) {
+void TextFragmentAnchorMetrics::DidCreateAnchor(int selector_count) {
   UseCounter::Count(document_, WebFeature::kTextFragmentAnchor);
   selector_count_ = selector_count;
-  directive_length_ = directive_length;
 }
 
-void TextFragmentAnchorMetrics::DidFindMatch(Match match) {
-  matches_.push_back(match);
+void TextFragmentAnchorMetrics::DidFindMatch() {
+  ++matches_count_;
 }
 
 void TextFragmentAnchorMetrics::ResetMatchCount() {
-  matches_.clear();
+  matches_count_ = 0;
 }
 
 void TextFragmentAnchorMetrics::DidFindAmbiguousMatch() {
   ambiguous_match_ = true;
 }
 
-void TextFragmentAnchorMetrics::ScrollCancelled() {
-  scroll_cancelled_ = true;
-}
-
 void TextFragmentAnchorMetrics::DidStartSearch() {
   if (search_start_time_.is_null())
     search_start_time_ = tick_clock_->NowTicks();
 }
 
-void TextFragmentAnchorMetrics::DidScroll() {
+void TextFragmentAnchorMetrics::DidInvokeScrollIntoView() {
   if (first_scroll_into_view_time_.is_null())
     first_scroll_into_view_time_ = tick_clock_->NowTicks();
 }
 
-void TextFragmentAnchorMetrics::DidNonZeroScroll() {
-  did_non_zero_scroll_ = true;
-}
-
-void TextFragmentAnchorMetrics::DidScrollToTop() {
-  if (did_scroll_to_top_)
-    return;
-  did_scroll_to_top_ = true;
-
-  base::TimeTicks scroll_to_top_time = tick_clock_->NowTicks();
-
-  DCHECK(!first_scroll_into_view_time_.is_null());
-  DCHECK(scroll_to_top_time >= first_scroll_into_view_time_);
-
-  std::string uma_prefix = GetPrefixForHistograms();
-
-  base::TimeDelta time_to_scroll_to_top(scroll_to_top_time -
-                                        first_scroll_into_view_time_);
-  base::UmaHistogramTimes(base::StrCat({uma_prefix, "TimeToScrollToTop"}),
-                          time_to_scroll_to_top);
-  TRACE_EVENT_INSTANT1("blink", "TextFragmentAnchorMetrics::ReportMetrics",
-                       TRACE_EVENT_SCOPE_THREAD, "time_to_scroll_to_top",
-                       time_to_scroll_to_top.InMilliseconds());
-}
-
 void TextFragmentAnchorMetrics::ReportMetrics() {
 #ifndef NDEBUG
   DCHECK(!metrics_reported_);
 #endif
-  DCHECK(selector_count_);
-  DCHECK(matches_.size() <= selector_count_);
+  DCHECK_GT(selector_count_, 0);
+  DCHECK_GE(matches_count_, 0);
+  DCHECK_LE(matches_count_, selector_count_);
   DCHECK(!search_start_time_.is_null());
 
-  if (matches_.size() > 0) {
+  if (matches_count_ > 0) {
     UseCounter::Count(document_, WebFeature::kTextFragmentAnchorMatchFound);
   }
 
   shared_highlighting::LogLinkOpenedUkmEvent(
       document_->UkmRecorder(), document_->UkmSourceID(),
       KURL(document_->referrer()),
-      /*success=*/matches_.size() == selector_count_);
+      /*success=*/matches_count_ == selector_count_);
 
   std::string uma_prefix = GetPrefixForHistograms();
 
-  base::UmaHistogramCounts100(base::StrCat({uma_prefix, "SelectorCount"}),
-                              selector_count_);
-  TRACE_EVENT_INSTANT1("blink", "TextFragmentAnchorMetrics::ReportMetrics",
-                       TRACE_EVENT_SCOPE_THREAD, "selector_count",
-                       selector_count_);
-
-  base::UmaHistogramCounts1000(base::StrCat({uma_prefix, "DirectiveLength"}),
-                               directive_length_);
-  TRACE_EVENT_INSTANT1("blink", "TextFragmentAnchorMetrics::ReportMetrics",
-                       TRACE_EVENT_SCOPE_THREAD, "directive_length",
-                       directive_length_);
-
   const int match_rate_percent =
-      static_cast<int>(100 * ((matches_.size() + 0.0) / selector_count_));
+      base::ClampFloor((100.0 * matches_count_) / selector_count_);
   base::UmaHistogramPercentage(base::StrCat({uma_prefix, "MatchRate"}),
                                match_rate_percent);
   TRACE_EVENT_INSTANT1("blink", "TextFragmentAnchorMetrics::ReportMetrics",
                        TRACE_EVENT_SCOPE_THREAD, "match_rate",
                        match_rate_percent);
 
-  for (const Match& match : matches_) {
-    TRACE_EVENT_INSTANT2(
-        "blink", "TextFragmentAnchorMetrics::ReportMetrics",
-        TRACE_EVENT_SCOPE_THREAD, "match_found",
-        match.text.Utf8().substr(0, kMaxTraceEventStringLength), "match_length",
-        match.text.length());
-
-    if (match.selector.Type() == TextFragmentSelector::kExact) {
-      base::UmaHistogramCounts1000(
-          base::StrCat({uma_prefix, "ExactTextLength"}), match.text.length());
-      TRACE_EVENT_INSTANT1("blink", "TextFragmentAnchorMetrics::ReportMetrics",
-                           TRACE_EVENT_SCOPE_THREAD, "exact_text_length",
-                           match.text.length());
-
-      base::UmaHistogramBoolean(base::StrCat({uma_prefix, "ListItemMatch"}),
-                                match.is_list_item);
-      base::UmaHistogramBoolean(base::StrCat({uma_prefix, "TableCellMatch"}),
-                                match.is_table_cell);
-    } else if (match.selector.Type() == TextFragmentSelector::kRange) {
-      base::UmaHistogramCounts1000(
-          base::StrCat({uma_prefix, "RangeMatchLength"}), match.text.length());
-      TRACE_EVENT_INSTANT1("blink", "TextFragmentAnchorMetrics::ReportMetrics",
-                           TRACE_EVENT_SCOPE_THREAD, "range_match_length",
-                           match.text.length());
-
-      base::UmaHistogramCounts1000(
-          base::StrCat({uma_prefix, "StartTextLength"}),
-          match.selector.Start().length());
-      TRACE_EVENT_INSTANT1("blink", "TextFragmentAnchorMetrics::ReportMetrics",
-                           TRACE_EVENT_SCOPE_THREAD, "start_text_length",
-                           match.selector.Start().length());
-
-      base::UmaHistogramCounts1000(base::StrCat({uma_prefix, "EndTextLength"}),
-                                   match.selector.End().length());
-      TRACE_EVENT_INSTANT1("blink", "TextFragmentAnchorMetrics::ReportMetrics",
-                           TRACE_EVENT_SCOPE_THREAD, "end_text_length",
-                           match.selector.End().length());
-
-      base::UmaHistogramBoolean(
-          base::StrCat({uma_prefix, "SpansMultipleBlocks"}),
-          match.spans_multiple_blocks);
-
-      // We only record ListItemMatch and TableCellMatch for exact matches
-      DCHECK(!match.is_list_item && !match.is_table_cell);
-    }
-
-    base::UmaHistogramEnumeration(base::StrCat({uma_prefix, "Parameters"}),
-                                  GetParametersForSelector(match.selector));
-  }
-
   base::UmaHistogramBoolean(base::StrCat({uma_prefix, "AmbiguousMatch"}),
                             ambiguous_match_);
   TRACE_EVENT_INSTANT1("blink", "TextFragmentAnchorMetrics::ReportMetrics",
                        TRACE_EVENT_SCOPE_THREAD, "ambiguous_match",
                        ambiguous_match_);
 
-  base::UmaHistogramBoolean(base::StrCat({uma_prefix, "ScrollCancelled"}),
-                            scroll_cancelled_);
-  TRACE_EVENT_INSTANT1("blink", "TextFragmentAnchorMetrics::ReportMetrics",
-                       TRACE_EVENT_SCOPE_THREAD, "scroll_cancelled",
-                       scroll_cancelled_);
-
   if (!first_scroll_into_view_time_.is_null()) {
     DCHECK(first_scroll_into_view_time_ >= search_start_time_);
 
-    base::UmaHistogramBoolean(base::StrCat({uma_prefix, "DidScrollIntoView"}),
-                              did_non_zero_scroll_);
-    TRACE_EVENT_INSTANT1("blink", "TextFragmentAnchorMetrics::ReportMetrics",
-                         TRACE_EVENT_SCOPE_THREAD, "did_scroll_into_view",
-                         did_non_zero_scroll_);
-
     base::TimeDelta time_to_scroll_into_view(first_scroll_into_view_time_ -
                                              search_start_time_);
     base::UmaHistogramTimes(base::StrCat({uma_prefix, "TimeToScrollIntoView"}),
@@ -210,13 +100,6 @@
 #endif
 }
 
-void TextFragmentAnchorMetrics::Dismissed() {
-  // We report Dismissed separately from ReportMetrics as it may or may not
-  // get called in the lifetime of the TextFragmentAnchor.
-  TRACE_EVENT_INSTANT0("blink", "TextFragmentAnchorMetrics::Dismissed",
-                       TRACE_EVENT_SCOPE_THREAD);
-}
-
 void TextFragmentAnchorMetrics::Trace(Visitor* visitor) const {
   visitor->Trace(document_);
 }
diff --git a/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor_metrics.h b/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor_metrics.h
index e5927ca..d8286837 100644
--- a/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor_metrics.h
+++ b/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor_metrics.h
@@ -18,17 +18,6 @@
 class CORE_EXPORT TextFragmentAnchorMetrics final
     : public GarbageCollected<TextFragmentAnchorMetrics> {
  public:
-  struct Match {
-    explicit Match(TextFragmentSelector text_fragment_selector)
-        : selector(text_fragment_selector) {}
-
-    String text;
-    TextFragmentSelector selector;
-    bool is_list_item = false;
-    bool is_table_cell = false;
-    bool spans_multiple_blocks = false;
-  };
-
   // An enum to indicate which parameters were specified in the text fragment.
   enum class TextFragmentAnchorParameters {
     kUnknown = 0,
@@ -56,27 +45,19 @@
   static TextFragmentAnchorParameters GetParametersForSelector(
       const TextFragmentSelector& selector);
 
-  void DidCreateAnchor(int selector_count, int directive_length);
+  void DidCreateAnchor(int selector_count);
 
-  void DidFindMatch(Match match);
+  void DidFindMatch();
   void ResetMatchCount();
 
   void DidFindAmbiguousMatch();
 
-  void ScrollCancelled();
-
   void DidStartSearch();
 
-  void DidScroll();
-
-  void DidNonZeroScroll();
-
-  void DidScrollToTop();
+  void DidInvokeScrollIntoView();
 
   void ReportMetrics();
 
-  void Dismissed();
-
   void SetTickClockForTesting(const base::TickClock* tick_clock);
 
   void SetSearchEngineSource(bool has_search_engine_source);
@@ -92,15 +73,11 @@
   bool metrics_reported_ = false;
 #endif
 
-  wtf_size_t selector_count_ = 0;
-  wtf_size_t directive_length_ = 0;
-  Vector<Match> matches_;
+  int selector_count_ = 0;
+  int matches_count_ = 0;
   bool ambiguous_match_ = false;
-  bool scroll_cancelled_ = false;
   base::TimeTicks search_start_time_;
   base::TimeTicks first_scroll_into_view_time_;
-  bool did_non_zero_scroll_ = false;
-  bool did_scroll_to_top_ = false;
   bool has_search_engine_source_ = false;
 
   const base::TickClock* tick_clock_;
diff --git a/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor_metrics_test.cc b/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor_metrics_test.cc
index 03951d3..50a4356 100644
--- a/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor_metrics_test.cc
+++ b/third_party/blink/renderer/core/fragment_directive/text_fragment_anchor_metrics_test.cc
@@ -100,11 +100,6 @@
   Compositor().BeginFrame();
   BeginEmptyFrame();
 
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.SelectorCount",
-                                     1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.SelectorCount", 2, 1);
-
   histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.MatchRate", 1);
   histogram_tester_.ExpectUniqueSample("TextFragmentAnchor.Unknown.MatchRate",
                                        50, 1);
@@ -115,55 +110,8 @@
       "TextFragmentAnchor.Unknown.AmbiguousMatch", 1, 1);
 
   histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.ScrollCancelled", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.ScrollCancelled", 0, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.DidScrollIntoView", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.DidScrollIntoView", 1, 1);
-
-  histogram_tester_.ExpectTotalCount(
       "TextFragmentAnchor.Unknown.TimeToScrollIntoView", 1);
 
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.DirectiveLength", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.DirectiveLength", 18, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.ExactTextLength", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.ExactTextLength", 4, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.RangeMatchLength", 0);
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.StartTextLength", 0);
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.EndTextLength",
-                                     0);
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.Parameters",
-                                     1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.Parameters",
-      static_cast<int>(
-          TextFragmentAnchorMetrics::TextFragmentAnchorParameters::kExactText),
-      1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.TimeToScrollToTop", 0);
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.ListItemMatch",
-                                     1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.ListItemMatch", 0, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.TableCellMatch", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.TableCellMatch", 0, 1);
   histogram_tester_.ExpectTotalCount("TextFragmentAnchor.LinkOpenSource", 1);
   histogram_tester_.ExpectUniqueSample("TextFragmentAnchor.LinkOpenSource", 0,
                                        1);
@@ -200,11 +148,6 @@
   BeginEmptyFrame();
 
   histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.SelectorCount", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.SearchEngine.SelectorCount", 2, 1);
-
-  histogram_tester_.ExpectTotalCount(
       "TextFragmentAnchor.SearchEngine.MatchRate", 1);
   histogram_tester_.ExpectUniqueSample(
       "TextFragmentAnchor.SearchEngine.MatchRate", 50, 1);
@@ -215,55 +158,8 @@
       "TextFragmentAnchor.SearchEngine.AmbiguousMatch", 1, 1);
 
   histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.ScrollCancelled", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.SearchEngine.ScrollCancelled", 0, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.DidScrollIntoView", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.SearchEngine.DidScrollIntoView", 1, 1);
-
-  histogram_tester_.ExpectTotalCount(
       "TextFragmentAnchor.SearchEngine.TimeToScrollIntoView", 1);
 
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.DirectiveLength", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.SearchEngine.DirectiveLength", 18, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.ExactTextLength", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.SearchEngine.ExactTextLength", 4, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.RangeMatchLength", 0);
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.StartTextLength", 0);
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.EndTextLength", 0);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.Parameters", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.SearchEngine.Parameters",
-      static_cast<int>(
-          TextFragmentAnchorMetrics::TextFragmentAnchorParameters::kExactText),
-      1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.TimeToScrollToTop", 0);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.ListItemMatch", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.SearchEngine.ListItemMatch", 0, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.TableCellMatch", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.SearchEngine.TableCellMatch", 0, 1);
   histogram_tester_.ExpectTotalCount("TextFragmentAnchor.LinkOpenSource", 1);
   histogram_tester_.ExpectUniqueSample("TextFragmentAnchor.LinkOpenSource", 1,
                                        1);
@@ -293,11 +189,6 @@
   Compositor().BeginFrame();
   BeginEmptyFrame();
 
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.SelectorCount",
-                                     1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.SelectorCount", 1, 1);
-
   histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.MatchRate", 1);
   histogram_tester_.ExpectUniqueSample("TextFragmentAnchor.Unknown.MatchRate",
                                        0, 1);
@@ -308,43 +199,8 @@
       "TextFragmentAnchor.Unknown.AmbiguousMatch", 0, 1);
 
   histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.ScrollCancelled", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.ScrollCancelled", 0, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.DidScrollIntoView", 0);
-
-  histogram_tester_.ExpectTotalCount(
       "TextFragmentAnchor.Unknown.TimeToScrollIntoView", 0);
 
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.DirectiveLength", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.DirectiveLength", 8, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.ExactTextLength", 0);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.RangeMatchLength", 0);
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.StartTextLength", 0);
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.EndTextLength",
-                                     0);
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.Parameters",
-                                     0);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.TimeToScrollToTop", 0);
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.ListItemMatch",
-                                     0);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.TableCellMatch", 0);
-
   histogram_tester_.ExpectTotalCount("TextFragmentAnchor.LinkOpenSource", 1);
   histogram_tester_.ExpectUniqueSample("TextFragmentAnchor.LinkOpenSource", 0,
                                        1);
@@ -381,11 +237,6 @@
   BeginEmptyFrame();
 
   histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.SelectorCount", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.SearchEngine.SelectorCount", 1, 1);
-
-  histogram_tester_.ExpectTotalCount(
       "TextFragmentAnchor.SearchEngine.MatchRate", 1);
   histogram_tester_.ExpectUniqueSample(
       "TextFragmentAnchor.SearchEngine.MatchRate", 0, 1);
@@ -396,43 +247,8 @@
       "TextFragmentAnchor.SearchEngine.AmbiguousMatch", 0, 1);
 
   histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.ScrollCancelled", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.SearchEngine.ScrollCancelled", 0, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.DidScrollIntoView", 0);
-
-  histogram_tester_.ExpectTotalCount(
       "TextFragmentAnchor.SearchEngine.TimeToScrollIntoView", 0);
 
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.DirectiveLength", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.SearchEngine.DirectiveLength", 8, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.ExactTextLength", 0);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.RangeMatchLength", 0);
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.StartTextLength", 0);
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.EndTextLength", 0);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.Parameters", 0);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.TimeToScrollToTop", 0);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.ListItemMatch", 0);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.SearchEngine.TableCellMatch", 0);
-
   histogram_tester_.ExpectTotalCount("TextFragmentAnchor.LinkOpenSource", 1);
   histogram_tester_.ExpectUniqueSample("TextFragmentAnchor.LinkOpenSource", 1,
                                        1);
@@ -452,50 +268,14 @@
 
   RunAsyncMatchingTasks();
 
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.SelectorCount",
-                                     0);
-
   histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.MatchRate", 0);
 
   histogram_tester_.ExpectTotalCount(
       "TextFragmentAnchor.Unknown.AmbiguousMatch", 0);
 
   histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.ScrollCancelled", 0);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.DidScrollIntoView", 0);
-
-  histogram_tester_.ExpectTotalCount(
       "TextFragmentAnchor.Unknown.TimeToScrollIntoView", 0);
 
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.DirectiveLength", 0);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.ExactTextLength", 0);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.RangeMatchLength", 0);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.StartTextLength", 0);
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.EndTextLength",
-                                     0);
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.Parameters",
-                                     0);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.TimeToScrollToTop", 0);
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.ListItemMatch",
-                                     0);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.TableCellMatch", 0);
-
   histogram_tester_.ExpectTotalCount("TextFragmentAnchor.LinkOpenSource", 0);
 }
 
@@ -514,11 +294,6 @@
   Compositor().BeginFrame();
   BeginEmptyFrame();
 
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.SelectorCount",
-                                     1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.SelectorCount", 1, 1);
-
   histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.MatchRate", 1);
   histogram_tester_.ExpectUniqueSample("TextFragmentAnchor.Unknown.MatchRate",
                                        100, 1);
@@ -529,56 +304,8 @@
       "TextFragmentAnchor.Unknown.AmbiguousMatch", 0, 1);
 
   histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.ScrollCancelled", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.ScrollCancelled", 0, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.DidScrollIntoView", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.DidScrollIntoView", 0, 1);
-
-  histogram_tester_.ExpectTotalCount(
       "TextFragmentAnchor.Unknown.TimeToScrollIntoView", 1);
 
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.DirectiveLength", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.DirectiveLength", 9, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.ExactTextLength", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.ExactTextLength", 4, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.RangeMatchLength", 0);
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.StartTextLength", 0);
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.EndTextLength",
-                                     0);
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.Parameters",
-                                     1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.Parameters",
-      static_cast<int>(
-          TextFragmentAnchorMetrics::TextFragmentAnchorParameters::kExactText),
-      1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.TimeToScrollToTop", 0);
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.ListItemMatch",
-                                     1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.ListItemMatch", 0, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.TableCellMatch", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.TableCellMatch", 0, 1);
-
   histogram_tester_.ExpectTotalCount("TextFragmentAnchor.LinkOpenSource", 1);
   histogram_tester_.ExpectUniqueSample("TextFragmentAnchor.LinkOpenSource", 0,
                                        1);
@@ -606,11 +333,6 @@
   Compositor().BeginFrame();
   BeginEmptyFrame();
 
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.SelectorCount",
-                                     1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.SelectorCount", 4, 1);
-
   histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.MatchRate", 1);
   histogram_tester_.ExpectUniqueSample("TextFragmentAnchor.Unknown.MatchRate",
                                        100, 1);
@@ -621,75 +343,8 @@
       "TextFragmentAnchor.Unknown.AmbiguousMatch", 0, 1);
 
   histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.ScrollCancelled", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.ScrollCancelled", 0, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.DidScrollIntoView", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.DidScrollIntoView", 0, 1);
-
-  histogram_tester_.ExpectTotalCount(
       "TextFragmentAnchor.Unknown.TimeToScrollIntoView", 1);
 
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.DirectiveLength", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.DirectiveLength", 61, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.ExactTextLength", 4);
-  // "this", "test", "some"
-  histogram_tester_.ExpectBucketCount(
-      "TextFragmentAnchor.Unknown.ExactTextLength", 4, 3);
-  // "a"
-  histogram_tester_.ExpectBucketCount(
-      "TextFragmentAnchor.Unknown.ExactTextLength", 1, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.RangeMatchLength", 0);
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.StartTextLength", 0);
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.EndTextLength",
-                                     0);
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.Parameters",
-                                     4);
-  histogram_tester_.ExpectBucketCount(
-      "TextFragmentAnchor.Unknown.Parameters",
-      static_cast<int>(
-          TextFragmentAnchorMetrics::TextFragmentAnchorParameters::kExactText),
-      1);
-  histogram_tester_.ExpectBucketCount(
-      "TextFragmentAnchor.Unknown.Parameters",
-      static_cast<int>(TextFragmentAnchorMetrics::TextFragmentAnchorParameters::
-                           kExactTextWithPrefix),
-      1);
-  histogram_tester_.ExpectBucketCount(
-      "TextFragmentAnchor.Unknown.Parameters",
-      static_cast<int>(TextFragmentAnchorMetrics::TextFragmentAnchorParameters::
-                           kExactTextWithSuffix),
-      1);
-  histogram_tester_.ExpectBucketCount(
-      "TextFragmentAnchor.Unknown.Parameters",
-      static_cast<int>(TextFragmentAnchorMetrics::TextFragmentAnchorParameters::
-                           kExactTextWithContext),
-      1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.TimeToScrollToTop", 0);
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.ListItemMatch",
-                                     4);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.ListItemMatch", 0, 4);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.TableCellMatch", 4);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.TableCellMatch", 0, 4);
-
   histogram_tester_.ExpectTotalCount("TextFragmentAnchor.LinkOpenSource", 1);
   histogram_tester_.ExpectUniqueSample("TextFragmentAnchor.LinkOpenSource", 0,
                                        1);
@@ -718,11 +373,6 @@
   Compositor().BeginFrame();
   BeginEmptyFrame();
 
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.SelectorCount",
-                                     1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.SelectorCount", 4, 1);
-
   histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.MatchRate", 1);
   histogram_tester_.ExpectUniqueSample("TextFragmentAnchor.Unknown.MatchRate",
                                        100, 1);
@@ -733,322 +383,13 @@
       "TextFragmentAnchor.Unknown.AmbiguousMatch", 0, 1);
 
   histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.ScrollCancelled", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.ScrollCancelled", 0, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.DidScrollIntoView", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.DidScrollIntoView", 0, 1);
-
-  histogram_tester_.ExpectTotalCount(
       "TextFragmentAnchor.Unknown.TimeToScrollIntoView", 1);
 
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.DirectiveLength", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.DirectiveLength", 82, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.ExactTextLength", 0);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.RangeMatchLength", 4);
-  // "This is"
-  histogram_tester_.ExpectBucketCount(
-      "TextFragmentAnchor.Unknown.RangeMatchLength", 7, 1);
-  // "test page", "with some"
-  histogram_tester_.ExpectBucketCount(
-      "TextFragmentAnchor.Unknown.RangeMatchLength", 9, 2);
-  // "nothing at"
-  histogram_tester_.ExpectBucketCount(
-      "TextFragmentAnchor.Unknown.RangeMatchLength", 10, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.StartTextLength", 4);
-  // "this", "test", "with"
-  histogram_tester_.ExpectBucketCount(
-      "TextFragmentAnchor.Unknown.StartTextLength", 4, 3);
-  // "nothing"
-  histogram_tester_.ExpectBucketCount(
-      "TextFragmentAnchor.Unknown.StartTextLength", 7, 1);
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.EndTextLength",
-                                     4);
-  // "is", "at"
-  histogram_tester_.ExpectBucketCount(
-      "TextFragmentAnchor.Unknown.EndTextLength", 2, 2);
-  // "page", "some"
-  histogram_tester_.ExpectBucketCount(
-      "TextFragmentAnchor.Unknown.EndTextLength", 4, 2);
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.Parameters",
-                                     4);
-  histogram_tester_.ExpectBucketCount(
-      "TextFragmentAnchor.Unknown.Parameters",
-      static_cast<int>(
-          TextFragmentAnchorMetrics::TextFragmentAnchorParameters::kTextRange),
-      1);
-  histogram_tester_.ExpectBucketCount(
-      "TextFragmentAnchor.Unknown.Parameters",
-      static_cast<int>(TextFragmentAnchorMetrics::TextFragmentAnchorParameters::
-                           kTextRangeWithPrefix),
-      1);
-  histogram_tester_.ExpectBucketCount(
-      "TextFragmentAnchor.Unknown.Parameters",
-      static_cast<int>(TextFragmentAnchorMetrics::TextFragmentAnchorParameters::
-                           kTextRangeWithSuffix),
-      1);
-  histogram_tester_.ExpectBucketCount(
-      "TextFragmentAnchor.Unknown.Parameters",
-      static_cast<int>(TextFragmentAnchorMetrics::TextFragmentAnchorParameters::
-                           kTextRangeWithContext),
-      1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.TimeToScrollToTop", 0);
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.ListItemMatch",
-                                     0);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.TableCellMatch", 0);
-
   histogram_tester_.ExpectTotalCount("TextFragmentAnchor.LinkOpenSource", 1);
   histogram_tester_.ExpectUniqueSample("TextFragmentAnchor.LinkOpenSource", 0,
                                        1);
 }
 
-class TextFragmentAnchorScrollMetricsTest
-    : public TextFragmentAnchorMetricsTest,
-      public testing::WithParamInterface<mojom::blink::ScrollType> {
- protected:
-  bool IsUserScrollType() {
-    return GetParam() == mojom::blink::ScrollType::kCompositor ||
-           GetParam() == mojom::blink::ScrollType::kUser;
-  }
-};
-
-INSTANTIATE_TEST_SUITE_P(
-    ScrollTypes,
-    TextFragmentAnchorScrollMetricsTest,
-    testing::Values(mojom::blink::ScrollType::kUser,
-                    mojom::blink::ScrollType::kProgrammatic,
-                    mojom::blink::ScrollType::kClamping,
-                    mojom::blink::ScrollType::kCompositor,
-                    mojom::blink::ScrollType::kAnchoring,
-                    mojom::blink::ScrollType::kSequenced));
-
-// Test that the ScrollCancelled metric gets reported when a user scroll cancels
-// the scroll into view.
-TEST_P(TextFragmentAnchorScrollMetricsTest, ScrollCancelled) {
-  SimRequest request("https://example.com/test.html#:~:text=test", "text/html");
-  SimSubresourceRequest css_request("https://example.com/test.css", "text/css");
-  LoadURL("https://example.com/test.html#:~:text=test");
-  request.Complete(R"HTML(
-    <!DOCTYPE html>
-    <style>
-      body {
-        height: 1200px;
-      }
-      p {
-        position: absolute;
-        top: 1000px;
-        visibility: hidden;
-      }
-    </style>
-    <link rel=stylesheet href=test.css>
-    <p>This is a test page</p>
-  )HTML");
-
-  GetDocument().View()->UpdateAllLifecyclePhasesForTest();
-
-  mojom::blink::ScrollType scroll_type = GetParam();
-  GetDocument().View()->LayoutViewport()->ScrollBy(ScrollOffset(0, 100),
-                                                   scroll_type);
-
-  // Set the target text to visible and change its position to cause a layout
-  // and invoke the fragment anchor.
-  css_request.Complete("p { visibility: visible; top: 1001px; }");
-  RunAsyncMatchingTasks();
-
-  // Render two frames to handle the async step added by the beforematch event.
-  Compositor().BeginFrame();
-  BeginEmptyFrame();
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.ScrollCancelled", 1);
-
-  // A user scroll should have caused this to be canceled, other kinds of
-  // scrolls should have no effect.
-  if (IsUserScrollType()) {
-    histogram_tester_.ExpectUniqueSample(
-        "TextFragmentAnchor.Unknown.ScrollCancelled", 1, 1);
-
-    histogram_tester_.ExpectTotalCount(
-        "TextFragmentAnchor.Unknown.DidScrollIntoView", 0);
-    histogram_tester_.ExpectTotalCount(
-        "TextFragmentAnchor.Unknown.TimeToScrollIntoView", 0);
-  } else {
-    histogram_tester_.ExpectUniqueSample(
-        "TextFragmentAnchor.Unknown.ScrollCancelled", 0, 1);
-    histogram_tester_.ExpectTotalCount(
-        "TextFragmentAnchor.Unknown.DidScrollIntoView", 1);
-    histogram_tester_.ExpectTotalCount(
-        "TextFragmentAnchor.Unknown.TimeToScrollIntoView", 1);
-  }
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.SelectorCount",
-                                     1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.SelectorCount", 1, 1);
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.MatchRate", 1);
-  histogram_tester_.ExpectUniqueSample("TextFragmentAnchor.Unknown.MatchRate",
-                                       100, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.AmbiguousMatch", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.AmbiguousMatch", 0, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.DirectiveLength", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.DirectiveLength", 9, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.ExactTextLength", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.ExactTextLength", 4, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.RangeMatchLength", 0);
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.StartTextLength", 0);
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.EndTextLength",
-                                     0);
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.Parameters",
-                                     1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.Parameters",
-      static_cast<int>(
-          TextFragmentAnchorMetrics::TextFragmentAnchorParameters::kExactText),
-      1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.TimeToScrollToTop", 0);
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.ListItemMatch",
-                                     1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.ListItemMatch", 0, 1);
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.TableCellMatch", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.TableCellMatch", 0, 1);
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.LinkOpenSource", 1);
-  histogram_tester_.ExpectUniqueSample("TextFragmentAnchor.LinkOpenSource", 0,
-                                       1);
-}
-
-// Test that the user scrolling back to the top of the page reports metrics
-TEST_P(TextFragmentAnchorScrollMetricsTest, TimeToScrollToTop) {
-  mojom::blink::ScrollType scroll_type = GetParam();
-
-  // Set the page to be initially hidden to delay the text fragment so that we
-  // can set the mock TickClock.
-  WebView().SetVisibilityState(mojom::blink::PageVisibilityState::kHidden,
-                               /*initial_state=*/true);
-
-  SimRequest request("https://example.com/test.html#:~:text=test%20page",
-                     "text/html");
-  LoadURL("https://example.com/test.html#:~:text=test%20page");
-  request.Complete(R"HTML(
-    <!DOCTYPE html>
-    <style>
-      body {
-        height: 2200px;
-      }
-      p {
-        position: absolute;
-        top: 1000px;
-      }
-    </style>
-    <p>This is a test page</p>
-  )HTML");
-  RunAsyncMatchingTasks();
-
-  BeginEmptyFrame();
-  BeginEmptyFrame();
-
-  // Set the test TickClock and then render the page visible to activate the
-  // text fragment.
-  base::SimpleTestTickClock tick_clock;
-  tick_clock.SetNowTicks(base::TimeTicks::Now());
-  static_cast<TextFragmentAnchor*>(GetDocument().View()->GetFragmentAnchor())
-      ->SetTickClockForTesting(&tick_clock);
-  WebView().SetVisibilityState(mojom::blink::PageVisibilityState::kVisible,
-                               /*initial_state=*/false);
-  BeginEmptyFrame();
-  BeginEmptyFrame();
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.TimeToScrollToTop", 0);
-
-  const int64_t time_to_scroll_to_top = 500;
-  tick_clock.Advance(base::Milliseconds(time_to_scroll_to_top));
-
-  ASSERT_GT(GetDocument().View()->LayoutViewport()->GetScrollOffset().y(), 100);
-
-  // Ensure scrolling but not to the top isn't counted.
-  {
-    GetDocument().View()->LayoutViewport()->ScrollBy(ScrollOffset(0, -20),
-                                                     scroll_type);
-    histogram_tester_.ExpectTotalCount(
-        "TextFragmentAnchor.Unknown.TimeToScrollToTop", 0);
-  }
-
-  // Scroll to top and ensure the metric is recorded, but only for user type
-  // scrolls.
-  {
-    GetDocument().View()->LayoutViewport()->SetScrollOffset(ScrollOffset(),
-                                                            scroll_type);
-
-    if (IsUserScrollType()) {
-      histogram_tester_.ExpectTotalCount(
-          "TextFragmentAnchor.Unknown.TimeToScrollToTop", 1);
-      histogram_tester_.ExpectUniqueSample(
-          "TextFragmentAnchor.Unknown.TimeToScrollToTop", time_to_scroll_to_top,
-          1);
-    } else {
-      histogram_tester_.ExpectTotalCount(
-          "TextFragmentAnchor.Unknown.TimeToScrollToTop", 0);
-    }
-  }
-
-  // Scroll down and then back up to the top again to ensure the metric is
-  // recorded only once.
-  {
-    GetDocument().View()->LayoutViewport()->SetScrollOffset(
-        ScrollOffset(0, 100), scroll_type);
-    GetDocument().View()->LayoutViewport()->SetScrollOffset(ScrollOffset(),
-                                                            scroll_type);
-
-    if (IsUserScrollType()) {
-      histogram_tester_.ExpectTotalCount(
-          "TextFragmentAnchor.Unknown.TimeToScrollToTop", 1);
-    } else {
-      histogram_tester_.ExpectTotalCount(
-          "TextFragmentAnchor.Unknown.TimeToScrollToTop", 0);
-    }
-  }
-}
-
 // Test counting cases where the fragment directive fails to parse.
 TEST_F(TextFragmentAnchorMetricsTest, InvalidFragmentDirective) {
   const int kUncounted = 0;
@@ -1093,100 +434,6 @@
   }
 }
 
-// Test recording of the ListItemMatch metric
-TEST_F(TextFragmentAnchorMetricsTest, ListItemMatch) {
-  SimRequest request("https://example.com/test.html#:~:text=list", "text/html");
-  LoadURL("https://example.com/test.html#:~:text=list");
-  request.Complete(R"HTML(
-    <!DOCTYPE html>
-    <ul>
-      <li>Some test content</li>
-      <li>Within a list item</li>
-    </ul>
-  )HTML");
-  RunAsyncMatchingTasks();
-
-  BeginEmptyFrame();
-  BeginEmptyFrame();
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.ListItemMatch",
-                                     1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.ListItemMatch", 1, 1);
-}
-
-// Test recording of the TableCellMatch metric
-TEST_F(TextFragmentAnchorMetricsTest, TableCellMatch) {
-  SimRequest request("https://example.com/test.html#:~:text=table",
-                     "text/html");
-  LoadURL("https://example.com/test.html#:~:text=table");
-  request.Complete(R"HTML(
-    <!DOCTYPE html>
-    <table>
-      <tr>
-        <td>Some test content</td>
-        <td>Within a table cell</td>
-      </tr>
-    </table>
-  )HTML");
-  RunAsyncMatchingTasks();
-
-  BeginEmptyFrame();
-  BeginEmptyFrame();
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.TableCellMatch", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.TableCellMatch", 1, 1);
-}
-
-// Test recording of ListItemMatch for a match nested in a list item
-TEST_F(TextFragmentAnchorMetricsTest, NestedListItemMatch) {
-  SimRequest request("https://example.com/test.html#:~:text=list", "text/html");
-  LoadURL("https://example.com/test.html#:~:text=list");
-  request.Complete(R"HTML(
-    <!DOCTYPE html>
-    <ol>
-      <li>Some test content</li>
-      <li>Within a <span>list</span> item</li>
-    </ol>
-  )HTML");
-  RunAsyncMatchingTasks();
-
-  BeginEmptyFrame();
-  BeginEmptyFrame();
-
-  histogram_tester_.ExpectTotalCount("TextFragmentAnchor.Unknown.ListItemMatch",
-                                     1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.ListItemMatch", 1, 1);
-}
-
-// Test recording of TableCellMatch for a match nested in a table cell
-TEST_F(TextFragmentAnchorMetricsTest, NestedTableCellMatch) {
-  SimRequest request("https://example.com/test.html#:~:text=table",
-                     "text/html");
-  LoadURL("https://example.com/test.html#:~:text=table");
-  request.Complete(R"HTML(
-    <!DOCTYPE html>
-    <table>
-      <tr>
-        <td>Some test content</td>
-        <td>Within a <span>table</span> cell</td>
-      </tr>
-    </table>
-  )HTML");
-  RunAsyncMatchingTasks();
-
-  BeginEmptyFrame();
-  BeginEmptyFrame();
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.TableCellMatch", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.TableCellMatch", 1, 1);
-}
-
 class TextFragmentRelatedMetricTest : public TextFragmentAnchorMetricsTest,
                                       public testing::WithParamInterface<bool> {
  public:
@@ -1202,113 +449,6 @@
                          TextFragmentRelatedMetricTest,
                          testing::Values(false, true));
 
-// Test that we correctly track failed vs. successful element-id lookups. We
-// only count these in cases where we don't have a text directive, when the REF
-// is enabled.
-TEST_P(TextFragmentRelatedMetricTest, ElementIdSuccessFailureCounts) {
-  const int kUncounted = 0;
-  const int kFound = 1;
-  const int kNotFound = 2;
-
-  // When the TextFragmentAnchors feature is on, we should avoid counting the
-  // result of the element-id fragment if a text directive is successfully
-  // parsed. If the feature is off we treat the text directive as an element-id
-  // and should count the result.
-  const int kUncountedOrFound = GetParam() ? kUncounted : kFound;
-
-  // Note: We'll strip the fragment directive (i.e. anything after :~:) leaving
-  // just the element anchor. The fragment directive stripping behavior is now
-  // shipped unflagged so it should always be performed.
-
-  Vector<std::pair<String, int>> test_cases = {
-      {"", kUncounted},
-      {"#element", kFound},
-      {"#doesntExist", kNotFound},
-      // `:~:foo` will be stripped so #element will be found and #doesntexist
-      // ##element will be not found.
-      {"#element:~:foo", kFound},
-      {"#doesntexist:~:foo", kNotFound},
-      {"##element", kNotFound},
-      // If the feature  is on, `:~:text=` will parse so we shouldn't count.
-      // Otherwise, it'll just be stripped so #element will be found.
-      {"#element:~:text=doesntexist", kUncountedOrFound},
-      {"#element:~:text=page", kUncountedOrFound},
-      // If the feature is on, `:~:text` is parsed so we don't count. If it's
-      // off the entire fragment is a directive that's stripped so no search is
-      // performed either.
-      {"#:~:text=doesntexist", kUncounted},
-      {"#:~:text=page", kUncounted},
-      {"#:~:text=name", kUncounted},
-      // If the feature is enabled, `:~:text` parses and we don't count the
-      // element-id. If the feature is off, we still strip the :~: directive
-      // and the remaining fragment does match an element id.
-      {"#element:~:text=name", kUncountedOrFound}};
-
-  const int kNotFoundSample = 0;
-  const int kFoundSample = 1;
-  const std::string histogram = "TextFragmentAnchor.ElementIdFragmentFound";
-
-  // Add counts to each histogram so that calls to GetBucketCount won't fail
-  // due to not finding the histogram.
-  UMA_HISTOGRAM_BOOLEAN(histogram, true);
-  UMA_HISTOGRAM_BOOLEAN(histogram, false);
-  int expected_found_count = 1;
-  int expected_not_found_count = 1;
-
-  for (auto test_case : test_cases) {
-    String url = "https://example.com/test.html" + test_case.first;
-    SimRequest request(url, "text/html");
-    LoadURL(url);
-    request.Complete(R"HTML(
-      <!DOCTYPE html>
-      <p id="element">This is a test page</p>
-      <p id=":~:text=name">This is a test page</p>
-      <p id="element:~:text=name">This is a test page</p>
-    )HTML");
-    // Render two frames to handle the async step added by the beforematch
-    // event.
-    Compositor().BeginFrame();
-    BeginEmptyFrame();
-
-    RunAsyncMatchingTasks();
-
-    auto not_found_count =
-        histogram_tester_.GetBucketCount(histogram, kNotFoundSample);
-    auto found_count =
-        histogram_tester_.GetBucketCount(histogram, kFoundSample);
-    int result = test_case.second;
-    if (result == kFound) {
-      ++expected_found_count;
-      ASSERT_EQ(expected_found_count, found_count)
-          << "ElementId should have been |Found| but did not UseCount on case: "
-          << test_case.first;
-      ASSERT_EQ(expected_not_found_count, not_found_count)
-          << "ElementId should have been |Found| but reported |NotFound| on "
-             "case: "
-          << test_case.first;
-    } else if (result == kNotFound) {
-      ++expected_not_found_count;
-      ASSERT_EQ(expected_not_found_count, not_found_count)
-          << "ElementId should have been |NotFound| but did not UseCount on "
-             "case: "
-          << test_case.first;
-      ASSERT_EQ(expected_found_count, found_count)
-          << "ElementId should have been |NotFound| but reported |Found| on "
-             "case: "
-          << test_case.first;
-    } else {
-      DCHECK_EQ(result, kUncounted);
-      ASSERT_EQ(expected_found_count, found_count)
-          << "Case should not have been counted but reported |Found| on case: "
-          << test_case.first;
-      ASSERT_EQ(expected_not_found_count, not_found_count)
-          << "Case should not have been counted but reported |NotFound| on "
-             "case: "
-          << test_case.first;
-    }
-  }
-}
-
 // Test use counting the document.fragmentDirective API
 TEST_P(TextFragmentRelatedMetricTest, TextFragmentAPIUseCounter) {
   SimRequest request("https://example.com/test.html", "text/html");
@@ -1348,79 +488,6 @@
       WebFeature::kV8Document_FragmentDirective_AttributeGetter));
 }
 
-// Test recording of the SpansMultipleBlocks metric. Records true because the
-// range crosses an intervening block element.
-TEST_F(TextFragmentAnchorMetricsTest, SpansMultipleBlocksInterveningBlock) {
-  SimRequest request("https://example.com/test.html#:~:text=start,end",
-                     "text/html");
-  LoadURL("https://example.com/test.html#:~:text=start,end");
-  request.Complete(R"HTML(
-    <!DOCTYPE html>
-    <div>
-      start of text
-      <div>block</div>
-      text end
-    </div>
-  )HTML");
-  RunAsyncMatchingTasks();
-
-  BeginEmptyFrame();
-  BeginEmptyFrame();
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.SpansMultipleBlocks", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.SpansMultipleBlocks", 1, 1);
-}
-
-// Test recording of the SpansMultipleBlocks metric. Records true because the
-// range start and end are in different block elements.
-TEST_F(TextFragmentAnchorMetricsTest, SpansMultipleBlocks) {
-  SimRequest request("https://example.com/test.html#:~:text=start,end",
-                     "text/html");
-  LoadURL("https://example.com/test.html#:~:text=start,end");
-  request.Complete(R"HTML(
-    <!DOCTYPE html>
-    <div>
-      <div>start of text</div>
-      text end
-    </div>
-  )HTML");
-  RunAsyncMatchingTasks();
-
-  BeginEmptyFrame();
-  BeginEmptyFrame();
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.SpansMultipleBlocks", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.SpansMultipleBlocks", 1, 1);
-}
-
-// Test recording of the SpansMultipleBlocks metric. Records false because the
-// range start and end are in the same block element with no intervening block.
-TEST_F(TextFragmentAnchorMetricsTest, SpansMultipleBlocksSingleBlock) {
-  SimRequest request("https://example.com/test.html#:~:text=start,end",
-                     "text/html");
-  LoadURL("https://example.com/test.html#:~:text=start,end");
-  request.Complete(R"HTML(
-    <!DOCTYPE html>
-    <div>
-      start of <i>text</i>
-      text end
-    </div>
-  )HTML");
-  RunAsyncMatchingTasks();
-
-  BeginEmptyFrame();
-  BeginEmptyFrame();
-
-  histogram_tester_.ExpectTotalCount(
-      "TextFragmentAnchor.Unknown.SpansMultipleBlocks", 1);
-  histogram_tester_.ExpectUniqueSample(
-      "TextFragmentAnchor.Unknown.SpansMultipleBlocks", 0, 1);
-}
-
 // Tests that a LinkOpened UKM Event is recorded upon a successful fragment
 // highlight.
 TEST_F(TextFragmentAnchorMetricsTest, LinkOpenedSuccessUKM) {
diff --git a/third_party/blink/renderer/core/fragment_directive/text_fragment_finder.cc b/third_party/blink/renderer/core/fragment_directive/text_fragment_finder.cc
index 4bd74fb0..72961939 100644
--- a/third_party/blink/renderer/core/fragment_directive/text_fragment_finder.cc
+++ b/third_party/blink/renderer/core/fragment_directive/text_fragment_finder.cc
@@ -87,28 +87,6 @@
   return itr.ComputePosition();
 }
 
-bool ContainedByListItem(const EphemeralRangeInFlatTree& range) {
-  Node* node = range.CommonAncestorContainer();
-  while (node) {
-    if (ListItemOrdinal::IsListItem(*node)) {
-      return true;
-    }
-    node = node->parentNode();
-  }
-  return false;
-}
-
-bool ContainedByTableCell(const EphemeralRangeInFlatTree& range) {
-  Node* node = range.CommonAncestorContainer();
-  while (node) {
-    if (IsTableCell(node)) {
-      return true;
-    }
-    node = node->parentNode();
-  }
-  return false;
-}
-
 }  // namespace
 
 // static
@@ -451,27 +429,8 @@
     first_match_ = potential_match_;
     FindMatchFromPosition(first_match_->EndPosition());
   } else {
-    TextFragmentAnchorMetrics::Match match_metrics(selector_);
     EphemeralRangeInFlatTree potential_match = first_match_->ToEphemeralRange();
-    if (selector_.Type() == TextFragmentSelector::SelectorType::kExact) {
-      // If it's an exact match, we don't need to do the PlainText conversion,
-      // we can just use the text from the selector.
-      DCHECK_EQ(selector_.Start().length(),
-                PlainText(potential_match).length());
-      match_metrics.text = selector_.Start();
-
-      if (ContainedByListItem(potential_match)) {
-        match_metrics.is_list_item = true;
-      }
-      if (ContainedByTableCell(potential_match)) {
-        match_metrics.is_table_cell = true;
-      }
-    } else if (selector_.Type() == TextFragmentSelector::SelectorType::kRange) {
-      match_metrics.text = PlainText(potential_match);
-      match_metrics.spans_multiple_blocks = !IsInSameUninterruptedBlock(
-          potential_match.StartPosition(), potential_match.EndPosition());
-    }
-    client_.DidFindMatch(*first_match_, match_metrics, !potential_match_);
+    client_.DidFindMatch(*first_match_, !potential_match_);
   }
 }
 
diff --git a/third_party/blink/renderer/core/fragment_directive/text_fragment_finder.h b/third_party/blink/renderer/core/fragment_directive/text_fragment_finder.h
index 12f6f236..ece9fa3 100644
--- a/third_party/blink/renderer/core/fragment_directive/text_fragment_finder.h
+++ b/third_party/blink/renderer/core/fragment_directive/text_fragment_finder.h
@@ -30,10 +30,7 @@
  public:
   class Client {
    public:
-    virtual void DidFindMatch(
-        const RangeInFlatTree& range,
-        const TextFragmentAnchorMetrics::Match match_metrics,
-        bool is_unique) = 0;
+    virtual void DidFindMatch(const RangeInFlatTree& range, bool is_unique) = 0;
     virtual void NoMatchFound() = 0;
   };
 
diff --git a/third_party/blink/renderer/core/fragment_directive/text_fragment_finder_test.cc b/third_party/blink/renderer/core/fragment_directive/text_fragment_finder_test.cc
index 87e14ea1..f8b5f4c 100644
--- a/third_party/blink/renderer/core/fragment_directive/text_fragment_finder_test.cc
+++ b/third_party/blink/renderer/core/fragment_directive/text_fragment_finder_test.cc
@@ -30,9 +30,7 @@
 
   void NoMatchFound() override { no_match_called_ = true; }
 
-  void DidFindMatch(const RangeInFlatTree& match,
-                    const TextFragmentAnchorMetrics::Match match_metrics,
-                    bool is_unique) override {}
+  void DidFindMatch(const RangeInFlatTree& match, bool is_unique) override {}
   bool IsNoMatchFoundCalled() { return no_match_called_; }
 
  private:
diff --git a/third_party/blink/renderer/core/fragment_directive/text_fragment_selector_generator.cc b/third_party/blink/renderer/core/fragment_directive/text_fragment_selector_generator.cc
index 3ff1e7d..1853b70 100644
--- a/third_party/blink/renderer/core/fragment_directive/text_fragment_selector_generator.cc
+++ b/third_party/blink/renderer/core/fragment_directive/text_fragment_selector_generator.cc
@@ -176,10 +176,8 @@
                                 state_);
 }
 
-void TextFragmentSelectorGenerator::DidFindMatch(
-    const RangeInFlatTree& match,
-    const TextFragmentAnchorMetrics::Match match_metrics,
-    bool is_unique) {
+void TextFragmentSelectorGenerator::DidFindMatch(const RangeInFlatTree& match,
+                                                 bool is_unique) {
   if (is_unique &&
       PlainText(match.ToEphemeralRange()).StripWhiteSpace().length() ==
           PlainText(range_->ToEphemeralRange()).StripWhiteSpace().length()) {
diff --git a/third_party/blink/renderer/core/fragment_directive/text_fragment_selector_generator.h b/third_party/blink/renderer/core/fragment_directive/text_fragment_selector_generator.h
index b01eb4e0..0bbc96f 100644
--- a/third_party/blink/renderer/core/fragment_directive/text_fragment_selector_generator.h
+++ b/third_party/blink/renderer/core/fragment_directive/text_fragment_selector_generator.h
@@ -129,9 +129,7 @@
   };
 
   // TextFragmentFinder::Client interface
-  void DidFindMatch(const RangeInFlatTree& match,
-                    const TextFragmentAnchorMetrics::Match match_metrics,
-                    bool is_unique) override;
+  void DidFindMatch(const RangeInFlatTree& match, bool is_unique) override;
   void NoMatchFound() override;
 
   // Adjust the selection start/end to a valid position. That includes skipping
diff --git a/third_party/blink/renderer/core/frame/frame.cc b/third_party/blink/renderer/core/frame/frame.cc
index c136ea0..b1d7ed5b 100644
--- a/third_party/blink/renderer/core/frame/frame.cc
+++ b/third_party/blink/renderer/core/frame/frame.cc
@@ -640,8 +640,7 @@
   // fenced frames implementation, instead of the
   // `FencedFrameShadowDOMDelegate`.
   if (frame_tree_boundary == FrameTreeBoundary::kFenced &&
-      RuntimeEnabledFeatures::FencedFramesEnabled(
-          DomWindow()->GetExecutionContext()) &&
+      RuntimeEnabledFeatures::FencedFramesEnabledByRuntimeFlag() &&
       features::kFencedFramesImplementationTypeParam.Get() ==
           features::FencedFramesImplementationType::kShadowDOM &&
       Owner() && Owner()->GetFramePolicy().is_fenced) {
diff --git a/third_party/blink/renderer/core/layout/layout_box_model_object.cc b/third_party/blink/renderer/core/layout/layout_box_model_object.cc
index f936372..b5df6e3 100644
--- a/third_party/blink/renderer/core/layout/layout_box_model_object.cc
+++ b/third_party/blink/renderer/core/layout/layout_box_model_object.cc
@@ -375,25 +375,6 @@
     SetNeedsPaintPropertyUpdate();
   }
 
-  if (old_style && HasLayer() && !Layer()->SelfNeedsRepaint() &&
-      diff.TransformChanged()) {
-    // PaintLayerPainter::PaintLayerWithAdjustedRoot skips painting of a layer
-    // whose transform is not invertible, so we need to repaint the layer when
-    // invertible status changes.
-    TransformationMatrix old_transform;
-    TransformationMatrix new_transform;
-    old_style->ApplyTransform(
-        old_transform, LayoutSize(), ComputedStyle::kExcludeTransformOrigin,
-        ComputedStyle::kExcludeMotionPath,
-        ComputedStyle::kIncludeIndependentTransformProperties);
-    StyleRef().ApplyTransform(
-        new_transform, LayoutSize(), ComputedStyle::kExcludeTransformOrigin,
-        ComputedStyle::kExcludeMotionPath,
-        ComputedStyle::kIncludeIndependentTransformProperties);
-    if (old_transform.IsInvertible() != new_transform.IsInvertible())
-      Layer()->SetNeedsRepaint();
-  }
-
   // We can't squash across a layout containment boundary. So, if the
   // containment changes, we need to update the compositing inputs.
   if (old_style &&
diff --git a/third_party/blink/renderer/core/layout/ng/ng_block_break_token.h b/third_party/blink/renderer/core/layout/ng/ng_block_break_token.h
index d6ca9ea..92385b9 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_block_break_token.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_block_break_token.h
@@ -156,31 +156,6 @@
 
   explicit NGBlockBreakToken(PassKey, NGLayoutInputNode node);
 
-  // This exposes a mutable part of the break token for |NGOutOfFlowLayoutPart|.
-  class MutableForOutOfFlow final {
-    STACK_ALLOCATED();
-
-   protected:
-    friend class NGOutOfFlowLayoutPart;
-    // Replace the child break token at the provided |index|.
-    void ReplaceChildBreakToken(const NGBreakToken* child_break_token,
-                                wtf_size_t index) {
-      DCHECK_LT(index, break_token_->const_num_children_);
-      break_token_->child_break_tokens_[index] = child_break_token;
-    }
-
-   private:
-    friend class NGBlockBreakToken;
-    explicit MutableForOutOfFlow(const NGBlockBreakToken* break_token)
-        : break_token_(const_cast<NGBlockBreakToken*>(break_token)) {}
-
-    NGBlockBreakToken* break_token_;
-  };
-
-  MutableForOutOfFlow GetMutableForOutOfFlow() const {
-    return MutableForOutOfFlow(this);
-  }
-
   void TraceAfterDispatch(Visitor*) const;
 
  private:
diff --git a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc
index b5e1f27..381744ad 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.cc
@@ -102,9 +102,10 @@
 
   // Collect any (block) break tokens, but skip break tokens for fragmentainers,
   // as they should only escape a fragmentation context at the discretion of the
-  // fragmentation context. Also skip this if there's a pre-set break token.
+  // fragmentation context. Also skip this if there's a pre-set break token, or
+  // if we're only to add break tokens manually.
   if (has_block_fragmentation_ && !child.IsFragmentainerBox() &&
-      !break_token_) {
+      !break_token_ && !should_add_break_tokens_manually_) {
     const NGBreakToken* child_break_token = child.BreakToken();
     switch (child.Type()) {
       case NGPhysicalFragment::kFragmentBox:
diff --git a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h
index 271d706..b8e39c8 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_container_fragment_builder.h
@@ -320,6 +320,12 @@
     should_force_same_fragmentation_flow_ = true;
   }
 
+  // Specify that all child break tokens be added manually, instead of being
+  // added automatically as part of adding child fragments.
+  void SetShouldAddBreakTokensManually() {
+    should_add_break_tokens_manually_ = true;
+  }
+
   // See NGLayoutResult::AnnotationOverflow().
   void SetAnnotationOverflow(LayoutUnit overflow) {
     annotation_overflow_ = overflow;
@@ -432,6 +438,7 @@
   bool has_column_spanner_ = false;
   bool is_empty_spanner_parent_ = false;
   bool should_force_same_fragmentation_flow_ = false;
+  bool should_add_break_tokens_manually_ = false;
 
   bool has_oof_candidate_that_needs_block_offset_adjustment_ = false;
   bool has_out_of_flow_fragment_child_ = false;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc
index 7a6e25e..f6b4ca25 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.cc
@@ -63,9 +63,6 @@
       consumed_block_size_(BreakToken() ? BreakToken()->ConsumedBlockSize()
                                         : LayoutUnit()) {
   DCHECK(params.fragment_geometry.scrollbar.IsEmpty());
-
-  borders_ = container_builder_.Borders();
-  padding_ = container_builder_.Padding();
   border_box_size_ = container_builder_.InitialBorderBoxSize();
 }
 
@@ -82,7 +79,7 @@
   // inside the scrollport, padding also needs to be handled by the anonymous
   // child.
   intrinsic_block_size_ =
-      IsResumingLayout(BreakToken()) ? LayoutUnit() : borders_.block_start;
+      IsResumingLayout(BreakToken()) ? LayoutUnit() : Borders().block_start;
 
   NGBreakStatus break_status = LayoutChildren();
   if (break_status == NGBreakStatus::kNeedsEarlierBreak) {
@@ -92,7 +89,7 @@
 
   intrinsic_block_size_ = ClampIntrinsicBlockSize(
       ConstraintSpace(), Node(), BreakToken(), BorderScrollbarPadding(),
-      intrinsic_block_size_ + borders_.block_end);
+      intrinsic_block_size_ + Borders().block_end);
 
   // Recompute the block-axis size now that we know our content size.
   border_box_size_.block_size =
@@ -125,7 +122,7 @@
 
   if (UNLIKELY(InvolvedInBlockFragmentation(container_builder_))) {
     NGBreakStatus status = FinishFragmentation(
-        Node(), ConstraintSpace(), borders_.block_end,
+        Node(), ConstraintSpace(), Borders().block_end,
         FragmentainerSpaceAtBfcStart(ConstraintSpace()), &container_builder_);
     if (status == NGBreakStatus::kNeedsEarlierBreak) {
       // If we found a good break somewhere inside this block, re-layout and
@@ -180,7 +177,7 @@
   }
 
   LogicalSize adjusted_padding_box_size =
-      ShrinkLogicalSize(border_box_size_, borders_);
+      ShrinkLogicalSize(border_box_size_, Borders());
 
   NGBlockNode legend = Node().GetRenderedLegend();
   if (legend) {
@@ -191,7 +188,7 @@
     if (!Node().ShouldApplyBlockSizeContainment() &&
         !IsResumingLayout(content_break_token)) {
       minimum_border_box_block_size_ =
-          intrinsic_block_size_ + padding_.BlockSum() + borders_.block_end;
+          intrinsic_block_size_ + Padding().BlockSum() + Borders().block_end;
     }
 
     if (adjusted_padding_box_size.block_size != kIndefiniteSize) {
@@ -209,18 +206,20 @@
         LayoutUnit content_consumed_block_size =
             content_break_token ? content_break_token->ConsumedBlockSize()
                                 : LayoutUnit();
-        legend_size_contribution = consumed_block_size_ - borders_.block_start -
+        legend_size_contribution = consumed_block_size_ -
+                                   Borders().block_start -
                                    content_consumed_block_size;
       } else {
         // We're at the first fragment. The current layout position
         // (intrinsic_block_size_) is at the outer block-end edge of the legend
         // or just after the block-start border, whichever is larger.
-        legend_size_contribution = intrinsic_block_size_ - borders_.block_start;
+        legend_size_contribution =
+            intrinsic_block_size_ - Borders().block_start;
       }
 
       adjusted_padding_box_size.block_size = std::max(
           adjusted_padding_box_size.block_size - legend_size_contribution,
-          padding_.BlockSum());
+          Padding().BlockSum());
     }
   }
 
@@ -239,7 +238,7 @@
     container_builder_.SetHasSeenAllChildren();
     // There was no anonymous child to provide the padding, so we have to add it
     // ourselves.
-    intrinsic_block_size_ += padding_.BlockSum();
+    intrinsic_block_size_ += Padding().BlockSum();
   }
 
   return NGBreakStatus::kContinue;
@@ -270,7 +269,7 @@
                                             legend_border_box_block_size +
                                             legend_margins.block_end;
 
-  LayoutUnit space_left = borders_.block_start - legend_border_box_block_size;
+  LayoutUnit space_left = Borders().block_start - legend_border_box_block_size;
   LayoutUnit block_offset;
   if (space_left > LayoutUnit()) {
     // https://html.spec.whatwg.org/C/#the-fieldset-and-legend-elements
@@ -284,7 +283,7 @@
   // offset of the legend margin box instead of the border.
   LayoutUnit legend_margin_end_offset =
       block_offset + legend_margin_box_block_size - legend_margins.block_start;
-  if (legend_margin_end_offset > borders_.block_start)
+  if (legend_margin_end_offset > Borders().block_start)
     intrinsic_block_size_ = legend_margin_end_offset;
 
   // If the margin box of the legend is at least as tall as the fieldset
@@ -375,12 +374,13 @@
   if (max_content_block_size != LayoutUnit::Max() &&
       (!result || result->Status() == NGLayoutResult::kSuccess)) {
     DCHECK_EQ(adjusted_padding_box_size.block_size, kIndefiniteSize);
-    if (max_content_block_size > padding_.BlockSum()) {
+    if (max_content_block_size > Padding().BlockSum()) {
       // intrinsic_block_size_ is
-      // max(borders_.block_start, legend margin box block size).
-      max_content_block_size = std::max(
-          max_content_block_size - (intrinsic_block_size_ + borders_.block_end),
-          padding_.BlockSum());
+      // max(Borders().block_start, legend margin box block size).
+      max_content_block_size =
+          std::max(max_content_block_size -
+                       (intrinsic_block_size_ + Borders().block_end),
+                   Padding().BlockSum());
     }
 
     if (result) {
@@ -415,7 +415,7 @@
 
   if (break_status == NGBreakStatus::kContinue) {
     DCHECK_EQ(result->Status(), NGLayoutResult::kSuccess);
-    LogicalOffset offset(borders_.inline_start, intrinsic_block_size_);
+    LogicalOffset offset(Borders().inline_start, intrinsic_block_size_);
     container_builder_.AddResult(*result, offset);
 
     const auto& fragment =
diff --git a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.h
index e7d38aa..c1b3533 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_fieldset_layout_algorithm.h
@@ -66,9 +66,6 @@
 
   const WritingDirectionMode writing_direction_;
 
-  NGBoxStrut borders_;
-  NGBoxStrut padding_;
-
   LayoutUnit intrinsic_block_size_;
   const LayoutUnit consumed_block_size_;
   LogicalSize border_box_size_;
diff --git a/third_party/blink/renderer/core/layout/ng/ng_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/ng_layout_algorithm.h
index 7c61343..6c6378f2 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_layout_algorithm.h
@@ -126,6 +126,8 @@
 
   const NGBreakTokenType* BreakToken() const { return break_token_; }
 
+  const NGBoxStrut& Borders() const { return container_builder_.Borders(); }
+  const NGBoxStrut& Padding() const { return container_builder_.Padding(); }
   const NGBoxStrut& BorderPadding() const {
     return container_builder_.BorderPadding();
   }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
index fda23528..c8f3c6b6 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
@@ -1670,25 +1670,6 @@
       To<NGPhysicalBoxFragment>(fragmentainer.fragment.Get());
   NGFragmentGeometry fragment_geometry =
       CalculateInitialFragmentGeometry(space, node, /* break_token */ nullptr);
-
-  // If the last existing fragmentainer does not have a break token, and we will
-  // need to add a new subsequent fragmentainer to hold an OOF, create a break
-  // token for the old fragmentainer now.
-  if (is_new_fragment && !fragment->BreakToken()) {
-    const NGBlockBreakToken* previous_break_token =
-        PreviousFragmentainerBreakToken(*container_builder_, index);
-    NGLayoutAlgorithmParams params(node, fragment_geometry, space,
-                                   previous_break_token,
-                                   /* early_break */ nullptr);
-    NGSimplifiedOOFLayoutAlgorithm algorithm(params, *fragment,
-                                             /* is_new_fragment */ false,
-                                             /* should_break_for_oof */ true);
-    ReplaceFragmentainer(index, fragmentainer.offset,
-                         /* create_new_fragment */ false, &algorithm);
-    fragment = To<NGPhysicalBoxFragment>(
-        container_builder_->Children()[index].fragment.Get());
-  }
-
   LogicalOffset fragmentainer_offset = UpdatedFragmentainerOffset(
       fragmentainer.offset, index, fragmentainer_progression, is_new_fragment);
 
@@ -1867,18 +1848,10 @@
 
     if (multicol_children_ && index < multicol_children_->size()) {
       // We are in a nested fragmentation context. Replace the column entry
-      // (that already existed) and break token directly in the existing
-      // multicol fragment. If there any new columns, they will be appended as
-      // part of regenerating the multicol fragment.
+      // (that already existed) directly in the existing multicol fragment. If
+      // there any new columns, they will be appended as part of regenerating
+      // the multicol fragment.
       MulticolChildInfo& column_info = (*multicol_children_)[index];
-      if (auto& parent_break_token = column_info.parent_break_token) {
-        DCHECK_GT(parent_break_token->ChildBreakTokens().size(), 0u);
-        parent_break_token->GetMutableForOutOfFlow().ReplaceChildBreakToken(
-            new_fragment->BreakToken(),
-            base::checked_cast<wtf_size_t>(
-                parent_break_token->ChildBreakTokens().size()) -
-                1);
-      }
       column_info.mutable_link->fragment = new_fragment;
     }
   }
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part_test.cc b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part_test.cc
index 554db2d..300acf7 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part_test.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part_test.cc
@@ -602,8 +602,8 @@
         offset:0,20 size:5x20
       offset:508,0 size:492x40
         offset:0,0 size:32x20
-        offset:0,0 size:5x40
         offset:0,20 size:30x0
+        offset:0,0 size:5x40
       offset:1016,0 size:492x40
         offset:0,0 size:5x20
 )DUMP";
@@ -1630,7 +1630,7 @@
   EXPECT_TRUE(break_token);
   EXPECT_EQ(break_token->SequenceNumber(), 0u);
   EXPECT_EQ(break_token->ConsumedBlockSize(), 100);
-  EXPECT_EQ(break_token->ChildBreakTokens().size(), 2u);
+  EXPECT_EQ(break_token->ChildBreakTokens().size(), 1u);
   EXPECT_FALSE(break_token->IsCausedByColumnSpanner());
 
   const auto& column2 = To<NGPhysicalBoxFragment>(*children[1]);
@@ -1656,178 +1656,6 @@
   EXPECT_FALSE(column4.BreakToken());
 }
 
-// Make sure the fragmentainer break tokens are correct when new fragmentainers
-// are created as a result of an OOF.
-TEST_F(NGOutOfFlowLayoutPartTest, NewFragmentainerBreakTokens) {
-  SetBodyInnerHTML(
-      R"HTML(
-      <style>
-        #multicol {
-          column-count:2; column-fill:auto; column-gap:0px;
-          height:100px; width:100px;
-        }
-        .abs {
-          position:absolute; width:50px; height:200px;
-        }
-      </style>
-      <div id="multicol">
-        <div style="position:relative;">
-          <div style="height:200px;"></div>
-          <div class="abs"></div>
-        </div>
-      </div>
-      )HTML");
-  const LayoutBox* multicol = GetLayoutBoxByElementId("multicol");
-  ASSERT_EQ(multicol->PhysicalFragmentCount(), 1u);
-  const NGPhysicalBoxFragment* multicol_fragment =
-      multicol->GetPhysicalFragment(0);
-  const auto& children = multicol_fragment->Children();
-  ASSERT_EQ(children.size(), 4u);
-
-  const auto& column1 = To<NGPhysicalBoxFragment>(*children[0]);
-  const NGBlockBreakToken* break_token =
-      To<NGBlockBreakToken>(column1.BreakToken());
-  EXPECT_TRUE(break_token);
-  EXPECT_EQ(break_token->SequenceNumber(), 0u);
-  EXPECT_EQ(break_token->ConsumedBlockSize(), 100);
-  EXPECT_EQ(break_token->ChildBreakTokens().size(), 1u);
-  EXPECT_FALSE(break_token->IsCausedByColumnSpanner());
-
-  const auto& column2 = To<NGPhysicalBoxFragment>(*children[1]);
-  break_token = To<NGBlockBreakToken>(column2.BreakToken());
-  EXPECT_TRUE(break_token);
-  EXPECT_EQ(break_token->SequenceNumber(), 1u);
-  EXPECT_EQ(break_token->ConsumedBlockSize(), 200);
-  EXPECT_EQ(break_token->ChildBreakTokens().size(), 0u);
-  EXPECT_FALSE(break_token->IsCausedByColumnSpanner());
-
-  const auto& column3 = To<NGPhysicalBoxFragment>(*children[2]);
-  break_token = To<NGBlockBreakToken>(column3.BreakToken());
-  EXPECT_TRUE(break_token);
-  EXPECT_EQ(break_token->SequenceNumber(), 2u);
-  EXPECT_EQ(break_token->ConsumedBlockSize(), 300);
-  EXPECT_EQ(break_token->ChildBreakTokens().size(), 1u);
-  EXPECT_FALSE(break_token->IsCausedByColumnSpanner());
-
-  const auto& column4 = To<NGPhysicalBoxFragment>(*children[3]);
-  EXPECT_FALSE(column4.BreakToken());
-}
-
-// Make sure the fragmentainer break tokens are correct when new empty
-// fragmentainers are created as a result of an OOF.
-TEST_F(NGOutOfFlowLayoutPartTest, NewEmptyFragmentainerBreakTokens) {
-  SetBodyInnerHTML(
-      R"HTML(
-      <style>
-        #multicol {
-          column-count:2; column-fill:auto; column-gap:0px;
-          height:100px; width:100px;
-        }
-        .abs {
-          position:absolute; width:50px; height:200px; top:200px;
-        }
-      </style>
-      <div id="multicol">
-        <div style="position:relative;">
-          <div style="height:100px;"></div>
-          <div class="abs"></div>
-        </div>
-      </div>
-      )HTML");
-  const LayoutBox* multicol = GetLayoutBoxByElementId("multicol");
-  ASSERT_EQ(multicol->PhysicalFragmentCount(), 1u);
-  const NGPhysicalBoxFragment* multicol_fragment =
-      multicol->GetPhysicalFragment(0);
-  const auto& children = multicol_fragment->Children();
-  ASSERT_EQ(children.size(), 4u);
-
-  const auto& column1 = To<NGPhysicalBoxFragment>(*children[0]);
-  const NGBlockBreakToken* break_token =
-      To<NGBlockBreakToken>(column1.BreakToken());
-  EXPECT_TRUE(break_token);
-  EXPECT_EQ(break_token->SequenceNumber(), 0u);
-  EXPECT_EQ(break_token->ConsumedBlockSize(), 100);
-  EXPECT_EQ(break_token->ChildBreakTokens().size(), 0u);
-  EXPECT_FALSE(break_token->IsCausedByColumnSpanner());
-
-  const auto& column2 = To<NGPhysicalBoxFragment>(*children[1]);
-  break_token = To<NGBlockBreakToken>(column2.BreakToken());
-  EXPECT_TRUE(break_token);
-  EXPECT_EQ(break_token->SequenceNumber(), 1u);
-  EXPECT_EQ(break_token->ConsumedBlockSize(), 200);
-  EXPECT_EQ(break_token->ChildBreakTokens().size(), 0u);
-  EXPECT_FALSE(break_token->IsCausedByColumnSpanner());
-
-  const auto& column3 = To<NGPhysicalBoxFragment>(*children[2]);
-  break_token = To<NGBlockBreakToken>(column3.BreakToken());
-  EXPECT_TRUE(break_token);
-  EXPECT_EQ(break_token->SequenceNumber(), 2u);
-  EXPECT_EQ(break_token->ConsumedBlockSize(), 300);
-  EXPECT_EQ(break_token->ChildBreakTokens().size(), 1u);
-  EXPECT_FALSE(break_token->IsCausedByColumnSpanner());
-
-  const auto& column4 = To<NGPhysicalBoxFragment>(*children[3]);
-  EXPECT_FALSE(column4.BreakToken());
-}
-
-// Make sure the fragmentainer break tokens are correct when new fragmentainers
-// are created as a result of an OOF in a nested multicol.
-TEST_F(NGOutOfFlowLayoutPartTest, NewFragmentainerBreakTokensInNestedMulticol) {
-  SetBodyInnerHTML(
-      R"HTML(
-      <style>
-        .multicol {
-          column-count:2; column-fill:auto; column-gap:0px;
-        }
-        .abs {
-          position:absolute; width:50px; height:400px; top:0;
-        }
-      </style>
-      <div class="multicol" id="outer">
-        <div class="multicol" id="inner">
-          <div style="position:relative;">
-            <div style="height:200px;"></div>
-            <div class="abs"></div>
-          </div>
-        </div>
-      </div>
-      )HTML");
-  const LayoutBox* multicol = GetLayoutBoxByElementId("inner");
-  ASSERT_EQ(multicol->PhysicalFragmentCount(), 1u);
-  const NGPhysicalBoxFragment* multicol_fragment =
-      multicol->GetPhysicalFragment(0);
-  const auto& children = multicol_fragment->Children();
-  ASSERT_EQ(children.size(), 4u);
-
-  const auto& column1 = To<NGPhysicalBoxFragment>(*children[0]);
-  const NGBlockBreakToken* break_token =
-      To<NGBlockBreakToken>(column1.BreakToken());
-  EXPECT_TRUE(break_token);
-  EXPECT_EQ(break_token->SequenceNumber(), 0u);
-  EXPECT_EQ(break_token->ConsumedBlockSize(), 100);
-  EXPECT_EQ(break_token->ChildBreakTokens().size(), 2u);
-  EXPECT_FALSE(break_token->IsCausedByColumnSpanner());
-
-  const auto& column2 = To<NGPhysicalBoxFragment>(*children[1]);
-  break_token = To<NGBlockBreakToken>(column2.BreakToken());
-  EXPECT_TRUE(break_token);
-  EXPECT_EQ(break_token->SequenceNumber(), 1u);
-  EXPECT_EQ(break_token->ConsumedBlockSize(), 200);
-  EXPECT_EQ(break_token->ChildBreakTokens().size(), 1u);
-  EXPECT_FALSE(break_token->IsCausedByColumnSpanner());
-
-  const auto& column3 = To<NGPhysicalBoxFragment>(*children[2]);
-  break_token = To<NGBlockBreakToken>(column3.BreakToken());
-  EXPECT_TRUE(break_token);
-  EXPECT_EQ(break_token->SequenceNumber(), 2u);
-  EXPECT_EQ(break_token->ConsumedBlockSize(), 300);
-  EXPECT_EQ(break_token->ChildBreakTokens().size(), 1u);
-  EXPECT_FALSE(break_token->IsCausedByColumnSpanner());
-
-  const auto& column4 = To<NGPhysicalBoxFragment>(*children[3]);
-  EXPECT_FALSE(column4.BreakToken());
-}
-
 // Make sure the fragmentainer break tokens are correct when a new column is
 // created before a spanner for an OOF.
 TEST_F(NGOutOfFlowLayoutPartTest, FragmentainerBreakTokenBeforeSpanner) {
@@ -1863,7 +1691,7 @@
   EXPECT_TRUE(break_token);
   EXPECT_EQ(break_token->SequenceNumber(), 0u);
   EXPECT_EQ(break_token->ConsumedBlockSize(), 100);
-  EXPECT_EQ(break_token->ChildBreakTokens().size(), 2u);
+  EXPECT_EQ(break_token->ChildBreakTokens().size(), 1u);
   EXPECT_TRUE(break_token->IsCausedByColumnSpanner());
 
   const auto& column2 = To<NGPhysicalBoxFragment>(*children[1]);
diff --git a/third_party/blink/renderer/core/layout/ng/ng_simplified_oof_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/ng_simplified_oof_layout_algorithm.cc
index d7623017..c356eb4 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_simplified_oof_layout_algorithm.cc
+++ b/third_party/blink/renderer/core/layout/ng/ng_simplified_oof_layout_algorithm.cc
@@ -16,11 +16,9 @@
 NGSimplifiedOOFLayoutAlgorithm::NGSimplifiedOOFLayoutAlgorithm(
     const NGLayoutAlgorithmParams& params,
     const NGPhysicalBoxFragment& previous_fragment,
-    bool is_new_fragment,
-    bool should_break_for_oof)
+    bool is_new_fragment)
     : NGLayoutAlgorithm(params),
-      writing_direction_(Style().GetWritingDirection()),
-      incoming_break_token_(params.break_token) {
+      writing_direction_(Style().GetWritingDirection()) {
   DCHECK(previous_fragment.IsFragmentainerBox());
   DCHECK(params.space.HasKnownFragmentainerBlockSize());
 
@@ -29,54 +27,46 @@
       params.space.FragmentainerBlockSize());
   container_builder_.SetDisableOOFDescendantsPropagation();
   container_builder_.SetHasOutOfFlowFragmentChild(true);
-  if (incoming_break_token_)
-    break_token_iterator_ = incoming_break_token_->ChildBreakTokens().begin();
-  old_fragment_break_token_ =
+
+  const auto* old_fragment_break_token =
       To<NGBlockBreakToken>(previous_fragment.BreakToken());
-  if (old_fragment_break_token_) {
-    bool has_column_spanner =
-        old_fragment_break_token_->IsCausedByColumnSpanner();
-    container_builder_.SetHasColumnSpanner(has_column_spanner);
-
-    // If the previous column broke for a spanner, and we are creating
-    // a new column during OOF layout, that means that the multicol hasn't
-    // finished layout yet, and we are attempting to lay out the OOF before
-    // the spanner. Make sure that the new column creates a break token in this
-    // case, even if the OOF child doesn't break. Also, copy over any child
-    // break tokens from the previous fragment to ensure that layout for those
-    // children is resumed after the spanner.
-    if (has_column_spanner && is_new_fragment) {
-      should_break_for_oof = true;
-      only_copy_break_tokens_ = true;
-      AdvanceBreakTokenIterator();
-    }
+  if (old_fragment_break_token) {
+    container_builder_.SetHasColumnSpanner(
+        old_fragment_break_token->IsCausedByColumnSpanner());
   }
-  if (should_break_for_oof)
-    container_builder_.SetDidBreakSelf();
-
-  // Don't apply children to new fragments.
-  if (is_new_fragment) {
-    child_iterator_ = children_.end();
-    container_builder_.SetIsFirstForNode(false);
-    old_fragment_break_token_ = nullptr;
-    return;
-  }
-
-  container_builder_.SetIsFirstForNode(previous_fragment.IsFirstForNode());
 
   // We need the previous physical container size to calculate the position of
   // any child fragments.
   previous_physical_container_size_ = previous_fragment.Size();
 
-  // Children (along with any OOF fragments that will be added as children) need
-  // to be added in an order that matches the order of any incoming break tokens
-  // (as indicated by the order in |break_token_iterator_|). After all incoming
-  // break tokens are accounted for, the order will be determined by the
-  // remaining children in |child_iterator_|, followed by any newly added OOF
-  // children.
-  children_ = previous_fragment.Children();
-  child_iterator_ = children_.begin();
-  AdvanceChildIterator();
+  // In this algorithm we'll add all break tokens manually, to ensure that we
+  // retain the original order (we may have a break before a node that precedes
+  // a node which actually got a fragment). Disable the automatic child break
+  // token addition that we normally get as part of adding child fragments. Note
+  // that we will not add break tokens for OOFs that fragment. There's no need
+  // for those break tokens, since the calling code will resume the OOFs on its
+  // own.
+  container_builder_.SetShouldAddBreakTokensManually();
+
+  // Copy the original child break tokens.
+  if (old_fragment_break_token) {
+    for (const auto& child_break_token :
+         old_fragment_break_token->ChildBreakTokens())
+      container_builder_.AddBreakToken(child_break_token);
+  }
+
+  // Don't apply children to new fragments.
+  if (is_new_fragment) {
+    container_builder_.SetIsFirstForNode(false);
+    return;
+  }
+
+  container_builder_.SetIsFirstForNode(previous_fragment.IsFirstForNode());
+
+  // Copy the original child fragments. See above: this will *not* add the
+  // outgoing break tokens from the fragments (if any).
+  for (const auto& child_link : previous_fragment.Children())
+    AddChildFragment(child_link);
 
   // Inflow-bounds should never exist on a fragmentainer.
   DCHECK(!previous_fragment.InflowBounds());
@@ -85,16 +75,6 @@
 }
 
 const NGLayoutResult* NGSimplifiedOOFLayoutAlgorithm::Layout() {
-  // Any children that had previously broken due to a break before would not
-  // have been traversed via the |child_iterator_|, so their break tokens should
-  // be added before layout is completed.
-  if (old_fragment_break_token_) {
-    for (const auto& child_break_token :
-         old_fragment_break_token_->ChildBreakTokens()) {
-      if (To<NGBlockBreakToken>(child_break_token.Get())->IsBreakBefore())
-        container_builder_.AddBreakToken(child_break_token);
-    }
-  }
   FinishFragmentationForFragmentainer(ConstraintSpace(), &container_builder_);
   return container_builder_.ToBoxFragment();
 }
@@ -102,24 +82,6 @@
 void NGSimplifiedOOFLayoutAlgorithm::AppendOutOfFlowResult(
     const NGLayoutResult* result) {
   container_builder_.AddResult(*result, result->OutOfFlowPositionedOffset());
-
-  // If there is an incoming child break token, make sure that it matches
-  // the OOF child that was just added.
-  if (incoming_break_token_ &&
-      break_token_iterator_ !=
-          incoming_break_token_->ChildBreakTokens().end()) {
-    DCHECK_EQ(result->PhysicalFragment().GetLayoutObject(),
-              (*break_token_iterator_)->InputNode().GetLayoutBox());
-    DCHECK(
-        !To<NGPhysicalBoxFragment>(result->PhysicalFragment())
-             .IsFirstForNode() ||
-        To<NGBlockBreakToken>(break_token_iterator_->Get())->IsBreakBefore());
-    break_token_iterator_++;
-    if (only_copy_break_tokens_)
-      AdvanceBreakTokenIterator();
-    else
-      AdvanceChildIterator();
-  }
 }
 
 void NGSimplifiedOOFLayoutAlgorithm::AddChildFragment(const NGLink& child) {
@@ -140,66 +102,4 @@
       /* adjustment_for_oof_propagation */ absl::nullopt);
 }
 
-void NGSimplifiedOOFLayoutAlgorithm::AdvanceChildIterator() {
-  DCHECK(!only_copy_break_tokens_);
-  while (child_iterator_ != children_.end()) {
-    const auto& child_link = *child_iterator_;
-    if (incoming_break_token_ &&
-        break_token_iterator_ !=
-            incoming_break_token_->ChildBreakTokens().end()) {
-      // Add the current child if it matches the incoming child break token.
-      const auto& break_token = *break_token_iterator_;
-      if (child_link.fragment->GetLayoutObject() ==
-          break_token->InputNode().GetLayoutBox()) {
-        DCHECK(!To<NGPhysicalBoxFragment>(child_link.get())->IsFirstForNode() ||
-               To<NGBlockBreakToken>(break_token.Get())->IsBreakBefore());
-        AddChildFragment(child_link);
-        child_iterator_++;
-        break_token_iterator_++;
-      } else {
-        // The current child does not match the incoming break token. The break
-        // token must belong to an OOF positioned element that has not yet been
-        // added via AppendOutOfFlowResult().
-        DCHECK(break_token->InputNode().IsOutOfFlowPositioned());
-        // We don't force OOF breaks, unless the preceding block has a forced
-        // break and we need to break to get the correct static position.
-        // However, the break token that is created for this case should be
-        // skipped.
-        if (To<NGBlockBreakToken>(break_token.Get())->IsForcedBreak()) {
-          break_token_iterator_++;
-          continue;
-        }
-        break;
-      }
-    } else {
-      // There are no more incoming child break tokens, so add the remaining
-      // children in |child_iterator_|.
-      AddChildFragment(child_link);
-      child_iterator_++;
-    }
-  }
-}
-
-// In some cases, for example in the case of a column spanner, we may add a new
-// column before the multicol has finished layout, so we will want to carry
-// over any child break tokens from the previous fragmentainer without adding
-// their associated child fragments.
-void NGSimplifiedOOFLayoutAlgorithm::AdvanceBreakTokenIterator() {
-  DCHECK(only_copy_break_tokens_);
-  while (incoming_break_token_ &&
-         break_token_iterator_ !=
-             incoming_break_token_->ChildBreakTokens().end()) {
-    // Add the current break token if it is not an OOF positioned element.
-    const auto& break_token = *break_token_iterator_;
-    if (!break_token->InputNode().IsOutOfFlowPositioned()) {
-      container_builder_.AddBreakToken(break_token);
-      break_token_iterator_++;
-    } else {
-      // The break token must belong to an OOF positioned element that has not
-      // yet been added via AppendOutOfFlowResult().
-      break;
-    }
-  }
-}
-
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_simplified_oof_layout_algorithm.h b/third_party/blink/renderer/core/layout/ng/ng_simplified_oof_layout_algorithm.h
index 32bda33..a153c4b 100644
--- a/third_party/blink/renderer/core/layout/ng/ng_simplified_oof_layout_algorithm.h
+++ b/third_party/blink/renderer/core/layout/ng/ng_simplified_oof_layout_algorithm.h
@@ -28,8 +28,7 @@
  public:
   NGSimplifiedOOFLayoutAlgorithm(const NGLayoutAlgorithmParams&,
                                  const NGPhysicalBoxFragment&,
-                                 bool is_new_fragment,
-                                 bool should_break_for_oof = false);
+                                 bool is_new_fragment);
 
   const NGLayoutResult* Layout() override;
   MinMaxSizesResult ComputeMinMaxSizes(const MinMaxSizesFloatInput&) override {
@@ -41,18 +40,9 @@
 
  private:
   void AddChildFragment(const NGLink& old_fragment);
-  void AdvanceChildIterator();
-  void AdvanceBreakTokenIterator();
 
   const WritingDirectionMode writing_direction_;
   PhysicalSize previous_physical_container_size_;
-
-  base::span<const NGLink> children_;
-  base::span<const NGLink>::iterator child_iterator_;
-  const NGBlockBreakToken* incoming_break_token_;
-  const NGBlockBreakToken* old_fragment_break_token_;
-  base::span<const Member<const NGBreakToken>>::iterator break_token_iterator_;
-  bool only_copy_break_tokens_ = false;
 };
 
 }  // namespace blink
diff --git a/third_party/blink/renderer/core/page/create_window.cc b/third_party/blink/renderer/core/page/create_window.cc
index a22f050..1912c1f 100644
--- a/third_party/blink/renderer/core/page/create_window.cc
+++ b/third_party/blink/renderer/core/page/create_window.cc
@@ -201,9 +201,13 @@
       window_features.persistent = true;
     } else if (attribution_reporting_enabled &&
                key_string == "attributionsrc") {
+      // attributionsrc values are encoded in order to support embedded special
+      // characters, such as '='.
+      const String decoded = DecodeURLEscapeSequences(value_string.ToString(),
+                                                      DecodeURLMode::kUTF8);
       window_features.impression =
           dom_window->GetFrame()->GetAttributionSrcLoader()->RegisterNavigation(
-              dom_window->CompleteURL(value_string.ToString()));
+              dom_window->CompleteURL(decoded));
     }
   }
 
diff --git a/third_party/blink/renderer/core/page/scrolling/fragment_anchor.cc b/third_party/blink/renderer/core/page/scrolling/fragment_anchor.cc
index c9f4977..9d139c0 100644
--- a/third_party/blink/renderer/core/page/scrolling/fragment_anchor.cc
+++ b/third_party/blink/renderer/core/page/scrolling/fragment_anchor.cc
@@ -31,33 +31,16 @@
 
   // The text fragment anchor will be created if we successfully parsed the
   // text directive but we only do the text matching later on.
-  bool selector_fragment_anchor_created = false;
-  if (text_fragment_identifiers_enabled) {
+  if (text_fragment_identifiers_enabled)
     anchor = TextFragmentAnchor::TryCreate(url, frame, should_scroll);
-    selector_fragment_anchor_created = anchor;
-  }
 
   // TODO(crbug.com/1265726): Do highlighting related to all fragment
   // directives and scroll the first one into view
-  if (!anchor && RuntimeEnabledFeatures::CSSSelectorFragmentAnchorEnabled()) {
+  if (!anchor && RuntimeEnabledFeatures::CSSSelectorFragmentAnchorEnabled())
     anchor = CssSelectorFragmentAnchor::TryCreate(url, frame, should_scroll);
-    selector_fragment_anchor_created = anchor;
-  }
 
-  bool element_id_anchor_found = false;
-  if (!anchor) {
+  if (!anchor)
     anchor = ElementFragmentAnchor::TryCreate(url, frame, should_scroll);
-    element_id_anchor_found = anchor;
-  }
-
-  // Track how often we have an element fragment that we can't find. Only track
-  // if we didn't match a selector fragment since we expect those would inflate
-  // the "failed" case.
-  if (IsA<HTMLDocument>(frame.GetDocument()) && url.HasFragmentIdentifier() &&
-      !selector_fragment_anchor_created) {
-    UMA_HISTOGRAM_BOOLEAN("TextFragmentAnchor.ElementIdFragmentFound",
-                          element_id_anchor_found);
-  }
 
   return anchor;
 }
diff --git a/third_party/blink/renderer/core/paint/paint_layer_painter.cc b/third_party/blink/renderer/core/paint/paint_layer_painter.cc
index edef0509..bf44e1a3 100644
--- a/third_party/blink/renderer/core/paint/paint_layer_painter.cc
+++ b/third_party/blink/renderer/core/paint/paint_layer_painter.cc
@@ -92,20 +92,6 @@
       !paint_layer_.HasSelfPaintingLayerDescendant())
     return kFullyPainted;
 
-  // If the transform can't be inverted, don't paint anything. We still need to
-  // paint if there are animations to ensure the animation can be setup to run
-  // on the compositor.
-  bool paint_non_invertible_transforms = false;
-  const auto* properties = layout_object.FirstFragment().PaintProperties();
-  if (properties && properties->Transform() &&
-      properties->Transform()->HasActiveTransformAnimation()) {
-    paint_non_invertible_transforms = true;
-  }
-  if (!paint_non_invertible_transforms && paint_layer_.Transform() &&
-      !paint_layer_.Transform()->IsInvertible()) {
-    return kFullyPainted;
-  }
-
   return PaintLayerContents(context, paint_flags);
 }
 
diff --git a/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc b/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc
index 333ac69..d97b9e205 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc
+++ b/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc
@@ -1110,13 +1110,8 @@
         }
         // We disallow redirects (in idp_network_request_manager.cc), so it is
         // enough to check the initial URL here.
-        if (!policy->AllowConnectToSource(provider_url, provider_url,
-                                          RedirectStatus::kNoRedirect)) {
-          WTF::String error =
-              "Refused to connect to '" + provider_url.ElidedString() +
-              "' because it violates the document's Content Security Policy.";
-          resolver->Reject(MakeGarbageCollected<DOMException>(
-              DOMExceptionCode::kNetworkError, error));
+        if (FederatedCredential::IsRejectingPromiseDueToCSP(policy, resolver,
+                                                            provider_url)) {
           return promise;
         }
 
diff --git a/third_party/blink/renderer/modules/credentialmanagement/federated_credential.cc b/third_party/blink/renderer/modules/credentialmanagement/federated_credential.cc
index 1b28dbe1..f8c313a4 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/federated_credential.cc
+++ b/third_party/blink/renderer/modules/credentialmanagement/federated_credential.cc
@@ -33,22 +33,6 @@
 
 constexpr char kFederatedCredentialType[] = "federated";
 
-bool MaybeRejectDueToCSP(ContentSecurityPolicy* policy,
-                         ScriptPromiseResolver* resolver,
-                         const KURL& provider_url) {
-  if (policy->AllowConnectToSource(provider_url, provider_url,
-                                   RedirectStatus::kNoRedirect)) {
-    return true;
-  }
-
-  WTF::String error =
-      "Refused to connect to '" + provider_url.ElidedString() +
-      "' because it violates the document's Content Security Policy.";
-  resolver->Reject(MakeGarbageCollected<DOMException>(
-      DOMExceptionCode::kNetworkError, error));
-  return false;
-}
-
 // Abort an ongoing FederatedCredential login() operation.
 void AbortFederatedCredentialRequest(ScriptState* script_state) {
   if (!script_state->ContextIsValid())
@@ -183,6 +167,23 @@
                                                    hint, options);
 }
 
+bool FederatedCredential::IsRejectingPromiseDueToCSP(
+    ContentSecurityPolicy* policy,
+    ScriptPromiseResolver* resolver,
+    const KURL& provider_url) {
+  if (policy->AllowConnectToSource(provider_url, provider_url,
+                                   RedirectStatus::kNoRedirect)) {
+    return false;
+  }
+
+  WTF::String error =
+      "Refused to connect to '" + provider_url.ElidedString() +
+      "' because it violates the document's Content Security Policy.";
+  resolver->Reject(MakeGarbageCollected<DOMException>(
+      DOMExceptionCode::kNetworkError, error));
+  return true;
+}
+
 FederatedCredential::FederatedCredential(
     const String& id,
     scoped_refptr<const SecurityOrigin> provider_origin,
@@ -257,7 +258,7 @@
           ->GetContentSecurityPolicyForCurrentWorld();
   // We disallow redirects (in idp_network_request_manager.cc), so it is
   // enough to check the initial URL here.
-  if (!MaybeRejectDueToCSP(policy, resolver, provider_url_))
+  if (IsRejectingPromiseDueToCSP(policy, resolver, provider_url_))
     return promise;
   if (request->hasSignal()) {
     if (request->signal()->aborted()) {
@@ -318,7 +319,7 @@
           DOMExceptionCode::kSyntaxError, "Invalid logout endpoint URL."));
       return promise;
     }
-    if (!MaybeRejectDueToCSP(policy, resolver, logout_request->url))
+    if (IsRejectingPromiseDueToCSP(policy, resolver, logout_request->url))
       return promise;
     if (logout_request->account_id.IsEmpty()) {
       resolver->Reject(MakeGarbageCollected<DOMException>(
@@ -368,7 +369,7 @@
   ContentSecurityPolicy* policy =
       resolver->GetExecutionContext()
           ->GetContentSecurityPolicyForCurrentWorld();
-  if (!MaybeRejectDueToCSP(policy, resolver, provider_url_))
+  if (IsRejectingPromiseDueToCSP(policy, resolver, provider_url_))
     return promise;
 
   auth_request->Revoke(provider_url_, client_id_, hint,
diff --git a/third_party/blink/renderer/modules/credentialmanagement/federated_credential.h b/third_party/blink/renderer/modules/credentialmanagement/federated_credential.h
index eca2239..4b3e773 100644
--- a/third_party/blink/renderer/modules/credentialmanagement/federated_credential.h
+++ b/third_party/blink/renderer/modules/credentialmanagement/federated_credential.h
@@ -36,6 +36,10 @@
                                      const String& hint,
                                      const CredentialRequestOptions* options);
 
+  static bool IsRejectingPromiseDueToCSP(ContentSecurityPolicy* policy,
+                                         ScriptPromiseResolver* resolver,
+                                         const KURL& provider_url);
+
   FederatedCredential(const String& id,
                       scoped_refptr<const SecurityOrigin> provider,
                       const String& name,
diff --git a/third_party/blink/renderer/modules/mediastream/user_media_processor.cc b/third_party/blink/renderer/modules/mediastream/user_media_processor.cc
index 5f61302..802d9f09 100644
--- a/third_party/blink/renderer/modules/mediastream/user_media_processor.cc
+++ b/third_party/blink/renderer/modules/mediastream/user_media_processor.cc
@@ -1004,7 +1004,7 @@
   if (IsAudioInputMediaType(response->device.type)) {
     devices->audio_device = response->device;
   } else if (IsVideoInputMediaType(response->device.type)) {
-    devices->audio_device = response->device;
+    devices->video_device = response->device;
   } else {
     NOTREACHED();
   }
diff --git a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test_helpers.h b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test_helpers.h
index f27b200..45e41d2d83 100644
--- a/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test_helpers.h
+++ b/third_party/blink/renderer/platform/graphics/gpu/drawing_buffer_test_helpers.h
@@ -204,10 +204,8 @@
   void ProduceTextureDirectCHROMIUM(GLuint texture, GLbyte* mailbox) override {
     ++current_mailbox_byte_;
     memset(mailbox, current_mailbox_byte_, GL_MAILBOX_SIZE_CHROMIUM);
-    if (!create_image_chromium_fail_) {
-      ASSERT_TRUE(texture_sizes_.Contains(texture));
-      most_recently_produced_size_ = texture_sizes_.at(texture);
-    }
+    ASSERT_TRUE(texture_sizes_.Contains(texture));
+    most_recently_produced_size_ = texture_sizes_.at(texture);
   }
 
   void TexImage2D(GLenum target,
@@ -225,44 +223,6 @@
     }
   }
 
-  GLuint CreateImageCHROMIUM(ClientBuffer buffer,
-                             GLsizei width,
-                             GLsizei height,
-                             GLenum internalformat) override {
-    if (create_image_chromium_fail_)
-      return 0;
-    image_sizes_.Set(current_image_id_, gfx::Size(width, height));
-    return current_image_id_++;
-  }
-
-  MOCK_METHOD1(DestroyImageMock, void(GLuint imageId));
-  void DestroyImageCHROMIUM(GLuint image_id) override {
-    image_sizes_.erase(image_id);
-    // No textures should be bound to this.
-    CHECK(image_to_texture_map_.find(image_id) == image_to_texture_map_.end());
-    image_sizes_.erase(image_id);
-    DestroyImageMock(image_id);
-  }
-
-  MOCK_METHOD1(BindTexImage2DMock, void(GLint imageId));
-  void BindTexImage2DCHROMIUM(GLenum target, GLint image_id) override {
-    if (target == kImageCHROMIUMTarget) {
-      GLuint value = bound_textures_.find(target)->value;
-      texture_sizes_.Set(value, image_sizes_.find(image_id)->value);
-      image_to_texture_map_.Set(image_id, value);
-      BindTexImage2DMock(image_id);
-    }
-  }
-
-  MOCK_METHOD1(ReleaseTexImage2DMock, void(GLint imageId));
-  void ReleaseTexImage2DCHROMIUM(GLenum target, GLint image_id) override {
-    if (target == kImageCHROMIUMTarget) {
-      image_sizes_.Set(current_image_id_, gfx::Size());
-      image_to_texture_map_.erase(image_id);
-      ReleaseTexImage2DMock(image_id);
-    }
-  }
-
   void GenTextures(GLsizei n, GLuint* textures) override {
     static GLuint id = 1;
     for (GLsizei i = 0; i < n; ++i)
@@ -357,10 +317,6 @@
     return most_recently_produced_size_;
   }
 
-  void SetCreateImageChromiumFail(bool fail) {
-    create_image_chromium_fail_ = fail;
-  }
-
   // Saves current GL state for later verification.
   void SaveState() { saved_state_ = state_; }
   void VerifyStateHasNotChangedSinceSave() const {
@@ -432,7 +388,6 @@
   gpu::SyncToken most_recently_waited_sync_token_;
   GLbyte current_mailbox_byte_ = 0;
   gfx::Size most_recently_produced_size_;
-  bool create_image_chromium_fail_ = false;
   GLuint current_image_id_ = 1;
   HashMap<GLuint, gfx::Size> texture_sizes_;
   HashMap<GLuint, gfx::Size> image_sizes_;
diff --git a/third_party/blink/renderer/platform/widget/widget_base.cc b/third_party/blink/renderer/platform/widget/widget_base.cc
index ddaf980b..7b0a10d4 100644
--- a/third_party/blink/renderer/platform/widget/widget_base.cc
+++ b/third_party/blink/renderer/platform/widget/widget_base.cc
@@ -449,7 +449,6 @@
             record_tab_switch_time_request->event_start_time,
             record_tab_switch_time_request->destination_is_loaded,
             record_tab_switch_time_request->show_reason_tab_switching,
-            record_tab_switch_time_request->show_reason_unoccluded,
             record_tab_switch_time_request->show_reason_bfcache_restore));
   }
 
@@ -469,7 +468,6 @@
           false /* has_saved_frames */, visible_time_request->event_start_time,
           visible_time_request->destination_is_loaded,
           visible_time_request->show_reason_tab_switching,
-          visible_time_request->show_reason_unoccluded,
           visible_time_request->show_reason_bfcache_restore));
 }
 
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations
index d30b31f..80e3a17 100644
--- a/third_party/blink/web_tests/TestExpectations
+++ b/third_party/blink/web_tests/TestExpectations
@@ -4718,10 +4718,14 @@
 
 # Paint Timing failures
 crbug.com/1062984 external/wpt/paint-timing/fcp-only/fcp-gradient.html [ Failure ]
-crbug.com/1062984 external/wpt/paint-timing/fcp-only/fcp-invisible-3d-rotate-descendant.html [ Failure Timeout ]
-crbug.com/1062984 external/wpt/paint-timing/fcp-only/fcp-invisible-3d-rotate.html [ Failure ]
 crbug.com/1062984 external/wpt/paint-timing/fcp-only/fcp-text-input.html [ Failure ]
 
+# Contentful First Paint failures
+crbug.com/1322629 external/wpt/paint-timing/fcp-only/fcp-invisible-3d-rotate.html [ Failure ]
+crbug.com/1322629 external/wpt/paint-timing/fcp-only/fcp-invisible-3d-rotate-descendant.html [ Failure ]
+crbug.com/1322629 external/wpt/paint-timing/fcp-only/fcp-invisible-scale.html [ Failure ]
+crbug.com/1322629 external/wpt/paint-timing/fcp-only/fcp-invisible-scale-transition.html [ Failure ]
+
 # Also crbug.com/1044535
 crbug.com/937416 http/tests/devtools/resource-tree/resource-tree-frame-navigate.js [ Failure Pass Timeout ]
 
diff --git a/third_party/blink/web_tests/external/Version b/third_party/blink/web_tests/external/Version
index 278ebca8..1b2ebe2 100644
--- a/third_party/blink/web_tests/external/Version
+++ b/third_party/blink/web_tests/external/Version
@@ -1 +1 @@
-Version: bed0261ca3f7826bf56b149be069a38288102082
+Version: dea5e8811cbd0136a387a71ead732eac26ab0bd0
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
index d875fe82..f586ea2 100644
--- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
+++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -96085,7 +96085,7 @@
        ]
       ],
       "pseudo-elements-002.html": [
-       "9c4a6d27b50cd6401c568f39cfc037f88e0e228a",
+       "96e7db40cef534a532a06f8be78575e3d65e4753",
        [
         null,
         [
@@ -314290,6 +314290,10 @@
      "bb1525cc225db8a52ed894b8f9bfb2958a8f2341",
      []
     ],
+    "FedCM.idl": [
+     "af48621038c02cb1e4875d5722c8c4aa5c4bb7b9",
+     []
+    ],
     "FileAPI.idl": [
      "aee0e65dcae267201bbe6ae8b8c90231795facf1",
      []
@@ -314866,6 +314870,10 @@
      "5b2c8fa67a6b130d1fe99f962ff85c5cf7a7bc3d",
      []
     ],
+    "mediacapture-viewport.idl": [
+     "187bdf28df22ec11e0679325e6b8b1dc958dc1aa",
+     []
+    ],
     "mediasession.idl": [
      "4cec354c9d1ec80d20b1f506baa94447330c8bbc",
      []
@@ -314902,10 +314910,6 @@
      "5172c87cd4e2c2ef2678bff956c3356c3d162e43",
      []
     ],
-    "origin-policy.idl": [
-     "0820e2ee567e8bfe93206f985900afa832bf9b67",
-     []
-    ],
     "page-lifecycle.idl": [
      "26de11c23d0c160f383fb2d6513b6a2ffbb1c6bd",
      []
@@ -315203,7 +315207,7 @@
      []
     ],
     "webaudio.idl": [
-     "c8ad2a851fc03f90aff3b0c8a2289fadffdb85be",
+     "24cd721ee811538a6365227d4a8f1008dbd1fe33",
      []
     ],
     "webauthn.idl": [
@@ -315231,7 +315235,7 @@
      []
     ],
     "webgpu.idl": [
-     "07d3ac0662b60cfae3c0b4e66947d97ee86b1758",
+     "6cbab9821d3fb167135d743debcd6695717bd201",
      []
     ],
     "webhid.idl": [
@@ -315247,7 +315251,7 @@
      []
     ],
     "webnn.idl": [
-     "59fd6ec34cc634ddb3d9fa54fdee0cdca2a7457f",
+     "13959b38ffc3d6659c40cba086c9d23e1b55aea9",
      []
     ],
     "webrtc-encoded-transform.idl": [
@@ -315267,7 +315271,7 @@
      []
     ],
     "webrtc-stats.idl": [
-     "657cbe93e94d396c6e21978dc9c46fd04cd21993",
+     "61a2f93a52f9f55bf2cee92b1337ad3eaadbfe88",
      []
     ],
     "webrtc-svc.idl": [
@@ -315283,7 +315287,7 @@
      []
     ],
     "webtransport.idl": [
-     "cb02cdd05d49f260b77a761d2e0d9b35743b9c02",
+     "78f362a4370b8c7299898d87f1e5a4908a08648f",
      []
     ],
     "webusb.idl": [
@@ -368997,7 +369001,7 @@
        ]
       ],
       "container-for-shadow-dom.html": [
-       "7d8437d95a3d99d91b72ffa23d9359d54fd89ef2",
+       "d69ec9e4aeff5ea4c24c5c9d21f48c5e21e189df",
        [
         null,
         {}
@@ -369312,7 +369316,14 @@
        ]
       ],
       "pseudo-elements-003.html": [
-       "67a74fb3ba923b0da07f1d00790281c98eec6ee9",
+       "fe68898b38ef140211d04e2f7d6f3381eff62a9a",
+       [
+        null,
+        {}
+       ]
+      ],
+      "pseudo-elements-004.html": [
+       "db199f220505dc4e55c5a3bbcce1903e4d22ece9",
        [
         null,
         {}
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/break-after-oof-before-preceding-pushed-float-crash.html b/third_party/blink/web_tests/external/wpt/css/css-break/break-after-oof-before-preceding-pushed-float-crash.html
new file mode 100644
index 0000000..8c4355c2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/break-after-oof-before-preceding-pushed-float-crash.html
@@ -0,0 +1,16 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1318455">
+<div style="columns:2; column-fill:auto; height:50px;">
+  <div style="position:relative; height:31px;">
+    <div style="position:absolute;"></div>
+  </div>
+  <span style="contain:size; float:left; width:100%; height:20px;"></span>
+  <div>
+    <div style="height:10px;"></div>
+    <div style="position:relative; float:left; width:100%;">
+      <div style="height:1px;"></div>
+      <div style="position:absolute;"></div>
+    </div>
+  </div>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/chrome-bug-1318455-crash.html b/third_party/blink/web_tests/external/wpt/css/css-break/chrome-bug-1318455-crash.html
new file mode 100644
index 0000000..f18a166
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/chrome-bug-1318455-crash.html
@@ -0,0 +1,30 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1318455">
+<ul id="multicol" style="columns:34; column-fill:auto; height:50px; line-height:20px;">
+  <div style="float:left; padding:3px;">
+    <br><br><br>
+  </div>
+  <div style="float:left; position:relative; padding:3px;">
+    <br><br><br>
+    <div style="position:absolute;"></div>
+  </div>
+  <li style="float:left;">
+    <div></div>
+    <a style="float:left;">
+      <li style="position:relative;">
+        <br>
+        <div style="position:absolute;"></div>
+      </li>
+    </a>
+  </li>
+  <div id="surprise" style="display:none; height:150px;"></div>
+</ul>
+<script>
+  requestAnimationFrame(()=> {
+    requestAnimationFrame(()=> {
+      surprise.style.display = "inline-block";
+      multicol.style.height = "150px";
+    });
+  });
+</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-break/clear-past-float-with-oof-twice-crash.html b/third_party/blink/web_tests/external/wpt/css/css-break/clear-past-float-with-oof-twice-crash.html
new file mode 100644
index 0000000..82317ca8
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/css/css-break/clear-past-float-with-oof-twice-crash.html
@@ -0,0 +1,10 @@
+<!DOCTYPE html>
+<link rel="author" title="Morten Stenshorne" href="mailto:mstensho@chromium.org">
+<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1318455">
+<div style="columns:3; column-fill:auto; height:100px;">
+  <div style="position:relative; float:left; width:100%;">
+    <div style="height:141px;"></div>
+    <div style="position:absolute;"></div>
+  </div>
+  <p style="clear:left; contain:size; width:100%; height:80px;"></p>
+</div>
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/FedCM.idl b/third_party/blink/web_tests/external/wpt/interfaces/FedCM.idl
new file mode 100644
index 0000000..af48621
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/interfaces/FedCM.idl
@@ -0,0 +1,40 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into webref
+// (https://github.com/w3c/webref)
+// Source: Federated Credential Management API (https://fedidcg.github.io/FedCM/)
+
+[Exposed=Window, SecureContext]
+dictionary FederatedAccountLoginRequest {
+  AbortSignal signal;
+  USVString nonce;
+};
+
+[Exposed=Window, SecureContext]
+partial interface FederatedCredential {
+  Promise<FederatedTokens> login(optional FederatedAccountLoginRequest request = {});
+};
+
+[Exposed=Window, SecureContext]
+dictionary FederatedTokens {
+  USVString idToken;
+};
+
+[Exposed=Window, SecureContext]
+partial interface FederatedCredential {
+  Promise<undefined> revoke(USVString hint);
+};
+
+[Exposed=Window, SecureContext]
+partial interface FederatedCredential {
+  Promise<undefined> logout();
+};
+
+dictionary FederatedCredentialLogoutRpsRequest {
+  required USVString url;
+  required USVString accountId;
+};
+
+[Exposed=Window, SecureContext]
+partial interface FederatedCredential {
+  static Promise<undefined> logoutRPs(sequence<FederatedCredentialLogoutRpsRequest> logoutRequests);
+};
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/mediacapture-viewport.idl b/third_party/blink/web_tests/external/wpt/interfaces/mediacapture-viewport.idl
new file mode 100644
index 0000000..187bdf2
--- /dev/null
+++ b/third_party/blink/web_tests/external/wpt/interfaces/mediacapture-viewport.idl
@@ -0,0 +1,9 @@
+// GENERATED CONTENT - DO NOT EDIT
+// Content was automatically extracted by Reffy into webref
+// (https://github.com/w3c/webref)
+// Source: Viewport Capture (https://w3c.github.io/mediacapture-viewport/)
+
+partial interface MediaDevices {
+  Promise<MediaStream> getViewportMedia(
+      optional DisplayMediaStreamConstraints constraints = {});
+};
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/origin-policy.idl b/third_party/blink/web_tests/external/wpt/interfaces/origin-policy.idl
deleted file mode 100644
index 0820e2ee..0000000
--- a/third_party/blink/web_tests/external/wpt/interfaces/origin-policy.idl
+++ /dev/null
@@ -1,8 +0,0 @@
-// GENERATED CONTENT - DO NOT EDIT
-// Content was automatically extracted by Reffy into webref
-// (https://github.com/w3c/webref)
-// Source: Origin Policy (https://wicg.github.io/origin-policy/)
-
-partial interface mixin WindowOrWorkerGlobalScope {
-  readonly attribute FrozenArray<DOMString> originPolicyIds;
-};
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/webaudio.idl b/third_party/blink/web_tests/external/wpt/interfaces/webaudio.idl
index c8ad2a8..24cd721 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/webaudio.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/webaudio.idl
@@ -69,6 +69,7 @@
   constructor (optional AudioContextOptions contextOptions = {});
   readonly attribute double baseLatency;
   readonly attribute double outputLatency;
+  [SecureContext] readonly attribute AudioRenderCapacity renderCapacity;
   AudioTimestamp getOutputTimestamp ();
   Promise<undefined> resume ();
   Promise<undefined> suspend ();
@@ -91,6 +92,33 @@
 };
 
 [Exposed=Window]
+interface AudioRenderCapacity : EventTarget {
+  undefined start(optional AudioRenderCapacityOptions options = {});
+    undefined stop();
+    attribute EventHandler onupdate;
+};
+
+dictionary AudioRenderCapacityOptions {
+    double updateInterval = 1;
+};
+
+[Exposed=Window]
+interface AudioRenderCapacityEvent : Event {
+  constructor (DOMString type, optional AudioRenderCapacityEventInit eventInitDict = {});
+    readonly attribute double timestamp;
+    readonly attribute double averageLoad;
+    readonly attribute double peakLoad;
+    readonly attribute double underrunRatio;
+};
+
+dictionary AudioRenderCapacityEventInit : EventInit {
+  double timestamp = 0;
+  double averageLoad = 0;
+  double peakLoad = 0;
+  double underrunRatio = 0;
+};
+
+[Exposed=Window]
 interface OfflineAudioContext : BaseAudioContext {
   constructor(OfflineAudioContextOptions contextOptions);
   constructor(unsigned long numberOfChannels, unsigned long length, float sampleRate);
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/webgpu.idl b/third_party/blink/web_tests/external/wpt/interfaces/webgpu.idl
index 07d3ac0..6cbab98 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/webgpu.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/webgpu.idl
@@ -4,7 +4,7 @@
 // Source: WebGPU (https://gpuweb.github.io/gpuweb/)
 
 interface mixin GPUObjectBase {
-    attribute (USVString or undefined) label;
+    attribute USVString label;
 };
 
 dictionary GPUObjectDescriptorBase {
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/webnn.idl b/third_party/blink/web_tests/external/wpt/interfaces/webnn.idl
index 59fd6ec34..13959b3 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/webnn.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/webnn.idl
@@ -9,10 +9,9 @@
 Navigator includes NavigatorML;
 WorkerNavigator includes NavigatorML;
 
-enum MLDevicePreference {
-  "default",
-  "gpu",
-  "cpu"
+enum MLDeviceType {
+  "cpu",
+  "gpu"
 };
 
 enum MLPowerPreference {
@@ -22,20 +21,43 @@
 };
 
 dictionary MLContextOptions {
-  MLDevicePreference devicePreference = "default";
+  MLDeviceType deviceType = "cpu";
   MLPowerPreference powerPreference = "default";
 };
 
 [SecureContext, Exposed=(Window, DedicatedWorker)]
 interface ML {
   MLContext createContext(optional MLContextOptions options = {});
-  MLContext createContext(WebGLRenderingContext glContext);
   MLContext createContext(GPUDevice gpuDevice);
+  MLContext createContext(WebGLRenderingContext glContext);
 };
 
+dictionary MLArrayInput {
+  required ArrayBufferView resource;
+  required sequence<long> dimensions;
+};
+
+typedef record<DOMString, (ArrayBufferView or MLArrayInput)> MLNamedArrayInputs;
+typedef record<DOMString, ArrayBufferView> MLNamedArrayOutputs;
+
 [SecureContext, Exposed=(Window, DedicatedWorker)]
 interface MLContext {};
 
+partial interface MLContext {
+  [Exposed=(DedicatedWorker)]
+  undefined compute(MLGraph graph, MLNamedArrayInputs inputs, MLNamedArrayOutputs outputs);
+};
+
+partial interface MLContext {
+  Promise<undefined> computeAsync(MLGraph graph, MLNamedArrayInputs inputs,
+
+                    MLNamedArrayOutputs outputs);
+};
+
+partial interface MLContext {
+  MLCommandEncoder createCommandEncoder();
+};
+
 enum MLInputOperandLayout {
   "nchw",
   "nhwc"
@@ -90,6 +112,7 @@
   MLOperand constant(double value, optional MLOperandType type = "float32");
 
   // Compile the graph up to the specified output operands
+  [Exposed=(DedicatedWorker)]
   MLGraph build(MLNamedOperands outputs);
 };
 
@@ -454,17 +477,30 @@
   MLOperand transpose(MLOperand input, optional MLTransposeOptions options = {});
 };
 
-typedef (MLBufferView or WebGLTexture or GPUTexture) MLResource;
+[SecureContext, Exposed=(Window, DedicatedWorker)]
+interface MLGraph {};
 
-dictionary MLInput {
-  required MLResource resource;
+typedef (GPUBuffer or GPUTexture) MLGPUResource;
+
+dictionary MLGPUInput {
+  required MLGPUResource resource;
   required sequence<long> dimensions;
 };
 
-typedef record<DOMString, (MLResource or MLInput)> MLNamedInputs;
-typedef record<DOMString, MLResource> MLNamedOutputs;
+typedef record<DOMString, (MLGPUResource or MLGPUInput)> MLNamedGPUInputs;
+typedef record<DOMString, MLGPUResource> MLNamedGPUOutputs;
 
 [SecureContext, Exposed=(Window, DedicatedWorker)]
-interface MLGraph {
-  undefined compute(MLNamedInputs inputs, MLNamedOutputs outputs);
+interface MLCommandEncoder {};
+
+partial interface MLCommandEncoder {
+  undefined initializeGraph(MLGraph graph);
+};
+
+partial interface MLCommandEncoder {
+  undefined dispatch(MLGraph graph, MLNamedGPUInputs inputs, MLNamedGPUOutputs outputs);
+};
+
+partial interface MLCommandEncoder {
+  GPUCommandBuffer finish(optional GPUCommandBufferDescriptor descriptor = {});
 };
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/webrtc-stats.idl b/third_party/blink/web_tests/external/wpt/interfaces/webrtc-stats.idl
index 657cbe9..61a2f93a 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/webrtc-stats.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/webrtc-stats.idl
@@ -283,11 +283,18 @@
              DOMString             remoteCertificateId;
              DOMString             tlsVersion;
              DOMString             dtlsCipher;
+             RTCDtlsRole           dtlsRole;
              DOMString             srtpCipher;
              DOMString             tlsGroup;
              unsigned long         selectedCandidatePairChanges;
 };
 
+enum RTCDtlsRole {
+        "client",
+        "server",
+        "unknown",
+};
+
 dictionary RTCSctpTransportStats : RTCStats {
             DOMString transportId;
             double smoothedRoundTripTime;
diff --git a/third_party/blink/web_tests/external/wpt/interfaces/webtransport.idl b/third_party/blink/web_tests/external/wpt/interfaces/webtransport.idl
index cb02cdd..78f362a 100644
--- a/third_party/blink/web_tests/external/wpt/interfaces/webtransport.idl
+++ b/third_party/blink/web_tests/external/wpt/interfaces/webtransport.idl
@@ -31,8 +31,8 @@
   /* a ReadableStream of WebTransportBidirectionalStream objects */
   readonly attribute ReadableStream incomingBidirectionalStreams;
 
-  Promise<WritableStream> createUnidirectionalStream();
-  /* a ReadableStream of ReceiveStreams */
+  Promise<WebTransportSendStream> createUnidirectionalStream();
+  /* a ReadableStream of WebTransportReceiveStream objects */
   readonly attribute ReadableStream incomingUnidirectionalStreams;
 };
 
@@ -81,6 +81,29 @@
 };
 
 [Exposed=(Window,Worker), SecureContext]
+interface WebTransportSendStream : WritableStream {
+  Promise<WebTransportSendStreamStats> getStats();
+};
+
+dictionary WebTransportSendStreamStats {
+  DOMHighResTimeStamp timestamp;
+  unsigned long long bytesWritten;
+  unsigned long long bytesSent;
+  unsigned long long bytesAcknowledged;
+};
+
+[Exposed=(Window,Worker), SecureContext]
+interface WebTransportReceiveStream : ReadableStream {
+  Promise<WebTransportReceiveStreamStats> getStats();
+};
+
+dictionary WebTransportReceiveStreamStats {
+  DOMHighResTimeStamp timestamp;
+  unsigned long long bytesReceived;
+  unsigned long long bytesRead;
+};
+
+[Exposed=(Window,Worker), SecureContext]
 interface WebTransportBidirectionalStream {
   readonly attribute ReadableStream readable;
   readonly attribute WritableStream writable;
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/webaudio/idlharness.https.window-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/webaudio/idlharness.https.window-expected.txt
index 59d12b4..94445ac3 100644
--- a/third_party/blink/web_tests/platform/generic/external/wpt/webaudio/idlharness.https.window-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/external/wpt/webaudio/idlharness.https.window-expected.txt
@@ -1,5 +1,5 @@
 This is a testharness.js-based test.
-Found 1124 tests; 1115 PASS, 9 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 1145 tests; 1115 PASS, 30 FAIL, 0 TIMEOUT, 0 NOTRUN.
 PASS idl_test setup
 PASS idl_test validation
 PASS HTMLElement includes GlobalEventHandlers: member names are unique
@@ -50,6 +50,7 @@
 PASS AudioContext interface: existence and properties of interface prototype object's @@unscopables property
 PASS AudioContext interface: attribute baseLatency
 PASS AudioContext interface: attribute outputLatency
+FAIL AudioContext interface: attribute renderCapacity assert_true: The prototype object must have a property "renderCapacity" expected true got false
 PASS AudioContext interface: operation getOutputTimestamp()
 PASS AudioContext interface: operation resume()
 PASS AudioContext interface: operation suspend()
@@ -62,6 +63,7 @@
 PASS Stringification of context
 PASS AudioContext interface: context must inherit property "baseLatency" with the proper type
 PASS AudioContext interface: context must inherit property "outputLatency" with the proper type
+FAIL AudioContext interface: context must inherit property "renderCapacity" with the proper type assert_inherits: property "renderCapacity" not found in prototype chain
 PASS AudioContext interface: context must inherit property "getOutputTimestamp()" with the proper type
 PASS AudioContext interface: context must inherit property "resume()" with the proper type
 PASS AudioContext interface: context must inherit property "suspend()" with the proper type
@@ -107,6 +109,25 @@
 PASS BaseAudioContext interface: context must inherit property "createWaveShaper()" with the proper type
 PASS BaseAudioContext interface: context must inherit property "decodeAudioData(ArrayBuffer, optional DecodeSuccessCallback?, optional DecodeErrorCallback?)" with the proper type
 PASS BaseAudioContext interface: calling decodeAudioData(ArrayBuffer, optional DecodeSuccessCallback?, optional DecodeErrorCallback?) on context with too few arguments must throw TypeError
+FAIL AudioRenderCapacity interface: existence and properties of interface object assert_own_property: self does not have own property "AudioRenderCapacity" expected property "AudioRenderCapacity" missing
+FAIL AudioRenderCapacity interface object length assert_own_property: self does not have own property "AudioRenderCapacity" expected property "AudioRenderCapacity" missing
+FAIL AudioRenderCapacity interface object name assert_own_property: self does not have own property "AudioRenderCapacity" expected property "AudioRenderCapacity" missing
+FAIL AudioRenderCapacity interface: existence and properties of interface prototype object assert_own_property: self does not have own property "AudioRenderCapacity" expected property "AudioRenderCapacity" missing
+FAIL AudioRenderCapacity interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "AudioRenderCapacity" expected property "AudioRenderCapacity" missing
+FAIL AudioRenderCapacity interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "AudioRenderCapacity" expected property "AudioRenderCapacity" missing
+FAIL AudioRenderCapacity interface: operation start(optional AudioRenderCapacityOptions) assert_own_property: self does not have own property "AudioRenderCapacity" expected property "AudioRenderCapacity" missing
+FAIL AudioRenderCapacity interface: operation stop() assert_own_property: self does not have own property "AudioRenderCapacity" expected property "AudioRenderCapacity" missing
+FAIL AudioRenderCapacity interface: attribute onupdate assert_own_property: self does not have own property "AudioRenderCapacity" expected property "AudioRenderCapacity" missing
+FAIL AudioRenderCapacityEvent interface: existence and properties of interface object assert_own_property: self does not have own property "AudioRenderCapacityEvent" expected property "AudioRenderCapacityEvent" missing
+FAIL AudioRenderCapacityEvent interface object length assert_own_property: self does not have own property "AudioRenderCapacityEvent" expected property "AudioRenderCapacityEvent" missing
+FAIL AudioRenderCapacityEvent interface object name assert_own_property: self does not have own property "AudioRenderCapacityEvent" expected property "AudioRenderCapacityEvent" missing
+FAIL AudioRenderCapacityEvent interface: existence and properties of interface prototype object assert_own_property: self does not have own property "AudioRenderCapacityEvent" expected property "AudioRenderCapacityEvent" missing
+FAIL AudioRenderCapacityEvent interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "AudioRenderCapacityEvent" expected property "AudioRenderCapacityEvent" missing
+FAIL AudioRenderCapacityEvent interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "AudioRenderCapacityEvent" expected property "AudioRenderCapacityEvent" missing
+FAIL AudioRenderCapacityEvent interface: attribute timestamp assert_own_property: self does not have own property "AudioRenderCapacityEvent" expected property "AudioRenderCapacityEvent" missing
+FAIL AudioRenderCapacityEvent interface: attribute averageLoad assert_own_property: self does not have own property "AudioRenderCapacityEvent" expected property "AudioRenderCapacityEvent" missing
+FAIL AudioRenderCapacityEvent interface: attribute peakLoad assert_own_property: self does not have own property "AudioRenderCapacityEvent" expected property "AudioRenderCapacityEvent" missing
+FAIL AudioRenderCapacityEvent interface: attribute underrunRatio assert_own_property: self does not have own property "AudioRenderCapacityEvent" expected property "AudioRenderCapacityEvent" missing
 PASS OfflineAudioContext interface: existence and properties of interface object
 PASS OfflineAudioContext interface object length
 PASS OfflineAudioContext interface object name
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/webnn/idlharness.https.any-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/webnn/idlharness.https.any-expected.txt
index 3a69eb7a..5df3157 100644
--- a/third_party/blink/web_tests/platform/generic/external/wpt/webnn/idlharness.https.any-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/external/wpt/webnn/idlharness.https.any-expected.txt
@@ -1,7 +1,13 @@
 This is a testharness.js-based test.
-Found 361 tests; 105 PASS, 256 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 386 tests; 120 PASS, 266 FAIL, 0 TIMEOUT, 0 NOTRUN.
 FAIL idl_test setup promise_test: Unhandled rejection with value: object "ReferenceError: MLGraphBuilder is not defined"
 PASS idl_test validation
+PASS Partial interface MLContext: original interface defined
+PASS Partial interface MLContext: member names are unique
+PASS Partial interface MLContext[2]: original interface defined
+PASS Partial interface MLContext[2]: member names are unique
+PASS Partial interface MLContext[3]: original interface defined
+PASS Partial interface MLContext[3]: member names are unique
 PASS Partial interface MLGraphBuilder: original interface defined
 PASS Partial interface MLGraphBuilder: member names are unique
 PASS Partial interface MLGraphBuilder[2]: original interface defined
@@ -66,6 +72,12 @@
 PASS Partial interface MLGraphBuilder[31]: member names are unique
 PASS Partial interface MLGraphBuilder[32]: original interface defined
 PASS Partial interface MLGraphBuilder[32]: member names are unique
+PASS Partial interface MLCommandEncoder: original interface defined
+PASS Partial interface MLCommandEncoder: member names are unique
+PASS Partial interface MLCommandEncoder[2]: original interface defined
+PASS Partial interface MLCommandEncoder[2]: member names are unique
+PASS Partial interface MLCommandEncoder[3]: original interface defined
+PASS Partial interface MLCommandEncoder[3]: member names are unique
 PASS Partial interface mixin NavigatorID: member names are unique
 PASS Navigator includes NavigatorML: member names are unique
 PASS WorkerNavigator includes NavigatorML: member names are unique
@@ -82,6 +94,7 @@
 PASS WorkerNavigator includes NavigatorConcurrentHardware: member names are unique
 PASS Navigator includes NavigatorGPU: member names are unique
 PASS WorkerNavigator includes NavigatorGPU: member names are unique
+PASS GPUBuffer includes GPUObjectBase: member names are unique
 PASS GPUTexture includes GPUObjectBase: member names are unique
 FAIL NavigatorML must be primary interface of navigator assert_own_property: self does not have own property "NavigatorML" expected property "NavigatorML" missing
 FAIL Stringification of navigator assert_class_string: class string of navigator expected "[object NavigatorML]" but got "[object Navigator]"
@@ -95,28 +108,35 @@
 FAIL ML interface: operation createContext(optional MLContextOptions) assert_throws_js: calling operation with this = null didn't throw TypeError function "function() {
             fn.apply(obj, args);
         }" did not throw
-FAIL ML interface: operation createContext(WebGLRenderingContext) assert_throws_js: calling operation with this = null didn't throw TypeError function "function() {
+FAIL ML interface: operation createContext(GPUDevice) assert_throws_js: calling operation with this = null didn't throw TypeError function "function() {
             fn.apply(obj, args);
         }" did not throw
-FAIL ML interface: operation createContext(GPUDevice) assert_throws_js: calling operation with this = null didn't throw TypeError function "function() {
+FAIL ML interface: operation createContext(WebGLRenderingContext) assert_throws_js: calling operation with this = null didn't throw TypeError function "function() {
             fn.apply(obj, args);
         }" did not throw
 PASS ML must be primary interface of navigator.ml
 PASS Stringification of navigator.ml
 PASS ML interface: navigator.ml must inherit property "createContext(optional MLContextOptions)" with the proper type
 PASS ML interface: calling createContext(optional MLContextOptions) on navigator.ml with too few arguments must throw TypeError
-PASS ML interface: navigator.ml must inherit property "createContext(WebGLRenderingContext)" with the proper type
-PASS ML interface: calling createContext(WebGLRenderingContext) on navigator.ml with too few arguments must throw TypeError
 PASS ML interface: navigator.ml must inherit property "createContext(GPUDevice)" with the proper type
 PASS ML interface: calling createContext(GPUDevice) on navigator.ml with too few arguments must throw TypeError
+PASS ML interface: navigator.ml must inherit property "createContext(WebGLRenderingContext)" with the proper type
+PASS ML interface: calling createContext(WebGLRenderingContext) on navigator.ml with too few arguments must throw TypeError
 PASS MLContext interface: existence and properties of interface object
 PASS MLContext interface object length
 PASS MLContext interface object name
 PASS MLContext interface: existence and properties of interface prototype object
 PASS MLContext interface: existence and properties of interface prototype object's "constructor" property
 PASS MLContext interface: existence and properties of interface prototype object's @@unscopables property
+PASS MLContext interface: member compute
+FAIL MLContext interface: operation computeAsync(MLGraph, MLNamedArrayInputs, MLNamedArrayOutputs) assert_own_property: interface prototype object missing non-static operation expected property "computeAsync" missing
+FAIL MLContext interface: operation createCommandEncoder() assert_own_property: interface prototype object missing non-static operation expected property "createCommandEncoder" missing
 FAIL MLContext must be primary interface of context assert_equals: context's prototype is not MLContext.prototype expected object "[object MLContext]" but got object "[object Promise]"
 FAIL Stringification of context assert_class_string: class string of context expected "[object MLContext]" but got "[object Promise]"
+PASS MLContext interface: context must not have property "compute"
+FAIL MLContext interface: context must inherit property "computeAsync(MLGraph, MLNamedArrayInputs, MLNamedArrayOutputs)" with the proper type assert_inherits: property "computeAsync" not found in prototype chain
+FAIL MLContext interface: calling computeAsync(MLGraph, MLNamedArrayInputs, MLNamedArrayOutputs) on context with too few arguments must throw TypeError assert_inherits: property "computeAsync" not found in prototype chain
+FAIL MLContext interface: context must inherit property "createCommandEncoder()" with the proper type assert_inherits: property "createCommandEncoder" not found in prototype chain
 FAIL MLOperand interface: existence and properties of interface object assert_own_property: self does not have own property "MLOperand" expected property "MLOperand" missing
 FAIL MLOperand interface object length assert_own_property: self does not have own property "MLOperand" expected property "MLOperand" missing
 FAIL MLOperand interface object name assert_own_property: self does not have own property "MLOperand" expected property "MLOperand" missing
@@ -144,7 +164,7 @@
 FAIL MLGraphBuilder interface: operation input(DOMString, MLOperandDescriptor) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
 FAIL MLGraphBuilder interface: operation constant(MLOperandDescriptor, MLBufferView) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
 FAIL MLGraphBuilder interface: operation constant(double, optional MLOperandType) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
-FAIL MLGraphBuilder interface: operation build(MLNamedOperands) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: member build Cannot use 'in' operator to search for 'build' in undefined
 FAIL MLGraphBuilder interface: operation batchNormalization(MLOperand, MLOperand, MLOperand, optional MLBatchNormalizationOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
 FAIL MLGraphBuilder interface: operation clamp(MLOperand, optional MLClampOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
 FAIL MLGraphBuilder interface: operation clamp(optional MLClampOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
@@ -221,8 +241,7 @@
 FAIL MLGraphBuilder interface: calling constant(MLOperandDescriptor, MLBufferView) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
 FAIL MLGraphBuilder interface: builder must inherit property "constant(double, optional MLOperandType)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
 FAIL MLGraphBuilder interface: calling constant(double, optional MLOperandType) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
-FAIL MLGraphBuilder interface: builder must inherit property "build(MLNamedOperands)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
-FAIL MLGraphBuilder interface: calling build(MLNamedOperands) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must not have property "build" assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
 FAIL MLGraphBuilder interface: builder must inherit property "batchNormalization(MLOperand, MLOperand, MLOperand, optional MLBatchNormalizationOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
 FAIL MLGraphBuilder interface: calling batchNormalization(MLOperand, MLOperand, MLOperand, optional MLBatchNormalizationOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
 FAIL MLGraphBuilder interface: builder must inherit property "clamp(MLOperand, optional MLClampOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
@@ -360,11 +379,17 @@
 FAIL MLGraph interface: existence and properties of interface prototype object assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
 FAIL MLGraph interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
 FAIL MLGraph interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
-FAIL MLGraph interface: operation compute(MLNamedInputs, MLNamedOutputs) assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
 FAIL MLGraph must be primary interface of graph assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
 FAIL Stringification of graph assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
-FAIL MLGraph interface: graph must inherit property "compute(MLNamedInputs, MLNamedOutputs)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
-FAIL MLGraph interface: calling compute(MLNamedInputs, MLNamedOutputs) on graph with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
+FAIL MLCommandEncoder interface: existence and properties of interface object assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
+FAIL MLCommandEncoder interface object length assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
+FAIL MLCommandEncoder interface object name assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
+FAIL MLCommandEncoder interface: existence and properties of interface prototype object assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
+FAIL MLCommandEncoder interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
+FAIL MLCommandEncoder interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
+FAIL MLCommandEncoder interface: operation initializeGraph(MLGraph) assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
+FAIL MLCommandEncoder interface: operation dispatch(MLGraph, MLNamedGPUInputs, MLNamedGPUOutputs) assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
+FAIL MLCommandEncoder interface: operation finish(optional GPUCommandBufferDescriptor) assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
 PASS Navigator interface: attribute ml
 PASS Navigator interface: navigator must inherit property "ml" with the proper type
 Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/webnn/idlharness.https.any.worker-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/webnn/idlharness.https.any.worker-expected.txt
index 46d99e7..3927d36 100644
--- a/third_party/blink/web_tests/platform/generic/external/wpt/webnn/idlharness.https.any.worker-expected.txt
+++ b/third_party/blink/web_tests/platform/generic/external/wpt/webnn/idlharness.https.any.worker-expected.txt
@@ -1,7 +1,13 @@
 This is a testharness.js-based test.
-Found 361 tests; 83 PASS, 278 FAIL, 0 TIMEOUT, 0 NOTRUN.
+Found 388 tests; 96 PASS, 292 FAIL, 0 TIMEOUT, 0 NOTRUN.
 FAIL idl_test setup promise_test: Unhandled rejection with value: object "TypeError: Cannot read properties of undefined (reading 'createContext')"
 PASS idl_test validation
+PASS Partial interface MLContext: original interface defined
+PASS Partial interface MLContext: member names are unique
+PASS Partial interface MLContext[2]: original interface defined
+PASS Partial interface MLContext[2]: member names are unique
+PASS Partial interface MLContext[3]: original interface defined
+PASS Partial interface MLContext[3]: member names are unique
 PASS Partial interface MLGraphBuilder: original interface defined
 PASS Partial interface MLGraphBuilder: member names are unique
 PASS Partial interface MLGraphBuilder[2]: original interface defined
@@ -66,6 +72,12 @@
 PASS Partial interface MLGraphBuilder[31]: member names are unique
 PASS Partial interface MLGraphBuilder[32]: original interface defined
 PASS Partial interface MLGraphBuilder[32]: member names are unique
+PASS Partial interface MLCommandEncoder: original interface defined
+PASS Partial interface MLCommandEncoder: member names are unique
+PASS Partial interface MLCommandEncoder[2]: original interface defined
+PASS Partial interface MLCommandEncoder[2]: member names are unique
+PASS Partial interface MLCommandEncoder[3]: original interface defined
+PASS Partial interface MLCommandEncoder[3]: member names are unique
 PASS Partial interface mixin NavigatorID: member names are unique
 PASS Navigator includes NavigatorML: member names are unique
 PASS WorkerNavigator includes NavigatorML: member names are unique
@@ -82,6 +94,7 @@
 PASS WorkerNavigator includes NavigatorConcurrentHardware: member names are unique
 PASS Navigator includes NavigatorGPU: member names are unique
 PASS WorkerNavigator includes NavigatorGPU: member names are unique
+PASS GPUBuffer includes GPUObjectBase: member names are unique
 PASS GPUTexture includes GPUObjectBase: member names are unique
 FAIL NavigatorML must be primary interface of navigator assert_own_property: self does not have own property "NavigatorML" expected property "NavigatorML" missing
 FAIL Stringification of navigator assert_class_string: class string of navigator expected "[object NavigatorML]" but got "[object WorkerNavigator]"
@@ -93,24 +106,32 @@
 FAIL ML interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ML" expected property "ML" missing
 FAIL ML interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "ML" expected property "ML" missing
 FAIL ML interface: operation createContext(optional MLContextOptions) assert_own_property: self does not have own property "ML" expected property "ML" missing
-FAIL ML interface: operation createContext(WebGLRenderingContext) assert_own_property: self does not have own property "ML" expected property "ML" missing
 FAIL ML interface: operation createContext(GPUDevice) assert_own_property: self does not have own property "ML" expected property "ML" missing
+FAIL ML interface: operation createContext(WebGLRenderingContext) assert_own_property: self does not have own property "ML" expected property "ML" missing
 FAIL ML must be primary interface of navigator.ml assert_equals: wrong typeof object expected "object" but got "undefined"
 FAIL Stringification of navigator.ml assert_equals: wrong typeof object expected "object" but got "undefined"
 FAIL ML interface: navigator.ml must inherit property "createContext(optional MLContextOptions)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
 FAIL ML interface: calling createContext(optional MLContextOptions) on navigator.ml with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL ML interface: navigator.ml must inherit property "createContext(WebGLRenderingContext)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
-FAIL ML interface: calling createContext(WebGLRenderingContext) on navigator.ml with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined"
 FAIL ML interface: navigator.ml must inherit property "createContext(GPUDevice)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
 FAIL ML interface: calling createContext(GPUDevice) on navigator.ml with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL ML interface: navigator.ml must inherit property "createContext(WebGLRenderingContext)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL ML interface: calling createContext(WebGLRenderingContext) on navigator.ml with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined"
 FAIL MLContext interface: existence and properties of interface object assert_own_property: self does not have own property "MLContext" expected property "MLContext" missing
 FAIL MLContext interface object length assert_own_property: self does not have own property "MLContext" expected property "MLContext" missing
 FAIL MLContext interface object name assert_own_property: self does not have own property "MLContext" expected property "MLContext" missing
 FAIL MLContext interface: existence and properties of interface prototype object assert_own_property: self does not have own property "MLContext" expected property "MLContext" missing
 FAIL MLContext interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "MLContext" expected property "MLContext" missing
 FAIL MLContext interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "MLContext" expected property "MLContext" missing
+FAIL MLContext interface: operation compute(MLGraph, MLNamedArrayInputs, MLNamedArrayOutputs) assert_own_property: self does not have own property "MLContext" expected property "MLContext" missing
+FAIL MLContext interface: operation computeAsync(MLGraph, MLNamedArrayInputs, MLNamedArrayOutputs) assert_own_property: self does not have own property "MLContext" expected property "MLContext" missing
+FAIL MLContext interface: operation createCommandEncoder() assert_own_property: self does not have own property "MLContext" expected property "MLContext" missing
 FAIL MLContext must be primary interface of context assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: context is not defined"
 FAIL Stringification of context assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: context is not defined"
+FAIL MLContext interface: context must inherit property "compute(MLGraph, MLNamedArrayInputs, MLNamedArrayOutputs)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: context is not defined"
+FAIL MLContext interface: calling compute(MLGraph, MLNamedArrayInputs, MLNamedArrayOutputs) on context with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: context is not defined"
+FAIL MLContext interface: context must inherit property "computeAsync(MLGraph, MLNamedArrayInputs, MLNamedArrayOutputs)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: context is not defined"
+FAIL MLContext interface: calling computeAsync(MLGraph, MLNamedArrayInputs, MLNamedArrayOutputs) on context with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: context is not defined"
+FAIL MLContext interface: context must inherit property "createCommandEncoder()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: context is not defined"
 FAIL MLOperand interface: existence and properties of interface object assert_own_property: self does not have own property "MLOperand" expected property "MLOperand" missing
 FAIL MLOperand interface object length assert_own_property: self does not have own property "MLOperand" expected property "MLOperand" missing
 FAIL MLOperand interface object name assert_own_property: self does not have own property "MLOperand" expected property "MLOperand" missing
@@ -354,11 +375,17 @@
 FAIL MLGraph interface: existence and properties of interface prototype object assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
 FAIL MLGraph interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
 FAIL MLGraph interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
-FAIL MLGraph interface: operation compute(MLNamedInputs, MLNamedOutputs) assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
 FAIL MLGraph must be primary interface of graph assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
 FAIL Stringification of graph assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
-FAIL MLGraph interface: graph must inherit property "compute(MLNamedInputs, MLNamedOutputs)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
-FAIL MLGraph interface: calling compute(MLNamedInputs, MLNamedOutputs) on graph with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
+FAIL MLCommandEncoder interface: existence and properties of interface object assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
+FAIL MLCommandEncoder interface object length assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
+FAIL MLCommandEncoder interface object name assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
+FAIL MLCommandEncoder interface: existence and properties of interface prototype object assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
+FAIL MLCommandEncoder interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
+FAIL MLCommandEncoder interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
+FAIL MLCommandEncoder interface: operation initializeGraph(MLGraph) assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
+FAIL MLCommandEncoder interface: operation dispatch(MLGraph, MLNamedGPUInputs, MLNamedGPUOutputs) assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
+FAIL MLCommandEncoder interface: operation finish(optional GPUCommandBufferDescriptor) assert_own_property: self does not have own property "MLCommandEncoder" expected property "MLCommandEncoder" missing
 FAIL WorkerNavigator interface: attribute ml assert_true: The prototype object must have a property "ml" expected true got false
 FAIL WorkerNavigator interface: navigator must inherit property "ml" with the proper type assert_inherits: property "ml" not found in prototype chain
 Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/webaudio/idlharness.https.window-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/webaudio/idlharness.https.window-expected.txt
new file mode 100644
index 0000000..59d12b4
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/webaudio/idlharness.https.window-expected.txt
@@ -0,0 +1,1138 @@
+This is a testharness.js-based test.
+Found 1124 tests; 1115 PASS, 9 FAIL, 0 TIMEOUT, 0 NOTRUN.
+PASS idl_test setup
+PASS idl_test validation
+PASS HTMLElement includes GlobalEventHandlers: member names are unique
+PASS HTMLElement includes DocumentAndElementEventHandlers: member names are unique
+PASS HTMLElement includes ElementContentEditable: member names are unique
+PASS HTMLElement includes HTMLOrSVGElement: member names are unique
+PASS Element includes ParentNode: member names are unique
+PASS Element includes NonDocumentTypeChildNode: member names are unique
+PASS Element includes ChildNode: member names are unique
+PASS Element includes Slottable: member names are unique
+PASS BaseAudioContext interface: existence and properties of interface object
+PASS BaseAudioContext interface object length
+PASS BaseAudioContext interface object name
+PASS BaseAudioContext interface: existence and properties of interface prototype object
+PASS BaseAudioContext interface: existence and properties of interface prototype object's "constructor" property
+PASS BaseAudioContext interface: existence and properties of interface prototype object's @@unscopables property
+PASS BaseAudioContext interface: attribute destination
+PASS BaseAudioContext interface: attribute sampleRate
+PASS BaseAudioContext interface: attribute currentTime
+PASS BaseAudioContext interface: attribute listener
+PASS BaseAudioContext interface: attribute state
+PASS BaseAudioContext interface: attribute audioWorklet
+PASS BaseAudioContext interface: attribute onstatechange
+PASS BaseAudioContext interface: operation createAnalyser()
+PASS BaseAudioContext interface: operation createBiquadFilter()
+PASS BaseAudioContext interface: operation createBuffer(unsigned long, unsigned long, float)
+PASS BaseAudioContext interface: operation createBufferSource()
+PASS BaseAudioContext interface: operation createChannelMerger(optional unsigned long)
+PASS BaseAudioContext interface: operation createChannelSplitter(optional unsigned long)
+PASS BaseAudioContext interface: operation createConstantSource()
+PASS BaseAudioContext interface: operation createConvolver()
+PASS BaseAudioContext interface: operation createDelay(optional double)
+PASS BaseAudioContext interface: operation createDynamicsCompressor()
+PASS BaseAudioContext interface: operation createGain()
+PASS BaseAudioContext interface: operation createIIRFilter(sequence<double>, sequence<double>)
+PASS BaseAudioContext interface: operation createOscillator()
+PASS BaseAudioContext interface: operation createPanner()
+PASS BaseAudioContext interface: operation createPeriodicWave(sequence<float>, sequence<float>, optional PeriodicWaveConstraints)
+PASS BaseAudioContext interface: operation createScriptProcessor(optional unsigned long, optional unsigned long, optional unsigned long)
+PASS BaseAudioContext interface: operation createStereoPanner()
+PASS BaseAudioContext interface: operation createWaveShaper()
+PASS BaseAudioContext interface: operation decodeAudioData(ArrayBuffer, optional DecodeSuccessCallback?, optional DecodeErrorCallback?)
+PASS AudioContext interface: existence and properties of interface object
+PASS AudioContext interface object length
+PASS AudioContext interface object name
+PASS AudioContext interface: existence and properties of interface prototype object
+PASS AudioContext interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioContext interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioContext interface: attribute baseLatency
+PASS AudioContext interface: attribute outputLatency
+PASS AudioContext interface: operation getOutputTimestamp()
+PASS AudioContext interface: operation resume()
+PASS AudioContext interface: operation suspend()
+PASS AudioContext interface: operation close()
+PASS AudioContext interface: operation createMediaElementSource(HTMLMediaElement)
+PASS AudioContext interface: operation createMediaStreamSource(MediaStream)
+FAIL AudioContext interface: operation createMediaStreamTrackSource(MediaStreamTrack) assert_own_property: interface prototype object missing non-static operation expected property "createMediaStreamTrackSource" missing
+PASS AudioContext interface: operation createMediaStreamDestination()
+PASS AudioContext must be primary interface of context
+PASS Stringification of context
+PASS AudioContext interface: context must inherit property "baseLatency" with the proper type
+PASS AudioContext interface: context must inherit property "outputLatency" with the proper type
+PASS AudioContext interface: context must inherit property "getOutputTimestamp()" with the proper type
+PASS AudioContext interface: context must inherit property "resume()" with the proper type
+PASS AudioContext interface: context must inherit property "suspend()" with the proper type
+PASS AudioContext interface: context must inherit property "close()" with the proper type
+PASS AudioContext interface: context must inherit property "createMediaElementSource(HTMLMediaElement)" with the proper type
+PASS AudioContext interface: calling createMediaElementSource(HTMLMediaElement) on context with too few arguments must throw TypeError
+PASS AudioContext interface: context must inherit property "createMediaStreamSource(MediaStream)" with the proper type
+PASS AudioContext interface: calling createMediaStreamSource(MediaStream) on context with too few arguments must throw TypeError
+FAIL AudioContext interface: context must inherit property "createMediaStreamTrackSource(MediaStreamTrack)" with the proper type assert_inherits: property "createMediaStreamTrackSource" not found in prototype chain
+FAIL AudioContext interface: calling createMediaStreamTrackSource(MediaStreamTrack) on context with too few arguments must throw TypeError assert_inherits: property "createMediaStreamTrackSource" not found in prototype chain
+PASS AudioContext interface: context must inherit property "createMediaStreamDestination()" with the proper type
+PASS BaseAudioContext interface: context must inherit property "destination" with the proper type
+PASS BaseAudioContext interface: context must inherit property "sampleRate" with the proper type
+PASS BaseAudioContext interface: context must inherit property "currentTime" with the proper type
+PASS BaseAudioContext interface: context must inherit property "listener" with the proper type
+PASS BaseAudioContext interface: context must inherit property "state" with the proper type
+PASS BaseAudioContext interface: context must inherit property "audioWorklet" with the proper type
+PASS BaseAudioContext interface: context must inherit property "onstatechange" with the proper type
+PASS BaseAudioContext interface: context must inherit property "createAnalyser()" with the proper type
+PASS BaseAudioContext interface: context must inherit property "createBiquadFilter()" with the proper type
+PASS BaseAudioContext interface: context must inherit property "createBuffer(unsigned long, unsigned long, float)" with the proper type
+PASS BaseAudioContext interface: calling createBuffer(unsigned long, unsigned long, float) on context with too few arguments must throw TypeError
+PASS BaseAudioContext interface: context must inherit property "createBufferSource()" with the proper type
+PASS BaseAudioContext interface: context must inherit property "createChannelMerger(optional unsigned long)" with the proper type
+PASS BaseAudioContext interface: calling createChannelMerger(optional unsigned long) on context with too few arguments must throw TypeError
+PASS BaseAudioContext interface: context must inherit property "createChannelSplitter(optional unsigned long)" with the proper type
+PASS BaseAudioContext interface: calling createChannelSplitter(optional unsigned long) on context with too few arguments must throw TypeError
+PASS BaseAudioContext interface: context must inherit property "createConstantSource()" with the proper type
+PASS BaseAudioContext interface: context must inherit property "createConvolver()" with the proper type
+PASS BaseAudioContext interface: context must inherit property "createDelay(optional double)" with the proper type
+PASS BaseAudioContext interface: calling createDelay(optional double) on context with too few arguments must throw TypeError
+PASS BaseAudioContext interface: context must inherit property "createDynamicsCompressor()" with the proper type
+PASS BaseAudioContext interface: context must inherit property "createGain()" with the proper type
+PASS BaseAudioContext interface: context must inherit property "createIIRFilter(sequence<double>, sequence<double>)" with the proper type
+PASS BaseAudioContext interface: calling createIIRFilter(sequence<double>, sequence<double>) on context with too few arguments must throw TypeError
+PASS BaseAudioContext interface: context must inherit property "createOscillator()" with the proper type
+PASS BaseAudioContext interface: context must inherit property "createPanner()" with the proper type
+PASS BaseAudioContext interface: context must inherit property "createPeriodicWave(sequence<float>, sequence<float>, optional PeriodicWaveConstraints)" with the proper type
+PASS BaseAudioContext interface: calling createPeriodicWave(sequence<float>, sequence<float>, optional PeriodicWaveConstraints) on context with too few arguments must throw TypeError
+PASS BaseAudioContext interface: context must inherit property "createScriptProcessor(optional unsigned long, optional unsigned long, optional unsigned long)" with the proper type
+PASS BaseAudioContext interface: calling createScriptProcessor(optional unsigned long, optional unsigned long, optional unsigned long) on context with too few arguments must throw TypeError
+PASS BaseAudioContext interface: context must inherit property "createStereoPanner()" with the proper type
+PASS BaseAudioContext interface: context must inherit property "createWaveShaper()" with the proper type
+PASS BaseAudioContext interface: context must inherit property "decodeAudioData(ArrayBuffer, optional DecodeSuccessCallback?, optional DecodeErrorCallback?)" with the proper type
+PASS BaseAudioContext interface: calling decodeAudioData(ArrayBuffer, optional DecodeSuccessCallback?, optional DecodeErrorCallback?) on context with too few arguments must throw TypeError
+PASS OfflineAudioContext interface: existence and properties of interface object
+PASS OfflineAudioContext interface object length
+PASS OfflineAudioContext interface object name
+PASS OfflineAudioContext interface: existence and properties of interface prototype object
+PASS OfflineAudioContext interface: existence and properties of interface prototype object's "constructor" property
+PASS OfflineAudioContext interface: existence and properties of interface prototype object's @@unscopables property
+PASS OfflineAudioContext interface: operation startRendering()
+PASS OfflineAudioContext interface: operation resume()
+PASS OfflineAudioContext interface: operation suspend(double)
+PASS OfflineAudioContext interface: attribute length
+PASS OfflineAudioContext interface: attribute oncomplete
+PASS OfflineAudioContext must be primary interface of new OfflineAudioContext(1, 1, sample_rate)
+PASS Stringification of new OfflineAudioContext(1, 1, sample_rate)
+PASS OfflineAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "startRendering()" with the proper type
+PASS OfflineAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "resume()" with the proper type
+PASS OfflineAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "suspend(double)" with the proper type
+PASS OfflineAudioContext interface: calling suspend(double) on new OfflineAudioContext(1, 1, sample_rate) with too few arguments must throw TypeError
+PASS OfflineAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "length" with the proper type
+PASS OfflineAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "oncomplete" with the proper type
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "destination" with the proper type
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "sampleRate" with the proper type
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "currentTime" with the proper type
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "listener" with the proper type
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "state" with the proper type
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "audioWorklet" with the proper type
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "onstatechange" with the proper type
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "createAnalyser()" with the proper type
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "createBiquadFilter()" with the proper type
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "createBuffer(unsigned long, unsigned long, float)" with the proper type
+PASS BaseAudioContext interface: calling createBuffer(unsigned long, unsigned long, float) on new OfflineAudioContext(1, 1, sample_rate) with too few arguments must throw TypeError
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "createBufferSource()" with the proper type
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "createChannelMerger(optional unsigned long)" with the proper type
+PASS BaseAudioContext interface: calling createChannelMerger(optional unsigned long) on new OfflineAudioContext(1, 1, sample_rate) with too few arguments must throw TypeError
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "createChannelSplitter(optional unsigned long)" with the proper type
+PASS BaseAudioContext interface: calling createChannelSplitter(optional unsigned long) on new OfflineAudioContext(1, 1, sample_rate) with too few arguments must throw TypeError
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "createConstantSource()" with the proper type
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "createConvolver()" with the proper type
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "createDelay(optional double)" with the proper type
+PASS BaseAudioContext interface: calling createDelay(optional double) on new OfflineAudioContext(1, 1, sample_rate) with too few arguments must throw TypeError
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "createDynamicsCompressor()" with the proper type
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "createGain()" with the proper type
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "createIIRFilter(sequence<double>, sequence<double>)" with the proper type
+PASS BaseAudioContext interface: calling createIIRFilter(sequence<double>, sequence<double>) on new OfflineAudioContext(1, 1, sample_rate) with too few arguments must throw TypeError
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "createOscillator()" with the proper type
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "createPanner()" with the proper type
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "createPeriodicWave(sequence<float>, sequence<float>, optional PeriodicWaveConstraints)" with the proper type
+PASS BaseAudioContext interface: calling createPeriodicWave(sequence<float>, sequence<float>, optional PeriodicWaveConstraints) on new OfflineAudioContext(1, 1, sample_rate) with too few arguments must throw TypeError
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "createScriptProcessor(optional unsigned long, optional unsigned long, optional unsigned long)" with the proper type
+PASS BaseAudioContext interface: calling createScriptProcessor(optional unsigned long, optional unsigned long, optional unsigned long) on new OfflineAudioContext(1, 1, sample_rate) with too few arguments must throw TypeError
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "createStereoPanner()" with the proper type
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "createWaveShaper()" with the proper type
+PASS BaseAudioContext interface: new OfflineAudioContext(1, 1, sample_rate) must inherit property "decodeAudioData(ArrayBuffer, optional DecodeSuccessCallback?, optional DecodeErrorCallback?)" with the proper type
+PASS BaseAudioContext interface: calling decodeAudioData(ArrayBuffer, optional DecodeSuccessCallback?, optional DecodeErrorCallback?) on new OfflineAudioContext(1, 1, sample_rate) with too few arguments must throw TypeError
+PASS OfflineAudioCompletionEvent interface: existence and properties of interface object
+PASS OfflineAudioCompletionEvent interface object length
+PASS OfflineAudioCompletionEvent interface object name
+PASS OfflineAudioCompletionEvent interface: existence and properties of interface prototype object
+PASS OfflineAudioCompletionEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS OfflineAudioCompletionEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS OfflineAudioCompletionEvent interface: attribute renderedBuffer
+PASS OfflineAudioCompletionEvent must be primary interface of new OfflineAudioCompletionEvent("", {renderedBuffer: buffer})
+PASS Stringification of new OfflineAudioCompletionEvent("", {renderedBuffer: buffer})
+PASS OfflineAudioCompletionEvent interface: new OfflineAudioCompletionEvent("", {renderedBuffer: buffer}) must inherit property "renderedBuffer" with the proper type
+PASS AudioBuffer interface: existence and properties of interface object
+PASS AudioBuffer interface object length
+PASS AudioBuffer interface object name
+PASS AudioBuffer interface: existence and properties of interface prototype object
+PASS AudioBuffer interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioBuffer interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioBuffer interface: attribute sampleRate
+PASS AudioBuffer interface: attribute length
+PASS AudioBuffer interface: attribute duration
+PASS AudioBuffer interface: attribute numberOfChannels
+PASS AudioBuffer interface: operation getChannelData(unsigned long)
+PASS AudioBuffer interface: operation copyFromChannel(Float32Array, unsigned long, optional unsigned long)
+PASS AudioBuffer interface: operation copyToChannel(Float32Array, unsigned long, optional unsigned long)
+PASS AudioBuffer must be primary interface of buffer
+PASS Stringification of buffer
+PASS AudioBuffer interface: buffer must inherit property "sampleRate" with the proper type
+PASS AudioBuffer interface: buffer must inherit property "length" with the proper type
+PASS AudioBuffer interface: buffer must inherit property "duration" with the proper type
+PASS AudioBuffer interface: buffer must inherit property "numberOfChannels" with the proper type
+PASS AudioBuffer interface: buffer must inherit property "getChannelData(unsigned long)" with the proper type
+PASS AudioBuffer interface: calling getChannelData(unsigned long) on buffer with too few arguments must throw TypeError
+PASS AudioBuffer interface: buffer must inherit property "copyFromChannel(Float32Array, unsigned long, optional unsigned long)" with the proper type
+PASS AudioBuffer interface: calling copyFromChannel(Float32Array, unsigned long, optional unsigned long) on buffer with too few arguments must throw TypeError
+PASS AudioBuffer interface: buffer must inherit property "copyToChannel(Float32Array, unsigned long, optional unsigned long)" with the proper type
+PASS AudioBuffer interface: calling copyToChannel(Float32Array, unsigned long, optional unsigned long) on buffer with too few arguments must throw TypeError
+PASS AudioNode interface: existence and properties of interface object
+PASS AudioNode interface object length
+PASS AudioNode interface object name
+PASS AudioNode interface: existence and properties of interface prototype object
+PASS AudioNode interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioNode interface: operation connect(AudioNode, optional unsigned long, optional unsigned long)
+PASS AudioNode interface: operation connect(AudioParam, optional unsigned long)
+PASS AudioNode interface: operation disconnect()
+PASS AudioNode interface: operation disconnect(unsigned long)
+PASS AudioNode interface: operation disconnect(AudioNode)
+PASS AudioNode interface: operation disconnect(AudioNode, unsigned long)
+PASS AudioNode interface: operation disconnect(AudioNode, unsigned long, unsigned long)
+PASS AudioNode interface: operation disconnect(AudioParam)
+PASS AudioNode interface: operation disconnect(AudioParam, unsigned long)
+PASS AudioNode interface: attribute context
+PASS AudioNode interface: attribute numberOfInputs
+PASS AudioNode interface: attribute numberOfOutputs
+PASS AudioNode interface: attribute channelCount
+PASS AudioNode interface: attribute channelCountMode
+PASS AudioNode interface: attribute channelInterpretation
+PASS AudioParam interface: existence and properties of interface object
+PASS AudioParam interface object length
+PASS AudioParam interface object name
+PASS AudioParam interface: existence and properties of interface prototype object
+PASS AudioParam interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioParam interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioParam interface: attribute value
+PASS AudioParam interface: attribute automationRate
+PASS AudioParam interface: attribute defaultValue
+PASS AudioParam interface: attribute minValue
+PASS AudioParam interface: attribute maxValue
+PASS AudioParam interface: operation setValueAtTime(float, double)
+PASS AudioParam interface: operation linearRampToValueAtTime(float, double)
+PASS AudioParam interface: operation exponentialRampToValueAtTime(float, double)
+PASS AudioParam interface: operation setTargetAtTime(float, double, float)
+PASS AudioParam interface: operation setValueCurveAtTime(sequence<float>, double, double)
+PASS AudioParam interface: operation cancelScheduledValues(double)
+PASS AudioParam interface: operation cancelAndHoldAtTime(double)
+PASS AudioParam must be primary interface of new AudioBufferSourceNode(context).playbackRate
+PASS Stringification of new AudioBufferSourceNode(context).playbackRate
+PASS AudioParam interface: new AudioBufferSourceNode(context).playbackRate must inherit property "value" with the proper type
+PASS AudioParam interface: new AudioBufferSourceNode(context).playbackRate must inherit property "automationRate" with the proper type
+PASS AudioParam interface: new AudioBufferSourceNode(context).playbackRate must inherit property "defaultValue" with the proper type
+PASS AudioParam interface: new AudioBufferSourceNode(context).playbackRate must inherit property "minValue" with the proper type
+PASS AudioParam interface: new AudioBufferSourceNode(context).playbackRate must inherit property "maxValue" with the proper type
+PASS AudioParam interface: new AudioBufferSourceNode(context).playbackRate must inherit property "setValueAtTime(float, double)" with the proper type
+PASS AudioParam interface: calling setValueAtTime(float, double) on new AudioBufferSourceNode(context).playbackRate with too few arguments must throw TypeError
+PASS AudioParam interface: new AudioBufferSourceNode(context).playbackRate must inherit property "linearRampToValueAtTime(float, double)" with the proper type
+PASS AudioParam interface: calling linearRampToValueAtTime(float, double) on new AudioBufferSourceNode(context).playbackRate with too few arguments must throw TypeError
+PASS AudioParam interface: new AudioBufferSourceNode(context).playbackRate must inherit property "exponentialRampToValueAtTime(float, double)" with the proper type
+PASS AudioParam interface: calling exponentialRampToValueAtTime(float, double) on new AudioBufferSourceNode(context).playbackRate with too few arguments must throw TypeError
+PASS AudioParam interface: new AudioBufferSourceNode(context).playbackRate must inherit property "setTargetAtTime(float, double, float)" with the proper type
+PASS AudioParam interface: calling setTargetAtTime(float, double, float) on new AudioBufferSourceNode(context).playbackRate with too few arguments must throw TypeError
+PASS AudioParam interface: new AudioBufferSourceNode(context).playbackRate must inherit property "setValueCurveAtTime(sequence<float>, double, double)" with the proper type
+PASS AudioParam interface: calling setValueCurveAtTime(sequence<float>, double, double) on new AudioBufferSourceNode(context).playbackRate with too few arguments must throw TypeError
+PASS AudioParam interface: new AudioBufferSourceNode(context).playbackRate must inherit property "cancelScheduledValues(double)" with the proper type
+PASS AudioParam interface: calling cancelScheduledValues(double) on new AudioBufferSourceNode(context).playbackRate with too few arguments must throw TypeError
+PASS AudioParam interface: new AudioBufferSourceNode(context).playbackRate must inherit property "cancelAndHoldAtTime(double)" with the proper type
+PASS AudioParam interface: calling cancelAndHoldAtTime(double) on new AudioBufferSourceNode(context).playbackRate with too few arguments must throw TypeError
+PASS AudioScheduledSourceNode interface: existence and properties of interface object
+PASS AudioScheduledSourceNode interface object length
+PASS AudioScheduledSourceNode interface object name
+PASS AudioScheduledSourceNode interface: existence and properties of interface prototype object
+PASS AudioScheduledSourceNode interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioScheduledSourceNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioScheduledSourceNode interface: attribute onended
+PASS AudioScheduledSourceNode interface: operation start(optional double)
+PASS AudioScheduledSourceNode interface: operation stop(optional double)
+PASS AnalyserNode interface: existence and properties of interface object
+PASS AnalyserNode interface object length
+PASS AnalyserNode interface object name
+PASS AnalyserNode interface: existence and properties of interface prototype object
+PASS AnalyserNode interface: existence and properties of interface prototype object's "constructor" property
+PASS AnalyserNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS AnalyserNode interface: operation getFloatFrequencyData(Float32Array)
+PASS AnalyserNode interface: operation getByteFrequencyData(Uint8Array)
+PASS AnalyserNode interface: operation getFloatTimeDomainData(Float32Array)
+PASS AnalyserNode interface: operation getByteTimeDomainData(Uint8Array)
+PASS AnalyserNode interface: attribute fftSize
+PASS AnalyserNode interface: attribute frequencyBinCount
+PASS AnalyserNode interface: attribute minDecibels
+PASS AnalyserNode interface: attribute maxDecibels
+PASS AnalyserNode interface: attribute smoothingTimeConstant
+PASS AnalyserNode must be primary interface of new AnalyserNode(context)
+PASS Stringification of new AnalyserNode(context)
+PASS AnalyserNode interface: new AnalyserNode(context) must inherit property "getFloatFrequencyData(Float32Array)" with the proper type
+PASS AnalyserNode interface: calling getFloatFrequencyData(Float32Array) on new AnalyserNode(context) with too few arguments must throw TypeError
+PASS AnalyserNode interface: new AnalyserNode(context) must inherit property "getByteFrequencyData(Uint8Array)" with the proper type
+PASS AnalyserNode interface: calling getByteFrequencyData(Uint8Array) on new AnalyserNode(context) with too few arguments must throw TypeError
+PASS AnalyserNode interface: new AnalyserNode(context) must inherit property "getFloatTimeDomainData(Float32Array)" with the proper type
+PASS AnalyserNode interface: calling getFloatTimeDomainData(Float32Array) on new AnalyserNode(context) with too few arguments must throw TypeError
+PASS AnalyserNode interface: new AnalyserNode(context) must inherit property "getByteTimeDomainData(Uint8Array)" with the proper type
+PASS AnalyserNode interface: calling getByteTimeDomainData(Uint8Array) on new AnalyserNode(context) with too few arguments must throw TypeError
+PASS AnalyserNode interface: new AnalyserNode(context) must inherit property "fftSize" with the proper type
+PASS AnalyserNode interface: new AnalyserNode(context) must inherit property "frequencyBinCount" with the proper type
+PASS AnalyserNode interface: new AnalyserNode(context) must inherit property "minDecibels" with the proper type
+PASS AnalyserNode interface: new AnalyserNode(context) must inherit property "maxDecibels" with the proper type
+PASS AnalyserNode interface: new AnalyserNode(context) must inherit property "smoothingTimeConstant" with the proper type
+PASS AudioNode interface: new AnalyserNode(context) must inherit property "connect(AudioNode, optional unsigned long, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioNode, optional unsigned long, optional unsigned long) on new AnalyserNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new AnalyserNode(context) must inherit property "connect(AudioParam, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioParam, optional unsigned long) on new AnalyserNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new AnalyserNode(context) must inherit property "disconnect()" with the proper type
+PASS AudioNode interface: new AnalyserNode(context) must inherit property "disconnect(unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(unsigned long) on new AnalyserNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new AnalyserNode(context) must inherit property "disconnect(AudioNode)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode) on new AnalyserNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new AnalyserNode(context) must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on new AnalyserNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new AnalyserNode(context) must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on new AnalyserNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new AnalyserNode(context) must inherit property "disconnect(AudioParam)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam) on new AnalyserNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new AnalyserNode(context) must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on new AnalyserNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new AnalyserNode(context) must inherit property "context" with the proper type
+PASS AudioNode interface: new AnalyserNode(context) must inherit property "numberOfInputs" with the proper type
+PASS AudioNode interface: new AnalyserNode(context) must inherit property "numberOfOutputs" with the proper type
+PASS AudioNode interface: new AnalyserNode(context) must inherit property "channelCount" with the proper type
+PASS AudioNode interface: new AnalyserNode(context) must inherit property "channelCountMode" with the proper type
+PASS AudioNode interface: new AnalyserNode(context) must inherit property "channelInterpretation" with the proper type
+PASS AudioBufferSourceNode interface: existence and properties of interface object
+PASS AudioBufferSourceNode interface object length
+PASS AudioBufferSourceNode interface object name
+PASS AudioBufferSourceNode interface: existence and properties of interface prototype object
+PASS AudioBufferSourceNode interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioBufferSourceNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioBufferSourceNode interface: attribute buffer
+PASS AudioBufferSourceNode interface: attribute playbackRate
+PASS AudioBufferSourceNode interface: attribute detune
+PASS AudioBufferSourceNode interface: attribute loop
+PASS AudioBufferSourceNode interface: attribute loopStart
+PASS AudioBufferSourceNode interface: attribute loopEnd
+PASS AudioBufferSourceNode interface: operation start(optional double, optional double, optional double)
+PASS AudioBufferSourceNode must be primary interface of new AudioBufferSourceNode(context)
+PASS Stringification of new AudioBufferSourceNode(context)
+PASS AudioBufferSourceNode interface: new AudioBufferSourceNode(context) must inherit property "buffer" with the proper type
+PASS AudioBufferSourceNode interface: new AudioBufferSourceNode(context) must inherit property "playbackRate" with the proper type
+PASS AudioBufferSourceNode interface: new AudioBufferSourceNode(context) must inherit property "detune" with the proper type
+PASS AudioBufferSourceNode interface: new AudioBufferSourceNode(context) must inherit property "loop" with the proper type
+PASS AudioBufferSourceNode interface: new AudioBufferSourceNode(context) must inherit property "loopStart" with the proper type
+PASS AudioBufferSourceNode interface: new AudioBufferSourceNode(context) must inherit property "loopEnd" with the proper type
+PASS AudioBufferSourceNode interface: new AudioBufferSourceNode(context) must inherit property "start(optional double, optional double, optional double)" with the proper type
+PASS AudioBufferSourceNode interface: calling start(optional double, optional double, optional double) on new AudioBufferSourceNode(context) with too few arguments must throw TypeError
+PASS AudioScheduledSourceNode interface: new AudioBufferSourceNode(context) must inherit property "onended" with the proper type
+PASS AudioScheduledSourceNode interface: new AudioBufferSourceNode(context) must inherit property "start(optional double)" with the proper type
+PASS AudioScheduledSourceNode interface: calling start(optional double) on new AudioBufferSourceNode(context) with too few arguments must throw TypeError
+PASS AudioScheduledSourceNode interface: new AudioBufferSourceNode(context) must inherit property "stop(optional double)" with the proper type
+PASS AudioScheduledSourceNode interface: calling stop(optional double) on new AudioBufferSourceNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new AudioBufferSourceNode(context) must inherit property "connect(AudioNode, optional unsigned long, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioNode, optional unsigned long, optional unsigned long) on new AudioBufferSourceNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new AudioBufferSourceNode(context) must inherit property "connect(AudioParam, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioParam, optional unsigned long) on new AudioBufferSourceNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new AudioBufferSourceNode(context) must inherit property "disconnect()" with the proper type
+PASS AudioNode interface: new AudioBufferSourceNode(context) must inherit property "disconnect(unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(unsigned long) on new AudioBufferSourceNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new AudioBufferSourceNode(context) must inherit property "disconnect(AudioNode)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode) on new AudioBufferSourceNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new AudioBufferSourceNode(context) must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on new AudioBufferSourceNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new AudioBufferSourceNode(context) must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on new AudioBufferSourceNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new AudioBufferSourceNode(context) must inherit property "disconnect(AudioParam)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam) on new AudioBufferSourceNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new AudioBufferSourceNode(context) must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on new AudioBufferSourceNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new AudioBufferSourceNode(context) must inherit property "context" with the proper type
+PASS AudioNode interface: new AudioBufferSourceNode(context) must inherit property "numberOfInputs" with the proper type
+PASS AudioNode interface: new AudioBufferSourceNode(context) must inherit property "numberOfOutputs" with the proper type
+PASS AudioNode interface: new AudioBufferSourceNode(context) must inherit property "channelCount" with the proper type
+PASS AudioNode interface: new AudioBufferSourceNode(context) must inherit property "channelCountMode" with the proper type
+PASS AudioNode interface: new AudioBufferSourceNode(context) must inherit property "channelInterpretation" with the proper type
+PASS AudioDestinationNode interface: existence and properties of interface object
+PASS AudioDestinationNode interface object length
+PASS AudioDestinationNode interface object name
+PASS AudioDestinationNode interface: existence and properties of interface prototype object
+PASS AudioDestinationNode interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioDestinationNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioDestinationNode interface: attribute maxChannelCount
+PASS AudioDestinationNode must be primary interface of context.destination
+PASS Stringification of context.destination
+PASS AudioDestinationNode interface: context.destination must inherit property "maxChannelCount" with the proper type
+PASS AudioNode interface: context.destination must inherit property "connect(AudioNode, optional unsigned long, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioNode, optional unsigned long, optional unsigned long) on context.destination with too few arguments must throw TypeError
+PASS AudioNode interface: context.destination must inherit property "connect(AudioParam, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioParam, optional unsigned long) on context.destination with too few arguments must throw TypeError
+PASS AudioNode interface: context.destination must inherit property "disconnect()" with the proper type
+PASS AudioNode interface: context.destination must inherit property "disconnect(unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(unsigned long) on context.destination with too few arguments must throw TypeError
+PASS AudioNode interface: context.destination must inherit property "disconnect(AudioNode)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode) on context.destination with too few arguments must throw TypeError
+PASS AudioNode interface: context.destination must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on context.destination with too few arguments must throw TypeError
+PASS AudioNode interface: context.destination must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on context.destination with too few arguments must throw TypeError
+PASS AudioNode interface: context.destination must inherit property "disconnect(AudioParam)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam) on context.destination with too few arguments must throw TypeError
+PASS AudioNode interface: context.destination must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on context.destination with too few arguments must throw TypeError
+PASS AudioNode interface: context.destination must inherit property "context" with the proper type
+PASS AudioNode interface: context.destination must inherit property "numberOfInputs" with the proper type
+PASS AudioNode interface: context.destination must inherit property "numberOfOutputs" with the proper type
+PASS AudioNode interface: context.destination must inherit property "channelCount" with the proper type
+PASS AudioNode interface: context.destination must inherit property "channelCountMode" with the proper type
+PASS AudioNode interface: context.destination must inherit property "channelInterpretation" with the proper type
+PASS AudioListener interface: existence and properties of interface object
+PASS AudioListener interface object length
+PASS AudioListener interface object name
+PASS AudioListener interface: existence and properties of interface prototype object
+PASS AudioListener interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioListener interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioListener interface: attribute positionX
+PASS AudioListener interface: attribute positionY
+PASS AudioListener interface: attribute positionZ
+PASS AudioListener interface: attribute forwardX
+PASS AudioListener interface: attribute forwardY
+PASS AudioListener interface: attribute forwardZ
+PASS AudioListener interface: attribute upX
+PASS AudioListener interface: attribute upY
+PASS AudioListener interface: attribute upZ
+PASS AudioListener interface: operation setPosition(float, float, float)
+PASS AudioListener interface: operation setOrientation(float, float, float, float, float, float)
+PASS AudioListener must be primary interface of context.listener
+PASS Stringification of context.listener
+PASS AudioListener interface: context.listener must inherit property "positionX" with the proper type
+PASS AudioListener interface: context.listener must inherit property "positionY" with the proper type
+PASS AudioListener interface: context.listener must inherit property "positionZ" with the proper type
+PASS AudioListener interface: context.listener must inherit property "forwardX" with the proper type
+PASS AudioListener interface: context.listener must inherit property "forwardY" with the proper type
+PASS AudioListener interface: context.listener must inherit property "forwardZ" with the proper type
+PASS AudioListener interface: context.listener must inherit property "upX" with the proper type
+PASS AudioListener interface: context.listener must inherit property "upY" with the proper type
+PASS AudioListener interface: context.listener must inherit property "upZ" with the proper type
+PASS AudioListener interface: context.listener must inherit property "setPosition(float, float, float)" with the proper type
+PASS AudioListener interface: calling setPosition(float, float, float) on context.listener with too few arguments must throw TypeError
+PASS AudioListener interface: context.listener must inherit property "setOrientation(float, float, float, float, float, float)" with the proper type
+PASS AudioListener interface: calling setOrientation(float, float, float, float, float, float) on context.listener with too few arguments must throw TypeError
+PASS AudioProcessingEvent interface: existence and properties of interface object
+PASS AudioProcessingEvent interface object length
+PASS AudioProcessingEvent interface object name
+PASS AudioProcessingEvent interface: existence and properties of interface prototype object
+PASS AudioProcessingEvent interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioProcessingEvent interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioProcessingEvent interface: attribute playbackTime
+PASS AudioProcessingEvent interface: attribute inputBuffer
+PASS AudioProcessingEvent interface: attribute outputBuffer
+PASS AudioProcessingEvent must be primary interface of new AudioProcessingEvent('', {
+        playbackTime: 0, inputBuffer: buffer, outputBuffer: buffer
+      })
+PASS Stringification of new AudioProcessingEvent('', {
+        playbackTime: 0, inputBuffer: buffer, outputBuffer: buffer
+      })
+PASS AudioProcessingEvent interface: new AudioProcessingEvent('', {
+        playbackTime: 0, inputBuffer: buffer, outputBuffer: buffer
+      }) must inherit property "playbackTime" with the proper type
+PASS AudioProcessingEvent interface: new AudioProcessingEvent('', {
+        playbackTime: 0, inputBuffer: buffer, outputBuffer: buffer
+      }) must inherit property "inputBuffer" with the proper type
+PASS AudioProcessingEvent interface: new AudioProcessingEvent('', {
+        playbackTime: 0, inputBuffer: buffer, outputBuffer: buffer
+      }) must inherit property "outputBuffer" with the proper type
+PASS BiquadFilterNode interface: existence and properties of interface object
+PASS BiquadFilterNode interface object length
+PASS BiquadFilterNode interface object name
+PASS BiquadFilterNode interface: existence and properties of interface prototype object
+PASS BiquadFilterNode interface: existence and properties of interface prototype object's "constructor" property
+PASS BiquadFilterNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS BiquadFilterNode interface: attribute type
+PASS BiquadFilterNode interface: attribute frequency
+PASS BiquadFilterNode interface: attribute detune
+PASS BiquadFilterNode interface: attribute Q
+PASS BiquadFilterNode interface: attribute gain
+PASS BiquadFilterNode interface: operation getFrequencyResponse(Float32Array, Float32Array, Float32Array)
+PASS BiquadFilterNode must be primary interface of new BiquadFilterNode(context)
+PASS Stringification of new BiquadFilterNode(context)
+PASS BiquadFilterNode interface: new BiquadFilterNode(context) must inherit property "type" with the proper type
+PASS BiquadFilterNode interface: new BiquadFilterNode(context) must inherit property "frequency" with the proper type
+PASS BiquadFilterNode interface: new BiquadFilterNode(context) must inherit property "detune" with the proper type
+PASS BiquadFilterNode interface: new BiquadFilterNode(context) must inherit property "Q" with the proper type
+PASS BiquadFilterNode interface: new BiquadFilterNode(context) must inherit property "gain" with the proper type
+PASS BiquadFilterNode interface: new BiquadFilterNode(context) must inherit property "getFrequencyResponse(Float32Array, Float32Array, Float32Array)" with the proper type
+PASS BiquadFilterNode interface: calling getFrequencyResponse(Float32Array, Float32Array, Float32Array) on new BiquadFilterNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new BiquadFilterNode(context) must inherit property "connect(AudioNode, optional unsigned long, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioNode, optional unsigned long, optional unsigned long) on new BiquadFilterNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new BiquadFilterNode(context) must inherit property "connect(AudioParam, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioParam, optional unsigned long) on new BiquadFilterNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new BiquadFilterNode(context) must inherit property "disconnect()" with the proper type
+PASS AudioNode interface: new BiquadFilterNode(context) must inherit property "disconnect(unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(unsigned long) on new BiquadFilterNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new BiquadFilterNode(context) must inherit property "disconnect(AudioNode)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode) on new BiquadFilterNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new BiquadFilterNode(context) must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on new BiquadFilterNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new BiquadFilterNode(context) must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on new BiquadFilterNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new BiquadFilterNode(context) must inherit property "disconnect(AudioParam)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam) on new BiquadFilterNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new BiquadFilterNode(context) must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on new BiquadFilterNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new BiquadFilterNode(context) must inherit property "context" with the proper type
+PASS AudioNode interface: new BiquadFilterNode(context) must inherit property "numberOfInputs" with the proper type
+PASS AudioNode interface: new BiquadFilterNode(context) must inherit property "numberOfOutputs" with the proper type
+PASS AudioNode interface: new BiquadFilterNode(context) must inherit property "channelCount" with the proper type
+PASS AudioNode interface: new BiquadFilterNode(context) must inherit property "channelCountMode" with the proper type
+PASS AudioNode interface: new BiquadFilterNode(context) must inherit property "channelInterpretation" with the proper type
+PASS ChannelMergerNode interface: existence and properties of interface object
+PASS ChannelMergerNode interface object length
+PASS ChannelMergerNode interface object name
+PASS ChannelMergerNode interface: existence and properties of interface prototype object
+PASS ChannelMergerNode interface: existence and properties of interface prototype object's "constructor" property
+PASS ChannelMergerNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS ChannelMergerNode must be primary interface of new ChannelMergerNode(context)
+PASS Stringification of new ChannelMergerNode(context)
+PASS AudioNode interface: new ChannelMergerNode(context) must inherit property "connect(AudioNode, optional unsigned long, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioNode, optional unsigned long, optional unsigned long) on new ChannelMergerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ChannelMergerNode(context) must inherit property "connect(AudioParam, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioParam, optional unsigned long) on new ChannelMergerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ChannelMergerNode(context) must inherit property "disconnect()" with the proper type
+PASS AudioNode interface: new ChannelMergerNode(context) must inherit property "disconnect(unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(unsigned long) on new ChannelMergerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ChannelMergerNode(context) must inherit property "disconnect(AudioNode)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode) on new ChannelMergerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ChannelMergerNode(context) must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on new ChannelMergerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ChannelMergerNode(context) must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on new ChannelMergerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ChannelMergerNode(context) must inherit property "disconnect(AudioParam)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam) on new ChannelMergerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ChannelMergerNode(context) must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on new ChannelMergerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ChannelMergerNode(context) must inherit property "context" with the proper type
+PASS AudioNode interface: new ChannelMergerNode(context) must inherit property "numberOfInputs" with the proper type
+PASS AudioNode interface: new ChannelMergerNode(context) must inherit property "numberOfOutputs" with the proper type
+PASS AudioNode interface: new ChannelMergerNode(context) must inherit property "channelCount" with the proper type
+PASS AudioNode interface: new ChannelMergerNode(context) must inherit property "channelCountMode" with the proper type
+PASS AudioNode interface: new ChannelMergerNode(context) must inherit property "channelInterpretation" with the proper type
+PASS ChannelSplitterNode interface: existence and properties of interface object
+PASS ChannelSplitterNode interface object length
+PASS ChannelSplitterNode interface object name
+PASS ChannelSplitterNode interface: existence and properties of interface prototype object
+PASS ChannelSplitterNode interface: existence and properties of interface prototype object's "constructor" property
+PASS ChannelSplitterNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS ChannelSplitterNode must be primary interface of new ChannelSplitterNode(context)
+PASS Stringification of new ChannelSplitterNode(context)
+PASS AudioNode interface: new ChannelSplitterNode(context) must inherit property "connect(AudioNode, optional unsigned long, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioNode, optional unsigned long, optional unsigned long) on new ChannelSplitterNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ChannelSplitterNode(context) must inherit property "connect(AudioParam, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioParam, optional unsigned long) on new ChannelSplitterNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ChannelSplitterNode(context) must inherit property "disconnect()" with the proper type
+PASS AudioNode interface: new ChannelSplitterNode(context) must inherit property "disconnect(unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(unsigned long) on new ChannelSplitterNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ChannelSplitterNode(context) must inherit property "disconnect(AudioNode)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode) on new ChannelSplitterNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ChannelSplitterNode(context) must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on new ChannelSplitterNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ChannelSplitterNode(context) must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on new ChannelSplitterNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ChannelSplitterNode(context) must inherit property "disconnect(AudioParam)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam) on new ChannelSplitterNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ChannelSplitterNode(context) must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on new ChannelSplitterNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ChannelSplitterNode(context) must inherit property "context" with the proper type
+PASS AudioNode interface: new ChannelSplitterNode(context) must inherit property "numberOfInputs" with the proper type
+PASS AudioNode interface: new ChannelSplitterNode(context) must inherit property "numberOfOutputs" with the proper type
+PASS AudioNode interface: new ChannelSplitterNode(context) must inherit property "channelCount" with the proper type
+PASS AudioNode interface: new ChannelSplitterNode(context) must inherit property "channelCountMode" with the proper type
+PASS AudioNode interface: new ChannelSplitterNode(context) must inherit property "channelInterpretation" with the proper type
+PASS ConstantSourceNode interface: existence and properties of interface object
+PASS ConstantSourceNode interface object length
+PASS ConstantSourceNode interface object name
+PASS ConstantSourceNode interface: existence and properties of interface prototype object
+PASS ConstantSourceNode interface: existence and properties of interface prototype object's "constructor" property
+PASS ConstantSourceNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS ConstantSourceNode interface: attribute offset
+PASS ConstantSourceNode must be primary interface of new ConstantSourceNode(context)
+PASS Stringification of new ConstantSourceNode(context)
+PASS ConstantSourceNode interface: new ConstantSourceNode(context) must inherit property "offset" with the proper type
+PASS AudioScheduledSourceNode interface: new ConstantSourceNode(context) must inherit property "onended" with the proper type
+PASS AudioScheduledSourceNode interface: new ConstantSourceNode(context) must inherit property "start(optional double)" with the proper type
+PASS AudioScheduledSourceNode interface: calling start(optional double) on new ConstantSourceNode(context) with too few arguments must throw TypeError
+PASS AudioScheduledSourceNode interface: new ConstantSourceNode(context) must inherit property "stop(optional double)" with the proper type
+PASS AudioScheduledSourceNode interface: calling stop(optional double) on new ConstantSourceNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ConstantSourceNode(context) must inherit property "connect(AudioNode, optional unsigned long, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioNode, optional unsigned long, optional unsigned long) on new ConstantSourceNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ConstantSourceNode(context) must inherit property "connect(AudioParam, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioParam, optional unsigned long) on new ConstantSourceNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ConstantSourceNode(context) must inherit property "disconnect()" with the proper type
+PASS AudioNode interface: new ConstantSourceNode(context) must inherit property "disconnect(unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(unsigned long) on new ConstantSourceNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ConstantSourceNode(context) must inherit property "disconnect(AudioNode)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode) on new ConstantSourceNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ConstantSourceNode(context) must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on new ConstantSourceNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ConstantSourceNode(context) must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on new ConstantSourceNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ConstantSourceNode(context) must inherit property "disconnect(AudioParam)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam) on new ConstantSourceNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ConstantSourceNode(context) must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on new ConstantSourceNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ConstantSourceNode(context) must inherit property "context" with the proper type
+PASS AudioNode interface: new ConstantSourceNode(context) must inherit property "numberOfInputs" with the proper type
+PASS AudioNode interface: new ConstantSourceNode(context) must inherit property "numberOfOutputs" with the proper type
+PASS AudioNode interface: new ConstantSourceNode(context) must inherit property "channelCount" with the proper type
+PASS AudioNode interface: new ConstantSourceNode(context) must inherit property "channelCountMode" with the proper type
+PASS AudioNode interface: new ConstantSourceNode(context) must inherit property "channelInterpretation" with the proper type
+PASS ConvolverNode interface: existence and properties of interface object
+PASS ConvolverNode interface object length
+PASS ConvolverNode interface object name
+PASS ConvolverNode interface: existence and properties of interface prototype object
+PASS ConvolverNode interface: existence and properties of interface prototype object's "constructor" property
+PASS ConvolverNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS ConvolverNode interface: attribute buffer
+PASS ConvolverNode interface: attribute normalize
+PASS ConvolverNode must be primary interface of new ConvolverNode(context)
+PASS Stringification of new ConvolverNode(context)
+PASS ConvolverNode interface: new ConvolverNode(context) must inherit property "buffer" with the proper type
+PASS ConvolverNode interface: new ConvolverNode(context) must inherit property "normalize" with the proper type
+PASS AudioNode interface: new ConvolverNode(context) must inherit property "connect(AudioNode, optional unsigned long, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioNode, optional unsigned long, optional unsigned long) on new ConvolverNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ConvolverNode(context) must inherit property "connect(AudioParam, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioParam, optional unsigned long) on new ConvolverNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ConvolverNode(context) must inherit property "disconnect()" with the proper type
+PASS AudioNode interface: new ConvolverNode(context) must inherit property "disconnect(unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(unsigned long) on new ConvolverNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ConvolverNode(context) must inherit property "disconnect(AudioNode)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode) on new ConvolverNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ConvolverNode(context) must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on new ConvolverNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ConvolverNode(context) must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on new ConvolverNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ConvolverNode(context) must inherit property "disconnect(AudioParam)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam) on new ConvolverNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ConvolverNode(context) must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on new ConvolverNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new ConvolverNode(context) must inherit property "context" with the proper type
+PASS AudioNode interface: new ConvolverNode(context) must inherit property "numberOfInputs" with the proper type
+PASS AudioNode interface: new ConvolverNode(context) must inherit property "numberOfOutputs" with the proper type
+PASS AudioNode interface: new ConvolverNode(context) must inherit property "channelCount" with the proper type
+PASS AudioNode interface: new ConvolverNode(context) must inherit property "channelCountMode" with the proper type
+PASS AudioNode interface: new ConvolverNode(context) must inherit property "channelInterpretation" with the proper type
+PASS DelayNode interface: existence and properties of interface object
+PASS DelayNode interface object length
+PASS DelayNode interface object name
+PASS DelayNode interface: existence and properties of interface prototype object
+PASS DelayNode interface: existence and properties of interface prototype object's "constructor" property
+PASS DelayNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS DelayNode interface: attribute delayTime
+PASS DelayNode must be primary interface of new DelayNode(context)
+PASS Stringification of new DelayNode(context)
+PASS DelayNode interface: new DelayNode(context) must inherit property "delayTime" with the proper type
+PASS AudioNode interface: new DelayNode(context) must inherit property "connect(AudioNode, optional unsigned long, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioNode, optional unsigned long, optional unsigned long) on new DelayNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new DelayNode(context) must inherit property "connect(AudioParam, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioParam, optional unsigned long) on new DelayNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new DelayNode(context) must inherit property "disconnect()" with the proper type
+PASS AudioNode interface: new DelayNode(context) must inherit property "disconnect(unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(unsigned long) on new DelayNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new DelayNode(context) must inherit property "disconnect(AudioNode)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode) on new DelayNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new DelayNode(context) must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on new DelayNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new DelayNode(context) must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on new DelayNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new DelayNode(context) must inherit property "disconnect(AudioParam)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam) on new DelayNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new DelayNode(context) must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on new DelayNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new DelayNode(context) must inherit property "context" with the proper type
+PASS AudioNode interface: new DelayNode(context) must inherit property "numberOfInputs" with the proper type
+PASS AudioNode interface: new DelayNode(context) must inherit property "numberOfOutputs" with the proper type
+PASS AudioNode interface: new DelayNode(context) must inherit property "channelCount" with the proper type
+PASS AudioNode interface: new DelayNode(context) must inherit property "channelCountMode" with the proper type
+PASS AudioNode interface: new DelayNode(context) must inherit property "channelInterpretation" with the proper type
+PASS DynamicsCompressorNode interface: existence and properties of interface object
+PASS DynamicsCompressorNode interface object length
+PASS DynamicsCompressorNode interface object name
+PASS DynamicsCompressorNode interface: existence and properties of interface prototype object
+PASS DynamicsCompressorNode interface: existence and properties of interface prototype object's "constructor" property
+PASS DynamicsCompressorNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS DynamicsCompressorNode interface: attribute threshold
+PASS DynamicsCompressorNode interface: attribute knee
+PASS DynamicsCompressorNode interface: attribute ratio
+PASS DynamicsCompressorNode interface: attribute reduction
+PASS DynamicsCompressorNode interface: attribute attack
+PASS DynamicsCompressorNode interface: attribute release
+PASS DynamicsCompressorNode must be primary interface of new DynamicsCompressorNode(context)
+PASS Stringification of new DynamicsCompressorNode(context)
+PASS DynamicsCompressorNode interface: new DynamicsCompressorNode(context) must inherit property "threshold" with the proper type
+PASS DynamicsCompressorNode interface: new DynamicsCompressorNode(context) must inherit property "knee" with the proper type
+PASS DynamicsCompressorNode interface: new DynamicsCompressorNode(context) must inherit property "ratio" with the proper type
+PASS DynamicsCompressorNode interface: new DynamicsCompressorNode(context) must inherit property "reduction" with the proper type
+PASS DynamicsCompressorNode interface: new DynamicsCompressorNode(context) must inherit property "attack" with the proper type
+PASS DynamicsCompressorNode interface: new DynamicsCompressorNode(context) must inherit property "release" with the proper type
+PASS AudioNode interface: new DynamicsCompressorNode(context) must inherit property "connect(AudioNode, optional unsigned long, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioNode, optional unsigned long, optional unsigned long) on new DynamicsCompressorNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new DynamicsCompressorNode(context) must inherit property "connect(AudioParam, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioParam, optional unsigned long) on new DynamicsCompressorNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new DynamicsCompressorNode(context) must inherit property "disconnect()" with the proper type
+PASS AudioNode interface: new DynamicsCompressorNode(context) must inherit property "disconnect(unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(unsigned long) on new DynamicsCompressorNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new DynamicsCompressorNode(context) must inherit property "disconnect(AudioNode)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode) on new DynamicsCompressorNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new DynamicsCompressorNode(context) must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on new DynamicsCompressorNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new DynamicsCompressorNode(context) must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on new DynamicsCompressorNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new DynamicsCompressorNode(context) must inherit property "disconnect(AudioParam)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam) on new DynamicsCompressorNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new DynamicsCompressorNode(context) must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on new DynamicsCompressorNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new DynamicsCompressorNode(context) must inherit property "context" with the proper type
+PASS AudioNode interface: new DynamicsCompressorNode(context) must inherit property "numberOfInputs" with the proper type
+PASS AudioNode interface: new DynamicsCompressorNode(context) must inherit property "numberOfOutputs" with the proper type
+PASS AudioNode interface: new DynamicsCompressorNode(context) must inherit property "channelCount" with the proper type
+PASS AudioNode interface: new DynamicsCompressorNode(context) must inherit property "channelCountMode" with the proper type
+PASS AudioNode interface: new DynamicsCompressorNode(context) must inherit property "channelInterpretation" with the proper type
+PASS GainNode interface: existence and properties of interface object
+PASS GainNode interface object length
+PASS GainNode interface object name
+PASS GainNode interface: existence and properties of interface prototype object
+PASS GainNode interface: existence and properties of interface prototype object's "constructor" property
+PASS GainNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS GainNode interface: attribute gain
+PASS GainNode must be primary interface of new GainNode(context)
+PASS Stringification of new GainNode(context)
+PASS GainNode interface: new GainNode(context) must inherit property "gain" with the proper type
+PASS AudioNode interface: new GainNode(context) must inherit property "connect(AudioNode, optional unsigned long, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioNode, optional unsigned long, optional unsigned long) on new GainNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new GainNode(context) must inherit property "connect(AudioParam, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioParam, optional unsigned long) on new GainNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new GainNode(context) must inherit property "disconnect()" with the proper type
+PASS AudioNode interface: new GainNode(context) must inherit property "disconnect(unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(unsigned long) on new GainNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new GainNode(context) must inherit property "disconnect(AudioNode)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode) on new GainNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new GainNode(context) must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on new GainNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new GainNode(context) must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on new GainNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new GainNode(context) must inherit property "disconnect(AudioParam)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam) on new GainNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new GainNode(context) must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on new GainNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new GainNode(context) must inherit property "context" with the proper type
+PASS AudioNode interface: new GainNode(context) must inherit property "numberOfInputs" with the proper type
+PASS AudioNode interface: new GainNode(context) must inherit property "numberOfOutputs" with the proper type
+PASS AudioNode interface: new GainNode(context) must inherit property "channelCount" with the proper type
+PASS AudioNode interface: new GainNode(context) must inherit property "channelCountMode" with the proper type
+PASS AudioNode interface: new GainNode(context) must inherit property "channelInterpretation" with the proper type
+PASS IIRFilterNode interface: existence and properties of interface object
+PASS IIRFilterNode interface object length
+PASS IIRFilterNode interface object name
+PASS IIRFilterNode interface: existence and properties of interface prototype object
+PASS IIRFilterNode interface: existence and properties of interface prototype object's "constructor" property
+PASS IIRFilterNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS IIRFilterNode interface: operation getFrequencyResponse(Float32Array, Float32Array, Float32Array)
+PASS IIRFilterNode must be primary interface of new IIRFilterNode(context, {feedforward: [1], feedback: [1]})
+PASS Stringification of new IIRFilterNode(context, {feedforward: [1], feedback: [1]})
+PASS IIRFilterNode interface: new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) must inherit property "getFrequencyResponse(Float32Array, Float32Array, Float32Array)" with the proper type
+PASS IIRFilterNode interface: calling getFrequencyResponse(Float32Array, Float32Array, Float32Array) on new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) with too few arguments must throw TypeError
+PASS AudioNode interface: new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) must inherit property "connect(AudioNode, optional unsigned long, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioNode, optional unsigned long, optional unsigned long) on new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) with too few arguments must throw TypeError
+PASS AudioNode interface: new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) must inherit property "connect(AudioParam, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioParam, optional unsigned long) on new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) with too few arguments must throw TypeError
+PASS AudioNode interface: new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) must inherit property "disconnect()" with the proper type
+PASS AudioNode interface: new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) must inherit property "disconnect(unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(unsigned long) on new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) with too few arguments must throw TypeError
+PASS AudioNode interface: new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) must inherit property "disconnect(AudioNode)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode) on new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) with too few arguments must throw TypeError
+PASS AudioNode interface: new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) with too few arguments must throw TypeError
+PASS AudioNode interface: new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) with too few arguments must throw TypeError
+PASS AudioNode interface: new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) must inherit property "disconnect(AudioParam)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam) on new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) with too few arguments must throw TypeError
+PASS AudioNode interface: new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) with too few arguments must throw TypeError
+PASS AudioNode interface: new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) must inherit property "context" with the proper type
+PASS AudioNode interface: new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) must inherit property "numberOfInputs" with the proper type
+PASS AudioNode interface: new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) must inherit property "numberOfOutputs" with the proper type
+PASS AudioNode interface: new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) must inherit property "channelCount" with the proper type
+PASS AudioNode interface: new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) must inherit property "channelCountMode" with the proper type
+PASS AudioNode interface: new IIRFilterNode(context, {feedforward: [1], feedback: [1]}) must inherit property "channelInterpretation" with the proper type
+PASS MediaElementAudioSourceNode interface: existence and properties of interface object
+PASS MediaElementAudioSourceNode interface object length
+PASS MediaElementAudioSourceNode interface object name
+PASS MediaElementAudioSourceNode interface: existence and properties of interface prototype object
+PASS MediaElementAudioSourceNode interface: existence and properties of interface prototype object's "constructor" property
+PASS MediaElementAudioSourceNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS MediaElementAudioSourceNode interface: attribute mediaElement
+PASS MediaElementAudioSourceNode must be primary interface of new MediaElementAudioSourceNode(context, {mediaElement: new Audio})
+PASS Stringification of new MediaElementAudioSourceNode(context, {mediaElement: new Audio})
+PASS MediaElementAudioSourceNode interface: new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) must inherit property "mediaElement" with the proper type
+PASS AudioNode interface: new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) must inherit property "connect(AudioNode, optional unsigned long, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioNode, optional unsigned long, optional unsigned long) on new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) with too few arguments must throw TypeError
+PASS AudioNode interface: new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) must inherit property "connect(AudioParam, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioParam, optional unsigned long) on new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) with too few arguments must throw TypeError
+PASS AudioNode interface: new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) must inherit property "disconnect()" with the proper type
+PASS AudioNode interface: new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) must inherit property "disconnect(unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(unsigned long) on new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) with too few arguments must throw TypeError
+PASS AudioNode interface: new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) must inherit property "disconnect(AudioNode)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode) on new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) with too few arguments must throw TypeError
+PASS AudioNode interface: new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) with too few arguments must throw TypeError
+PASS AudioNode interface: new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) with too few arguments must throw TypeError
+PASS AudioNode interface: new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) must inherit property "disconnect(AudioParam)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam) on new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) with too few arguments must throw TypeError
+PASS AudioNode interface: new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) with too few arguments must throw TypeError
+PASS AudioNode interface: new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) must inherit property "context" with the proper type
+PASS AudioNode interface: new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) must inherit property "numberOfInputs" with the proper type
+PASS AudioNode interface: new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) must inherit property "numberOfOutputs" with the proper type
+PASS AudioNode interface: new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) must inherit property "channelCount" with the proper type
+PASS AudioNode interface: new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) must inherit property "channelCountMode" with the proper type
+PASS AudioNode interface: new MediaElementAudioSourceNode(context, {mediaElement: new Audio}) must inherit property "channelInterpretation" with the proper type
+PASS MediaStreamAudioDestinationNode interface: existence and properties of interface object
+PASS MediaStreamAudioDestinationNode interface object length
+PASS MediaStreamAudioDestinationNode interface object name
+PASS MediaStreamAudioDestinationNode interface: existence and properties of interface prototype object
+PASS MediaStreamAudioDestinationNode interface: existence and properties of interface prototype object's "constructor" property
+PASS MediaStreamAudioDestinationNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS MediaStreamAudioDestinationNode interface: attribute stream
+PASS MediaStreamAudioDestinationNode must be primary interface of new MediaStreamAudioDestinationNode(context)
+PASS Stringification of new MediaStreamAudioDestinationNode(context)
+PASS MediaStreamAudioDestinationNode interface: new MediaStreamAudioDestinationNode(context) must inherit property "stream" with the proper type
+PASS AudioNode interface: new MediaStreamAudioDestinationNode(context) must inherit property "connect(AudioNode, optional unsigned long, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioNode, optional unsigned long, optional unsigned long) on new MediaStreamAudioDestinationNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new MediaStreamAudioDestinationNode(context) must inherit property "connect(AudioParam, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioParam, optional unsigned long) on new MediaStreamAudioDestinationNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new MediaStreamAudioDestinationNode(context) must inherit property "disconnect()" with the proper type
+PASS AudioNode interface: new MediaStreamAudioDestinationNode(context) must inherit property "disconnect(unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(unsigned long) on new MediaStreamAudioDestinationNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new MediaStreamAudioDestinationNode(context) must inherit property "disconnect(AudioNode)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode) on new MediaStreamAudioDestinationNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new MediaStreamAudioDestinationNode(context) must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on new MediaStreamAudioDestinationNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new MediaStreamAudioDestinationNode(context) must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on new MediaStreamAudioDestinationNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new MediaStreamAudioDestinationNode(context) must inherit property "disconnect(AudioParam)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam) on new MediaStreamAudioDestinationNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new MediaStreamAudioDestinationNode(context) must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on new MediaStreamAudioDestinationNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new MediaStreamAudioDestinationNode(context) must inherit property "context" with the proper type
+PASS AudioNode interface: new MediaStreamAudioDestinationNode(context) must inherit property "numberOfInputs" with the proper type
+PASS AudioNode interface: new MediaStreamAudioDestinationNode(context) must inherit property "numberOfOutputs" with the proper type
+PASS AudioNode interface: new MediaStreamAudioDestinationNode(context) must inherit property "channelCount" with the proper type
+PASS AudioNode interface: new MediaStreamAudioDestinationNode(context) must inherit property "channelCountMode" with the proper type
+PASS AudioNode interface: new MediaStreamAudioDestinationNode(context) must inherit property "channelInterpretation" with the proper type
+PASS MediaStreamAudioSourceNode interface: existence and properties of interface object
+PASS MediaStreamAudioSourceNode interface object length
+PASS MediaStreamAudioSourceNode interface object name
+PASS MediaStreamAudioSourceNode interface: existence and properties of interface prototype object
+PASS MediaStreamAudioSourceNode interface: existence and properties of interface prototype object's "constructor" property
+PASS MediaStreamAudioSourceNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS MediaStreamAudioSourceNode interface: attribute mediaStream
+FAIL MediaStreamTrackAudioSourceNode interface: existence and properties of interface object assert_own_property: self does not have own property "MediaStreamTrackAudioSourceNode" expected property "MediaStreamTrackAudioSourceNode" missing
+FAIL MediaStreamTrackAudioSourceNode interface object length assert_own_property: self does not have own property "MediaStreamTrackAudioSourceNode" expected property "MediaStreamTrackAudioSourceNode" missing
+FAIL MediaStreamTrackAudioSourceNode interface object name assert_own_property: self does not have own property "MediaStreamTrackAudioSourceNode" expected property "MediaStreamTrackAudioSourceNode" missing
+FAIL MediaStreamTrackAudioSourceNode interface: existence and properties of interface prototype object assert_own_property: self does not have own property "MediaStreamTrackAudioSourceNode" expected property "MediaStreamTrackAudioSourceNode" missing
+FAIL MediaStreamTrackAudioSourceNode interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "MediaStreamTrackAudioSourceNode" expected property "MediaStreamTrackAudioSourceNode" missing
+FAIL MediaStreamTrackAudioSourceNode interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "MediaStreamTrackAudioSourceNode" expected property "MediaStreamTrackAudioSourceNode" missing
+PASS OscillatorNode interface: existence and properties of interface object
+PASS OscillatorNode interface object length
+PASS OscillatorNode interface object name
+PASS OscillatorNode interface: existence and properties of interface prototype object
+PASS OscillatorNode interface: existence and properties of interface prototype object's "constructor" property
+PASS OscillatorNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS OscillatorNode interface: attribute type
+PASS OscillatorNode interface: attribute frequency
+PASS OscillatorNode interface: attribute detune
+PASS OscillatorNode interface: operation setPeriodicWave(PeriodicWave)
+PASS OscillatorNode must be primary interface of new OscillatorNode(context)
+PASS Stringification of new OscillatorNode(context)
+PASS OscillatorNode interface: new OscillatorNode(context) must inherit property "type" with the proper type
+PASS OscillatorNode interface: new OscillatorNode(context) must inherit property "frequency" with the proper type
+PASS OscillatorNode interface: new OscillatorNode(context) must inherit property "detune" with the proper type
+PASS OscillatorNode interface: new OscillatorNode(context) must inherit property "setPeriodicWave(PeriodicWave)" with the proper type
+PASS OscillatorNode interface: calling setPeriodicWave(PeriodicWave) on new OscillatorNode(context) with too few arguments must throw TypeError
+PASS AudioScheduledSourceNode interface: new OscillatorNode(context) must inherit property "onended" with the proper type
+PASS AudioScheduledSourceNode interface: new OscillatorNode(context) must inherit property "start(optional double)" with the proper type
+PASS AudioScheduledSourceNode interface: calling start(optional double) on new OscillatorNode(context) with too few arguments must throw TypeError
+PASS AudioScheduledSourceNode interface: new OscillatorNode(context) must inherit property "stop(optional double)" with the proper type
+PASS AudioScheduledSourceNode interface: calling stop(optional double) on new OscillatorNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new OscillatorNode(context) must inherit property "connect(AudioNode, optional unsigned long, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioNode, optional unsigned long, optional unsigned long) on new OscillatorNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new OscillatorNode(context) must inherit property "connect(AudioParam, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioParam, optional unsigned long) on new OscillatorNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new OscillatorNode(context) must inherit property "disconnect()" with the proper type
+PASS AudioNode interface: new OscillatorNode(context) must inherit property "disconnect(unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(unsigned long) on new OscillatorNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new OscillatorNode(context) must inherit property "disconnect(AudioNode)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode) on new OscillatorNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new OscillatorNode(context) must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on new OscillatorNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new OscillatorNode(context) must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on new OscillatorNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new OscillatorNode(context) must inherit property "disconnect(AudioParam)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam) on new OscillatorNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new OscillatorNode(context) must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on new OscillatorNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new OscillatorNode(context) must inherit property "context" with the proper type
+PASS AudioNode interface: new OscillatorNode(context) must inherit property "numberOfInputs" with the proper type
+PASS AudioNode interface: new OscillatorNode(context) must inherit property "numberOfOutputs" with the proper type
+PASS AudioNode interface: new OscillatorNode(context) must inherit property "channelCount" with the proper type
+PASS AudioNode interface: new OscillatorNode(context) must inherit property "channelCountMode" with the proper type
+PASS AudioNode interface: new OscillatorNode(context) must inherit property "channelInterpretation" with the proper type
+PASS PannerNode interface: existence and properties of interface object
+PASS PannerNode interface object length
+PASS PannerNode interface object name
+PASS PannerNode interface: existence and properties of interface prototype object
+PASS PannerNode interface: existence and properties of interface prototype object's "constructor" property
+PASS PannerNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS PannerNode interface: attribute panningModel
+PASS PannerNode interface: attribute positionX
+PASS PannerNode interface: attribute positionY
+PASS PannerNode interface: attribute positionZ
+PASS PannerNode interface: attribute orientationX
+PASS PannerNode interface: attribute orientationY
+PASS PannerNode interface: attribute orientationZ
+PASS PannerNode interface: attribute distanceModel
+PASS PannerNode interface: attribute refDistance
+PASS PannerNode interface: attribute maxDistance
+PASS PannerNode interface: attribute rolloffFactor
+PASS PannerNode interface: attribute coneInnerAngle
+PASS PannerNode interface: attribute coneOuterAngle
+PASS PannerNode interface: attribute coneOuterGain
+PASS PannerNode interface: operation setPosition(float, float, float)
+PASS PannerNode interface: operation setOrientation(float, float, float)
+PASS PannerNode must be primary interface of new PannerNode(context)
+PASS Stringification of new PannerNode(context)
+PASS PannerNode interface: new PannerNode(context) must inherit property "panningModel" with the proper type
+PASS PannerNode interface: new PannerNode(context) must inherit property "positionX" with the proper type
+PASS PannerNode interface: new PannerNode(context) must inherit property "positionY" with the proper type
+PASS PannerNode interface: new PannerNode(context) must inherit property "positionZ" with the proper type
+PASS PannerNode interface: new PannerNode(context) must inherit property "orientationX" with the proper type
+PASS PannerNode interface: new PannerNode(context) must inherit property "orientationY" with the proper type
+PASS PannerNode interface: new PannerNode(context) must inherit property "orientationZ" with the proper type
+PASS PannerNode interface: new PannerNode(context) must inherit property "distanceModel" with the proper type
+PASS PannerNode interface: new PannerNode(context) must inherit property "refDistance" with the proper type
+PASS PannerNode interface: new PannerNode(context) must inherit property "maxDistance" with the proper type
+PASS PannerNode interface: new PannerNode(context) must inherit property "rolloffFactor" with the proper type
+PASS PannerNode interface: new PannerNode(context) must inherit property "coneInnerAngle" with the proper type
+PASS PannerNode interface: new PannerNode(context) must inherit property "coneOuterAngle" with the proper type
+PASS PannerNode interface: new PannerNode(context) must inherit property "coneOuterGain" with the proper type
+PASS PannerNode interface: new PannerNode(context) must inherit property "setPosition(float, float, float)" with the proper type
+PASS PannerNode interface: calling setPosition(float, float, float) on new PannerNode(context) with too few arguments must throw TypeError
+PASS PannerNode interface: new PannerNode(context) must inherit property "setOrientation(float, float, float)" with the proper type
+PASS PannerNode interface: calling setOrientation(float, float, float) on new PannerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new PannerNode(context) must inherit property "connect(AudioNode, optional unsigned long, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioNode, optional unsigned long, optional unsigned long) on new PannerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new PannerNode(context) must inherit property "connect(AudioParam, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioParam, optional unsigned long) on new PannerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new PannerNode(context) must inherit property "disconnect()" with the proper type
+PASS AudioNode interface: new PannerNode(context) must inherit property "disconnect(unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(unsigned long) on new PannerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new PannerNode(context) must inherit property "disconnect(AudioNode)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode) on new PannerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new PannerNode(context) must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on new PannerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new PannerNode(context) must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on new PannerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new PannerNode(context) must inherit property "disconnect(AudioParam)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam) on new PannerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new PannerNode(context) must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on new PannerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new PannerNode(context) must inherit property "context" with the proper type
+PASS AudioNode interface: new PannerNode(context) must inherit property "numberOfInputs" with the proper type
+PASS AudioNode interface: new PannerNode(context) must inherit property "numberOfOutputs" with the proper type
+PASS AudioNode interface: new PannerNode(context) must inherit property "channelCount" with the proper type
+PASS AudioNode interface: new PannerNode(context) must inherit property "channelCountMode" with the proper type
+PASS AudioNode interface: new PannerNode(context) must inherit property "channelInterpretation" with the proper type
+PASS PeriodicWave interface: existence and properties of interface object
+PASS PeriodicWave interface object length
+PASS PeriodicWave interface object name
+PASS PeriodicWave interface: existence and properties of interface prototype object
+PASS PeriodicWave interface: existence and properties of interface prototype object's "constructor" property
+PASS PeriodicWave interface: existence and properties of interface prototype object's @@unscopables property
+PASS PeriodicWave must be primary interface of new PeriodicWave(context)
+PASS Stringification of new PeriodicWave(context)
+PASS ScriptProcessorNode interface: existence and properties of interface object
+PASS ScriptProcessorNode interface object length
+PASS ScriptProcessorNode interface object name
+PASS ScriptProcessorNode interface: existence and properties of interface prototype object
+PASS ScriptProcessorNode interface: existence and properties of interface prototype object's "constructor" property
+PASS ScriptProcessorNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS ScriptProcessorNode interface: attribute onaudioprocess
+PASS ScriptProcessorNode interface: attribute bufferSize
+PASS ScriptProcessorNode must be primary interface of context.createScriptProcessor()
+PASS Stringification of context.createScriptProcessor()
+PASS ScriptProcessorNode interface: context.createScriptProcessor() must inherit property "onaudioprocess" with the proper type
+PASS ScriptProcessorNode interface: context.createScriptProcessor() must inherit property "bufferSize" with the proper type
+PASS AudioNode interface: context.createScriptProcessor() must inherit property "connect(AudioNode, optional unsigned long, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioNode, optional unsigned long, optional unsigned long) on context.createScriptProcessor() with too few arguments must throw TypeError
+PASS AudioNode interface: context.createScriptProcessor() must inherit property "connect(AudioParam, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioParam, optional unsigned long) on context.createScriptProcessor() with too few arguments must throw TypeError
+PASS AudioNode interface: context.createScriptProcessor() must inherit property "disconnect()" with the proper type
+PASS AudioNode interface: context.createScriptProcessor() must inherit property "disconnect(unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(unsigned long) on context.createScriptProcessor() with too few arguments must throw TypeError
+PASS AudioNode interface: context.createScriptProcessor() must inherit property "disconnect(AudioNode)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode) on context.createScriptProcessor() with too few arguments must throw TypeError
+PASS AudioNode interface: context.createScriptProcessor() must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on context.createScriptProcessor() with too few arguments must throw TypeError
+PASS AudioNode interface: context.createScriptProcessor() must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on context.createScriptProcessor() with too few arguments must throw TypeError
+PASS AudioNode interface: context.createScriptProcessor() must inherit property "disconnect(AudioParam)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam) on context.createScriptProcessor() with too few arguments must throw TypeError
+PASS AudioNode interface: context.createScriptProcessor() must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on context.createScriptProcessor() with too few arguments must throw TypeError
+PASS AudioNode interface: context.createScriptProcessor() must inherit property "context" with the proper type
+PASS AudioNode interface: context.createScriptProcessor() must inherit property "numberOfInputs" with the proper type
+PASS AudioNode interface: context.createScriptProcessor() must inherit property "numberOfOutputs" with the proper type
+PASS AudioNode interface: context.createScriptProcessor() must inherit property "channelCount" with the proper type
+PASS AudioNode interface: context.createScriptProcessor() must inherit property "channelCountMode" with the proper type
+PASS AudioNode interface: context.createScriptProcessor() must inherit property "channelInterpretation" with the proper type
+PASS StereoPannerNode interface: existence and properties of interface object
+PASS StereoPannerNode interface object length
+PASS StereoPannerNode interface object name
+PASS StereoPannerNode interface: existence and properties of interface prototype object
+PASS StereoPannerNode interface: existence and properties of interface prototype object's "constructor" property
+PASS StereoPannerNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS StereoPannerNode interface: attribute pan
+PASS StereoPannerNode must be primary interface of new StereoPannerNode(context)
+PASS Stringification of new StereoPannerNode(context)
+PASS StereoPannerNode interface: new StereoPannerNode(context) must inherit property "pan" with the proper type
+PASS AudioNode interface: new StereoPannerNode(context) must inherit property "connect(AudioNode, optional unsigned long, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioNode, optional unsigned long, optional unsigned long) on new StereoPannerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new StereoPannerNode(context) must inherit property "connect(AudioParam, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioParam, optional unsigned long) on new StereoPannerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new StereoPannerNode(context) must inherit property "disconnect()" with the proper type
+PASS AudioNode interface: new StereoPannerNode(context) must inherit property "disconnect(unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(unsigned long) on new StereoPannerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new StereoPannerNode(context) must inherit property "disconnect(AudioNode)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode) on new StereoPannerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new StereoPannerNode(context) must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on new StereoPannerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new StereoPannerNode(context) must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on new StereoPannerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new StereoPannerNode(context) must inherit property "disconnect(AudioParam)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam) on new StereoPannerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new StereoPannerNode(context) must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on new StereoPannerNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new StereoPannerNode(context) must inherit property "context" with the proper type
+PASS AudioNode interface: new StereoPannerNode(context) must inherit property "numberOfInputs" with the proper type
+PASS AudioNode interface: new StereoPannerNode(context) must inherit property "numberOfOutputs" with the proper type
+PASS AudioNode interface: new StereoPannerNode(context) must inherit property "channelCount" with the proper type
+PASS AudioNode interface: new StereoPannerNode(context) must inherit property "channelCountMode" with the proper type
+PASS AudioNode interface: new StereoPannerNode(context) must inherit property "channelInterpretation" with the proper type
+PASS WaveShaperNode interface: existence and properties of interface object
+PASS WaveShaperNode interface object length
+PASS WaveShaperNode interface object name
+PASS WaveShaperNode interface: existence and properties of interface prototype object
+PASS WaveShaperNode interface: existence and properties of interface prototype object's "constructor" property
+PASS WaveShaperNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS WaveShaperNode interface: attribute curve
+PASS WaveShaperNode interface: attribute oversample
+PASS WaveShaperNode must be primary interface of new WaveShaperNode(context)
+PASS Stringification of new WaveShaperNode(context)
+PASS WaveShaperNode interface: new WaveShaperNode(context) must inherit property "curve" with the proper type
+PASS WaveShaperNode interface: new WaveShaperNode(context) must inherit property "oversample" with the proper type
+PASS AudioNode interface: new WaveShaperNode(context) must inherit property "connect(AudioNode, optional unsigned long, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioNode, optional unsigned long, optional unsigned long) on new WaveShaperNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new WaveShaperNode(context) must inherit property "connect(AudioParam, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioParam, optional unsigned long) on new WaveShaperNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new WaveShaperNode(context) must inherit property "disconnect()" with the proper type
+PASS AudioNode interface: new WaveShaperNode(context) must inherit property "disconnect(unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(unsigned long) on new WaveShaperNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new WaveShaperNode(context) must inherit property "disconnect(AudioNode)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode) on new WaveShaperNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new WaveShaperNode(context) must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on new WaveShaperNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new WaveShaperNode(context) must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on new WaveShaperNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new WaveShaperNode(context) must inherit property "disconnect(AudioParam)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam) on new WaveShaperNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new WaveShaperNode(context) must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on new WaveShaperNode(context) with too few arguments must throw TypeError
+PASS AudioNode interface: new WaveShaperNode(context) must inherit property "context" with the proper type
+PASS AudioNode interface: new WaveShaperNode(context) must inherit property "numberOfInputs" with the proper type
+PASS AudioNode interface: new WaveShaperNode(context) must inherit property "numberOfOutputs" with the proper type
+PASS AudioNode interface: new WaveShaperNode(context) must inherit property "channelCount" with the proper type
+PASS AudioNode interface: new WaveShaperNode(context) must inherit property "channelCountMode" with the proper type
+PASS AudioNode interface: new WaveShaperNode(context) must inherit property "channelInterpretation" with the proper type
+PASS AudioWorklet interface: existence and properties of interface object
+PASS AudioWorklet interface object length
+PASS AudioWorklet interface object name
+PASS AudioWorklet interface: existence and properties of interface prototype object
+PASS AudioWorklet interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioWorklet interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioWorklet must be primary interface of context.audioWorklet
+PASS Stringification of context.audioWorklet
+PASS AudioWorkletGlobalScope interface: existence and properties of interface object
+PASS AudioParamMap interface: existence and properties of interface object
+PASS AudioParamMap interface object length
+PASS AudioParamMap interface object name
+PASS AudioParamMap interface: existence and properties of interface prototype object
+PASS AudioParamMap interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioParamMap interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioParamMap must be primary interface of worklet_node.parameters
+PASS Stringification of worklet_node.parameters
+PASS AudioWorkletNode interface: existence and properties of interface object
+PASS AudioWorkletNode interface object length
+PASS AudioWorkletNode interface object name
+PASS AudioWorkletNode interface: existence and properties of interface prototype object
+PASS AudioWorkletNode interface: existence and properties of interface prototype object's "constructor" property
+PASS AudioWorkletNode interface: existence and properties of interface prototype object's @@unscopables property
+PASS AudioWorkletNode interface: attribute parameters
+PASS AudioWorkletNode interface: attribute port
+PASS AudioWorkletNode interface: attribute onprocessorerror
+PASS AudioWorkletNode must be primary interface of worklet_node
+PASS Stringification of worklet_node
+PASS AudioWorkletNode interface: worklet_node must inherit property "parameters" with the proper type
+PASS AudioWorkletNode interface: worklet_node must inherit property "port" with the proper type
+PASS AudioWorkletNode interface: worklet_node must inherit property "onprocessorerror" with the proper type
+PASS AudioNode interface: worklet_node must inherit property "connect(AudioNode, optional unsigned long, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioNode, optional unsigned long, optional unsigned long) on worklet_node with too few arguments must throw TypeError
+PASS AudioNode interface: worklet_node must inherit property "connect(AudioParam, optional unsigned long)" with the proper type
+PASS AudioNode interface: calling connect(AudioParam, optional unsigned long) on worklet_node with too few arguments must throw TypeError
+PASS AudioNode interface: worklet_node must inherit property "disconnect()" with the proper type
+PASS AudioNode interface: worklet_node must inherit property "disconnect(unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(unsigned long) on worklet_node with too few arguments must throw TypeError
+PASS AudioNode interface: worklet_node must inherit property "disconnect(AudioNode)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode) on worklet_node with too few arguments must throw TypeError
+PASS AudioNode interface: worklet_node must inherit property "disconnect(AudioNode, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long) on worklet_node with too few arguments must throw TypeError
+PASS AudioNode interface: worklet_node must inherit property "disconnect(AudioNode, unsigned long, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioNode, unsigned long, unsigned long) on worklet_node with too few arguments must throw TypeError
+PASS AudioNode interface: worklet_node must inherit property "disconnect(AudioParam)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam) on worklet_node with too few arguments must throw TypeError
+PASS AudioNode interface: worklet_node must inherit property "disconnect(AudioParam, unsigned long)" with the proper type
+PASS AudioNode interface: calling disconnect(AudioParam, unsigned long) on worklet_node with too few arguments must throw TypeError
+PASS AudioNode interface: worklet_node must inherit property "context" with the proper type
+PASS AudioNode interface: worklet_node must inherit property "numberOfInputs" with the proper type
+PASS AudioNode interface: worklet_node must inherit property "numberOfOutputs" with the proper type
+PASS AudioNode interface: worklet_node must inherit property "channelCount" with the proper type
+PASS AudioNode interface: worklet_node must inherit property "channelCountMode" with the proper type
+PASS AudioNode interface: worklet_node must inherit property "channelInterpretation" with the proper type
+PASS AudioWorkletProcessor interface: existence and properties of interface object
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/webnn/idlharness.https.any-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/webnn/idlharness.https.any-expected.txt
new file mode 100644
index 0000000..3a69eb7a
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/webnn/idlharness.https.any-expected.txt
@@ -0,0 +1,371 @@
+This is a testharness.js-based test.
+Found 361 tests; 105 PASS, 256 FAIL, 0 TIMEOUT, 0 NOTRUN.
+FAIL idl_test setup promise_test: Unhandled rejection with value: object "ReferenceError: MLGraphBuilder is not defined"
+PASS idl_test validation
+PASS Partial interface MLGraphBuilder: original interface defined
+PASS Partial interface MLGraphBuilder: member names are unique
+PASS Partial interface MLGraphBuilder[2]: original interface defined
+PASS Partial interface MLGraphBuilder[2]: member names are unique
+PASS Partial interface MLGraphBuilder[3]: original interface defined
+PASS Partial interface MLGraphBuilder[3]: member names are unique
+PASS Partial interface MLGraphBuilder[4]: original interface defined
+PASS Partial interface MLGraphBuilder[4]: member names are unique
+PASS Partial interface MLGraphBuilder[5]: original interface defined
+PASS Partial interface MLGraphBuilder[5]: member names are unique
+PASS Partial interface MLGraphBuilder[6]: original interface defined
+PASS Partial interface MLGraphBuilder[6]: member names are unique
+PASS Partial interface MLGraphBuilder[7]: original interface defined
+PASS Partial interface MLGraphBuilder[7]: member names are unique
+PASS Partial interface MLGraphBuilder[8]: original interface defined
+PASS Partial interface MLGraphBuilder[8]: member names are unique
+PASS Partial interface MLGraphBuilder[9]: original interface defined
+PASS Partial interface MLGraphBuilder[9]: member names are unique
+PASS Partial interface MLGraphBuilder[10]: original interface defined
+PASS Partial interface MLGraphBuilder[10]: member names are unique
+PASS Partial interface MLGraphBuilder[11]: original interface defined
+PASS Partial interface MLGraphBuilder[11]: member names are unique
+PASS Partial interface MLGraphBuilder[12]: original interface defined
+PASS Partial interface MLGraphBuilder[12]: member names are unique
+PASS Partial interface MLGraphBuilder[13]: original interface defined
+PASS Partial interface MLGraphBuilder[13]: member names are unique
+PASS Partial interface MLGraphBuilder[14]: original interface defined
+PASS Partial interface MLGraphBuilder[14]: member names are unique
+PASS Partial interface MLGraphBuilder[15]: original interface defined
+PASS Partial interface MLGraphBuilder[15]: member names are unique
+PASS Partial interface MLGraphBuilder[16]: original interface defined
+PASS Partial interface MLGraphBuilder[16]: member names are unique
+PASS Partial interface MLGraphBuilder[17]: original interface defined
+PASS Partial interface MLGraphBuilder[17]: member names are unique
+PASS Partial interface MLGraphBuilder[18]: original interface defined
+PASS Partial interface MLGraphBuilder[18]: member names are unique
+PASS Partial interface MLGraphBuilder[19]: original interface defined
+PASS Partial interface MLGraphBuilder[19]: member names are unique
+PASS Partial interface MLGraphBuilder[20]: original interface defined
+PASS Partial interface MLGraphBuilder[20]: member names are unique
+PASS Partial interface MLGraphBuilder[21]: original interface defined
+PASS Partial interface MLGraphBuilder[21]: member names are unique
+PASS Partial interface MLGraphBuilder[22]: original interface defined
+PASS Partial interface MLGraphBuilder[22]: member names are unique
+PASS Partial interface MLGraphBuilder[23]: original interface defined
+PASS Partial interface MLGraphBuilder[23]: member names are unique
+PASS Partial interface MLGraphBuilder[24]: original interface defined
+PASS Partial interface MLGraphBuilder[24]: member names are unique
+PASS Partial interface MLGraphBuilder[25]: original interface defined
+PASS Partial interface MLGraphBuilder[25]: member names are unique
+PASS Partial interface MLGraphBuilder[26]: original interface defined
+PASS Partial interface MLGraphBuilder[26]: member names are unique
+PASS Partial interface MLGraphBuilder[27]: original interface defined
+PASS Partial interface MLGraphBuilder[27]: member names are unique
+PASS Partial interface MLGraphBuilder[28]: original interface defined
+PASS Partial interface MLGraphBuilder[28]: member names are unique
+PASS Partial interface MLGraphBuilder[29]: original interface defined
+PASS Partial interface MLGraphBuilder[29]: member names are unique
+PASS Partial interface MLGraphBuilder[30]: original interface defined
+PASS Partial interface MLGraphBuilder[30]: member names are unique
+PASS Partial interface MLGraphBuilder[31]: original interface defined
+PASS Partial interface MLGraphBuilder[31]: member names are unique
+PASS Partial interface MLGraphBuilder[32]: original interface defined
+PASS Partial interface MLGraphBuilder[32]: member names are unique
+PASS Partial interface mixin NavigatorID: member names are unique
+PASS Navigator includes NavigatorML: member names are unique
+PASS WorkerNavigator includes NavigatorML: member names are unique
+PASS Navigator includes NavigatorID: member names are unique
+PASS Navigator includes NavigatorLanguage: member names are unique
+PASS Navigator includes NavigatorOnLine: member names are unique
+PASS Navigator includes NavigatorContentUtils: member names are unique
+PASS Navigator includes NavigatorCookies: member names are unique
+PASS Navigator includes NavigatorPlugins: member names are unique
+PASS Navigator includes NavigatorConcurrentHardware: member names are unique
+PASS WorkerNavigator includes NavigatorID: member names are unique
+PASS WorkerNavigator includes NavigatorLanguage: member names are unique
+PASS WorkerNavigator includes NavigatorOnLine: member names are unique
+PASS WorkerNavigator includes NavigatorConcurrentHardware: member names are unique
+PASS Navigator includes NavigatorGPU: member names are unique
+PASS WorkerNavigator includes NavigatorGPU: member names are unique
+PASS GPUTexture includes GPUObjectBase: member names are unique
+FAIL NavigatorML must be primary interface of navigator assert_own_property: self does not have own property "NavigatorML" expected property "NavigatorML" missing
+FAIL Stringification of navigator assert_class_string: class string of navigator expected "[object NavigatorML]" but got "[object Navigator]"
+PASS NavigatorML interface: navigator must inherit property "ml" with the proper type
+PASS ML interface: existence and properties of interface object
+PASS ML interface object length
+PASS ML interface object name
+PASS ML interface: existence and properties of interface prototype object
+PASS ML interface: existence and properties of interface prototype object's "constructor" property
+PASS ML interface: existence and properties of interface prototype object's @@unscopables property
+FAIL ML interface: operation createContext(optional MLContextOptions) assert_throws_js: calling operation with this = null didn't throw TypeError function "function() {
+            fn.apply(obj, args);
+        }" did not throw
+FAIL ML interface: operation createContext(WebGLRenderingContext) assert_throws_js: calling operation with this = null didn't throw TypeError function "function() {
+            fn.apply(obj, args);
+        }" did not throw
+FAIL ML interface: operation createContext(GPUDevice) assert_throws_js: calling operation with this = null didn't throw TypeError function "function() {
+            fn.apply(obj, args);
+        }" did not throw
+PASS ML must be primary interface of navigator.ml
+PASS Stringification of navigator.ml
+PASS ML interface: navigator.ml must inherit property "createContext(optional MLContextOptions)" with the proper type
+PASS ML interface: calling createContext(optional MLContextOptions) on navigator.ml with too few arguments must throw TypeError
+PASS ML interface: navigator.ml must inherit property "createContext(WebGLRenderingContext)" with the proper type
+PASS ML interface: calling createContext(WebGLRenderingContext) on navigator.ml with too few arguments must throw TypeError
+PASS ML interface: navigator.ml must inherit property "createContext(GPUDevice)" with the proper type
+PASS ML interface: calling createContext(GPUDevice) on navigator.ml with too few arguments must throw TypeError
+PASS MLContext interface: existence and properties of interface object
+PASS MLContext interface object length
+PASS MLContext interface object name
+PASS MLContext interface: existence and properties of interface prototype object
+PASS MLContext interface: existence and properties of interface prototype object's "constructor" property
+PASS MLContext interface: existence and properties of interface prototype object's @@unscopables property
+FAIL MLContext must be primary interface of context assert_equals: context's prototype is not MLContext.prototype expected object "[object MLContext]" but got object "[object Promise]"
+FAIL Stringification of context assert_class_string: class string of context expected "[object MLContext]" but got "[object Promise]"
+FAIL MLOperand interface: existence and properties of interface object assert_own_property: self does not have own property "MLOperand" expected property "MLOperand" missing
+FAIL MLOperand interface object length assert_own_property: self does not have own property "MLOperand" expected property "MLOperand" missing
+FAIL MLOperand interface object name assert_own_property: self does not have own property "MLOperand" expected property "MLOperand" missing
+FAIL MLOperand interface: existence and properties of interface prototype object assert_own_property: self does not have own property "MLOperand" expected property "MLOperand" missing
+FAIL MLOperand interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "MLOperand" expected property "MLOperand" missing
+FAIL MLOperand interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "MLOperand" expected property "MLOperand" missing
+FAIL MLOperand must be primary interface of input assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: input is not defined"
+FAIL Stringification of input assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: input is not defined"
+FAIL MLOperand must be primary interface of filter assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: filter is not defined"
+FAIL Stringification of filter assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: filter is not defined"
+FAIL MLOperator interface: existence and properties of interface object assert_own_property: self does not have own property "MLOperator" expected property "MLOperator" missing
+FAIL MLOperator interface object length assert_own_property: self does not have own property "MLOperator" expected property "MLOperator" missing
+FAIL MLOperator interface object name assert_own_property: self does not have own property "MLOperator" expected property "MLOperator" missing
+FAIL MLOperator interface: existence and properties of interface prototype object assert_own_property: self does not have own property "MLOperator" expected property "MLOperator" missing
+FAIL MLOperator interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "MLOperator" expected property "MLOperator" missing
+FAIL MLOperator interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "MLOperator" expected property "MLOperator" missing
+FAIL MLOperator must be primary interface of relu assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: relu is not defined"
+FAIL Stringification of relu assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: relu is not defined"
+FAIL MLGraphBuilder interface: existence and properties of interface object assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface object length assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface object name assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: existence and properties of interface prototype object assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation input(DOMString, MLOperandDescriptor) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation constant(MLOperandDescriptor, MLBufferView) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation constant(double, optional MLOperandType) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation build(MLNamedOperands) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation batchNormalization(MLOperand, MLOperand, MLOperand, optional MLBatchNormalizationOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation clamp(MLOperand, optional MLClampOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation clamp(optional MLClampOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation concat(sequence<MLOperand>, long) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation conv2d(MLOperand, MLOperand, optional MLConv2dOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation convTranspose2d(MLOperand, MLOperand, optional MLConvTranspose2dOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation add(MLOperand, MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation sub(MLOperand, MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation mul(MLOperand, MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation div(MLOperand, MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation max(MLOperand, MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation min(MLOperand, MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation pow(MLOperand, MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation abs(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation ceil(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation cos(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation exp(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation floor(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation log(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation neg(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation sin(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation tan(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation elu(MLOperand, optional MLEluOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation elu(optional MLEluOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation gemm(MLOperand, MLOperand, optional MLGemmOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation gru(MLOperand, MLOperand, MLOperand, long, long, optional MLGruOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation gruCell(MLOperand, MLOperand, MLOperand, MLOperand, long, optional MLGruCellOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation hardSigmoid(MLOperand, optional MLHardSigmoidOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation hardSigmoid(optional MLHardSigmoidOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation hardSwish(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation hardSwish() assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation instanceNormalization(MLOperand, optional MLInstanceNormalizationOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation leakyRelu(MLOperand, optional MLLeakyReluOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation leakyRelu(optional MLLeakyReluOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation matmul(MLOperand, MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation linear(MLOperand, optional MLLinearOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation linear(optional MLLinearOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation pad(MLOperand, MLOperand, optional MLPadOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation averagePool2d(MLOperand, optional MLPool2dOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation l2Pool2d(MLOperand, optional MLPool2dOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation maxPool2d(MLOperand, optional MLPool2dOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reduceL1(MLOperand, optional MLReduceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reduceL2(MLOperand, optional MLReduceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reduceLogSum(MLOperand, optional MLReduceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reduceLogSumExp(MLOperand, optional MLReduceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reduceMax(MLOperand, optional MLReduceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reduceMean(MLOperand, optional MLReduceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reduceMin(MLOperand, optional MLReduceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reduceProduct(MLOperand, optional MLReduceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reduceSum(MLOperand, optional MLReduceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reduceSumSquare(MLOperand, optional MLReduceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation relu(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation relu() assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation resample2d(MLOperand, optional MLResample2dOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reshape(MLOperand, sequence<long>) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation sigmoid(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation sigmoid() assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation slice(MLOperand, sequence<long>, sequence<long>, optional MLSliceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation softmax(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation softplus(MLOperand, optional MLSoftplusOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation softplus(optional MLSoftplusOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation softsign(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation softsign() assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation split(MLOperand, (unsigned long or sequence<unsigned long>), optional MLSplitOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation squeeze(MLOperand, optional MLSqueezeOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation tanh(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation tanh() assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation transpose(MLOperand, optional MLTransposeOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder must be primary interface of builder assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL Stringification of builder assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "input(DOMString, MLOperandDescriptor)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling input(DOMString, MLOperandDescriptor) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "constant(MLOperandDescriptor, MLBufferView)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling constant(MLOperandDescriptor, MLBufferView) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "constant(double, optional MLOperandType)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling constant(double, optional MLOperandType) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "build(MLNamedOperands)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling build(MLNamedOperands) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "batchNormalization(MLOperand, MLOperand, MLOperand, optional MLBatchNormalizationOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling batchNormalization(MLOperand, MLOperand, MLOperand, optional MLBatchNormalizationOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "clamp(MLOperand, optional MLClampOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling clamp(MLOperand, optional MLClampOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "clamp(optional MLClampOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling clamp(optional MLClampOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "concat(sequence<MLOperand>, long)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling concat(sequence<MLOperand>, long) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "conv2d(MLOperand, MLOperand, optional MLConv2dOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling conv2d(MLOperand, MLOperand, optional MLConv2dOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "convTranspose2d(MLOperand, MLOperand, optional MLConvTranspose2dOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling convTranspose2d(MLOperand, MLOperand, optional MLConvTranspose2dOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "add(MLOperand, MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling add(MLOperand, MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "sub(MLOperand, MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling sub(MLOperand, MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "mul(MLOperand, MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling mul(MLOperand, MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "div(MLOperand, MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling div(MLOperand, MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "max(MLOperand, MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling max(MLOperand, MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "min(MLOperand, MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling min(MLOperand, MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "pow(MLOperand, MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling pow(MLOperand, MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "abs(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling abs(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "ceil(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling ceil(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "cos(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling cos(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "exp(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling exp(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "floor(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling floor(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "log(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling log(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "neg(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling neg(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "sin(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling sin(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "tan(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling tan(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "elu(MLOperand, optional MLEluOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling elu(MLOperand, optional MLEluOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "elu(optional MLEluOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling elu(optional MLEluOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "gemm(MLOperand, MLOperand, optional MLGemmOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling gemm(MLOperand, MLOperand, optional MLGemmOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "gru(MLOperand, MLOperand, MLOperand, long, long, optional MLGruOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling gru(MLOperand, MLOperand, MLOperand, long, long, optional MLGruOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "gruCell(MLOperand, MLOperand, MLOperand, MLOperand, long, optional MLGruCellOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling gruCell(MLOperand, MLOperand, MLOperand, MLOperand, long, optional MLGruCellOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "hardSigmoid(MLOperand, optional MLHardSigmoidOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling hardSigmoid(MLOperand, optional MLHardSigmoidOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "hardSigmoid(optional MLHardSigmoidOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling hardSigmoid(optional MLHardSigmoidOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "hardSwish(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling hardSwish(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "hardSwish()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "instanceNormalization(MLOperand, optional MLInstanceNormalizationOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling instanceNormalization(MLOperand, optional MLInstanceNormalizationOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "leakyRelu(MLOperand, optional MLLeakyReluOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling leakyRelu(MLOperand, optional MLLeakyReluOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "leakyRelu(optional MLLeakyReluOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling leakyRelu(optional MLLeakyReluOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "matmul(MLOperand, MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling matmul(MLOperand, MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "linear(MLOperand, optional MLLinearOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling linear(MLOperand, optional MLLinearOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "linear(optional MLLinearOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling linear(optional MLLinearOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "pad(MLOperand, MLOperand, optional MLPadOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling pad(MLOperand, MLOperand, optional MLPadOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "averagePool2d(MLOperand, optional MLPool2dOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling averagePool2d(MLOperand, optional MLPool2dOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "l2Pool2d(MLOperand, optional MLPool2dOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling l2Pool2d(MLOperand, optional MLPool2dOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "maxPool2d(MLOperand, optional MLPool2dOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling maxPool2d(MLOperand, optional MLPool2dOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reduceL1(MLOperand, optional MLReduceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reduceL1(MLOperand, optional MLReduceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reduceL2(MLOperand, optional MLReduceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reduceL2(MLOperand, optional MLReduceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reduceLogSum(MLOperand, optional MLReduceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reduceLogSum(MLOperand, optional MLReduceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reduceLogSumExp(MLOperand, optional MLReduceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reduceLogSumExp(MLOperand, optional MLReduceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reduceMax(MLOperand, optional MLReduceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reduceMax(MLOperand, optional MLReduceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reduceMean(MLOperand, optional MLReduceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reduceMean(MLOperand, optional MLReduceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reduceMin(MLOperand, optional MLReduceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reduceMin(MLOperand, optional MLReduceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reduceProduct(MLOperand, optional MLReduceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reduceProduct(MLOperand, optional MLReduceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reduceSum(MLOperand, optional MLReduceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reduceSum(MLOperand, optional MLReduceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reduceSumSquare(MLOperand, optional MLReduceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reduceSumSquare(MLOperand, optional MLReduceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "relu(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling relu(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "relu()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "resample2d(MLOperand, optional MLResample2dOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling resample2d(MLOperand, optional MLResample2dOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reshape(MLOperand, sequence<long>)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reshape(MLOperand, sequence<long>) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "sigmoid(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling sigmoid(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "sigmoid()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "slice(MLOperand, sequence<long>, sequence<long>, optional MLSliceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling slice(MLOperand, sequence<long>, sequence<long>, optional MLSliceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "softmax(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling softmax(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "softplus(MLOperand, optional MLSoftplusOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling softplus(MLOperand, optional MLSoftplusOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "softplus(optional MLSoftplusOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling softplus(optional MLSoftplusOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "softsign(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling softsign(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "softsign()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "split(MLOperand, (unsigned long or sequence<unsigned long>), optional MLSplitOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling split(MLOperand, (unsigned long or sequence<unsigned long>), optional MLSplitOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "squeeze(MLOperand, optional MLSqueezeOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling squeeze(MLOperand, optional MLSqueezeOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "tanh(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling tanh(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "tanh()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "transpose(MLOperand, optional MLTransposeOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling transpose(MLOperand, optional MLTransposeOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraph interface: existence and properties of interface object assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
+FAIL MLGraph interface object length assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
+FAIL MLGraph interface object name assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
+FAIL MLGraph interface: existence and properties of interface prototype object assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
+FAIL MLGraph interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
+FAIL MLGraph interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
+FAIL MLGraph interface: operation compute(MLNamedInputs, MLNamedOutputs) assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
+FAIL MLGraph must be primary interface of graph assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
+FAIL Stringification of graph assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
+FAIL MLGraph interface: graph must inherit property "compute(MLNamedInputs, MLNamedOutputs)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
+FAIL MLGraph interface: calling compute(MLNamedInputs, MLNamedOutputs) on graph with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
+PASS Navigator interface: attribute ml
+PASS Navigator interface: navigator must inherit property "ml" with the proper type
+Harness: the test ran to completion.
+
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/webnn/idlharness.https.any.worker-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/webnn/idlharness.https.any.worker-expected.txt
new file mode 100644
index 0000000..46d99e7
--- /dev/null
+++ b/third_party/blink/web_tests/platform/mac-mac10.14/external/wpt/webnn/idlharness.https.any.worker-expected.txt
@@ -0,0 +1,365 @@
+This is a testharness.js-based test.
+Found 361 tests; 83 PASS, 278 FAIL, 0 TIMEOUT, 0 NOTRUN.
+FAIL idl_test setup promise_test: Unhandled rejection with value: object "TypeError: Cannot read properties of undefined (reading 'createContext')"
+PASS idl_test validation
+PASS Partial interface MLGraphBuilder: original interface defined
+PASS Partial interface MLGraphBuilder: member names are unique
+PASS Partial interface MLGraphBuilder[2]: original interface defined
+PASS Partial interface MLGraphBuilder[2]: member names are unique
+PASS Partial interface MLGraphBuilder[3]: original interface defined
+PASS Partial interface MLGraphBuilder[3]: member names are unique
+PASS Partial interface MLGraphBuilder[4]: original interface defined
+PASS Partial interface MLGraphBuilder[4]: member names are unique
+PASS Partial interface MLGraphBuilder[5]: original interface defined
+PASS Partial interface MLGraphBuilder[5]: member names are unique
+PASS Partial interface MLGraphBuilder[6]: original interface defined
+PASS Partial interface MLGraphBuilder[6]: member names are unique
+PASS Partial interface MLGraphBuilder[7]: original interface defined
+PASS Partial interface MLGraphBuilder[7]: member names are unique
+PASS Partial interface MLGraphBuilder[8]: original interface defined
+PASS Partial interface MLGraphBuilder[8]: member names are unique
+PASS Partial interface MLGraphBuilder[9]: original interface defined
+PASS Partial interface MLGraphBuilder[9]: member names are unique
+PASS Partial interface MLGraphBuilder[10]: original interface defined
+PASS Partial interface MLGraphBuilder[10]: member names are unique
+PASS Partial interface MLGraphBuilder[11]: original interface defined
+PASS Partial interface MLGraphBuilder[11]: member names are unique
+PASS Partial interface MLGraphBuilder[12]: original interface defined
+PASS Partial interface MLGraphBuilder[12]: member names are unique
+PASS Partial interface MLGraphBuilder[13]: original interface defined
+PASS Partial interface MLGraphBuilder[13]: member names are unique
+PASS Partial interface MLGraphBuilder[14]: original interface defined
+PASS Partial interface MLGraphBuilder[14]: member names are unique
+PASS Partial interface MLGraphBuilder[15]: original interface defined
+PASS Partial interface MLGraphBuilder[15]: member names are unique
+PASS Partial interface MLGraphBuilder[16]: original interface defined
+PASS Partial interface MLGraphBuilder[16]: member names are unique
+PASS Partial interface MLGraphBuilder[17]: original interface defined
+PASS Partial interface MLGraphBuilder[17]: member names are unique
+PASS Partial interface MLGraphBuilder[18]: original interface defined
+PASS Partial interface MLGraphBuilder[18]: member names are unique
+PASS Partial interface MLGraphBuilder[19]: original interface defined
+PASS Partial interface MLGraphBuilder[19]: member names are unique
+PASS Partial interface MLGraphBuilder[20]: original interface defined
+PASS Partial interface MLGraphBuilder[20]: member names are unique
+PASS Partial interface MLGraphBuilder[21]: original interface defined
+PASS Partial interface MLGraphBuilder[21]: member names are unique
+PASS Partial interface MLGraphBuilder[22]: original interface defined
+PASS Partial interface MLGraphBuilder[22]: member names are unique
+PASS Partial interface MLGraphBuilder[23]: original interface defined
+PASS Partial interface MLGraphBuilder[23]: member names are unique
+PASS Partial interface MLGraphBuilder[24]: original interface defined
+PASS Partial interface MLGraphBuilder[24]: member names are unique
+PASS Partial interface MLGraphBuilder[25]: original interface defined
+PASS Partial interface MLGraphBuilder[25]: member names are unique
+PASS Partial interface MLGraphBuilder[26]: original interface defined
+PASS Partial interface MLGraphBuilder[26]: member names are unique
+PASS Partial interface MLGraphBuilder[27]: original interface defined
+PASS Partial interface MLGraphBuilder[27]: member names are unique
+PASS Partial interface MLGraphBuilder[28]: original interface defined
+PASS Partial interface MLGraphBuilder[28]: member names are unique
+PASS Partial interface MLGraphBuilder[29]: original interface defined
+PASS Partial interface MLGraphBuilder[29]: member names are unique
+PASS Partial interface MLGraphBuilder[30]: original interface defined
+PASS Partial interface MLGraphBuilder[30]: member names are unique
+PASS Partial interface MLGraphBuilder[31]: original interface defined
+PASS Partial interface MLGraphBuilder[31]: member names are unique
+PASS Partial interface MLGraphBuilder[32]: original interface defined
+PASS Partial interface MLGraphBuilder[32]: member names are unique
+PASS Partial interface mixin NavigatorID: member names are unique
+PASS Navigator includes NavigatorML: member names are unique
+PASS WorkerNavigator includes NavigatorML: member names are unique
+PASS Navigator includes NavigatorID: member names are unique
+PASS Navigator includes NavigatorLanguage: member names are unique
+PASS Navigator includes NavigatorOnLine: member names are unique
+PASS Navigator includes NavigatorContentUtils: member names are unique
+PASS Navigator includes NavigatorCookies: member names are unique
+PASS Navigator includes NavigatorPlugins: member names are unique
+PASS Navigator includes NavigatorConcurrentHardware: member names are unique
+PASS WorkerNavigator includes NavigatorID: member names are unique
+PASS WorkerNavigator includes NavigatorLanguage: member names are unique
+PASS WorkerNavigator includes NavigatorOnLine: member names are unique
+PASS WorkerNavigator includes NavigatorConcurrentHardware: member names are unique
+PASS Navigator includes NavigatorGPU: member names are unique
+PASS WorkerNavigator includes NavigatorGPU: member names are unique
+PASS GPUTexture includes GPUObjectBase: member names are unique
+FAIL NavigatorML must be primary interface of navigator assert_own_property: self does not have own property "NavigatorML" expected property "NavigatorML" missing
+FAIL Stringification of navigator assert_class_string: class string of navigator expected "[object NavigatorML]" but got "[object WorkerNavigator]"
+PASS NavigatorML interface: navigator must not have property "ml"
+FAIL ML interface: existence and properties of interface object assert_own_property: self does not have own property "ML" expected property "ML" missing
+FAIL ML interface object length assert_own_property: self does not have own property "ML" expected property "ML" missing
+FAIL ML interface object name assert_own_property: self does not have own property "ML" expected property "ML" missing
+FAIL ML interface: existence and properties of interface prototype object assert_own_property: self does not have own property "ML" expected property "ML" missing
+FAIL ML interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "ML" expected property "ML" missing
+FAIL ML interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "ML" expected property "ML" missing
+FAIL ML interface: operation createContext(optional MLContextOptions) assert_own_property: self does not have own property "ML" expected property "ML" missing
+FAIL ML interface: operation createContext(WebGLRenderingContext) assert_own_property: self does not have own property "ML" expected property "ML" missing
+FAIL ML interface: operation createContext(GPUDevice) assert_own_property: self does not have own property "ML" expected property "ML" missing
+FAIL ML must be primary interface of navigator.ml assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL Stringification of navigator.ml assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL ML interface: navigator.ml must inherit property "createContext(optional MLContextOptions)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL ML interface: calling createContext(optional MLContextOptions) on navigator.ml with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL ML interface: navigator.ml must inherit property "createContext(WebGLRenderingContext)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL ML interface: calling createContext(WebGLRenderingContext) on navigator.ml with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL ML interface: navigator.ml must inherit property "createContext(GPUDevice)" with the proper type assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL ML interface: calling createContext(GPUDevice) on navigator.ml with too few arguments must throw TypeError assert_equals: wrong typeof object expected "object" but got "undefined"
+FAIL MLContext interface: existence and properties of interface object assert_own_property: self does not have own property "MLContext" expected property "MLContext" missing
+FAIL MLContext interface object length assert_own_property: self does not have own property "MLContext" expected property "MLContext" missing
+FAIL MLContext interface object name assert_own_property: self does not have own property "MLContext" expected property "MLContext" missing
+FAIL MLContext interface: existence and properties of interface prototype object assert_own_property: self does not have own property "MLContext" expected property "MLContext" missing
+FAIL MLContext interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "MLContext" expected property "MLContext" missing
+FAIL MLContext interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "MLContext" expected property "MLContext" missing
+FAIL MLContext must be primary interface of context assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: context is not defined"
+FAIL Stringification of context assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: context is not defined"
+FAIL MLOperand interface: existence and properties of interface object assert_own_property: self does not have own property "MLOperand" expected property "MLOperand" missing
+FAIL MLOperand interface object length assert_own_property: self does not have own property "MLOperand" expected property "MLOperand" missing
+FAIL MLOperand interface object name assert_own_property: self does not have own property "MLOperand" expected property "MLOperand" missing
+FAIL MLOperand interface: existence and properties of interface prototype object assert_own_property: self does not have own property "MLOperand" expected property "MLOperand" missing
+FAIL MLOperand interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "MLOperand" expected property "MLOperand" missing
+FAIL MLOperand interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "MLOperand" expected property "MLOperand" missing
+FAIL MLOperand must be primary interface of input assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: input is not defined"
+FAIL Stringification of input assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: input is not defined"
+FAIL MLOperand must be primary interface of filter assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: filter is not defined"
+FAIL Stringification of filter assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: filter is not defined"
+FAIL MLOperator interface: existence and properties of interface object assert_own_property: self does not have own property "MLOperator" expected property "MLOperator" missing
+FAIL MLOperator interface object length assert_own_property: self does not have own property "MLOperator" expected property "MLOperator" missing
+FAIL MLOperator interface object name assert_own_property: self does not have own property "MLOperator" expected property "MLOperator" missing
+FAIL MLOperator interface: existence and properties of interface prototype object assert_own_property: self does not have own property "MLOperator" expected property "MLOperator" missing
+FAIL MLOperator interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "MLOperator" expected property "MLOperator" missing
+FAIL MLOperator interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "MLOperator" expected property "MLOperator" missing
+FAIL MLOperator must be primary interface of relu assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: relu is not defined"
+FAIL Stringification of relu assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: relu is not defined"
+FAIL MLGraphBuilder interface: existence and properties of interface object assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface object length assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface object name assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: existence and properties of interface prototype object assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation input(DOMString, MLOperandDescriptor) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation constant(MLOperandDescriptor, MLBufferView) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation constant(double, optional MLOperandType) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation build(MLNamedOperands) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation batchNormalization(MLOperand, MLOperand, MLOperand, optional MLBatchNormalizationOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation clamp(MLOperand, optional MLClampOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation clamp(optional MLClampOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation concat(sequence<MLOperand>, long) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation conv2d(MLOperand, MLOperand, optional MLConv2dOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation convTranspose2d(MLOperand, MLOperand, optional MLConvTranspose2dOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation add(MLOperand, MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation sub(MLOperand, MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation mul(MLOperand, MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation div(MLOperand, MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation max(MLOperand, MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation min(MLOperand, MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation pow(MLOperand, MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation abs(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation ceil(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation cos(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation exp(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation floor(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation log(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation neg(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation sin(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation tan(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation elu(MLOperand, optional MLEluOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation elu(optional MLEluOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation gemm(MLOperand, MLOperand, optional MLGemmOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation gru(MLOperand, MLOperand, MLOperand, long, long, optional MLGruOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation gruCell(MLOperand, MLOperand, MLOperand, MLOperand, long, optional MLGruCellOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation hardSigmoid(MLOperand, optional MLHardSigmoidOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation hardSigmoid(optional MLHardSigmoidOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation hardSwish(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation hardSwish() assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation instanceNormalization(MLOperand, optional MLInstanceNormalizationOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation leakyRelu(MLOperand, optional MLLeakyReluOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation leakyRelu(optional MLLeakyReluOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation matmul(MLOperand, MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation linear(MLOperand, optional MLLinearOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation linear(optional MLLinearOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation pad(MLOperand, MLOperand, optional MLPadOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation averagePool2d(MLOperand, optional MLPool2dOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation l2Pool2d(MLOperand, optional MLPool2dOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation maxPool2d(MLOperand, optional MLPool2dOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reduceL1(MLOperand, optional MLReduceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reduceL2(MLOperand, optional MLReduceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reduceLogSum(MLOperand, optional MLReduceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reduceLogSumExp(MLOperand, optional MLReduceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reduceMax(MLOperand, optional MLReduceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reduceMean(MLOperand, optional MLReduceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reduceMin(MLOperand, optional MLReduceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reduceProduct(MLOperand, optional MLReduceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reduceSum(MLOperand, optional MLReduceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reduceSumSquare(MLOperand, optional MLReduceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation relu(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation relu() assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation resample2d(MLOperand, optional MLResample2dOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation reshape(MLOperand, sequence<long>) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation sigmoid(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation sigmoid() assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation slice(MLOperand, sequence<long>, sequence<long>, optional MLSliceOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation softmax(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation softplus(MLOperand, optional MLSoftplusOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation softplus(optional MLSoftplusOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation softsign(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation softsign() assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation split(MLOperand, (unsigned long or sequence<unsigned long>), optional MLSplitOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation squeeze(MLOperand, optional MLSqueezeOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation tanh(MLOperand) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation tanh() assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder interface: operation transpose(MLOperand, optional MLTransposeOptions) assert_own_property: self does not have own property "MLGraphBuilder" expected property "MLGraphBuilder" missing
+FAIL MLGraphBuilder must be primary interface of builder assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL Stringification of builder assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "input(DOMString, MLOperandDescriptor)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling input(DOMString, MLOperandDescriptor) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "constant(MLOperandDescriptor, MLBufferView)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling constant(MLOperandDescriptor, MLBufferView) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "constant(double, optional MLOperandType)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling constant(double, optional MLOperandType) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "build(MLNamedOperands)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling build(MLNamedOperands) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "batchNormalization(MLOperand, MLOperand, MLOperand, optional MLBatchNormalizationOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling batchNormalization(MLOperand, MLOperand, MLOperand, optional MLBatchNormalizationOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "clamp(MLOperand, optional MLClampOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling clamp(MLOperand, optional MLClampOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "clamp(optional MLClampOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling clamp(optional MLClampOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "concat(sequence<MLOperand>, long)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling concat(sequence<MLOperand>, long) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "conv2d(MLOperand, MLOperand, optional MLConv2dOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling conv2d(MLOperand, MLOperand, optional MLConv2dOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "convTranspose2d(MLOperand, MLOperand, optional MLConvTranspose2dOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling convTranspose2d(MLOperand, MLOperand, optional MLConvTranspose2dOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "add(MLOperand, MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling add(MLOperand, MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "sub(MLOperand, MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling sub(MLOperand, MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "mul(MLOperand, MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling mul(MLOperand, MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "div(MLOperand, MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling div(MLOperand, MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "max(MLOperand, MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling max(MLOperand, MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "min(MLOperand, MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling min(MLOperand, MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "pow(MLOperand, MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling pow(MLOperand, MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "abs(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling abs(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "ceil(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling ceil(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "cos(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling cos(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "exp(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling exp(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "floor(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling floor(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "log(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling log(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "neg(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling neg(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "sin(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling sin(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "tan(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling tan(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "elu(MLOperand, optional MLEluOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling elu(MLOperand, optional MLEluOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "elu(optional MLEluOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling elu(optional MLEluOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "gemm(MLOperand, MLOperand, optional MLGemmOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling gemm(MLOperand, MLOperand, optional MLGemmOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "gru(MLOperand, MLOperand, MLOperand, long, long, optional MLGruOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling gru(MLOperand, MLOperand, MLOperand, long, long, optional MLGruOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "gruCell(MLOperand, MLOperand, MLOperand, MLOperand, long, optional MLGruCellOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling gruCell(MLOperand, MLOperand, MLOperand, MLOperand, long, optional MLGruCellOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "hardSigmoid(MLOperand, optional MLHardSigmoidOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling hardSigmoid(MLOperand, optional MLHardSigmoidOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "hardSigmoid(optional MLHardSigmoidOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling hardSigmoid(optional MLHardSigmoidOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "hardSwish(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling hardSwish(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "hardSwish()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "instanceNormalization(MLOperand, optional MLInstanceNormalizationOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling instanceNormalization(MLOperand, optional MLInstanceNormalizationOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "leakyRelu(MLOperand, optional MLLeakyReluOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling leakyRelu(MLOperand, optional MLLeakyReluOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "leakyRelu(optional MLLeakyReluOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling leakyRelu(optional MLLeakyReluOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "matmul(MLOperand, MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling matmul(MLOperand, MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "linear(MLOperand, optional MLLinearOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling linear(MLOperand, optional MLLinearOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "linear(optional MLLinearOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling linear(optional MLLinearOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "pad(MLOperand, MLOperand, optional MLPadOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling pad(MLOperand, MLOperand, optional MLPadOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "averagePool2d(MLOperand, optional MLPool2dOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling averagePool2d(MLOperand, optional MLPool2dOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "l2Pool2d(MLOperand, optional MLPool2dOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling l2Pool2d(MLOperand, optional MLPool2dOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "maxPool2d(MLOperand, optional MLPool2dOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling maxPool2d(MLOperand, optional MLPool2dOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reduceL1(MLOperand, optional MLReduceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reduceL1(MLOperand, optional MLReduceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reduceL2(MLOperand, optional MLReduceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reduceL2(MLOperand, optional MLReduceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reduceLogSum(MLOperand, optional MLReduceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reduceLogSum(MLOperand, optional MLReduceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reduceLogSumExp(MLOperand, optional MLReduceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reduceLogSumExp(MLOperand, optional MLReduceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reduceMax(MLOperand, optional MLReduceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reduceMax(MLOperand, optional MLReduceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reduceMean(MLOperand, optional MLReduceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reduceMean(MLOperand, optional MLReduceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reduceMin(MLOperand, optional MLReduceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reduceMin(MLOperand, optional MLReduceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reduceProduct(MLOperand, optional MLReduceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reduceProduct(MLOperand, optional MLReduceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reduceSum(MLOperand, optional MLReduceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reduceSum(MLOperand, optional MLReduceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reduceSumSquare(MLOperand, optional MLReduceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reduceSumSquare(MLOperand, optional MLReduceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "relu(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling relu(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "relu()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "resample2d(MLOperand, optional MLResample2dOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling resample2d(MLOperand, optional MLResample2dOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "reshape(MLOperand, sequence<long>)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling reshape(MLOperand, sequence<long>) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "sigmoid(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling sigmoid(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "sigmoid()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "slice(MLOperand, sequence<long>, sequence<long>, optional MLSliceOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling slice(MLOperand, sequence<long>, sequence<long>, optional MLSliceOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "softmax(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling softmax(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "softplus(MLOperand, optional MLSoftplusOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling softplus(MLOperand, optional MLSoftplusOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "softplus(optional MLSoftplusOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling softplus(optional MLSoftplusOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "softsign(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling softsign(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "softsign()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "split(MLOperand, (unsigned long or sequence<unsigned long>), optional MLSplitOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling split(MLOperand, (unsigned long or sequence<unsigned long>), optional MLSplitOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "squeeze(MLOperand, optional MLSqueezeOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling squeeze(MLOperand, optional MLSqueezeOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "tanh(MLOperand)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling tanh(MLOperand) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "tanh()" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: builder must inherit property "transpose(MLOperand, optional MLTransposeOptions)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraphBuilder interface: calling transpose(MLOperand, optional MLTransposeOptions) on builder with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: builder is not defined"
+FAIL MLGraph interface: existence and properties of interface object assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
+FAIL MLGraph interface object length assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
+FAIL MLGraph interface object name assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
+FAIL MLGraph interface: existence and properties of interface prototype object assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
+FAIL MLGraph interface: existence and properties of interface prototype object's "constructor" property assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
+FAIL MLGraph interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
+FAIL MLGraph interface: operation compute(MLNamedInputs, MLNamedOutputs) assert_own_property: self does not have own property "MLGraph" expected property "MLGraph" missing
+FAIL MLGraph must be primary interface of graph assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
+FAIL Stringification of graph assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
+FAIL MLGraph interface: graph must inherit property "compute(MLNamedInputs, MLNamedOutputs)" with the proper type assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
+FAIL MLGraph interface: calling compute(MLNamedInputs, MLNamedOutputs) on graph with too few arguments must throw TypeError assert_equals: Unexpected exception when evaluating object expected null but got object "ReferenceError: graph is not defined"
+FAIL WorkerNavigator interface: attribute ml assert_true: The prototype object must have a property "ml" expected true got false
+FAIL WorkerNavigator interface: navigator must inherit property "ml" with the proper type assert_inherits: property "ml" not found in prototype chain
+Harness: the test ran to completion.
+
diff --git a/third_party/ipcz/src/BUILD.gn b/third_party/ipcz/src/BUILD.gn
index 050cb5e..f0d60e2d 100644
--- a/third_party/ipcz/src/BUILD.gn
+++ b/third_party/ipcz/src/BUILD.gn
@@ -212,6 +212,10 @@
     "ipcz/router_link.h",
     "ipcz/test_messages.cc",
     "ipcz/test_messages_generator.h",
+    "ipcz/trap_event_dispatcher.cc",
+    "ipcz/trap_event_dispatcher.h",
+    "ipcz/trap_set.cc",
+    "ipcz/trap_set.h",
   ]
   public_deps = [
     ":ipcz_header",
@@ -257,6 +261,7 @@
     "test/mock_driver.h",
     "test/test_base.cc",
     "test/test_base.h",
+    "trap_test.cc",
     "util/ref_counted_test.cc",
     "util/stack_trace_test.cc",
   ]
diff --git a/third_party/ipcz/src/api.cc b/third_party/ipcz/src/api.cc
index 77b6ad95..9b732e14 100644
--- a/third_party/ipcz/src/api.cc
+++ b/third_party/ipcz/src/api.cc
@@ -10,6 +10,7 @@
 #include "ipcz/ipcz.h"
 #include "ipcz/node.h"
 #include "ipcz/portal.h"
+#include "ipcz/router.h"
 #include "util/ref_counted.h"
 
 extern "C" {
@@ -183,7 +184,18 @@
                 const void* options,
                 IpczTrapConditionFlags* satisfied_condition_flags,
                 IpczPortalStatus* status) {
-  return IPCZ_RESULT_UNIMPLEMENTED;
+  ipcz::Portal* portal = ipcz::Portal::FromHandle(portal_handle);
+  if (!portal || !handler || !conditions ||
+      conditions->size < sizeof(*conditions)) {
+    return IPCZ_RESULT_INVALID_ARGUMENT;
+  }
+
+  if (status && status->size < sizeof(*status)) {
+    return IPCZ_RESULT_INVALID_ARGUMENT;
+  }
+
+  return portal->router()->Trap(*conditions, handler, context,
+                                satisfied_condition_flags, status);
 }
 
 IpczResult Box(IpczHandle node_handle,
diff --git a/third_party/ipcz/src/api_test.cc b/third_party/ipcz/src/api_test.cc
index 1e4deb53..e4b9a9e 100644
--- a/third_party/ipcz/src/api_test.cc
+++ b/third_party/ipcz/src/api_test.cc
@@ -38,9 +38,6 @@
             ipcz().EndGet(IPCZ_INVALID_HANDLE, 0, 0, IPCZ_NO_FLAGS, nullptr,
                           nullptr));
   EXPECT_EQ(IPCZ_RESULT_UNIMPLEMENTED,
-            ipcz().Trap(IPCZ_INVALID_HANDLE, nullptr, nullptr, 0, IPCZ_NO_FLAGS,
-                        nullptr, nullptr, nullptr));
-  EXPECT_EQ(IPCZ_RESULT_UNIMPLEMENTED,
             ipcz().Box(IPCZ_INVALID_HANDLE, IPCZ_INVALID_DRIVER_HANDLE,
                        IPCZ_NO_FLAGS, nullptr, nullptr));
   EXPECT_EQ(IPCZ_RESULT_UNIMPLEMENTED,
@@ -75,9 +72,7 @@
 }
 
 TEST_F(APITest, OpenPortalsInvalid) {
-  IpczHandle node;
-  ipcz().CreateNode(&kDefaultDriver, IPCZ_INVALID_DRIVER_HANDLE, IPCZ_NO_FLAGS,
-                    nullptr, &node);
+  IpczHandle node = CreateNode(kDefaultDriver);
 
   IpczHandle a, b;
 
@@ -94,29 +89,22 @@
   EXPECT_EQ(IPCZ_RESULT_INVALID_ARGUMENT,
             ipcz().OpenPortals(node, IPCZ_NO_FLAGS, nullptr, nullptr, nullptr));
 
-  ipcz().Close(node, IPCZ_NO_FLAGS, nullptr);
+  Close(node);
 }
 
 TEST_F(APITest, OpenPortals) {
-  IpczHandle node;
-  ipcz().CreateNode(&kDefaultDriver, IPCZ_INVALID_DRIVER_HANDLE, IPCZ_NO_FLAGS,
-                    nullptr, &node);
+  IpczHandle node = CreateNode(kDefaultDriver);
 
   IpczHandle a, b;
   EXPECT_EQ(IPCZ_RESULT_OK,
             ipcz().OpenPortals(node, IPCZ_NO_FLAGS, nullptr, &a, &b));
-  EXPECT_EQ(IPCZ_RESULT_OK, ipcz().Close(a, IPCZ_NO_FLAGS, nullptr));
-  EXPECT_EQ(IPCZ_RESULT_OK, ipcz().Close(b, IPCZ_NO_FLAGS, nullptr));
-  EXPECT_EQ(IPCZ_RESULT_OK, ipcz().Close(node, IPCZ_NO_FLAGS, nullptr));
+
+  CloseAll({a, b, node});
 }
 
 TEST_F(APITest, QueryPortalStatusInvalid) {
-  IpczHandle node;
-  ipcz().CreateNode(&kDefaultDriver, IPCZ_INVALID_DRIVER_HANDLE, IPCZ_NO_FLAGS,
-                    nullptr, &node);
-  IpczHandle a, b;
-  EXPECT_EQ(IPCZ_RESULT_OK,
-            ipcz().OpenPortals(node, IPCZ_NO_FLAGS, nullptr, &a, &b));
+  IpczHandle node = CreateNode(kDefaultDriver);
+  auto [a, b] = OpenPortals(node);
 
   // Null portal.
   IpczPortalStatus status = {.size = sizeof(status)};
@@ -137,18 +125,12 @@
   EXPECT_EQ(IPCZ_RESULT_INVALID_ARGUMENT,
             ipcz().QueryPortalStatus(a, IPCZ_NO_FLAGS, nullptr, &status));
 
-  EXPECT_EQ(IPCZ_RESULT_OK, ipcz().Close(a, IPCZ_NO_FLAGS, nullptr));
-  EXPECT_EQ(IPCZ_RESULT_OK, ipcz().Close(b, IPCZ_NO_FLAGS, nullptr));
-  EXPECT_EQ(IPCZ_RESULT_OK, ipcz().Close(node, IPCZ_NO_FLAGS, nullptr));
+  CloseAll({a, b, node});
 }
 
 TEST_F(APITest, QueryPortalStatus) {
-  IpczHandle node;
-  ipcz().CreateNode(&kDefaultDriver, IPCZ_INVALID_DRIVER_HANDLE, IPCZ_NO_FLAGS,
-                    nullptr, &node);
-  IpczHandle a, b;
-  EXPECT_EQ(IPCZ_RESULT_OK,
-            ipcz().OpenPortals(node, IPCZ_NO_FLAGS, nullptr, &a, &b));
+  IpczHandle node = CreateNode(kDefaultDriver);
+  auto [a, b] = OpenPortals(node);
 
   IpczPortalStatus status = {.size = sizeof(status)};
   EXPECT_EQ(IPCZ_RESULT_OK,
@@ -160,24 +142,19 @@
   EXPECT_EQ(0u, status.num_remote_parcels);
   EXPECT_EQ(0u, status.num_remote_bytes);
 
-  EXPECT_EQ(IPCZ_RESULT_OK, ipcz().Close(b, IPCZ_NO_FLAGS, nullptr));
+  Close(b);
   EXPECT_EQ(IPCZ_RESULT_OK,
             ipcz().QueryPortalStatus(a, IPCZ_NO_FLAGS, nullptr, &status));
   EXPECT_EQ(IPCZ_PORTAL_STATUS_PEER_CLOSED,
             status.flags & IPCZ_PORTAL_STATUS_PEER_CLOSED);
   EXPECT_EQ(IPCZ_PORTAL_STATUS_DEAD, status.flags & IPCZ_PORTAL_STATUS_DEAD);
 
-  EXPECT_EQ(IPCZ_RESULT_OK, ipcz().Close(a, IPCZ_NO_FLAGS, nullptr));
-  EXPECT_EQ(IPCZ_RESULT_OK, ipcz().Close(node, IPCZ_NO_FLAGS, nullptr));
+  CloseAll({a, node});
 }
 
 TEST_F(APITest, PutGet) {
-  IpczHandle node;
-  ipcz().CreateNode(&kDefaultDriver, IPCZ_INVALID_DRIVER_HANDLE, IPCZ_NO_FLAGS,
-                    nullptr, &node);
-  IpczHandle a, b;
-  EXPECT_EQ(IPCZ_RESULT_OK,
-            ipcz().OpenPortals(node, IPCZ_NO_FLAGS, nullptr, &a, &b));
+  const IpczHandle node = CreateNode(kDefaultDriver);
+  auto [a, b] = OpenPortals(node);
 
   // Get from an empty portal.
   char data[4];
@@ -198,9 +175,7 @@
   EXPECT_EQ(IPCZ_RESULT_OK,
             ipcz().Put(a, nullptr, 0, nullptr, 0, IPCZ_NO_FLAGS, nullptr));
 
-  IpczHandle c, d;
-  EXPECT_EQ(IPCZ_RESULT_OK,
-            ipcz().OpenPortals(node, IPCZ_NO_FLAGS, nullptr, &c, &d));
+  auto [c, d] = OpenPortals(node);
   EXPECT_EQ(IPCZ_RESULT_OK,
             ipcz().Put(a, nullptr, 0, &d, 1, IPCZ_NO_FLAGS, nullptr));
   d = IPCZ_INVALID_HANDLE;
@@ -252,7 +227,7 @@
   EXPECT_EQ(IPCZ_RESULT_OK, ipcz().Get(b, IPCZ_NO_FLAGS, nullptr, nullptr,
                                        nullptr, &d, &num_handles));
   EXPECT_EQ(1u, num_handles);
-  EXPECT_EQ(IPCZ_RESULT_OK, ipcz().Close(d, IPCZ_NO_FLAGS, nullptr));
+  Close(d);
 
   EXPECT_EQ(IPCZ_RESULT_OK,
             ipcz().QueryPortalStatus(c, IPCZ_NO_FLAGS, nullptr, &status));
@@ -260,10 +235,47 @@
             status.flags & IPCZ_PORTAL_STATUS_PEER_CLOSED);
   EXPECT_EQ(IPCZ_PORTAL_STATUS_DEAD, status.flags & IPCZ_PORTAL_STATUS_DEAD);
 
-  EXPECT_EQ(IPCZ_RESULT_OK, ipcz().Close(a, IPCZ_NO_FLAGS, nullptr));
-  EXPECT_EQ(IPCZ_RESULT_OK, ipcz().Close(b, IPCZ_NO_FLAGS, nullptr));
-  EXPECT_EQ(IPCZ_RESULT_OK, ipcz().Close(c, IPCZ_NO_FLAGS, nullptr));
-  EXPECT_EQ(IPCZ_RESULT_OK, ipcz().Close(node, IPCZ_NO_FLAGS, nullptr));
+  CloseAll({a, b, c, node});
+}
+
+TEST_F(APITest, TrapInvalid) {
+  const IpczHandle node = CreateNode(kDefaultDriver);
+  auto [a, b] = OpenPortals(node);
+
+  const auto handler = [](const IpczTrapEvent* event) {};
+
+  // Null conditions.
+  EXPECT_EQ(IPCZ_RESULT_INVALID_ARGUMENT,
+            ipcz().Trap(b, nullptr, handler, 0, IPCZ_NO_FLAGS, nullptr, nullptr,
+                        nullptr));
+
+  // Invalid conditions.
+  IpczTrapConditions conditions = {.size = sizeof(conditions) - 1};
+  EXPECT_EQ(IPCZ_RESULT_INVALID_ARGUMENT,
+            ipcz().Trap(b, &conditions, handler, 0, IPCZ_NO_FLAGS, nullptr,
+                        nullptr, nullptr));
+
+  // Null handler.
+  conditions = {.size = sizeof(conditions)};
+  EXPECT_EQ(IPCZ_RESULT_INVALID_ARGUMENT,
+            ipcz().Trap(b, &conditions, nullptr, 0, IPCZ_NO_FLAGS, nullptr,
+                        nullptr, nullptr));
+
+  // Invalid or non-portal handle.
+  EXPECT_EQ(IPCZ_RESULT_INVALID_ARGUMENT,
+            ipcz().Trap(IPCZ_INVALID_HANDLE, &conditions, handler, 0,
+                        IPCZ_NO_FLAGS, nullptr, nullptr, nullptr));
+  EXPECT_EQ(IPCZ_RESULT_INVALID_ARGUMENT,
+            ipcz().Trap(node, &conditions, handler, 0, IPCZ_NO_FLAGS, nullptr,
+                        nullptr, nullptr));
+
+  // Invalid non-null output status.
+  IpczPortalStatus status = {.size = sizeof(status) - 1};
+  EXPECT_EQ(IPCZ_RESULT_INVALID_ARGUMENT,
+            ipcz().Trap(b, &conditions, handler, 0, IPCZ_NO_FLAGS, nullptr,
+                        nullptr, &status));
+
+  CloseAll({a, b, node});
 }
 
 }  // namespace
diff --git a/third_party/ipcz/src/ipcz/router.cc b/third_party/ipcz/src/ipcz/router.cc
index b52b70a9..9340f94 100644
--- a/third_party/ipcz/src/ipcz/router.cc
+++ b/third_party/ipcz/src/ipcz/router.cc
@@ -8,13 +8,20 @@
 #include <cstddef>
 #include <cstring>
 
+#include "ipcz/trap_event_dispatcher.h"
+#include "third_party/abseil-cpp/absl/base/macros.h"
 #include "third_party/abseil-cpp/absl/synchronization/mutex.h"
 
 namespace ipcz {
 
 Router::Router() = default;
 
-Router::~Router() = default;
+Router::~Router() {
+  // A Router MUST be serialized or closed before it can be destroyed. Both
+  // operations clear `traps_` and imply that no further traps should be added.
+  absl::MutexLock lock(&mutex_);
+  ABSL_ASSERT(traps_.empty());
+}
 
 bool Router::IsPeerClosed() {
   absl::MutexLock lock(&mutex_);
@@ -54,12 +61,15 @@
 }
 
 void Router::CloseRoute() {
+  TrapEventDispatcher dispatcher;
+
   SequenceNumber sequence_length;
   Ref<RouterLink> link;
   {
     absl::MutexLock lock(&mutex_);
     link = std::move(outward_link_);
     sequence_length = next_outbound_sequence_number_;
+    traps_.RemoveAll(dispatcher);
   }
 
   ABSL_ASSERT(link);
@@ -74,6 +84,7 @@
 }
 
 bool Router::AcceptInboundParcel(Parcel& parcel) {
+  TrapEventDispatcher dispatcher;
   absl::MutexLock lock(&mutex_);
   const SequenceNumber sequence_number = parcel.sequence_number();
   if (!inbound_parcels_.Push(sequence_number, std::move(parcel))) {
@@ -82,11 +93,14 @@
 
   status_.num_local_parcels = inbound_parcels_.GetNumAvailableElements();
   status_.num_local_bytes = inbound_parcels_.GetTotalAvailableElementSize();
+  traps_.UpdatePortalStatus(status_, TrapSet::UpdateReason::kNewLocalParcel,
+                            dispatcher);
   return true;
 }
 
 bool Router::AcceptRouteClosureFrom(LinkType link_type,
                                     SequenceNumber sequence_length) {
+  TrapEventDispatcher dispatcher;
   ABSL_ASSERT(link_type == LinkType::kCentral);
   absl::MutexLock lock(&mutex_);
   if (!inbound_parcels_.SetFinalSequenceLength(sequence_length)) {
@@ -97,6 +111,8 @@
   if (inbound_parcels_.IsSequenceFullyConsumed()) {
     status_.flags |= IPCZ_PORTAL_STATUS_DEAD;
   }
+  traps_.UpdatePortalStatus(status_, TrapSet::UpdateReason::kPeerClosed,
+                            dispatcher);
   return true;
 }
 
@@ -105,6 +121,7 @@
                                         size_t* num_bytes,
                                         IpczHandle* handles,
                                         size_t* num_handles) {
+  TrapEventDispatcher dispatcher;
   absl::MutexLock lock(&mutex_);
   if (inbound_parcels_.IsSequenceFullyConsumed()) {
     return IPCZ_RESULT_NOT_FOUND;
@@ -145,7 +162,19 @@
   if (inbound_parcels_.IsSequenceFullyConsumed()) {
     status_.flags |= IPCZ_PORTAL_STATUS_DEAD;
   }
+  traps_.UpdatePortalStatus(
+      status_, TrapSet::UpdateReason::kLocalParcelConsumed, dispatcher);
   return IPCZ_RESULT_OK;
 }
 
+IpczResult Router::Trap(const IpczTrapConditions& conditions,
+                        IpczTrapEventHandler handler,
+                        uint64_t context,
+                        IpczTrapConditionFlags* satisfied_condition_flags,
+                        IpczPortalStatus* status) {
+  absl::MutexLock lock(&mutex_);
+  return traps_.Add(conditions, handler, context, status_,
+                    satisfied_condition_flags, status);
+}
+
 }  // namespace ipcz
diff --git a/third_party/ipcz/src/ipcz/router.h b/third_party/ipcz/src/ipcz/router.h
index f54e8a2..18ed9566 100644
--- a/third_party/ipcz/src/ipcz/router.h
+++ b/third_party/ipcz/src/ipcz/router.h
@@ -5,12 +5,14 @@
 #ifndef IPCZ_SRC_IPCZ_ROUTER_H_
 #define IPCZ_SRC_IPCZ_ROUTER_H_
 
+#include <cstdint>
 #include <utility>
 
 #include "ipcz/ipcz.h"
 #include "ipcz/parcel_queue.h"
 #include "ipcz/router_link.h"
 #include "ipcz/sequence_number.h"
+#include "ipcz/trap_set.h"
 #include "third_party/abseil-cpp/absl/synchronization/mutex.h"
 #include "util/ref_counted.h"
 
@@ -93,6 +95,15 @@
                                   IpczHandle* handles,
                                   size_t* num_handles);
 
+  // Attempts to install a new trap on this Router, to invoke `handler` as soon
+  // as one or more conditions in `conditions` is met. This method effectively
+  // implements the ipcz Trap() API. See its description in ipcz.h for details.
+  IpczResult Trap(const IpczTrapConditions& conditions,
+                  IpczTrapEventHandler handler,
+                  uint64_t context,
+                  IpczTrapConditionFlags* satisfied_condition_flags,
+                  IpczPortalStatus* status);
+
  private:
   ~Router() override;
 
@@ -105,6 +116,10 @@
   // this router, iff this is a terminal router.
   IpczPortalStatus status_ ABSL_GUARDED_BY(mutex_) = {sizeof(status_)};
 
+  // A set of traps installed via a controlling portal where applicable. These
+  // traps are notified about any interesting state changes within the router.
+  TrapSet traps_ ABSL_GUARDED_BY(mutex_);
+
   // Parcels received from the other end of the route. If this is a terminal
   // router, these may be retrieved by the application via a controlling portal.
   ParcelQueue inbound_parcels_ ABSL_GUARDED_BY(mutex_);
diff --git a/third_party/ipcz/src/ipcz/trap_event_dispatcher.cc b/third_party/ipcz/src/ipcz/trap_event_dispatcher.cc
new file mode 100644
index 0000000..d47aaa5c
--- /dev/null
+++ b/third_party/ipcz/src/ipcz/trap_event_dispatcher.cc
@@ -0,0 +1,49 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ipcz/trap_event_dispatcher.h"
+
+namespace ipcz {
+
+TrapEventDispatcher::TrapEventDispatcher() = default;
+
+TrapEventDispatcher::~TrapEventDispatcher() {
+  DispatchAll();
+}
+
+void TrapEventDispatcher::DeferEvent(IpczTrapEventHandler handler,
+                                     uintptr_t context,
+                                     IpczTrapConditionFlags flags,
+                                     const IpczPortalStatus& status) {
+  events_.emplace_back(handler, context, flags, status);
+}
+
+void TrapEventDispatcher::DispatchAll() {
+  for (const Event& event : events_) {
+    const IpczTrapEvent trap_event = {
+        .size = sizeof(trap_event),
+        .context = event.context,
+        .condition_flags = event.flags,
+        .status = &event.status,
+    };
+    event.handler(&trap_event);
+  }
+}
+
+TrapEventDispatcher::Event::Event() = default;
+
+TrapEventDispatcher::Event::Event(IpczTrapEventHandler handler,
+                                  uintptr_t context,
+                                  IpczTrapConditionFlags flags,
+                                  IpczPortalStatus status)
+    : handler(handler), context(context), flags(flags), status(status) {}
+
+TrapEventDispatcher::Event::Event(const Event&) = default;
+
+TrapEventDispatcher::Event& TrapEventDispatcher::Event::operator=(
+    const Event&) = default;
+
+TrapEventDispatcher::Event::~Event() = default;
+
+}  // namespace ipcz
diff --git a/third_party/ipcz/src/ipcz/trap_event_dispatcher.h b/third_party/ipcz/src/ipcz/trap_event_dispatcher.h
new file mode 100644
index 0000000..44d312c
--- /dev/null
+++ b/third_party/ipcz/src/ipcz/trap_event_dispatcher.h
@@ -0,0 +1,66 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IPCZ_SRC_IPCZ_TRAP_EVENT_DISPATCHER_H_
+#define IPCZ_SRC_IPCZ_TRAP_EVENT_DISPATCHER_H_
+
+#include <cstdint>
+
+#include "ipcz/ipcz.h"
+#include "third_party/abseil-cpp/absl/container/inlined_vector.h"
+#include "util/ref_counted.h"
+
+namespace ipcz {
+
+// Accumulates IpczTrapEvent dispatches to specific handlers. Handler invocation
+// is deferred until DispatchAll() is called or the TrapEventDispatcher is
+// destroyed. This allows event dispatches to be accumulated while e.g. Node and
+// Portal locks are held, and dispatched later, once such locks are released.
+//
+// This object is not thread-safe but is generally constructed on the stack and
+// passed into whatever might want to accumulate events for dispatch.
+class TrapEventDispatcher {
+ public:
+  TrapEventDispatcher();
+  TrapEventDispatcher(const TrapEventDispatcher&) = delete;
+  TrapEventDispatcher& operator=(const TrapEventDispatcher&) = delete;
+  ~TrapEventDispatcher();
+
+  // Schedules a new event for dispatch by this object as soon as DispatchAll()
+  // is explicitly called or the TrapEventDispatcher is destroyed.
+  void DeferEvent(IpczTrapEventHandler handler,
+                  uintptr_t context,
+                  IpczTrapConditionFlags flags,
+                  const IpczPortalStatus& status);
+
+  // Dispatches any events deferred by DeferEvent() above.
+  void DispatchAll();
+
+ private:
+  // Details of an event to be dipsatched.
+  struct Event {
+    Event();
+    Event(IpczTrapEventHandler handler,
+          uintptr_t context,
+          IpczTrapConditionFlags flags,
+          IpczPortalStatus status);
+    Event(const Event&);
+    Event& operator=(const Event&);
+    ~Event();
+
+    IpczTrapEventHandler handler;
+    uintptr_t context;
+    IpczTrapConditionFlags flags;
+    IpczPortalStatus status;
+  };
+
+  // Space for four events should avoid heap allocations in the vast majority of
+  // cases where we accumulate events for imminent dispatch.
+  using DeferredEventQueue = absl::InlinedVector<Event, 4>;
+  DeferredEventQueue events_;
+};
+
+}  // namespace ipcz
+
+#endif  // IPCZ_SRC_IPCZ_TRAP_EVENT_DISPATCHER_H_
diff --git a/third_party/ipcz/src/ipcz/trap_set.cc b/third_party/ipcz/src/ipcz/trap_set.cc
new file mode 100644
index 0000000..2d0d43de
--- /dev/null
+++ b/third_party/ipcz/src/ipcz/trap_set.cc
@@ -0,0 +1,125 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ipcz/trap_set.h"
+
+#include <algorithm>
+#include <utility>
+
+#include "ipcz/ipcz.h"
+#include "ipcz/trap_event_dispatcher.h"
+#include "third_party/abseil-cpp/absl/base/macros.h"
+#include "util/ref_counted.h"
+
+namespace ipcz {
+
+namespace {
+
+IpczTrapConditionFlags GetSatisfiedConditions(
+    const IpczTrapConditions& conditions,
+    TrapSet::UpdateReason reason,
+    const IpczPortalStatus& status) {
+  IpczTrapConditionFlags event_flags = 0;
+  if ((conditions.flags & IPCZ_TRAP_PEER_CLOSED) &&
+      (status.flags & IPCZ_PORTAL_STATUS_PEER_CLOSED)) {
+    event_flags |= IPCZ_TRAP_PEER_CLOSED;
+  }
+  if ((conditions.flags & IPCZ_TRAP_DEAD) &&
+      (status.flags & IPCZ_PORTAL_STATUS_DEAD)) {
+    event_flags |= IPCZ_TRAP_DEAD;
+  }
+  if ((conditions.flags & IPCZ_TRAP_ABOVE_MIN_LOCAL_PARCELS) &&
+      status.num_local_parcels > conditions.min_local_parcels) {
+    event_flags |= IPCZ_TRAP_ABOVE_MIN_LOCAL_PARCELS;
+  }
+  if ((conditions.flags & IPCZ_TRAP_ABOVE_MIN_LOCAL_BYTES) &&
+      status.num_local_bytes > conditions.min_local_bytes) {
+    event_flags |= IPCZ_TRAP_ABOVE_MIN_LOCAL_BYTES;
+  }
+  if ((conditions.flags & IPCZ_TRAP_BELOW_MAX_REMOTE_PARCELS) &&
+      status.num_remote_parcels < conditions.max_remote_parcels) {
+    event_flags |= IPCZ_TRAP_BELOW_MAX_REMOTE_PARCELS;
+  }
+  if ((conditions.flags & IPCZ_TRAP_BELOW_MAX_REMOTE_BYTES) &&
+      status.num_remote_bytes < conditions.max_remote_bytes) {
+    event_flags |= IPCZ_TRAP_BELOW_MAX_REMOTE_BYTES;
+  }
+  if ((conditions.flags & IPCZ_TRAP_NEW_LOCAL_PARCEL) &&
+      reason == TrapSet::UpdateReason::kNewLocalParcel) {
+    event_flags |= IPCZ_TRAP_NEW_LOCAL_PARCEL;
+  }
+  return event_flags;
+}
+
+}  // namespace
+
+TrapSet::TrapSet() = default;
+
+TrapSet::~TrapSet() {
+  ABSL_ASSERT(empty());
+}
+
+IpczResult TrapSet::Add(const IpczTrapConditions& conditions,
+                        IpczTrapEventHandler handler,
+                        uintptr_t context,
+                        const IpczPortalStatus& current_status,
+                        IpczTrapConditionFlags* satisfied_condition_flags,
+                        IpczPortalStatus* status) {
+  last_known_status_ = current_status;
+  IpczTrapConditionFlags flags = GetSatisfiedConditions(
+      conditions, UpdateReason::kInstallTrap, current_status);
+  if (flags != 0) {
+    if (satisfied_condition_flags) {
+      *satisfied_condition_flags = flags;
+    }
+    if (status) {
+      // Note that we copy the minimum number of bytes between the size of our
+      // IpczPortalStatus and the size of the caller's, which may differ if
+      // coming from another version of ipcz. The `size` field is updated to
+      // reflect how many bytes are actually meaningful here.
+      const uint32_t size = std::min(status->size, sizeof(current_status));
+      memcpy(status, &current_status, size);
+      status->size = size;
+    }
+    return IPCZ_RESULT_FAILED_PRECONDITION;
+  }
+
+  traps_.emplace_back(conditions, handler, context);
+  return IPCZ_RESULT_OK;
+}
+
+void TrapSet::UpdatePortalStatus(const IpczPortalStatus& status,
+                                 UpdateReason reason,
+                                 TrapEventDispatcher& dispatcher) {
+  last_known_status_ = status;
+  for (auto* it = traps_.begin(); it != traps_.end();) {
+    const Trap& trap = *it;
+    const IpczTrapConditionFlags flags =
+        GetSatisfiedConditions(trap.conditions, reason, status);
+    if (!flags) {
+      ++it;
+      continue;
+    }
+
+    dispatcher.DeferEvent(trap.handler, trap.context, flags, status);
+    it = traps_.erase(it);
+  }
+}
+
+void TrapSet::RemoveAll(TrapEventDispatcher& dispatcher) {
+  for (const Trap& trap : traps_) {
+    dispatcher.DeferEvent(trap.handler, trap.context, IPCZ_TRAP_REMOVED,
+                          last_known_status_);
+  }
+  traps_.clear();
+}
+
+TrapSet::Trap::Trap(IpczTrapConditions conditions,
+                    IpczTrapEventHandler handler,
+                    uintptr_t context)
+    : conditions(conditions), handler(handler), context(context) {}
+
+TrapSet::Trap::~Trap() = default;
+
+}  // namespace ipcz
diff --git a/third_party/ipcz/src/ipcz/trap_set.h b/third_party/ipcz/src/ipcz/trap_set.h
new file mode 100644
index 0000000..fe45641
--- /dev/null
+++ b/third_party/ipcz/src/ipcz/trap_set.h
@@ -0,0 +1,89 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef IPCZ_SRC_IPCZ_TRAP_SET_H_
+#define IPCZ_SRC_IPCZ_TRAP_SET_H_
+
+#include <cstdint>
+
+#include "ipcz/ipcz.h"
+#include "third_party/abseil-cpp/absl/container/inlined_vector.h"
+
+namespace ipcz {
+
+class TrapEventDispatcher;
+
+// A set of traps installed on a portal.
+class TrapSet {
+ public:
+  // The reason for each status update when something happens that might
+  // interest a trap. This is particularly useful for observing edge-triggered
+  // conditions.
+  enum class UpdateReason {
+    // A new trap is being installed and this is an initial state query.
+    kInstallTrap,
+
+    // A new inbound parcel has arrived for retrieval.
+    kNewLocalParcel,
+
+    // We just discovered that the remote portal is gone.
+    kPeerClosed,
+
+    // A previously queued inbound parcel has been fully or partially retrieved
+    // by the application.
+    kLocalParcelConsumed,
+  };
+
+  TrapSet();
+  TrapSet(const TrapSet&) = delete;
+  TrapSet& operator=(const TrapSet&) = delete;
+
+  // NOTE: A TrapSet must be empty before it can be destroyed.
+  ~TrapSet();
+
+  bool empty() const { return traps_.empty(); }
+
+  // Attempts to install a new trap in the set. This effectively implements
+  // the ipcz Trap() API. If `conditions` are already met, returns
+  // IPCZ_RESULT_FAILED_PRECONDITION and populates `satisfied_condition_flags`
+  // and/or `status` if non-null.
+  IpczResult Add(const IpczTrapConditions& conditions,
+                 IpczTrapEventHandler handler,
+                 uintptr_t context,
+                 const IpczPortalStatus& current_status,
+                 IpczTrapConditionFlags* satisfied_condition_flags,
+                 IpczPortalStatus* status);
+
+  // Notifies this TrapSet of a state change on the portal it's interested in.
+  // If the state change is interesting to any trap in the set, an appropriate
+  // event may be appended to `dispatcher` for imminent dispatch and the trap is
+  // removed from the set before returning.
+  void UpdatePortalStatus(const IpczPortalStatus& status,
+                          UpdateReason reason,
+                          TrapEventDispatcher& dispatcher);
+
+  // Immediately removes all traps from the set. Every trap present appends an
+  // IPCZ_TRAP_REMOVED event to `dispatcher` before removal.
+  void RemoveAll(TrapEventDispatcher& dispatcher);
+
+ private:
+  struct Trap {
+    Trap(IpczTrapConditions conditions,
+         IpczTrapEventHandler handler,
+         uintptr_t context);
+    ~Trap();
+
+    IpczTrapConditions conditions;
+    IpczTrapEventHandler handler;
+    uintptr_t context;
+  };
+
+  using TrapList = absl::InlinedVector<Trap, 4>;
+  TrapList traps_;
+  IpczPortalStatus last_known_status_ = {.size = sizeof(last_known_status_)};
+};
+
+}  // namespace ipcz
+
+#endif  // IPCZ_SRC_IPCZ_TRAP_SET_H_
diff --git a/third_party/ipcz/src/test/test_base.cc b/third_party/ipcz/src/test/test_base.cc
index 34146ab5..0dcf090 100644
--- a/third_party/ipcz/src/test/test_base.cc
+++ b/third_party/ipcz/src/test/test_base.cc
@@ -10,10 +10,117 @@
 
 namespace ipcz::test {
 
+namespace {
+
+void CreateNodeChecked(const IpczAPI& ipcz,
+                       const IpczDriver& driver,
+                       IpczCreateNodeFlags flags,
+                       IpczHandle& handle) {
+  const IpczResult result = ipcz.CreateNode(&driver, IPCZ_INVALID_DRIVER_HANDLE,
+                                            flags, nullptr, &handle);
+  ASSERT_EQ(IPCZ_RESULT_OK, result);
+}
+
+void OpenPortalsChecked(const IpczAPI& ipcz,
+                        IpczHandle node,
+                        IpczHandle& first,
+                        IpczHandle& second) {
+  const IpczResult result =
+      ipcz.OpenPortals(node, IPCZ_NO_FLAGS, nullptr, &first, &second);
+  ASSERT_EQ(IPCZ_RESULT_OK, result);
+}
+
+}  // namespace
+
 TestBase::TestBase() {
   IpczGetAPI(&ipcz_);
 }
 
 TestBase::~TestBase() = default;
 
+void TestBase::Close(IpczHandle handle) {
+  ASSERT_EQ(IPCZ_RESULT_OK, ipcz().Close(handle, IPCZ_NO_FLAGS, nullptr));
+}
+
+void TestBase::CloseAll(const std::vector<IpczHandle>& handles) {
+  for (IpczHandle handle : handles) {
+    Close(handle);
+  }
+}
+
+IpczHandle TestBase::CreateNode(const IpczDriver& driver,
+                                IpczCreateNodeFlags flags) {
+  IpczHandle node;
+  CreateNodeChecked(ipcz(), driver, flags, node);
+  return node;
+}
+
+std::pair<IpczHandle, IpczHandle> TestBase::OpenPortals(IpczHandle node) {
+  IpczHandle a, b;
+  OpenPortalsChecked(ipcz(), node, a, b);
+  return {a, b};
+}
+
+IpczResult TestBase::Put(IpczHandle portal,
+                         std::string_view message,
+                         absl::Span<IpczHandle> handles) {
+  return ipcz().Put(portal, message.data(), message.size(), handles.data(),
+                    handles.size(), IPCZ_NO_FLAGS, nullptr);
+}
+
+IpczResult TestBase::Get(IpczHandle portal,
+                         std::string* message,
+                         std::vector<IpczHandle>* handles) {
+  if (message) {
+    message->clear();
+  }
+  if (handles) {
+    handles->clear();
+  }
+
+  size_t num_bytes = 0;
+  size_t num_handles = 0;
+  IpczResult result = ipcz().Get(portal, IPCZ_NO_FLAGS, nullptr, nullptr,
+                                 &num_bytes, nullptr, &num_handles);
+  if (result != IPCZ_RESULT_RESOURCE_EXHAUSTED) {
+    return result;
+  }
+
+  void* data_storage = nullptr;
+  IpczHandle* handle_storage = nullptr;
+  if (message) {
+    message->resize(num_bytes);
+    data_storage = message->data();
+  }
+  if (handles) {
+    handles->resize(num_handles);
+    handle_storage = handles->data();
+  }
+
+  return ipcz().Get(portal, IPCZ_NO_FLAGS, nullptr, data_storage, &num_bytes,
+                    handle_storage, &num_handles);
+}
+
+IpczResult TestBase::Trap(IpczHandle portal,
+                          const IpczTrapConditions& conditions,
+                          TrapEventHandler fn,
+                          IpczTrapConditionFlags* flags,
+                          IpczPortalStatus* status) {
+  auto handler = std::make_unique<TrapEventHandler>(std::move(fn));
+  auto context = reinterpret_cast<uintptr_t>(handler.get());
+  const IpczResult result =
+      ipcz().Trap(portal, &conditions, &HandleEvent, context, IPCZ_NO_FLAGS,
+                  nullptr, flags, status);
+  if (result == IPCZ_RESULT_OK) {
+    std::ignore = handler.release();
+  }
+  return result;
+}
+
+void TestBase::HandleEvent(const IpczTrapEvent* event) {
+  auto handler =
+      absl::WrapUnique(reinterpret_cast<TrapEventHandler*>(event->context));
+  (*handler)(*event);
+}
+
 }  // namespace ipcz::test
diff --git a/third_party/ipcz/src/test/test_base.h b/third_party/ipcz/src/test/test_base.h
index ab2d47f..c9142a2 100644
--- a/third_party/ipcz/src/test/test_base.h
+++ b/third_party/ipcz/src/test/test_base.h
@@ -5,19 +5,47 @@
 #ifndef IPCZ_SRC_TEST_TEST_BASE_H_
 #define IPCZ_SRC_TEST_TEST_BASE_H_
 
+#include <functional>
+#include <string_view>
+#include <utility>
+#include <vector>
+
 #include "ipcz/ipcz.h"
 #include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/abseil-cpp/absl/types/span.h"
 
 namespace ipcz::test {
 
 class TestBase : public testing::Test {
  public:
+  using TrapEventHandler = std::function<void(const IpczTrapEvent&)>;
+
   TestBase();
   ~TestBase() override;
 
   const IpczAPI& ipcz() const { return ipcz_; }
 
+  // Some shorthand methods to access the ipcz API more conveniently.
+  void Close(IpczHandle handle);
+  void CloseAll(const std::vector<IpczHandle>& handles);
+  IpczHandle CreateNode(const IpczDriver& driver,
+                        IpczCreateNodeFlags flags = IPCZ_NO_FLAGS);
+  std::pair<IpczHandle, IpczHandle> OpenPortals(IpczHandle node);
+  IpczResult Put(IpczHandle portal,
+                 std::string_view message,
+                 absl::Span<IpczHandle> handles = {});
+  IpczResult Get(IpczHandle portal,
+                 std::string* message = nullptr,
+                 std::vector<IpczHandle>* handles = nullptr);
+  IpczResult Trap(IpczHandle portal,
+                  const IpczTrapConditions& conditions,
+                  TrapEventHandler fn,
+                  IpczTrapConditionFlags* flags = nullptr,
+                  IpczPortalStatus* status = nullptr);
+
  private:
+  static void HandleEvent(const IpczTrapEvent* event);
+
   IpczAPI ipcz_ = {.size = sizeof(ipcz_)};
 };
 
diff --git a/third_party/ipcz/src/trap_test.cc b/third_party/ipcz/src/trap_test.cc
new file mode 100644
index 0000000..a9eb3f5
--- /dev/null
+++ b/third_party/ipcz/src/trap_test.cc
@@ -0,0 +1,296 @@
+// Copyright 2022 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <tuple>
+#include <utility>
+
+#include "ipcz/ipcz.h"
+#include "reference_drivers/single_process_reference_driver.h"
+#include "test/test_base.h"
+#include "testing/gtest/include/gtest/gtest.h"
+#include "third_party/abseil-cpp/absl/memory/memory.h"
+
+namespace ipcz {
+namespace {
+
+class TrapTest : public test::TestBase {
+ public:
+  ~TrapTest() override { Close(node_); }
+
+  std::pair<IpczHandle, IpczHandle> OpenPortals() {
+    return TestBase::OpenPortals(node_);
+  }
+
+ private:
+  const IpczHandle node_{
+      CreateNode(reference_drivers::kSingleProcessReferenceDriver)};
+};
+
+TEST_F(TrapTest, RemoveOnClose) {
+  auto [a, b] = OpenPortals();
+
+  // Install a few traps to watch for specific conditions. Both should instead
+  // observe IPCZ_TRAP_REMOVED when the observed portal is closed.
+
+  bool parcel_trap_removed = false;
+  bool closure_trap_removed = false;
+
+  IpczTrapConditions conditions = {
+      .size = sizeof(conditions),
+      .flags = IPCZ_TRAP_NEW_LOCAL_PARCEL,
+  };
+  EXPECT_EQ(IPCZ_RESULT_OK, Trap(b, conditions, [&](const IpczTrapEvent& e) {
+              EXPECT_EQ(IPCZ_TRAP_REMOVED, e.condition_flags);
+              parcel_trap_removed = true;
+            }));
+  conditions.flags = IPCZ_TRAP_PEER_CLOSED;
+  EXPECT_EQ(IPCZ_RESULT_OK, Trap(b, conditions, [&](const IpczTrapEvent& e) {
+              EXPECT_EQ(IPCZ_TRAP_REMOVED, e.condition_flags);
+              closure_trap_removed = true;
+            }));
+
+  EXPECT_FALSE(parcel_trap_removed);
+  EXPECT_FALSE(closure_trap_removed);
+  Close(b);
+  EXPECT_TRUE(parcel_trap_removed);
+  EXPECT_TRUE(closure_trap_removed);
+
+  Close(a);
+}
+
+TEST_F(TrapTest, PeerClosed) {
+  auto [a, b] = OpenPortals();
+
+  const IpczTrapConditions conditions = {
+      .size = sizeof(conditions),
+      .flags = IPCZ_TRAP_PEER_CLOSED,
+  };
+  bool received_event = false;
+  EXPECT_EQ(IPCZ_RESULT_OK, Trap(b, conditions, [&](const IpczTrapEvent& e) {
+              EXPECT_EQ(IPCZ_TRAP_PEER_CLOSED, e.condition_flags);
+              received_event = true;
+            }));
+
+  EXPECT_FALSE(received_event);
+  Close(a);
+  EXPECT_TRUE(received_event);
+
+  IpczTrapConditionFlags flags = IPCZ_NO_FLAGS;
+  IpczPortalStatus status = {.size = sizeof(status)};
+  EXPECT_EQ(IPCZ_RESULT_FAILED_PRECONDITION,
+            Trap(
+                b, conditions, [&](const IpczTrapEvent&) {}, &flags, &status));
+  EXPECT_EQ(IPCZ_TRAP_PEER_CLOSED, flags);
+  EXPECT_NE(IPCZ_NO_FLAGS, status.flags & IPCZ_PORTAL_STATUS_PEER_CLOSED);
+
+  Close(b);
+}
+
+TEST_F(TrapTest, MinLocalParcels) {
+  auto [a, b] = OpenPortals();
+
+  IpczTrapConditions conditions = {
+      .size = sizeof(conditions),
+      .flags = IPCZ_TRAP_ABOVE_MIN_LOCAL_PARCELS,
+      .min_local_parcels = 0,
+  };
+  bool received_event = false;
+  EXPECT_EQ(IPCZ_RESULT_OK, Trap(b, conditions, [&](const IpczTrapEvent& e) {
+              EXPECT_EQ(IPCZ_TRAP_ABOVE_MIN_LOCAL_PARCELS, e.condition_flags);
+              received_event = true;
+            }));
+
+  EXPECT_FALSE(received_event);
+  Put(a, "beep beep");
+  EXPECT_TRUE(received_event);
+
+  // Can't install a new trap with the same conditions, because the minimum
+  // local parcel count is already satisifed...
+  IpczTrapConditionFlags flags = IPCZ_NO_FLAGS;
+  IpczPortalStatus status = {.size = sizeof(status)};
+  EXPECT_EQ(IPCZ_RESULT_FAILED_PRECONDITION,
+            Trap(
+                b, conditions, [&](const IpczTrapEvent&) {}, &flags, &status));
+  EXPECT_EQ(IPCZ_TRAP_ABOVE_MIN_LOCAL_PARCELS, flags);
+  EXPECT_EQ(1u, status.num_local_parcels);
+
+  // ...but we can still install a trap to watch for a larger number of parcels.
+  received_event = false;
+  conditions.min_local_parcels = 2;
+  EXPECT_EQ(IPCZ_RESULT_OK, Trap(b, conditions, [&](const IpczTrapEvent& e) {
+              EXPECT_EQ(IPCZ_TRAP_ABOVE_MIN_LOCAL_PARCELS, e.condition_flags);
+              received_event = true;
+            }));
+
+  EXPECT_FALSE(received_event);
+  Put(a, "hihihi");
+  EXPECT_FALSE(received_event);
+  Put(a, "okokok");
+  EXPECT_TRUE(received_event);
+
+  // Purge the messages. Should now be able to install another trap for > 0
+  // parcels.
+  std::string message;
+  EXPECT_EQ(IPCZ_RESULT_OK, Get(b, &message));
+  EXPECT_EQ(IPCZ_RESULT_OK, Get(b, &message));
+  EXPECT_EQ(IPCZ_RESULT_OK, Get(b, &message));
+  conditions.min_local_parcels = 0;
+  EXPECT_EQ(IPCZ_RESULT_OK, Trap(b, conditions, [&](const IpczTrapEvent&) {}));
+
+  CloseAll({a, b});
+}
+
+TEST_F(TrapTest, MinLocalBytes) {
+  auto [a, b] = OpenPortals();
+
+  IpczTrapConditions conditions = {
+      .size = sizeof(conditions),
+      .flags = IPCZ_TRAP_ABOVE_MIN_LOCAL_BYTES,
+      .min_local_bytes = 3,
+  };
+  bool received_event = false;
+  EXPECT_EQ(IPCZ_RESULT_OK, Trap(b, conditions, [&](const IpczTrapEvent& e) {
+              EXPECT_EQ(IPCZ_TRAP_ABOVE_MIN_LOCAL_BYTES, e.condition_flags);
+              received_event = true;
+            }));
+
+  EXPECT_FALSE(received_event);
+  Put(a, "w");
+  EXPECT_FALSE(received_event);
+  Put(a, "x");
+  EXPECT_FALSE(received_event);
+  Put(a, "y");
+  EXPECT_FALSE(received_event);
+  Put(a, "z");
+  EXPECT_TRUE(received_event);
+
+  IpczTrapConditionFlags flags = IPCZ_NO_FLAGS;
+  IpczPortalStatus status = {.size = sizeof(status)};
+  EXPECT_EQ(IPCZ_RESULT_FAILED_PRECONDITION,
+            Trap(
+                b, conditions, [&](const IpczTrapEvent&) {}, &flags, &status));
+  EXPECT_EQ(IPCZ_TRAP_ABOVE_MIN_LOCAL_BYTES, flags);
+  EXPECT_EQ(4u, status.num_local_bytes);
+
+  CloseAll({a, b});
+}
+
+TEST_F(TrapTest, NewLocalParcel) {
+  auto [a, b] = OpenPortals();
+
+  IpczTrapConditions conditions = {
+      .size = sizeof(conditions),
+      .flags = IPCZ_TRAP_NEW_LOCAL_PARCEL,
+  };
+  bool received_event = false;
+  EXPECT_EQ(IPCZ_RESULT_OK, Trap(b, conditions, [&](const IpczTrapEvent& e) {
+              EXPECT_EQ(IPCZ_TRAP_NEW_LOCAL_PARCEL, e.condition_flags);
+              received_event = true;
+            }));
+
+  EXPECT_FALSE(received_event);
+  Put(a, "beep beep");
+  EXPECT_TRUE(received_event);
+
+  received_event = false;
+  EXPECT_EQ(IPCZ_RESULT_OK, Trap(b, conditions, [&](const IpczTrapEvent& e) {
+              EXPECT_EQ(IPCZ_TRAP_NEW_LOCAL_PARCEL, e.condition_flags);
+              received_event = true;
+            }));
+
+  EXPECT_FALSE(received_event);
+  Put(a, "beep beep beeeeep");
+  EXPECT_TRUE(received_event);
+
+  CloseAll({a, b});
+}
+
+TEST_F(TrapTest, DeadPortal) {
+  auto [a, b] = OpenPortals();
+
+  const IpczTrapConditions conditions = {
+      .size = sizeof(conditions),
+      .flags = IPCZ_TRAP_DEAD,
+  };
+  bool received_event = false;
+  EXPECT_EQ(IPCZ_RESULT_OK, Trap(b, conditions, [&](const IpczTrapEvent& e) {
+              EXPECT_EQ(IPCZ_TRAP_DEAD, e.condition_flags);
+              received_event = true;
+            }));
+
+  // A "dead" signal can't be raised until the peer is closed AND all incoming
+  // parcels have been drained.
+  EXPECT_FALSE(received_event);
+  Put(a, "goodbye");
+  Close(a);
+  EXPECT_FALSE(received_event);
+
+  std::string message;
+  EXPECT_EQ(IPCZ_RESULT_OK, Get(b, &message));
+  EXPECT_TRUE(received_event);
+
+  IpczTrapConditionFlags flags = IPCZ_NO_FLAGS;
+  IpczPortalStatus status = {.size = sizeof(status)};
+  EXPECT_EQ(IPCZ_RESULT_FAILED_PRECONDITION,
+            Trap(
+                b, conditions, [&](const IpczTrapEvent&) {}, &flags, &status));
+  EXPECT_EQ(IPCZ_TRAP_DEAD, flags);
+  EXPECT_NE(IPCZ_NO_FLAGS, status.flags & IPCZ_PORTAL_STATUS_PEER_CLOSED);
+  EXPECT_NE(IPCZ_NO_FLAGS, status.flags & IPCZ_PORTAL_STATUS_DEAD);
+  EXPECT_EQ(0u, status.num_local_parcels);
+
+  Close(b);
+}
+
+TEST_F(TrapTest, MultipleTraps) {
+  auto [a, b] = OpenPortals();
+
+  // Install 3 separate traps. We'll trigger an event for only one of them
+  // first, and then we'll trigger events for the other two simulataneously.
+  bool observed_parcel = false;
+  bool observed_closure = false;
+  bool observed_death = false;
+  IpczTrapConditions conditions = {
+      .size = sizeof(conditions),
+      .flags = IPCZ_TRAP_NEW_LOCAL_PARCEL,
+  };
+  EXPECT_EQ(IPCZ_RESULT_OK, Trap(b, conditions, [&](const IpczTrapEvent& e) {
+              EXPECT_EQ(IPCZ_TRAP_NEW_LOCAL_PARCEL, e.condition_flags);
+              observed_parcel = true;
+            }));
+
+  conditions.flags = IPCZ_TRAP_PEER_CLOSED;
+  EXPECT_EQ(IPCZ_RESULT_OK, Trap(b, conditions, [&](const IpczTrapEvent& e) {
+              EXPECT_EQ(IPCZ_TRAP_PEER_CLOSED, e.condition_flags);
+              observed_closure = true;
+            }));
+
+  conditions.flags = IPCZ_TRAP_DEAD;
+  EXPECT_EQ(IPCZ_RESULT_OK, Trap(b, conditions, [&](const IpczTrapEvent& e) {
+              EXPECT_EQ(IPCZ_TRAP_DEAD, e.condition_flags);
+              observed_death = true;
+            }));
+
+  EXPECT_FALSE(observed_parcel);
+  EXPECT_FALSE(observed_closure);
+  EXPECT_FALSE(observed_death);
+
+  Put(a, "hey");
+  EXPECT_TRUE(observed_parcel);
+  EXPECT_FALSE(observed_closure);
+  EXPECT_FALSE(observed_death);
+
+  std::string message;
+  EXPECT_EQ(IPCZ_RESULT_OK, Get(b, &message));
+
+  Close(a);
+  EXPECT_TRUE(observed_parcel);
+  EXPECT_TRUE(observed_closure);
+  EXPECT_TRUE(observed_death);
+
+  Close(b);
+}
+
+}  // namespace
+}  // namespace ipcz
diff --git a/third_party/libxslt/README.chromium b/third_party/libxslt/README.chromium
index c33ae86b..744ab3d2 100644
--- a/third_party/libxslt/README.chromium
+++ b/third_party/libxslt/README.chromium
@@ -1,6 +1,6 @@
 Name: libxslt
 URL: http://xmlsoft.org/XSLT
-Version: 22f12ce58eb5f41d23bb205530034b29aac03700
+Version: 36bbe5ab3c7bdd2f59afa0592b738e6369b827d7
 CPEPrefix: cpe:/a:xmlsoft:libxslt:1.1.35
 Security Critical: yes
 License: MIT
diff --git a/third_party/libxslt/chromium/remove-label.patch b/third_party/libxslt/chromium/remove-label.patch
new file mode 100644
index 0000000..fb68ca4
--- /dev/null
+++ b/third_party/libxslt/chromium/remove-label.patch
@@ -0,0 +1,16 @@
+The out_fragment label is only used in a goto which is behind a #ifdef flag
+which isn't enabled when we compile libxslt, which leads to a compile error
+because out_fragment isn't used.
+
+diff --git a/libxslt/functions.c b/libxslt/functions.c
+index fa8b6d93..933ff88c 100644
+--- a/libxslt/functions.c
++++ b/libxslt/functions.c
+@@ -195,7 +195,6 @@ xsltDocumentFunctionLoadDocument(xmlXPathParserContextPtr ctxt, xmlChar* URI)
+         resObj = NULL;
+     }
+ 
+-out_fragment:
+     if (resObj == NULL)
+         resObj = xmlXPathNewNodeSet(NULL);
+     valuePush(ctxt, resObj);
diff --git a/third_party/libxslt/chromium/roll.py b/third_party/libxslt/chromium/roll.py
index 4c01184c..06fe1aada 100755
--- a/third_party/libxslt/chromium/roll.py
+++ b/third_party/libxslt/chromium/roll.py
@@ -65,6 +65,7 @@
 #       git cl try-results; etc.
 
 PATCHES = [
+    'remove-label.patch',
     'xslt-locale.patch',
 ]
 
@@ -287,7 +288,7 @@
         # Work out what it is called
         tar_file = subprocess.check_output(
             '''awk '/PACKAGE =/ {p=$3} /VERSION =/ {v=$3} '''
-            '''END {printf("%s-%s.tar.gz", p, v)}' Makefile''',
+            '''END {printf("%s-%s.tar.xz", p, v)}' Makefile''',
             shell=True).decode('ascii')
         return commit, os.path.abspath(tar_file)
 
@@ -308,7 +309,7 @@
             # Export the libxslt distribution to the Chromium tree
             with WorkingDir(THIRD_PARTY_LIBXSLT_SRC):
                 subprocess.check_call(
-                    'tar xzf %s --strip-components=1' % tar_file,
+                    'tar xJf %s --strip-components=1' % tar_file,
                     shell=True)
         finally:
             shutil.rmtree(temp_dir)
diff --git a/third_party/libxslt/chromium/xslt-locale.patch b/third_party/libxslt/chromium/xslt-locale.patch
index 802ac6c4..88398ce 100644
--- a/third_party/libxslt/chromium/xslt-locale.patch
+++ b/third_party/libxslt/chromium/xslt-locale.patch
@@ -26,7 +26,7 @@
  typedef locale_t xsltLocale;
  typedef xmlChar xsltLocaleChar;
  
--#elif defined(_WIN32) && !defined(__CYGWIN__)
+-#elif defined(_WIN32)
 +#elif 0
  
  /*
diff --git a/third_party/libxslt/linux/config.h b/third_party/libxslt/linux/config.h
index 93f6a1c..5602b20 100644
--- a/third_party/libxslt/linux/config.h
+++ b/third_party/libxslt/linux/config.h
@@ -7,24 +7,6 @@
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #define HAVE_DLFCN_H 1
 
-/* Define to 1 if you have the <errno.h> header file. */
-#define HAVE_ERRNO_H 1
-
-/* Define if fabs is there */
-#define HAVE_FABS /**/
-
-/* Define to 1 if you have the <float.h> header file. */
-#define HAVE_FLOAT_H 1
-
-/* Define if floor is there */
-#define HAVE_FLOOR /**/
-
-/* Define to 1 if you have the `fprintf' function. */
-#define HAVE_FPRINTF 1
-
-/* Define to 1 if you have the <fp_class.h> header file. */
-/* #undef HAVE_FP_CLASS_H */
-
 /* Define to 1 if you have the `ftime' function. */
 #define HAVE_FTIME 1
 
@@ -34,15 +16,9 @@
 /* Define to 1 if you have the `gettimeofday' function. */
 #define HAVE_GETTIMEOFDAY 1
 
-/* Define to 1 if you have the `gmtime' function. */
-#define HAVE_GMTIME 1
-
 /* Define to 1 if you have the `gmtime_r' function. */
 #define HAVE_GMTIME_R 1
 
-/* Define to 1 if you have the <ieeefp.h> header file. */
-/* #undef HAVE_IEEEFP_H */
-
 /* Define to 1 if you have the <inttypes.h> header file. */
 #define HAVE_INTTYPES_H 1
 
@@ -52,45 +28,21 @@
 /* Define to 1 if you have the <locale.h> header file. */
 #define HAVE_LOCALE_H 1
 
-/* Define to 1 if you have the `localtime' function. */
-
-
 /* Define to 1 if you have the `localtime_r' function. */
 #define HAVE_LOCALTIME_R 1
 
-/* Define to 1 if you have the <math.h> header file. */
-#define HAVE_MATH_H 1
-
 /* Define to 1 if you have the <minix/config.h> header file. */
 /* #undef HAVE_MINIX_CONFIG_H */
 
-/* Define to 1 if you have the <nan.h> header file. */
-/* #undef HAVE_NAN_H */
-
-/* Define if pow is there */
-#define HAVE_POW /**/
-
-/* Define to 1 if you have the `printf' function. */
-#define HAVE_PRINTF 1
-
 /* Define if <pthread.h> is there */
 #define HAVE_PTHREAD_H /**/
 
 /* Define to 1 if you have the `snprintf' function. */
 #define HAVE_SNPRINTF 1
 
-/* Define to 1 if you have the `sprintf' function. */
-#define HAVE_SPRINTF 1
-
-/* Define to 1 if you have the `sscanf' function. */
-#define HAVE_SSCANF 1
-
 /* Define to 1 if you have the `stat' function. */
 #define HAVE_STAT 1
 
-/* Define to 1 if you have the <stdarg.h> header file. */
-#define HAVE_STDARG_H 1
-
 /* Define to 1 if you have the <stdint.h> header file. */
 #define HAVE_STDINT_H 1
 
@@ -124,24 +76,12 @@
 /* Define to 1 if you have the <sys/types.h> header file. */
 #define HAVE_SYS_TYPES_H 1
 
-/* Define to 1 if you have the `time' function. */
-#define HAVE_TIME 1
-
-/* Define to 1 if you have the <time.h> header file. */
-#define HAVE_TIME_H 1
-
 /* Define to 1 if you have the <unistd.h> header file. */
 #define HAVE_UNISTD_H 1
 
-/* Define to 1 if you have the `vfprintf' function. */
-#define HAVE_VFPRINTF 1
-
 /* Define to 1 if you have the `vsnprintf' function. */
 #define HAVE_VSNPRINTF 1
 
-/* Define to 1 if you have the `vsprintf' function. */
-#define HAVE_VSPRINTF 1
-
 /* Define to 1 if you have the <wchar.h> header file. */
 #define HAVE_WCHAR_H 1
 
diff --git a/third_party/libxslt/mac/config.h b/third_party/libxslt/mac/config.h
index 79753e57..1a8d2a2 100644
--- a/third_party/libxslt/mac/config.h
+++ b/third_party/libxslt/mac/config.h
@@ -7,24 +7,6 @@
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #define HAVE_DLFCN_H 1
 
-/* Define to 1 if you have the <errno.h> header file. */
-#define HAVE_ERRNO_H 1
-
-/* Define if fabs is there */
-/* #undef HAVE_FABS */
-
-/* Define to 1 if you have the <float.h> header file. */
-#define HAVE_FLOAT_H 1
-
-/* Define if floor is there */
-/* #undef HAVE_FLOOR */
-
-/* Define to 1 if you have the `fprintf' function. */
-#define HAVE_FPRINTF 1
-
-/* Define to 1 if you have the <fp_class.h> header file. */
-/* #undef HAVE_FP_CLASS_H */
-
 /* Define to 1 if you have the `ftime' function. */
 #define HAVE_FTIME 1
 
@@ -34,15 +16,9 @@
 /* Define to 1 if you have the `gettimeofday' function. */
 #define HAVE_GETTIMEOFDAY 1
 
-/* Define to 1 if you have the `gmtime' function. */
-#define HAVE_GMTIME 1
-
 /* Define to 1 if you have the `gmtime_r' function. */
 #define HAVE_GMTIME_R 1
 
-/* Define to 1 if you have the <ieeefp.h> header file. */
-/* #undef HAVE_IEEEFP_H */
-
 /* Define to 1 if you have the <inttypes.h> header file. */
 #define HAVE_INTTYPES_H 1
 
@@ -52,45 +28,21 @@
 /* Define to 1 if you have the <locale.h> header file. */
 #define HAVE_LOCALE_H 1
 
-/* Define to 1 if you have the `localtime' function. */
-
-
 /* Define to 1 if you have the `localtime_r' function. */
 #define HAVE_LOCALTIME_R 1
 
-/* Define to 1 if you have the <math.h> header file. */
-#define HAVE_MATH_H 1
-
 /* Define to 1 if you have the <minix/config.h> header file. */
 /* #undef HAVE_MINIX_CONFIG_H */
 
-/* Define to 1 if you have the <nan.h> header file. */
-/* #undef HAVE_NAN_H */
-
-/* Define if pow is there */
-/* #undef HAVE_POW */
-
-/* Define to 1 if you have the `printf' function. */
-#define HAVE_PRINTF 1
-
 /* Define if <pthread.h> is there */
 #define HAVE_PTHREAD_H /**/
 
 /* Define to 1 if you have the `snprintf' function. */
 #define HAVE_SNPRINTF 1
 
-/* Define to 1 if you have the `sprintf' function. */
-#define HAVE_SPRINTF 1
-
-/* Define to 1 if you have the `sscanf' function. */
-#define HAVE_SSCANF 1
-
 /* Define to 1 if you have the `stat' function. */
 #define HAVE_STAT 1
 
-/* Define to 1 if you have the <stdarg.h> header file. */
-#define HAVE_STDARG_H 1
-
 /* Define to 1 if you have the <stdint.h> header file. */
 #define HAVE_STDINT_H 1
 
@@ -124,24 +76,12 @@
 /* Define to 1 if you have the <sys/types.h> header file. */
 #define HAVE_SYS_TYPES_H 1
 
-/* Define to 1 if you have the `time' function. */
-#define HAVE_TIME 1
-
-/* Define to 1 if you have the <time.h> header file. */
-#define HAVE_TIME_H 1
-
 /* Define to 1 if you have the <unistd.h> header file. */
 #define HAVE_UNISTD_H 1
 
-/* Define to 1 if you have the `vfprintf' function. */
-#define HAVE_VFPRINTF 1
-
 /* Define to 1 if you have the `vsnprintf' function. */
 #define HAVE_VSNPRINTF 1
 
-/* Define to 1 if you have the `vsprintf' function. */
-#define HAVE_VSPRINTF 1
-
 /* Define to 1 if you have the <wchar.h> header file. */
 #define HAVE_WCHAR_H 1
 
diff --git a/third_party/libxslt/src/CMakeLists.txt b/third_party/libxslt/src/CMakeLists.txt
index 10564f8..18867d5 100644
--- a/third_party/libxslt/src/CMakeLists.txt
+++ b/third_party/libxslt/src/CMakeLists.txt
@@ -93,50 +93,25 @@
 		set(CMAKE_REQUIRED_LIBRARIES m)
 	endif()
 	check_function_exists(clock_gettime HAVE_CLOCK_GETTIME)
-	check_include_files(dlfcn.h HAVE_DLFCN_H)
-	check_function_exists(fabs HAVE_FABS)
-	check_include_files(float.h HAVE_FLOAT_H)
-	check_function_exists(floor HAVE_FLOOR)
-	check_function_exists(fprintf HAVE_FPRINTF)
-	check_include_files(fp_class.h HAVE_FP_CLASS_H)
 	check_function_exists(ftime HAVE_FTIME)
 	check_library_exists(gcrypt gcry_control "gcrypt.h" HAVE_GCRYPT)
 	check_function_exists(gettimeofday HAVE_GETTIMEOFDAY)
-	check_function_exists(gmtime HAVE_GMTIME)
 	check_function_exists(gmtime_r HAVE_GMTIME_R)
-	check_include_files(ieeefp.h HAVE_IEEEFP_H)
 	check_include_files(inttypes.h HAVE_INTTYPES_H)
 	check_library_exists(pthread pthread_join "" HAVE_LIBPTHREAD)
 	check_include_files(locale.h HAVE_LOCALE_H)
-	check_function_exists(localtime HAVE_LOCALTIME)
 	check_function_exists(localtime_r HAVE_LOCALTIME_R)
-	check_include_files(math.h HAVE_MATH_H)
-	check_include_files(memory.h HAVE_MEMORY_H)
-	check_include_files(nan.h HAVE_NAN_H)
-	check_function_exists(pow HAVE_POW)
-	check_function_exists(printf HAVE_PRINTF)
 	check_include_files(pthread.h HAVE_PTHREAD_H)
 	check_function_exists(snprintf HAVE_SNPRINTF)
-	check_function_exists(sprintf HAVE_SPRINTF)
-	check_function_exists(sscanf HAVE_SSCANF)
 	check_function_exists(stat HAVE_STAT)
-	check_include_files(stdarg.h HAVE_STDARG_H)
-	check_include_files(stdint.h HAVE_STDINT_H)
-	check_include_files(stdlib.h HAVE_STDLIB_H)
-	check_include_files(strings.h HAVE_STRINGS_H)
-	check_include_files(string.h HAVE_STRING_H)
 	check_function_exists(strxfrm_l HAVE_STRXFRM_L)
 	check_include_files(sys/select.h HAVE_SYS_SELECT_H)
 	check_include_files(sys/stat.h HAVE_SYS_STAT_H)
 	check_include_files(sys/timeb.h HAVE_SYS_TIMEB_H)
 	check_include_files(sys/time.h HAVE_SYS_TIME_H)
 	check_include_files(sys/types.h HAVE_SYS_TYPES_H)
-	check_function_exists(time HAVE_TIME)
-	check_include_files(time.h HAVE_TIME_H)
 	check_include_files(unistd.h HAVE_UNISTD_H)
-	check_function_exists(vfprintf HAVE_VFPRINTF)
 	check_function_exists(vsnprintf HAVE_VSNPRINTF)
-	check_function_exists(vsprintf HAVE_VSPRINTF)
 	check_include_files(xlocale.h HAVE_XLOCALE_H)
 	check_function_exists(_stat HAVE__STAT)
 	set(LT_OBJDIR ".libs/")
@@ -147,7 +122,6 @@
 	set(PACKAGE_TARNAME "libxslt")
 	set(PACKAGE_URL "https://gitlab.gnome.org/GNOME/libxslt")
 	set(PACKAGE_VERSION ${LIBXSLT_DOTTED_VERSION})
-	check_include_files("float.h;stdarg.h;stdlib.h;string.h" STDC_HEADERS)
 	set(_ALL_SOURCE ON)
 	set(_GNU_SOURCE ON)
 	set(_POSIX_PTHREAD_SEMANTICS ON)
@@ -231,7 +205,7 @@
 
 if(UNIX)
 	target_link_libraries(LibXslt PRIVATE m)
-	set(M_LIBS "-lm")
+	set(LIBM "-lm")
 endif()
 
 set_target_properties(
@@ -471,7 +445,7 @@
 set(XSLT_INCLUDEDIR "-I\${includedir}")
 set(XSLT_LIBDIR "-L\${libdir}")
 set(XSLT_LIBS "-lxslt -lxml2")
-set(XSLT_PRIVATE_LIBS "${M_LIBS}")
+set(XSLT_PRIVATE_LIBS "${LIBM}")
 
 set(EXSLT_INCLUDEDIR "-I\${includedir}")
 set(EXSLT_LIBDIR "-L\${libdir}")
diff --git a/third_party/libxslt/src/Makefile.am b/third_party/libxslt/src/Makefile.am
index 5dbb2a6..d5d6a4c 100644
--- a/third_party/libxslt/src/Makefile.am
+++ b/third_party/libxslt/src/Makefile.am
@@ -1,10 +1,9 @@
-SUBDIRS = \
-	libxslt \
-	libexslt \
-	xsltproc \
-	doc \
-	$(PYTHON_SUBDIR) \
-	tests
+ACLOCAL_AMFLAGS = -I m4
+
+SUBDIRS = libxslt libexslt xsltproc doc tests
+if WITH_PYTHON
+SUBDIRS += python
+endif
 
 DIST_SUBDIRS = libxslt libexslt xsltproc python doc tests
 
@@ -50,7 +49,9 @@
 	@echo '## Running the regression test suite'
 	@(cd tests ; $(MAKE) -s tests)
 	@(cd xsltproc ; $(MAKE) -s tests)
-	@(if [ "$(PYTHON_SUBDIR)" != "" ] ; then cd python ; $(MAKE) -s tests ; fi)
+if WITH_PYTHON
+	@cd python && $(MAKE) tests
+endif
 
 valgrind:
 	@echo '## Running the regression tests under Valgrind'
diff --git a/third_party/libxslt/src/config.h.cmake.in b/third_party/libxslt/src/config.h.cmake.in
index 41607777..3ae9c96 100644
--- a/third_party/libxslt/src/config.h.cmake.in
+++ b/third_party/libxslt/src/config.h.cmake.in
@@ -4,27 +4,6 @@
 /* Define to 1 if you have the `clock_gettime' function. */
 #cmakedefine HAVE_CLOCK_GETTIME 1
 
-/* Define to 1 if you have the <dlfcn.h> header file. */
-#cmakedefine HAVE_DLFCN_H 1
-
-/* Define to 1 if you have the <errno.h> header file. */
-#cmakedefine HAVE_ERRNO_H 1
-
-/* Define if fabs is there */
-#cmakedefine HAVE_FABS
-
-/* Define to 1 if you have the <float.h> header file. */
-#cmakedefine HAVE_FLOAT_H 1
-
-/* Define if floor is there */
-#cmakedefine HAVE_FLOOR
-
-/* Define to 1 if you have the `fprintf' function. */
-#cmakedefine HAVE_FPRINTF 1
-
-/* Define to 1 if you have the <fp_class.h> header file. */
-#cmakedefine HAVE_FP_CLASS_H 1
-
 /* Define to 1 if you have the `ftime' function. */
 #cmakedefine HAVE_FTIME 1
 
@@ -34,15 +13,9 @@
 /* Define to 1 if you have the `gettimeofday' function. */
 #cmakedefine HAVE_GETTIMEOFDAY 1
 
-/* Define to 1 if you have the `gmtime' function. */
-#cmakedefine HAVE_GMTIME 1
-
 /* Define to 1 if you have the `gmtime_r' function. */
 #cmakedefine HAVE_GMTIME_R 1
 
-/* Define to 1 if you have the <ieeefp.h> header file. */
-#cmakedefine HAVE_IEEEFP_H 1
-
 /* Define to 1 if you have the <inttypes.h> header file. */
 #cmakedefine HAVE_INTTYPES_H 1
 
@@ -52,57 +25,18 @@
 /* Define to 1 if you have the <locale.h> header file. */
 #cmakedefine HAVE_LOCALE_H 1
 
-/* Define to 1 if you have the `localtime' function. */
-#cmakedefine HAVE_LOCALTIME 1
-
 /* Define to 1 if you have the `localtime_r' function. */
 #cmakedefine HAVE_LOCALTIME_R 1
 
-/* Define to 1 if you have the <math.h> header file. */
-#cmakedefine HAVE_MATH_H 1
-
-/* Define to 1 if you have the <memory.h> header file. */
-#cmakedefine HAVE_MEMORY_H 1
-
-/* Define to 1 if you have the <nan.h> header file. */
-#cmakedefine HAVE_NAN_H 1
-
-/* Define if pow is there */
-#cmakedefine HAVE_POW
-
-/* Define to 1 if you have the `printf' function. */
-#cmakedefine HAVE_PRINTF 1
-
 /* Define if <pthread.h> is there */
 #cmakedefine HAVE_PTHREAD_H
 
 /* Define to 1 if you have the `snprintf' function. */
 #cmakedefine HAVE_SNPRINTF 1
 
-/* Define to 1 if you have the `sprintf' function. */
-#cmakedefine HAVE_SPRINTF 1
-
-/* Define to 1 if you have the `sscanf' function. */
-#cmakedefine HAVE_SSCANF 1
-
 /* Define to 1 if you have the `stat' function. */
 #cmakedefine HAVE_STAT 1
 
-/* Define to 1 if you have the <stdarg.h> header file. */
-#cmakedefine HAVE_STDARG_H 1
-
-/* Define to 1 if you have the <stdint.h> header file. */
-#cmakedefine HAVE_STDINT_H 1
-
-/* Define to 1 if you have the <stdlib.h> header file. */
-#cmakedefine HAVE_STDLIB_H 1
-
-/* Define to 1 if you have the <strings.h> header file. */
-#cmakedefine HAVE_STRINGS_H 1
-
-/* Define to 1 if you have the <string.h> header file. */
-#cmakedefine HAVE_STRING_H 1
-
 /* Define to 1 if you have the `strxfrm_l' function. */
 #cmakedefine HAVE_STRXFRM_L 1
 
@@ -121,24 +55,12 @@
 /* Define to 1 if you have the <sys/types.h> header file. */
 #cmakedefine HAVE_SYS_TYPES_H 1
 
-/* Define to 1 if you have the `time' function. */
-#cmakedefine HAVE_TIME 1
-
-/* Define to 1 if you have the <time.h> header file. */
-#cmakedefine HAVE_TIME_H 1
-
 /* Define to 1 if you have the <unistd.h> header file. */
 #cmakedefine HAVE_UNISTD_H 1
 
-/* Define to 1 if you have the `vfprintf' function. */
-#cmakedefine HAVE_VFPRINTF 1
-
 /* Define to 1 if you have the `vsnprintf' function. */
 #cmakedefine HAVE_VSNPRINTF 1
 
-/* Define to 1 if you have the `vsprintf' function. */
-#cmakedefine HAVE_VSPRINTF 1
-
 /* Define to 1 if you have the <xlocale.h> header file. */
 #cmakedefine HAVE_XLOCALE_H 1
 
@@ -169,9 +91,6 @@
 /* Define to the version of this package. */
 #cmakedefine PACKAGE_VERSION "@PACKAGE_VERSION@"
 
-/* Define to 1 if you have the ANSI C header files. */
-#cmakedefine STDC_HEADERS 1
-
 /* Enable extensions on AIX 3, Interix.  */
 #ifndef _ALL_SOURCE
 #cmakedefine _ALL_SOURCE 1
diff --git a/third_party/libxslt/src/config.h.in b/third_party/libxslt/src/config.h.in
index 562917c..f951d05 100644
--- a/third_party/libxslt/src/config.h.in
+++ b/third_party/libxslt/src/config.h.in
@@ -6,24 +6,6 @@
 /* Define to 1 if you have the <dlfcn.h> header file. */
 #undef HAVE_DLFCN_H
 
-/* Define to 1 if you have the <errno.h> header file. */
-#undef HAVE_ERRNO_H
-
-/* Define if fabs is there */
-#undef HAVE_FABS
-
-/* Define to 1 if you have the <float.h> header file. */
-#undef HAVE_FLOAT_H
-
-/* Define if floor is there */
-#undef HAVE_FLOOR
-
-/* Define to 1 if you have the `fprintf' function. */
-#undef HAVE_FPRINTF
-
-/* Define to 1 if you have the <fp_class.h> header file. */
-#undef HAVE_FP_CLASS_H
-
 /* Define to 1 if you have the `ftime' function. */
 #undef HAVE_FTIME
 
@@ -33,15 +15,9 @@
 /* Define to 1 if you have the `gettimeofday' function. */
 #undef HAVE_GETTIMEOFDAY
 
-/* Define to 1 if you have the `gmtime' function. */
-#undef HAVE_GMTIME
-
 /* Define to 1 if you have the `gmtime_r' function. */
 #undef HAVE_GMTIME_R
 
-/* Define to 1 if you have the <ieeefp.h> header file. */
-#undef HAVE_IEEEFP_H
-
 /* Define to 1 if you have the <inttypes.h> header file. */
 #undef HAVE_INTTYPES_H
 
@@ -51,45 +27,21 @@
 /* Define to 1 if you have the <locale.h> header file. */
 #undef HAVE_LOCALE_H
 
-/* Define to 1 if you have the `localtime' function. */
-#undef HAVE_LOCALTIME
-
 /* Define to 1 if you have the `localtime_r' function. */
 #undef HAVE_LOCALTIME_R
 
-/* Define to 1 if you have the <math.h> header file. */
-#undef HAVE_MATH_H
-
 /* Define to 1 if you have the <minix/config.h> header file. */
 #undef HAVE_MINIX_CONFIG_H
 
-/* Define to 1 if you have the <nan.h> header file. */
-#undef HAVE_NAN_H
-
-/* Define if pow is there */
-#undef HAVE_POW
-
-/* Define to 1 if you have the `printf' function. */
-#undef HAVE_PRINTF
-
 /* Define if <pthread.h> is there */
 #undef HAVE_PTHREAD_H
 
 /* Define to 1 if you have the `snprintf' function. */
 #undef HAVE_SNPRINTF
 
-/* Define to 1 if you have the `sprintf' function. */
-#undef HAVE_SPRINTF
-
-/* Define to 1 if you have the `sscanf' function. */
-#undef HAVE_SSCANF
-
 /* Define to 1 if you have the `stat' function. */
 #undef HAVE_STAT
 
-/* Define to 1 if you have the <stdarg.h> header file. */
-#undef HAVE_STDARG_H
-
 /* Define to 1 if you have the <stdint.h> header file. */
 #undef HAVE_STDINT_H
 
@@ -123,24 +75,12 @@
 /* Define to 1 if you have the <sys/types.h> header file. */
 #undef HAVE_SYS_TYPES_H
 
-/* Define to 1 if you have the `time' function. */
-#undef HAVE_TIME
-
-/* Define to 1 if you have the <time.h> header file. */
-#undef HAVE_TIME_H
-
 /* Define to 1 if you have the <unistd.h> header file. */
 #undef HAVE_UNISTD_H
 
-/* Define to 1 if you have the `vfprintf' function. */
-#undef HAVE_VFPRINTF
-
 /* Define to 1 if you have the `vsnprintf' function. */
 #undef HAVE_VSNPRINTF
 
-/* Define to 1 if you have the `vsprintf' function. */
-#undef HAVE_VSPRINTF
-
 /* Define to 1 if you have the <wchar.h> header file. */
 #undef HAVE_WCHAR_H
 
diff --git a/third_party/libxslt/src/configure.ac b/third_party/libxslt/src/configure.ac
index 7748cf98..88ea8dc 100644
--- a/third_party/libxslt/src/configure.ac
+++ b/third_party/libxslt/src/configure.ac
@@ -8,6 +8,7 @@
 AC_INIT([libxslt], [MAJOR_VERSION.MINOR_VERSION.MICRO_VERSION])
 AC_CONFIG_SRCDIR([libxslt/xslt.c])
 AC_CONFIG_HEADERS(config.h)
+AC_CONFIG_MACRO_DIR([m4])
 AC_CANONICAL_HOST
 AC_USE_SYSTEM_EXTENSIONS
 
@@ -66,36 +67,9 @@
 AC_SUBST(LIBEXSLT_VERSION_NUMBER)
 AC_SUBST(LIBEXSLT_VERSION_EXTRA)
 
-AM_INIT_AUTOMAKE([foreign])
-
-# AM_MAINTAINER_MODE
-
-# Support silent build rules, requires at least automake-1.11. Disable
-# by either passing --disable-silent-rules to configure or passing V=1
-# to make
-m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
-
-dnl
-dnl Specific dir for HTML output ?
-dnl
-
-AC_ARG_WITH(html-dir, AS_HELP_STRING([--with-html-dir=path],
-            [path to base html directory, default $datadir/doc/html]),
-            [HTML_DIR=$withval], [HTML_DIR='$(datadir)/doc'])
-
-AC_ARG_WITH(html-subdir, AS_HELP_STRING([--with-html-subdir=path],
-            [directory used under html-dir, default $PACKAGE-$VERSION/html]),
-            [test "x$withval" != "x" && HTML_DIR="$HTML_DIR/$withval"],
-            [HTML_DIR="$HTML_DIR/\$(PACKAGE)-\$(VERSION)/html"])
-
-AC_SUBST(HTML_DIR)
-
-AC_ARG_ENABLE(rebuild-docs,
-[  --enable-rebuild-docs[[=yes/no]]  rebuild some generated docs [[default=no]]])
-if test "$enable_rebuild_docs" = "yes" -a "$srcdir" != "."; then
-  AC_MSG_ERROR([cannot rebuild docs when builddir != srcdir])
-fi
-AM_CONDITIONAL([REBUILD_DOCS], [test "$enable_rebuild_docs" = "yes"])
+AM_INIT_AUTOMAKE([1.15 foreign no-dist-gzip dist-xz])
+AM_MAINTAINER_MODE([enable])
+AM_SILENT_RULES([yes])
 
 dnl
 dnl Check the environment
@@ -108,10 +82,11 @@
 AC_PATH_PROG(XSLTPROC, xsltproc, /usr/bin/xsltproc)
 PKG_PROG_PKG_CONFIG
 
-LT_INIT(win32-dll)
+LT_INIT([disable-static win32-dll])
+LT_LIB_M
 
 
-AC_CHECK_HEADERS(sys/types.h sys/time.h stdlib.h unistd.h string.h)
+AC_CHECK_HEADERS(sys/types.h sys/time.h unistd.h)
 
 dnl
 dnl if the system support linker version scripts for symbol versioning
@@ -157,25 +132,14 @@
 dnl Math detection
 dnl
 
-AC_CHECK_HEADERS(ieeefp.h nan.h math.h fp_class.h float.h)
-AC_CHECK_HEADERS(sys/timeb.h time.h sys/stat.h sys/select.h stdarg.h)
-AC_CHECK_HEADERS(errno.h)
+AC_CHECK_HEADERS(sys/timeb.h sys/stat.h sys/select.h)
 AC_CHECK_FUNCS(stat _stat)
-AC_CHECK_FUNC(pow, , AC_CHECK_LIB(m, pow,
-  [M_LIBS="-lm"; AC_DEFINE([HAVE_POW],[], [Define if pow is there])]))
-
-AC_CHECK_FUNC(floor, , AC_CHECK_LIB(m, floor,
-  [M_LIBS="-lm"; AC_DEFINE([HAVE_FLOOR],[], [Define if floor is there])]))
-
-AC_CHECK_FUNC(fabs, , AC_CHECK_LIB(m, fabs,
-  [M_LIBS="-lm"; AC_DEFINE([HAVE_FABS],[], [Define if fabs is there])]))
-
 
 AC_CHECK_FUNCS(gettimeofday)
-AC_CHECK_FUNCS(localtime localtime_r time gmtime gmtime_r ftime)
+AC_CHECK_FUNCS(localtime_r gmtime_r ftime)
 
 dnl Checking the standard string functions availability
-AC_CHECK_FUNCS(printf sprintf fprintf snprintf vfprintf vsprintf vsnprintf sscanf,,
+AC_CHECK_FUNCS(snprintf vsnprintf,,
                NEED_TRIO=1)
 
 dnl Checking for POSIX timers
@@ -216,121 +180,14 @@
 dnl check for python
 dnl
 
-PYTHON_VERSION=
-PYTHON_INCLUDES=
-PYTHON_SITE_PACKAGES=
-PYTHON_TESTS=
-pythondir=
 AC_ARG_WITH(python,
-[  --with-python[[=DIR]]     build Python bindings if found])
-AC_ARG_WITH(python_install_dir,
-[  --with-python-install-dir=DIR
-                          install Python bindings in DIR])
-if test "$with_python" != "no" ; then
-    if test -x "$with_python/bin/python"
-    then
-        echo Found python in $with_python/bin/python
-        PYTHON="$with_python/bin/python"
-    else
-        if test -x "$with_python/python.exe"
-        then
-            echo Found python in $with_python/python.exe
-            PYTHON="$with_python/python.exe"
-        else
-            if test -x "$with_python"
-            then
-                echo Found python in $with_python
-                PYTHON="$with_python"
-            else
-                if test -x "$PYTHON"
-                then
-                    echo Found python in environment PYTHON=$PYTHON
-                    with_python=`$PYTHON -c "import sys; print(sys.exec_prefix)"`
-                else
-                    AC_PATH_PROG(PYTHON, python python2.6 python2.5 python2.4 python2.3 python2.2 python2.1 python2.0 python1.6 python1.5)
-		fi
-	    fi
-	fi
-    fi
-    if test "$PYTHON" != ""
-    then
-        PYTHON_VERSION=`$PYTHON -c "from distutils import sysconfig; print(sysconfig.get_python_version())"`
-	PYTHON_INCLUDES=`$PYTHON -c "from distutils import sysconfig; print(sysconfig.get_python_inc())"`
-# does not work as it produce a /usr/lib/python path instead of/usr/lib64/python
-#
-#	PYTHON_SITE_PACKAGES=`$PYTHON -c "from distutils import sysconfig; print(sysconfig.get_python_lib())"`
-	echo Found Python version $PYTHON_VERSION
-  LIBXML2_PYTHON=`$PYTHON -c "import sys
-try:
-    import libxml2
-    sys.stdout.write('1')
-except:
-    sys.stdout.write('0')
-"`
-	if test "$LIBXML2_PYTHON" = "1"
-	then
-	    echo Found libxml2-python module
-	else
-	    echo Warning: Missing libxml2-python
-  fi
-    fi
-    if test "$PYTHON_VERSION" != "" -a "$PYTHON_INCLUDES" = ""
-    then
-	if test -r $with_python/include/python$PYTHON_VERSION/Python.h
-	then
-	    PYTHON_INCLUDES=$with_python/include/python$PYTHON_VERSION
-	else
-	    if test -r $prefix/include/python$PYTHON_VERSION/Python.h
-	    then
-	        PYTHON_INCLUDES=$prefix/include/python$PYTHON_VERSION
-	    else
-		if test -r /usr/include/python$PYTHON_VERSION/Python.h
-		then
-		    PYTHON_INCLUDES=/usr/include/python$PYTHON_VERSION
-		else
-	            if test -r $with_python/include/Python.h
-	            then
-	                PYTHON_INCLUDES=$with_python/include
-	            else
-		        echo could not find python$PYTHON_VERSION/Python.h or $with_python/include/Python.h
-		    fi
-		fi
-	    fi
-	fi
-    fi
-    if test "$with_python_install_dir" != ""
-    then
-	PYTHON_SITE_PACKAGES="$with_python_install_dir"
-    fi
-    if test "$PYTHON_VERSION" != "" -a "$PYTHON_SITE_PACKAGES" = ""
-    then
-	if test -d $libdir/python$PYTHON_VERSION/site-packages
-	then
-	    PYTHON_SITE_PACKAGES=$libdir/python$PYTHON_VERSION/site-packages
-	else
-	    if test -d $with_python/lib/site-packages
-	    then
-		PYTHON_SITE_PACKAGES=$with_python/lib/site-packages
-	    else
-		PYTHON_SITE_PACKAGES=$($PYTHON -c 'from distutils import sysconfig; print(sysconfig.get_python_lib(True,False,"${exec_prefix}"))')
-	    fi
-	fi
-    fi
-    pythondir='$(PYTHON_SITE_PACKAGES)'
-    PYTHON_LIBS=`python$PYTHON_VERSION-config --ldflags`
-else
-    PYTHON=
-fi
-AM_CONDITIONAL(WITH_PYTHON, test "$PYTHON_INCLUDES" != "")
-if test "$PYTHON_INCLUDES" != ""
-then
-    PYTHON_SUBDIR=python
-else
-    PYTHON_SUBDIR=
-fi
-AC_SUBST(pythondir)
-AC_SUBST(PYTHON_SUBDIR)
-AC_SUBST(PYTHON_LIBS)
+[  --with-python           build Python bindings (on)])
+
+AS_IF([test "x$with_python" != "xno"], [
+    AM_PATH_PYTHON
+    PKG_CHECK_MODULES([PYTHON], [python-${PYTHON_VERSION}])
+])
+AM_CONDITIONAL([WITH_PYTHON], [test "x$with_python" != "xno"])
 
 AC_ARG_WITH(crypto, [  --with-crypto           Add crypto support to exslt (on)])
 WITH_CRYPTO=0
@@ -377,19 +234,6 @@
 AC_SUBST(LIBGCRYPT_CFLAGS)
 AC_SUBST(LIBGCRYPT_LIBS)
 
-dnl
-dnl Debug for DV (-Wunreachable-code)
-dnl
-if [[ "${LOGNAME}" = "veillard" -a "`pwd`" = "/u/veillard/XSLT" ]] || \
-   [[ "${LOGNAME}" = "bill" -a "`pwd`" = "/home/bill/gnomesvn/libxslt" ]]
-   then
-    if test "${with_mem_debug}" = "" ;
-    then
-	with_mem_debug="yes"
-    fi
-    CFLAGS="-Wall -g -O -ansi -pedantic -W -Wunused -Wimplicit -Wreturn-type -Wswitch -Wcomment -Wtrigraphs -Wformat=2 -Wmissing-format-attribute -Wchar-subscripts -Wuninitialized -Wparentheses -Wshadow -Wpointer-arith -Wcast-align -Wwrite-strings -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wnested-externs -Winline "
-fi
-
 AC_ARG_WITH(debug, [  --with-debug            Add the debugging code (on)])
 if test "$with_debug" = "no" ; then
     echo Disabling debug support
@@ -521,7 +365,7 @@
     build_static_libs="no"
 fi
 
-if test "$build_shared_libs" = "no" -a "$build_static_libs" = "no"; then
+if test "$build_shared_libs" = "no" && test "$build_static_libs" = "no"; then
     build_static_libs="yes"
 fi
 
@@ -552,8 +396,8 @@
 dnl Try pkg-config first if nothing is set
 dnl
 
-if test "x$LIBXML_CONFIG_PREFIX" = "x" -a "x$LIBXML_LIBS" = "x"; then
-    if test "$build_static_libs" = "no"; then
+if test "x$LIBXML_CONFIG_PREFIX" = "x" && test "x$LIBXML_LIBS" = "x"; then
+    if test "$build_shared_libs" = "yes"; then
         PKG_CHECK_MODULES([LIBXML], [libxml-2.0 >= $LIBXML_REQUIRED_VERSION], [
             WITH_MODULES="`$PKG_CONFIG --variable=modules libxml-2.0`"
         ], [ ])
@@ -594,10 +438,6 @@
 fi
 
 
-AC_SUBST(CFLAGS)
-AC_SUBST(CPPFLAGS)
-AC_SUBST(LDFLAGS)
-
 AC_ARG_WITH(plugins,
 [  --with-plugins          Add plugin extension support (on)])
 if test "$with_plugins" = ""
@@ -606,7 +446,7 @@
 fi
 
 AC_MSG_CHECKING([whether shared libraries will be built (required for plugins)])
-if test "$build_shared_libs" = "no" -a "$with_plugins" = "yes"; then
+if test "$build_shared_libs" = "no" && test "$with_plugins" = "yes"; then
 	 AC_MSG_RESULT(no)
 	 AC_MSG_WARN([Disabling plugin support.])
 	 AC_MSG_WARN([Plugins require that shared libraries be built.])
@@ -653,19 +493,14 @@
 
 
 AC_SUBST(XSLTPROCDV)
-AC_SUBST(PYTHONSODV)
 AC_SUBST(XML_CONFIG)
 AC_SUBST(LIBXML_LIBS)
 AC_SUBST(LIBXML_CFLAGS)
-AC_SUBST(PYTHON)
-AC_SUBST(PYTHON_VERSION)
-AC_SUBST(PYTHON_INCLUDES)
-AC_SUBST(PYTHON_SITE_PACKAGES)
 
 XSLT_LIBDIR='-L${libdir}'
 XSLT_INCLUDEDIR='-I${includedir}'
 XSLT_LIBS="-lxslt $LIBXML_LIBS"
-XSLT_PRIVATE_LIBS="$M_LIBS"
+XSLT_PRIVATE_LIBS="$LIBM"
 AC_SUBST(XSLT_LIBDIR)
 AC_SUBST(XSLT_INCLUDEDIR)
 AC_SUBST(XSLT_LIBS)
@@ -680,14 +515,10 @@
 
 AC_SUBST(EXTRA_LIBS)
 
-AC_SUBST(M_LIBS)
-
 dnl for the spec file
 RELDATE=`date +'%a %b %e %Y'`
 AC_SUBST(RELDATE)
 
-rm -f COPYING.LIB COPYING 2>/dev/null && $LN_S $srcdir/Copyright COPYING
-
 
 AC_CONFIG_FILES([
 Makefile
diff --git a/third_party/libxslt/src/libexslt/Makefile.am b/third_party/libxslt/src/libexslt/Makefile.am
index c8dae32..46d4371e 100644
--- a/third_party/libxslt/src/libexslt/Makefile.am
+++ b/third_party/libxslt/src/libexslt/Makefile.am
@@ -27,7 +27,7 @@
 	libexslt.h			\
 	dynamic.c
 
-libexslt_la_LIBADD = $(top_builddir)/libxslt/libxslt.la $(LIBXML_LIBS) $(EXTRA_LIBS) $(LIBGCRYPT_LIBS) $(M_LIBS)
+libexslt_la_LIBADD = $(top_builddir)/libxslt/libxslt.la $(LIBXML_LIBS) $(EXTRA_LIBS) $(LIBGCRYPT_LIBS) $(LIBM)
 libexslt_la_LDFLAGS = -version-info $(LIBEXSLT_VERSION_INFO)
 
 man_MANS = libexslt.3
diff --git a/third_party/libxslt/src/libexslt/crypto.c b/third_party/libxslt/src/libexslt/crypto.c
index 1cd2b417..8845a132 100644
--- a/third_party/libxslt/src/libexslt/crypto.c
+++ b/third_party/libxslt/src/libexslt/crypto.c
@@ -102,7 +102,7 @@
     return j;
 }
 
-#if defined(_WIN32) && !defined(__CYGWIN__)
+#if defined(_WIN32)
 
 #define HAVE_CRYPTO
 #define PLATFORM_HASH	exsltCryptoCryptoApiHash
@@ -315,9 +315,6 @@
 #ifdef HAVE_SYS_TYPES_H
 # include <sys/types.h>
 #endif
-#ifdef HAVE_STDINT_H
-# include <stdint.h>
-#endif
 
 #ifdef HAVE_SYS_SELECT_H
 #include <sys/select.h>		/* needed by gcrypt.h 4 Jul 04 */
diff --git a/third_party/libxslt/src/libexslt/date.c b/third_party/libxslt/src/libexslt/date.c
index 8f34a75..60d353d 100644
--- a/third_party/libxslt/src/libexslt/date.c
+++ b/third_party/libxslt/src/libexslt/date.c
@@ -40,13 +40,8 @@
 
 #include <string.h>
 #include <limits.h>
-
-#ifdef HAVE_ERRNO_H
 #include <errno.h>
-#endif
-#ifdef HAVE_MATH_H
 #include <math.h>
-#endif
 
 /* needed to get localtime_r on Solaris */
 #ifdef __sun
@@ -55,9 +50,7 @@
 #endif
 #endif
 
-#ifdef HAVE_TIME_H
 #include <time.h>
-#endif
 
 /*
  * types of date and/or time (from schema datatypes)
@@ -103,19 +96,6 @@
 
 /****************************************************************
  *								*
- *			Compat./Port. macros			*
- *								*
- ****************************************************************/
-
-#if defined(HAVE_TIME_H)					\
-    && (defined(HAVE_LOCALTIME) || defined(HAVE_LOCALTIME_R))	\
-    && (defined(HAVE_GMTIME) || defined(HAVE_GMTIME_R))		\
-    && defined(HAVE_TIME)
-#define WITH_TIME
-#endif
-
-/****************************************************************
- *								*
  *		Convenience macros and functions		*
  *								*
  ****************************************************************/
@@ -729,7 +709,6 @@
     xmlFree(duration);
 }
 
-#ifdef WITH_TIME
 /**
  * exsltDateCurrent:
  *
@@ -745,16 +724,13 @@
     time_t secs;
     int local_s, gm_s;
     exsltDateValPtr ret;
-#ifdef HAVE_ERRNO_H
     char *source_date_epoch;
-#endif /* HAVE_ERRNO_H */
     int override = 0;
 
     ret = exsltDateCreateDate(XS_DATETIME);
     if (ret == NULL)
         return NULL;
 
-#ifdef HAVE_ERRNO_H
     /*
      * Allow the date and time to be set externally by an exported
      * environment variable to enable reproducible builds.
@@ -776,7 +752,6 @@
 #endif
         }
     }
-#endif /* HAVE_ERRNO_H */
 
     if (override == 0) {
     /* get current time */
@@ -843,7 +818,6 @@
 
     return ret;
 }
-#endif
 
 /**
  * exsltDateParse:
@@ -1802,7 +1776,6 @@
 exsltDateDateTime (void)
 {
     xmlChar *ret = NULL;
-#ifdef WITH_TIME
     exsltDateValPtr cur;
 
     cur = exsltDateCurrent();
@@ -1810,7 +1783,6 @@
 	ret = exsltDateFormatDateTime(cur);
 	exsltDateFreeDate(cur);
     }
-#endif
 
     return ret;
 }
@@ -1838,10 +1810,8 @@
     xmlChar *ret = NULL;
 
     if (dateTime == NULL) {
-#ifdef WITH_TIME
 	dt = exsltDateCurrent();
 	if (dt == NULL)
-#endif
 	    return NULL;
     } else {
 	dt = exsltDateParse(dateTime);
@@ -1882,10 +1852,8 @@
     xmlChar *ret = NULL;
 
     if (dateTime == NULL) {
-#ifdef WITH_TIME
 	dt = exsltDateCurrent();
 	if (dt == NULL)
-#endif
 	    return NULL;
     } else {
 	dt = exsltDateParse(dateTime);
@@ -1931,10 +1899,8 @@
     double ret;
 
     if (dateTime == NULL) {
-#ifdef WITH_TIME
 	dt = exsltDateCurrent();
 	if (dt == NULL)
-#endif
 	    return xmlXPathNAN;
     } else {
 	dt = exsltDateParse(dateTime);
@@ -1982,9 +1948,7 @@
     xmlXPathObjectPtr ret;
 
     if (dateTime == NULL) {
-#ifdef WITH_TIME
 	dt = exsltDateCurrent();
-#endif
     } else {
 	dt = exsltDateParse(dateTime);
 	if ((dt != NULL) &&
@@ -2034,10 +1998,8 @@
     double ret;
 
     if (dateTime == NULL) {
-#ifdef WITH_TIME
 	dt = exsltDateCurrent();
 	if (dt == NULL)
-#endif
 	    return xmlXPathNAN;
     } else {
 	dt = exsltDateParse(dateTime);
@@ -2183,10 +2145,8 @@
     long diy, diw, year, ret;
 
     if (dateTime == NULL) {
-#ifdef WITH_TIME
 	dt = exsltDateCurrent();
 	if (dt == NULL)
-#endif
 	    return xmlXPathNAN;
     } else {
 	dt = exsltDateParse(dateTime);
@@ -2251,10 +2211,8 @@
     long fdiy, fdiw, ret;
 
     if (dateTime == NULL) {
-#ifdef WITH_TIME
 	dt = exsltDateCurrent();
 	if (dt == NULL)
-#endif
 	    return xmlXPathNAN;
     } else {
 	dt = exsltDateParse(dateTime);
@@ -2305,10 +2263,8 @@
     long ret;
 
     if (dateTime == NULL) {
-#ifdef WITH_TIME
 	dt = exsltDateCurrent();
 	if (dt == NULL)
-#endif
 	    return xmlXPathNAN;
     } else {
 	dt = exsltDateParse(dateTime);
@@ -2354,10 +2310,8 @@
     double ret;
 
     if (dateTime == NULL) {
-#ifdef WITH_TIME
 	dt = exsltDateCurrent();
 	if (dt == NULL)
-#endif
 	    return xmlXPathNAN;
     } else {
 	dt = exsltDateParse(dateTime);
@@ -2402,10 +2356,8 @@
     long ret;
 
     if (dateTime == NULL) {
-#ifdef WITH_TIME
 	dt = exsltDateCurrent();
 	if (dt == NULL)
-#endif
 	    return xmlXPathNAN;
     } else {
 	dt = exsltDateParse(dateTime);
@@ -2451,10 +2403,8 @@
     long diy, ret;
 
     if (dateTime == NULL) {
-#ifdef WITH_TIME
 	dt = exsltDateCurrent();
 	if (dt == NULL)
-#endif
 	    return xmlXPathNAN;
     } else {
 	dt = exsltDateParse(dateTime);
@@ -2582,10 +2532,8 @@
     double ret;
 
     if (dateTime == NULL) {
-#ifdef WITH_TIME
 	dt = exsltDateCurrent();
 	if (dt == NULL)
-#endif
 	    return xmlXPathNAN;
     } else {
 	dt = exsltDateParse(dateTime);
@@ -2628,10 +2576,8 @@
     double ret;
 
     if (dateTime == NULL) {
-#ifdef WITH_TIME
 	dt = exsltDateCurrent();
 	if (dt == NULL)
-#endif
 	    return xmlXPathNAN;
     } else {
 	dt = exsltDateParse(dateTime);
@@ -2676,10 +2622,8 @@
     double ret;
 
     if (dateTime == NULL) {
-#ifdef WITH_TIME
 	dt = exsltDateCurrent();
 	if (dt == NULL)
-#endif
 	    return xmlXPathNAN;
     } else {
 	dt = exsltDateParse(dateTime);
@@ -2950,10 +2894,8 @@
     double ret = xmlXPathNAN;
 
     if (dateTime == NULL) {
-#ifdef WITH_TIME
 	dt = exsltDateCurrent();
 	if (dt == NULL)
-#endif
 	    return xmlXPathNAN;
     } else {
         dt = exsltDateParse(dateTime);
@@ -3132,7 +3074,6 @@
  *								*
  ****************************************************************/
 
-#ifdef WITH_TIME
 /**
  * exsltDateDateTimeFunction:
  * @ctxt: an XPath parser context
@@ -3156,7 +3097,6 @@
     else
         xmlXPathReturnString(ctxt, ret);
 }
-#endif
 
 /**
  * exsltDateDateFunction:
@@ -3769,11 +3709,9 @@
     xsltRegisterExtModuleFunction ((const xmlChar *) "date",
 				   (const xmlChar *) EXSLT_DATE_NAMESPACE,
 				   exsltDateDateFunction);
-#ifdef WITH_TIME
     xsltRegisterExtModuleFunction ((const xmlChar *) "date-time",
 				   (const xmlChar *) EXSLT_DATE_NAMESPACE,
 				   exsltDateDateTimeFunction);
-#endif
     xsltRegisterExtModuleFunction ((const xmlChar *) "day-abbreviation",
 				   (const xmlChar *) EXSLT_DATE_NAMESPACE,
 				   exsltDateDayAbbreviationFunction);
@@ -3864,12 +3802,10 @@
                                    (const xmlChar *) "date",
                                    (const xmlChar *) EXSLT_DATE_NAMESPACE,
                                    exsltDateDateFunction)
-#ifdef WITH_TIME
         && !xmlXPathRegisterFuncNS(ctxt,
                                    (const xmlChar *) "date-time",
                                    (const xmlChar *) EXSLT_DATE_NAMESPACE,
                                    exsltDateDateTimeFunction)
-#endif
         && !xmlXPathRegisterFuncNS(ctxt,
                                    (const xmlChar *) "day-abbreviation",
                                    (const xmlChar *) EXSLT_DATE_NAMESPACE,
diff --git a/third_party/libxslt/src/libexslt/libexslt.h b/third_party/libxslt/src/libexslt/libexslt.h
index ad9cc74..2957546 100644
--- a/third_party/libxslt/src/libexslt/libexslt.h
+++ b/third_party/libxslt/src/libexslt/libexslt.h
@@ -9,7 +9,7 @@
 #ifndef __XSLT_LIBEXSLT_H__
 #define __XSLT_LIBEXSLT_H__
 
-#if defined(_WIN32) && !defined (__CYGWIN__) && !defined (__MINGW32__)
+#if defined(_WIN32) && !defined (__MINGW32__)
 #include <win32config.h>
 #else
 #include "config.h"
diff --git a/third_party/libxslt/src/libexslt/math.c b/third_party/libxslt/src/libexslt/math.c
index b70f2eb5..17138b20 100644
--- a/third_party/libxslt/src/libexslt/math.c
+++ b/third_party/libxslt/src/libexslt/math.c
@@ -9,13 +9,8 @@
 #include <libxslt/xsltInternals.h>
 #include <libxslt/extensions.h>
 
-#ifdef HAVE_MATH_H
 #include <math.h>
-#endif
-
-#ifdef HAVE_STDLIB_H
 #include <stdlib.h>
-#endif
 
 #include "exslt.h"
 
@@ -453,8 +448,6 @@
     xmlXPathReturnNumber(ctxt, ret);
 }
 
-#if defined(HAVE_STDLIB_H) && defined(RAND_MAX)
-
 /**
  * exsltMathRandom:
  *
@@ -494,10 +487,6 @@
     xmlXPathReturnNumber(ctxt, ret);
 }
 
-#endif /* defined(HAVE_STDLIB_H) && defined(RAND_MAX) */
-
-#if HAVE_MATH_H
-
 /**
  * exsltMathAbs:
  * @num:  a double
@@ -1029,8 +1018,6 @@
     xmlXPathReturnNumber(ctxt, ret);
 }
 
-#endif /* HAVE_MATH_H */
-
 /**
  * exsltMathRegister:
  *
@@ -1051,16 +1038,12 @@
     xsltRegisterExtModuleFunction ((const xmlChar *) "lowest",
 				   EXSLT_MATH_NAMESPACE,
 				   exsltMathLowestFunction);
-    /* register other math functions */
     xsltRegisterExtModuleFunction ((const xmlChar *) "constant",
 				   EXSLT_MATH_NAMESPACE,
 				   exsltMathConstantFunction);
-#ifdef HAVE_STDLIB_H
     xsltRegisterExtModuleFunction ((const xmlChar *) "random",
 				   EXSLT_MATH_NAMESPACE,
 				   exsltMathRandomFunction);
-#endif
-#if HAVE_MATH_H
     xsltRegisterExtModuleFunction ((const xmlChar *) "abs",
 				   EXSLT_MATH_NAMESPACE,
 				   exsltMathAbsFunction);
@@ -1097,7 +1080,6 @@
     xsltRegisterExtModuleFunction ((const xmlChar *) "exp",
 				   EXSLT_MATH_NAMESPACE,
 				   exsltMathExpFunction);
-#endif
 }
 
 /**
@@ -1129,13 +1111,10 @@
                                    (const xmlChar *) "lowest",
                                    (const xmlChar *) EXSLT_MATH_NAMESPACE,
                                    exsltMathLowestFunction)
-#ifdef HAVE_STDLIB_H
         && !xmlXPathRegisterFuncNS(ctxt,
                                    (const xmlChar *) "random",
                                    (const xmlChar *) EXSLT_MATH_NAMESPACE,
                                    exsltMathRandomFunction)
-#endif
-#if HAVE_MATH_H
         && !xmlXPathRegisterFuncNS(ctxt,
                                    (const xmlChar *) "abs",
                                    (const xmlChar *) EXSLT_MATH_NAMESPACE,
@@ -1184,7 +1163,6 @@
                                    (const xmlChar *) "exp",
                                    (const xmlChar *) EXSLT_MATH_NAMESPACE,
                                    exsltMathExpFunction)
-#endif
         && !xmlXPathRegisterFuncNS(ctxt,
                                    (const xmlChar *) "constant",
                                    (const xmlChar *) EXSLT_MATH_NAMESPACE,
diff --git a/third_party/libxslt/src/libxslt.spec b/third_party/libxslt/src/libxslt.spec
index 8b7866b..63d9441 100644
--- a/third_party/libxslt/src/libxslt.spec
+++ b/third_party/libxslt/src/libxslt.spec
@@ -127,5 +127,5 @@
 %doc python/tests/*.xsl
 
 %changelog
-* Mon Mar 28 2022 Daniel Veillard <veillard@redhat.com>
+* Tue May  3 2022 Daniel Veillard <veillard@redhat.com>
 - upstream release 1.1.35
diff --git a/third_party/libxslt/src/libxslt/Makefile.am b/third_party/libxslt/src/libxslt/Makefile.am
index 4e1a0a1..4b131d50 100644
--- a/third_party/libxslt/src/libxslt/Makefile.am
+++ b/third_party/libxslt/src/libxslt/Makefile.am
@@ -59,7 +59,7 @@
 LIBXSLT_VERSION_SCRIPT =
 endif
 
-libxslt_la_LIBADD = $(LIBXML_LIBS) $(EXTRA_LIBS) $(M_LIBS)
+libxslt_la_LIBADD = $(LIBXML_LIBS) $(EXTRA_LIBS) $(LIBM)
 libxslt_la_LDFLAGS =					\
 		$(LIBXSLT_VERSION_SCRIPT)		\
 		-version-info $(LIBXSLT_VERSION_INFO)
diff --git a/third_party/libxslt/src/libxslt/attributes.c b/third_party/libxslt/src/libxslt/attributes.c
index 72c619ae..8a64f3e 100644
--- a/third_party/libxslt/src/libxslt/attributes.c
+++ b/third_party/libxslt/src/libxslt/attributes.c
@@ -14,25 +14,6 @@
 
 #include <string.h>
 
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-#ifdef HAVE_MATH_H
-#include <math.h>
-#endif
-#ifdef HAVE_FLOAT_H
-#include <float.h>
-#endif
-#ifdef HAVE_IEEEFP_H
-#include <ieeefp.h>
-#endif
-#ifdef HAVE_NAN_H
-#include <nan.h>
-#endif
-#ifdef HAVE_CTYPE_H
-#include <ctype.h>
-#endif
-
 #include <libxml/xmlmemory.h>
 #include <libxml/tree.h>
 #include <libxml/hash.h>
diff --git a/third_party/libxslt/src/libxslt/extra.c b/third_party/libxslt/src/libxslt/extra.c
index 461237e7..69f835d9 100644
--- a/third_party/libxslt/src/libxslt/extra.c
+++ b/third_party/libxslt/src/libxslt/extra.c
@@ -14,9 +14,7 @@
 #include "libxslt.h"
 
 #include <string.h>
-#ifdef HAVE_STDLIB_H
 #include <stdlib.h>
-#endif
 
 #include <libxml/xmlmemory.h>
 #include <libxml/tree.h>
diff --git a/third_party/libxslt/src/libxslt/functions.c b/third_party/libxslt/src/libxslt/functions.c
index 7887dda7..933ff88 100644
--- a/third_party/libxslt/src/libxslt/functions.c
+++ b/third_party/libxslt/src/libxslt/functions.c
@@ -15,13 +15,6 @@
 
 #include <string.h>
 
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-#ifdef HAVE_CTYPE_H
-#include <ctype.h>
-#endif
-
 #include <libxml/xmlmemory.h>
 #include <libxml/parser.h>
 #include <libxml/tree.h>
@@ -194,37 +187,18 @@
     xmlXPathFreeContext(xptrctxt);
 #endif /* LIBXML_XPTR_ENABLED */
 
-    if (resObj == NULL)
-	goto out_fragment;
-
-    switch (resObj->type) {
-	case XPATH_NODESET:
-	    break;
-	case XPATH_UNDEFINED:
-	case XPATH_BOOLEAN:
-	case XPATH_NUMBER:
-	case XPATH_STRING:
-	case XPATH_POINT:
-	case XPATH_USERS:
-	case XPATH_XSLT_TREE:
-	case XPATH_RANGE:
-	case XPATH_LOCATIONSET:
-	    xsltTransformError(tctxt, NULL, NULL,
-		"document() : XPointer does not select a node set: #%s\n",
-		fragment);
-	goto out_object;
+    if ((resObj != NULL) && (resObj->type != XPATH_NODESET)) {
+        xsltTransformError(tctxt, NULL, NULL,
+            "document() : XPointer does not select a node set: #%s\n",
+            fragment);
+        xmlXPathFreeObject(resObj);
+        resObj = NULL;
     }
 
+    if (resObj == NULL)
+        resObj = xmlXPathNewNodeSet(NULL);
     valuePush(ctxt, resObj);
     xmlFree(fragment);
-    return;
-
-out_object:
-    xmlXPathFreeObject(resObj);
-
-out_fragment:
-    valuePush(ctxt, xmlXPathNewNodeSet(NULL));
-    xmlFree(fragment);
 }
 
 /**
diff --git a/third_party/libxslt/src/libxslt/imports.c b/third_party/libxslt/src/libxslt/imports.c
index 3783b24..4f5de03 100644
--- a/third_party/libxslt/src/libxslt/imports.c
+++ b/third_party/libxslt/src/libxslt/imports.c
@@ -14,25 +14,6 @@
 
 #include <string.h>
 
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-#ifdef HAVE_MATH_H
-#include <math.h>
-#endif
-#ifdef HAVE_FLOAT_H
-#include <float.h>
-#endif
-#ifdef HAVE_IEEEFP_H
-#include <ieeefp.h>
-#endif
-#ifdef HAVE_NAN_H
-#include <nan.h>
-#endif
-#ifdef HAVE_CTYPE_H
-#include <ctype.h>
-#endif
-
 #include <libxml/xmlmemory.h>
 #include <libxml/tree.h>
 #include <libxml/hash.h>
diff --git a/third_party/libxslt/src/libxslt/libxslt.h b/third_party/libxslt/src/libxslt/libxslt.h
index 5e98158e..2b0c8b0 100644
--- a/third_party/libxslt/src/libxslt/libxslt.h
+++ b/third_party/libxslt/src/libxslt/libxslt.h
@@ -10,7 +10,7 @@
 #ifndef __XSLT_LIBXSLT_H__
 #define __XSLT_LIBXSLT_H__
 
-#if defined(_WIN32) && !defined (__CYGWIN__) && !defined (__MINGW32__)
+#if defined(_WIN32) && !defined (__MINGW32__)
 #include <win32config.h>
 #else
 #include "config.h"
diff --git a/third_party/libxslt/src/libxslt/namespaces.c b/third_party/libxslt/src/libxslt/namespaces.c
index 07a7705b..651c422 100644
--- a/third_party/libxslt/src/libxslt/namespaces.c
+++ b/third_party/libxslt/src/libxslt/namespaces.c
@@ -14,24 +14,6 @@
 
 #include <string.h>
 
-#ifdef HAVE_SYS_TYPES_H
-#include <sys/types.h>
-#endif
-#ifdef HAVE_MATH_H
-#include <math.h>
-#endif
-#ifdef HAVE_FLOAT_H
-#include <float.h>
-#endif
-#ifdef HAVE_IEEEFP_H
-#include <ieeefp.h>
-#endif
-#ifdef HAVE_NAN_H
-#include <nan.h>
-#endif
-#ifdef HAVE_CTYPE_H
-#include <ctype.h>
-#endif
 #ifndef	XSLT_NEED_TRIO
 #include <stdio.h>
 #else
diff --git a/third_party/libxslt/src/libxslt/security.c b/third_party/libxslt/src/libxslt/security.c
index 8e47d4b..1f7187c 100644
--- a/third_party/libxslt/src/libxslt/security.c
+++ b/third_party/libxslt/src/libxslt/security.c
@@ -18,23 +18,7 @@
 #include <sys/stat.h>
 #endif
 
-#ifdef HAVE_MATH_H
-#include <math.h>
-#endif
-#ifdef HAVE_FLOAT_H
-#include <float.h>
-#endif
-#ifdef HAVE_IEEEFP_H
-#include <ieeefp.h>
-#endif
-#ifdef HAVE_NAN_H
-#include <nan.h>
-#endif
-#ifdef HAVE_CTYPE_H
-#include <ctype.h>
-#endif
-
-#if defined(_WIN32) && !defined(__CYGWIN__)
+#if defined(_WIN32)
 #include <windows.h>
 #ifndef INVALID_FILE_ATTRIBUTES
 #define INVALID_FILE_ATTRIBUTES ((DWORD)-1)
@@ -279,7 +263,7 @@
 {
 #ifdef HAVE_STAT
     struct stat stat_buffer;
-#if defined(_WIN32) && !defined(__CYGWIN__)
+#if defined(_WIN32)
     DWORD dwAttrs;
 
     dwAttrs = GetFileAttributesA(path);
@@ -384,7 +368,7 @@
     if ((uri->scheme == NULL) ||
 	(xmlStrEqual(BAD_CAST uri->scheme, BAD_CAST "file"))) {
 
-#if defined(_WIN32) && !defined(__CYGWIN__)
+#if defined(_WIN32)
         if ((uri->path)&&(uri->path[0]=='/')&&
             (uri->path[1]!='\0')&&(uri->path[2]==':'))
             ret = xsltCheckWritePath(sec, ctxt, uri->path+1);
diff --git a/third_party/libxslt/src/libxslt/win32config.h b/third_party/libxslt/src/libxslt/win32config.h
index 8fe7042..54b1822 100644
--- a/third_party/libxslt/src/libxslt/win32config.h
+++ b/third_party/libxslt/src/libxslt/win32config.h
@@ -9,75 +9,6 @@
 #ifndef __LIBXSLT_WIN32_CONFIG__
 #define __LIBXSLT_WIN32_CONFIG__
 
-#define HAVE_CTYPE_H 1
-#define HAVE_STDLIB_H 1
-#define HAVE_STDARG_H 1
-#define HAVE_MALLOC_H 1
-#define HAVE_TIME_H 1
-#define HAVE_LOCALTIME 1
-#define HAVE_GMTIME 1
-#define HAVE_TIME 1
-#define HAVE_MATH_H 1
-#define HAVE_FCNTL_H 1
-
-#include <io.h>
-
-#define HAVE_ISINF
-#define HAVE_ISNAN
-
-#include <math.h>
-#if defined _MSC_VER || defined __MINGW32__
-/* MS C-runtime has functions which can be used in order to determine if
-   a given floating-point variable contains NaN, (+-)INF. These are
-   preferred, because floating-point technology is considered propriatary
-   by MS and we can assume that their functions know more about their
-   oddities than we do. */
-#include <float.h>
-/* Bjorn Reese figured a quite nice construct for isinf() using the
-   _fpclass() function. */
-#ifndef isinf
-#define isinf(d) ((_fpclass(d) == _FPCLASS_PINF) ? 1 \
-	: ((_fpclass(d) == _FPCLASS_NINF) ? -1 : 0))
-#endif
-/* _isnan(x) returns nonzero if (x == NaN) and zero otherwise. */
-#ifndef isnan
-#define isnan(d) (_isnan(d))
-#endif
-#else /* _MSC_VER */
-static int isinf (double d) {
-    int expon = 0;
-    double val = frexp (d, &expon);
-    if (expon == 1025) {
-        if (val == 0.5) {
-            return 1;
-        } else if (val == -0.5) {
-            return -1;
-        } else {
-            return 0;
-        }
-    } else {
-        return 0;
-    }
-}
-static int isnan (double d) {
-    int expon = 0;
-    double val = frexp (d, &expon);
-    if (expon == 1025) {
-        if (val == 0.5) {
-            return 0;
-        } else if (val == -0.5) {
-            return 0;
-        } else {
-            return 1;
-        }
-    } else {
-        return 0;
-    }
-}
-#endif /* _MSC_VER */
-
-#include <direct.h>
-
 /* snprintf emulation taken from http://stackoverflow.com/a/8712996/1956010 */
 #if defined(_MSC_VER) && _MSC_VER < 1900
 
@@ -115,15 +46,6 @@
 
 #define HAVE_SYS_STAT_H
 #define HAVE__STAT
-#define HAVE_STRING_H
-
-#include <libxml/xmlversion.h>
-
-#ifndef ATTRIBUTE_UNUSED
-#define ATTRIBUTE_UNUSED
-#endif
-
-#define _WINSOCKAPI_
 
 #endif /* __LIBXSLT_WIN32_CONFIG__ */
 
diff --git a/third_party/libxslt/src/libxslt/xsltconfig.h b/third_party/libxslt/src/libxslt/xsltconfig.h
index b879e97..9d6d4eb 100644
--- a/third_party/libxslt/src/libxslt/xsltconfig.h
+++ b/third_party/libxslt/src/libxslt/xsltconfig.h
@@ -86,7 +86,6 @@
 #define XSLT_NEED_TRIO
 #endif
 #ifdef __VMS
-#define HAVE_MATH_H 1
 #define HAVE_SYS_STAT_H 1
 #ifndef XSLT_NEED_TRIO
 #define XSLT_NEED_TRIO
diff --git a/third_party/libxslt/src/libxslt/xsltconfig.h.in b/third_party/libxslt/src/libxslt/xsltconfig.h.in
index a5d293a..e115e496 100644
--- a/third_party/libxslt/src/libxslt/xsltconfig.h.in
+++ b/third_party/libxslt/src/libxslt/xsltconfig.h.in
@@ -86,7 +86,6 @@
 #define XSLT_NEED_TRIO
 #endif
 #ifdef __VMS
-#define HAVE_MATH_H 1
 #define HAVE_SYS_STAT_H 1
 #ifndef XSLT_NEED_TRIO
 #define XSLT_NEED_TRIO
diff --git a/third_party/libxslt/src/libxslt/xsltutils.c b/third_party/libxslt/src/libxslt/xsltutils.c
index fdf7dec..f352ca1b 100644
--- a/third_party/libxslt/src/libxslt/xsltutils.c
+++ b/third_party/libxslt/src/libxslt/xsltutils.c
@@ -19,17 +19,16 @@
 #endif
 
 #include <string.h>
+#include <stdlib.h>
+#include <stdarg.h>
 #include <time.h>
+
 #ifdef HAVE_SYS_TIME_H
 #include <sys/time.h>
 #endif
 #ifdef HAVE_UNISTD_H
 #include <unistd.h>
 #endif
-#ifdef HAVE_STDLIB_H
-#include <stdlib.h>
-#endif
-#include <stdarg.h>
 
 #include <libxml/xmlmemory.h>
 #include <libxml/tree.h>
@@ -42,7 +41,7 @@
 #include "imports.h"
 #include "transform.h"
 
-#if defined(_WIN32) && !defined(__CYGWIN__)
+#if defined(_WIN32)
 #define XSLT_WIN32_PERFORMANCE_COUNTER
 #endif
 
diff --git a/third_party/libxslt/src/libxslt/xsltutils.h b/third_party/libxslt/src/libxslt/xsltutils.h
index ea6c374..12e4c75 100644
--- a/third_party/libxslt/src/libxslt/xsltutils.h
+++ b/third_party/libxslt/src/libxslt/xsltutils.h
@@ -13,9 +13,6 @@
 #define __XML_XSLTUTILS_H__
 
 #include <libxslt/xsltconfig.h>
-#ifdef HAVE_STDARG_H
-#include <stdarg.h>
-#endif
 #include <libxml/xpath.h>
 #include <libxml/dict.h>
 #include <libxml/xmlerror.h>
diff --git a/third_party/libxslt/src/m4/libtool.m4 b/third_party/libxslt/src/m4/libtool.m4
new file mode 100644
index 0000000..c4c02946
--- /dev/null
+++ b/third_party/libxslt/src/m4/libtool.m4
@@ -0,0 +1,8394 @@
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+#
+#   Copyright (C) 1996-2001, 2003-2015 Free Software Foundation, Inc.
+#   Written by Gordon Matzigkeit, 1996
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+m4_define([_LT_COPYING], [dnl
+# Copyright (C) 2014 Free Software Foundation, Inc.
+# This is free software; see the source for copying conditions.  There is NO
+# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+# GNU Libtool is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of of the License, or
+# (at your option) any later version.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program or library that is built
+# using GNU Libtool, you may include this file under the  same
+# distribution terms that you use for the rest of that program.
+#
+# GNU Libtool is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+])
+
+# serial 58 LT_INIT
+
+
+# LT_PREREQ(VERSION)
+# ------------------
+# Complain and exit if this libtool version is less that VERSION.
+m4_defun([LT_PREREQ],
+[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,
+       [m4_default([$3],
+		   [m4_fatal([Libtool version $1 or higher is required],
+		             63)])],
+       [$2])])
+
+
+# _LT_CHECK_BUILDDIR
+# ------------------
+# Complain if the absolute build directory name contains unusual characters
+m4_defun([_LT_CHECK_BUILDDIR],
+[case `pwd` in
+  *\ * | *\	*)
+    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;
+esac
+])
+
+
+# LT_INIT([OPTIONS])
+# ------------------
+AC_DEFUN([LT_INIT],
+[AC_PREREQ([2.62])dnl We use AC_PATH_PROGS_FEATURE_CHECK
+AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl
+AC_BEFORE([$0], [LT_LANG])dnl
+AC_BEFORE([$0], [LT_OUTPUT])dnl
+AC_BEFORE([$0], [LTDL_INIT])dnl
+m4_require([_LT_CHECK_BUILDDIR])dnl
+
+dnl Autoconf doesn't catch unexpanded LT_ macros by default:
+m4_pattern_forbid([^_?LT_[A-Z_]+$])dnl
+m4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl
+dnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4
+dnl unless we require an AC_DEFUNed macro:
+AC_REQUIRE([LTOPTIONS_VERSION])dnl
+AC_REQUIRE([LTSUGAR_VERSION])dnl
+AC_REQUIRE([LTVERSION_VERSION])dnl
+AC_REQUIRE([LTOBSOLETE_VERSION])dnl
+m4_require([_LT_PROG_LTMAIN])dnl
+
+_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])
+
+dnl Parse OPTIONS
+_LT_SET_OPTIONS([$0], [$1])
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS=$ltmain
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+_LT_SETUP
+
+# Only expand once:
+m4_define([LT_INIT])
+])# LT_INIT
+
+# Old names:
+AU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])
+AU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PROG_LIBTOOL], [])
+dnl AC_DEFUN([AM_PROG_LIBTOOL], [])
+
+
+# _LT_PREPARE_CC_BASENAME
+# -----------------------
+m4_defun([_LT_PREPARE_CC_BASENAME], [
+# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.
+func_cc_basename ()
+{
+    for cc_temp in @S|@*""; do
+      case $cc_temp in
+        compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+        distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+        \-*) ;;
+        *) break;;
+      esac
+    done
+    func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"`
+}
+])# _LT_PREPARE_CC_BASENAME
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# It would be clearer to call AC_REQUIREs from _LT_PREPARE_CC_BASENAME,
+# but that macro is also expanded into generated libtool script, which
+# arranges for $SED and $ECHO to be set by different means.
+m4_defun([_LT_CC_BASENAME],
+[m4_require([_LT_PREPARE_CC_BASENAME])dnl
+AC_REQUIRE([_LT_DECL_SED])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+func_cc_basename $1
+cc_basename=$func_cc_basename_result
+])
+
+
+# _LT_FILEUTILS_DEFAULTS
+# ----------------------
+# It is okay to use these file commands and assume they have been set
+# sensibly after 'm4_require([_LT_FILEUTILS_DEFAULTS])'.
+m4_defun([_LT_FILEUTILS_DEFAULTS],
+[: ${CP="cp -f"}
+: ${MV="mv -f"}
+: ${RM="rm -f"}
+])# _LT_FILEUTILS_DEFAULTS
+
+
+# _LT_SETUP
+# ---------
+m4_defun([_LT_SETUP],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl
+
+_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl
+dnl
+_LT_DECL([], [host_alias], [0], [The host system])dnl
+_LT_DECL([], [host], [0])dnl
+_LT_DECL([], [host_os], [0])dnl
+dnl
+_LT_DECL([], [build_alias], [0], [The build system])dnl
+_LT_DECL([], [build], [0])dnl
+_LT_DECL([], [build_os], [0])dnl
+dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+dnl
+AC_REQUIRE([AC_PROG_LN_S])dnl
+test -z "$LN_S" && LN_S="ln -s"
+_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl
+dnl
+AC_REQUIRE([LT_CMD_MAX_LEN])dnl
+_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally "o")])dnl
+_LT_DECL([], [exeext], [0], [Executable file suffix (normally "")])dnl
+dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl
+m4_require([_LT_CMD_RELOAD])dnl
+m4_require([_LT_CHECK_MAGIC_METHOD])dnl
+m4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl
+m4_require([_LT_CMD_OLD_ARCHIVE])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_WITH_SYSROOT])dnl
+m4_require([_LT_CMD_TRUNCATE])dnl
+
+_LT_CONFIG_LIBTOOL_INIT([
+# See if we are running on zsh, and set the options that allow our
+# commands through without removal of \ escapes INIT.
+if test -n "\${ZSH_VERSION+set}"; then
+   setopt NO_GLOB_SUBST
+fi
+])
+if test -n "${ZSH_VERSION+set}"; then
+   setopt NO_GLOB_SUBST
+fi
+
+_LT_CHECK_OBJDIR
+
+m4_require([_LT_TAG_COMPILER])dnl
+
+case $host_os in
+aix3*)
+  # AIX sometimes has problems with the GCC collect2 program.  For some
+  # reason, if we set the COLLECT_NAMES environment variable, the problems
+  # vanish in a puff of smoke.
+  if test set != "${COLLECT_NAMES+set}"; then
+    COLLECT_NAMES=
+    export COLLECT_NAMES
+  fi
+  ;;
+esac
+
+# Global variables:
+ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a '.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+
+with_gnu_ld=$lt_cv_prog_gnu_ld
+
+old_CC=$CC
+old_CFLAGS=$CFLAGS
+
+# Set sane defaults for various variables
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$LD" && LD=ld
+test -z "$ac_objext" && ac_objext=o
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+case $deplibs_check_method in
+file_magic*)
+  if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+    _LT_PATH_MAGIC
+  fi
+  ;;
+esac
+
+# Use C for the default configuration in the libtool script
+LT_SUPPORTED_TAG([CC])
+_LT_LANG_C_CONFIG
+_LT_LANG_DEFAULT_CONFIG
+_LT_CONFIG_COMMANDS
+])# _LT_SETUP
+
+
+# _LT_PREPARE_SED_QUOTE_VARS
+# --------------------------
+# Define a few sed substitution that help us do robust quoting.
+m4_defun([_LT_PREPARE_SED_QUOTE_VARS],
+[# Backslashify metacharacters that are still active within
+# double-quoted strings.
+sed_quote_subst='s/\([["`$\\]]\)/\\\1/g'
+
+# Same as above, but do not quote variable references.
+double_quote_subst='s/\([["`\\]]\)/\\\1/g'
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to delay expansion of an escaped single quote.
+delay_single_quote_subst='s/'\''/'\'\\\\\\\'\''/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+])
+
+# _LT_PROG_LTMAIN
+# ---------------
+# Note that this code is called both from 'configure', and 'config.status'
+# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,
+# 'config.status' has no value for ac_aux_dir unless we are using Automake,
+# so we pass a copy along to make sure it has a sensible value anyway.
+m4_defun([_LT_PROG_LTMAIN],
+[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl
+_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])
+ltmain=$ac_aux_dir/ltmain.sh
+])# _LT_PROG_LTMAIN
+
+
+## ------------------------------------- ##
+## Accumulate code for creating libtool. ##
+## ------------------------------------- ##
+
+# So that we can recreate a full libtool script including additional
+# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS
+# in macros and then make a single call at the end using the 'libtool'
+# label.
+
+
+# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])
+# ----------------------------------------
+# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL_INIT],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_INIT])
+
+
+# _LT_CONFIG_LIBTOOL([COMMANDS])
+# ------------------------------
+# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.
+m4_define([_LT_CONFIG_LIBTOOL],
+[m4_ifval([$1],
+          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],
+                     [$1
+])])])
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])
+
+
+# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])
+# -----------------------------------------------------
+m4_defun([_LT_CONFIG_SAVE_COMMANDS],
+[_LT_CONFIG_LIBTOOL([$1])
+_LT_CONFIG_LIBTOOL_INIT([$2])
+])
+
+
+# _LT_FORMAT_COMMENT([COMMENT])
+# -----------------------------
+# Add leading comment marks to the start of each line, and a trailing
+# full-stop to the whole comment if one is not present already.
+m4_define([_LT_FORMAT_COMMENT],
+[m4_ifval([$1], [
+m4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],
+              [['`$\]], [\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])
+)])
+
+
+
+## ------------------------ ##
+## FIXME: Eliminate VARNAME ##
+## ------------------------ ##
+
+
+# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])
+# -------------------------------------------------------------------
+# CONFIGNAME is the name given to the value in the libtool script.
+# VARNAME is the (base) name used in the configure script.
+# VALUE may be 0, 1 or 2 for a computed quote escaped value based on
+# VARNAME.  Any other value will be used directly.
+m4_define([_LT_DECL],
+[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],
+    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],
+	[m4_ifval([$1], [$1], [$2])])
+    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])
+    m4_ifval([$4],
+	[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])
+    lt_dict_add_subkey([lt_decl_dict], [$2],
+	[tagged?], [m4_ifval([$5], [yes], [no])])])
+])
+
+
+# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])
+# --------------------------------------------------------
+m4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])
+
+
+# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_tag_varnames],
+[_lt_decl_filter([tagged?], [yes], $@)])
+
+
+# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])
+# ---------------------------------------------------------
+m4_define([_lt_decl_filter],
+[m4_case([$#],
+  [0], [m4_fatal([$0: too few arguments: $#])],
+  [1], [m4_fatal([$0: too few arguments: $#: $1])],
+  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],
+  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],
+  [lt_dict_filter([lt_decl_dict], $@)])[]dnl
+])
+
+
+# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])
+# --------------------------------------------------
+m4_define([lt_decl_quote_varnames],
+[_lt_decl_filter([value], [1], $@)])
+
+
+# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_dquote_varnames],
+[_lt_decl_filter([value], [2], $@)])
+
+
+# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])
+# ---------------------------------------------------
+m4_define([lt_decl_varnames_tagged],
+[m4_assert([$# <= 2])dnl
+_$0(m4_quote(m4_default([$1], [[, ]])),
+    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),
+    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])
+m4_define([_lt_decl_varnames_tagged],
+[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])
+
+
+# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])
+# ------------------------------------------------
+m4_define([lt_decl_all_varnames],
+[_$0(m4_quote(m4_default([$1], [[, ]])),
+     m4_if([$2], [],
+	   m4_quote(lt_decl_varnames),
+	m4_quote(m4_shift($@))))[]dnl
+])
+m4_define([_lt_decl_all_varnames],
+[lt_join($@, lt_decl_varnames_tagged([$1],
+			lt_decl_tag_varnames([[, ]], m4_shift($@))))dnl
+])
+
+
+# _LT_CONFIG_STATUS_DECLARE([VARNAME])
+# ------------------------------------
+# Quote a variable value, and forward it to 'config.status' so that its
+# declaration there will have the same value as in 'configure'.  VARNAME
+# must have a single quote delimited value for this to work.
+m4_define([_LT_CONFIG_STATUS_DECLARE],
+[$1='`$ECHO "$][$1" | $SED "$delay_single_quote_subst"`'])
+
+
+# _LT_CONFIG_STATUS_DECLARATIONS
+# ------------------------------
+# We delimit libtool config variables with single quotes, so when
+# we write them to config.status, we have to be sure to quote all
+# embedded single quotes properly.  In configure, this macro expands
+# each variable declared with _LT_DECL (and _LT_TAGDECL) into:
+#
+#    <var>='`$ECHO "$<var>" | $SED "$delay_single_quote_subst"`'
+m4_defun([_LT_CONFIG_STATUS_DECLARATIONS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),
+    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAGS
+# ----------------
+# Output comment and list of tags supported by the script
+m4_defun([_LT_LIBTOOL_TAGS],
+[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl
+available_tags='_LT_TAGS'dnl
+])
+
+
+# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])
+# -----------------------------------
+# Extract the dictionary values for VARNAME (optionally with TAG) and
+# expand to a commented shell variable setting:
+#
+#    # Some comment about what VAR is for.
+#    visible_name=$lt_internal_name
+m4_define([_LT_LIBTOOL_DECLARE],
+[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],
+					   [description])))[]dnl
+m4_pushdef([_libtool_name],
+    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl
+m4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),
+    [0], [_libtool_name=[$]$1],
+    [1], [_libtool_name=$lt_[]$1],
+    [2], [_libtool_name=$lt_[]$1],
+    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl
+m4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl
+])
+
+
+# _LT_LIBTOOL_CONFIG_VARS
+# -----------------------
+# Produce commented declarations of non-tagged libtool config variables
+# suitable for insertion in the LIBTOOL CONFIG section of the 'libtool'
+# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG
+# section) are produced by _LT_LIBTOOL_TAG_VARS.
+m4_defun([_LT_LIBTOOL_CONFIG_VARS],
+[m4_foreach([_lt_var],
+    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])
+
+
+# _LT_LIBTOOL_TAG_VARS(TAG)
+# -------------------------
+m4_define([_LT_LIBTOOL_TAG_VARS],
+[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),
+    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])
+
+
+# _LT_TAGVAR(VARNAME, [TAGNAME])
+# ------------------------------
+m4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])
+
+
+# _LT_CONFIG_COMMANDS
+# -------------------
+# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of
+# variables for single and double quote escaping we saved from calls
+# to _LT_DECL, we can put quote escaped variables declarations
+# into 'config.status', and then the shell code to quote escape them in
+# for loops in 'config.status'.  Finally, any additional code accumulated
+# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.
+m4_defun([_LT_CONFIG_COMMANDS],
+[AC_PROVIDE_IFELSE([LT_OUTPUT],
+	dnl If the libtool generation code has been placed in $CONFIG_LT,
+	dnl instead of duplicating it all over again into config.status,
+	dnl then we will have config.status run $CONFIG_LT later, so it
+	dnl needs to know what name is stored there:
+        [AC_CONFIG_COMMANDS([libtool],
+            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],
+    dnl If the libtool generation code is destined for config.status,
+    dnl expand the accumulated commands and init code now:
+    [AC_CONFIG_COMMANDS([libtool],
+        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])
+])#_LT_CONFIG_COMMANDS
+
+
+# Initialize.
+m4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],
+[
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+sed_quote_subst='$sed_quote_subst'
+double_quote_subst='$double_quote_subst'
+delay_variable_subst='$delay_variable_subst'
+_LT_CONFIG_STATUS_DECLARATIONS
+LTCC='$LTCC'
+LTCFLAGS='$LTCFLAGS'
+compiler='$compiler_DEFAULT'
+
+# A function that is used when there is no print builtin or printf.
+func_fallback_echo ()
+{
+  eval 'cat <<_LTECHO_EOF
+\$[]1
+_LTECHO_EOF'
+}
+
+# Quote evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_quote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED \\"\\\$sed_quote_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+# Double-quote double-evaled strings.
+for var in lt_decl_all_varnames([[ \
+]], lt_decl_dquote_varnames); do
+    case \`eval \\\\\$ECHO \\\\""\\\\\$\$var"\\\\"\` in
+    *[[\\\\\\\`\\"\\\$]]*)
+      eval "lt_\$var=\\\\\\"\\\`\\\$ECHO \\"\\\$\$var\\" | \\\$SED -e \\"\\\$double_quote_subst\\" -e \\"\\\$sed_quote_subst\\" -e \\"\\\$delay_variable_subst\\"\\\`\\\\\\"" ## exclude from sc_prohibit_nested_quotes
+      ;;
+    *)
+      eval "lt_\$var=\\\\\\"\\\$\$var\\\\\\""
+      ;;
+    esac
+done
+
+_LT_OUTPUT_LIBTOOL_INIT
+])
+
+# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])
+# ------------------------------------
+# Generate a child script FILE with all initialization necessary to
+# reuse the environment learned by the parent script, and make the
+# file executable.  If COMMENT is supplied, it is inserted after the
+# '#!' sequence but before initialization text begins.  After this
+# macro, additional text can be appended to FILE to form the body of
+# the child script.  The macro ends with non-zero status if the
+# file could not be fully written (such as if the disk is full).
+m4_ifdef([AS_INIT_GENERATED],
+[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],
+[m4_defun([_LT_GENERATED_FILE_INIT],
+[m4_require([AS_PREPARE])]dnl
+[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl
+[lt_write_fail=0
+cat >$1 <<_ASEOF || lt_write_fail=1
+#! $SHELL
+# Generated by $as_me.
+$2
+SHELL=\${CONFIG_SHELL-$SHELL}
+export SHELL
+_ASEOF
+cat >>$1 <<\_ASEOF || lt_write_fail=1
+AS_SHELL_SANITIZE
+_AS_PREPARE
+exec AS_MESSAGE_FD>&1
+_ASEOF
+test 0 = "$lt_write_fail" && chmod +x $1[]dnl
+m4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT
+
+# LT_OUTPUT
+# ---------
+# This macro allows early generation of the libtool script (before
+# AC_OUTPUT is called), incase it is used in configure for compilation
+# tests.
+AC_DEFUN([LT_OUTPUT],
+[: ${CONFIG_LT=./config.lt}
+AC_MSG_NOTICE([creating $CONFIG_LT])
+_LT_GENERATED_FILE_INIT(["$CONFIG_LT"],
+[# Run this file to recreate a libtool stub with the current configuration.])
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+lt_cl_silent=false
+exec AS_MESSAGE_LOG_FD>>config.log
+{
+  echo
+  AS_BOX([Running $as_me.])
+} >&AS_MESSAGE_LOG_FD
+
+lt_cl_help="\
+'$as_me' creates a local libtool stub from the current configuration,
+for use in further configure time tests before the real libtool is
+generated.
+
+Usage: $[0] [[OPTIONS]]
+
+  -h, --help      print this help, then exit
+  -V, --version   print version number, then exit
+  -q, --quiet     do not print progress messages
+  -d, --debug     don't remove temporary files
+
+Report bugs to <bug-libtool@gnu.org>."
+
+lt_cl_version="\
+m4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl
+m4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])
+configured by $[0], generated by m4_PACKAGE_STRING.
+
+Copyright (C) 2011 Free Software Foundation, Inc.
+This config.lt script is free software; the Free Software Foundation
+gives unlimited permision to copy, distribute and modify it."
+
+while test 0 != $[#]
+do
+  case $[1] in
+    --version | --v* | -V )
+      echo "$lt_cl_version"; exit 0 ;;
+    --help | --h* | -h )
+      echo "$lt_cl_help"; exit 0 ;;
+    --debug | --d* | -d )
+      debug=: ;;
+    --quiet | --q* | --silent | --s* | -q )
+      lt_cl_silent=: ;;
+
+    -*) AC_MSG_ERROR([unrecognized option: $[1]
+Try '$[0] --help' for more information.]) ;;
+
+    *) AC_MSG_ERROR([unrecognized argument: $[1]
+Try '$[0] --help' for more information.]) ;;
+  esac
+  shift
+done
+
+if $lt_cl_silent; then
+  exec AS_MESSAGE_FD>/dev/null
+fi
+_LTEOF
+
+cat >>"$CONFIG_LT" <<_LTEOF
+_LT_OUTPUT_LIBTOOL_COMMANDS_INIT
+_LTEOF
+
+cat >>"$CONFIG_LT" <<\_LTEOF
+AC_MSG_NOTICE([creating $ofile])
+_LT_OUTPUT_LIBTOOL_COMMANDS
+AS_EXIT(0)
+_LTEOF
+chmod +x "$CONFIG_LT"
+
+# configure is writing to config.log, but config.lt does its own redirection,
+# appending to config.log, which fails on DOS, as config.log is still kept
+# open by configure.  Here we exec the FD to /dev/null, effectively closing
+# config.log, so it can be properly (re)opened and appended to by config.lt.
+lt_cl_success=:
+test yes = "$silent" &&
+  lt_config_lt_args="$lt_config_lt_args --quiet"
+exec AS_MESSAGE_LOG_FD>/dev/null
+$SHELL "$CONFIG_LT" $lt_config_lt_args || lt_cl_success=false
+exec AS_MESSAGE_LOG_FD>>config.log
+$lt_cl_success || AS_EXIT(1)
+])# LT_OUTPUT
+
+
+# _LT_CONFIG(TAG)
+# ---------------
+# If TAG is the built-in tag, create an initial libtool script with a
+# default configuration from the untagged config vars.  Otherwise add code
+# to config.status for appending the configuration named by TAG from the
+# matching tagged config vars.
+m4_defun([_LT_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_CONFIG_SAVE_COMMANDS([
+  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl
+  m4_if(_LT_TAG, [C], [
+    # See if we are running on zsh, and set the options that allow our
+    # commands through without removal of \ escapes.
+    if test -n "${ZSH_VERSION+set}"; then
+      setopt NO_GLOB_SUBST
+    fi
+
+    cfgfile=${ofile}T
+    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
+    $RM "$cfgfile"
+
+    cat <<_LT_EOF >> "$cfgfile"
+#! $SHELL
+# Generated automatically by $as_me ($PACKAGE) $VERSION
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+
+# Provide generalized library-building support services.
+# Written by Gordon Matzigkeit, 1996
+
+_LT_COPYING
+_LT_LIBTOOL_TAGS
+
+# Configured defaults for sys_lib_dlsearch_path munging.
+: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"}
+
+# ### BEGIN LIBTOOL CONFIG
+_LT_LIBTOOL_CONFIG_VARS
+_LT_LIBTOOL_TAG_VARS
+# ### END LIBTOOL CONFIG
+
+_LT_EOF
+
+    cat <<'_LT_EOF' >> "$cfgfile"
+
+# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_PREPARE_MUNGE_PATH_LIST
+_LT_PREPARE_CC_BASENAME
+
+# ### END FUNCTIONS SHARED WITH CONFIGURE
+
+_LT_EOF
+
+  case $host_os in
+  aix3*)
+    cat <<\_LT_EOF >> "$cfgfile"
+# AIX sometimes has problems with the GCC collect2 program.  For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test set != "${COLLECT_NAMES+set}"; then
+  COLLECT_NAMES=
+  export COLLECT_NAMES
+fi
+_LT_EOF
+    ;;
+  esac
+
+  _LT_PROG_LTMAIN
+
+  # We use sed instead of cat because bash on DJGPP gets confused if
+  # if finds mixed CR/LF and LF-only lines.  Since sed operates in
+  # text mode, it properly converts lines to CR/LF.  This bash problem
+  # is reportedly fixed, but why not run on old versions too?
+  sed '$q' "$ltmain" >> "$cfgfile" \
+     || (rm -f "$cfgfile"; exit 1)
+
+   mv -f "$cfgfile" "$ofile" ||
+    (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+  chmod +x "$ofile"
+],
+[cat <<_LT_EOF >> "$ofile"
+
+dnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded
+dnl in a comment (ie after a #).
+# ### BEGIN LIBTOOL TAG CONFIG: $1
+_LT_LIBTOOL_TAG_VARS(_LT_TAG)
+# ### END LIBTOOL TAG CONFIG: $1
+_LT_EOF
+])dnl /m4_if
+],
+[m4_if([$1], [], [
+    PACKAGE='$PACKAGE'
+    VERSION='$VERSION'
+    RM='$RM'
+    ofile='$ofile'], [])
+])dnl /_LT_CONFIG_SAVE_COMMANDS
+])# _LT_CONFIG
+
+
+# LT_SUPPORTED_TAG(TAG)
+# ---------------------
+# Trace this macro to discover what tags are supported by the libtool
+# --tag option, using:
+#    autoconf --trace 'LT_SUPPORTED_TAG:$1'
+AC_DEFUN([LT_SUPPORTED_TAG], [])
+
+
+# C support is built-in for now
+m4_define([_LT_LANG_C_enabled], [])
+m4_define([_LT_TAGS], [])
+
+
+# LT_LANG(LANG)
+# -------------
+# Enable libtool support for the given language if not already enabled.
+AC_DEFUN([LT_LANG],
+[AC_BEFORE([$0], [LT_OUTPUT])dnl
+m4_case([$1],
+  [C],			[_LT_LANG(C)],
+  [C++],		[_LT_LANG(CXX)],
+  [Go],			[_LT_LANG(GO)],
+  [Java],		[_LT_LANG(GCJ)],
+  [Fortran 77],		[_LT_LANG(F77)],
+  [Fortran],		[_LT_LANG(FC)],
+  [Windows Resource],	[_LT_LANG(RC)],
+  [m4_ifdef([_LT_LANG_]$1[_CONFIG],
+    [_LT_LANG($1)],
+    [m4_fatal([$0: unsupported language: "$1"])])])dnl
+])# LT_LANG
+
+
+# _LT_LANG(LANGNAME)
+# ------------------
+m4_defun([_LT_LANG],
+[m4_ifdef([_LT_LANG_]$1[_enabled], [],
+  [LT_SUPPORTED_TAG([$1])dnl
+  m4_append([_LT_TAGS], [$1 ])dnl
+  m4_define([_LT_LANG_]$1[_enabled], [])dnl
+  _LT_LANG_$1_CONFIG($1)])dnl
+])# _LT_LANG
+
+
+m4_ifndef([AC_PROG_GO], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_GO.  When it is available in    #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+m4_defun([AC_PROG_GO],
+[AC_LANG_PUSH(Go)dnl
+AC_ARG_VAR([GOC],     [Go compiler command])dnl
+AC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl
+_AC_ARG_VAR_LDFLAGS()dnl
+AC_CHECK_TOOL(GOC, gccgo)
+if test -z "$GOC"; then
+  if test -n "$ac_tool_prefix"; then
+    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])
+  fi
+fi
+if test -z "$GOC"; then
+  AC_CHECK_PROG(GOC, gccgo, gccgo, false)
+fi
+])#m4_defun
+])#m4_ifndef
+
+
+# _LT_LANG_DEFAULT_CONFIG
+# -----------------------
+m4_defun([_LT_LANG_DEFAULT_CONFIG],
+[AC_PROVIDE_IFELSE([AC_PROG_CXX],
+  [LT_LANG(CXX)],
+  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_F77],
+  [LT_LANG(F77)],
+  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])
+
+AC_PROVIDE_IFELSE([AC_PROG_FC],
+  [LT_LANG(FC)],
+  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])
+
+dnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal
+dnl pulling things in needlessly.
+AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+  [LT_LANG(GCJ)],
+  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+    [LT_LANG(GCJ)],
+    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],
+      [LT_LANG(GCJ)],
+      [m4_ifdef([AC_PROG_GCJ],
+	[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([A][M_PROG_GCJ],
+	[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])
+       m4_ifdef([LT_PROG_GCJ],
+	[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])
+
+AC_PROVIDE_IFELSE([AC_PROG_GO],
+  [LT_LANG(GO)],
+  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])
+
+AC_PROVIDE_IFELSE([LT_PROG_RC],
+  [LT_LANG(RC)],
+  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])
+])# _LT_LANG_DEFAULT_CONFIG
+
+# Obsolete macros:
+AU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])
+AU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])
+AU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])
+AU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])
+AU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_CXX], [])
+dnl AC_DEFUN([AC_LIBTOOL_F77], [])
+dnl AC_DEFUN([AC_LIBTOOL_FC], [])
+dnl AC_DEFUN([AC_LIBTOOL_GCJ], [])
+dnl AC_DEFUN([AC_LIBTOOL_RC], [])
+
+
+# _LT_TAG_COMPILER
+# ----------------
+m4_defun([_LT_TAG_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl
+_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl
+_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl
+_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_TAG_COMPILER
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+m4_defun([_LT_COMPILER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$RM conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+m4_defun([_LT_LINKER_BOILERPLATE],
+[m4_require([_LT_DECL_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$RM -r conftest*
+])# _LT_LINKER_BOILERPLATE
+
+# _LT_REQUIRED_DARWIN_CHECKS
+# -------------------------
+m4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[
+  case $host_os in
+    rhapsody* | darwin*)
+    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])
+    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])
+    AC_CHECK_TOOL([LIPO], [lipo], [:])
+    AC_CHECK_TOOL([OTOOL], [otool], [:])
+    AC_CHECK_TOOL([OTOOL64], [otool64], [:])
+    _LT_DECL([], [DSYMUTIL], [1],
+      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])
+    _LT_DECL([], [NMEDIT], [1],
+      [Tool to change global to local symbols on Mac OS X])
+    _LT_DECL([], [LIPO], [1],
+      [Tool to manipulate fat objects and archives on Mac OS X])
+    _LT_DECL([], [OTOOL], [1],
+      [ldd/readelf like tool for Mach-O binaries on Mac OS X])
+    _LT_DECL([], [OTOOL64], [1],
+      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])
+
+    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],
+      [lt_cv_apple_cc_single_mod=no
+      if test -z "$LT_MULTI_MODULE"; then
+	# By default we will add the -single_module flag. You can override
+	# by either setting the environment variable LT_MULTI_MODULE
+	# non-empty at configure time, or by adding -multi_module to the
+	# link flags.
+	rm -rf libconftest.dylib*
+	echo "int foo(void){return 1;}" > conftest.c
+	echo "$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+-dynamiclib -Wl,-single_module conftest.c" >&AS_MESSAGE_LOG_FD
+	$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \
+	  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err
+        _lt_result=$?
+	# If there is a non-empty error log, and "single_module"
+	# appears in it, assume the flag caused a linker warning
+        if test -s conftest.err && $GREP single_module conftest.err; then
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	# Otherwise, if the output was created with a 0 exit code from
+	# the compiler, it worked.
+	elif test -f libconftest.dylib && test 0 = "$_lt_result"; then
+	  lt_cv_apple_cc_single_mod=yes
+	else
+	  cat conftest.err >&AS_MESSAGE_LOG_FD
+	fi
+	rm -rf libconftest.dylib*
+	rm -f conftest.*
+      fi])
+
+    AC_CACHE_CHECK([for -exported_symbols_list linker flag],
+      [lt_cv_ld_exported_symbols_list],
+      [lt_cv_ld_exported_symbols_list=no
+      save_LDFLAGS=$LDFLAGS
+      echo "_main" > conftest.sym
+      LDFLAGS="$LDFLAGS -Wl,-exported_symbols_list,conftest.sym"
+      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+	[lt_cv_ld_exported_symbols_list=yes],
+	[lt_cv_ld_exported_symbols_list=no])
+	LDFLAGS=$save_LDFLAGS
+    ])
+
+    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],
+      [lt_cv_ld_force_load=no
+      cat > conftest.c << _LT_EOF
+int forced_loaded() { return 2;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS -c -o conftest.o conftest.c" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD
+      echo "$AR cr libconftest.a conftest.o" >&AS_MESSAGE_LOG_FD
+      $AR cr libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD
+      echo "$RANLIB libconftest.a" >&AS_MESSAGE_LOG_FD
+      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD
+      cat > conftest.c << _LT_EOF
+int main() { return 0;}
+_LT_EOF
+      echo "$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a" >&AS_MESSAGE_LOG_FD
+      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err
+      _lt_result=$?
+      if test -s conftest.err && $GREP force_load conftest.err; then
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      elif test -f conftest && test 0 = "$_lt_result" && $GREP forced_load conftest >/dev/null 2>&1; then
+	lt_cv_ld_force_load=yes
+      else
+	cat conftest.err >&AS_MESSAGE_LOG_FD
+      fi
+        rm -f conftest.err libconftest.a conftest conftest.c
+        rm -rf conftest.dSYM
+    ])
+    case $host_os in
+    rhapsody* | darwin1.[[012]])
+      _lt_dar_allow_undefined='$wl-undefined ${wl}suppress' ;;
+    darwin1.*)
+      _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+    darwin*) # darwin 5.x on
+      # if running on 10.5 or later, the deployment target defaults
+      # to the OS version, if on x86, and 10.4, the deployment
+      # target defaults to 10.4. Don't you love it?
+      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in
+	10.0,*86*-darwin8*|10.0,*-darwin[[912]]*)
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+	10.[[012]][[,.]]*)
+	  _lt_dar_allow_undefined='$wl-flat_namespace $wl-undefined ${wl}suppress' ;;
+	10.*|11.*)
+	  _lt_dar_allow_undefined='$wl-undefined ${wl}dynamic_lookup' ;;
+      esac
+    ;;
+  esac
+    if test yes = "$lt_cv_apple_cc_single_mod"; then
+      _lt_dar_single_mod='$single_module'
+    fi
+    if test yes = "$lt_cv_ld_exported_symbols_list"; then
+      _lt_dar_export_syms=' $wl-exported_symbols_list,$output_objdir/$libname-symbols.expsym'
+    else
+      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/$libname-symbols.expsym $lib'
+    fi
+    if test : != "$DSYMUTIL" && test no = "$lt_cv_ld_force_load"; then
+      _lt_dsymutil='~$DSYMUTIL $lib || :'
+    else
+      _lt_dsymutil=
+    fi
+    ;;
+  esac
+])
+
+
+# _LT_DARWIN_LINKER_FEATURES([TAG])
+# ---------------------------------
+# Checks for linker and compiler features on darwin
+m4_defun([_LT_DARWIN_LINKER_FEATURES],
+[
+  m4_require([_LT_REQUIRED_DARWIN_CHECKS])
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_automatic, $1)=yes
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  if test yes = "$lt_cv_ld_force_load"; then
+    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience $wl-force_load,$conv\"; done; func_echo_all \"$new_convenience\"`'
+    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],
+                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])
+  else
+    _LT_TAGVAR(whole_archive_flag_spec, $1)=''
+  fi
+  _LT_TAGVAR(link_all_deplibs, $1)=yes
+  _LT_TAGVAR(allow_undefined_flag, $1)=$_lt_dar_allow_undefined
+  case $cc_basename in
+     ifort*|nagfor*) _lt_dar_can_shared=yes ;;
+     *) _lt_dar_can_shared=$GCC ;;
+  esac
+  if test yes = "$_lt_dar_can_shared"; then
+    output_verbose_link_cmd=func_echo_all
+    _LT_TAGVAR(archive_cmds, $1)="\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dsymutil"
+    _LT_TAGVAR(module_cmds, $1)="\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dsymutil"
+    _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$libobjs \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring $_lt_dar_single_mod$_lt_dar_export_syms$_lt_dsymutil"
+    _LT_TAGVAR(module_expsym_cmds, $1)="sed -e 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC \$allow_undefined_flag -o \$lib -bundle \$libobjs \$deplibs \$compiler_flags$_lt_dar_export_syms$_lt_dsymutil"
+    m4_if([$1], [CXX],
+[   if test yes != "$lt_cv_apple_cc_single_mod"; then
+      _LT_TAGVAR(archive_cmds, $1)="\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dsymutil"
+      _LT_TAGVAR(archive_expsym_cmds, $1)="sed 's|^|_|' < \$export_symbols > \$output_objdir/\$libname-symbols.expsym~\$CC -r -keep_private_externs -nostdlib -o \$lib-master.o \$libobjs~\$CC -dynamiclib \$allow_undefined_flag -o \$lib \$lib-master.o \$deplibs \$compiler_flags -install_name \$rpath/\$soname \$verstring$_lt_dar_export_syms$_lt_dsymutil"
+    fi
+],[])
+  else
+  _LT_TAGVAR(ld_shlibs, $1)=no
+  fi
+])
+
+# _LT_SYS_MODULE_PATH_AIX([TAGNAME])
+# ----------------------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+# Store the results from the different compilers for each TAGNAME.
+# Allow to override them for all tags through lt_cv_aix_libpath.
+m4_defun([_LT_SYS_MODULE_PATH_AIX],
+[m4_require([_LT_DECL_SED])dnl
+if test set = "${lt_cv_aix_libpath+set}"; then
+  aix_libpath=$lt_cv_aix_libpath
+else
+  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],
+  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[
+  lt_aix_libpath_sed='[
+      /Import File Strings/,/^$/ {
+	  /^0/ {
+	      s/^0  *\([^ ]*\) *$/\1/
+	      p
+	  }
+      }]'
+  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  # Check for a 64-bit object if we didn't find anything.
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+  fi],[])
+  if test -z "$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])"; then
+    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=/usr/lib:/lib
+  fi
+  ])
+  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])
+fi
+])# _LT_SYS_MODULE_PATH_AIX
+
+
+# _LT_SHELL_INIT(ARG)
+# -------------------
+m4_define([_LT_SHELL_INIT],
+[m4_divert_text([M4SH-INIT], [$1
+])])# _LT_SHELL_INIT
+
+
+
+# _LT_PROG_ECHO_BACKSLASH
+# -----------------------
+# Find how we can fake an echo command that does not interpret backslash.
+# In particular, with Autoconf 2.60 or later we add some code to the start
+# of the generated configure script that will find a shell with a builtin
+# printf (that we can use as an echo command).
+m4_defun([_LT_PROG_ECHO_BACKSLASH],
+[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+
+AC_MSG_CHECKING([how to print strings])
+# Test print first, because it will be a builtin if present.
+if test "X`( print -r -- -n ) 2>/dev/null`" = X-n && \
+   test "X`print -r -- $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='print -r --'
+elif test "X`printf %s $ECHO 2>/dev/null`" = "X$ECHO"; then
+  ECHO='printf %s\n'
+else
+  # Use this function as a fallback that always works.
+  func_fallback_echo ()
+  {
+    eval 'cat <<_LTECHO_EOF
+$[]1
+_LTECHO_EOF'
+  }
+  ECHO='func_fallback_echo'
+fi
+
+# func_echo_all arg...
+# Invoke $ECHO with all args, space-separated.
+func_echo_all ()
+{
+    $ECHO "$*"
+}
+
+case $ECHO in
+  printf*) AC_MSG_RESULT([printf]) ;;
+  print*) AC_MSG_RESULT([print -r]) ;;
+  *) AC_MSG_RESULT([cat]) ;;
+esac
+
+m4_ifdef([_AS_DETECT_SUGGESTED],
+[_AS_DETECT_SUGGESTED([
+  test -n "${ZSH_VERSION+set}${BASH_VERSION+set}" || (
+    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO
+    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO
+    PATH=/empty FPATH=/empty; export PATH FPATH
+    test "X`printf %s $ECHO`" = "X$ECHO" \
+      || test "X`print -r -- $ECHO`" = "X$ECHO" )])])
+
+_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])
+_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])
+])# _LT_PROG_ECHO_BACKSLASH
+
+
+# _LT_WITH_SYSROOT
+# ----------------
+AC_DEFUN([_LT_WITH_SYSROOT],
+[AC_MSG_CHECKING([for sysroot])
+AC_ARG_WITH([sysroot],
+[AS_HELP_STRING([--with-sysroot@<:@=DIR@:>@],
+  [Search for dependent libraries within DIR (or the compiler's sysroot
+   if not specified).])],
+[], [with_sysroot=no])
+
+dnl lt_sysroot will always be passed unquoted.  We quote it here
+dnl in case the user passed a directory name.
+lt_sysroot=
+case $with_sysroot in #(
+ yes)
+   if test yes = "$GCC"; then
+     lt_sysroot=`$CC --print-sysroot 2>/dev/null`
+   fi
+   ;; #(
+ /*)
+   lt_sysroot=`echo "$with_sysroot" | sed -e "$sed_quote_subst"`
+   ;; #(
+ no|'')
+   ;; #(
+ *)
+   AC_MSG_RESULT([$with_sysroot])
+   AC_MSG_ERROR([The sysroot must be an absolute path.])
+   ;;
+esac
+
+ AC_MSG_RESULT([${lt_sysroot:-no}])
+_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl
+[dependent libraries, and where our libraries should be installed.])])
+
+# _LT_ENABLE_LOCK
+# ---------------
+m4_defun([_LT_ENABLE_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+  [AS_HELP_STRING([--disable-libtool-lock],
+    [avoid locking (might break parallel builds)])])
+test no = "$enable_libtool_lock" || enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+  # Find out what ABI is being produced by ac_compile, and set mode
+  # options accordingly.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.$ac_objext` in
+      *ELF-32*)
+	HPUX_IA64_MODE=32
+	;;
+      *ELF-64*)
+	HPUX_IA64_MODE=64
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+*-*-irix6*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    if test yes = "$lt_cv_prog_gnu_ld"; then
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -melf32bsmip"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -melf32bmipn32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -melf64bmip"
+	;;
+      esac
+    else
+      case `/usr/bin/file conftest.$ac_objext` in
+	*32-bit*)
+	  LD="${LD-ld} -32"
+	  ;;
+	*N32*)
+	  LD="${LD-ld} -n32"
+	  ;;
+	*64-bit*)
+	  LD="${LD-ld} -64"
+	  ;;
+      esac
+    fi
+  fi
+  rm -rf conftest*
+  ;;
+
+mips64*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo '[#]line '$LINENO' "configure"' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    emul=elf
+    case `/usr/bin/file conftest.$ac_objext` in
+      *32-bit*)
+	emul="${emul}32"
+	;;
+      *64-bit*)
+	emul="${emul}64"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *MSB*)
+	emul="${emul}btsmip"
+	;;
+      *LSB*)
+	emul="${emul}ltsmip"
+	;;
+    esac
+    case `/usr/bin/file conftest.$ac_objext` in
+      *N32*)
+	emul="${emul}n32"
+	;;
+    esac
+    LD="${LD-ld} -m $emul"
+  fi
+  rm -rf conftest*
+  ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \
+s390*-*linux*|s390*-*tpf*|sparc*-*linux*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.  Note that the listed cases only cover the
+  # situations where additional linker options are needed (such as when
+  # doing 32-bit compilation for a host where ld defaults to 64-bit, or
+  # vice versa); the common cases where no linker options are needed do
+  # not appear in the list.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+      *32-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_i386_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    case `/usr/bin/file conftest.o` in
+	      *x86-64*)
+		LD="${LD-ld} -m elf32_x86_64"
+		;;
+	      *)
+		LD="${LD-ld} -m elf_i386"
+		;;
+	    esac
+	    ;;
+	  powerpc64le-*linux*)
+	    LD="${LD-ld} -m elf32lppclinux"
+	    ;;
+	  powerpc64-*linux*)
+	    LD="${LD-ld} -m elf32ppclinux"
+	    ;;
+	  s390x-*linux*)
+	    LD="${LD-ld} -m elf_s390"
+	    ;;
+	  sparc64-*linux*)
+	    LD="${LD-ld} -m elf32_sparc"
+	    ;;
+	esac
+	;;
+      *64-bit*)
+	case $host in
+	  x86_64-*kfreebsd*-gnu)
+	    LD="${LD-ld} -m elf_x86_64_fbsd"
+	    ;;
+	  x86_64-*linux*)
+	    LD="${LD-ld} -m elf_x86_64"
+	    ;;
+	  powerpcle-*linux*)
+	    LD="${LD-ld} -m elf64lppc"
+	    ;;
+	  powerpc-*linux*)
+	    LD="${LD-ld} -m elf64ppc"
+	    ;;
+	  s390*-*linux*|s390*-*tpf*)
+	    LD="${LD-ld} -m elf64_s390"
+	    ;;
+	  sparc*-*linux*)
+	    LD="${LD-ld} -m elf64_sparc"
+	    ;;
+	esac
+	;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+
+*-*-sco3.2v5*)
+  # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+  SAVE_CFLAGS=$CFLAGS
+  CFLAGS="$CFLAGS -belf"
+  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+    [AC_LANG_PUSH(C)
+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+     AC_LANG_POP])
+  if test yes != "$lt_cv_cc_needs_belf"; then
+    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+    CFLAGS=$SAVE_CFLAGS
+  fi
+  ;;
+*-*solaris*)
+  # Find out what ABI is being produced by ac_compile, and set linker
+  # options accordingly.
+  echo 'int i;' > conftest.$ac_ext
+  if AC_TRY_EVAL(ac_compile); then
+    case `/usr/bin/file conftest.o` in
+    *64-bit*)
+      case $lt_cv_prog_gnu_ld in
+      yes*)
+        case $host in
+        i?86-*-solaris*|x86_64-*-solaris*)
+          LD="${LD-ld} -m elf_x86_64"
+          ;;
+        sparc*-*-solaris*)
+          LD="${LD-ld} -m elf64_sparc"
+          ;;
+        esac
+        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.
+        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then
+          LD=${LD-ld}_sol2
+        fi
+        ;;
+      *)
+	if ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then
+	  LD="${LD-ld} -64"
+	fi
+	;;
+      esac
+      ;;
+    esac
+  fi
+  rm -rf conftest*
+  ;;
+esac
+
+need_locks=$enable_libtool_lock
+])# _LT_ENABLE_LOCK
+
+
+# _LT_PROG_AR
+# -----------
+m4_defun([_LT_PROG_AR],
+[AC_CHECK_TOOLS(AR, [ar], false)
+: ${AR=ar}
+: ${AR_FLAGS=cr}
+_LT_DECL([], [AR], [1], [The archiver])
+_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])
+
+AC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],
+  [lt_cv_ar_at_file=no
+   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],
+     [echo conftest.$ac_objext > conftest.lst
+      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'
+      AC_TRY_EVAL([lt_ar_try])
+      if test 0 -eq "$ac_status"; then
+	# Ensure the archiver fails upon bogus file names.
+	rm -f conftest.$ac_objext libconftest.a
+	AC_TRY_EVAL([lt_ar_try])
+	if test 0 -ne "$ac_status"; then
+          lt_cv_ar_at_file=@
+        fi
+      fi
+      rm -f conftest.* libconftest.a
+     ])
+  ])
+
+if test no = "$lt_cv_ar_at_file"; then
+  archiver_list_spec=
+else
+  archiver_list_spec=$lt_cv_ar_at_file
+fi
+_LT_DECL([], [archiver_list_spec], [1],
+  [How to feed a file listing to the archiver])
+])# _LT_PROG_AR
+
+
+# _LT_CMD_OLD_ARCHIVE
+# -------------------
+m4_defun([_LT_CMD_OLD_ARCHIVE],
+[_LT_PROG_AR
+
+AC_CHECK_TOOL(STRIP, strip, :)
+test -z "$STRIP" && STRIP=:
+_LT_DECL([], [STRIP], [1], [A symbol stripping program])
+
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+test -z "$RANLIB" && RANLIB=:
+_LT_DECL([], [RANLIB], [1],
+    [Commands used to install an old-style archive])
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+  case $host_os in
+  bitrig* | openbsd*)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$tool_oldlib"
+    ;;
+  *)
+    old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$tool_oldlib"
+    ;;
+  esac
+  old_archive_cmds="$old_archive_cmds~\$RANLIB \$tool_oldlib"
+fi
+
+case $host_os in
+  darwin*)
+    lock_old_archive_extraction=yes ;;
+  *)
+    lock_old_archive_extraction=no ;;
+esac
+_LT_DECL([], [old_postinstall_cmds], [2])
+_LT_DECL([], [old_postuninstall_cmds], [2])
+_LT_TAGDECL([], [old_archive_cmds], [2],
+    [Commands used to build an old-style archive])
+_LT_DECL([], [lock_old_archive_extraction], [0],
+    [Whether to use a lock for old archive extraction])
+])# _LT_CMD_OLD_ARCHIVE
+
+
+# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#		[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([_LT_COMPILER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+   lt_compiler_flag="$3"  ## exclude from sc_useless_quotes_in_assignment
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   # The option is referenced via a variable to avoid confusing sed.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>conftest.err)
+   ac_status=$?
+   cat conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s "$ac_outfile"; then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings other than the usual output.
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' >conftest.exp
+     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+       $2=yes
+     fi
+   fi
+   $RM conftest*
+])
+
+if test yes = "[$]$2"; then
+    m4_if([$5], , :, [$5])
+else
+    m4_if([$6], , :, [$6])
+fi
+])# _LT_COMPILER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])
+
+
+# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+#                  [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------
+# Check whether the given linker option works
+AC_DEFUN([_LT_LINKER_OPTION],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+  [$2=no
+   save_LDFLAGS=$LDFLAGS
+   LDFLAGS="$LDFLAGS $3"
+   echo "$lt_simple_link_test_code" > conftest.$ac_ext
+   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+     # The linker can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     if test -s conftest.err; then
+       # Append any errors to the config.log.
+       cat conftest.err 1>&AS_MESSAGE_LOG_FD
+       $ECHO "$_lt_linker_boilerplate" | $SED '/^$/d' > conftest.exp
+       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+       if diff conftest.exp conftest.er2 >/dev/null; then
+         $2=yes
+       fi
+     else
+       $2=yes
+     fi
+   fi
+   $RM -r conftest*
+   LDFLAGS=$save_LDFLAGS
+])
+
+if test yes = "[$]$2"; then
+    m4_if([$4], , :, [$4])
+else
+    m4_if([$5], , :, [$5])
+fi
+])# _LT_LINKER_OPTION
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])
+
+
+# LT_CMD_MAX_LEN
+#---------------
+AC_DEFUN([LT_CMD_MAX_LEN],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+  i=0
+  teststring=ABCD
+
+  case $build_os in
+  msdosdjgpp*)
+    # On DJGPP, this test can blow up pretty badly due to problems in libc
+    # (any single argument exceeding 2000 bytes causes a buffer overrun
+    # during glob expansion).  Even if it were fixed, the result of this
+    # check would be larger than it should be.
+    lt_cv_sys_max_cmd_len=12288;    # 12K is about right
+    ;;
+
+  gnu*)
+    # Under GNU Hurd, this test is not required because there is
+    # no limit to the length of command line arguments.
+    # Libtool will interpret -1 as no limit whatsoever
+    lt_cv_sys_max_cmd_len=-1;
+    ;;
+
+  cygwin* | mingw* | cegcc*)
+    # On Win9x/ME, this test blows up -- it succeeds, but takes
+    # about 5 minutes as the teststring grows exponentially.
+    # Worse, since 9x/ME are not pre-emptively multitasking,
+    # you end up with a "frozen" computer, even though with patience
+    # the test eventually succeeds (with a max line length of 256k).
+    # Instead, let's just punt: use the minimum linelength reported by
+    # all of the supported platforms: 8192 (on NT/2K/XP).
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  mint*)
+    # On MiNT this can take a long time and run out of memory.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  amigaos*)
+    # On AmigaOS with pdksh, this test takes hours, literally.
+    # So we just punt and use a minimum line length of 8192.
+    lt_cv_sys_max_cmd_len=8192;
+    ;;
+
+  bitrig* | darwin* | dragonfly* | freebsd* | netbsd* | openbsd*)
+    # This has been around since 386BSD, at least.  Likely further.
+    if test -x /sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+    elif test -x /usr/sbin/sysctl; then
+      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+    else
+      lt_cv_sys_max_cmd_len=65536	# usable default for all BSDs
+    fi
+    # And add a safety zone
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    ;;
+
+  interix*)
+    # We know the value 262144 and hardcode it with a safety zone (like BSD)
+    lt_cv_sys_max_cmd_len=196608
+    ;;
+
+  os2*)
+    # The test takes a long time on OS/2.
+    lt_cv_sys_max_cmd_len=8192
+    ;;
+
+  osf*)
+    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+    # nice to cause kernel panics so lets avoid the loop below.
+    # First set a reasonable default.
+    lt_cv_sys_max_cmd_len=16384
+    #
+    if test -x /sbin/sysconfig; then
+      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+        *1*) lt_cv_sys_max_cmd_len=-1 ;;
+      esac
+    fi
+    ;;
+  sco3.2v5*)
+    lt_cv_sys_max_cmd_len=102400
+    ;;
+  sysv5* | sco5v6* | sysv4.2uw2*)
+    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+    if test -n "$kargmax"; then
+      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[	 ]]//'`
+    else
+      lt_cv_sys_max_cmd_len=32768
+    fi
+    ;;
+  *)
+    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+    if test -n "$lt_cv_sys_max_cmd_len" && \
+       test undefined != "$lt_cv_sys_max_cmd_len"; then
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+    else
+      # Make teststring a little bigger before we do anything with it.
+      # a 1K string should be a reasonable start.
+      for i in 1 2 3 4 5 6 7 8; do
+        teststring=$teststring$teststring
+      done
+      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+      # If test is not a shell built-in, we'll probably end up computing a
+      # maximum length that is only half of the actual maximum length, but
+      # we can't tell.
+      while { test X`env echo "$teststring$teststring" 2>/dev/null` \
+	         = "X$teststring$teststring"; } >/dev/null 2>&1 &&
+	      test 17 != "$i" # 1/2 MB should be enough
+      do
+        i=`expr $i + 1`
+        teststring=$teststring$teststring
+      done
+      # Only check the string length outside the loop.
+      lt_cv_sys_max_cmd_len=`expr "X$teststring" : ".*" 2>&1`
+      teststring=
+      # Add a significant safety factor because C++ compilers can tack on
+      # massive amounts of additional arguments before passing them to the
+      # linker.  It appears as though 1/2 is a usable value.
+      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+    fi
+    ;;
+  esac
+])
+if test -n "$lt_cv_sys_max_cmd_len"; then
+  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+  AC_MSG_RESULT(none)
+fi
+max_cmd_len=$lt_cv_sys_max_cmd_len
+_LT_DECL([], [max_cmd_len], [0],
+    [What is the maximum length of a command?])
+])# LT_CMD_MAX_LEN
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])
+
+
+# _LT_HEADER_DLFCN
+# ----------------
+m4_defun([_LT_HEADER_DLFCN],
+[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl
+])# _LT_HEADER_DLFCN
+
+
+# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ----------------------------------------------------------------
+m4_defun([_LT_TRY_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test yes = "$cross_compiling"; then :
+  [$4]
+else
+  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+  lt_status=$lt_dlunknown
+  cat > conftest.$ac_ext <<_LT_EOF
+[#line $LINENO "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+#  define LT_DLGLOBAL		RTLD_GLOBAL
+#else
+#  ifdef DL_GLOBAL
+#    define LT_DLGLOBAL		DL_GLOBAL
+#  else
+#    define LT_DLGLOBAL		0
+#  endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+   find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+#  ifdef RTLD_LAZY
+#    define LT_DLLAZY_OR_NOW		RTLD_LAZY
+#  else
+#    ifdef DL_LAZY
+#      define LT_DLLAZY_OR_NOW		DL_LAZY
+#    else
+#      ifdef RTLD_NOW
+#        define LT_DLLAZY_OR_NOW	RTLD_NOW
+#      else
+#        ifdef DL_NOW
+#          define LT_DLLAZY_OR_NOW	DL_NOW
+#        else
+#          define LT_DLLAZY_OR_NOW	0
+#        endif
+#      endif
+#    endif
+#  endif
+#endif
+
+/* When -fvisibility=hidden is used, assume the code has been annotated
+   correspondingly for the symbols needed.  */
+#if defined __GNUC__ && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))
+int fnord () __attribute__((visibility("default")));
+#endif
+
+int fnord () { return 42; }
+int main ()
+{
+  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+  int status = $lt_dlunknown;
+
+  if (self)
+    {
+      if (dlsym (self,"fnord"))       status = $lt_dlno_uscore;
+      else
+        {
+	  if (dlsym( self,"_fnord"))  status = $lt_dlneed_uscore;
+          else puts (dlerror ());
+	}
+      /* dlclose (self); */
+    }
+  else
+    puts (dlerror ());
+
+  return status;
+}]
+_LT_EOF
+  if AC_TRY_EVAL(ac_link) && test -s "conftest$ac_exeext" 2>/dev/null; then
+    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+    lt_status=$?
+    case x$lt_status in
+      x$lt_dlno_uscore) $1 ;;
+      x$lt_dlneed_uscore) $2 ;;
+      x$lt_dlunknown|x*) $3 ;;
+    esac
+  else :
+    # compilation failed
+    $3
+  fi
+fi
+rm -fr conftest*
+])# _LT_TRY_DLOPEN_SELF
+
+
+# LT_SYS_DLOPEN_SELF
+# ------------------
+AC_DEFUN([LT_SYS_DLOPEN_SELF],
+[m4_require([_LT_HEADER_DLFCN])dnl
+if test yes != "$enable_dlopen"; then
+  enable_dlopen=unknown
+  enable_dlopen_self=unknown
+  enable_dlopen_self_static=unknown
+else
+  lt_cv_dlopen=no
+  lt_cv_dlopen_libs=
+
+  case $host_os in
+  beos*)
+    lt_cv_dlopen=load_add_on
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ;;
+
+  mingw* | pw32* | cegcc*)
+    lt_cv_dlopen=LoadLibrary
+    lt_cv_dlopen_libs=
+    ;;
+
+  cygwin*)
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    ;;
+
+  darwin*)
+    # if libdl is installed we need to link against it
+    AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],[
+    lt_cv_dlopen=dyld
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=yes
+    ])
+    ;;
+
+  tpf*)
+    # Don't try to run any link tests for TPF.  We know it's impossible
+    # because TPF is a cross-compiler, and we know how we open DSOs.
+    lt_cv_dlopen=dlopen
+    lt_cv_dlopen_libs=
+    lt_cv_dlopen_self=no
+    ;;
+
+  *)
+    AC_CHECK_FUNC([shl_load],
+	  [lt_cv_dlopen=shl_load],
+      [AC_CHECK_LIB([dld], [shl_load],
+	    [lt_cv_dlopen=shl_load lt_cv_dlopen_libs=-ldld],
+	[AC_CHECK_FUNC([dlopen],
+	      [lt_cv_dlopen=dlopen],
+	  [AC_CHECK_LIB([dl], [dlopen],
+		[lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-ldl],
+	    [AC_CHECK_LIB([svld], [dlopen],
+		  [lt_cv_dlopen=dlopen lt_cv_dlopen_libs=-lsvld],
+	      [AC_CHECK_LIB([dld], [dld_link],
+		    [lt_cv_dlopen=dld_link lt_cv_dlopen_libs=-ldld])
+	      ])
+	    ])
+	  ])
+	])
+      ])
+    ;;
+  esac
+
+  if test no = "$lt_cv_dlopen"; then
+    enable_dlopen=no
+  else
+    enable_dlopen=yes
+  fi
+
+  case $lt_cv_dlopen in
+  dlopen)
+    save_CPPFLAGS=$CPPFLAGS
+    test yes = "$ac_cv_header_dlfcn_h" && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+    save_LDFLAGS=$LDFLAGS
+    wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+    save_LIBS=$LIBS
+    LIBS="$lt_cv_dlopen_libs $LIBS"
+
+    AC_CACHE_CHECK([whether a program can dlopen itself],
+	  lt_cv_dlopen_self, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+	    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+    ])
+
+    if test yes = "$lt_cv_dlopen_self"; then
+      wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+	  lt_cv_dlopen_self_static, [dnl
+	  _LT_TRY_DLOPEN_SELF(
+	    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+	    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)
+      ])
+    fi
+
+    CPPFLAGS=$save_CPPFLAGS
+    LDFLAGS=$save_LDFLAGS
+    LIBS=$save_LIBS
+    ;;
+  esac
+
+  case $lt_cv_dlopen_self in
+  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+  *) enable_dlopen_self=unknown ;;
+  esac
+
+  case $lt_cv_dlopen_self_static in
+  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+  *) enable_dlopen_self_static=unknown ;;
+  esac
+fi
+_LT_DECL([dlopen_support], [enable_dlopen], [0],
+	 [Whether dlopen is supported])
+_LT_DECL([dlopen_self], [enable_dlopen_self], [0],
+	 [Whether dlopen of programs is supported])
+_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],
+	 [Whether dlopen of statically linked programs is supported])
+])# LT_SYS_DLOPEN_SELF
+
+# Old name:
+AU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])
+
+
+# _LT_COMPILER_C_O([TAGNAME])
+# ---------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler.
+# This macro does not hard code the compiler like AC_PROG_CC_C_O.
+m4_defun([_LT_COMPILER_C_O],
+[m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+   $RM -r conftest 2>/dev/null
+   mkdir conftest
+   cd conftest
+   mkdir out
+   echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+   lt_compiler_flag="-o out/conftest2.$ac_objext"
+   # Insert the option either (1) after the last *FLAGS variable, or
+   # (2) before a word containing "conftest.", or (3) at the end.
+   # Note that $ac_compile itself does not contain backslashes and begins
+   # with a dollar sign (not a hyphen), so the echo should work correctly.
+   lt_compile=`echo "$ac_compile" | $SED \
+   -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+   -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+   -e 's:$: $lt_compiler_flag:'`
+   (eval echo "\"\$as_me:$LINENO: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+   (eval "$lt_compile" 2>out/conftest.err)
+   ac_status=$?
+   cat out/conftest.err >&AS_MESSAGE_LOG_FD
+   echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+   if (exit $ac_status) && test -s out/conftest2.$ac_objext
+   then
+     # The compiler can only warn and ignore the option if not recognized
+     # So say no if there are warnings
+     $ECHO "$_lt_compiler_boilerplate" | $SED '/^$/d' > out/conftest.exp
+     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+     fi
+   fi
+   chmod u+w . 2>&AS_MESSAGE_LOG_FD
+   $RM conftest*
+   # SGI C++ compiler will create directory out/ii_files/ for
+   # template instantiation
+   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files
+   $RM out/* && rmdir out
+   cd ..
+   $RM -r conftest
+   $RM conftest*
+])
+_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],
+	[Does compiler simultaneously support -c and -o options?])
+])# _LT_COMPILER_C_O
+
+
+# _LT_COMPILER_FILE_LOCKS([TAGNAME])
+# ----------------------------------
+# Check to see if we can do hard links to lock some files if needed
+m4_defun([_LT_COMPILER_FILE_LOCKS],
+[m4_require([_LT_ENABLE_LOCK])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+_LT_COMPILER_C_O([$1])
+
+hard_links=nottested
+if test no = "$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)" && test no != "$need_locks"; then
+  # do not overwrite the value of need_locks provided by the user
+  AC_MSG_CHECKING([if we can lock with hard links])
+  hard_links=yes
+  $RM conftest*
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  touch conftest.a
+  ln conftest.a conftest.b 2>&5 || hard_links=no
+  ln conftest.a conftest.b 2>/dev/null && hard_links=no
+  AC_MSG_RESULT([$hard_links])
+  if test no = "$hard_links"; then
+    AC_MSG_WARN(['$CC' does not support '-c -o', so 'make -j' may be unsafe])
+    need_locks=warn
+  fi
+else
+  need_locks=no
+fi
+_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])
+])# _LT_COMPILER_FILE_LOCKS
+
+
+# _LT_CHECK_OBJDIR
+# ----------------
+m4_defun([_LT_CHECK_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+  lt_cv_objdir=.libs
+else
+  # MS-DOS does not allow filenames that begin with a dot.
+  lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+_LT_DECL([], [objdir], [0],
+         [The name of the directory that contains temporary libtool files])dnl
+m4_pattern_allow([LT_OBJDIR])dnl
+AC_DEFINE_UNQUOTED([LT_OBJDIR], "$lt_cv_objdir/",
+  [Define to the sub-directory where libtool stores uninstalled libraries.])
+])# _LT_CHECK_OBJDIR
+
+
+# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])
+# --------------------------------------
+# Check hardcoding attributes.
+m4_defun([_LT_LINKER_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)" ||
+   test -n "$_LT_TAGVAR(runpath_var, $1)" ||
+   test yes = "$_LT_TAGVAR(hardcode_automatic, $1)"; then
+
+  # We can hardcode non-existent directories.
+  if test no != "$_LT_TAGVAR(hardcode_direct, $1)" &&
+     # If the only mechanism to avoid hardcoding is shlibpath_var, we
+     # have to relink, otherwise we might link with an installed library
+     # when we should be linking with a yet-to-be-installed one
+     ## test no != "$_LT_TAGVAR(hardcode_shlibpath_var, $1)" &&
+     test no != "$_LT_TAGVAR(hardcode_minus_L, $1)"; then
+    # Linking always hardcodes the temporary library directory.
+    _LT_TAGVAR(hardcode_action, $1)=relink
+  else
+    # We can link without hardcoding, and we can hardcode nonexisting dirs.
+    _LT_TAGVAR(hardcode_action, $1)=immediate
+  fi
+else
+  # We cannot hardcode anything, or else we can only hardcode existing
+  # directories.
+  _LT_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])
+
+if test relink = "$_LT_TAGVAR(hardcode_action, $1)" ||
+   test yes = "$_LT_TAGVAR(inherit_rpath, $1)"; then
+  # Fast installation is not supported
+  enable_fast_install=no
+elif test yes = "$shlibpath_overrides_runpath" ||
+     test no = "$enable_shared"; then
+  # Fast installation is not necessary
+  enable_fast_install=needless
+fi
+_LT_TAGDECL([], [hardcode_action], [0],
+    [How to hardcode a shared library path into an executable])
+])# _LT_LINKER_HARDCODE_LIBPATH
+
+
+# _LT_CMD_STRIPLIB
+# ----------------
+m4_defun([_LT_CMD_STRIPLIB],
+[m4_require([_LT_DECL_EGREP])
+striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | $GREP "GNU strip" >/dev/null; then
+  test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+  test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+  AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+  case $host_os in
+  darwin*)
+    if test -n "$STRIP"; then
+      striplib="$STRIP -x"
+      old_striplib="$STRIP -S"
+      AC_MSG_RESULT([yes])
+    else
+      AC_MSG_RESULT([no])
+    fi
+    ;;
+  *)
+    AC_MSG_RESULT([no])
+    ;;
+  esac
+fi
+_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])
+_LT_DECL([], [striplib], [1])
+])# _LT_CMD_STRIPLIB
+
+
+# _LT_PREPARE_MUNGE_PATH_LIST
+# ---------------------------
+# Make sure func_munge_path_list() is defined correctly.
+m4_defun([_LT_PREPARE_MUNGE_PATH_LIST],
+[[# func_munge_path_list VARIABLE PATH
+# -----------------------------------
+# VARIABLE is name of variable containing _space_ separated list of
+# directories to be munged by the contents of PATH, which is string
+# having a format:
+# "DIR[:DIR]:"
+#       string "DIR[ DIR]" will be prepended to VARIABLE
+# ":DIR[:DIR]"
+#       string "DIR[ DIR]" will be appended to VARIABLE
+# "DIRP[:DIRP]::[DIRA:]DIRA"
+#       string "DIRP[ DIRP]" will be prepended to VARIABLE and string
+#       "DIRA[ DIRA]" will be appended to VARIABLE
+# "DIR[:DIR]"
+#       VARIABLE will be replaced by "DIR[ DIR]"
+func_munge_path_list ()
+{
+    case x@S|@2 in
+    x)
+        ;;
+    *:)
+        eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'` \@S|@@S|@1\"
+        ;;
+    x:*)
+        eval @S|@1=\"\@S|@@S|@1 `$ECHO @S|@2 | $SED 's/:/ /g'`\"
+        ;;
+    *::*)
+        eval @S|@1=\"\@S|@@S|@1\ `$ECHO @S|@2 | $SED -e 's/.*:://' -e 's/:/ /g'`\"
+        eval @S|@1=\"`$ECHO @S|@2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \@S|@@S|@1\"
+        ;;
+    *)
+        eval @S|@1=\"`$ECHO @S|@2 | $SED 's/:/ /g'`\"
+        ;;
+    esac
+}
+]])# _LT_PREPARE_PATH_LIST
+
+
+# _LT_SYS_DYNAMIC_LINKER([TAG])
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+m4_defun([_LT_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_OBJDUMP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CHECK_SHELL_FEATURES])dnl
+m4_require([_LT_PREPARE_MUNGE_PATH_LIST])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+m4_if([$1],
+	[], [
+if test yes = "$GCC"; then
+  case $host_os in
+    darwin*) lt_awk_arg='/^libraries:/,/LR/' ;;
+    *) lt_awk_arg='/^libraries:/' ;;
+  esac
+  case $host_os in
+    mingw* | cegcc*) lt_sed_strip_eq='s|=\([[A-Za-z]]:\)|\1|g' ;;
+    *) lt_sed_strip_eq='s|=/|/|g' ;;
+  esac
+  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e $lt_sed_strip_eq`
+  case $lt_search_path_spec in
+  *\;*)
+    # if the path contains ";" then we assume it to be the separator
+    # otherwise default to the standard path separator (i.e. ":") - it is
+    # assumed that no part of a normal pathname contains ";" but that should
+    # okay in the real world where ";" in dirpaths is itself problematic.
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED 's/;/ /g'`
+    ;;
+  *)
+    lt_search_path_spec=`$ECHO "$lt_search_path_spec" | $SED "s/$PATH_SEPARATOR/ /g"`
+    ;;
+  esac
+  # Ok, now we have the path, separated by spaces, we can step through it
+  # and add multilib dir if necessary...
+  lt_tmp_lt_search_path_spec=
+  lt_multi_os_dir=/`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+  # ...but if some path component already ends with the multilib dir we assume
+  # that all is fine and trust -print-search-dirs as is (GCC 4.2? or newer).
+  case "$lt_multi_os_dir; $lt_search_path_spec " in
+  "/; "* | "/.; "* | "/./; "* | *"$lt_multi_os_dir "* | *"$lt_multi_os_dir/ "*)
+    lt_multi_os_dir=
+    ;;
+  esac
+  for lt_sys_path in $lt_search_path_spec; do
+    if test -d "$lt_sys_path$lt_multi_os_dir"; then
+      lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path$lt_multi_os_dir"
+    elif test -n "$lt_multi_os_dir"; then
+      test -d "$lt_sys_path" && \
+	lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+    fi
+  done
+  lt_search_path_spec=`$ECHO "$lt_tmp_lt_search_path_spec" | awk '
+BEGIN {RS = " "; FS = "/|\n";} {
+  lt_foo = "";
+  lt_count = 0;
+  for (lt_i = NF; lt_i > 0; lt_i--) {
+    if ($lt_i != "" && $lt_i != ".") {
+      if ($lt_i == "..") {
+        lt_count++;
+      } else {
+        if (lt_count == 0) {
+          lt_foo = "/" $lt_i lt_foo;
+        } else {
+          lt_count--;
+        }
+      }
+    }
+  }
+  if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+  # AWK program above erroneously prepends '/' to C:/dos/paths
+  # for these hosts.
+  case $host_os in
+    mingw* | cegcc*) lt_search_path_spec=`$ECHO "$lt_search_path_spec" |\
+      $SED 's|/\([[A-Za-z]]:\)|\1|g'` ;;
+  esac
+  sys_lib_search_path_spec=`$ECHO "$lt_search_path_spec" | $lt_NL2SP`
+else
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=.so
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+AC_ARG_VAR([LT_SYS_LIBRARY_PATH],
+[User-defined run-time library search path.])
+
+case $host_os in
+aix3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname.a'
+  shlibpath_var=LIBPATH
+
+  # AIX 3 has no versioning support, so we append a major version to the name.
+  soname_spec='$libname$release$shared_ext$major'
+  ;;
+
+aix[[4-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  hardcode_into_libs=yes
+  if test ia64 = "$host_cpu"; then
+    # AIX 5 supports IA64
+    library_names_spec='$libname$release$shared_ext$major $libname$release$shared_ext$versuffix $libname$shared_ext'
+    shlibpath_var=LD_LIBRARY_PATH
+  else
+    # With GCC up to 2.95.x, collect2 would create an import file
+    # for dependence libraries.  The import file would start with
+    # the line '#! .'.  This would cause the generated library to
+    # depend on '.', always an invalid library.  This was fixed in
+    # development snapshots of GCC prior to 3.0.
+    case $host_os in
+      aix4 | aix4.[[01]] | aix4.[[01]].*)
+      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+	   echo ' yes '
+	   echo '#endif'; } | $CC -E - | $GREP yes > /dev/null; then
+	:
+      else
+	can_build_shared=no
+      fi
+      ;;
+    esac
+    # Using Import Files as archive members, it is possible to support
+    # filename-based versioning of shared library archives on AIX. While
+    # this would work for both with and without runtime linking, it will
+    # prevent static linking of such archives. So we do filename-based
+    # shared library versioning with .so extension only, which is used
+    # when both runtime linking and shared linking is enabled.
+    # Unfortunately, runtime linking may impact performance, so we do
+    # not want this to be the default eventually. Also, we use the
+    # versioned .so libs for executables only if there is the -brtl
+    # linker flag in LDFLAGS as well, or --with-aix-soname=svr4 only.
+    # To allow for filename-based versioning support, we need to create
+    # libNAME.so.V as an archive file, containing:
+    # *) an Import File, referring to the versioned filename of the
+    #    archive as well as the shared archive member, telling the
+    #    bitwidth (32 or 64) of that shared object, and providing the
+    #    list of exported symbols of that shared object, eventually
+    #    decorated with the 'weak' keyword
+    # *) the shared object with the F_LOADONLY flag set, to really avoid
+    #    it being seen by the linker.
+    # At run time we better use the real file rather than another symlink,
+    # but for link time we create the symlink libNAME.so -> libNAME.so.V
+
+    case $with_aix_soname,$aix_use_runtimelinking in
+    # AIX (on Power*) has no versioning support, so currently we cannot hardcode correct
+    # soname into executable. Probably we can add versioning support to
+    # collect2, so additional links can be useful in future.
+    aix,yes) # traditional libtool
+      dynamic_linker='AIX unversionable lib.so'
+      # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+      # instead of lib<name>.a to let people know that these are not
+      # typical AIX shared libraries.
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      ;;
+    aix,no) # traditional AIX only
+      dynamic_linker='AIX lib.a[(]lib.so.V[)]'
+      # We preserve .a as extension for shared libraries through AIX4.2
+      # and later when we are not doing run time linking.
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      ;;
+    svr4,*) # full svr4 only
+      dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)]"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,yes) # both, prefer svr4
+      dynamic_linker="AIX lib.so.V[(]$shared_archive_member_spec.o[)], lib.a[(]lib.so.V[)]"
+      library_names_spec='$libname$release$shared_ext$major $libname$shared_ext'
+      # unpreferred sharedlib libNAME.a needs extra handling
+      postinstall_cmds='test -n "$linkname" || linkname="$realname"~func_stripname "" ".so" "$linkname"~$install_shared_prog "$dir/$func_stripname_result.$libext" "$destdir/$func_stripname_result.$libext"~test -z "$tstripme" || test -z "$striplib" || $striplib "$destdir/$func_stripname_result.$libext"'
+      postuninstall_cmds='for n in $library_names $old_library; do :; done~func_stripname "" ".so" "$n"~test "$func_stripname_result" = "$n" || func_append rmfiles " $odir/$func_stripname_result.$libext"'
+      # We do not specify a path in Import Files, so LIBPATH fires.
+      shlibpath_overrides_runpath=yes
+      ;;
+    *,no) # both, prefer aix
+      dynamic_linker="AIX lib.a[(]lib.so.V[)], lib.so.V[(]$shared_archive_member_spec.o[)]"
+      library_names_spec='$libname$release.a $libname.a'
+      soname_spec='$libname$release$shared_ext$major'
+      # unpreferred sharedlib libNAME.so.V and symlink libNAME.so need extra handling
+      postinstall_cmds='test -z "$dlname" || $install_shared_prog $dir/$dlname $destdir/$dlname~test -z "$tstripme" || test -z "$striplib" || $striplib $destdir/$dlname~test -n "$linkname" || linkname=$realname~func_stripname "" ".a" "$linkname"~(cd "$destdir" && $LN_S -f $dlname $func_stripname_result.so)'
+      postuninstall_cmds='test -z "$dlname" || func_append rmfiles " $odir/$dlname"~for n in $old_library $library_names; do :; done~func_stripname "" ".a" "$n"~func_append rmfiles " $odir/$func_stripname_result.so"'
+      ;;
+    esac
+    shlibpath_var=LIBPATH
+  fi
+  ;;
+
+amigaos*)
+  case $host_cpu in
+  powerpc)
+    # Since July 2007 AmigaOS4 officially supports .so libraries.
+    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    ;;
+  m68k)
+    library_names_spec='$libname.ixlibrary $libname.a'
+    # Create ${libname}_ixlibrary.a entries in /sys/libs.
+    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all "$lib" | $SED '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; $RM /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+    ;;
+  esac
+  ;;
+
+beos*)
+  library_names_spec='$libname$shared_ext'
+  dynamic_linker="$host_os ld.so"
+  shlibpath_var=LIBRARY_PATH
+  ;;
+
+bsdi[[45]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+  # the default ld.so.conf also contains /usr/contrib/lib and
+  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+  # libtool to hard-code these into programs
+  ;;
+
+cygwin* | mingw* | pw32* | cegcc*)
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+
+  case $GCC,$cc_basename in
+  yes,*)
+    # gcc
+    library_names_spec='$libname.dll.a'
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname~
+      chmod a+x \$dldir/$dlname~
+      if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+        eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+      fi'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+
+    case $host_os in
+    cygwin*)
+      # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+      soname_spec='`echo $libname | sed -e 's/^lib/cyg/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+m4_if([$1], [],[
+      sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/lib/w32api"])
+      ;;
+    mingw* | cegcc*)
+      # MinGW DLLs use traditional 'lib' prefix
+      soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+      ;;
+    pw32*)
+      # pw32 DLLs use 'pw' prefix rather than 'lib'
+      library_names_spec='`echo $libname | sed -e 's/^lib/pw/'``echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+      ;;
+    esac
+    dynamic_linker='Win32 ld.exe'
+    ;;
+
+  *,cl*)
+    # Native MSVC
+    libname_spec='$name'
+    soname_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext'
+    library_names_spec='$libname.dll.lib'
+
+    case $build_os in
+    mingw*)
+      sys_lib_search_path_spec=
+      lt_save_ifs=$IFS
+      IFS=';'
+      for lt_path in $LIB
+      do
+        IFS=$lt_save_ifs
+        # Let DOS variable expansion print the short 8.3 style file name.
+        lt_path=`cd "$lt_path" 2>/dev/null && cmd //C "for %i in (".") do @echo %~si"`
+        sys_lib_search_path_spec="$sys_lib_search_path_spec $lt_path"
+      done
+      IFS=$lt_save_ifs
+      # Convert to MSYS style.
+      sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | sed -e 's|\\\\|/|g' -e 's| \\([[a-zA-Z]]\\):| /\\1|g' -e 's|^ ||'`
+      ;;
+    cygwin*)
+      # Convert to unix form, then to dos form, then back to unix form
+      # but this time dos style (no spaces!) so that the unix form looks
+      # like /cygdrive/c/PROGRA~1:/cygdr...
+      sys_lib_search_path_spec=`cygpath --path --unix "$LIB"`
+      sys_lib_search_path_spec=`cygpath --path --dos "$sys_lib_search_path_spec" 2>/dev/null`
+      sys_lib_search_path_spec=`cygpath --path --unix "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      ;;
+    *)
+      sys_lib_search_path_spec=$LIB
+      if $ECHO "$sys_lib_search_path_spec" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then
+        # It is most probably a Windows format PATH.
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+      else
+        sys_lib_search_path_spec=`$ECHO "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+      fi
+      # FIXME: find the short name or the path components, as spaces are
+      # common. (e.g. "Program Files" -> "PROGRA~1")
+      ;;
+    esac
+
+    # DLL is installed to $(libdir)/../bin by postinstall_cmds
+    postinstall_cmds='base_file=`basename \$file`~
+      dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; echo \$dlname'\''`~
+      dldir=$destdir/`dirname \$dlpath`~
+      test -d \$dldir || mkdir -p \$dldir~
+      $install_prog $dir/$dlname \$dldir/$dlname'
+    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+      dlpath=$dir/\$dldll~
+       $RM \$dlpath'
+    shlibpath_overrides_runpath=yes
+    dynamic_linker='Win32 link.exe'
+    ;;
+
+  *)
+    # Assume MSVC wrapper
+    library_names_spec='$libname`echo $release | $SED -e 's/[[.]]/-/g'`$versuffix$shared_ext $libname.lib'
+    dynamic_linker='Win32 ld.exe'
+    ;;
+  esac
+  # FIXME: first we should search . and the directory the executable is in
+  shlibpath_var=PATH
+  ;;
+
+darwin* | rhapsody*)
+  dynamic_linker="$host_os dyld"
+  version_type=darwin
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$major$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$major$shared_ext'
+  shlibpath_overrides_runpath=yes
+  shlibpath_var=DYLD_LIBRARY_PATH
+  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+m4_if([$1], [],[
+  sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+  ;;
+
+dgux*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+freebsd* | dragonfly*)
+  # DragonFly does not have aout.  When/if they implement a new
+  # versioning mechanism, adjust this.
+  if test -x /usr/bin/objformat; then
+    objformat=`/usr/bin/objformat`
+  else
+    case $host_os in
+    freebsd[[23]].*) objformat=aout ;;
+    *) objformat=elf ;;
+    esac
+  fi
+  version_type=freebsd-$objformat
+  case $version_type in
+    freebsd-elf*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+      soname_spec='$libname$release$shared_ext$major'
+      need_version=no
+      need_lib_prefix=no
+      ;;
+    freebsd-*)
+      library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+      need_version=yes
+      ;;
+  esac
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_os in
+  freebsd2.*)
+    shlibpath_overrides_runpath=yes
+    ;;
+  freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+    shlibpath_overrides_runpath=no
+    hardcode_into_libs=yes
+    ;;
+  *) # from 4.6 on, and DragonFly
+    shlibpath_overrides_runpath=yes
+    hardcode_into_libs=yes
+    ;;
+  esac
+  ;;
+
+haiku*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  dynamic_linker="$host_os runtime_loader"
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'
+  hardcode_into_libs=yes
+  ;;
+
+hpux9* | hpux10* | hpux11*)
+  # Give a soname corresponding to the major version so that dld.sl refuses to
+  # link against other versions.
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  case $host_cpu in
+  ia64*)
+    shrext_cmds='.so'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.so"
+    shlibpath_var=LD_LIBRARY_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    if test 32 = "$HPUX_IA64_MODE"; then
+      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux32
+    else
+      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+      sys_lib_dlsearch_path_spec=/usr/lib/hpux64
+    fi
+    ;;
+  hppa*64*)
+    shrext_cmds='.sl'
+    hardcode_into_libs=yes
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+    ;;
+  *)
+    shrext_cmds='.sl'
+    dynamic_linker="$host_os dld.sl"
+    shlibpath_var=SHLIB_PATH
+    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    ;;
+  esac
+  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...
+  postinstall_cmds='chmod 555 $lib'
+  # or fails outright, so override atomically:
+  install_override_mode=555
+  ;;
+
+interix[[3-9]]*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $host_os in
+    nonstopux*) version_type=nonstopux ;;
+    *)
+	if test yes = "$lt_cv_prog_gnu_ld"; then
+		version_type=linux # correct to gnu/linux during the next big refactor
+	else
+		version_type=irix
+	fi ;;
+  esac
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$release$shared_ext $libname$shared_ext'
+  case $host_os in
+  irix5* | nonstopux*)
+    libsuff= shlibsuff=
+    ;;
+  *)
+    case $LD in # libtool.m4 will add one of these switches to LD
+    *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+      libsuff= shlibsuff= libmagic=32-bit;;
+    *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+      libsuff=32 shlibsuff=N32 libmagic=N32;;
+    *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+      libsuff=64 shlibsuff=64 libmagic=64-bit;;
+    *) libsuff= shlibsuff= libmagic=never-match;;
+    esac
+    ;;
+  esac
+  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+  shlibpath_overrides_runpath=no
+  sys_lib_search_path_spec="/usr/lib$libsuff /lib$libsuff /usr/local/lib$libsuff"
+  sys_lib_dlsearch_path_spec="/usr/lib$libsuff /lib$libsuff"
+  hardcode_into_libs=yes
+  ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+  dynamic_linker=no
+  ;;
+
+linux*android*)
+  version_type=none # Android doesn't support versioned libraries.
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext'
+  soname_spec='$libname$release$shared_ext'
+  finish_cmds=
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  dynamic_linker='Android linker'
+  # Don't embed -rpath directories since the linker doesn't support them.
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+
+  # Some binutils ld are patched to set DT_RUNPATH
+  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],
+    [lt_cv_shlibpath_overrides_runpath=no
+    save_LDFLAGS=$LDFLAGS
+    save_libdir=$libdir
+    eval "libdir=/foo; wl=\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\"; \
+	 LDFLAGS=\"\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\""
+    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],
+      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep "RUNPATH.*$libdir" >/dev/null],
+	 [lt_cv_shlibpath_overrides_runpath=yes])])
+    LDFLAGS=$save_LDFLAGS
+    libdir=$save_libdir
+    ])
+  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath
+
+  # This implies no fast_install, which is unacceptable.
+  # Some rework will be needed to allow for fast_install
+  # before this can be enabled.
+  hardcode_into_libs=yes
+
+  # Ideally, we could use ldconfig to report *all* directores which are
+  # searched for libraries, however this is still not possible.  Aside from not
+  # being certain /sbin/ldconfig is available, command
+  # 'ldconfig -N -X -v | grep ^/' on 64bit Fedora does not report /usr/lib64,
+  # even though it is searched at run-time.  Try to do the best guess by
+  # appending ld.so.conf contents (and includes) to the search path.
+  if test -f /etc/ld.so.conf; then
+    lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[	 ]*hwcap[	 ]/d;s/[:,	]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/"//g;/^$/d' | tr '\n' ' '`
+    sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+  fi
+
+  # We used to test for /lib/ld.so.1 and disable shared libraries on
+  # powerpc, because MkLinux only supported shared libraries with the
+  # GNU dynamic linker.  Since this was broken with cross compilers,
+  # most powerpc-linux boxes support dynamic linking these days and
+  # people can always --disable-shared, the test was removed, and we
+  # assume the GNU/Linux dynamic linker is in use.
+  dynamic_linker='GNU/Linux ld.so'
+  ;;
+
+netbsdelf*-gnu)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+  soname_spec='${libname}${release}${shared_ext}$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='NetBSD ld.elf_so'
+  ;;
+
+netbsd*)
+  version_type=sunos
+  need_lib_prefix=no
+  need_version=no
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+    finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+    dynamic_linker='NetBSD (a.out) ld.so'
+  else
+    library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+    soname_spec='$libname$release$shared_ext$major'
+    dynamic_linker='NetBSD ld.elf_so'
+  fi
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  ;;
+
+newsos6)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+*nto* | *qnx*)
+  version_type=qnx
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  dynamic_linker='ldqnx.so'
+  ;;
+
+openbsd* | bitrig*)
+  version_type=sunos
+  sys_lib_dlsearch_path_spec=/usr/lib
+  need_lib_prefix=no
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    need_version=no
+  else
+    need_version=yes
+  fi
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  ;;
+
+os2*)
+  libname_spec='$name'
+  version_type=windows
+  shrext_cmds=.dll
+  need_version=no
+  need_lib_prefix=no
+  # OS/2 can only load a DLL with a base name of 8 characters or less.
+  soname_spec='`test -n "$os2dllname" && libname="$os2dllname";
+    v=$($ECHO $release$versuffix | tr -d .-);
+    n=$($ECHO $libname | cut -b -$((8 - ${#v})) | tr . _);
+    $ECHO $n$v`$shared_ext'
+  library_names_spec='${libname}_dll.$libext'
+  dynamic_linker='OS/2 ld.exe'
+  shlibpath_var=BEGINLIBPATH
+  sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  postinstall_cmds='base_file=`basename \$file`~
+    dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\$base_file'\''i; $ECHO \$dlname'\''`~
+    dldir=$destdir/`dirname \$dlpath`~
+    test -d \$dldir || mkdir -p \$dldir~
+    $install_prog $dir/$dlname \$dldir/$dlname~
+    chmod a+x \$dldir/$dlname~
+    if test -n '\''$stripme'\'' && test -n '\''$striplib'\''; then
+      eval '\''$striplib \$dldir/$dlname'\'' || exit \$?;
+    fi'
+  postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; $ECHO \$dlname'\''`~
+    dlpath=$dir/\$dldll~
+    $RM \$dlpath'
+  ;;
+
+osf3* | osf4* | osf5*)
+  version_type=osf
+  need_lib_prefix=no
+  need_version=no
+  soname_spec='$libname$release$shared_ext$major'
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+  sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+  ;;
+
+rdos*)
+  dynamic_linker=no
+  ;;
+
+solaris*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  # ldd complains unless libraries are executable
+  postinstall_cmds='chmod +x $lib'
+  ;;
+
+sunos4*)
+  version_type=sunos
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$shared_ext$versuffix'
+  finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  if test yes = "$with_gnu_ld"; then
+    need_lib_prefix=no
+  fi
+  need_version=yes
+  ;;
+
+sysv4 | sysv4.3*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  case $host_vendor in
+    sni)
+      shlibpath_overrides_runpath=no
+      need_lib_prefix=no
+      runpath_var=LD_RUN_PATH
+      ;;
+    siemens)
+      need_lib_prefix=no
+      ;;
+    motorola)
+      need_lib_prefix=no
+      need_version=no
+      shlibpath_overrides_runpath=no
+      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+      ;;
+  esac
+  ;;
+
+sysv4*MP*)
+  if test -d /usr/nec; then
+    version_type=linux # correct to gnu/linux during the next big refactor
+    library_names_spec='$libname$shared_ext.$versuffix $libname$shared_ext.$major $libname$shared_ext'
+    soname_spec='$libname$shared_ext.$major'
+    shlibpath_var=LD_LIBRARY_PATH
+  fi
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  version_type=sco
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=yes
+  hardcode_into_libs=yes
+  if test yes = "$with_gnu_ld"; then
+    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+  else
+    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+    case $host_os in
+      sco3.2v5*)
+        sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+	;;
+    esac
+  fi
+  sys_lib_dlsearch_path_spec='/usr/lib'
+  ;;
+
+tpf*)
+  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.
+  version_type=linux # correct to gnu/linux during the next big refactor
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  hardcode_into_libs=yes
+  ;;
+
+uts4*)
+  version_type=linux # correct to gnu/linux during the next big refactor
+  library_names_spec='$libname$release$shared_ext$versuffix $libname$release$shared_ext$major $libname$shared_ext'
+  soname_spec='$libname$release$shared_ext$major'
+  shlibpath_var=LD_LIBRARY_PATH
+  ;;
+
+*)
+  dynamic_linker=no
+  ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test no = "$dynamic_linker" && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test yes = "$GCC"; then
+  variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+
+if test set = "${lt_cv_sys_lib_search_path_spec+set}"; then
+  sys_lib_search_path_spec=$lt_cv_sys_lib_search_path_spec
+fi
+
+if test set = "${lt_cv_sys_lib_dlsearch_path_spec+set}"; then
+  sys_lib_dlsearch_path_spec=$lt_cv_sys_lib_dlsearch_path_spec
+fi
+
+# remember unaugmented sys_lib_dlsearch_path content for libtool script decls...
+configure_time_dlsearch_path=$sys_lib_dlsearch_path_spec
+
+# ... but it needs LT_SYS_LIBRARY_PATH munging for other configure-time code
+func_munge_path_list sys_lib_dlsearch_path_spec "$LT_SYS_LIBRARY_PATH"
+
+# to be used as default LT_SYS_LIBRARY_PATH value in generated libtool
+configure_time_lt_sys_library_path=$LT_SYS_LIBRARY_PATH
+
+_LT_DECL([], [variables_saved_for_relink], [1],
+    [Variables whose values should be saved in libtool wrapper scripts and
+    restored at link time])
+_LT_DECL([], [need_lib_prefix], [0],
+    [Do we need the "lib" prefix for modules?])
+_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])
+_LT_DECL([], [version_type], [0], [Library versioning type])
+_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])
+_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])
+_LT_DECL([], [shlibpath_overrides_runpath], [0],
+    [Is shlibpath searched before the hard-coded library search path?])
+_LT_DECL([], [libname_spec], [1], [Format of library name prefix])
+_LT_DECL([], [library_names_spec], [1],
+    [[List of archive names.  First name is the real one, the rest are links.
+    The last name is the one that the linker finds with -lNAME]])
+_LT_DECL([], [soname_spec], [1],
+    [[The coded name of the library, if different from the real name]])
+_LT_DECL([], [install_override_mode], [1],
+    [Permission mode override for installation of shared libraries])
+_LT_DECL([], [postinstall_cmds], [2],
+    [Command to use after installation of a shared archive])
+_LT_DECL([], [postuninstall_cmds], [2],
+    [Command to use after uninstallation of a shared archive])
+_LT_DECL([], [finish_cmds], [2],
+    [Commands used to finish a libtool library installation in a directory])
+_LT_DECL([], [finish_eval], [1],
+    [[As "finish_cmds", except a single script fragment to be evaled but
+    not shown]])
+_LT_DECL([], [hardcode_into_libs], [0],
+    [Whether we should hardcode library paths into libraries])
+_LT_DECL([], [sys_lib_search_path_spec], [2],
+    [Compile-time system search path for libraries])
+_LT_DECL([sys_lib_dlsearch_path_spec], [configure_time_dlsearch_path], [2],
+    [Detected run-time system search path for libraries])
+_LT_DECL([], [configure_time_lt_sys_library_path], [2],
+    [Explicit LT_SYS_LIBRARY_PATH set during ./configure time])
+])# _LT_SYS_DYNAMIC_LINKER
+
+
+# _LT_PATH_TOOL_PREFIX(TOOL)
+# --------------------------
+# find a file program that can recognize shared library
+AC_DEFUN([_LT_PATH_TOOL_PREFIX],
+[m4_require([_LT_DECL_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] |  ?:[\\/]*])
+  lt_cv_path_MAGIC_CMD=$MAGIC_CMD # Let the user override the test with a path.
+  ;;
+*)
+  lt_save_MAGIC_CMD=$MAGIC_CMD
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word.  This closes a longstanding sh security hole.
+  ac_dummy="m4_if([$2], , $PATH, [$2])"
+  for ac_dir in $ac_dummy; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$1"; then
+      lt_cv_path_MAGIC_CMD=$ac_dir/"$1"
+      if test -n "$file_magic_test_file"; then
+	case $deplibs_check_method in
+	"file_magic "*)
+	  file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+	  MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+	  if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+	    $EGREP "$file_magic_regex" > /dev/null; then
+	    :
+	  else
+	    cat <<_LT_EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such.  This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem.  Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+_LT_EOF
+	  fi ;;
+	esac
+      fi
+      break
+    fi
+  done
+  IFS=$lt_save_ifs
+  MAGIC_CMD=$lt_save_MAGIC_CMD
+  ;;
+esac])
+MAGIC_CMD=$lt_cv_path_MAGIC_CMD
+if test -n "$MAGIC_CMD"; then
+  AC_MSG_RESULT($MAGIC_CMD)
+else
+  AC_MSG_RESULT(no)
+fi
+_LT_DECL([], [MAGIC_CMD], [0],
+	 [Used to examine libraries when file_magic_cmd begins with "file"])dnl
+])# _LT_PATH_TOOL_PREFIX
+
+# Old name:
+AU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])
+
+
+# _LT_PATH_MAGIC
+# --------------
+# find a file program that can recognize a shared library
+m4_defun([_LT_PATH_MAGIC],
+[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+  if test -n "$ac_tool_prefix"; then
+    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+  else
+    MAGIC_CMD=:
+  fi
+fi
+])# _LT_PATH_MAGIC
+
+
+# LT_PATH_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([LT_PATH_LD],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PROG_ECHO_BACKSLASH])dnl
+
+AC_ARG_WITH([gnu-ld],
+    [AS_HELP_STRING([--with-gnu-ld],
+	[assume the C compiler uses GNU ld @<:@default=no@:>@])],
+    [test no = "$withval" || with_gnu_ld=yes],
+    [with_gnu_ld=no])dnl
+
+ac_prog=ld
+if test yes = "$GCC"; then
+  # Check if gcc -print-prog-name=ld gives a path.
+  AC_MSG_CHECKING([for ld used by $CC])
+  case $host in
+  *-*-mingw*)
+    # gcc leaves a trailing carriage return, which upsets mingw
+    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+  *)
+    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+  esac
+  case $ac_prog in
+    # Accept absolute paths.
+    [[\\/]]* | ?:[[\\/]]*)
+      re_direlt='/[[^/]][[^/]]*/\.\./'
+      # Canonicalize the pathname of ld
+      ac_prog=`$ECHO "$ac_prog"| $SED 's%\\\\%/%g'`
+      while $ECHO "$ac_prog" | $GREP "$re_direlt" > /dev/null 2>&1; do
+	ac_prog=`$ECHO $ac_prog| $SED "s%$re_direlt%/%"`
+      done
+      test -z "$LD" && LD=$ac_prog
+      ;;
+  "")
+    # If it fails, then pretend we aren't using GCC.
+    ac_prog=ld
+    ;;
+  *)
+    # If it is relative, then search for the first ld in PATH.
+    with_gnu_ld=unknown
+    ;;
+  esac
+elif test yes = "$with_gnu_ld"; then
+  AC_MSG_CHECKING([for GNU ld])
+else
+  AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+  lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+  for ac_dir in $PATH; do
+    IFS=$lt_save_ifs
+    test -z "$ac_dir" && ac_dir=.
+    if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+      lt_cv_path_LD=$ac_dir/$ac_prog
+      # Check to see if the program is GNU ld.  I'd rather use --version,
+      # but apparently some variants of GNU ld only accept -v.
+      # Break only if it was the GNU/non-GNU ld that we prefer.
+      case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+      *GNU* | *'with BFD'*)
+	test no != "$with_gnu_ld" && break
+	;;
+      *)
+	test yes != "$with_gnu_ld" && break
+	;;
+      esac
+    fi
+  done
+  IFS=$lt_save_ifs
+else
+  lt_cv_path_LD=$LD # Let the user override the test with a path.
+fi])
+LD=$lt_cv_path_LD
+if test -n "$LD"; then
+  AC_MSG_RESULT($LD)
+else
+  AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+_LT_PATH_LD_GNU
+AC_SUBST([LD])
+
+_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])
+])# LT_PATH_LD
+
+# Old names:
+AU_ALIAS([AM_PROG_LD], [LT_PATH_LD])
+AU_ALIAS([AC_PROG_LD], [LT_PATH_LD])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_LD], [])
+dnl AC_DEFUN([AC_PROG_LD], [])
+
+
+# _LT_PATH_LD_GNU
+#- --------------
+m4_defun([_LT_PATH_LD_GNU],
+[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+  lt_cv_prog_gnu_ld=yes
+  ;;
+*)
+  lt_cv_prog_gnu_ld=no
+  ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# _LT_PATH_LD_GNU
+
+
+# _LT_CMD_RELOAD
+# --------------
+# find reload flag for linker
+#   -- PORTME Some linkers may need a different reload flag.
+m4_defun([_LT_CMD_RELOAD],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+  lt_cv_ld_reload_flag,
+  [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    if test yes != "$GCC"; then
+      reload_cmds=false
+    fi
+    ;;
+  darwin*)
+    if test yes = "$GCC"; then
+      reload_cmds='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs'
+    else
+      reload_cmds='$LD$reload_flag -o $output$reload_objs'
+    fi
+    ;;
+esac
+_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl
+_LT_TAGDECL([], [reload_cmds], [2])dnl
+])# _LT_CMD_RELOAD
+
+
+# _LT_PATH_DD
+# -----------
+# find a working dd
+m4_defun([_LT_PATH_DD],
+[AC_CACHE_CHECK([for a working dd], [ac_cv_path_lt_DD],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+: ${lt_DD:=$DD}
+AC_PATH_PROGS_FEATURE_CHECK([lt_DD], [dd],
+[if "$ac_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && ac_cv_path_lt_DD="$ac_path_lt_DD" ac_path_lt_DD_found=:
+fi])
+rm -f conftest.i conftest2.i conftest.out])
+])# _LT_PATH_DD
+
+
+# _LT_CMD_TRUNCATE
+# ----------------
+# find command to truncate a binary pipe
+m4_defun([_LT_CMD_TRUNCATE],
+[m4_require([_LT_PATH_DD])
+AC_CACHE_CHECK([how to truncate binary pipes], [lt_cv_truncate_bin],
+[printf 0123456789abcdef0123456789abcdef >conftest.i
+cat conftest.i conftest.i >conftest2.i
+lt_cv_truncate_bin=
+if "$ac_cv_path_lt_DD" bs=32 count=1 <conftest2.i >conftest.out 2>/dev/null; then
+  cmp -s conftest.i conftest.out \
+  && lt_cv_truncate_bin="$ac_cv_path_lt_DD bs=4096 count=1"
+fi
+rm -f conftest.i conftest2.i conftest.out
+test -z "$lt_cv_truncate_bin" && lt_cv_truncate_bin="$SED -e 4q"])
+_LT_DECL([lt_truncate_bin], [lt_cv_truncate_bin], [1],
+  [Command to truncate a binary pipe])
+])# _LT_CMD_TRUNCATE
+
+
+# _LT_CHECK_MAGIC_METHOD
+# ----------------------
+# how to check for library dependencies
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_MAGIC_METHOD],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# 'unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# that responds to the $file_magic_cmd with a given extended regex.
+# If you have 'file' or equivalent on your system and you're not sure
+# whether 'pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix[[4-9]]*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+beos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+bsdi[[45]]*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+  lt_cv_file_magic_cmd='/usr/bin/file -L'
+  lt_cv_file_magic_test_file=/shlib/libc.so
+  ;;
+
+cygwin*)
+  # func_win32_libid is a shell function defined in ltmain.sh
+  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+  lt_cv_file_magic_cmd='func_win32_libid'
+  ;;
+
+mingw* | pw32*)
+  # Base MSYS/MinGW do not provide the 'file' command needed by
+  # func_win32_libid shell function, so use a weaker test based on 'objdump',
+  # unless we find 'file', for example because we are cross-compiling.
+  if ( file / ) >/dev/null 2>&1; then
+    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+    lt_cv_file_magic_cmd='func_win32_libid'
+  else
+    # Keep this pattern in sync with the one in func_win32_libid.
+    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'
+    lt_cv_file_magic_cmd='$OBJDUMP -f'
+  fi
+  ;;
+
+cegcc*)
+  # use the weaker test based on 'objdump'. See mingw*.
+  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'
+  lt_cv_file_magic_cmd='$OBJDUMP -f'
+  ;;
+
+darwin* | rhapsody*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+freebsd* | dragonfly*)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    case $host_cpu in
+    i*86 )
+      # Not sure whether the presence of OpenBSD here was a mistake.
+      # Let's accept both of them until this is cleared up.
+      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+      lt_cv_file_magic_cmd=/usr/bin/file
+      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+      ;;
+    esac
+  else
+    lt_cv_deplibs_check_method=pass_all
+  fi
+  ;;
+
+haiku*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+hpux10.20* | hpux11*)
+  lt_cv_file_magic_cmd=/usr/bin/file
+  case $host_cpu in
+  ia64*)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+    ;;
+  hppa*64*)
+    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]']
+    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+    ;;
+  *)
+    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\.[[0-9]]) shared library'
+    lt_cv_file_magic_test_file=/usr/lib/libc.sl
+    ;;
+  esac
+  ;;
+
+interix[[3-9]]*)
+  # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+  ;;
+
+irix5* | irix6* | nonstopux*)
+  case $LD in
+  *-32|*"-32 ") libmagic=32-bit;;
+  *-n32|*"-n32 ") libmagic=N32;;
+  *-64|*"-64 ") libmagic=64-bit;;
+  *) libmagic=never-match;;
+  esac
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+# This must be glibc/ELF.
+linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+netbsd* | netbsdelf*-gnu)
+  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+  fi
+  ;;
+
+newos6*)
+  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+  lt_cv_file_magic_cmd=/usr/bin/file
+  lt_cv_file_magic_test_file=/usr/lib/libnls.so
+  ;;
+
+*nto* | *qnx*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+openbsd* | bitrig*)
+  if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+  else
+    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+  fi
+  ;;
+
+osf3* | osf4* | osf5*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+rdos*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+solaris*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+
+sysv4 | sysv4.3*)
+  case $host_vendor in
+  motorola)
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+    ;;
+  ncr)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  sequent)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+    ;;
+  sni)
+    lt_cv_file_magic_cmd='/bin/file'
+    lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+    lt_cv_file_magic_test_file=/lib/libc.so
+    ;;
+  siemens)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  pc)
+    lt_cv_deplibs_check_method=pass_all
+    ;;
+  esac
+  ;;
+
+tpf*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+os2*)
+  lt_cv_deplibs_check_method=pass_all
+  ;;
+esac
+])
+
+file_magic_glob=
+want_nocaseglob=no
+if test "$build" = "$host"; then
+  case $host_os in
+  mingw* | pw32*)
+    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then
+      want_nocaseglob=yes
+    else
+      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e "s/\(..\)/s\/[[\1]]\/[[\1]]\/g;/g"`
+    fi
+    ;;
+  esac
+fi
+
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+
+_LT_DECL([], [deplibs_check_method], [1],
+    [Method to check whether dependent libraries are shared objects])
+_LT_DECL([], [file_magic_cmd], [1],
+    [Command to use when deplibs_check_method = "file_magic"])
+_LT_DECL([], [file_magic_glob], [1],
+    [How to find potential files when deplibs_check_method = "file_magic"])
+_LT_DECL([], [want_nocaseglob], [1],
+    [Find potential files using nocaseglob when deplibs_check_method = "file_magic"])
+])# _LT_CHECK_MAGIC_METHOD
+
+
+# LT_PATH_NM
+# ----------
+# find the pathname to a BSD- or MS-compatible name lister
+AC_DEFUN([LT_PATH_NM],
+[AC_REQUIRE([AC_PROG_CC])dnl
+AC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,
+[if test -n "$NM"; then
+  # Let the user override the test.
+  lt_cv_path_NM=$NM
+else
+  lt_nm_to_check=${ac_tool_prefix}nm
+  if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+    lt_nm_to_check="$lt_nm_to_check nm"
+  fi
+  for lt_tmp_nm in $lt_nm_to_check; do
+    lt_save_ifs=$IFS; IFS=$PATH_SEPARATOR
+    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+      IFS=$lt_save_ifs
+      test -z "$ac_dir" && ac_dir=.
+      tmp_nm=$ac_dir/$lt_tmp_nm
+      if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext"; then
+	# Check to see if the nm accepts a BSD-compat flag.
+	# Adding the 'sed 1q' prevents false positives on HP-UX, which says:
+	#   nm: unknown option "B" ignored
+	# Tru64's nm complains that /dev/null is an invalid object file
+	# MSYS converts /dev/null to NUL, MinGW nm treats NUL as empty
+	case $build_os in
+	mingw*) lt_bad_file=conftest.nm/nofile ;;
+	*) lt_bad_file=/dev/null ;;
+	esac
+	case `"$tmp_nm" -B $lt_bad_file 2>&1 | sed '1q'` in
+	*$lt_bad_file* | *'Invalid file or object type'*)
+	  lt_cv_path_NM="$tmp_nm -B"
+	  break 2
+	  ;;
+	*)
+	  case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+	  */dev/null*)
+	    lt_cv_path_NM="$tmp_nm -p"
+	    break 2
+	    ;;
+	  *)
+	    lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+	    continue # so that we can try to find one that supports BSD flags
+	    ;;
+	  esac
+	  ;;
+	esac
+      fi
+    done
+    IFS=$lt_save_ifs
+  done
+  : ${lt_cv_path_NM=no}
+fi])
+if test no != "$lt_cv_path_NM"; then
+  NM=$lt_cv_path_NM
+else
+  # Didn't find any BSD compatible name lister, look for dumpbin.
+  if test -n "$DUMPBIN"; then :
+    # Let the user override the test.
+  else
+    AC_CHECK_TOOLS(DUMPBIN, [dumpbin "link -dump"], :)
+    case `$DUMPBIN -symbols -headers /dev/null 2>&1 | sed '1q'` in
+    *COFF*)
+      DUMPBIN="$DUMPBIN -symbols -headers"
+      ;;
+    *)
+      DUMPBIN=:
+      ;;
+    esac
+  fi
+  AC_SUBST([DUMPBIN])
+  if test : != "$DUMPBIN"; then
+    NM=$DUMPBIN
+  fi
+fi
+test -z "$NM" && NM=nm
+AC_SUBST([NM])
+_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl
+
+AC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],
+  [lt_cv_nm_interface="BSD nm"
+  echo "int some_variable = 0;" > conftest.$ac_ext
+  (eval echo "\"\$as_me:$LINENO: $ac_compile\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$ac_compile" 2>conftest.err)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: $NM \\\"conftest.$ac_objext\\\"\"" >&AS_MESSAGE_LOG_FD)
+  (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out)
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  (eval echo "\"\$as_me:$LINENO: output\"" >&AS_MESSAGE_LOG_FD)
+  cat conftest.out >&AS_MESSAGE_LOG_FD
+  if $GREP 'External.*some_variable' conftest.out > /dev/null; then
+    lt_cv_nm_interface="MS dumpbin"
+  fi
+  rm -f conftest*])
+])# LT_PATH_NM
+
+# Old names:
+AU_ALIAS([AM_PROG_NM], [LT_PATH_NM])
+AU_ALIAS([AC_PROG_NM], [LT_PATH_NM])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_PROG_NM], [])
+dnl AC_DEFUN([AC_PROG_NM], [])
+
+# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+# --------------------------------
+# how to determine the name of the shared library
+# associated with a specific link library.
+#  -- PORTME fill in with the dynamic library characteristics
+m4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],
+[m4_require([_LT_DECL_EGREP])
+m4_require([_LT_DECL_OBJDUMP])
+m4_require([_LT_DECL_DLLTOOL])
+AC_CACHE_CHECK([how to associate runtime and link libraries],
+lt_cv_sharedlib_from_linklib_cmd,
+[lt_cv_sharedlib_from_linklib_cmd='unknown'
+
+case $host_os in
+cygwin* | mingw* | pw32* | cegcc*)
+  # two different shell functions defined in ltmain.sh;
+  # decide which one to use based on capabilities of $DLLTOOL
+  case `$DLLTOOL --help 2>&1` in
+  *--identify-strict*)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib
+    ;;
+  *)
+    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback
+    ;;
+  esac
+  ;;
+*)
+  # fallback: assume linklib IS sharedlib
+  lt_cv_sharedlib_from_linklib_cmd=$ECHO
+  ;;
+esac
+])
+sharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd
+test -z "$sharedlib_from_linklib_cmd" && sharedlib_from_linklib_cmd=$ECHO
+
+_LT_DECL([], [sharedlib_from_linklib_cmd], [1],
+    [Command to associate shared and link libraries])
+])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB
+
+
+# _LT_PATH_MANIFEST_TOOL
+# ----------------------
+# locate the manifest tool
+m4_defun([_LT_PATH_MANIFEST_TOOL],
+[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)
+test -z "$MANIFEST_TOOL" && MANIFEST_TOOL=mt
+AC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],
+  [lt_cv_path_mainfest_tool=no
+  echo "$as_me:$LINENO: $MANIFEST_TOOL '-?'" >&AS_MESSAGE_LOG_FD
+  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out
+  cat conftest.err >&AS_MESSAGE_LOG_FD
+  if $GREP 'Manifest Tool' conftest.out > /dev/null; then
+    lt_cv_path_mainfest_tool=yes
+  fi
+  rm -f conftest*])
+if test yes != "$lt_cv_path_mainfest_tool"; then
+  MANIFEST_TOOL=:
+fi
+_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl
+])# _LT_PATH_MANIFEST_TOOL
+
+
+# _LT_DLL_DEF_P([FILE])
+# ---------------------
+# True iff FILE is a Windows DLL '.def' file.
+# Keep in sync with func_dll_def_p in the libtool script
+AC_DEFUN([_LT_DLL_DEF_P],
+[dnl
+  test DEF = "`$SED -n dnl
+    -e '\''s/^[[	 ]]*//'\'' dnl Strip leading whitespace
+    -e '\''/^\(;.*\)*$/d'\'' dnl      Delete empty lines and comments
+    -e '\''s/^\(EXPORTS\|LIBRARY\)\([[	 ]].*\)*$/DEF/p'\'' dnl
+    -e q dnl                          Only consider the first "real" line
+    $1`" dnl
+])# _LT_DLL_DEF_P
+
+
+# LT_LIB_M
+# --------
+# check for math library
+AC_DEFUN([LT_LIB_M],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)
+  # These system don't have libm, or don't need it
+  ;;
+*-ncr-sysv4.3*)
+  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=-lmw)
+  AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+  ;;
+*)
+  AC_CHECK_LIB(m, cos, LIBM=-lm)
+  ;;
+esac
+AC_SUBST([LIBM])
+])# LT_LIB_M
+
+# Old name:
+AU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_CHECK_LIBM], [])
+
+
+# _LT_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------
+m4_defun([_LT_COMPILER_NO_RTTI],
+[m4_require([_LT_TAG_COMPILER])dnl
+
+_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test yes = "$GCC"; then
+  case $cc_basename in
+  nvcc*)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;
+  esac
+
+  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+    lt_cv_prog_compiler_rtti_exceptions,
+    [-fno-rtti -fno-exceptions], [],
+    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],
+	[Compiler flag to turn off builtin functions])
+])# _LT_COMPILER_NO_RTTI
+
+
+# _LT_CMD_GLOBAL_SYMBOLS
+# ----------------------
+m4_defun([_LT_CMD_GLOBAL_SYMBOLS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+AC_REQUIRE([LT_PATH_LD])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix.  What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+  symcode='[[BCDT]]'
+  ;;
+cygwin* | mingw* | pw32* | cegcc*)
+  symcode='[[ABCDGISTW]]'
+  ;;
+hpux*)
+  if test ia64 = "$host_cpu"; then
+    symcode='[[ABCDEGRST]]'
+  fi
+  ;;
+irix* | nonstopux*)
+  symcode='[[BCDEGRST]]'
+  ;;
+osf*)
+  symcode='[[BCDEGQRST]]'
+  ;;
+solaris*)
+  symcode='[[BDRT]]'
+  ;;
+sco3.2v5*)
+  symcode='[[DT]]'
+  ;;
+sysv4.2uw2*)
+  symcode='[[DT]]'
+  ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+  symcode='[[ABDT]]'
+  ;;
+sysv4)
+  symcode='[[DFNSTU]]'
+  ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+  symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  # Gets list of data symbols to import.
+  lt_cv_sys_global_symbol_to_import="sed -n -e 's/^I .* \(.*\)$/\1/p'"
+  # Adjust the below global symbol transforms to fixup imported variables.
+  lt_cdecl_hook=" -e 's/^I .* \(.*\)$/extern __declspec(dllimport) char \1;/p'"
+  lt_c_name_hook=" -e 's/^I .* \(.*\)$/  {\"\1\", (void *) 0},/p'"
+  lt_c_name_lib_hook="\
+  -e 's/^I .* \(lib.*\)$/  {\"\1\", (void *) 0},/p'\
+  -e 's/^I .* \(.*\)$/  {\"lib\1\", (void *) 0},/p'"
+else
+  # Disable hooks by default.
+  lt_cv_sys_global_symbol_to_import=
+  lt_cdecl_hook=
+  lt_c_name_hook=
+  lt_c_name_lib_hook=
+fi
+
+# Transform an extracted symbol line into a proper C declaration.
+# Some systems (esp. on ia64) link data and code symbols differently,
+# so use this general approach.
+lt_cv_sys_global_symbol_to_cdecl="sed -n"\
+$lt_cdecl_hook\
+" -e 's/^T .* \(.*\)$/extern int \1();/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/extern char \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n"\
+$lt_c_name_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/p'"
+
+# Transform an extracted symbol line into symbol name with lib prefix and
+# symbol address.
+lt_cv_sys_global_symbol_to_c_name_address_lib_prefix="sed -n"\
+$lt_c_name_lib_hook\
+" -e 's/^: \(.*\) .*$/  {\"\1\", (void *) 0},/p'"\
+" -e 's/^$symcode$symcode* .* \(lib.*\)$/  {\"\1\", (void *) \&\1},/p'"\
+" -e 's/^$symcode$symcode* .* \(.*\)$/  {\"lib\1\", (void *) \&\1},/p'"
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+  opt_cr=`$ECHO 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+  ;;
+esac
+
+# Try without a prefix underscore, then with it.
+for ac_symprfx in "" "_"; do
+
+  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+  symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+  # Write the raw and C identifiers.
+  if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+    # Fake it for dumpbin and say T for any non-static function,
+    # D for any global variable and I for any imported variable.
+    # Also find C++ and __fastcall symbols from MSVC++,
+    # which start with @ or ?.
+    lt_cv_sys_global_symbol_pipe="$AWK ['"\
+"     {last_section=section; section=\$ 3};"\
+"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};"\
+"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};"\
+"     /^ *Symbol name *: /{split(\$ 0,sn,\":\"); si=substr(sn[2],2)};"\
+"     /^ *Type *: code/{print \"T\",si,substr(si,length(prfx))};"\
+"     /^ *Type *: data/{print \"I\",si,substr(si,length(prfx))};"\
+"     \$ 0!~/External *\|/{next};"\
+"     / 0+ UNDEF /{next}; / UNDEF \([^|]\)*()/{next};"\
+"     {if(hide[section]) next};"\
+"     {f=\"D\"}; \$ 0~/\(\).*\|/{f=\"T\"};"\
+"     {split(\$ 0,a,/\||\r/); split(a[2],s)};"\
+"     s[1]~/^[@?]/{print f,s[1],s[1]; next};"\
+"     s[1]~prfx {split(s[1],t,\"@\"); print f,t[1],substr(t[1],length(prfx))}"\
+"     ' prfx=^$ac_symprfx]"
+  else
+    lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[	 ]]\($symcode$symcode*\)[[	 ]][[	 ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+  fi
+  lt_cv_sys_global_symbol_pipe="$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'"
+
+  # Check to see that the pipe works correctly.
+  pipe_works=no
+
+  rm -f conftest*
+  cat > conftest.$ac_ext <<_LT_EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(void);
+void nm_test_func(void){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+_LT_EOF
+
+  if AC_TRY_EVAL(ac_compile); then
+    # Now try to grab the symbols.
+    nlist=conftest.nm
+    $ECHO "$as_me:$LINENO: $NM conftest.$ac_objext | $lt_cv_sys_global_symbol_pipe > $nlist" >&AS_MESSAGE_LOG_FD
+    if eval "$NM" conftest.$ac_objext \| "$lt_cv_sys_global_symbol_pipe" \> $nlist 2>&AS_MESSAGE_LOG_FD && test -s "$nlist"; then
+      # Try sorting and uniquifying the output.
+      if sort "$nlist" | uniq > "$nlist"T; then
+	mv -f "$nlist"T "$nlist"
+      else
+	rm -f "$nlist"T
+      fi
+
+      # Make sure that we snagged all the symbols we need.
+      if $GREP ' nm_test_var$' "$nlist" >/dev/null; then
+	if $GREP ' nm_test_func$' "$nlist" >/dev/null; then
+	  cat <<_LT_EOF > conftest.$ac_ext
+/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */
+#if defined _WIN32 || defined __CYGWIN__ || defined _WIN32_WCE
+/* DATA imports from DLLs on WIN32 can't be const, because runtime
+   relocations are performed -- see ld's documentation on pseudo-relocs.  */
+# define LT@&t@_DLSYM_CONST
+#elif defined __osf__
+/* This system does not cope well with relocations in const data.  */
+# define LT@&t@_DLSYM_CONST
+#else
+# define LT@&t@_DLSYM_CONST const
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+_LT_EOF
+	  # Now generate the symbol file.
+	  eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | $GREP -v main >> conftest.$ac_ext'
+
+	  cat <<_LT_EOF >> conftest.$ac_ext
+
+/* The mapping between symbol names and symbols.  */
+LT@&t@_DLSYM_CONST struct {
+  const char *name;
+  void       *address;
+}
+lt__PROGRAM__LTX_preloaded_symbols[[]] =
+{
+  { "@PROGRAM@", (void *) 0 },
+_LT_EOF
+	  $SED "s/^$symcode$symcode* .* \(.*\)$/  {\"\1\", (void *) \&\1},/" < "$nlist" | $GREP -v main >> conftest.$ac_ext
+	  cat <<\_LT_EOF >> conftest.$ac_ext
+  {0, (void *) 0}
+};
+
+/* This works around a problem in FreeBSD linker */
+#ifdef FREEBSD_WORKAROUND
+static const void *lt_preloaded_setup() {
+  return lt__PROGRAM__LTX_preloaded_symbols;
+}
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+_LT_EOF
+	  # Now try linking the two files.
+	  mv conftest.$ac_objext conftstm.$ac_objext
+	  lt_globsym_save_LIBS=$LIBS
+	  lt_globsym_save_CFLAGS=$CFLAGS
+	  LIBS=conftstm.$ac_objext
+	  CFLAGS="$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+	  if AC_TRY_EVAL(ac_link) && test -s conftest$ac_exeext; then
+	    pipe_works=yes
+	  fi
+	  LIBS=$lt_globsym_save_LIBS
+	  CFLAGS=$lt_globsym_save_CFLAGS
+	else
+	  echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+	fi
+      else
+	echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+      fi
+    else
+      echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+    fi
+  else
+    echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+    cat conftest.$ac_ext >&5
+  fi
+  rm -rf conftest* conftst*
+
+  # Do not use the global_symbol_pipe unless it works.
+  if test yes = "$pipe_works"; then
+    break
+  else
+    lt_cv_sys_global_symbol_pipe=
+  fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+  lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+  AC_MSG_RESULT(failed)
+else
+  AC_MSG_RESULT(ok)
+fi
+
+# Response file support.
+if test "$lt_cv_nm_interface" = "MS dumpbin"; then
+  nm_file_list_spec='@'
+elif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then
+  nm_file_list_spec='@'
+fi
+
+_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],
+    [Take the output of nm and produce a listing of raw symbols and C names])
+_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],
+    [Transform the output of nm in a proper C declaration])
+_LT_DECL([global_symbol_to_import], [lt_cv_sys_global_symbol_to_import], [1],
+    [Transform the output of nm into a list of symbols to manually relocate])
+_LT_DECL([global_symbol_to_c_name_address],
+    [lt_cv_sys_global_symbol_to_c_name_address], [1],
+    [Transform the output of nm in a C name address pair])
+_LT_DECL([global_symbol_to_c_name_address_lib_prefix],
+    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],
+    [Transform the output of nm in a C name address pair when lib prefix is needed])
+_LT_DECL([nm_interface], [lt_cv_nm_interface], [1],
+    [The name lister interface])
+_LT_DECL([], [nm_file_list_spec], [1],
+    [Specify filename containing input files for $NM])
+]) # _LT_CMD_GLOBAL_SYMBOLS
+
+
+# _LT_COMPILER_PIC([TAGNAME])
+# ---------------------------
+m4_defun([_LT_COMPILER_PIC],
+[m4_require([_LT_TAG_COMPILER])dnl
+_LT_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_TAGVAR(lt_prog_compiler_static, $1)=
+
+m4_if([$1], [CXX], [
+  # C++ specific cases for pic, static, wl, etc.
+  if test yes = "$GXX"; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+    aix*)
+      # All AIX code is PIC.
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+    mingw* | cygwin* | os2* | pw32* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
+      ;;
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+    *djgpp*)
+      # DJGPP does not support shared libraries at all
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+      ;;
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+    *qnx* | *nto*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+  else
+    case $host_os in
+      aix[[4-9]]*)
+	# All AIX code is PIC.
+	if test ia64 = "$host_cpu"; then
+	  # AIX 5 now supports IA64 processor
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	else
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+	fi
+	;;
+      chorus*)
+	case $cc_basename in
+	cxch68*)
+	  # Green Hills C++ Compiler
+	  # _LT_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+	  ;;
+	esac
+	;;
+      mingw* | cygwin* | os2* | pw32* | cegcc*)
+	# This hack is so that the source file can tell whether it is being
+	# built for inclusion in a dll (and should export symbols for example).
+	m4_if([$1], [GCJ], [],
+	  [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+	;;
+      dgux*)
+	case $cc_basename in
+	  ec++*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  ghcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      freebsd* | dragonfly*)
+	# FreeBSD uses GNU C++
+	;;
+      hpux9* | hpux10* | hpux11*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+	    if test ia64 != "$host_cpu"; then
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	    fi
+	    ;;
+	  aCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+	    case $host_cpu in
+	    hppa*64*|ia64*)
+	      # +Z the default
+	      ;;
+	    *)
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	      ;;
+	    esac
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      interix*)
+	# This is c89, which is MS Visual C++ (no shared libs)
+	# Anyone wants to do a port?
+	;;
+      irix5* | irix6* | nonstopux*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    # CC pic flag -KPIC is the default.
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+	case $cc_basename in
+	  KCC*)
+	    # KAI C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    ;;
+	  ecpc* )
+	    # old Intel C++ for x86_64, which still supported -KPIC.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  icpc* )
+	    # Intel C++, used to be incompatible with GCC.
+	    # ICC 10 doesn't accept -KPIC any more.
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	    ;;
+	  pgCC* | pgcpp*)
+	    # Portland Group C++ compiler
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  cxx*)
+	    # Compaq C++
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)
+	    # IBM XL 8.0, 9.0 on PPC and BlueGene
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+      lynxos*)
+	;;
+      m88k*)
+	;;
+      mvs*)
+	case $cc_basename in
+	  cxx*)
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      netbsd* | netbsdelf*-gnu)
+	;;
+      *qnx* | *nto*)
+        # QNX uses GNU C++, but need to define -shared option too, otherwise
+        # it will coredump.
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+        ;;
+      osf3* | osf4* | osf5*)
+	case $cc_basename in
+	  KCC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+	    ;;
+	  RCC*)
+	    # Rational C++ 2.4.1
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  cxx*)
+	    # Digital/Compaq C++
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    # Make sure the PIC flag is empty.  It appears that all Alpha
+	    # Linux and Compaq Tru64 Unix objects are PIC.
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      psos*)
+	;;
+      solaris*)
+	case $cc_basename in
+	  CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	    ;;
+	  gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sunos4*)
+	case $cc_basename in
+	  CC*)
+	    # Sun C++ 4.x
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	  lcc*)
+	    # Lucid
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+	case $cc_basename in
+	  CC*)
+	    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	    ;;
+	esac
+	;;
+      tandem*)
+	case $cc_basename in
+	  NCC*)
+	    # NonStop-UX NCC 3.20
+	    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	    ;;
+	  *)
+	    ;;
+	esac
+	;;
+      vxworks*)
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+	;;
+    esac
+  fi
+],
+[
+  if test yes = "$GCC"; then
+    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+    case $host_os in
+      aix*)
+      # All AIX code is PIC.
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+        ;;
+      m68k)
+            # FIXME: we need at least 68020 code to build shared libraries, but
+            # adding the '-m68020' flag to GCC prevents building anything better,
+            # like '-m68040'.
+            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+        ;;
+      esac
+      ;;
+
+    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+      # PIC is the default for these OSes.
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      # Although the cygwin gcc ignores -fPIC, still need this for old-style
+      # (--disable-auto-import) libraries
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      ;;
+
+    haiku*)
+      # PIC is the default for Haiku.
+      # The "-static" flag exists, but is broken.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)=
+      ;;
+
+    hpux*)
+      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit
+      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag
+      # sets the default TLS model and affects inlining.
+      case $host_cpu in
+      hppa*64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	;;
+      esac
+      ;;
+
+    interix[[3-9]]*)
+      # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+      # Instead, we relocate shared libraries at runtime.
+      ;;
+
+    msdosdjgpp*)
+      # Just because we use GCC doesn't mean we suddenly get shared libraries
+      # on systems that don't support them.
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      enable_shared=no
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+      fi
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+      ;;
+    esac
+
+    case $cc_basename in
+    nvcc*) # Cuda Compiler Driver 2.2
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '
+      if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)="-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)"
+      fi
+      ;;
+    esac
+  else
+    # PORTME Check for flag to pass linker flags through the system compiler.
+    case $host_os in
+    aix*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      if test ia64 = "$host_cpu"; then
+	# AIX 5 now supports IA64 processor
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      else
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+      fi
+      ;;
+
+    darwin* | rhapsody*)
+      # PIC is the default on this platform
+      # Common symbols not allowed in MH_DYLIB files
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+      case $cc_basename in
+      nagfor*)
+        # NAG Fortran compiler
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      esac
+      ;;
+
+    mingw* | cygwin* | pw32* | os2* | cegcc*)
+      # This hack is so that the source file can tell whether it is being
+      # built for inclusion in a dll (and should export symbols for example).
+      m4_if([$1], [GCJ], [],
+	[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])
+      case $host_os in
+      os2*)
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-static'
+	;;
+      esac
+      ;;
+
+    hpux9* | hpux10* | hpux11*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+      # not for PA HP-UX.
+      case $host_cpu in
+      hppa*64*|ia64*)
+	# +Z the default
+	;;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+	;;
+      esac
+      # Is there a better lt_prog_compiler_static that works with the bundled CC?
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='$wl-a ${wl}archive'
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # PIC (with -KPIC) is the default.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+      case $cc_basename in
+      # old Intel for x86_64, which still supported -KPIC.
+      ecc*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # flang / f18. f95 an alias for gfortran or flang on Debian
+      flang* | f18* | f95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # icc used to be incompatible with GCC.
+      # ICC 10 doesn't accept -KPIC any more.
+      icc* | ifort*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+        ;;
+      # Lahey Fortran 8.1.
+      lf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'
+	;;
+      nagfor*)
+	# NAG Fortran compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	;;
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	;;
+      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)
+        # Portland Group compilers (*not* the Pentium gcc compiler,
+	# which looks to be a dead project)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+        ;;
+      ccc*)
+        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+        # All Alpha code is PIC.
+        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+        ;;
+      xl* | bgxl* | bgf* | mpixl*)
+	# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'
+	;;
+      *)
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ Ceres\ Fortran* | *Sun*Fortran*\ [[1-7]].* | *Sun*Fortran*\ 8.[[0-3]]*)
+	  # Sun Fortran 8.3 passes all unrecognized flags to the linker
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''
+	  ;;
+	*Sun\ F* | *Sun*Fortran*)
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+	  ;;
+	*Sun\ C*)
+	  # Sun C 5.9
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  ;;
+        *Intel*\ [[CF]]*Compiler*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'
+	  ;;
+	*Portland\ Group*)
+	  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+	  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+	  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+	  ;;
+	esac
+	;;
+      esac
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *nto* | *qnx*)
+      # QNX uses GNU C++, but need to define -shared option too, otherwise
+      # it will coredump.
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'
+      ;;
+
+    osf3* | osf4* | osf5*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      # All OSF/1 code is PIC.
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    rdos*)
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      case $cc_basename in
+      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+      *)
+	_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4 | sysv4.2uw2* | sysv4.3*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+	_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      fi
+      ;;
+
+    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    unicos*)
+      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+      ;;
+
+    *)
+      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+      ;;
+    esac
+  fi
+])
+case $host_os in
+  # For platforms that do not support PIC, -DPIC is meaningless:
+  *djgpp*)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)=
+    ;;
+  *)
+    _LT_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])"
+    ;;
+esac
+
+AC_CACHE_CHECK([for $compiler option to produce PIC],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],
+  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])
+_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_TAGVAR(lt_prog_compiler_pic, $1)"; then
+  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],
+    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],
+    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],
+    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in
+     "" | " "*) ;;
+     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+     esac],
+    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=
+     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],
+	[Additional compiler flags for building library objects])
+
+_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],
+	[How to pass a linker flag through the compiler])
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\"
+_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),
+  $lt_tmp_static_flag,
+  [],
+  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])
+_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],
+	[Compiler flag to prevent dynamic linking])
+])# _LT_COMPILER_PIC
+
+
+# _LT_LINKER_SHLIBS([TAGNAME])
+# ----------------------------
+# See if the linker supports building shared libraries.
+m4_defun([_LT_LINKER_SHLIBS],
+[AC_REQUIRE([LT_PATH_LD])dnl
+AC_REQUIRE([LT_PATH_NM])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_DECL_SED])dnl
+m4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl
+m4_require([_LT_TAG_COMPILER])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+m4_if([$1], [CXX], [
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  case $host_os in
+  aix[[4-9]]*)
+    # If we're using GNU nm, then we don't want the "-C" option.
+    # -C means demangle to GNU nm, but means don't demangle to AIX nm.
+    # Without the "-l" option, or with the "-B" option, AIX nm treats
+    # weak defined symbols like other global defined symbols, whereas
+    # GNU nm marks them as "W".
+    # While the 'weak' keyword is ignored in the Export File, we need
+    # it in the Import File for the 'aix-soname' feature, so we have
+    # to replace the "-B" option with "-P" for AIX nm.
+    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+    else
+      _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+    fi
+    ;;
+  pw32*)
+    _LT_TAGVAR(export_symbols_cmds, $1)=$ltdll_cmds
+    ;;
+  cygwin* | mingw* | cegcc*)
+    case $cc_basename in
+    cl*)
+      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+      ;;
+    *)
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+      ;;
+    esac
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  *)
+    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+    ;;
+  esac
+], [
+  runpath_var=
+  _LT_TAGVAR(allow_undefined_flag, $1)=
+  _LT_TAGVAR(always_export_symbols, $1)=no
+  _LT_TAGVAR(archive_cmds, $1)=
+  _LT_TAGVAR(archive_expsym_cmds, $1)=
+  _LT_TAGVAR(compiler_needs_object, $1)=no
+  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+  _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+  _LT_TAGVAR(hardcode_automatic, $1)=no
+  _LT_TAGVAR(hardcode_direct, $1)=no
+  _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+  _LT_TAGVAR(hardcode_minus_L, $1)=no
+  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+  _LT_TAGVAR(inherit_rpath, $1)=no
+  _LT_TAGVAR(link_all_deplibs, $1)=unknown
+  _LT_TAGVAR(module_cmds, $1)=
+  _LT_TAGVAR(module_expsym_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_new_cmds, $1)=
+  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+  _LT_TAGVAR(thread_safe_flag_spec, $1)=
+  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+  # include_expsyms should be a list of space-separated symbols to be *always*
+  # included in the symbol list
+  _LT_TAGVAR(include_expsyms, $1)=
+  # exclude_expsyms can be an extended regexp of symbols to exclude
+  # it will be wrapped by ' (' and ')$', so one must not match beginning or
+  # end of line.  Example: 'a|bc|.*d.*' will exclude the symbols 'a' and 'bc',
+  # as well as any symbol that contains 'd'.
+  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']
+  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+  # platforms (ab)use it in PIC code, but their linkers get confused if
+  # the symbol is explicitly referenced.  Since portable code cannot
+  # rely on this symbol name, it's probably fine to never include it in
+  # preloaded symbol tables.
+  # Exclude shared library initialization/finalization symbols.
+dnl Note also adjust exclude_expsyms for C++ above.
+  extract_expsyms_cmds=
+
+  case $host_os in
+  cygwin* | mingw* | pw32* | cegcc*)
+    # FIXME: the MSVC++ port hasn't been tested in a loooong time
+    # When not using gcc, we currently assume that we are using
+    # Microsoft Visual C++.
+    if test yes != "$GCC"; then
+      with_gnu_ld=no
+    fi
+    ;;
+  interix*)
+    # we just hope/assume this is gcc and not c89 (= MSVC++)
+    with_gnu_ld=yes
+    ;;
+  openbsd* | bitrig*)
+    with_gnu_ld=no
+    ;;
+  linux* | k*bsd*-gnu | gnu*)
+    _LT_TAGVAR(link_all_deplibs, $1)=no
+    ;;
+  esac
+
+  _LT_TAGVAR(ld_shlibs, $1)=yes
+
+  # On some targets, GNU ld is compatible enough with the native linker
+  # that we're better off using the native interface for both.
+  lt_use_gnu_ld_interface=no
+  if test yes = "$with_gnu_ld"; then
+    case $host_os in
+      aix*)
+	# The AIX port of GNU ld has always aspired to compatibility
+	# with the native linker.  However, as the warning in the GNU ld
+	# block says, versions before 2.19.5* couldn't really create working
+	# shared libraries, regardless of the interface used.
+	case `$LD -v 2>&1` in
+	  *\ \(GNU\ Binutils\)\ 2.19.5*) ;;
+	  *\ \(GNU\ Binutils\)\ 2.[[2-9]]*) ;;
+	  *\ \(GNU\ Binutils\)\ [[3-9]]*) ;;
+	  *)
+	    lt_use_gnu_ld_interface=yes
+	    ;;
+	esac
+	;;
+      *)
+	lt_use_gnu_ld_interface=yes
+	;;
+    esac
+  fi
+
+  if test yes = "$lt_use_gnu_ld_interface"; then
+    # If archive_cmds runs LD, not CC, wlarc should be empty
+    wlarc='$wl'
+
+    # Set some defaults for GNU ld with shared library support. These
+    # are reset later if shared libraries are not supported. Putting them
+    # here allows them to be overridden if necessary.
+    runpath_var=LD_RUN_PATH
+    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+    # ancient GNU ld didn't support --whole-archive et. al.
+    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+    else
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+    supports_anon_versioning=no
+    case `$LD -v | $SED -e 's/([^)]\+)\s\+//' 2>&1` in
+      *GNU\ gold*) supports_anon_versioning=yes ;;
+      *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+      *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+      *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+      *\ 2.11.*) ;; # other 2.11 versions
+      *) supports_anon_versioning=yes ;;
+    esac
+
+    # See if GNU ld supports shared libraries.
+    case $host_os in
+    aix[[3-9]]*)
+      # On AIX/PPC, the GNU linker is very broken
+      if test ia64 != "$host_cpu"; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.19, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support.  If you
+*** really care for shared libraries, you may want to install binutils
+*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.
+*** You will then need to restart the configuration process.
+
+_LT_EOF
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    beos*)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	# support --undefined.  This deserves some investigation.  FIXME
+	_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+      # as there is no search path for DLLs.
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=no
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\'' | sort | uniq > $export_symbols'
+      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']
+
+      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	# If the export-symbols file already is a .def file, use it as
+	# is; otherwise, prepend EXPORTS...
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+          cp $export_symbols $output_objdir/$soname.def;
+        else
+          echo EXPORTS > $output_objdir/$soname.def;
+          cat $export_symbols >> $output_objdir/$soname.def;
+        fi~
+        $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    haiku*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      shrext_cmds=.dll
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
+    interix[[3-9]]*)
+      _LT_TAGVAR(hardcode_direct, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+      # Instead, shared libraries are loaded at an image base (0x10000000 by
+      # default) and relocated if they conflict, which is a slow very memory
+      # consuming and fragmenting process.  To avoid this, we pick a random,
+      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+      ;;
+
+    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)
+      tmp_diet=no
+      if test linux-dietlibc = "$host_os"; then
+	case $cc_basename in
+	  diet\ *) tmp_diet=yes;;	# linux-dietlibc with static linking (!diet-dyn)
+	esac
+      fi
+      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \
+	 && test no = "$tmp_diet"
+      then
+	tmp_addflag=' $pic_flag'
+	tmp_sharedflag='-shared'
+	case $cc_basename,$host_cpu in
+        pgcc*)				# Portland Group C compiler
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag'
+	  ;;
+	pgf77* | pgf90* | pgf95* | pgfortran*)
+					# Portland Group f77 and f90 compilers
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  tmp_addflag=' $pic_flag -Mnomain' ;;
+	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
+	  tmp_addflag=' -i_dynamic' ;;
+	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
+	  tmp_addflag=' -i_dynamic -nofor_main' ;;
+	ifc* | ifort*)			# Intel Fortran compiler
+	  tmp_addflag=' -nofor_main' ;;
+	lf95*)				# Lahey Fortran 8.1
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)=
+	  tmp_sharedflag='--shared' ;;
+        nagfor*)                        # NAGFOR 5.3
+          tmp_sharedflag='-Wl,-shared' ;;
+	xl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)
+	  tmp_sharedflag='-qmkshrobj'
+	  tmp_addflag= ;;
+	nvcc*)	# Cuda Compiler Driver 2.2
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  ;;
+	esac
+	case `$CC -V 2>&1 | sed 5q` in
+	*Sun\ C*)			# Sun C 5.9
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	  _LT_TAGVAR(compiler_needs_object, $1)=yes
+	  tmp_sharedflag='-G' ;;
+	*Sun\ F*)			# Sun Fortran 8.3
+	  tmp_sharedflag='-G' ;;
+	esac
+	_LT_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+
+        if test yes = "$supports_anon_versioning"; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+            cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+            echo "local: *; };" >> $output_objdir/$libname.ver~
+            $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+        fi
+
+	case $cc_basename in
+	tcc*)
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='-rdynamic'
+	  ;;
+	xlf* | bgf* | bgxlf* | mpixlf*)
+	  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'
+	  if test yes = "$supports_anon_versioning"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+              cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+              echo "local: *; };" >> $output_objdir/$libname.ver~
+              $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'
+	  fi
+	  ;;
+	esac
+      else
+        _LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+	wlarc=
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      fi
+      ;;
+
+    solaris*)
+      if $LD -v 2>&1 | $GREP 'BFD 2\.8' > /dev/null; then
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+      case `$LD -v 2>&1` in
+        *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 cannot
+*** reliably create shared libraries on SCO systems.  Therefore, libtool
+*** is disabling shared libraries support.  We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+	;;
+	*)
+	  # For security reasons, it is highly recommended that you always
+	  # use absolute paths for naming shared libraries, and exclude the
+	  # DT_RUNPATH tag from executables and libraries.  But doing so
+	  # requires that you compile everything twice, which is a pain.
+	  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	;;
+      esac
+      ;;
+
+    sunos4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      wlarc=
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+    esac
+
+    if test no = "$_LT_TAGVAR(ld_shlibs, $1)"; then
+      runpath_var=
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=
+      _LT_TAGVAR(whole_archive_flag_spec, $1)=
+    fi
+  else
+    # PORTME fill in a description of your system's linker (not GNU ld)
+    case $host_os in
+    aix3*)
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+      # Note: this linker hardcodes the directories in LIBPATH if there
+      # are no directories specified by -L.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      if test yes = "$GCC" && test -z "$lt_prog_compiler_static"; then
+	# Neither direct hardcoding nor static linking is supported with a
+	# broken collect2.
+	_LT_TAGVAR(hardcode_direct, $1)=unsupported
+      fi
+      ;;
+
+    aix[[4-9]]*)
+      if test ia64 = "$host_cpu"; then
+	# On IA64, the linker does run time linking by default, so we don't
+	# have to do anything special.
+	aix_use_runtimelinking=no
+	exp_sym_flag='-Bexport'
+	no_entry_flag=
+      else
+	# If we're using GNU nm, then we don't want the "-C" option.
+	# -C means demangle to GNU nm, but means don't demangle to AIX nm.
+	# Without the "-l" option, or with the "-B" option, AIX nm treats
+	# weak defined symbols like other global defined symbols, whereas
+	# GNU nm marks them as "W".
+	# While the 'weak' keyword is ignored in the Export File, we need
+	# it in the Import File for the 'aix-soname' feature, so we have
+	# to replace the "-B" option with "-P" for AIX nm.
+	if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then
+	  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W")) && ([substr](\$ 3,1,1) != ".")) { if (\$ 2 == "W") { print \$ 3 " weak" } else { print \$ 3 } } }'\'' | sort -u > $export_symbols'
+	else
+	  _LT_TAGVAR(export_symbols_cmds, $1)='`func_echo_all $NM | $SED -e '\''s/B\([[^B]]*\)$/P\1/'\''` -PCpgl $libobjs $convenience | awk '\''{ if (((\$ 2 == "T") || (\$ 2 == "D") || (\$ 2 == "B") || (\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) && ([substr](\$ 1,1,1) != ".")) { if ((\$ 2 == "W") || (\$ 2 == "V") || (\$ 2 == "Z")) { print \$ 1 " weak" } else { print \$ 1 } } }'\'' | sort -u > $export_symbols'
+	fi
+	aix_use_runtimelinking=no
+
+	# Test if we are trying to use run time linking or normal
+	# AIX style linking. If -brtl is somewhere in LDFLAGS, we
+	# have runtime linking enabled, and use it for executables.
+	# For shared libraries, we enable/disable runtime linking
+	# depending on the kind of the shared library created -
+	# when "with_aix_soname,aix_use_runtimelinking" is:
+	# "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "aix,yes"  lib.so          shared, rtl:yes, for executables
+	#            lib.a           static archive
+	# "both,no"  lib.so.V(shr.o) shared, rtl:yes
+	#            lib.a(lib.so.V) shared, rtl:no,  for executables
+	# "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a(lib.so.V) shared, rtl:no
+	# "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+	#            lib.a           static archive
+	case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	  for ld_flag in $LDFLAGS; do
+	  if (test x-brtl = "x$ld_flag" || test x-Wl,-brtl = "x$ld_flag"); then
+	    aix_use_runtimelinking=yes
+	    break
+	  fi
+	  done
+	  if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	    # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	    # so we don't have lib.a shared libs to link our executables.
+	    # We have to force runtime linking in this case.
+	    aix_use_runtimelinking=yes
+	    LDFLAGS="$LDFLAGS -Wl,-brtl"
+	  fi
+	  ;;
+	esac
+
+	exp_sym_flag='-bexport'
+	no_entry_flag='-bnoentry'
+      fi
+
+      # When large executables or shared objects are built, AIX ld can
+      # have problems creating the table of contents.  If linking a library
+      # or program results in "error TOC overflow" add -mminimal-toc to
+      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+      _LT_TAGVAR(archive_cmds, $1)=''
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+      case $with_aix_soname,$aix_use_runtimelinking in
+      aix,*) ;; # traditional, no import file
+      svr4,* | *,yes) # use import file
+	# The Import File defines what to hardcode.
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+	;;
+      esac
+
+      if test yes = "$GCC"; then
+	case $host_os in aix4.[[012]]|aix4.[[012]].*)
+	# We only want to do this on AIX 4.2 and lower, the check
+	# below for broken collect2 doesn't work under 4.3+
+	  collect2name=`$CC -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	   strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	  # We have reworked collect2
+	  :
+	  else
+	  # We have old collect2
+	  _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	  # It fails to find uninstalled libraries when the uninstalled
+	  # path is not listed in the libpath.  Setting hardcode_minus_L
+	  # to unsupported forces relinking
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+	  ;;
+	esac
+	shared_flag='-shared'
+	if test yes = "$aix_use_runtimelinking"; then
+	  shared_flag="$shared_flag "'$wl-G'
+	fi
+	# Need to ensure runtime linking is disabled for the traditional
+	# shared library, or the linker may eventually find shared libraries
+	# /with/ Import File - we do not want to mix them.
+	shared_flag_aix='-shared'
+	shared_flag_svr4='-shared $wl-G'
+      else
+	# not using gcc
+	if test ia64 = "$host_cpu"; then
+	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	# chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+	else
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag='$wl-G'
+	  else
+	    shared_flag='$wl-bM:SRE'
+	  fi
+	  shared_flag_aix='$wl-bM:SRE'
+	  shared_flag_svr4='$wl-G'
+	fi
+      fi
+
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
+      # It seems that -bexpall does not export symbols beginning with
+      # underscore (_), so it is better to generate a list of symbols to export.
+      _LT_TAGVAR(always_export_symbols, $1)=yes
+      if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+	# Warning - without using the other runtime loading flags (-brtl),
+	# -berok will link without error, but may produce a broken library.
+	_LT_TAGVAR(allow_undefined_flag, $1)='-berok'
+        # Determine the default libpath from the value encoded in an
+        # empty executable.
+        _LT_SYS_MODULE_PATH_AIX([$1])
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+      else
+	if test ia64 = "$host_cpu"; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
+	  _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+	else
+	 # Determine the default libpath from the value encoded in an
+	 # empty executable.
+	 _LT_SYS_MODULE_PATH_AIX([$1])
+	 _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+	  # Warning - without using the other run time loading flags,
+	  # -berok will link without error, but may produce a broken library.
+	  _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+	  if test yes = "$with_gnu_ld"; then
+	    # We only use this code for GNU lds that support --whole-archive.
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
+	  else
+	    # Exported symbols can be pulled into shared objects from archives
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	  fi
+	  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	  # -brtl affects multiple linker settings, -berok does not and is overridden later
+	  compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+	  if test svr4 != "$with_aix_soname"; then
+	    # This is similar to how AIX traditionally builds its shared libraries.
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	  fi
+	  if test aix != "$with_aix_soname"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+	  else
+	    # used by -dlpreopen to get the symbols
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	  fi
+	  _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
+	fi
+      fi
+      ;;
+
+    amigaos*)
+      case $host_cpu in
+      powerpc)
+            # see comment about AmigaOS4 .so support
+            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+            _LT_TAGVAR(archive_expsym_cmds, $1)=''
+        ;;
+      m68k)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$ECHO "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$ECHO "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$ECHO "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes
+        ;;
+      esac
+      ;;
+
+    bsdi[[45]]*)
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+      ;;
+
+    cygwin* | mingw* | pw32* | cegcc*)
+      # When not using gcc, we currently assume that we are using
+      # Microsoft Visual C++.
+      # hardcode_libdir_flag_spec is actually meaningless, as there is
+      # no search path for DLLs.
+      case $cc_basename in
+      cl*)
+	# Native MSVC
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	_LT_TAGVAR(always_export_symbols, $1)=yes
+	_LT_TAGVAR(file_list_spec, $1)='@'
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	_LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+            cp "$export_symbols" "$output_objdir/$soname.def";
+            echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+          else
+            $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+          fi~
+          $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+          linknames='
+	# The linker will not automatically build a static lib if we build a DLL.
+	# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'
+	_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1,DATA/'\'' | $SED -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+	# Don't use ranlib
+	_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+          lt_tool_outputfile="@TOOL_OUTPUT@"~
+          case $lt_outputfile in
+            *.exe|*.EXE) ;;
+            *)
+              lt_outputfile=$lt_outputfile.exe
+              lt_tool_outputfile=$lt_tool_outputfile.exe
+              ;;
+          esac~
+          if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+            $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+            $RM "$lt_outputfile.manifest";
+          fi'
+	;;
+      *)
+	# Assume MSVC wrapper
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	# Tell ltmain to make .lib files, not .a files.
+	libext=lib
+	# Tell ltmain to make .dll files, not .so files.
+	shrext_cmds=.dll
+	# FIXME: Setting linknames here is a bad hack.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all "$deplibs" | $SED '\''s/ -lc$//'\''` -link -dll~linknames='
+	# The linker will automatically build a .lib file if we build a DLL.
+	_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	# FIXME: Should let the user specify the lib program.
+	_LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+      esac
+      ;;
+
+    darwin* | rhapsody*)
+      _LT_DARWIN_LINKER_FEATURES($1)
+      ;;
+
+    dgux*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+    # support.  Future versions do this automatically, but an explicit c++rt0.o
+    # does not break anything, and helps significantly (at the cost of a little
+    # extra space).
+    freebsd2.2*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+    freebsd2.*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+    freebsd* | dragonfly*)
+      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    hpux9*)
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+
+      # hardcode_minus_L: Not really in the search PATH,
+      # but as the default location of the library.
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+      ;;
+
+    hpux10*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      if test no = "$with_gnu_ld"; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+	# hardcode_minus_L: Not really in the search PATH,
+	# but as the default location of the library.
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+      fi
+      ;;
+
+    hpux11*)
+      if test yes,no = "$GCC,$with_gnu_ld"; then
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	esac
+      else
+	case $host_cpu in
+	hppa*64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	ia64*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	m4_if($1, [], [
+	  # Older versions of the 11.00 compiler do not understand -b yet
+	  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)
+	  _LT_LINKER_OPTION([if $CC understands -b],
+	    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],
+	    [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],
+	    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],
+	  [_LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])
+	  ;;
+	esac
+      fi
+      if test no = "$with_gnu_ld"; then
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	case $host_cpu in
+	hppa*64*|ia64*)
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  ;;
+	*)
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+
+	  # hardcode_minus_L: Not really in the search PATH,
+	  # but as the default location of the library.
+	  _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	  ;;
+	esac
+      fi
+      ;;
+
+    irix5* | irix6* | nonstopux*)
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	# Try to use the -exported_symbol ld option, if it does not
+	# work, assume that -exports_file does not work either and
+	# implicitly export all symbols.
+	# This should be the same for all languages, so no per-tag cache variable.
+	AC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],
+	  [lt_cv_irix_exported_symbol],
+	  [save_LDFLAGS=$LDFLAGS
+	   LDFLAGS="$LDFLAGS -shared $wl-exported_symbol ${wl}foo $wl-update_registry $wl/dev/null"
+	   AC_LINK_IFELSE(
+	     [AC_LANG_SOURCE(
+	        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],
+			      [C++], [[int foo (void) { return 0; }]],
+			      [Fortran 77], [[
+      subroutine foo
+      end]],
+			      [Fortran], [[
+      subroutine foo
+      end]])])],
+	      [lt_cv_irix_exported_symbol=yes],
+	      [lt_cv_irix_exported_symbol=no])
+           LDFLAGS=$save_LDFLAGS])
+	if test yes = "$lt_cv_irix_exported_symbol"; then
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations $wl-exports_file $wl$export_symbols -o $lib'
+	fi
+	_LT_TAGVAR(link_all_deplibs, $1)=no
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -exports_file $export_symbols -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(inherit_rpath, $1)=yes
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    linux*)
+      case $cc_basename in
+      tcc*)
+	# Fabrice Bellard et al's Tiny C Compiler
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	;;
+      esac
+      ;;
+
+    netbsd* | netbsdelf*-gnu)
+      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    newsos6)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *nto* | *qnx*)
+      ;;
+
+    openbsd* | bitrig*)
+      if test -f /usr/libexec/ld.so; then
+	_LT_TAGVAR(hardcode_direct, $1)=yes
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	if test -z "`echo __ELF__ | $CC -E - | $GREP __ELF__`"; then
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags $wl-retain-symbols-file,$export_symbols'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+	else
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	fi
+      else
+	_LT_TAGVAR(ld_shlibs, $1)=no
+      fi
+      ;;
+
+    os2*)
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+      shrext_cmds=.dll
+      _LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	$ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	$ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	$ECHO EXPORTS >> $output_objdir/$libname.def~
+	prefix_cmds="$SED"~
+	if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	  prefix_cmds="$prefix_cmds -e 1d";
+	fi~
+	prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	$CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	emximp -o $lib $output_objdir/$libname.def'
+      _LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+      ;;
+
+    osf3*)
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    osf4* | osf5*)	# as osf3* with the addition of -msym flag
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $pic_flag $libobjs $deplibs $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+      else
+	_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; printf "%s\\n" "-hidden">> $lib.exp~
+          $CC -shared$allow_undefined_flag $wl-input $wl$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~$RM $lib.exp'
+
+	# Both c and cxx compiler support -rpath directly
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+      fi
+      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+      ;;
+
+    solaris*)
+      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'
+      if test yes = "$GCC"; then
+	wlarc='$wl'
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $wl-z ${wl}text $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+          $CC -shared $pic_flag $wl-z ${wl}text $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+      else
+	case `$CC -V 2>&1` in
+	*"Compilers 5.0"*)
+	  wlarc=''
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $LD -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'
+	  ;;
+	*)
+	  wlarc='$wl'
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h $soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+            $CC -G$allow_undefined_flag -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'
+	  ;;
+	esac
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      case $host_os in
+      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+      *)
+	# The compiler driver will combine and reorder linker options,
+	# but understands '-z linker_flag'.  GCC discards it without '$wl',
+	# but is careful enough not to reorder.
+	# Supported since Solaris 2.6 (maybe 2.5.1?)
+	if test yes = "$GCC"; then
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+	else
+	  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	fi
+	;;
+      esac
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      ;;
+
+    sunos4*)
+      if test sequent = "$host_vendor"; then
+	# Use $CC to link under sequent, because it throws in some extra .o
+	# files that make .init and .fini sections work.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+      fi
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_direct, $1)=yes
+      _LT_TAGVAR(hardcode_minus_L, $1)=yes
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4)
+      case $host_vendor in
+	sni)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+	;;
+	siemens)
+	  ## LD is ld it makes a PLAMLIB
+	  ## CC just makes a GrossModule.
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+	  _LT_TAGVAR(hardcode_direct, $1)=no
+        ;;
+	motorola)
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+	;;
+      esac
+      runpath_var='LD_RUN_PATH'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    sysv4.3*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+      ;;
+
+    sysv4*MP*)
+      if test -d /usr/nec; then
+	_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	runpath_var=LD_RUN_PATH
+	hardcode_runpath_var=yes
+	_LT_TAGVAR(ld_shlibs, $1)=yes
+      fi
+      ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    sysv5* | sco3.2v5* | sco5v6*)
+      # Note: We CANNOT use -z defs as we might desire, because we do not
+      # link with -lc, and that would cause any symbols used from libc to
+      # always be unresolved, which means just about no library would
+      # ever link correctly.  If we're not using GNU ld we use -z text
+      # though, which does catch some bad symbols but isn't as heavy-handed
+      # as -z defs.
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+      _LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
+      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+      _LT_TAGVAR(link_all_deplibs, $1)=yes
+      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
+      runpath_var='LD_RUN_PATH'
+
+      if test yes = "$GCC"; then
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      else
+	_LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+      fi
+      ;;
+
+    uts4*)
+      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      ;;
+
+    *)
+      _LT_TAGVAR(ld_shlibs, $1)=no
+      ;;
+    esac
+
+    if test sni = "$host_vendor"; then
+      case $host in
+      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Blargedynsym'
+	;;
+      esac
+    fi
+  fi
+])
+AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
+
+_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld
+
+_LT_DECL([], [libext], [0], [Old archive suffix (normally "a")])dnl
+_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally ".so")])dnl
+_LT_DECL([], [extract_expsyms_cmds], [2],
+    [The commands to extract the exported symbol list from a shared archive])
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+  # Assume -lc should be added
+  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+  if test yes,yes = "$GCC,$enable_shared"; then
+    case $_LT_TAGVAR(archive_cmds, $1) in
+    *'~'*)
+      # FIXME: we may have to deal with multi-command sequences.
+      ;;
+    '$CC '*)
+      # Test whether the compiler implicitly links with -lc since on some
+      # systems, -lgcc has to come before -lc. If gcc already passes -lc
+      # to ld, don't add -lc before -lgcc.
+      AC_CACHE_CHECK([whether -lc should be explicitly linked in],
+	[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),
+	[$RM conftest*
+	echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+	if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+	  soname=conftest
+	  lib=conftest
+	  libobjs=conftest.$ac_objext
+	  deplibs=
+	  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)
+	  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)
+	  compiler_flags=-v
+	  linker_flags=-v
+	  verstring=
+	  output_objdir=.
+	  libname=conftest
+	  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)
+	  _LT_TAGVAR(allow_undefined_flag, $1)=
+	  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\>\&1 \| $GREP \" -lc \" \>/dev/null 2\>\&1)
+	  then
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	  else
+	    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	  fi
+	  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+	else
+	  cat conftest.err 1>&5
+	fi
+	$RM conftest*
+	])
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)
+      ;;
+    esac
+  fi
+  ;;
+esac
+
+_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],
+    [Whether or not to add -lc for building shared libraries])
+_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],
+    [enable_shared_with_static_runtimes], [0],
+    [Whether or not to disallow shared libs when runtime libs are static])
+_LT_TAGDECL([], [export_dynamic_flag_spec], [1],
+    [Compiler flag to allow reflexive dlopens])
+_LT_TAGDECL([], [whole_archive_flag_spec], [1],
+    [Compiler flag to generate shared objects directly from archives])
+_LT_TAGDECL([], [compiler_needs_object], [1],
+    [Whether the compiler copes with passing no objects directly])
+_LT_TAGDECL([], [old_archive_from_new_cmds], [2],
+    [Create an old-style archive from a shared archive])
+_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],
+    [Create a temporary old-style archive to link instead of a shared archive])
+_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])
+_LT_TAGDECL([], [archive_expsym_cmds], [2])
+_LT_TAGDECL([], [module_cmds], [2],
+    [Commands used to build a loadable module if different from building
+    a shared archive.])
+_LT_TAGDECL([], [module_expsym_cmds], [2])
+_LT_TAGDECL([], [with_gnu_ld], [1],
+    [Whether we are building with GNU ld or not])
+_LT_TAGDECL([], [allow_undefined_flag], [1],
+    [Flag that allows shared libraries with undefined symbols to be built])
+_LT_TAGDECL([], [no_undefined_flag], [1],
+    [Flag that enforces no undefined symbols])
+_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],
+    [Flag to hardcode $libdir into a binary during linking.
+    This must work even if $libdir does not exist])
+_LT_TAGDECL([], [hardcode_libdir_separator], [1],
+    [Whether we need a single "-rpath" flag with a separated argument])
+_LT_TAGDECL([], [hardcode_direct], [0],
+    [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
+    DIR into the resulting binary])
+_LT_TAGDECL([], [hardcode_direct_absolute], [0],
+    [Set to "yes" if using DIR/libNAME$shared_ext during linking hardcodes
+    DIR into the resulting binary and the resulting library dependency is
+    "absolute", i.e impossible to change by setting $shlibpath_var if the
+    library is relocated])
+_LT_TAGDECL([], [hardcode_minus_L], [0],
+    [Set to "yes" if using the -LDIR flag during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_shlibpath_var], [0],
+    [Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR
+    into the resulting binary])
+_LT_TAGDECL([], [hardcode_automatic], [0],
+    [Set to "yes" if building a shared library automatically hardcodes DIR
+    into the library and all subsequent libraries and executables linked
+    against it])
+_LT_TAGDECL([], [inherit_rpath], [0],
+    [Set to yes if linker adds runtime paths of dependent libraries
+    to runtime path list])
+_LT_TAGDECL([], [link_all_deplibs], [0],
+    [Whether libtool must link a program against all its dependency libraries])
+_LT_TAGDECL([], [always_export_symbols], [0],
+    [Set to "yes" if exported symbols are required])
+_LT_TAGDECL([], [export_symbols_cmds], [2],
+    [The commands to list exported symbols])
+_LT_TAGDECL([], [exclude_expsyms], [1],
+    [Symbols that should not be listed in the preloaded symbols])
+_LT_TAGDECL([], [include_expsyms], [1],
+    [Symbols that must always be exported])
+_LT_TAGDECL([], [prelink_cmds], [2],
+    [Commands necessary for linking programs (against libraries) with templates])
+_LT_TAGDECL([], [postlink_cmds], [2],
+    [Commands necessary for finishing linking programs])
+_LT_TAGDECL([], [file_list_spec], [1],
+    [Specify filename containing input files])
+dnl FIXME: Not yet implemented
+dnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],
+dnl    [Compiler flag to generate thread safe objects])
+])# _LT_LINKER_SHLIBS
+
+
+# _LT_LANG_C_CONFIG([TAG])
+# ------------------------
+# Ensure that the configuration variables for a C compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_C_CONFIG],
+[m4_require([_LT_DECL_EGREP])dnl
+lt_save_CC=$CC
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_TAG_COMPILER
+# Save the default compiler, since it gets overwritten when the other
+# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.
+compiler_DEFAULT=$CC
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_SYS_DYNAMIC_LINKER($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+  LT_SYS_DLOPEN_SELF
+  _LT_CMD_STRIPLIB
+
+  # Report what library types will actually be built
+  AC_MSG_CHECKING([if libtool supports shared libraries])
+  AC_MSG_RESULT([$can_build_shared])
+
+  AC_MSG_CHECKING([whether to build shared libraries])
+  test no = "$can_build_shared" && enable_shared=no
+
+  # On AIX, shared libraries and static libraries use the same namespace, and
+  # are all built from PIC.
+  case $host_os in
+  aix3*)
+    test yes = "$enable_shared" && enable_static=no
+    if test -n "$RANLIB"; then
+      archive_cmds="$archive_cmds~\$RANLIB \$lib"
+      postinstall_cmds='$RANLIB $lib'
+    fi
+    ;;
+
+  aix[[4-9]]*)
+    if test ia64 != "$host_cpu"; then
+      case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+      yes,aix,yes) ;;			# shared object as lib.so file only
+      yes,svr4,*) ;;			# shared object as lib.so archive member only
+      yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+      esac
+    fi
+    ;;
+  esac
+  AC_MSG_RESULT([$enable_shared])
+
+  AC_MSG_CHECKING([whether to build static libraries])
+  # Make sure either enable_shared or enable_static is yes.
+  test yes = "$enable_shared" || enable_static=yes
+  AC_MSG_RESULT([$enable_static])
+
+  _LT_CONFIG($1)
+fi
+AC_LANG_POP
+CC=$lt_save_CC
+])# _LT_LANG_C_CONFIG
+
+
+# _LT_LANG_CXX_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a C++ compiler are suitably
+# defined.  These variables are subsequently used by _LT_CONFIG to write
+# the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_CXX_CONFIG],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+m4_require([_LT_DECL_EGREP])dnl
+m4_require([_LT_PATH_MANIFEST_TOOL])dnl
+if test -n "$CXX" && ( test no != "$CXX" &&
+    ( (test g++ = "$CXX" && `g++ -v >/dev/null 2>&1` ) ||
+    (test g++ != "$CXX"))); then
+  AC_PROG_CXXCPP
+else
+  _lt_caught_CXX_error=yes
+fi
+
+AC_LANG_PUSH(C++)
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(compiler_needs_object, $1)=no
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the CXX compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_caught_CXX_error"; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="int some_variable = 0;"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_CFLAGS=$CFLAGS
+  lt_save_LD=$LD
+  lt_save_GCC=$GCC
+  GCC=$GXX
+  lt_save_with_gnu_ld=$with_gnu_ld
+  lt_save_path_LD=$lt_cv_path_LD
+  if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+  else
+    $as_unset lt_cv_prog_gnu_ld
+  fi
+  if test -n "${lt_cv_path_LDCXX+set}"; then
+    lt_cv_path_LD=$lt_cv_path_LDCXX
+  else
+    $as_unset lt_cv_path_LD
+  fi
+  test -z "${LDCXX+set}" || LD=$LDCXX
+  CC=${CXX-"c++"}
+  CFLAGS=$CXXFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    # We don't want -fno-exception when compiling C++ code, so set the
+    # no_builtin_flag separately
+    if test yes = "$GXX"; then
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+    else
+      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+    fi
+
+    if test yes = "$GXX"; then
+      # Set up default GNU C++ configuration
+
+      LT_PATH_LD
+
+      # Check if GNU C++ uses GNU ld as the underlying linker, since the
+      # archiving commands below assume that GNU ld is being used.
+      if test yes = "$with_gnu_ld"; then
+        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+
+        # If archive_cmds runs LD, not CC, wlarc should be empty
+        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+        #     investigate it a little bit more. (MM)
+        wlarc='$wl'
+
+        # ancient GNU ld didn't support --whole-archive et. al.
+        if eval "`$CC -print-prog-name=ld` --help 2>&1" |
+	  $GREP 'no-whole-archive' > /dev/null; then
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+        else
+          _LT_TAGVAR(whole_archive_flag_spec, $1)=
+        fi
+      else
+        with_gnu_ld=no
+        wlarc=
+
+        # A generic and very simple default shared library creation
+        # command for GNU C++ for the case where it uses the native
+        # linker, instead of GNU ld.  If possible, this setting should
+        # overridden to take advantage of the native linker features on
+        # the platform it is being used on.
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+      fi
+
+      # Commands to make compiler produce verbose output that lists
+      # what "hidden" libraries, object files and flags are used when
+      # linking a shared library.
+      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"'
+
+    else
+      GXX=no
+      with_gnu_ld=no
+      wlarc=
+    fi
+
+    # PORTME: fill in a description of your system's C++ link characteristics
+    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+    _LT_TAGVAR(ld_shlibs, $1)=yes
+    case $host_os in
+      aix3*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+      aix[[4-9]]*)
+        if test ia64 = "$host_cpu"; then
+          # On IA64, the linker does run time linking by default, so we don't
+          # have to do anything special.
+          aix_use_runtimelinking=no
+          exp_sym_flag='-Bexport'
+          no_entry_flag=
+        else
+          aix_use_runtimelinking=no
+
+          # Test if we are trying to use run time linking or normal
+          # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+          # have runtime linking enabled, and use it for executables.
+          # For shared libraries, we enable/disable runtime linking
+          # depending on the kind of the shared library created -
+          # when "with_aix_soname,aix_use_runtimelinking" is:
+          # "aix,no"   lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "aix,yes"  lib.so          shared, rtl:yes, for executables
+          #            lib.a           static archive
+          # "both,no"  lib.so.V(shr.o) shared, rtl:yes
+          #            lib.a(lib.so.V) shared, rtl:no,  for executables
+          # "both,yes" lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a(lib.so.V) shared, rtl:no
+          # "svr4,*"   lib.so.V(shr.o) shared, rtl:yes, for executables
+          #            lib.a           static archive
+          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)
+	    for ld_flag in $LDFLAGS; do
+	      case $ld_flag in
+	      *-brtl*)
+	        aix_use_runtimelinking=yes
+	        break
+	        ;;
+	      esac
+	    done
+	    if test svr4,no = "$with_aix_soname,$aix_use_runtimelinking"; then
+	      # With aix-soname=svr4, we create the lib.so.V shared archives only,
+	      # so we don't have lib.a shared libs to link our executables.
+	      # We have to force runtime linking in this case.
+	      aix_use_runtimelinking=yes
+	      LDFLAGS="$LDFLAGS -Wl,-brtl"
+	    fi
+	    ;;
+          esac
+
+          exp_sym_flag='-bexport'
+          no_entry_flag='-bnoentry'
+        fi
+
+        # When large executables or shared objects are built, AIX ld can
+        # have problems creating the table of contents.  If linking a library
+        # or program results in "error TOC overflow" add -mminimal-toc to
+        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not
+        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+        _LT_TAGVAR(archive_cmds, $1)=''
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        _LT_TAGVAR(file_list_spec, $1)='$wl-f,'
+        case $with_aix_soname,$aix_use_runtimelinking in
+        aix,*) ;;	# no import file
+        svr4,* | *,yes) # use import file
+          # The Import File defines what to hardcode.
+          _LT_TAGVAR(hardcode_direct, $1)=no
+          _LT_TAGVAR(hardcode_direct_absolute, $1)=no
+          ;;
+        esac
+
+        if test yes = "$GXX"; then
+          case $host_os in aix4.[[012]]|aix4.[[012]].*)
+          # We only want to do this on AIX 4.2 and lower, the check
+          # below for broken collect2 doesn't work under 4.3+
+	  collect2name=`$CC -print-prog-name=collect2`
+	  if test -f "$collect2name" &&
+	     strings "$collect2name" | $GREP resolve_lib_name >/dev/null
+	  then
+	    # We have reworked collect2
+	    :
+	  else
+	    # We have old collect2
+	    _LT_TAGVAR(hardcode_direct, $1)=unsupported
+	    # It fails to find uninstalled libraries when the uninstalled
+	    # path is not listed in the libpath.  Setting hardcode_minus_L
+	    # to unsupported forces relinking
+	    _LT_TAGVAR(hardcode_minus_L, $1)=yes
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=
+	  fi
+          esac
+          shared_flag='-shared'
+	  if test yes = "$aix_use_runtimelinking"; then
+	    shared_flag=$shared_flag' $wl-G'
+	  fi
+	  # Need to ensure runtime linking is disabled for the traditional
+	  # shared library, or the linker may eventually find shared libraries
+	  # /with/ Import File - we do not want to mix them.
+	  shared_flag_aix='-shared'
+	  shared_flag_svr4='-shared $wl-G'
+        else
+          # not using gcc
+          if test ia64 = "$host_cpu"; then
+	  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+	  # chokes on -Wl,-G. The following line is correct:
+	  shared_flag='-G'
+          else
+	    if test yes = "$aix_use_runtimelinking"; then
+	      shared_flag='$wl-G'
+	    else
+	      shared_flag='$wl-bM:SRE'
+	    fi
+	    shared_flag_aix='$wl-bM:SRE'
+	    shared_flag_svr4='$wl-G'
+          fi
+        fi
+
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-bexpall'
+        # It seems that -bexpall does not export symbols beginning with
+        # underscore (_), so it is better to generate a list of symbols to
+	# export.
+        _LT_TAGVAR(always_export_symbols, $1)=yes
+	if test aix,yes = "$with_aix_soname,$aix_use_runtimelinking"; then
+          # Warning - without using the other runtime loading flags (-brtl),
+          # -berok will link without error, but may produce a broken library.
+          # The "-G" linker flag allows undefined symbols.
+          _LT_TAGVAR(no_undefined_flag, $1)='-bernotok'
+          # Determine the default libpath from the value encoded in an empty
+          # executable.
+          _LT_SYS_MODULE_PATH_AIX([$1])
+          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+
+          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs $wl'$no_entry_flag' $compiler_flags `if test -n "$allow_undefined_flag"; then func_echo_all "$wl$allow_undefined_flag"; else :; fi` $wl'$exp_sym_flag:\$export_symbols' '$shared_flag
+        else
+          if test ia64 = "$host_cpu"; then
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $libdir:/usr/lib:/lib'
+	    _LT_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\$wl$no_entry_flag"' $compiler_flags $wl$allow_undefined_flag '"\$wl$exp_sym_flag:\$export_symbols"
+          else
+	    # Determine the default libpath from the value encoded in an
+	    # empty executable.
+	    _LT_SYS_MODULE_PATH_AIX([$1])
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-blibpath:$libdir:'"$aix_libpath"
+	    # Warning - without using the other run time loading flags,
+	    # -berok will link without error, but may produce a broken library.
+	    _LT_TAGVAR(no_undefined_flag, $1)=' $wl-bernotok'
+	    _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-berok'
+	    if test yes = "$with_gnu_ld"; then
+	      # We only use this code for GNU lds that support --whole-archive.
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
+	    else
+	      # Exported symbols can be pulled into shared objects from archives
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+	    fi
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$RM -r $output_objdir/$realname.d~$MKDIR $output_objdir/$realname.d'
+	    # -brtl affects multiple linker settings, -berok does not and is overridden later
+	    compiler_flags_filtered='`func_echo_all "$compiler_flags " | $SED -e "s%-brtl\\([[, ]]\\)%-berok\\1%g"`'
+	    if test svr4 != "$with_aix_soname"; then
+	      # This is similar to how AIX traditionally builds its shared
+	      # libraries. Need -bnortl late, we may have -brtl in LDFLAGS.
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_aix' -o $output_objdir/$realname.d/$soname $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$realname.d/$soname'
+	    fi
+	    if test aix != "$with_aix_soname"; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$CC '$shared_flag_svr4' -o $output_objdir/$realname.d/$shared_archive_member_spec.o $libobjs $deplibs $wl-bnoentry '$compiler_flags_filtered'$wl-bE:$export_symbols$allow_undefined_flag~$STRIP -e $output_objdir/$realname.d/$shared_archive_member_spec.o~( func_echo_all "#! $soname($shared_archive_member_spec.o)"; if test shr_64 = "$shared_archive_member_spec"; then func_echo_all "# 64"; else func_echo_all "# 32"; fi; cat $export_symbols ) > $output_objdir/$realname.d/$shared_archive_member_spec.imp~$AR $AR_FLAGS $output_objdir/$soname $output_objdir/$realname.d/$shared_archive_member_spec.o $output_objdir/$realname.d/$shared_archive_member_spec.imp'
+	    else
+	      # used by -dlpreopen to get the symbols
+	      _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$MV  $output_objdir/$realname.d/$soname $output_objdir'
+	    fi
+	    _LT_TAGVAR(archive_expsym_cmds, $1)="$_LT_TAGVAR(archive_expsym_cmds, $1)"'~$RM -r $output_objdir/$realname.d'
+          fi
+        fi
+        ;;
+
+      beos*)
+	if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+	  # support --undefined.  This deserves some investigation.  FIXME
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      chorus*)
+        case $cc_basename in
+          *)
+	  # FIXME: insert proper C++ library support
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	  ;;
+        esac
+        ;;
+
+      cygwin* | mingw* | pw32* | cegcc*)
+	case $GXX,$cc_basename in
+	,cl* | no,cl*)
+	  # Native MSVC
+	  # hardcode_libdir_flag_spec is actually meaningless, as there is
+	  # no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=yes
+	  _LT_TAGVAR(file_list_spec, $1)='@'
+	  # Tell ltmain to make .lib files, not .a files.
+	  libext=lib
+	  # Tell ltmain to make .dll files, not .so files.
+	  shrext_cmds=.dll
+	  # FIXME: Setting linknames here is a bad hack.
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~linknames='
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+              cp "$export_symbols" "$output_objdir/$soname.def";
+              echo "$tool_output_objdir$soname.def" > "$output_objdir/$soname.exp";
+            else
+              $SED -e '\''s/^/-link -EXPORT:/'\'' < $export_symbols > $output_objdir/$soname.exp;
+            fi~
+            $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs "@$tool_output_objdir$soname.exp" -Wl,-DLL,-IMPLIB:"$tool_output_objdir$libname.dll.lib"~
+            linknames='
+	  # The linker will not automatically build a static lib if we build a DLL.
+	  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	  # Don't use ranlib
+	  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'
+	  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile="@OUTPUT@"~
+            lt_tool_outputfile="@TOOL_OUTPUT@"~
+            case $lt_outputfile in
+              *.exe|*.EXE) ;;
+              *)
+                lt_outputfile=$lt_outputfile.exe
+                lt_tool_outputfile=$lt_tool_outputfile.exe
+                ;;
+            esac~
+            func_to_tool_file "$lt_outputfile"~
+            if test : != "$MANIFEST_TOOL" && test -f "$lt_outputfile.manifest"; then
+              $MANIFEST_TOOL -manifest "$lt_tool_outputfile.manifest" -outputresource:"$lt_tool_outputfile" || exit 1;
+              $RM "$lt_outputfile.manifest";
+            fi'
+	  ;;
+	*)
+	  # g++
+	  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+	  # as there is no search path for DLLs.
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	  _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-all-symbols'
+	  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	  _LT_TAGVAR(always_export_symbols, $1)=no
+	  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+	  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	    # If the export-symbols file already is a .def file, use it as
+	    # is; otherwise, prepend EXPORTS...
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='if _LT_DLL_DEF_P([$export_symbols]); then
+              cp $export_symbols $output_objdir/$soname.def;
+            else
+              echo EXPORTS > $output_objdir/$soname.def;
+              cat $export_symbols >> $output_objdir/$soname.def;
+            fi~
+            $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname $wl--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+	  else
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	  fi
+	  ;;
+	esac
+	;;
+      darwin* | rhapsody*)
+        _LT_DARWIN_LINKER_FEATURES($1)
+	;;
+
+      os2*)
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+	_LT_TAGVAR(hardcode_minus_L, $1)=yes
+	_LT_TAGVAR(allow_undefined_flag, $1)=unsupported
+	shrext_cmds=.dll
+	_LT_TAGVAR(archive_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  emxexp $libobjs | $SED /"_DLL_InitTerm"/d >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='$ECHO "LIBRARY ${soname%$shared_ext} INITINSTANCE TERMINSTANCE" > $output_objdir/$libname.def~
+	  $ECHO "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~
+	  $ECHO "DATA MULTIPLE NONSHARED" >> $output_objdir/$libname.def~
+	  $ECHO EXPORTS >> $output_objdir/$libname.def~
+	  prefix_cmds="$SED"~
+	  if test EXPORTS = "`$SED 1q $export_symbols`"; then
+	    prefix_cmds="$prefix_cmds -e 1d";
+	  fi~
+	  prefix_cmds="$prefix_cmds -e \"s/^\(.*\)$/_\1/g\""~
+	  cat $export_symbols | $prefix_cmds >> $output_objdir/$libname.def~
+	  $CC -Zdll -Zcrtdll -o $output_objdir/$soname $libobjs $deplibs $compiler_flags $output_objdir/$libname.def~
+	  emximp -o $lib $output_objdir/$libname.def'
+	_LT_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/${libname}_dll.a $output_objdir/$libname.def'
+	_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+	;;
+
+      dgux*)
+        case $cc_basename in
+          ec++*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          ghcx*)
+	    # Green Hills C++ Compiler
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      freebsd2.*)
+        # C++ shared libraries reported to be fairly broken before
+	# switch to ELF
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      freebsd-elf*)
+        _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+        ;;
+
+      freebsd* | dragonfly*)
+        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+        # conventions
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+        ;;
+
+      haiku*)
+        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+        _LT_TAGVAR(link_all_deplibs, $1)=yes
+        ;;
+
+      hpux9*)
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+        _LT_TAGVAR(hardcode_direct, $1)=yes
+        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+				             # but as the default
+				             # location of the library.
+
+        case $cc_basename in
+          CC*)
+            # FIXME: insert proper C++ library support
+            _LT_TAGVAR(ld_shlibs, $1)=no
+            ;;
+          aCC*)
+            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+            # Commands to make compiler produce verbose output that lists
+            # what "hidden" libraries, object files and flags are used when
+            # linking a shared library.
+            #
+            # There doesn't appear to be a way to prevent this compiler from
+            # explicitly linking system object files so we need to strip them
+            # from the output so that they don't get included in the library
+            # dependencies.
+            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+            ;;
+          *)
+            if test yes = "$GXX"; then
+              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag $wl+b $wl$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test "x$output_objdir/$soname" = "x$lib" || mv $output_objdir/$soname $lib'
+            else
+              # FIXME: insert proper C++ library support
+              _LT_TAGVAR(ld_shlibs, $1)=no
+            fi
+            ;;
+        esac
+        ;;
+
+      hpux10*|hpux11*)
+        if test no = "$with_gnu_ld"; then
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl+b $wl$libdir'
+	  _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+          case $host_cpu in
+            hppa*64*|ia64*)
+              ;;
+            *)
+	      _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+              ;;
+          esac
+        fi
+        case $host_cpu in
+          hppa*64*|ia64*)
+            _LT_TAGVAR(hardcode_direct, $1)=no
+            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+            ;;
+          *)
+            _LT_TAGVAR(hardcode_direct, $1)=yes
+            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+					         # but as the default
+					         # location of the library.
+            ;;
+        esac
+
+        case $cc_basename in
+          CC*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          aCC*)
+	    case $host_cpu in
+	      hppa*64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      ia64*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	      *)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -b $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	        ;;
+	    esac
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP " \-L"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+          *)
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        case $host_cpu in
+	          hppa*64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC $wl+h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          ia64*)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	          *)
+	            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag $wl+h $wl$soname $wl+b $wl$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	            ;;
+	        esac
+	      fi
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      interix[[3-9]]*)
+	_LT_TAGVAR(hardcode_direct, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+	# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+	# Instead, shared libraries are loaded at an image base (0x10000000 by
+	# default) and relocated if they conflict, which is a slow very memory
+	# consuming and fragmenting process.  To avoid this, we pick a random,
+	# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+	# time.  Moving up from 0x10000000 also allows more sbrk(2) space.
+	_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	_LT_TAGVAR(archive_expsym_cmds, $1)='sed "s|^|_|" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags $wl-h,$soname $wl--retain-symbols-file,$output_objdir/$soname.expsym $wl--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+	;;
+      irix5* | irix6*)
+        case $cc_basename in
+          CC*)
+	    # SGI C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -ar", where "CC" is the IRIX C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    if test yes = "$GXX"; then
+	      if test no = "$with_gnu_ld"; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+	      else
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` -o $lib'
+	      fi
+	    fi
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+	    ;;
+        esac
+        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+        _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+        _LT_TAGVAR(inherit_rpath, $1)=yes
+        ;;
+
+      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib $wl-retain-symbols-file,$export_symbols; mv \$templib $lib'
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP "ld"`; rm -f libconftest$shared_ext; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+	    ;;
+	  icpc* | ecpc* )
+	    # Intel C++
+	    with_gnu_ld=yes
+	    # version 8.0 and above of icpc choke on multiply defined symbols
+	    # if we add $predep_objects and $postdep_objects, however 7.1 and
+	    # earlier do not add the objects themselves.
+	    case `$CC -V 2>&1` in
+	      *"Version 7."*)
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	      *)  # Version 8.0 or newer
+	        tmp_idyn=
+	        case $host_cpu in
+		  ia64*) tmp_idyn=' -i_dynamic';;
+		esac
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+		_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+		;;
+	    esac
+	    _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive$convenience $wl--no-whole-archive'
+	    ;;
+          pgCC* | pgcpp*)
+            # Portland Group C++ compiler
+	    case `$CC -V` in
+	    *pgCC\ [[1-5]].* | *pgcpp\ [[1-5]].*)
+	      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~
+               rm -rf $tpldir~
+               $CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~
+               compile_command="$compile_command `find $tpldir -name \*.o | sort | $NL2SP`"'
+	      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~
+                $AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \*.o | sort | $NL2SP`~
+                $RANLIB $oldlib'
+	      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~
+                rm -rf $tpldir~
+                $CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~
+                $CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \*.o | sort | $NL2SP` $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	      ;;
+	    *) # Version 6 and above use weak symbols
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname $wl-retain-symbols-file $wl$export_symbols -o $lib'
+	      ;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl--rpath $wl$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+            ;;
+	  cxx*)
+	    # Compaq C++
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname -o $lib'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname  -o $lib $wl-retain-symbols-file $wl$export_symbols'
+
+	    runpath_var=LD_RUN_PATH
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "X$list" | $Xsed'
+	    ;;
+	  xl* | mpixl* | bgxl*)
+	    # IBM XL 8.0 on PPC, with GNU ld
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl--export-dynamic'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname -o $lib'
+	    if test yes = "$supports_anon_versioning"; then
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $output_objdir/$libname.ver~
+                cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+                echo "local: *; };" >> $output_objdir/$libname.ver~
+                $CC -qmkshrobj $libobjs $deplibs $compiler_flags $wl-soname $wl$soname $wl-version-script $wl$output_objdir/$libname.ver -o $lib'
+	    fi
+	    ;;
+	  *)
+	    case `$CC -V 2>&1 | sed 5q` in
+	    *Sun\ C*)
+	      # Sun C++ 5.9
+	      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	      _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file $wl$export_symbols'
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	      _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` $wl--no-whole-archive'
+	      _LT_TAGVAR(compiler_needs_object, $1)=yes
+
+	      # Not sure whether something based on
+	      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+	      # would be better.
+	      output_verbose_link_cmd='func_echo_all'
+
+	      # Archives containing C++ object files must be created using
+	      # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	      # necessary to make sure instantiated templates are included
+	      # in the archive.
+	      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	      ;;
+	    esac
+	    ;;
+	esac
+	;;
+
+      lynxos*)
+        # FIXME: insert proper C++ library support
+	_LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      m88k*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+	;;
+
+      mvs*)
+        case $cc_basename in
+          cxx*)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	  *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+	esac
+	;;
+
+      netbsd*)
+        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then
+	  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+	  wlarc=
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	fi
+	# Workaround some broken pre-1.5 toolchains
+	output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+	;;
+
+      *nto* | *qnx*)
+        _LT_TAGVAR(ld_shlibs, $1)=yes
+	;;
+
+      openbsd* | bitrig*)
+	if test -f /usr/libexec/ld.so; then
+	  _LT_TAGVAR(hardcode_direct, $1)=yes
+	  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+	  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	  if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`"; then
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-retain-symbols-file,$export_symbols -o $lib'
+	    _LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-E'
+	    _LT_TAGVAR(whole_archive_flag_spec, $1)=$wlarc'--whole-archive$convenience '$wlarc'--no-whole-archive'
+	  fi
+	  output_verbose_link_cmd=func_echo_all
+	else
+	  _LT_TAGVAR(ld_shlibs, $1)=no
+	fi
+	;;
+
+      osf3* | osf4* | osf5*)
+        case $cc_basename in
+          KCC*)
+	    # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+	    # KCC will only create a shared library if the output file
+	    # ends with ".so" (or ".sl" for HP-UX), so rename the library
+	    # to its proper name (with version) after linking.
+	    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo "$lib" | $SED -e "s/\$tempext\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath,$libdir'
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Archives containing C++ object files must be created using
+	    # the KAI C++ compiler.
+	    case $host in
+	      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;
+	      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;
+	    esac
+	    ;;
+          RCC*)
+	    # Rational C++ 2.4.1
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          cxx*)
+	    case $host in
+	      osf3*)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $soname `test -n "$verstring" && func_echo_all "$wl-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+		;;
+	      *)
+	        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && func_echo_all "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+                  echo "-hidden">> $lib.exp~
+                  $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname $wl-input $wl$lib.exp  `test -n "$verstring" && $ECHO "-set_version $verstring"` -update_registry $output_objdir/so_locations -o $lib~
+                  $RM $lib.exp'
+	        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+		;;
+	    esac
+
+	    _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	    # Commands to make compiler produce verbose output that lists
+	    # what "hidden" libraries, object files and flags are used when
+	    # linking a shared library.
+	    #
+	    # There doesn't appear to be a way to prevent this compiler from
+	    # explicitly linking system object files so we need to strip them
+	    # from the output so that they don't get included in the library
+	    # dependencies.
+	    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP "ld" | $GREP -v "ld:"`; templist=`func_echo_all "$templist" | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list= ; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; func_echo_all "$list"'
+	    ;;
+	  *)
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      _LT_TAGVAR(allow_undefined_flag, $1)=' $wl-expect_unresolved $wl\*'
+	      case $host in
+	        osf3*)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+		  ;;
+	        *)
+	          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-msym $wl-soname $wl$soname `test -n "$verstring" && func_echo_all "$wl-set_version $wl$verstring"` $wl-update_registry $wl$output_objdir/so_locations -o $lib'
+		  ;;
+	      esac
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-rpath $wl$libdir'
+	      _LT_TAGVAR(hardcode_libdir_separator, $1)=:
+
+	      # Commands to make compiler produce verbose output that lists
+	      # what "hidden" libraries, object files and flags are used when
+	      # linking a shared library.
+	      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"'
+
+	    else
+	      # FIXME: insert proper C++ library support
+	      _LT_TAGVAR(ld_shlibs, $1)=no
+	    fi
+	    ;;
+        esac
+        ;;
+
+      psos*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      sunos4*)
+        case $cc_basename in
+          CC*)
+	    # Sun C++ 4.x
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          lcc*)
+	    # Lucid
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      solaris*)
+        case $cc_basename in
+          CC* | sunCC*)
+	    # Sun C++ 4.2, 5.x and Centerline C++
+            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes
+	    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G$allow_undefined_flag -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+              $CC -G$allow_undefined_flag $wl-M $wl$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+	    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	    case $host_os in
+	      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+	      *)
+		# The compiler driver will combine and reorder linker options,
+		# but understands '-z linker_flag'.
+	        # Supported since Solaris 2.6 (maybe 2.5.1?)
+		_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+	        ;;
+	    esac
+	    _LT_TAGVAR(link_all_deplibs, $1)=yes
+
+	    output_verbose_link_cmd='func_echo_all'
+
+	    # Archives containing C++ object files must be created using
+	    # "CC -xar", where "CC" is the Sun C++ compiler.  This is
+	    # necessary to make sure instantiated templates are included
+	    # in the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+	    ;;
+          gcx*)
+	    # Green Hills C++ Compiler
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+
+	    # The C++ compiler must be used to create the archive.
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+	    ;;
+          *)
+	    # GNU C++ compiler with Solaris linker
+	    if test yes,no = "$GXX,$with_gnu_ld"; then
+	      _LT_TAGVAR(no_undefined_flag, $1)=' $wl-z ${wl}defs'
+	      if $CC --version | $GREP -v '^2\.7' > /dev/null; then
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                  $CC -shared $pic_flag -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"'
+	      else
+	        # g++ 2.7 appears to require '-G' NOT '-shared' on this
+	        # platform.
+	        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags $wl-h $wl$soname -o $lib'
+	        _LT_TAGVAR(archive_expsym_cmds, $1)='echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~echo "local: *; };" >> $lib.exp~
+                  $CC -G -nostdlib $wl-M $wl$lib.exp $wl-h $wl$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'
+
+	        # Commands to make compiler produce verbose output that lists
+	        # what "hidden" libraries, object files and flags are used when
+	        # linking a shared library.
+	        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v "^Configured with:" | $GREP " \-L"'
+	      fi
+
+	      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R $wl$libdir'
+	      case $host_os in
+		solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+		*)
+		  _LT_TAGVAR(whole_archive_flag_spec, $1)='$wl-z ${wl}allextract$convenience $wl-z ${wl}defaultextract'
+		  ;;
+	      esac
+	    fi
+	    ;;
+        esac
+        ;;
+
+    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+      _LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+      _LT_TAGVAR(archive_cmds_need_lc, $1)=no
+      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+      runpath_var='LD_RUN_PATH'
+
+      case $cc_basename in
+        CC*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+	*)
+	  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	  ;;
+      esac
+      ;;
+
+      sysv5* | sco3.2v5* | sco5v6*)
+	# Note: We CANNOT use -z defs as we might desire, because we do not
+	# link with -lc, and that would cause any symbols used from libc to
+	# always be unresolved, which means just about no library would
+	# ever link correctly.  If we're not using GNU ld we use -z text
+	# though, which does catch some bad symbols but isn't as heavy-handed
+	# as -z defs.
+	_LT_TAGVAR(no_undefined_flag, $1)='$wl-z,text'
+	_LT_TAGVAR(allow_undefined_flag, $1)='$wl-z,nodefs'
+	_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+	_LT_TAGVAR(hardcode_shlibpath_var, $1)=no
+	_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='$wl-R,$libdir'
+	_LT_TAGVAR(hardcode_libdir_separator, $1)=':'
+	_LT_TAGVAR(link_all_deplibs, $1)=yes
+	_LT_TAGVAR(export_dynamic_flag_spec, $1)='$wl-Bexport'
+	runpath_var='LD_RUN_PATH'
+
+	case $cc_basename in
+          CC*)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -G $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~
+              '"$_LT_TAGVAR(old_archive_cmds, $1)"
+	    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~
+              '"$_LT_TAGVAR(reload_cmds, $1)"
+	    ;;
+	  *)
+	    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $wl-Bexport:$export_symbols $wl-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+	    ;;
+	esac
+      ;;
+
+      tandem*)
+        case $cc_basename in
+          NCC*)
+	    # NonStop-UX NCC 3.20
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+          *)
+	    # FIXME: insert proper C++ library support
+	    _LT_TAGVAR(ld_shlibs, $1)=no
+	    ;;
+        esac
+        ;;
+
+      vxworks*)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+
+      *)
+        # FIXME: insert proper C++ library support
+        _LT_TAGVAR(ld_shlibs, $1)=no
+        ;;
+    esac
+
+    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])
+    test no = "$_LT_TAGVAR(ld_shlibs, $1)" && can_build_shared=no
+
+    _LT_TAGVAR(GCC, $1)=$GXX
+    _LT_TAGVAR(LD, $1)=$LD
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+  LDCXX=$LD
+  LD=$lt_save_LD
+  GCC=$lt_save_GCC
+  with_gnu_ld=$lt_save_with_gnu_ld
+  lt_cv_path_LDCXX=$lt_cv_path_LD
+  lt_cv_path_LD=$lt_save_path_LD
+  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+fi # test yes != "$_lt_caught_CXX_error"
+
+AC_LANG_POP
+])# _LT_LANG_CXX_CONFIG
+
+
+# _LT_FUNC_STRIPNAME_CNF
+# ----------------------
+# func_stripname_cnf prefix suffix name
+# strip PREFIX and SUFFIX off of NAME.
+# PREFIX and SUFFIX must not contain globbing or regex special
+# characters, hashes, percent signs, but SUFFIX may contain a leading
+# dot (in which case that matches only a dot).
+#
+# This function is identical to the (non-XSI) version of func_stripname,
+# except this one can be used by m4 code that may be executed by configure,
+# rather than the libtool script.
+m4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl
+AC_REQUIRE([_LT_DECL_SED])
+AC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])
+func_stripname_cnf ()
+{
+  case @S|@2 in
+  .*) func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%\\\\@S|@2\$%%"`;;
+  *)  func_stripname_result=`$ECHO "@S|@3" | $SED "s%^@S|@1%%; s%@S|@2\$%%"`;;
+  esac
+} # func_stripname_cnf
+])# _LT_FUNC_STRIPNAME_CNF
+
+
+# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])
+# ---------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+m4_defun([_LT_SYS_HIDDEN_LIBDEPS],
+[m4_require([_LT_FILEUTILS_DEFAULTS])dnl
+AC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl
+# Dependencies to place before and after the object being linked:
+_LT_TAGVAR(predep_objects, $1)=
+_LT_TAGVAR(postdep_objects, $1)=
+_LT_TAGVAR(predeps, $1)=
+_LT_TAGVAR(postdeps, $1)=
+_LT_TAGVAR(compiler_lib_search_path, $1)=
+
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library.  It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+m4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF
+int a;
+void foo (void) { a = 0; }
+_LT_EOF
+], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF
+class Foo
+{
+public:
+  Foo (void) { a = 0; }
+private:
+  int a;
+};
+_LT_EOF
+], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer*4 a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF
+      subroutine foo
+      implicit none
+      integer a
+      a=0
+      return
+      end
+_LT_EOF
+], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF
+public class foo {
+  private int a;
+  public void bar (void) {
+    a = 0;
+  }
+};
+_LT_EOF
+], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF
+package foo
+func foo() {
+}
+_LT_EOF
+])
+
+_lt_libdeps_save_CFLAGS=$CFLAGS
+case "$CC $CFLAGS " in #(
+*\ -flto*\ *) CFLAGS="$CFLAGS -fno-lto" ;;
+*\ -fwhopr*\ *) CFLAGS="$CFLAGS -fno-whopr" ;;
+*\ -fuse-linker-plugin*\ *) CFLAGS="$CFLAGS -fno-use-linker-plugin" ;;
+esac
+
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+  # Parse the compiler output and extract the necessary
+  # objects, libraries and library flags.
+
+  # Sentinel used to keep track of whether or not we are before
+  # the conftest object file.
+  pre_test_object_deps_done=no
+
+  for p in `eval "$output_verbose_link_cmd"`; do
+    case $prev$p in
+
+    -L* | -R* | -l*)
+       # Some compilers place space between "-{L,R}" and the path.
+       # Remove the space.
+       if test x-L = "$p" ||
+          test x-R = "$p"; then
+	 prev=$p
+	 continue
+       fi
+
+       # Expand the sysroot to ease extracting the directories later.
+       if test -z "$prev"; then
+         case $p in
+         -L*) func_stripname_cnf '-L' '' "$p"; prev=-L; p=$func_stripname_result ;;
+         -R*) func_stripname_cnf '-R' '' "$p"; prev=-R; p=$func_stripname_result ;;
+         -l*) func_stripname_cnf '-l' '' "$p"; prev=-l; p=$func_stripname_result ;;
+         esac
+       fi
+       case $p in
+       =*) func_stripname_cnf '=' '' "$p"; p=$lt_sysroot$func_stripname_result ;;
+       esac
+       if test no = "$pre_test_object_deps_done"; then
+	 case $prev in
+	 -L | -R)
+	   # Internal compiler library paths should come after those
+	   # provided the user.  The postdeps already come after the
+	   # user supplied libs so there is no need to process them.
+	   if test -z "$_LT_TAGVAR(compiler_lib_search_path, $1)"; then
+	     _LT_TAGVAR(compiler_lib_search_path, $1)=$prev$p
+	   else
+	     _LT_TAGVAR(compiler_lib_search_path, $1)="${_LT_TAGVAR(compiler_lib_search_path, $1)} $prev$p"
+	   fi
+	   ;;
+	 # The "-l" case would never come before the object being
+	 # linked, so don't bother handling this case.
+	 esac
+       else
+	 if test -z "$_LT_TAGVAR(postdeps, $1)"; then
+	   _LT_TAGVAR(postdeps, $1)=$prev$p
+	 else
+	   _LT_TAGVAR(postdeps, $1)="${_LT_TAGVAR(postdeps, $1)} $prev$p"
+	 fi
+       fi
+       prev=
+       ;;
+
+    *.lto.$objext) ;; # Ignore GCC LTO objects
+    *.$objext)
+       # This assumes that the test object file only shows up
+       # once in the compiler output.
+       if test "$p" = "conftest.$objext"; then
+	 pre_test_object_deps_done=yes
+	 continue
+       fi
+
+       if test no = "$pre_test_object_deps_done"; then
+	 if test -z "$_LT_TAGVAR(predep_objects, $1)"; then
+	   _LT_TAGVAR(predep_objects, $1)=$p
+	 else
+	   _LT_TAGVAR(predep_objects, $1)="$_LT_TAGVAR(predep_objects, $1) $p"
+	 fi
+       else
+	 if test -z "$_LT_TAGVAR(postdep_objects, $1)"; then
+	   _LT_TAGVAR(postdep_objects, $1)=$p
+	 else
+	   _LT_TAGVAR(postdep_objects, $1)="$_LT_TAGVAR(postdep_objects, $1) $p"
+	 fi
+       fi
+       ;;
+
+    *) ;; # Ignore the rest.
+
+    esac
+  done
+
+  # Clean up.
+  rm -f a.out a.exe
+else
+  echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$RM -f confest.$objext
+CFLAGS=$_lt_libdeps_save_CFLAGS
+
+# PORTME: override above test on systems where it is broken
+m4_if([$1], [CXX],
+[case $host_os in
+interix[[3-9]]*)
+  # Interix 3.5 installs completely hosed .la files for C++, so rather than
+  # hack all around it, let's just trust "g++" to DTRT.
+  _LT_TAGVAR(predep_objects,$1)=
+  _LT_TAGVAR(postdep_objects,$1)=
+  _LT_TAGVAR(postdeps,$1)=
+  ;;
+esac
+])
+
+case " $_LT_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=
+if test -n "${_LT_TAGVAR(compiler_lib_search_path, $1)}"; then
+ _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo " ${_LT_TAGVAR(compiler_lib_search_path, $1)}" | $SED -e 's! -L! !g' -e 's!^ !!'`
+fi
+_LT_TAGDECL([], [compiler_lib_search_dirs], [1],
+    [The directories searched by this compiler when creating a shared library])
+_LT_TAGDECL([], [predep_objects], [1],
+    [Dependencies to place before and after the objects being linked to
+    create a shared library])
+_LT_TAGDECL([], [postdep_objects], [1])
+_LT_TAGDECL([], [predeps], [1])
+_LT_TAGDECL([], [postdeps], [1])
+_LT_TAGDECL([], [compiler_lib_search_path], [1],
+    [The library search path used internally by the compiler when linking
+    a shared library])
+])# _LT_SYS_HIDDEN_LIBDEPS
+
+
+# _LT_LANG_F77_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for a Fortran 77 compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_F77_CONFIG],
+[AC_LANG_PUSH(Fortran 77)
+if test -z "$F77" || test no = "$F77"; then
+  _lt_disable_F77=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the F77 compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_disable_F77"; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${F77-"f77"}
+  CFLAGS=$FFLAGS
+  compiler=$CC
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+  GCC=$G77
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test no = "$can_build_shared" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test yes = "$enable_shared" && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test ia64 != "$host_cpu"; then
+	  case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+	  yes,aix,yes) ;;		# shared object as lib.so file only
+	  yes,svr4,*) ;;		# shared object as lib.so archive member only
+	  yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+	  esac
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test yes = "$enable_shared" || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)=$G77
+    _LT_TAGVAR(LD, $1)=$LD
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test yes != "$_lt_disable_F77"
+
+AC_LANG_POP
+])# _LT_LANG_F77_CONFIG
+
+
+# _LT_LANG_FC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for a Fortran compiler are
+# suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_FC_CONFIG],
+[AC_LANG_PUSH(Fortran)
+
+if test -z "$FC" || test no = "$FC"; then
+  _lt_disable_FC=yes
+fi
+
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_TAGVAR(allow_undefined_flag, $1)=
+_LT_TAGVAR(always_export_symbols, $1)=no
+_LT_TAGVAR(archive_expsym_cmds, $1)=
+_LT_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_TAGVAR(hardcode_direct, $1)=no
+_LT_TAGVAR(hardcode_direct_absolute, $1)=no
+_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_TAGVAR(hardcode_minus_L, $1)=no
+_LT_TAGVAR(hardcode_automatic, $1)=no
+_LT_TAGVAR(inherit_rpath, $1)=no
+_LT_TAGVAR(module_cmds, $1)=
+_LT_TAGVAR(module_expsym_cmds, $1)=
+_LT_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+_LT_TAGVAR(no_undefined_flag, $1)=
+_LT_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for fc test sources.
+ac_ext=${ac_fc_srcext-f}
+
+# Object file extension for compiled fc test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# No sense in running all these tests if we already determined that
+# the FC compiler isn't working.  Some variables (like enable_shared)
+# are currently assumed to apply to all compilers on this platform,
+# and will be corrupted by setting them based on a non-working compiler.
+if test yes != "$_lt_disable_FC"; then
+  # Code to be used in simple compile tests
+  lt_simple_compile_test_code="\
+      subroutine t
+      return
+      end
+"
+
+  # Code to be used in simple link tests
+  lt_simple_link_test_code="\
+      program t
+      end
+"
+
+  # ltmain only uses $CC for tagged configurations so make sure $CC is set.
+  _LT_TAG_COMPILER
+
+  # save warnings/boilerplate of simple test code
+  _LT_COMPILER_BOILERPLATE
+  _LT_LINKER_BOILERPLATE
+
+  # Allow CC to be a program name with arguments.
+  lt_save_CC=$CC
+  lt_save_GCC=$GCC
+  lt_save_CFLAGS=$CFLAGS
+  CC=${FC-"f95"}
+  CFLAGS=$FCFLAGS
+  compiler=$CC
+  GCC=$ac_cv_fc_compiler_gnu
+
+  _LT_TAGVAR(compiler, $1)=$CC
+  _LT_CC_BASENAME([$compiler])
+
+  if test -n "$compiler"; then
+    AC_MSG_CHECKING([if libtool supports shared libraries])
+    AC_MSG_RESULT([$can_build_shared])
+
+    AC_MSG_CHECKING([whether to build shared libraries])
+    test no = "$can_build_shared" && enable_shared=no
+
+    # On AIX, shared libraries and static libraries use the same namespace, and
+    # are all built from PIC.
+    case $host_os in
+      aix3*)
+        test yes = "$enable_shared" && enable_static=no
+        if test -n "$RANLIB"; then
+          archive_cmds="$archive_cmds~\$RANLIB \$lib"
+          postinstall_cmds='$RANLIB $lib'
+        fi
+        ;;
+      aix[[4-9]]*)
+	if test ia64 != "$host_cpu"; then
+	  case $enable_shared,$with_aix_soname,$aix_use_runtimelinking in
+	  yes,aix,yes) ;;		# shared object as lib.so file only
+	  yes,svr4,*) ;;		# shared object as lib.so archive member only
+	  yes,*) enable_static=no ;;	# shared object in lib.a archive as well
+	  esac
+	fi
+        ;;
+    esac
+    AC_MSG_RESULT([$enable_shared])
+
+    AC_MSG_CHECKING([whether to build static libraries])
+    # Make sure either enable_shared or enable_static is yes.
+    test yes = "$enable_shared" || enable_static=yes
+    AC_MSG_RESULT([$enable_static])
+
+    _LT_TAGVAR(GCC, $1)=$ac_cv_fc_compiler_gnu
+    _LT_TAGVAR(LD, $1)=$LD
+
+    ## CAVEAT EMPTOR:
+    ## There is no encapsulation within the following macros, do not change
+    ## the running order or otherwise move them around unless you know exactly
+    ## what you are doing...
+    _LT_SYS_HIDDEN_LIBDEPS($1)
+    _LT_COMPILER_PIC($1)
+    _LT_COMPILER_C_O($1)
+    _LT_COMPILER_FILE_LOCKS($1)
+    _LT_LINKER_SHLIBS($1)
+    _LT_SYS_DYNAMIC_LINKER($1)
+    _LT_LINKER_HARDCODE_LIBPATH($1)
+
+    _LT_CONFIG($1)
+  fi # test -n "$compiler"
+
+  GCC=$lt_save_GCC
+  CC=$lt_save_CC
+  CFLAGS=$lt_save_CFLAGS
+fi # test yes != "$_lt_disable_FC"
+
+AC_LANG_POP
+])# _LT_LANG_FC_CONFIG
+
+
+# _LT_LANG_GCJ_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Java Compiler compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_GCJ_CONFIG],
+[AC_REQUIRE([LT_PROG_GCJ])dnl
+AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GCJ-"gcj"}
+CFLAGS=$GCJFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)=$LD
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GCJ_CONFIG
+
+
+# _LT_LANG_GO_CONFIG([TAG])
+# --------------------------
+# Ensure that the configuration variables for the GNU Go compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_GO_CONFIG],
+[AC_REQUIRE([LT_PROG_GO])dnl
+AC_LANG_SAVE
+
+# Source file extension for Go test sources.
+ac_ext=go
+
+# Object file extension for compiled Go test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="package main; func main() { }"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='package main; func main() { }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=yes
+CC=${GOC-"gccgo"}
+CFLAGS=$GOFLAGS
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_TAGVAR(LD, $1)=$LD
+_LT_CC_BASENAME([$compiler])
+
+# Go did not exist at the time GCC didn't implicitly link libc in.
+_LT_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_TAGVAR(reload_flag, $1)=$reload_flag
+_LT_TAGVAR(reload_cmds, $1)=$reload_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+if test -n "$compiler"; then
+  _LT_COMPILER_NO_RTTI($1)
+  _LT_COMPILER_PIC($1)
+  _LT_COMPILER_C_O($1)
+  _LT_COMPILER_FILE_LOCKS($1)
+  _LT_LINKER_SHLIBS($1)
+  _LT_LINKER_HARDCODE_LIBPATH($1)
+
+  _LT_CONFIG($1)
+fi
+
+AC_LANG_RESTORE
+
+GCC=$lt_save_GCC
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_GO_CONFIG
+
+
+# _LT_LANG_RC_CONFIG([TAG])
+# -------------------------
+# Ensure that the configuration variables for the Windows resource compiler
+# are suitably defined.  These variables are subsequently used by _LT_CONFIG
+# to write the compiler configuration to 'libtool'.
+m4_defun([_LT_LANG_RC_CONFIG],
+[AC_REQUIRE([LT_PROG_RC])dnl
+AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code=$lt_simple_compile_test_code
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_TAG_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_CFLAGS=$CFLAGS
+lt_save_GCC=$GCC
+GCC=
+CC=${RC-"windres"}
+CFLAGS=
+compiler=$CC
+_LT_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+if test -n "$compiler"; then
+  :
+  _LT_CONFIG($1)
+fi
+
+GCC=$lt_save_GCC
+AC_LANG_RESTORE
+CC=$lt_save_CC
+CFLAGS=$lt_save_CFLAGS
+])# _LT_LANG_RC_CONFIG
+
+
+# LT_PROG_GCJ
+# -----------
+AC_DEFUN([LT_PROG_GCJ],
+[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],
+  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],
+    [AC_CHECK_TOOL(GCJ, gcj,)
+      test set = "${GCJFLAGS+set}" || GCJFLAGS="-g -O2"
+      AC_SUBST(GCJFLAGS)])])[]dnl
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_GCJ], [])
+
+
+# LT_PROG_GO
+# ----------
+AC_DEFUN([LT_PROG_GO],
+[AC_CHECK_TOOL(GOC, gccgo,)
+])
+
+
+# LT_PROG_RC
+# ----------
+AC_DEFUN([LT_PROG_RC],
+[AC_CHECK_TOOL(RC, windres,)
+])
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_RC], [])
+
+
+# _LT_DECL_EGREP
+# --------------
+# If we don't have a new enough Autoconf to choose the best grep
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_EGREP],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_REQUIRE([AC_PROG_FGREP])dnl
+test -z "$GREP" && GREP=grep
+_LT_DECL([], [GREP], [1], [A grep program that handles long lines])
+_LT_DECL([], [EGREP], [1], [An ERE matcher])
+_LT_DECL([], [FGREP], [1], [A literal string matcher])
+dnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too
+AC_SUBST([GREP])
+])
+
+
+# _LT_DECL_OBJDUMP
+# --------------
+# If we don't have a new enough Autoconf to choose the best objdump
+# available, choose the one first in the user's PATH.
+m4_defun([_LT_DECL_OBJDUMP],
+[AC_CHECK_TOOL(OBJDUMP, objdump, false)
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])
+AC_SUBST([OBJDUMP])
+])
+
+# _LT_DECL_DLLTOOL
+# ----------------
+# Ensure DLLTOOL variable is set.
+m4_defun([_LT_DECL_DLLTOOL],
+[AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])
+AC_SUBST([DLLTOOL])
+])
+
+# _LT_DECL_SED
+# ------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible.  Prefer GNU sed if found.
+m4_defun([_LT_DECL_SED],
+[AC_PROG_SED
+test -z "$SED" && SED=sed
+Xsed="$SED -e 1s/^X//"
+_LT_DECL([], [SED], [1], [A sed program that does not truncate output])
+_LT_DECL([], [Xsed], ["\$SED -e 1s/^X//"],
+    [Sed that helps us avoid accidentally triggering echo(1) options like -n])
+])# _LT_DECL_SED
+
+m4_ifndef([AC_PROG_SED], [
+############################################################
+# NOTE: This macro has been submitted for inclusion into   #
+#  GNU Autoconf as AC_PROG_SED.  When it is available in   #
+#  a released version of Autoconf we should remove this    #
+#  macro and use it instead.                               #
+############################################################
+
+m4_defun([AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+  for lt_ac_prog in sed gsed; do
+    for ac_exec_ext in '' $ac_executable_extensions; do
+      if $as_executable_p "$as_dir/$lt_ac_prog$ac_exec_ext"; then
+        lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+      fi
+    done
+  done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+  test ! -f "$lt_ac_sed" && continue
+  cat /dev/null > conftest.in
+  lt_ac_count=0
+  echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+  # Check for GNU sed and select it if it is found.
+  if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+    lt_cv_path_SED=$lt_ac_sed
+    break
+  fi
+  while true; do
+    cat conftest.in conftest.in >conftest.tmp
+    mv conftest.tmp conftest.in
+    cp conftest.in conftest.nl
+    echo >>conftest.nl
+    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+    cmp -s conftest.out conftest.nl || break
+    # 10000 chars as input seems more than enough
+    test 10 -lt "$lt_ac_count" && break
+    lt_ac_count=`expr $lt_ac_count + 1`
+    if test "$lt_ac_count" -gt "$lt_ac_max"; then
+      lt_ac_max=$lt_ac_count
+      lt_cv_path_SED=$lt_ac_sed
+    fi
+  done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])#AC_PROG_SED
+])#m4_ifndef
+
+# Old name:
+AU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([LT_AC_PROG_SED], [])
+
+
+# _LT_CHECK_SHELL_FEATURES
+# ------------------------
+# Find out whether the shell is Bourne or XSI compatible,
+# or has some other useful features.
+m4_defun([_LT_CHECK_SHELL_FEATURES],
+[if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then
+  lt_unset=unset
+else
+  lt_unset=false
+fi
+_LT_DECL([], [lt_unset], [0], [whether the shell understands "unset"])dnl
+
+# test EBCDIC or ASCII
+case `echo X|tr X '\101'` in
+ A) # ASCII based system
+    # \n is not interpreted correctly by Solaris 8 /usr/ucb/tr
+  lt_SP2NL='tr \040 \012'
+  lt_NL2SP='tr \015\012 \040\040'
+  ;;
+ *) # EBCDIC based system
+  lt_SP2NL='tr \100 \n'
+  lt_NL2SP='tr \r\n \100\100'
+  ;;
+esac
+_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl
+_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl
+])# _LT_CHECK_SHELL_FEATURES
+
+
+# _LT_PATH_CONVERSION_FUNCTIONS
+# -----------------------------
+# Determine what file name conversion functions should be used by
+# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed
+# for certain cross-compile configurations and native mingw.
+m4_defun([_LT_PATH_CONVERSION_FUNCTIONS],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_MSG_CHECKING([how to convert $build file names to $host format])
+AC_CACHE_VAL(lt_cv_to_host_file_cmd,
+[case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32
+        ;;
+    esac
+    ;;
+  *-*-cygwin* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin
+        ;;
+      *-*-cygwin* )
+        lt_cv_to_host_file_cmd=func_convert_file_noop
+        ;;
+      * ) # otherwise, assume *nix
+        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin
+        ;;
+    esac
+    ;;
+  * ) # unhandled hosts (and "normal" native builds)
+    lt_cv_to_host_file_cmd=func_convert_file_noop
+    ;;
+esac
+])
+to_host_file_cmd=$lt_cv_to_host_file_cmd
+AC_MSG_RESULT([$lt_cv_to_host_file_cmd])
+_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],
+         [0], [convert $build file names to $host format])dnl
+
+AC_MSG_CHECKING([how to convert $build file names to toolchain format])
+AC_CACHE_VAL(lt_cv_to_tool_file_cmd,
+[#assume ordinary cross tools, or native build.
+lt_cv_to_tool_file_cmd=func_convert_file_noop
+case $host in
+  *-*-mingw* )
+    case $build in
+      *-*-mingw* ) # actually msys
+        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32
+        ;;
+    esac
+    ;;
+esac
+])
+to_tool_file_cmd=$lt_cv_to_tool_file_cmd
+AC_MSG_RESULT([$lt_cv_to_tool_file_cmd])
+_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],
+         [0], [convert $build files to toolchain format])dnl
+])# _LT_PATH_CONVERSION_FUNCTIONS
diff --git a/third_party/libxslt/src/m4/ltoptions.m4 b/third_party/libxslt/src/m4/ltoptions.m4
new file mode 100644
index 0000000..94b08297
--- /dev/null
+++ b/third_party/libxslt/src/m4/ltoptions.m4
@@ -0,0 +1,437 @@
+# Helper functions for option handling.                    -*- Autoconf -*-
+#
+#   Copyright (C) 2004-2005, 2007-2009, 2011-2015 Free Software
+#   Foundation, Inc.
+#   Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 8 ltoptions.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])
+
+
+# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)
+# ------------------------------------------
+m4_define([_LT_MANGLE_OPTION],
+[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])
+
+
+# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)
+# ---------------------------------------
+# Set option OPTION-NAME for macro MACRO-NAME, and if there is a
+# matching handler defined, dispatch to it.  Other OPTION-NAMEs are
+# saved as a flag.
+m4_define([_LT_SET_OPTION],
+[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl
+m4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),
+        _LT_MANGLE_DEFUN([$1], [$2]),
+    [m4_warning([Unknown $1 option '$2'])])[]dnl
+])
+
+
+# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])
+# ------------------------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+m4_define([_LT_IF_OPTION],
+[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])
+
+
+# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)
+# -------------------------------------------------------
+# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME
+# are set.
+m4_define([_LT_UNLESS_OPTIONS],
+[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+	    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),
+		      [m4_define([$0_found])])])[]dnl
+m4_ifdef([$0_found], [m4_undefine([$0_found])], [$3
+])[]dnl
+])
+
+
+# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)
+# ----------------------------------------
+# OPTION-LIST is a space-separated list of Libtool options associated
+# with MACRO-NAME.  If any OPTION has a matching handler declared with
+# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about
+# the unknown option and exit.
+m4_defun([_LT_SET_OPTIONS],
+[# Set options
+m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),
+    [_LT_SET_OPTION([$1], _LT_Option)])
+
+m4_if([$1],[LT_INIT],[
+  dnl
+  dnl Simply set some default values (i.e off) if boolean options were not
+  dnl specified:
+  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no
+  ])
+  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no
+  ])
+  dnl
+  dnl If no reference was made to various pairs of opposing options, then
+  dnl we run the default mode handler for the pair.  For example, if neither
+  dnl 'shared' nor 'disable-shared' was passed, we enable building of shared
+  dnl archives by default:
+  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])
+  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])
+  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],
+		   [_LT_ENABLE_FAST_INSTALL])
+  _LT_UNLESS_OPTIONS([LT_INIT], [aix-soname=aix aix-soname=both aix-soname=svr4],
+		   [_LT_WITH_AIX_SONAME([aix])])
+  ])
+])# _LT_SET_OPTIONS
+
+
+## --------------------------------- ##
+## Macros to handle LT_INIT options. ##
+## --------------------------------- ##
+
+# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)
+# -----------------------------------------
+m4_define([_LT_MANGLE_DEFUN],
+[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])
+
+
+# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)
+# -----------------------------------------------
+m4_define([LT_OPTION_DEFINE],
+[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl
+])# LT_OPTION_DEFINE
+
+
+# dlopen
+# ------
+LT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes
+])
+
+AU_DEFUN([AC_LIBTOOL_DLOPEN],
+[_LT_SET_OPTION([LT_INIT], [dlopen])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'dlopen' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])
+
+
+# win32-dll
+# ---------
+# Declare package support for building win32 dll's.
+LT_OPTION_DEFINE([LT_INIT], [win32-dll],
+[enable_win32_dll=yes
+
+case $host in
+*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)
+  AC_CHECK_TOOL(AS, as, false)
+  AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+  AC_CHECK_TOOL(OBJDUMP, objdump, false)
+  ;;
+esac
+
+test -z "$AS" && AS=as
+_LT_DECL([], [AS],      [1], [Assembler program])dnl
+
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl
+
+test -z "$OBJDUMP" && OBJDUMP=objdump
+_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl
+])# win32-dll
+
+AU_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+_LT_SET_OPTION([LT_INIT], [win32-dll])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'win32-dll' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])
+
+
+# _LT_ENABLE_SHARED([DEFAULT])
+# ----------------------------
+# implement the --enable-shared flag, and supports the 'shared' and
+# 'disable-shared' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
+m4_define([_LT_ENABLE_SHARED],
+[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([shared],
+    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+	[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_shared=yes ;;
+    no) enable_shared=no ;;
+    *)
+      enable_shared=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_shared=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac],
+    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)
+
+    _LT_DECL([build_libtool_libs], [enable_shared], [0],
+	[Whether or not to build shared libraries])
+])# _LT_ENABLE_SHARED
+
+LT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])
+])
+
+AC_DEFUN([AC_DISABLE_SHARED],
+[_LT_SET_OPTION([LT_INIT], [disable-shared])
+])
+
+AU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_SHARED], [])
+dnl AC_DEFUN([AM_DISABLE_SHARED], [])
+
+
+
+# _LT_ENABLE_STATIC([DEFAULT])
+# ----------------------------
+# implement the --enable-static flag, and support the 'static' and
+# 'disable-static' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
+m4_define([_LT_ENABLE_STATIC],
+[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([static],
+    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+	[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_static=yes ;;
+    no) enable_static=no ;;
+    *)
+     enable_static=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_static=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac],
+    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)
+
+    _LT_DECL([build_old_libs], [enable_static], [0],
+	[Whether or not to build static libraries])
+])# _LT_ENABLE_STATIC
+
+LT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])
+
+# Old names:
+AC_DEFUN([AC_ENABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])
+])
+
+AC_DEFUN([AC_DISABLE_STATIC],
+[_LT_SET_OPTION([LT_INIT], [disable-static])
+])
+
+AU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AM_ENABLE_STATIC], [])
+dnl AC_DEFUN([AM_DISABLE_STATIC], [])
+
+
+
+# _LT_ENABLE_FAST_INSTALL([DEFAULT])
+# ----------------------------------
+# implement the --enable-fast-install flag, and support the 'fast-install'
+# and 'disable-fast-install' LT_INIT options.
+# DEFAULT is either 'yes' or 'no'.  If omitted, it defaults to 'yes'.
+m4_define([_LT_ENABLE_FAST_INSTALL],
+[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl
+AC_ARG_ENABLE([fast-install],
+    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+    [p=${PACKAGE-default}
+    case $enableval in
+    yes) enable_fast_install=yes ;;
+    no) enable_fast_install=no ;;
+    *)
+      enable_fast_install=no
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for pkg in $enableval; do
+	IFS=$lt_save_ifs
+	if test "X$pkg" = "X$p"; then
+	  enable_fast_install=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac],
+    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)
+
+_LT_DECL([fast_install], [enable_fast_install], [0],
+	 [Whether or not to optimize for fast installation])dnl
+])# _LT_ENABLE_FAST_INSTALL
+
+LT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])
+LT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])
+
+# Old names:
+AU_DEFUN([AC_ENABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the 'fast-install' option into LT_INIT's first parameter.])
+])
+
+AU_DEFUN([AC_DISABLE_FAST_INSTALL],
+[_LT_SET_OPTION([LT_INIT], [disable-fast-install])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you put
+the 'disable-fast-install' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])
+dnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])
+
+
+# _LT_WITH_AIX_SONAME([DEFAULT])
+# ----------------------------------
+# implement the --with-aix-soname flag, and support the `aix-soname=aix'
+# and `aix-soname=both' and `aix-soname=svr4' LT_INIT options. DEFAULT
+# is either `aix', `both' or `svr4'.  If omitted, it defaults to `aix'.
+m4_define([_LT_WITH_AIX_SONAME],
+[m4_define([_LT_WITH_AIX_SONAME_DEFAULT], [m4_if($1, svr4, svr4, m4_if($1, both, both, aix))])dnl
+shared_archive_member_spec=
+case $host,$enable_shared in
+power*-*-aix[[5-9]]*,yes)
+  AC_MSG_CHECKING([which variant of shared library versioning to provide])
+  AC_ARG_WITH([aix-soname],
+    [AS_HELP_STRING([--with-aix-soname=aix|svr4|both],
+      [shared library versioning (aka "SONAME") variant to provide on AIX, @<:@default=]_LT_WITH_AIX_SONAME_DEFAULT[@:>@.])],
+    [case $withval in
+    aix|svr4|both)
+      ;;
+    *)
+      AC_MSG_ERROR([Unknown argument to --with-aix-soname])
+      ;;
+    esac
+    lt_cv_with_aix_soname=$with_aix_soname],
+    [AC_CACHE_VAL([lt_cv_with_aix_soname],
+      [lt_cv_with_aix_soname=]_LT_WITH_AIX_SONAME_DEFAULT)
+    with_aix_soname=$lt_cv_with_aix_soname])
+  AC_MSG_RESULT([$with_aix_soname])
+  if test aix != "$with_aix_soname"; then
+    # For the AIX way of multilib, we name the shared archive member
+    # based on the bitwidth used, traditionally 'shr.o' or 'shr_64.o',
+    # and 'shr.imp' or 'shr_64.imp', respectively, for the Import File.
+    # Even when GNU compilers ignore OBJECT_MODE but need '-maix64' flag,
+    # the AIX toolchain works better with OBJECT_MODE set (default 32).
+    if test 64 = "${OBJECT_MODE-32}"; then
+      shared_archive_member_spec=shr_64
+    else
+      shared_archive_member_spec=shr
+    fi
+  fi
+  ;;
+*)
+  with_aix_soname=aix
+  ;;
+esac
+
+_LT_DECL([], [shared_archive_member_spec], [0],
+    [Shared archive member basename, for filename based shared library versioning on AIX])dnl
+])# _LT_WITH_AIX_SONAME
+
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=aix], [_LT_WITH_AIX_SONAME([aix])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=both], [_LT_WITH_AIX_SONAME([both])])
+LT_OPTION_DEFINE([LT_INIT], [aix-soname=svr4], [_LT_WITH_AIX_SONAME([svr4])])
+
+
+# _LT_WITH_PIC([MODE])
+# --------------------
+# implement the --with-pic flag, and support the 'pic-only' and 'no-pic'
+# LT_INIT options.
+# MODE is either 'yes' or 'no'.  If omitted, it defaults to 'both'.
+m4_define([_LT_WITH_PIC],
+[AC_ARG_WITH([pic],
+    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],
+	[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+    [lt_p=${PACKAGE-default}
+    case $withval in
+    yes|no) pic_mode=$withval ;;
+    *)
+      pic_mode=default
+      # Look at the argument we got.  We use all the common list separators.
+      lt_save_ifs=$IFS; IFS=$IFS$PATH_SEPARATOR,
+      for lt_pkg in $withval; do
+	IFS=$lt_save_ifs
+	if test "X$lt_pkg" = "X$lt_p"; then
+	  pic_mode=yes
+	fi
+      done
+      IFS=$lt_save_ifs
+      ;;
+    esac],
+    [pic_mode=m4_default([$1], [default])])
+
+_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl
+])# _LT_WITH_PIC
+
+LT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])
+LT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])
+
+# Old name:
+AU_DEFUN([AC_LIBTOOL_PICMODE],
+[_LT_SET_OPTION([LT_INIT], [pic-only])
+AC_DIAGNOSE([obsolete],
+[$0: Remove this warning and the call to _LT_SET_OPTION when you
+put the 'pic-only' option into LT_INIT's first parameter.])
+])
+
+dnl aclocal-1.4 backwards compatibility:
+dnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])
+
+## ----------------- ##
+## LTDL_INIT Options ##
+## ----------------- ##
+
+m4_define([_LTDL_MODE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],
+		 [m4_define([_LTDL_MODE], [nonrecursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [recursive],
+		 [m4_define([_LTDL_MODE], [recursive])])
+LT_OPTION_DEFINE([LTDL_INIT], [subproject],
+		 [m4_define([_LTDL_MODE], [subproject])])
+
+m4_define([_LTDL_TYPE], [])
+LT_OPTION_DEFINE([LTDL_INIT], [installable],
+		 [m4_define([_LTDL_TYPE], [installable])])
+LT_OPTION_DEFINE([LTDL_INIT], [convenience],
+		 [m4_define([_LTDL_TYPE], [convenience])])
diff --git a/third_party/libxslt/src/m4/ltsugar.m4 b/third_party/libxslt/src/m4/ltsugar.m4
new file mode 100644
index 0000000..48bc934
--- /dev/null
+++ b/third_party/libxslt/src/m4/ltsugar.m4
@@ -0,0 +1,124 @@
+# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-
+#
+# Copyright (C) 2004-2005, 2007-2008, 2011-2015 Free Software
+# Foundation, Inc.
+# Written by Gary V. Vaughan, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 6 ltsugar.m4
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])
+
+
+# lt_join(SEP, ARG1, [ARG2...])
+# -----------------------------
+# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their
+# associated separator.
+# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier
+# versions in m4sugar had bugs.
+m4_define([lt_join],
+[m4_if([$#], [1], [],
+       [$#], [2], [[$2]],
+       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])
+m4_define([_lt_join],
+[m4_if([$#$2], [2], [],
+       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])
+
+
+# lt_car(LIST)
+# lt_cdr(LIST)
+# ------------
+# Manipulate m4 lists.
+# These macros are necessary as long as will still need to support
+# Autoconf-2.59, which quotes differently.
+m4_define([lt_car], [[$1]])
+m4_define([lt_cdr],
+[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
+       [$#], 1, [],
+       [m4_dquote(m4_shift($@))])])
+m4_define([lt_unquote], $1)
+
+
+# lt_append(MACRO-NAME, STRING, [SEPARATOR])
+# ------------------------------------------
+# Redefine MACRO-NAME to hold its former content plus 'SEPARATOR''STRING'.
+# Note that neither SEPARATOR nor STRING are expanded; they are appended
+# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).
+# No SEPARATOR is output if MACRO-NAME was previously undefined (different
+# than defined and empty).
+#
+# This macro is needed until we can rely on Autoconf 2.62, since earlier
+# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.
+m4_define([lt_append],
+[m4_define([$1],
+	   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])
+
+
+
+# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])
+# ----------------------------------------------------------
+# Produce a SEP delimited list of all paired combinations of elements of
+# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list
+# has the form PREFIXmINFIXSUFFIXn.
+# Needed until we can rely on m4_combine added in Autoconf 2.62.
+m4_define([lt_combine],
+[m4_if(m4_eval([$# > 3]), [1],
+       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl
+[[m4_foreach([_Lt_prefix], [$2],
+	     [m4_foreach([_Lt_suffix],
+		]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,
+	[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])
+
+
+# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])
+# -----------------------------------------------------------------------
+# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited
+# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.
+m4_define([lt_if_append_uniq],
+[m4_ifdef([$1],
+	  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],
+		 [lt_append([$1], [$2], [$3])$4],
+		 [$5])],
+	  [lt_append([$1], [$2], [$3])$4])])
+
+
+# lt_dict_add(DICT, KEY, VALUE)
+# -----------------------------
+m4_define([lt_dict_add],
+[m4_define([$1($2)], [$3])])
+
+
+# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)
+# --------------------------------------------
+m4_define([lt_dict_add_subkey],
+[m4_define([$1($2:$3)], [$4])])
+
+
+# lt_dict_fetch(DICT, KEY, [SUBKEY])
+# ----------------------------------
+m4_define([lt_dict_fetch],
+[m4_ifval([$3],
+	m4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),
+    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])
+
+
+# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])
+# -----------------------------------------------------------------
+m4_define([lt_if_dict_fetch],
+[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],
+	[$5],
+    [$6])])
+
+
+# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])
+# --------------------------------------------------------------
+m4_define([lt_dict_filter],
+[m4_if([$5], [], [],
+  [lt_join(m4_quote(m4_default([$4], [[, ]])),
+           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),
+		      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl
+])
diff --git a/third_party/libxslt/src/m4/ltversion.m4 b/third_party/libxslt/src/m4/ltversion.m4
new file mode 100644
index 0000000..fa04b52
--- /dev/null
+++ b/third_party/libxslt/src/m4/ltversion.m4
@@ -0,0 +1,23 @@
+# ltversion.m4 -- version numbers			-*- Autoconf -*-
+#
+#   Copyright (C) 2004, 2011-2015 Free Software Foundation, Inc.
+#   Written by Scott James Remnant, 2004
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# @configure_input@
+
+# serial 4179 ltversion.m4
+# This file is part of GNU Libtool
+
+m4_define([LT_PACKAGE_VERSION], [2.4.6])
+m4_define([LT_PACKAGE_REVISION], [2.4.6])
+
+AC_DEFUN([LTVERSION_VERSION],
+[macro_version='2.4.6'
+macro_revision='2.4.6'
+_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])
+_LT_DECL(, macro_revision, 0)
+])
diff --git a/third_party/libxslt/src/m4/lt~obsolete.m4 b/third_party/libxslt/src/m4/lt~obsolete.m4
new file mode 100644
index 0000000..c6b26f8
--- /dev/null
+++ b/third_party/libxslt/src/m4/lt~obsolete.m4
@@ -0,0 +1,99 @@
+# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-
+#
+#   Copyright (C) 2004-2005, 2007, 2009, 2011-2015 Free Software
+#   Foundation, Inc.
+#   Written by Scott James Remnant, 2004.
+#
+# This file is free software; the Free Software Foundation gives
+# unlimited permission to copy and/or distribute it, with or without
+# modifications, as long as this notice is preserved.
+
+# serial 5 lt~obsolete.m4
+
+# These exist entirely to fool aclocal when bootstrapping libtool.
+#
+# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN),
+# which have later been changed to m4_define as they aren't part of the
+# exported API, or moved to Autoconf or Automake where they belong.
+#
+# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN
+# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us
+# using a macro with the same name in our local m4/libtool.m4 it'll
+# pull the old libtool.m4 in (it doesn't see our shiny new m4_define
+# and doesn't know about Autoconf macros at all.)
+#
+# So we provide this file, which has a silly filename so it's always
+# included after everything else.  This provides aclocal with the
+# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything
+# because those macros already exist, or will be overwritten later.
+# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6.
+#
+# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.
+# Yes, that means every name once taken will need to remain here until
+# we give up compatibility with versions before 1.7, at which point
+# we need to keep only those names which we still refer to.
+
+# This is to help aclocal find these macros, as it can't see m4_define.
+AC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])
+
+m4_ifndef([AC_LIBTOOL_LINKER_OPTION],	[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])
+m4_ifndef([AC_PROG_EGREP],		[AC_DEFUN([AC_PROG_EGREP])])
+m4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_AC_SHELL_INIT],		[AC_DEFUN([_LT_AC_SHELL_INIT])])
+m4_ifndef([_LT_AC_SYS_LIBPATH_AIX],	[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])
+m4_ifndef([_LT_PROG_LTMAIN],		[AC_DEFUN([_LT_PROG_LTMAIN])])
+m4_ifndef([_LT_AC_TAGVAR],		[AC_DEFUN([_LT_AC_TAGVAR])])
+m4_ifndef([AC_LTDL_ENABLE_INSTALL],	[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])
+m4_ifndef([AC_LTDL_PREOPEN],		[AC_DEFUN([AC_LTDL_PREOPEN])])
+m4_ifndef([_LT_AC_SYS_COMPILER],	[AC_DEFUN([_LT_AC_SYS_COMPILER])])
+m4_ifndef([_LT_AC_LOCK],		[AC_DEFUN([_LT_AC_LOCK])])
+m4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],	[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])
+m4_ifndef([_LT_AC_TRY_DLOPEN_SELF],	[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])
+m4_ifndef([AC_LIBTOOL_PROG_CC_C_O],	[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])
+m4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])
+m4_ifndef([AC_LIBTOOL_OBJDIR],		[AC_DEFUN([AC_LIBTOOL_OBJDIR])])
+m4_ifndef([AC_LTDL_OBJDIR],		[AC_DEFUN([AC_LTDL_OBJDIR])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])
+m4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],	[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])
+m4_ifndef([AC_PATH_MAGIC],		[AC_DEFUN([AC_PATH_MAGIC])])
+m4_ifndef([AC_PROG_LD_GNU],		[AC_DEFUN([AC_PROG_LD_GNU])])
+m4_ifndef([AC_PROG_LD_RELOAD_FLAG],	[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])
+m4_ifndef([AC_DEPLIBS_CHECK_METHOD],	[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])
+m4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])
+m4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])
+m4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],	[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])
+m4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],	[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])
+m4_ifndef([LT_AC_PROG_EGREP],		[AC_DEFUN([LT_AC_PROG_EGREP])])
+m4_ifndef([LT_AC_PROG_SED],		[AC_DEFUN([LT_AC_PROG_SED])])
+m4_ifndef([_LT_CC_BASENAME],		[AC_DEFUN([_LT_CC_BASENAME])])
+m4_ifndef([_LT_COMPILER_BOILERPLATE],	[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])
+m4_ifndef([_LT_LINKER_BOILERPLATE],	[AC_DEFUN([_LT_LINKER_BOILERPLATE])])
+m4_ifndef([_AC_PROG_LIBTOOL],		[AC_DEFUN([_AC_PROG_LIBTOOL])])
+m4_ifndef([AC_LIBTOOL_SETUP],		[AC_DEFUN([AC_LIBTOOL_SETUP])])
+m4_ifndef([_LT_AC_CHECK_DLFCN],		[AC_DEFUN([_LT_AC_CHECK_DLFCN])])
+m4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],	[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])
+m4_ifndef([_LT_AC_TAGCONFIG],		[AC_DEFUN([_LT_AC_TAGCONFIG])])
+m4_ifndef([AC_DISABLE_FAST_INSTALL],	[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])
+m4_ifndef([_LT_AC_LANG_CXX],		[AC_DEFUN([_LT_AC_LANG_CXX])])
+m4_ifndef([_LT_AC_LANG_F77],		[AC_DEFUN([_LT_AC_LANG_F77])])
+m4_ifndef([_LT_AC_LANG_GCJ],		[AC_DEFUN([_LT_AC_LANG_GCJ])])
+m4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])
+m4_ifndef([_LT_AC_LANG_C_CONFIG],	[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])
+m4_ifndef([_LT_AC_LANG_CXX_CONFIG],	[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])
+m4_ifndef([_LT_AC_LANG_F77_CONFIG],	[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])
+m4_ifndef([_LT_AC_LANG_GCJ_CONFIG],	[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])
+m4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],	[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])
+m4_ifndef([_LT_AC_LANG_RC_CONFIG],	[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])
+m4_ifndef([AC_LIBTOOL_CONFIG],		[AC_DEFUN([AC_LIBTOOL_CONFIG])])
+m4_ifndef([_LT_AC_FILE_LTDLL_C],	[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])
+m4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],	[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])
+m4_ifndef([_LT_AC_PROG_CXXCPP],		[AC_DEFUN([_LT_AC_PROG_CXXCPP])])
+m4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],	[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])
+m4_ifndef([_LT_PROG_ECHO_BACKSLASH],	[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])
+m4_ifndef([_LT_PROG_F77],		[AC_DEFUN([_LT_PROG_F77])])
+m4_ifndef([_LT_PROG_FC],		[AC_DEFUN([_LT_PROG_FC])])
+m4_ifndef([_LT_PROG_CXX],		[AC_DEFUN([_LT_PROG_CXX])])
diff --git a/third_party/libxslt/src/py-compile b/third_party/libxslt/src/py-compile
new file mode 100755
index 0000000..81b122b0
--- /dev/null
+++ b/third_party/libxslt/src/py-compile
@@ -0,0 +1,189 @@
+#!/bin/sh
+# py-compile - Compile a Python program
+
+scriptversion=2021-02-27.01; # UTC
+
+# Copyright (C) 2000-2021 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2, or (at your option)
+# any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <https://www.gnu.org/licenses/>.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# This file is maintained in Automake, please report
+# bugs to <bug-automake@gnu.org> or send patches to
+# <automake-patches@gnu.org>.
+
+if test -z "$PYTHON"; then
+  PYTHON=python
+fi
+
+me=py-compile
+
+usage_error ()
+{
+  echo "$me: $*" >&2
+  echo "Try '$me --help' for more information." >&2
+  exit 1
+}
+
+basedir=
+destdir=
+while test $# -ne 0; do
+  case "$1" in
+    --basedir)
+      if test $# -lt 2; then
+        usage_error "option '--basedir' requires an argument"
+      else
+        basedir=$2
+      fi
+      shift
+      ;;
+    --destdir)
+      if test $# -lt 2; then
+        usage_error "option '--destdir' requires an argument"
+      else
+        destdir=$2
+      fi
+      shift
+      ;;
+    -h|--help)
+      cat <<\EOF
+Usage: py-compile [--help] [--version] [--basedir DIR] [--destdir DIR] FILES..."
+
+Byte compile some python scripts FILES.  Use --destdir to specify any
+leading directory path to the FILES that you don't want to include in the
+byte compiled file.  Specify --basedir for any additional path information you
+do want to be shown in the byte compiled file.
+
+Example:
+  py-compile --destdir /tmp/pkg-root --basedir /usr/share/test test.py test2.py
+
+Report bugs to <bug-automake@gnu.org>.
+EOF
+      exit $?
+      ;;
+    -v|--version)
+      echo "$me $scriptversion"
+      exit $?
+      ;;
+    --)
+      shift
+      break
+      ;;
+    -*)
+      usage_error "unrecognized option '$1'"
+      ;;
+    *)
+      break
+      ;;
+  esac
+  shift
+done
+
+files=$*
+if test -z "$files"; then
+  usage_error "no files given"
+fi
+
+# if basedir was given, then it should be prepended to filenames before
+# byte compilation.
+if test -z "$basedir"; then
+  pathtrans="path = file"
+else
+  pathtrans="path = os.path.join('$basedir', file)"
+fi
+
+# if destdir was given, then it needs to be prepended to the filename to
+# byte compile but not go into the compiled file.
+if test -z "$destdir"; then
+  filetrans="filepath = path"
+else
+  filetrans="filepath = os.path.normpath('$destdir' + os.sep + path)"
+fi
+
+python_major=`$PYTHON -V 2>&1 | sed -e 's/.* //;s/\..*$//;1q'`
+if test -z "$python_major"; then
+  echo "$me: could not determine $PYTHON major version, guessing 3" >&2
+  python_major=3
+fi
+
+# The old way to import libraries was deprecated.
+if test "$python_major" -le 2; then
+  import_lib=imp
+  import_test="hasattr(imp, 'get_tag')"
+  import_call=imp.cache_from_source
+  import_arg2=', False' # needed in one call and not the other
+else
+  import_lib=importlib
+  import_test="hasattr(sys.implementation, 'cache_tag')"
+  import_call=importlib.util.cache_from_source
+  import_arg2=
+fi
+
+$PYTHON -c "
+import sys, os, py_compile, $import_lib
+
+files = '''$files'''
+
+sys.stdout.write('Byte-compiling python modules...\n')
+for file in files.split():
+    $pathtrans
+    $filetrans
+    if not os.path.exists(filepath) or not (len(filepath) >= 3
+                                            and filepath[-3:] == '.py'):
+	    continue
+    sys.stdout.write(file)
+    sys.stdout.flush()
+    if $import_test:
+        py_compile.compile(filepath, $import_call(filepath), path)
+    else:
+        py_compile.compile(filepath, filepath + 'c', path)
+sys.stdout.write('\n')" || exit $?
+
+# this will fail for python < 1.5, but that doesn't matter ...
+$PYTHON -O -c "
+import sys, os, py_compile, $import_lib
+
+# pypy does not use .pyo optimization
+if hasattr(sys, 'pypy_translation_info'):
+    sys.exit(0)
+
+files = '''$files'''
+sys.stdout.write('Byte-compiling python modules (optimized versions) ...\n')
+for file in files.split():
+    $pathtrans
+    $filetrans
+    if not os.path.exists(filepath) or not (len(filepath) >= 3
+                                            and filepath[-3:] == '.py'):
+	    continue
+    sys.stdout.write(file)
+    sys.stdout.flush()
+    if $import_test:
+        py_compile.compile(filepath, $import_call(filepath$import_arg2), path)
+    else:
+        py_compile.compile(filepath, filepath + 'o', path)
+sys.stdout.write('\n')" 2>/dev/null || exit $?
+
+# Local Variables:
+# mode: shell-script
+# sh-indentation: 2
+# eval: (add-hook 'before-save-hook 'time-stamp)
+# time-stamp-start: "scriptversion="
+# time-stamp-format: "%:y-%02m-%02d.%02H"
+# time-stamp-time-zone: "UTC0"
+# time-stamp-end: "; # UTC"
+# End:
diff --git a/third_party/libxslt/win32/config.h b/third_party/libxslt/win32/config.h
index 8fe7042..54b1822 100644
--- a/third_party/libxslt/win32/config.h
+++ b/third_party/libxslt/win32/config.h
@@ -9,75 +9,6 @@
 #ifndef __LIBXSLT_WIN32_CONFIG__
 #define __LIBXSLT_WIN32_CONFIG__
 
-#define HAVE_CTYPE_H 1
-#define HAVE_STDLIB_H 1
-#define HAVE_STDARG_H 1
-#define HAVE_MALLOC_H 1
-#define HAVE_TIME_H 1
-#define HAVE_LOCALTIME 1
-#define HAVE_GMTIME 1
-#define HAVE_TIME 1
-#define HAVE_MATH_H 1
-#define HAVE_FCNTL_H 1
-
-#include <io.h>
-
-#define HAVE_ISINF
-#define HAVE_ISNAN
-
-#include <math.h>
-#if defined _MSC_VER || defined __MINGW32__
-/* MS C-runtime has functions which can be used in order to determine if
-   a given floating-point variable contains NaN, (+-)INF. These are
-   preferred, because floating-point technology is considered propriatary
-   by MS and we can assume that their functions know more about their
-   oddities than we do. */
-#include <float.h>
-/* Bjorn Reese figured a quite nice construct for isinf() using the
-   _fpclass() function. */
-#ifndef isinf
-#define isinf(d) ((_fpclass(d) == _FPCLASS_PINF) ? 1 \
-	: ((_fpclass(d) == _FPCLASS_NINF) ? -1 : 0))
-#endif
-/* _isnan(x) returns nonzero if (x == NaN) and zero otherwise. */
-#ifndef isnan
-#define isnan(d) (_isnan(d))
-#endif
-#else /* _MSC_VER */
-static int isinf (double d) {
-    int expon = 0;
-    double val = frexp (d, &expon);
-    if (expon == 1025) {
-        if (val == 0.5) {
-            return 1;
-        } else if (val == -0.5) {
-            return -1;
-        } else {
-            return 0;
-        }
-    } else {
-        return 0;
-    }
-}
-static int isnan (double d) {
-    int expon = 0;
-    double val = frexp (d, &expon);
-    if (expon == 1025) {
-        if (val == 0.5) {
-            return 0;
-        } else if (val == -0.5) {
-            return 0;
-        } else {
-            return 1;
-        }
-    } else {
-        return 0;
-    }
-}
-#endif /* _MSC_VER */
-
-#include <direct.h>
-
 /* snprintf emulation taken from http://stackoverflow.com/a/8712996/1956010 */
 #if defined(_MSC_VER) && _MSC_VER < 1900
 
@@ -115,15 +46,6 @@
 
 #define HAVE_SYS_STAT_H
 #define HAVE__STAT
-#define HAVE_STRING_H
-
-#include <libxml/xmlversion.h>
-
-#ifndef ATTRIBUTE_UNUSED
-#define ATTRIBUTE_UNUSED
-#endif
-
-#define _WINSOCKAPI_
 
 #endif /* __LIBXSLT_WIN32_CONFIG__ */
 
diff --git a/third_party/r8/3pp/3pp.pb b/third_party/r8/3pp/3pp.pb
index ef9c4ba..c0d5f78 100644
--- a/third_party/r8/3pp/3pp.pb
+++ b/third_party/r8/3pp/3pp.pb
@@ -1,10 +1,7 @@
 create {
   source {
-    git {
-      repo: "https://r8.googlesource.com/r8"
-      tag_pattern: "%s-dev"
-    }
-    patch_dir: "patches"
+    script { name: "fetch.py" }
+    unpack_archive: true
   }
 
   build {
diff --git a/third_party/r8/3pp/fetch.py b/third_party/r8/3pp/fetch.py
new file mode 100755
index 0000000..3d14dfa
--- /dev/null
+++ b/third_party/r8/3pp/fetch.py
@@ -0,0 +1,88 @@
+#!/usr/bin/env python3
+# Copyright 2021 The Chromium Authors. All rights reserved.
+# Use of this source code is governed by a BSD-style license that can be
+# found in the LICENSE file.
+
+import argparse
+import datetime
+import json
+import os
+import urllib.request
+
+# I have arbitrarily chosen 100 as a number much more than the number of commits
+# I expect to see in a day in R8.
+_COMMITS_URL = 'https://r8.googlesource.com/r8/+log/HEAD~100..HEAD?format=JSON'
+_ARCHIVE_URL = 'https://r8.googlesource.com/r8/+archive/{}.tar.gz'
+
+
+def get_commit_before_today():
+    """Returns hash of last commit that occurred before today (by UTC)."""
+    today = datetime.datetime.now(datetime.timezone.utc).date()
+    # Response looks like:
+    # {
+    # "log": [
+    #   {
+    #     "commit": "90f65f835fa73e2de31eafd6784cc2a0580dbe80",
+    #     "committer": {
+    #       "time": "Mon May 02 11:18:05 2022 +0000"
+    #       ...
+    #     },
+    #     ...
+    #   },
+    #   ...
+    # ]}
+    response_string = urllib.request.urlopen(_COMMITS_URL).read()
+    # JSON response has a XSSI protection prefix )]}'
+    parsed_response = json.loads(response_string.lstrip(b")]}'\n"))
+    log = parsed_response['log']
+    for commit in log:
+        # These times are formatted as a ctime() plus a time zone at the end.
+        # "Mon May 02 13:09:58 2022 +0200"
+        ctime_string = commit['committer']['time']
+        commit_time = datetime.datetime.strptime(ctime_string,
+                                                 "%a %b %d %H:%M:%S %Y %z")
+        utc_commit_time = commit_time.astimezone(datetime.timezone.utc)
+
+        # We are assuming that the commits are given in order of committed time.
+        # This appears to be true, but I can't find anywhere that this is
+        # guaranteed.
+        if utc_commit_time.date() < today:
+            # This is the first commit we can find before today.
+            return commit['commit']
+
+    # Couldn't find any commits before today - should probably change the
+    # _COMMITS_URL to get more than 100 commits.
+    return None
+
+
+def do_latest():
+    commit_hash = get_commit_before_today()
+    assert commit_hash is not None
+    print(commit_hash)
+
+
+def get_download_url(sha):
+    partial_manifest = {
+        'url': [_ARCHIVE_URL.format(sha)],
+        'ext': '.tar.gz',
+    }
+    print(json.dumps(partial_manifest))
+
+
+def main():
+    ap = argparse.ArgumentParser()
+    sub = ap.add_subparsers()
+
+    latest = sub.add_parser("latest")
+    latest.set_defaults(func=do_latest)
+
+    download = sub.add_parser("get_url")
+    download.set_defaults(
+        func=lambda: get_download_url(os.environ['_3PP_VERSION']))
+
+    opts = ap.parse_args()
+    opts.func()
+
+
+if __name__ == '__main__':
+    main()
diff --git a/third_party/wpt_tools/README.chromium b/third_party/wpt_tools/README.chromium
index 166cb26..aeb5bb8 100644
--- a/third_party/wpt_tools/README.chromium
+++ b/third_party/wpt_tools/README.chromium
@@ -1,7 +1,7 @@
 Name: web-platform-tests - Test Suites for Web Platform specifications
 Short Name: wpt
 URL: https://github.com/web-platform-tests/wpt/
-Version: a4e1845df9d2a57cdce62b534c4874e11ecbf155
+Version: bfe011aa848f680dc28a4c353bd51e08caffb757
 License: LICENSES FOR W3C TEST SUITES (https://www.w3.org/Consortium/Legal/2008/03-bsd-license.html)
 License File: NOT_SHIPPED
 Security Critical: no
diff --git a/third_party/wpt_tools/wpt/tools/ci/requirements_build.txt b/third_party/wpt_tools/wpt/tools/ci/requirements_build.txt
index 8e10a0f..da3f93c 100644
--- a/third_party/wpt_tools/wpt/tools/ci/requirements_build.txt
+++ b/third_party/wpt_tools/wpt/tools/ci/requirements_build.txt
@@ -1,5 +1,5 @@
 cairocffi==1.3.0
 fonttools==4.33.2
 genshi==0.7.7
-jinja2==3.1.1
+jinja2==3.1.2
 pyyaml==6.0
diff --git a/third_party/wpt_tools/wpt/tools/ci/update_built.py b/third_party/wpt_tools/wpt/tools/ci/update_built.py
index ffd6a280..d3850d3 100644
--- a/third_party/wpt_tools/wpt/tools/ci/update_built.py
+++ b/third_party/wpt_tools/wpt/tools/ci/update_built.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import logging
 import os
 import subprocess
diff --git a/third_party/wpt_tools/wpt/tools/serve/serve.py b/third_party/wpt_tools/wpt/tools/serve/serve.py
index 7f66141..6d925bf 100644
--- a/third_party/wpt_tools/wpt/tools/serve/serve.py
+++ b/third_party/wpt_tools/wpt/tools/serve/serve.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import abc
 import argparse
 import importlib
diff --git a/third_party/wpt_tools/wpt/tools/webdriver/webdriver/bidi/client.py b/third_party/wpt_tools/wpt/tools/webdriver/webdriver/bidi/client.py
index a5162a2..762b71c 100644
--- a/third_party/wpt_tools/wpt/tools/webdriver/webdriver/bidi/client.py
+++ b/third_party/wpt_tools/wpt/tools/webdriver/webdriver/bidi/client.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import asyncio
 from collections import defaultdict
 from typing import Any, Awaitable, Callable, List, Optional, Mapping, MutableMapping
@@ -91,6 +93,13 @@
         self.session = modules.Session(self)
         self.browsing_context = modules.BrowsingContext(self)
 
+    @property
+    def event_loop(self):
+        if self.transport:
+            return self.transport.loop
+
+        return None
+
     @classmethod
     def from_http(cls,
                   session_id: str,
@@ -109,7 +118,7 @@
     @classmethod
     def bidi_only(cls,
                   websocket_url: str,
-                  requested_capabilities: Optional[Mapping[str, Any]]) -> "BidiSession":
+                  requested_capabilities: Optional[Mapping[str, Any]] = None) -> "BidiSession":
         """Create a BiDi session where there is no existing HTTP session
 
         :param webdocket_url: URL to the WebSocket server listening for BiDi connections
@@ -129,13 +138,13 @@
 
         if loop is None:
             loop = get_running_loop()
+
         self.transport = Transport(self.websocket_url, self.on_message, loop=loop)
+        await self.transport.start()
 
         if self.session_id is None:
             self.session_id, self.capabilities = await self.session.new(
-                self.requested_capabilities)
-
-        await self.transport.start()
+                capabilities=self.requested_capabilities)
 
     async def send_command(
         self,
diff --git a/third_party/wpt_tools/wpt/tools/webdriver/webdriver/bidi/error.py b/third_party/wpt_tools/wpt/tools/webdriver/webdriver/bidi/error.py
index 3bcc5a2..bb81b426c 100644
--- a/third_party/wpt_tools/wpt/tools/webdriver/webdriver/bidi/error.py
+++ b/third_party/wpt_tools/wpt/tools/webdriver/webdriver/bidi/error.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import collections
 
 from typing import ClassVar, DefaultDict, Optional, Type
diff --git a/third_party/wpt_tools/wpt/tools/webdriver/webdriver/client.py b/third_party/wpt_tools/wpt/tools/webdriver/webdriver/client.py
index 33834f2..030e3fc5 100644
--- a/third_party/wpt_tools/wpt/tools/webdriver/webdriver/client.py
+++ b/third_party/wpt_tools/wpt/tools/webdriver/webdriver/client.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from typing import Dict
 from urllib import parse as urlparse
 
diff --git a/third_party/wpt_tools/wpt/tools/webdriver/webdriver/error.py b/third_party/wpt_tools/wpt/tools/webdriver/webdriver/error.py
index f09ae72..1b67d33 100644
--- a/third_party/wpt_tools/wpt/tools/webdriver/webdriver/error.py
+++ b/third_party/wpt_tools/wpt/tools/webdriver/webdriver/error.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import collections
 import json
 
diff --git a/third_party/wpt_tools/wpt/tools/webdriver/webdriver/protocol.py b/third_party/wpt_tools/wpt/tools/webdriver/webdriver/protocol.py
index ff1ad2a0..1972c3fc 100644
--- a/third_party/wpt_tools/wpt/tools/webdriver/webdriver/protocol.py
+++ b/third_party/wpt_tools/wpt/tools/webdriver/webdriver/protocol.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import json
 
 import webdriver
diff --git a/third_party/wpt_tools/wpt/tools/webdriver/webdriver/transport.py b/third_party/wpt_tools/wpt/tools/webdriver/webdriver/transport.py
index 95ca4e3..47d06591 100644
--- a/third_party/wpt_tools/wpt/tools/webdriver/webdriver/transport.py
+++ b/third_party/wpt_tools/wpt/tools/webdriver/webdriver/transport.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import json
 import select
 
diff --git a/third_party/wpt_tools/wpt/tools/webtransport/h3/capsule.py b/third_party/wpt_tools/wpt/tools/webtransport/h3/capsule.py
index 5d3c7c3..8844dbc 100644
--- a/third_party/wpt_tools/wpt/tools/webtransport/h3/capsule.py
+++ b/third_party/wpt_tools/wpt/tools/webtransport/h3/capsule.py
@@ -1,3 +1,5 @@
+# mypy: no-warn-return-any
+
 from enum import IntEnum
 from typing import Iterator, Optional
 
diff --git a/third_party/wpt_tools/wpt/tools/webtransport/h3/webtransport_h3_server.py b/third_party/wpt_tools/wpt/tools/webtransport/h3/webtransport_h3_server.py
index cc1e86d..d3031b4 100644
--- a/third_party/wpt_tools/wpt/tools/webtransport/h3/webtransport_h3_server.py
+++ b/third_party/wpt_tools/wpt/tools/webtransport/h3/webtransport_h3_server.py
@@ -1,3 +1,5 @@
+# mypy: allow-subclassing-any, no-warn-return-any
+
 import asyncio
 import logging
 import os
diff --git a/third_party/wpt_tools/wpt/tools/wpt/android.py b/third_party/wpt_tools/wpt/tools/wpt/android.py
index 8cb2dd3..728e843a9d 100644
--- a/third_party/wpt_tools/wpt/tools/wpt/android.py
+++ b/third_party/wpt_tools/wpt/tools/wpt/android.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import argparse
 import os
 import platform
diff --git a/third_party/wpt_tools/wpt/tools/wpt/browser.py b/third_party/wpt_tools/wpt/tools/wpt/browser.py
index b099dd7..b920674d 100644
--- a/third_party/wpt_tools/wpt/tools/wpt/browser.py
+++ b/third_party/wpt_tools/wpt/tools/wpt/browser.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import os
 import platform
 import re
@@ -529,39 +531,42 @@
         "Darwin": "Mac",
     }.get(uname[0])
 
-    def _get_latest_chromium_revision(self, architecture):
+    def _build_snapshots_url(self, revision, filename):
+        return ("https://storage.googleapis.com/chromium-browser-snapshots/"
+                f"{self._chromium_platform_string}/{revision}/{filename}")
+
+    def _get_latest_chromium_revision(self):
         """Queries Chromium Snapshots and returns the latest Chromium revision number
         for the current platform.
         """
         revision_url = ("https://storage.googleapis.com/chromium-browser-snapshots/"
-                        f"{architecture}/LAST_CHANGE")
+                        f"{self._chromium_platform_string}/LAST_CHANGE")
         return get(revision_url).text.strip()
 
-    def _get_chromium_download_url(self, version=None):
+    def _get_chromium_revision(self, filename, version=None):
         """Format a Chromium Snapshots URL to download a browser component."""
-        url_path = "https://storage.googleapis.com/chromium-browser-snapshots/"
-        architecture = self._chromium_platform_string
 
         # If a specific version is passed as an argument, we will use it.
         if version is not None:
             # Detect a revision number based on the version passed.
             revision = self._get_base_revision_from_version(version)
             if revision is not None:
-                url = f"{url_path}{architecture}/{revision}/"
+                # File name is needed to test if request is valid.
+                url = self._build_snapshots_url(revision, filename)
                 try:
                     # Check the status without downloading the content (this is a streaming request).
                     get(url)
-                    return url
+                    return revision
                 except requests.RequestException:
                     self.logger.warning("404: Unsuccessful attempt to download file "
                                         f"based on version. {url}")
         # If no URL was used in a previous install
         # and no version was passed, use the latest Chromium revision.
-        revision = self._get_latest_chromium_revision(architecture)
+        revision = self._get_latest_chromium_revision()
 
         # If the url is successfully used to download/install, it will be used again
         # if another component is also installed during this run (browser/webdriver).
-        return f"{url_path}{architecture}/{revision}/"
+        return revision
 
     def _get_base_revision_from_version(self, version):
         """Get a Chromium revision number that is associated with a given version."""
@@ -642,7 +647,9 @@
             # download from Chromium snapshots bucket. However,
             # MojoJS is only bundled with Linux from Chromium snapshots.
             if self.platform == "Linux":
-                url = self._get_chromium_download_url(chrome_version) + "mojojs.zip"
+                filename = "mojojs.zip"
+                revision = self._get_chromium_revision(filename, chrome_version)
+                url = self._build_snapshots_url(revision, filename)
             else:
                 self.logger.error("A valid MojoJS version cannot be found "
                                   f"for browser binary version {chrome_version}.")
@@ -787,25 +794,26 @@
         # Make sure we use the same revision in an invocation.
         # If we have a url that was last used successfully during this run,
         # that url takes priority over trying to form another.
-        if self.last_url_used is not None:
-            return f"{self.last_url_used}{filename}"
-
-        return f"{self._get_chromium_download_url(version)}{filename}"
+        if hasattr(self, "last_revision_used") and self.last_revision_used is not None:
+            return self._build_snapshots_url(self.last_revision_used, filename)
+        revision = self._get_chromium_revision(filename, version)
+        return self._build_snapshots_url(revision, filename)
 
     def download(self, dest=None, channel=None, rename=None, version=None):
         if dest is None:
             dest = self._get_browser_binary_dir(None, channel)
 
         filename = f"{self._chromium_package_name}.zip"
-        url = self._get_chromium_download_url(version)
-        self.logger.info(f"Downloading Chromium from {url}{filename}")
-        resp = get(f"{url}{filename}")
+        revision = self._get_chromium_revision(filename, version)
+        url = self._build_snapshots_url(revision, filename)
+        self.logger.info(f"Downloading Chromium from {url}")
+        resp = get(url)
         installer_path = os.path.join(dest, filename)
         with open(installer_path, "wb") as f:
             f.write(resp.content)
 
-        # url successfully used. Keep this url in case we need another component install.
-        self.last_url_used = url
+        # Revision successfully used. Keep this revision if another component install is needed.
+        self.last_revision_used = revision
         return installer_path
 
     def find_binary(self, venv_path=None, channel=None):
@@ -878,7 +886,8 @@
                 # We currently use the latest Chromium revision to get a compatible Chromedriver
                 # version for Chrome Dev, since it is not available through the ChromeDriver API.
                 # If we've gotten to this point, it is assumed that this is Chrome Dev.
-                return f"{self._get_chromium_download_url(version)}{filename}"
+                revision = self._get_chromium_revision(filename, version)
+                return self._build_snapshots_url(revision, filename)
         return f"https://chromedriver.storage.googleapis.com/{latest}/{filename}"
 
     def download(self, dest=None, channel=None, rename=None):
diff --git a/third_party/wpt_tools/wpt/tools/wpt/create.py b/third_party/wpt_tools/wpt/tools/wpt/create.py
index 37657e0..27a23ca9 100644
--- a/third_party/wpt_tools/wpt/tools/wpt/create.py
+++ b/third_party/wpt_tools/wpt/tools/wpt/create.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import subprocess
 import os
 
diff --git a/third_party/wpt_tools/wpt/tools/wpt/install.py b/third_party/wpt_tools/wpt/tools/wpt/install.py
index 4599d50b..8c95e281 100644
--- a/third_party/wpt_tools/wpt/tools/wpt/install.py
+++ b/third_party/wpt_tools/wpt/tools/wpt/install.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import argparse
 from . import browser
 
diff --git a/third_party/wpt_tools/wpt/tools/wpt/markdown.py b/third_party/wpt_tools/wpt/tools/wpt/markdown.py
index 1ea9cabd..e1d8c4eb 100644
--- a/third_party/wpt_tools/wpt/tools/wpt/markdown.py
+++ b/third_party/wpt_tools/wpt/tools/wpt/markdown.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from functools import reduce
 
 def format_comment_title(product):
diff --git a/third_party/wpt_tools/wpt/tools/wpt/run.py b/third_party/wpt_tools/wpt/tools/wpt/run.py
index 2e7d4852..96144bc 100644
--- a/third_party/wpt_tools/wpt/tools/wpt/run.py
+++ b/third_party/wpt_tools/wpt/tools/wpt/run.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import argparse
 import os
 import platform
diff --git a/third_party/wpt_tools/wpt/tools/wpt/update.py b/third_party/wpt_tools/wpt/tools/wpt/update.py
index 616d86b..deaa413 100644
--- a/third_party/wpt_tools/wpt/tools/wpt/update.py
+++ b/third_party/wpt_tools/wpt/tools/wpt/update.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import os
 import sys
 
diff --git a/third_party/wpt_tools/wpt/tools/wpt/utils.py b/third_party/wpt_tools/wpt/tools/wpt/utils.py
index 4d51d8db..b015b95e 100644
--- a/third_party/wpt_tools/wpt/tools/wpt/utils.py
+++ b/third_party/wpt_tools/wpt/tools/wpt/utils.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import errno
 import logging
 import os
diff --git a/third_party/wpt_tools/wpt/tools/wpt/virtualenv.py b/third_party/wpt_tools/wpt/tools/wpt/virtualenv.py
index 149e3462..05ca522 100644
--- a/third_party/wpt_tools/wpt/tools/wpt/virtualenv.py
+++ b/third_party/wpt_tools/wpt/tools/wpt/virtualenv.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import os
 import shutil
 import sys
diff --git a/third_party/wpt_tools/wpt/tools/wpt/wpt.py b/third_party/wpt_tools/wpt/tools/wpt/wpt.py
index 71726cb..89cc97b 100644
--- a/third_party/wpt_tools/wpt/tools/wpt/wpt.py
+++ b/third_party/wpt_tools/wpt/tools/wpt/wpt.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import argparse
 import json
 import logging
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/android_weblayer.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/android_weblayer.py
index 53f72b5..db23b647 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/android_weblayer.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/android_weblayer.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from .base import NullBrowser  # noqa: F401
 from .base import require_arg
 from .base import get_timeout_multiplier  # noqa: F401
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/android_webview.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/android_webview.py
index 62d7f594..4ad70661 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/android_webview.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/android_webview.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from .base import NullBrowser   # noqa: F401
 from .base import require_arg
 from .base import get_timeout_multiplier   # noqa: F401
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/base.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/base.py
index c76b370..4f73efb 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/base.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/base.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import enum
 import errno
 import os
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome.py
index 0d50d406..7a156c6 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from . import chrome_spki_certs
 from .base import WebDriverBrowser, require_arg
 from .base import NullBrowser  # noqa: F401
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome_android.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome_android.py
index bc1e6e4..820323e 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome_android.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome_android.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import mozprocess
 import subprocess
 
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome_ios.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome_ios.py
index b22ecc58..d870d668 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome_ios.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/chrome_ios.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from .base import WebDriverBrowser, require_arg
 from .base import get_timeout_multiplier   # noqa: F401
 from ..executors import executor_kwargs as base_executor_kwargs
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/edge.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/edge.py
index 053342e..c6936e7 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/edge.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/edge.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import time
 import subprocess
 from .base import require_arg
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/edgechromium.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/edgechromium.py
index f863a2f..383f4be 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/edgechromium.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/edgechromium.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from .base import cmd_arg, require_arg
 from .base import WebDriverBrowser
 from .base import get_timeout_multiplier   # noqa: F401
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/epiphany.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/epiphany.py
index a40f765..912173a 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/epiphany.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/epiphany.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from .base import (NullBrowser,  # noqa: F401
                    certificate_domain_list,
                    get_timeout_multiplier,  # noqa: F401
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/firefox.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/firefox.py
index 66d3069..851e3efb 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/firefox.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/firefox.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import json
 import os
 import platform
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/firefox_android.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/firefox_android.py
index e42a3ce..1e3e5b7a 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/firefox_android.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/firefox_android.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import os
 
 import moznetwork
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/ie.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/ie.py
index de577e06..87b989c 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/ie.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/ie.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from .base import require_arg, WebDriverBrowser
 from .base import get_timeout_multiplier  # noqa: F401
 from ..executors import executor_kwargs as base_executor_kwargs
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/opera.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/opera.py
index b7f2a40..a2448f4 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/opera.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/opera.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from .base import require_arg
 from .base import get_timeout_multiplier   # noqa: F401
 from .chrome import ChromeBrowser
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/safari.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/safari.py
index 3f910b5..e82593d 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/safari.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/safari.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import os
 import plistlib
 from distutils.spawn import find_executable
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/sauce.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/sauce.py
index 1e21202d..0f76516 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/sauce.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/sauce.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import glob
 import os
 import shutil
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/servo.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/servo.py
index 1e32c7c0..d57804f9 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/servo.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/servo.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import os
 
 from .base import ExecutorBrowser, NullBrowser, WebDriverBrowser, require_arg
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/servodriver.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/servodriver.py
index 32d7543b..5195fa6 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/servodriver.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/servodriver.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import os
 import subprocess
 import tempfile
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/webkit.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/webkit.py
index aa691f0..cecfbe4e 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/webkit.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/webkit.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from .base import WebDriverBrowser, require_arg
 from .base import get_timeout_multiplier, certificate_domain_list  # noqa: F401
 from ..executors import executor_kwargs as base_executor_kwargs
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py
index 2c69997..a574328 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/browsers/webkitgtk_minibrowser.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from .base import (NullBrowser,  # noqa: F401
                    certificate_domain_list,
                    get_timeout_multiplier,  # noqa: F401
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/config.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/config.py
index 8a9bdbf..c114ee3e 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/config.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/config.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from configparser import ConfigParser
 import os
 import sys
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/environment.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/environment.py
index aa44a28..eefa882 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/environment.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/environment.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import errno
 import json
 import os
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/actions.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/actions.py
index 817b13b..07ba761 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/actions.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/actions.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 class ClickAction:
     name = "click"
 
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/base.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/base.py
index 2e112186..4bc193d 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/base.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/base.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import base64
 import hashlib
 import io
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorchrome.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorchrome.py
index e1724ac..e5f5615 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorchrome.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorchrome.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import os
 import traceback
 
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executormarionette.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executormarionette.py
index cb47e7c..418b6bf 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executormarionette.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executormarionette.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import json
 import os
 import threading
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorselenium.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorselenium.py
index 6a47f17..22842e9 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorselenium.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorselenium.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import json
 import os
 import socket
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorservo.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorservo.py
index 44fa6315..0df90990 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorservo.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorservo.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import base64
 import json
 import os
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorservodriver.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorservodriver.py
index ebf5bc6..0a939c5 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorservodriver.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorservodriver.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import json
 import os
 import socket
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorwebdriver.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorwebdriver.py
index a374712..9fbaf2b 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorwebdriver.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/executorwebdriver.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import json
 import os
 import socket
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/process.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/process.py
index fb8c17a9..4a2c013 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/process.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/process.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from .base import TestExecutor
 
 
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/protocol.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/protocol.py
index 6322479a..86cfce8 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/protocol.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/protocol.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import traceback
 from http.client import HTTPConnection
 
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/pytestrunner/runner.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/pytestrunner/runner.py
index d14ffbe..2da0813 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/pytestrunner/runner.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/executors/pytestrunner/runner.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 """
 Provides interface to deal with pytest.
 
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/expected.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/expected.py
index f06abb9..72607ea2 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/expected.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/expected.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import os
 
 
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/expectedtree.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/expectedtree.py
index 0cc442d..88cf40a 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/expectedtree.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/expectedtree.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from math import log
 from collections import defaultdict
 
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/font.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/font.py
index ded68d59..c533d70 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/font.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/font.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import ctypes
 import os
 import platform
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/formatters/chromium.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/formatters/chromium.py
index a7fa04a..fb3c0dd 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/formatters/chromium.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/formatters/chromium.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import json
 import time
 
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py
index fc3796e0..60e48ba 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/formatters/tests/test_chromium.py
@@ -1,3 +1,5 @@
+# mypy: ignore-errors
+
 import json
 import sys
 from os.path import dirname, join
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/formatters/wptreport.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/formatters/wptreport.py
index b39150e..be6cca2 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/formatters/wptreport.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/formatters/wptreport.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import json
 import re
 
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/formatters/wptscreenshot.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/formatters/wptscreenshot.py
index 750548b28..2b2d1ad49 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/formatters/wptscreenshot.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/formatters/wptscreenshot.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import requests
 from mozlog.structured.formatters.base import BaseFormatter
 
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/instruments.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/instruments.py
index 3af0906..26df5fa 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/instruments.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/instruments.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import time
 import threading
 
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/manifestexpected.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/manifestexpected.py
index 3ee00e56..0d92a48 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/manifestexpected.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/manifestexpected.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import os
 from collections import deque
 from urllib.parse import urljoin
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/manifestinclude.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/manifestinclude.py
index 97348e6d..89031d8 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/manifestinclude.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/manifestinclude.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 """Manifest structure used to store paths that should be included in a test run.
 
 The manifest is represented by a tree of IncludeManifest objects, the root
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/manifestupdate.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/manifestupdate.py
index 6aea391..1131f33 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/manifestupdate.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/manifestupdate.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import os
 from urllib.parse import urljoin, urlsplit
 from collections import namedtuple, defaultdict, deque
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/metadata.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/metadata.py
index f48fcff..4a76316 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/metadata.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/metadata.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import array
 import os
 from collections import defaultdict, namedtuple
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/mpcontext.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/mpcontext.py
index a50c0478..d423d9b 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/mpcontext.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/mpcontext.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import multiprocessing
 
 _context = None
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/products.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/products.py
index 73d1742..0706a2b5 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/products.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/products.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import importlib
 import imp
 
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/stability.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/stability.py
index 6a744472..f1724d35 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/stability.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/stability.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import copy
 import functools
 import imp
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/testloader.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/testloader.py
index 220c336..9daa9a2 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/testloader.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/testloader.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import hashlib
 import json
 import os
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/testrunner.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/testrunner.py
index c55e794..c2c5270 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/testrunner.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/testrunner.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import threading
 import traceback
 from queue import Empty
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/__init__.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/__init__.py
index 78cda9c..1a58837 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/__init__.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/__init__.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import sys
 
 from mozlog.structured import structuredlog, commandline
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/base.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/base.py
index 02a820f..bd39e23 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/base.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/base.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from typing import ClassVar, List, Type
 
 exit_unclean = object()
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/metadata.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/metadata.py
index a29fb9b..388b569b 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/metadata.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/metadata.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import os
 
 from .. import metadata, products
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/state.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/state.py
index a8e23e4..2c23ad6 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/state.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/state.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import os
 import pickle
 
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/sync.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/sync.py
index 9bde63f..b1dcf2d 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/sync.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/sync.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import fnmatch
 import os
 import re
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/tree.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/tree.py
index 86b028a..8c1b6a5f 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/tree.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/tree.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import os
 import re
 import subprocess
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/update.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/update.py
index 388d64b..1e9be415 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/update.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/update/update.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import os
 import sys
 
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/vcs.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/vcs.py
index 3419a50..790fdc9 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/vcs.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/vcs.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import subprocess
 from functools import partial
 from typing import Callable
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptcommandline.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptcommandline.py
index a71bc9dd..dda1fea 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptcommandline.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptcommandline.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import argparse
 import os
 import sys
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptlogging.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptlogging.py
index 4e87092f..06b34da 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptlogging.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptlogging.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import logging
 from threading import Thread
 
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/backends/base.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/backends/base.py
index eaa0b5d..c1ec206b 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/backends/base.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/backends/base.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import abc
 
 from ..node import NodeVisitor
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py
index dfaf10999..7d4f257 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/backends/conditional.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import operator
 
 from ..node import NodeVisitor, DataNode, ConditionalNode, KeyValueNode, ListNode, ValueNode, BinaryExpressionNode, VariableNode
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/backends/static.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/backends/static.py
index 6efad1c..5bec942 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/backends/static.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/backends/static.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import operator
 
 from . import base
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/node.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/node.py
index 8f340332..11d781c 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/node.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/node.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 class NodeVisitor:
     def visit(self, node):
         # This is ugly as hell, but we don't have multimethods and
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/parser.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/parser.py
index a56bb8c..c0ef9b4d 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/parser.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/parser.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 #default_value:foo
 #include: other.manifest
 #
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/serializer.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/serializer.py
index e31a607..93115f3 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/serializer.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/serializer.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from six import ensure_text
 
 from .node import NodeVisitor, ValueNode, ListNode, BinaryExpressionNode
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_conditional.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_conditional.py
index af4d996..0059b985 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_conditional.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_conditional.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import unittest
 
 from ..backends import conditional
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_parser.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_parser.py
index 23beb2b..a2203070 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_parser.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_parser.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import unittest
 
 from .. import parser
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_serializer.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_serializer.py
index fdb4509..8491749 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_serializer.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_serializer.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import unittest
 
 from .. import parser, serializer
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_static.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_static.py
index e811a2b42..0ded07f4 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_static.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_static.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import unittest
 
 from ..backends import static
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_tokenizer.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_tokenizer.py
index 66b5805..950c0c66 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_tokenizer.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptmanifest/tests/test_tokenizer.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import unittest
 
 from .. import parser
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptrunner.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptrunner.py
index 83d8313..e3b7c9f 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptrunner.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptrunner.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import json
 import os
 import sys
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wpttest.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wpttest.py
index 35c2a30..96fc108 100644
--- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wpttest.py
+++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wpttest.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import os
 import subprocess
 import sys
diff --git a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/config.py b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/config.py
index 7433e64..b8779543 100644
--- a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/config.py
+++ b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/config.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import copy
 import os
 from collections import defaultdict
diff --git a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/handlers.py b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/handlers.py
index 4dc3e12..bae6a8f 100644
--- a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/handlers.py
+++ b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/handlers.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import json
 import os
 import traceback
diff --git a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/pipes.py b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/pipes.py
index 3761c08..a9a85a1 100644
--- a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/pipes.py
+++ b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/pipes.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from collections import deque
 import base64
 import gzip as gzip_module
diff --git a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/ranges.py b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/ranges.py
index d64971f8..622b807 100644
--- a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/ranges.py
+++ b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/ranges.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from .utils import HTTPException
 
 
diff --git a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/request.py b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/request.py
index 82f8346..bfbbae3 100644
--- a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/request.py
+++ b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/request.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import base64
 import cgi
 import tempfile
diff --git a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/response.py b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/response.py
index 6933d52..5c0ea7d 100644
--- a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/response.py
+++ b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/response.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from collections import OrderedDict
 from datetime import datetime, timedelta
 from io import BytesIO
diff --git a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/router.py b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/router.py
index 2f39f0ed..92c1b04 100644
--- a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/router.py
+++ b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/router.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import itertools
 import re
 import sys
diff --git a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/server.py b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/server.py
index 25a3dc8..2e6417b0 100644
--- a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/server.py
+++ b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/server.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import errno
 import http.server
 import os
diff --git a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/sslutils/__init__.py b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/sslutils/__init__.py
index e89bb96f..244faea 100644
--- a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/sslutils/__init__.py
+++ b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/sslutils/__init__.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 from .base import NoSSLEnvironment
 from .openssl import OpenSSLEnvironment
 from .pregenerated import PregeneratedSSLEnvironment
diff --git a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/sslutils/base.py b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/sslutils/base.py
index bea15fd..d5f91373 100644
--- a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/sslutils/base.py
+++ b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/sslutils/base.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 class NoSSLEnvironment:
     ssl_enabled = False
 
diff --git a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/sslutils/openssl.py b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/sslutils/openssl.py
index 166c79b..5a16097e 100644
--- a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/sslutils/openssl.py
+++ b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/sslutils/openssl.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import functools
 import os
 import random
diff --git a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/sslutils/pregenerated.py b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/sslutils/pregenerated.py
index 725cb56..5e9b1181 100644
--- a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/sslutils/pregenerated.py
+++ b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/sslutils/pregenerated.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 class PregeneratedSSLEnvironment:
     """SSL environment to use with existing key/certificate files
     e.g. when running on a server with a public domain name
diff --git a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/stash.py b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/stash.py
index 2772eb7..90c3078 100644
--- a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/stash.py
+++ b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/stash.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 import base64
 import json
 import os
diff --git a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/wptserve.py b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/wptserve.py
index 67fffbe..1eaa9349 100755
--- a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/wptserve.py
+++ b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/wptserve.py
@@ -1,4 +1,6 @@
 #!/usr/bin/env python3
+# mypy: allow-untyped-defs
+
 import argparse
 import os
 
diff --git a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/ws_h2_handshake.py b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/ws_h2_handshake.py
index 4466eeb..af668dd5 100644
--- a/third_party/wpt_tools/wpt/tools/wptserve/wptserve/ws_h2_handshake.py
+++ b/third_party/wpt_tools/wpt/tools/wptserve/wptserve/ws_h2_handshake.py
@@ -1,3 +1,5 @@
+# mypy: allow-untyped-defs
+
 """This file provides the opening handshake processor for the Bootstrapping
 WebSockets with HTTP/2 protocol (RFC 8441).
 
diff --git a/tools/binary_size/libsupersize/archive_util.py b/tools/binary_size/libsupersize/archive_util.py
index c3dbeea..567569f 100644
--- a/tools/binary_size/libsupersize/archive_util.py
+++ b/tools/binary_size/libsupersize/archive_util.py
@@ -26,9 +26,6 @@
   elif path.startswith('../../'):
     # Convert ../../third_party/... -> third_party/...
     path = path[6:]
-  elif path.startswith('/'):
-    # Convert absolute paths to $SYSTEM/basename.o.
-    path = os.path.join(models.SYSTEM_PREFIX_PATH, os.path.basename(path))
   if path.endswith(')'):
     # Convert foo/bar.a(baz.o) -> foo/bar.a/baz.o so that hierarchical
     # breakdowns consider the .o part to be a separate node.
@@ -55,11 +52,6 @@
   if path.startswith('../../'):
     # Convert ../../third_party/... -> third_party/...
     return False, path[6:]
-  if path.startswith('/'):
-    # Convert absolute paths to $SYSTEM/basename.cpp.
-    # E.g.: /buildbot/src/android/ndk-release-r23/toolchain/llvm-project/
-    #       libcxx/src/vector.cpp
-    path = os.path.join(models.SYSTEM_PREFIX_PATH, os.path.basename(path))
   return True, path
 
 
diff --git a/tools/binary_size/libsupersize/native.py b/tools/binary_size/libsupersize/native.py
index 3889fa16..61a98fe 100644
--- a/tools/binary_size/libsupersize/native.py
+++ b/tools/binary_size/libsupersize/native.py
@@ -105,9 +105,10 @@
 
 
 def _AddSourcePathsUsingAddress(dwarf_source_mapper, raw_symbols):
-  logging.debug('Looking up source paths from dwarfdump')
+  logging.info('Looking up source paths from dwarfdump')
   query_count = 0
   match_count = 0
+  abs_count = 0
   for symbol in raw_symbols:
     if symbol.section_name != models.SECTION_TEXT:
       continue
@@ -115,9 +116,17 @@
     source_path = dwarf_source_mapper.FindSourceForTextAddress(symbol.address)
     if source_path:
       match_count += 1
-      symbol.source_path = source_path
-  logging.info('dwarfdump found paths for %d of %d .text symbols.', match_count,
-               query_count)
+      if os.path.isabs(source_path):
+        # Use basename for any absolute path. NDK prebuilts have these.
+        # E.g.: /buildbot/src/android/ndk-release-r23/toolchain/llvm-project/
+        #       libcxx/src/vector.cpp
+        symbol.source_path = os.path.join(models.SYSTEM_PREFIX_PATH,
+                                          os.path.basename(source_path))
+        abs_count += 1
+      else:
+        symbol.source_path = source_path
+  logging.info('dwarfdump found %d of %d .text symbols. Ignored %d abs paths',
+               match_count, query_count, abs_count)
   # Majority of unmatched queries are for assembly source files (ex libav1d)
   # and v8 builtins.
   if query_count > 0:
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml
index da626e47..ff7399d 100644
--- a/tools/metrics/histograms/enums.xml
+++ b/tools/metrics/histograms/enums.xml
@@ -48708,6 +48708,13 @@
   <int value="2" label="Go forward"/>
 </enum>
 
+<enum name="IOSOverflowMenuActionType">
+  <int value="0" label="No scroll, no action"/>
+  <int value="1" label="Scroll, no action"/>
+  <int value="2" label="No scroll, action"/>
+  <int value="3" label="Scroll, action"/>
+</enum>
+
 <enum name="IOSPageLoadCountNavigationType">
   <int value="0" label="Chrome URL Navigation"/>
   <int value="1" label="Same Document Web Navigation"/>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml
index 93f024c..5cd8912 100644
--- a/tools/metrics/histograms/metadata/ash/histograms.xml
+++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -48,7 +48,6 @@
   <variant name="GetEnabled" summary="returns enablement state"/>
   <variant name="GetPhoto" summary="returns a single photo"/>
   <variant name="GetPhotos" summary="returns all photos"/>
-  <variant name="GetPhotosCount" summary="returns the count of all photos"/>
 </variants>
 
 <variants name="HotseatTransitionType">
@@ -3603,7 +3602,7 @@
   </token>
 </histogram>
 
-<histogram name="Ash.Smoothness.PercentDroppedFrames_1sWindow" units="%"
+<histogram name="Ash.Smoothness.PercentDroppedFrames_1sWindow{Stage}" units="%"
     expires_after="2022-12-15">
   <owner>xiyuan@chromium.org</owner>
   <owner>chromeos-perfmetrics-eng@google.com</owner>
@@ -3614,7 +3613,16 @@
     not displayed on screen out of the total number of frames expected to be
     produced and displayed. In other words, the lower this number is, the
     smoother experience.
+
+    The metric is reported {Stage}.
   </summary>
+  <token key="Stage">
+    <variant name="" summary="all the time"/>
+    <variant name=".BeforeLogin" summary="before login"/>
+    <variant name=".DuringLogin"
+        summary="after cryptohome mount but before login animations finish"/>
+    <variant name=".InSession" summary="for active user session"/>
+  </token>
 </histogram>
 
 <histogram name="Ash.SplitView.DeviceOrientation.{DeviceUIMode}"
diff --git a/tools/metrics/histograms/metadata/blink/histograms.xml b/tools/metrics/histograms/metadata/blink/histograms.xml
index b50b8cc..178e852 100644
--- a/tools/metrics/histograms/metadata/blink/histograms.xml
+++ b/tools/metrics/histograms/metadata/blink/histograms.xml
@@ -2838,7 +2838,7 @@
 </histogram>
 
 <histogram name="Blink.WebCodecs.ImageDecoder.Success" enum="BooleanSuccess"
-    expires_after="2022-09-11">
+    expires_after="M110">
   <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
@@ -2848,7 +2848,7 @@
 </histogram>
 
 <histogram name="Blink.WebCodecs.ImageDecoder.Type" enum="DecodedImageType"
-    expires_after="2022-09-11">
+    expires_after="M110">
   <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
@@ -2858,7 +2858,7 @@
 </histogram>
 
 <histogram name="Blink.WebCodecs.{AudioCodecApi}.Codec" enum="AudioCodec"
-    expires_after="M104">
+    expires_after="M110">
   <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
@@ -2872,7 +2872,7 @@
 </histogram>
 
 <histogram name="Blink.WebCodecs.{CodecApi}.FinalStatus" enum="MediaStatusCode"
-    expires_after="M104">
+    expires_after="M110">
   <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
@@ -2889,7 +2889,7 @@
 </histogram>
 
 <histogram name="Blink.WebCodecs.{VideoCodecApi}.Codec" enum="VideoCodec"
-    expires_after="M104">
+    expires_after="M110">
   <owner>dalecurtis@chromium.org</owner>
   <owner>media-dev@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/content_creation/histograms.xml b/tools/metrics/histograms/metadata/content_creation/histograms.xml
index 6eafcb6a..d6afd9f5 100644
--- a/tools/metrics/histograms/metadata/content_creation/histograms.xml
+++ b/tools/metrics/histograms/metadata/content_creation/histograms.xml
@@ -516,6 +516,9 @@
 
 <histogram name="TextFragmentAnchor.ElementIdFragmentFound" enum="Boolean"
     expires_after="2022-09-11">
+  <obsolete>
+    Removed 2022-05.
+  </obsolete>
   <owner>bokan@chromium.org</owner>
   <owner>chrome-shared-highlighting@google.com</owner>
   <summary>
@@ -560,6 +563,9 @@
 
 <histogram name="TextFragmentAnchor{TextFragmentSource}.DidScrollIntoView"
     enum="Boolean" expires_after="2022-06-30">
+  <obsolete>
+    Removed 2022-05.
+  </obsolete>
   <owner>bokan@chromium.org</owner>
   <owner>chrome-shared-highlighting@google.com</owner>
   <summary>
@@ -574,6 +580,9 @@
 
 <histogram name="TextFragmentAnchor{TextFragmentSource}.DirectiveLength"
     units="characters" expires_after="2022-06-30">
+  <obsolete>
+    Removed 2022-05.
+  </obsolete>
   <owner>bokan@chromium.org</owner>
   <owner>chrome-shared-highlighting@google.com</owner>
   <summary>
@@ -589,6 +598,9 @@
 
 <histogram name="TextFragmentAnchor{TextFragmentSource}.EndTextLength"
     units="characters" expires_after="2022-06-30">
+  <obsolete>
+    Removed 2022-05.
+  </obsolete>
   <owner>bokan@chromium.org</owner>
   <owner>chrome-shared-highlighting@google.com</owner>
   <summary>
@@ -603,6 +615,9 @@
 
 <histogram name="TextFragmentAnchor{TextFragmentSource}.ExactTextLength"
     units="characters" expires_after="2022-06-30">
+  <obsolete>
+    Removed 2022-05.
+  </obsolete>
   <owner>bokan@chromium.org</owner>
   <owner>chrome-shared-highlighting@google.com</owner>
   <summary>
@@ -617,6 +632,9 @@
 
 <histogram name="TextFragmentAnchor{TextFragmentSource}.ListItemMatch"
     units="Boolean" expires_after="2022-06-30">
+  <obsolete>
+    Removed 2022-05.
+  </obsolete>
   <owner>bokan@chromium.org</owner>
   <owner>chrome-shared-highlighting@google.com</owner>
   <summary>
@@ -644,6 +662,9 @@
 
 <histogram name="TextFragmentAnchor{TextFragmentSource}.Parameters"
     enum="TextFragmentAnchorParameters" expires_after="2022-06-30">
+  <obsolete>
+    Removed 2022-05.
+  </obsolete>
   <owner>bokan@chromium.org</owner>
   <owner>chrome-shared-highlighting@google.com</owner>
   <summary>
@@ -658,6 +679,9 @@
 
 <histogram name="TextFragmentAnchor{TextFragmentSource}.RangeMatchLength"
     units="characters" expires_after="2022-06-30">
+  <obsolete>
+    Removed 2022-05.
+  </obsolete>
   <owner>bokan@chromium.org</owner>
   <owner>chrome-shared-highlighting@google.com</owner>
   <summary>
@@ -672,6 +696,9 @@
 
 <histogram name="TextFragmentAnchor{TextFragmentSource}.ScrollCancelled"
     enum="Boolean" expires_after="2022-06-30">
+  <obsolete>
+    Removed 2022-05.
+  </obsolete>
   <owner>bokan@chromium.org</owner>
   <owner>chrome-shared-highlighting@google.com</owner>
   <summary>
@@ -686,6 +713,9 @@
 
 <histogram name="TextFragmentAnchor{TextFragmentSource}.SelectorCount"
     units="selectors" expires_after="2022-06-30">
+  <obsolete>
+    Removed 2022-05.
+  </obsolete>
   <owner>bokan@chromium.org</owner>
   <owner>chrome-shared-highlighting@google.com</owner>
   <summary>
@@ -699,6 +729,9 @@
 
 <histogram name="TextFragmentAnchor{TextFragmentSource}.SpansMultipleBlocks"
     units="Boolean" expires_after="2022-06-30">
+  <obsolete>
+    Removed 2022-05.
+  </obsolete>
   <owner>bokan@chromium.org</owner>
   <owner>chrome-shared-highlighting@google.com</owner>
   <owner>input-dev@chromium.org</owner>
@@ -715,6 +748,9 @@
 
 <histogram name="TextFragmentAnchor{TextFragmentSource}.StartTextLength"
     units="characters" expires_after="2022-06-30">
+  <obsolete>
+    Removed 2022-05.
+  </obsolete>
   <owner>bokan@chromium.org</owner>
   <owner>chrome-shared-highlighting@google.com</owner>
   <summary>
@@ -729,6 +765,9 @@
 
 <histogram name="TextFragmentAnchor{TextFragmentSource}.TableCellMatch"
     units="Boolean" expires_after="2022-06-30">
+  <obsolete>
+    Removed 2022-05.
+  </obsolete>
   <owner>bokan@chromium.org</owner>
   <owner>chrome-shared-highlighting@google.com</owner>
   <summary>
@@ -748,8 +787,8 @@
   <summary>
     The time between creating the TextFragmentAnchor (i.e. when it is parsed)
     and scrolling the target into view. Only recorded if there is a match and we
-    scroll it into view. Recorded when TextFragmentAnchor finishes searching
-    once the page is loaded.
+    tried to scroll it into view (it may already have been in view). Recorded
+    when TextFragmentAnchor finishes searching once the page is loaded.
 
     Recorded from text fragment links followed from {TextFragmentSource}.
   </summary>
@@ -758,6 +797,9 @@
 
 <histogram name="TextFragmentAnchor{TextFragmentSource}.TimeToScrollToTop"
     units="ms" expires_after="2022-06-30">
+  <obsolete>
+    Removed 2022-05.
+  </obsolete>
   <owner>bokan@chromium.org</owner>
   <owner>chrome-shared-highlighting@google.com</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml
index dd0bb43..7f1a63a9 100644
--- a/tools/metrics/histograms/metadata/ios/histograms.xml
+++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -1013,6 +1013,20 @@
   </summary>
 </histogram>
 
+<histogram name="IOS.OverflowMenu.ActionType" enum="IOSOverflowMenuActionType"
+    expires_after="2022-12-31">
+  <owner>rkgibson@google.com</owner>
+  <owner>bling-team@google.com</owner>
+  <summary>The type of action the user took in the overflow/tools menu</summary>
+</histogram>
+
+<histogram name="IOS.OverflowMenu.TimeOpen" units="ms"
+    expires_after="2022-12-31">
+  <owner>rkgibson@google.com</owner>
+  <owner>bling-team@google.com</owner>
+  <summary>The amount of time the overflow/tools menu is open.</summary>
+</histogram>
+
 <histogram name="IOS.PageLoad.DefaultModeMobile" enum="Boolean"
     expires_after="2023-01-30">
   <owner>gambard@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml
index 0e226795..17f4d810 100644
--- a/tools/metrics/histograms/metadata/media/histograms.xml
+++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -781,6 +781,19 @@
   </summary>
 </histogram>
 
+<histogram name="Media.Audio.OutputDeviceMixer.OvertimeCount" units="count"
+    expires_after="2022-10-04">
+  <owner>olka@chromium.org</owner>
+  <owner>saza@chromium.org</owner>
+  <owner>tguilbert@chromium.org</owner>
+  <summary>
+    Number of times over a sampling interval (1000 callbacks) when the mixing
+    callback took longer than the playback buffer duration to finish. Capped at
+    100 (1/10 of all callbacks). Not logged if the mixer was called less than
+    1000 times.
+  </summary>
+</histogram>
+
 <histogram
     name="Media.Audio.OutputDeviceMixer.StreamDuration.{MixingStatus}.{LatencyTag}"
     units="ms" expires_after="2022-10-04">
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml
index d08e217..a18cb5f 100644
--- a/tools/metrics/histograms/metadata/others/histograms.xml
+++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -893,16 +893,6 @@
   </summary>
 </histogram>
 
-<histogram name="Aura.WebContentsWindowUnOccludedTime" units="ms"
-    expires_after="2021-11-14">
-  <owner>alemate@chromium.org</owner>
-  <owner>oshima@chromium.org</owner>
-  <summary>
-    The amount of time spent painting a WebContents frame when a window switches
-    from occluded to visible state.
-  </summary>
-</histogram>
-
 <histogram name="Autocomplete.Cleanup" units="entries" expires_after="M85">
   <owner>seblalancette@chromium.org</owner>
   <summary>
diff --git a/tools/metrics/histograms/metadata/stability/histograms.xml b/tools/metrics/histograms/metadata/stability/histograms.xml
index d73b81a..90600923 100644
--- a/tools/metrics/histograms/metadata/stability/histograms.xml
+++ b/tools/metrics/histograms/metadata/stability/histograms.xml
@@ -362,8 +362,8 @@
   </summary>
 </histogram>
 
-<histogram name="Stability.IOS.Experimental.Counts"
-    enum="IOSStabilityUserVisibleTerminationType" expires_after="2022-06-15">
+<histogram name="Stability.IOS.Experimental.Counts2"
+    enum="IOSStabilityUserVisibleTerminationType" expires_after="2023-05-03">
   <owner>ajuma@chromium.org</owner>
   <owner>olivierrobin@chromium.org</owner>
   <summary>
@@ -373,9 +373,9 @@
     crashes, hangs, UTEs and XTEs. This metric intends to complement
     Stability.Counts. Stability.Counts does include UTEs / XTEs and thus is a
     noisy metric which significantly overcounts user-visible crashes.
-    Stability.IOS.Experimental.Counts is not recorded on OOM crashes, so it does
-    not represent all user-visible crashes, but OOMs are so rare in Chrome for
-    iOS that Stability.IOS.Experimental.Counts is still a good proxy for
+    Stability.IOS.Experimental.Counts2 is not recorded on OOM crashes, so it
+    does not represent all user-visible crashes, but OOMs are so rare in Chrome
+    for iOS that Stability.IOS.Experimental.Counts2 is still a good proxy for
     user-visible crashes. IOS.MetricKit.ForegroundExitData includes OOM crashes
     (iOS 14 and higher) and can be used in conjunction with this metric.
   </summary>
diff --git a/tools/metrics/histograms/metadata/storage/histograms.xml b/tools/metrics/histograms/metadata/storage/histograms.xml
index 627340c..da6147f 100644
--- a/tools/metrics/histograms/metadata/storage/histograms.xml
+++ b/tools/metrics/histograms/metadata/storage/histograms.xml
@@ -224,17 +224,6 @@
   </summary>
 </histogram>
 
-<histogram name="Storage.Blob.BlobUrlLoader.FailureType" enum="NetErrorCodes"
-    expires_after="M95">
-  <owner>mek@chromium.org</owner>
-  <owner>dmurph@chromium.org</owner>
-  <owner>enne@chromium.org</owner>
-  <summary>
-    Recorded when an error occurs in the BlobUrlLoader, which is used to load
-    blobs from urls in the Renderer.
-  </summary>
-</histogram>
-
 <histogram name="Storage.Blob.Broken" enum="BooleanBroken" expires_after="M95">
   <owner>mek@chromium.org</owner>
   <owner>dmurph@chromium.org</owner>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json
index 08538c4..630d676 100644
--- a/tools/perf/core/perfetto_binary_roller/binary_deps.json
+++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -6,7 +6,7 @@
         },
         "win": {
             "hash": "e4ea4f6df1bc4d9adabff28989320d677c76b8cb",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/4951933ec6d538e8e67cba8d9b400b5a7cb08678/trace_processor_shell.exe"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/0dba9ae3dc0924e53e3870aed1cc7b7c4cb95c93/trace_processor_shell.exe"
         },
         "linux_arm": {
             "hash": "58893933be305d3bfe0a72ebebcacde2ac3ca893",
@@ -14,15 +14,15 @@
         },
         "mac": {
             "hash": "c67c0bb84d1fed4060267eabc15867eb7e57b084",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/4951933ec6d538e8e67cba8d9b400b5a7cb08678/trace_processor_shell"
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/0dba9ae3dc0924e53e3870aed1cc7b7c4cb95c93/trace_processor_shell"
         },
         "mac_arm64": {
             "hash": "e1ad4861384b06d911a65f035317914b8cc975c6",
             "full_remote_path": "perfetto-luci-artifacts/v25.0/mac-arm64/trace_processor_shell"
         },
         "linux": {
-            "hash": "f59822b4e66428ee4a0b23e2446d2bbcff49a68b",
-            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/0dba9ae3dc0924e53e3870aed1cc7b7c4cb95c93/trace_processor_shell"
+            "hash": "e25b407130619dc0bc8cd8fdcf21c88072c17877",
+            "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/2308bab3aebd39f00010c846cdcab351046158cc/trace_processor_shell"
         }
     },
     "power_profile.sql": {
diff --git a/tools/traffic_annotation/summary/annotations.xml b/tools/traffic_annotation/summary/annotations.xml
index 5f0e41d..876872e2 100644
--- a/tools/traffic_annotation/summary/annotations.xml
+++ b/tools/traffic_annotation/summary/annotations.xml
@@ -338,7 +338,6 @@
  <item id="minidump_uploader_android" added_in_milestone="98" content_hash_code="0327544e" os_list="android" file_path="components/minidump_uploader/android/java/src/org/chromium/components/minidump_uploader/util/HttpURLConnectionFactoryImpl.java" />
  <item id="chrome_variations_android" added_in_milestone="98" content_hash_code="04eeb61f" os_list="android" file_path="components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedFetcher.java" />
  <item id="fwupd_firmware_update" added_in_milestone="99" content_hash_code="0002c968" os_list="chromeos" file_path="ash/components/fwupd/firmware_update_manager.cc" />
- <item id="wallpaper_google_photos_count" added_in_milestone="99" content_hash_code="02006a23" os_list="chromeos" file_path="chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc" />
  <item id="wallpaper_backdrop_collection_names" added_in_milestone="99" content_hash_code="06379fce" os_list="chromeos" file_path="chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc" />
  <item id="wallpaper_backdrop_images_info" added_in_milestone="99" content_hash_code="0010428c" os_list="chromeos" file_path="chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc" />
  <item id="wallpaper_backdrop_surprise_me_image" added_in_milestone="99" content_hash_code="0383b9db" os_list="chromeos" file_path="chrome/browser/ash/wallpaper_handlers/wallpaper_handlers.cc" />
@@ -374,5 +373,5 @@
  <item id="device_activity_client_check_in" added_in_milestone="102" content_hash_code="0548d084" os_list="chromeos" file_path="ash/components/device_activity/device_activity_client.cc" />
  <item id="device_activity_client_check_membership" added_in_milestone="102" content_hash_code="02827a9f" os_list="chromeos" file_path="ash/components/device_activity/device_activity_client.cc" />
  <item id="interest_group_well_known_fetcher" added_in_milestone="103" content_hash_code="01ea06eb" os_list="linux,windows,android,chromeos" file_path="content/browser/interest_group/interest_group_permissions_checker.cc" />
- <item id="speculation_rules_prefetch" added_in_milestone="103" content_hash_code="015fd398" os_list="linux,windows,android" file_path="content/browser/speculation_rules/prefetch/prefetch_service.cc" />
+ <item id="speculation_rules_prefetch" added_in_milestone="103" content_hash_code="015fd398" os_list="linux,windows,android,chromeos" file_path="content/browser/speculation_rules/prefetch/prefetch_service.cc" />
 </annotations>
diff --git a/tools/traffic_annotation/summary/grouping.xml b/tools/traffic_annotation/summary/grouping.xml
index 451d39b..a1764da6 100644
--- a/tools/traffic_annotation/summary/grouping.xml
+++ b/tools/traffic_annotation/summary/grouping.xml
@@ -97,7 +97,6 @@
       <traffic_annotation unique_id="wallpaper_fetcher"/>
       <traffic_annotation unique_id="wallpaper_download_google_photo"/>
       <traffic_annotation unique_id="wallpaper_google_photos_albums"/>
-      <traffic_annotation unique_id="wallpaper_google_photos_count"/>
       <traffic_annotation unique_id="wallpaper_google_photos_enabled"/>
       <traffic_annotation unique_id="wallpaper_google_photos_photos"/>
     </sender>